2010-02-05 17 views
9

Recientemente decidí organizar los archivos en el directorio de mi proyecto. Trasladé los analizadores sintácticos que tenía para algunos tipos de archivos diferentes a su propio directorio y también decidí usar ocamlbuild (ya que el proyecto se estaba volviendo más complicado y el sencillo script de shell ya no era suficiente).Compilación adecuada de módulos en subcarpetas (ocamlbuild)

Pude incluir con éxito proyectos externos modificando myocamlbuild con algunas reglas básicas (llamando al ocaml_lib, usaré ocamlfind en otro momento), pero estoy atascado en cómo incluir la carpeta como un módulo en el proyecto correctamente . Creé un archivo parser.mlpack y lo llené con los módulos adecuados para incluir (por ejemplo, "analizador/Fecha", etcétera), escribí parser.mli en la raíz del directorio para sus implementaciones, y modifiqué el archivo _tags (ver a continuación) .

Durante la compilación, el directorio del analizador se desplaza correctamente, y parser.cmi, parser.mli.depends se crearon ambos en el directorio _build; así como todos los archivos *.cm[xio] en el subdirectorio de analizadores.

Siento que podría estar haciendo algo redundante, pero independientemente, el proyecto aún no puedo encontrar el módulo Analizador cuando compilo!

Gracias!

_tags

debug : true 
<*.ml> : annot 
"parser" : include 
<parser/*.cmx>: for-pack(Parser) 
<curlIO.*> : use_curl 
<mySQL.*> : use_mysql 
<**/*.native> or <**/*.byte> : use_str,use_unix,use_curl,use_mysql 

error de compilación

/usr/local/bin/ocamlopt.opt unix.cmxa str.cmxa -g -I /usr/local/lib/ocaml/site-lib/mysql mysql.cmxa -I /usr/local/lib/ocaml/curl curl.cmxa curlIO.cmx utilities.cmx date.cmx fraction.cmx logger.cmx mySQL.cmx data.cmx project.cmx -o project.native 
File "\_none\_", line 1, characters 0-1: 
Error: **No implementations provided for the following modules:** 
     Parser referenced from project.cmx 
Command exited with code 2. 

Se dará cuenta de -I parser no está incluido en la fase de vinculación anterior; en realidad, ¡ninguno de los archivos relacionados con el analizador está incluido!

editar: Se han añadido nuevos detalles de los comentarios y respuestas a continuación.

Respuesta

3

Me pregunto si parser.mli está de alguna manera interfiriendo con las dependencias en el procesamiento del archivo mlpack. parser.cmi se generará a partir de la operación del paquete cuando se procesa y se compila parser.mlpack. Intente compilar con el archivo parser.mli eliminado. Si eso funciona, entonces esto se puede volver a procesar en una respuesta real.

Además, no es necesario parser/ como prefijo a sus módulos en parser.mlpack si parser.mlpack está en el directorio parser y ha ajustado la etiqueta include. Pero eso no debería marcar una diferencia para esto.

Actualización: esto solucionó el problema, pero no era la causa principal. La causa raíz, por comentario a continuación, era un archivo mencionado en el .mlpack que se había reubicado.

+0

Sí, esto funcionó, pero no tiene las consecuencias previstas. Un módulo que representa los contenidos del directorio no fue creado; ellos son referenciados por los submódulos directamente. Sin embargo, el argumento '-pack 'se agrega a los módulos apropiados durante la compilación. Pero no se usa en el producto final. ¿Mi interpretación sobre -pack es incorrecta? – nlucaroni

+0

'-pack' debe crear un módulo que contenga los otros módulos como submódulos. Su otro código debe referirse a ellos como sus submódulos (por ejemplo, 'Parser.ConfParser'); si alguna vez se refiere a ellos directamente (solo 'ConfParser' sin primer' open'ing 'Parser'), entonces las cosas se arruinarán. ¿Podría publicar el resultado '-verbose' cuando no tiene' parser.mli'? –

+1

He vuelto a agregar el archivo parser.mli. Creo que por alguna razón un error al compilar el paquete no se rompió donde debería. ** Había un módulo adicional en mi archivo 'mlpack' que había movido **. – nlucaroni

4

Necesita "incluir" el directorio del analizador en la ruta de búsqueda. Puede hacer esto en _tags:

"parser": include 

Entonces ocamlbuild puede buscar en el directorio de archivos de programa de análisis interesantes.

+1

Debería ser, por supuesto, -> "analizador": incluir – ygrek

+0

@ygrek gracias - actualizado. –

+0

... Modifiqué mi pregunta anterior. Esto ayudó, pero en realidad ya estaba haciendo esto, pero desde la equivalencia en la línea de comando con '-I analizador". Ahora, simplemente construyo con el proyecto 'ocamlbuild. ' – nlucaroni

Cuestiones relacionadas