2011-12-29 11 views
12

Ho un file Tools.ml che contiene alcune funzioni di utilità comuni che scrivo da solo. Sotto .../Code/ ho diverse cartelle che contengono ciascuna un progetto. La mia domanda è dove dovrei inserire questo Tools.ml in modo tale che tutte le cartelle e i file sotto .../Code/ possano condividere questo modulo per Open Tools.Dove posizionare un modulo di utilità condiviso in OCaml?

Spero che la mia domanda sia chiara ... Qualcuno ha una buona soluzione?

Edit1: seguente risposta di @ Gasche, ho scritto tools.ml come segue:

module Tools = 
    struct 
    let a_function = ... 
    ... 
    end 

Poi ho compilato e fatto ocamlfind install tools META tools.cmo tools.cmx tools.ml come suggerito, che sembra andare bene. Poi ho scritto test.ml come segue:

open Tools 

let f = Tools.a_function 

poi ho compilato con ocamlc test.ml -o test, poi ho ricevuto un errore:

File "test.ml", line 1, characters 0-1: 
Error: Error while linking test.cmo: 
Reference to undefined global `Tools' 

Qualcuno potrebbe dirmi che cosa è successo?

risposta

13

È possibile impacchettarlo come libreria indipendente, installarlo con altre librerie OCaml e accedervi dal proprio progetto come libreria.

Un modo molto semplice per eseguire questa operazione è scrivere un file META per ocamlfind. Crea una directory dove sei a tuo agio per organizzare il tuo progetto di "biblioteca personale". Supponiamo che tu abbia tools.ml e tools.mli e che il tuo codice dipenda da alcuni pacchetti findlib (ad esempio unix e bigarray). Si META sarebbe simile a questa:

name="tools" 
description="personal collection of utilities" 
version="0.1" 
requires="unix,bigarray" 
archive(byte)="tools.cmo" 
archive(native)="tools.cmx" 

Dopo aver scritto questo file META, è facile chiedere ocamlfind a "install" la biblioteca (e rimuoverlo se si vuole), e utilizzarlo nella vostra altri progetti. Per installare, la sintassi è ocamlfind install <name> <meta-file> <file1> <file2> ... dove <file1>, <file2>.. è il file che si desidera vedere incluso nella directory di installazione. È necessario avere almeno tools.cmitools.cmo (e tools.o e tools.cmx per la compilazione nativa), ma è buona norma avere anche tools.mli per esempio (e, se si desidera fornire il codice, tools.ml).

ocamlfind install tools META tools.cmi tools.cmo tools.o tools.cmx tools.mli 

(Naturalmente tools.cmo ecc disporre di esistere, che è necessario install dopo aver compilato il pacchetto. Se avete utilizzato ocamlbuild, che sono suscettibili di essere in un _build sottodirectory, così ocamlfind install ... _build/tools.cmo ....)

da vostri numerosi progetti, è possibile utilizzare il libreria con facilità, sia utilizzando il toold ocamlfind direttamente, se questo è quello che già fare per compilare i programmi

ocamlfind ocamlc -package tools .... 

oppure tramite le strutture fornite da ocamlbuild, ad esempio, aggiungendo package(tools) ai tag.

Per reinstallare la libreria se hai fatto una modifica ad esso e vogliono accessibile dai progetti

ocamlfind remove tools 
ocamlfind install tools META ... 

Si potrebbe anche gestire tutto questo attraverso oasis, che è un livello sopra ocamlfind/ocamlbuild per automatizzare questo processo. Non ho abbastanza familiarità con oasis per dare esempi del genere, ma dovrebbe essere altrettanto semplice per un caso così ristretto (una libreria di file), e scalare meglio se in futuro vuoi ampliare la tua libreria (es. può anche gestire la generazione di documentazione, la configurazione di pre-compilazione ...).

+0

Grazie per il tuo commento ... Potresti dare un'occhiata al mio test in OP? – SoftTimur

+1

@SoftTimur: il comando di compilazione corretto nel tuo caso è 'ocamlfind ocamlc -package tools -linkpkg test.ml -o test'. L'opzione '-package tools' aggiunge il pacchetto e' -linkpkg' lo collega per produrre un eseguibile (necessario quando si produce un eseguibile, ma non quando si compila in un '.cmo'). Probabilmente potresti anche usare il pacchetto "ocamlbuild -tag" (tools) "test.byte" (non testato). – gasche

+0

@gashe: 'ocamlfind ocamlc -package tools -linkpkg test.ml -o test' funziona solo quando' test.ml' si trova nella stessa cartella dello strumento 'eseguibile' ... Sai perché? – SoftTimur

Problemi correlati