IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Caml Discussion :

[OCaml] Besoin d'aide pour un makefile


Sujet :

Caml

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de GyZmoO
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 428
    Par défaut [OCaml] Besoin d'aide pour un makefile
    Bonjour les gens !!

    J'ai un soucis, j'ai un projet a faire en Ocaml (un compilo qui compile du C en Java bytecode ) .

    Tout marche, ça génère bien du bytecode, mais pour que ça fonctionne, je suis obligé de tout faire un mode interactif dans Ocaml (c'est a dire , #use, #load etc...) . Perso moi ça me dérange pas du tout , mais le prof il aime bien taper 'make' dans le shell d'unix, puis lancer l'exécutable toujours dans le shell sans jamais ouvrir la vilaine fenêtre d'Ocaml .

    Et mon problème : j'y pompe rien aux inclusions de fichiers, aux éditions de liens pour faire le Makefile

    Si quelqu'un pouvait m'éclairer, m'expliquer a quoi ça sert de mettre open Fichier ou #load #use en haut d'un fichier et aprés dans le makefile quoi mettre quand un fichier dépend d'un autre !!!

    J'espère avoir été clair et d'avance je vous remercie !!!!

    Mickaël .

  2. #2
    Membre expérimenté Avatar de Steki-kun
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    222
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 222
    Par défaut
    Salut Mickaël,

    c'est un vaste programme que ta question :-)

    Rapidement, un lien très utile : http://www.ocaml.info/home/ocaml_sources.html et récupère OCamlMakefile, tu mets tes noms de fichiers dans la variable prévue pour dans le Makefile, et ca marche tout seul pour la plupart des projets pas trop compliqués (dont le tien fait surement partie).

    Maintenant, il est bon de savoir comment on compile du Caml à la main, à quoi servent Open, et comment marche un Makefile, de manière générale.

    open ModuleName te permet de rendre les membres de ModuleName accessibles dans ton fichier. Précisément, si tu as un module H qui contient des valeurs val1, val2, etc... tu peux utiliser ces variables directement par leurs noms ; si tu ne fais pas open H, tu dois utiliser les "noms qualifiés", c'est-à-dire H.val1, H.val2, etc... Par exemple, si tu ne fais pas open List dans ton programme, tu dois appeler hd cons iter fold etc en les précédant de List. #use et #load ne font pas partie du langage ocaml mais de l'interpréteur : #use correspond à #include en C(++) et #load permet de charger du code compilé (.cmo ou librairies .cma, genre #load unix).

    Imaginons que tu aies deux modules A et B (ou fichiers a.ml et b.ml, c'est pareil) dans ton projet, avec B dépendant de A. Puisque tu travailles dans le toplevel, je suppose que tu n'as pas de fichiers .mli, donc j'en parle pas. La compilation consiste à compiler les fichiers en .cmo, puis à linker tous les cmo ensemble en un executable :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ocamlc -c a.ml  (* ca genere a.cmo *)
    ocamlc -c b.ml  (* ............   b.cmo *)
    ocamlc -o monProg a.cmo b.cmo (* linke a.cmo et b.cmo pour faire monProg *)
                                                      (* l'ordre importe : b est dépendant de a, donc apres *)
    ou en une ligne,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ocamlc -o monProg a.ml b.ml
    En plus de tes .cmo, tu veux surement ajouter les fichiers que tu loadais via #load dans l'interpréteur, genre pour utiliser Unix, tu dois faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ocamlc -o monProg unix.cma a.cmo b.cmo
    Le Makefile va faire tout ça pour toi, et si tu veux en écrire un très très simple, ca ressemble à une liste de déclarations du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    targetname: dependances
            commande1
            ...
            commanden
    les commandes sont exécutées pour construire la cible targetname (quand tu tapes make targetname), et dependances est une suite de cible qui sont exécutées dans l'ordre pour construire targetname, avant de faire les commandes 1 à n. Quand tu tapes make sans arguments, la premiere cible du fichier est construite. Dans notre cas, le suivant ferait l'affaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    all:
          ocamlc -c a.ml
          ocamlc -c b.ml
          ocamlc -o myProg unix.cma a.cmo b.cmo
     
    clean:
          rm -rf myProg *.cmi *.cmo *~
    "make" sera equivalent à "make all", et tu peux faire "make clean" pour enlever les fichiers qui proviennent de la compilation (lexecutable y compris). C'est un MAUVAIS makefile puisqu'il ne gere pas les dépendances, ne fera pas la compilation séparée, etc, comme OcamlMakefile, mais c'est suffisant pour un projet de cette taille et pour apprendre à faire des makefiles.

    Tu peux aussi rajouter des variables pour les flags, les fichiers, etc histoire que ce soit plus facile à modifier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    EXEC=myProg
    OCAMLCFLAGS=-c -dtypes
    LIBS=unix.cma camlp4o.cma
     
    all:
          ocamlc $(OCAMLCFLAGS) a.ml
          ocamlc $(OCAMLCFLAGS) b.ml
          ocamlc -o $(EXEC) $(LIBS) a.cmo b.cmo
     
    clean:
          rm -rf $(EXEC) *.cmi *.cmo *~

    Voilà, ce n'est qu'un début, il y a tout ce qu'il faut sur le net out there pour apprendre à utiliser toutes ces choses à leur plein potentiel !

    Bon courage,

  3. #3
    Membre éclairé Avatar de GyZmoO
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 428
    Par défaut
    Une bonne partie de l'ombre qui résidait dans ma tête vient de se dissiper grace a tes lumières donc #load et #use ça ne fait pas parti d'Ocaml ! Bien je te remercie énormément pour ces renseignements qui me seront trés utiles ! Je vais continuer a me documenter
    Merci !!!!

    Mickaël .

  4. #4
    Membre Expert
    Avatar de InOCamlWeTrust
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 036
    Par défaut
    Il y a aussi un exemple de Makefile spécialement conçu pour Objective Caml dans le manuel de référence... ici :

    http://caml.inria.fr/pub/docs/manual...manual027.html

    Avec ça, tu ne devrais plus avoir de problèmes.

  5. #5
    Membre éclairé Avatar de GyZmoO
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 428
    Par défaut
    Niquel Merci ! Si je m'en sors pas avec ça c'est que je le fais exprés

Discussions similaires

  1. besoin d'aide pour une requête
    Par Damien69 dans le forum Langage SQL
    Réponses: 11
    Dernier message: 31/03/2004, 15h38
  2. besoin d'aide pour le composant DBComboBox
    Par jane2002 dans le forum Bases de données
    Réponses: 8
    Dernier message: 28/02/2004, 19h01
  3. [Kylix] besoin d'aide pour installer kylix3
    Par Sph@x dans le forum EDI
    Réponses: 3
    Dernier message: 11/02/2004, 13h53
  4. [TP]besoin d'aide pour commandes inconnues
    Par Upal dans le forum Turbo Pascal
    Réponses: 15
    Dernier message: 03/10/2002, 10h48
  5. Besoin d'aide pour l'I.A. d'un puissance 4
    Par Anonymous dans le forum C
    Réponses: 2
    Dernier message: 25/04/2002, 17h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo