• [^] # Re: Répertoire courant

    Posté par . En réponse au message Lancer un .out dans une console. Évalué à 2.

    Quand je tape "Makefile" dans Google, j'ai çà :

    http://www.google.fr/search?hl=fr&q=Makefile&btnG=Re(...)

    Je pense qu'il y a de quoi faire. Les trois premiers liens sont les plus pertinents à mon goût. Sinon, un Makefile, ça peut se résumer à une seule ligne. La seule chose qu'il faut retenir est cette structure :

    cible: dependance1 dependance2 ...
    commande


    "cible" est le nom du fichier à générer. En tapant "make cible", make va vérifier si le fichier "cible" existe et si ce n'est pas le cas, alors il va exécuter "commande" pour le faire. On peut préciser plusieurs commandes successives, même sur plusieurs lignes, à conditions qu'elles soient tassées contre la ligne cible, et qu'elles débutent toutes par une tabulation.

    Les dépendances sont optionnelles. Ce sont également des fichiers qui doivent à terme exister sur le disque mais qui peuvent ou non être spécifiés en tant que cibles dans le makefile. Si elles sont précisées, alors Make va non seulement vérifier l'existence du fichier cible, mais également celle des fichiers dont la cible est dépendante, en s'assurant également qu'ils soient plus anciens que la cible qui nous intéresse. L'exemple typique est celui-ci :

    toto: toto.c
    gcc toto.c -o toto


    On cherche à compiler l'exécutable "toto" à partir du fichier source "toto.c". Trois cas de figures possibles
    1) "toto" l'exécutable n'existe pas encore. Make lance donc gcc comme spécifié.
    2) "toto" existe. Make sort en répondant "Nothing to be done"
    3) "toto" existe mais "toto.c" est plus récent que lui. Make estime donc que "toto" doit être mis à jour en conséquence et réappelle gcc.

    Si en plus, "toto.c" est également une cible, alors ses propres dépendances vont être examinées récursivement, et tout ce qui doit être mis à jour derrière va l'être en cascade.

    C'est donc utile pour les tout petits projets, car même avec un seul fichier, il est à la fois plus simple et plus sûr de taper "make" que de réappeler la commande entière depuis l'historique du shell, comme pour les plus gros car, quand on a une centaine de fichiers sources, on est sûr de ne recompiler que ce qui doit l'être. Quiquonque a déjà recompilé son noyau ou construit l'environnement GNOME, par exemple, à partir des sources voit bien de quoi je parle :-)

    Bon, tout ceci forme le B-A-BA de Make, qui regorge d'options en tous genres pour faciliter le travail et factoriser ce qui peut l'être. Cibles implicites, génériques, variables du nom de cible, du compilo par défaut, des flags, etc.

    Enfin, make sert principalement à gérer les dépendances entre fichiers. Il n'est pas intimement lié au C, ni même aux langages de programmation en général, même si c'est à cela qu'il est le plus utile.