2010-02-05 9 views
9

Recentemente ho deciso di organizzare i file nella mia directory di progetto. Ho spostato i parser che ho avuto per un paio di tipi di file differenti nella propria directory e anche deciso di utilizzare ocamlbuild (il quanto il progetto è stato sempre più complicata e lo script di shell semplice non era più sufficiente).correttamente la compilazione di moduli in sottocartelle (ocamlbuild)

Sono riuscito a includere progetti esterni modificando myocamlbuild con alcune regole di base (chiamando ocaml_lib, userò ocamlfind qualche altra volta), ma sono bloccato su come includere correttamente la cartella come modulo nel progetto . Ho creato un file parser.mlpack e riempito con i moduli appropriati da inserire (per esempio, "parser/Data", eccetera), scritto un parser.mli nella radice della directory per le loro implementazioni, e modificato il file _tags (vedi sotto) .

Durante la compilazione, la directory del parser viene attraversata correttamente e parser.cmi, parser.mli.depends sono stati creati nella directory _build; così come tutti i *.cm[xio] file nella sottodirectory parser.

mi sento che potrei fare qualcosa di superfluo, ma a prescindere, il progetto ancora non può trovare il modulo parser quando compilo!

Grazie!

_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 

errore di compilazione

/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. 

Noterete -I parser non è incluso nella fase di collegamento di cui sopra; in realtà nessuno dei file relativi al parser è incluso!

modifica: Aggiunti nuovi dettagli dai commenti e risposta di seguito.

risposta

3

Mi chiedo se parser.mli interferisca in qualche modo con le dipendenze nell'elaborazione del file mlpack. parser.cmi sarà generato dall'operazione confezione quando parser.mlpack viene elaborato e compilati. Prova a costruire con il file parser.mli rimosso. Se funziona, allora questo può essere rielaborato in una vera risposta.

Inoltre, non è necessario parser/ come prefisso per i moduli in parser.mlpack se parser.mlpack si trova nella directory parser e si ha la tag include set. Ma questo non dovrebbe fare la differenza per questo.

Aggiornamento: questo ha funzionato attorno al problema, ma non era la causa principale. La causa principale, per commento sotto, era un file menzionato nello .mlpack che era stato trasferito.

+0

Sì, questo ha funzionato, ma non ha le conseguenze previste. Un modulo che rappresenta il contenuto della directory non è stato creato; vengono referenziati direttamente dai sottomoduli. L'argomento '-pack' viene aggiunto ai moduli appropriati durante la compilazione. Ma non utilizzato nel prodotto finale. La mia interpretazione di -pack non è corretta? – nlucaroni

+0

'-pack' dovrebbe creare un modulo che contenga gli altri moduli come sottomoduli. Il tuo altro codice deve quindi fare riferimento ad essi come loro sottomoduli (ad esempio 'Parser.ConfParser'); se mai si riferisce direttamente a loro (solo 'ConfParser' senza il primo' open'ing 'Parser'), allora le cose si incasineranno. Potresti postare l'output '-verbose' quando non hai' parser.mli'? –

+1

Ho aggiunto di nuovo il file parser.mli. Penso che per qualche ragione un errore durante la compilazione del pacchetto non si è interrotto dove dovrebbe. ** C'era un modulo aggiuntivo nel mio file 'mlpack' che avevo spostato **. – nlucaroni

4

hai bisogno di "includere" la directory parser nel percorso di ricerca. È possibile farlo in _tags:

"parser": include 

Poi ocamlbuild può cercare la directory parser per i file interessanti.

+1

Dovrebbe essere ovviamente -> "parser": include – ygrek

+0

@ygrek grazie - aggiornato. –

+0

... Ho modificato la mia domanda sopra. Questo mi ha aiutato, ma in realtà lo stavo già facendo, ma dall'equivalenza sulla riga di comando con '-I parser'. Ora, ho appena creato con il progetto 'ocamlbuild. ' – nlucaroni

Problemi correlati