2017-10-05 38 views
1

Je suis nouveau à OCaml, mais j'essaye de comprendre l'équivalent de __filename, __dirname du noeud. C'est-à-dire, j'ai besoin de construire un chemin relatif au fichier contenant le code en question.OCaml: Comment puis-je obtenir le chemin vers le répertoire * module actuel */mon projet?


Pour référence, je travaille dans la CCIA de Ghuloum: http://ell.io/tt$ocameel

Je construis mon premier compilateur, et j'ai un fichier « exécution » tout à fait simpliste (en C - temporarily) à côté de le code source du compilateur. Je dois pouvoir passer le chemin de ce fichier, en tant qu'argument (ou une version pré-compilée, je suppose) à gcc ou à mon éditeur de liens, pour qu'il soit lié à la sortie de mon compilateur quand j'appelle l'outil éditeur de liens/assembleur.

(Cela peut être une question stupide - je suis un peu d'un inconnu ici-inconnu, « comment un compilateur obtenir le temps d'exécution - l'éditeur de liens », ou quelque chose comme ça des commentaires sur les solutions Tout idiomatiques. c'est le bienvenu, même si ce n'est pas une réponse directe à la question ci-dessus!)

Répondre

2

Si vous utilisez le fichier source directement via ocaml myfile.ml, Sys.argv.(0) vous donnera le chemin vers le fichier source et vous pouvez utiliser Filename.dirname à obtenir le répertoire de cela.

Si vous compilez d'abord le fichier source dans un exécutable, puis exécutez l'exécutable, Sys.argv.(0) vous donnera le nom de l'exécutable. Dans ce scénario, il est impossible d'obtenir l'emplacement du code source (surtout si vous considérez que la personne qui exécute l'exécutable n'a peut-être même pas le code source sur son système). Si vous configurez votre structure de projet, de sorte que vos sources résident dans src /, votre binaire compilé dans bin/et le stdlib compilé dans lib /, vous pouvez simplement utiliser Filename.dirname Sys.argv.(0)^"../lib" comme chemin de bibliothèque pour gcc. Cela fonctionnera si vous exécutez ocaml src/mycompiler.ml, bin/mycompiler ou simplement mycompiler après avoir installé tout à /usr/ ou /usr/local/.

+0

Oui, c'est ce dont j'ai commencé à m'inquiéter, à mi-chemin de ma question. Je suppose que je dois comprendre comment les rédacteurs de compilateurs vont envoyer des ressources supplémentaires à leurs utilisateurs. Je suppose que je devrais avoir à aligner le texte (ou l'objet à lier?) Dans le binaire? : x Merci néanmoins, c'est une bonne réponse pour les situations de script! – ELLIOTTCABLE

+0

@ELLIOTTCABLE Si votre projet est présenté comme décrit dans mon dernier paragraphe, il devrait simplement fonctionner avec 'argv. (0)'. Si vous avez besoin de ressources supplémentaires, vous pouvez les mettre en partage/et faire la même chose. Notez que si votre fichier stdlib est lié dynamiquement et que vous ne l'installez pas sur un chemin standard, vous devrez également définir LD_LIBRARY_PATH pour trouver le fichier .so lors de l'exécution du fichier binaire compilé, mais c'est un problème sans rapport. – sepp2k