begin process at 2008 08 29 22:30:45
1 233 909 membres
450 nouveaux aujourd'hui
14 294 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

SHELL LINUX, CREATION DES MAKEFILES, COMMANDE MAKE


Information sur le tutorial

Catégorie :Tutoriaux Date de création : 20/12/2004 18:29:12 Vu : 33 104 fois

Note :
7 / 10 - par 1 personne
7,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (10)
Ajouter un commentaire et/ou une note

Tutorial

La commande MAKE

 

 

Ce tutoriel s'adresse aux débutants programmeurs sous Linux. Il vous présente la commande make et la création de fichier « makefile ». Je précise sous Linux, mais sachez qu'ils existent aussi sous windows, vous pouvez demander à VC++ de vous les construire.

 
Alors qu'est ce qu'un fichier makefile?

C'est un fichier nommé « makefile » qui permet, en ne tapant que « make » , dans le répertoire où il se trouve de compiler tout votre projet.

Par conséquent il rassemble toute les directives de compilation de votre projet.

Vous imaginez bien qu'à partir d'un certain nombre de fichier source, il devient tout à fait indispensable.

Imaginez-vous taper gcc fichier.c -Wall -c etc... pour chacun de vos fichiers!!! Make fait tout :)

 

 

L'édition d'un fichier Makefile:

 

Un fichier « makefile » s'édite à l'aide d'un éditeur de texte. Je vous conseille personnellement Xemacs.

Les Commentaires sont unilignes et commencent par #:

             # commentaire...

 
Un tel fichier contient un ensemble de règle, un règle se compose de la manière suivante:

            cible : dépendances

            <tab>   commandes

rem : <tab> correspond à une véritable tabulation..

La cible est le fichier à construire, les dépendances sont les fichiers dont on a besoin pour créer la cible. Les commandes sont les commandes à exécuter pour générer la cible.

Prenons un exemple, pour créer un fichier *.o nous avons besoin d'un fichier *.c et de fichiers *.h   
       
            main.o : main.c main.h autre.h

            <tab>   gcc main.c -c -Wall
 
Ici si le fichier make de contient que ça, le lancement de la commande make va générer main.o.

L'intérêt de make réside dans le fait, qu'il ne reconstruit une cible que si les dépendances ont et modifier depuis la dernière utilisation de make, ou si la cible n'existe pas. Ce qui évite de tout recompiler à chaque fois.

Pour construire une cible, make se relance récursivement. Ce qui fait que l'ordre des règles importe peut.


Les macros:
 

Ce sont des variables de type chaîne de caractères.

            Définition:    MACRO = Valeur

            Référence:     $(MACRO)                -> sert à son utilisation

 

Exemple:
        MODULE = main.o aux.o

        main : $(MODULE)
        <tab>   gcc $(MODULE) -o main

 

Il en existe des prédéfinis: les macros internes

 

            $@      Contient le nom de la cible

            $*        Contient de nom de la cible sans suffixe ( si cible = main.c; $* = main)

            $^        Contient le nom de toutes les dépendances

            $?        Liste des dépendances dont la date est postérieure à la cible

            $<        Contient la dépendance qui a provoqué la reconstruction de la cible

 

Les macros prédéfinies que l'on peut modifier:
 

            $(CC)                         Contient le nom du compilateur

            $(CPPFLAGS)           Liste des options de pré-processage

            $(CFLAGS)                Liste des options de compilation

            $(LDFLAGS)              Liste des options de pré-édition des liens.

 

Un petit exemple pour illustrer tout ça :)

            CC = gcc
            CFLAGS = -Wall -O3
            LDFLAGS = -lm

            programme : main.o matrice.o
            <tab>   $(CC) $^ -o $@ $(LDFLAGS)

            main.o  : main.c matrice.h
            <tab>   $(CC) main.c -c $(CFLAGS)

            matrice.o : matrice.h matrice.c
            <tab>   $(CC) $*.c -c $(CFLAGS)

 
Ici, l'exécution de la commande make, compilera le fichier 'programme ', en générant les fichiers *.o intermédiaires.

Remarque, le lancement de make ne génère que la première cible, et génère les autres si ils en a besoin pour la construire.

Pour compiler une cible particulière, on lance make avec le nom de la cible:

            $ make matrice.o         // Genère le fichier matrice.o


Les directives:

Ce sont des options pour le make. Elles sont à placer dans le fichier makefile.

En voici quelques unes:

            .INIT : <commande à exécuter au début du make>
            .DEFAULT : <commande à exécuter en cas d'erreur >
            .DONE : <commande exécuter à la fin de make>
           

            .IGNORE:                               Evite au make de s'arrêter en cas d'erreur
            .SILENT:                                N'affiche pas les commandes exécutées
            .PRECIOUS:   <fichier>*        Ne pas détruit pas les fichiers ..

            .PHONY : <cible>*                Déclares les cibles qui ne sont pas des fichiers

 
Exemple:

On veut créer une cible clean qui ne correspond pas à un fichier, qui une fois appeler dans le make va nettoyer le dossier actuel. On déclare donc clean comme cible non fichier.

            .PHONY: clean           

            clean:
            <tab>   rm -f *.o
            <tab>   rm -f *~

Ainsi la commande $ make clean , va supprimer tous les fichiers *.o et les fichier *~

En général on définie également une cible « all » qui regroupe toutes les fichiers à produire.

De facon à ce que la commande $ make all construise tous les fichiers désirés.

            .PHONY: clean all

            all: prog1 prog2 prog3

Ainsi, la commande $make all ordonne la compilation des 3 programmes.

Il reste encore beaucoup de chose à dire sur le makefile, mais je vous laisse en regarder là doc, vous savez à présent le principal :).

 Je termine ainsi par un exemple complet d'un projet devant générer deux programmes:
 
           
# Début du make file
            # Déclaration des macros

            CC = gcc
            CFLAGS = -Wall -O3
            LDFLAGS = -lm

            .PHONY:  all clean           

            all : prog1 prog2

            prog1 : main.o affichage.o lecture.o
            <tab>    $(CC) $^ -o $@ $(LDFLAGS)

            prog2 : main2.o affichage.o matrice.o
            <tab>    $(CC) $^ -o $@ $(LDFLAGS)

            main2.o : main2.c affichage.h matrice.h
            <tab>    $(CC) main2.c -c $(CFLAGS)

            main.o : main.c affichage.h lecture.h
            <tab>    $(CC) main.c -c $(CFLAGS)

            affichage.o : affichage.h affichage.c
            <tab>    $(CC) affichage.c -c $(CFLAGS)

            # etc...

            clean:
            <tab>    rm -f *.o
            <tab>    rm -f *~
        

La commande $make all, générera ainsi prog1 et prog2.
La commande $make prog2, ne générera que le prog2.

 

  • signaler à un administrateur
    Commentaire de Mumuri le 19/05/2005 19:33:06

    j'ai une petite question sur la commande make rpm, il semblerai que certaines options du makefile permette de générer des rpms, avait vous des infos dessus ???

  • signaler à un administrateur
    Commentaire de gogolex le 21/06/2005 16:59:35

    Je ne sais pas si on peut générer un paquetage depuis un makefile, mais par contre, avec la commande rpmbuild -c fichier est équivalente à la commande "make"

  • signaler à un administrateur
    Commentaire de franciscofern le 12/08/2005 17:54:57

    JE SUIS TRES INTERESSE POUR CETTE ARTICLE, CE QUI M'A SURPRIS EST  QUE ON PEUT FAIRE LA MEME CHOSE EN WINDOWS AVEC C++, JE VOUDRAIS SAVOIR PLUS SUR LA FACON DE LE FAIRE. JE NE CONNAIS QUE WINDOWS POUR LE MOMENT.
    MERCI D'AVANCE




  • signaler à un administrateur
    Commentaire de franciscofern le 12/08/2005 17:54:59

    JE SUIS TRES INTERESSE POUR CETTE ARTICLE, CE QUI M'A SURPRIS EST  QUE ON PEUT FAIRE LA MEME CHOSE EN WINDOWS AVEC C++, JE VOUDRAIS SAVOIR PLUS SUR LA FACON DE LE FAIRE. JE NE CONNAIS QUE WINDOWS POUR LE MOMENT.
    MERCI D'AVANCE




  • signaler à un administrateur
    Commentaire de franciscofern le 12/08/2005 17:54:59

    JE SUIS TRES INTERESSE POUR CETTE ARTICLE, CE QUI M'A SURPRIS EST  QUE ON PEUT FAIRE LA MEME CHOSE EN WINDOWS AVEC C++, JE VOUDRAIS SAVOIR PLUS SUR LA FACON DE LE FAIRE. JE NE CONNAIS QUE WINDOWS POUR LE MOMENT.
    MERCI D'AVANCE




  • signaler à un administrateur
    Commentaire de pakman le 16/08/2005 14:06:21

    Et bien sous windows tu ne devrais normalement ne pas en avoir besoin. SI tu utilises visual cpp ou devCpp c'est la gestion du projet qui utilise implicitement les makefiles en ne compilant que le necessaire à chaque fois mais cette gestion n'est pas visible. Cependant tu peux générer avec ces deux programmes des fichiers makefile ce qui peut être intéressant pour une exportation. Si tu utilises un compilateur en ligne de commande par contre, tu peux en avoir besoin, je sais qu'il en existe des versions pour DOS mais je ne m'y connais pas trop... donc essaye de cherche de ce coté là... Il est possible que tu puisses trouver des package avec gcc et makefile pour windows... essaye sur google :)

  • signaler à un administrateur
    Commentaire de sithlords le 31/10/2005 13:38:07

    et ben moi sous windows je le fais et c'est très bien :D .

  • signaler à un administrateur
    Commentaire de Forsaken01 le 06/06/2006 20:24:38

    justement je tourne sous Linux Debian

    et je voulais savoir que signifier

    prefix=${HOME}

    ce ${HOME} j'ignior ce qui signifie au juste car j'ai créer un bête programme faite en c++ et je le voudrais l'installer avec un fichier nomée

    configure et Makefile

    le fichier configure que j'execute avec la commande
    ./configure

    je voudrais savoir egalement comment il functionne
    tous comme la Makefile
    car j'ai télécharger des programme et des programmes pour savoir comment créer un makefile mes dans leur fichier j'ai rien capter

    Est-ce-que ce genre de fichier et en Bash, sh, shell sous Unix??????

  • signaler à un administrateur
    Commentaire de ibtissam2006 le 30/11/2006 02:05:09

    avec kel editeur en creer le fichier en c sous linux???

  • signaler à un administrateur
    Commentaire de casanova10 le 23/01/2008 08:01:31

    merci pour ce tres bon prtit cours
    Ridha

Ajouter un commentaire

Pub



Appels d'offres

Recherche developpeur ...
Budget : 700€
SITE MARCHAND LOCATION...
Budget : 3 000€
SITE MARCHAND POUR HOTEL
Budget : 4 000€

CalendriCode

Août 2008
LMMJVSD
    123
45678910
11121314151617
18192021222324
25262728293031

Boutique

Boutique de goodies CodeS-SourceS