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

C Discussion :

Réalisation d'un makefile et utilité ?


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Décembre 2021
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Décembre 2021
    Messages : 28
    Points : 9
    Points
    9
    Par défaut Réalisation d'un makefile et utilité ?
    Bonjour,
    Je me permets de me poster un message ici concernant les makefile et leur utilisation. (je suis un néophyte qui débute tout juste le langage C).
    J'avais déjà récemment posté un message concernant l’exécution d'un algorithme implémentant la méthode LZW. (https://www.developpez.net/forums/d2...eme-execution/)
    Je m'attaque maintenant aux makefile (qui ont l'air souvent utilisés)! De ce que j'ai compris pour le moment, ils servent à "créer" les exécutables des .c lorsqu'ils faut executer plusieurs actions.
    Ma question est donc : sont-ils toujours préférables, quelle est leur utilité pour un utilisateur autre que le " créateur" et enfin, comme exemple, comment le réaliser et qu'apporterai-t-il au script LZW que j'ai précédemment évoqué (https://github.com/radekstepan/LZW) dans mon précédent poste.

    Merci par avance pour vos retours.
    Bonne journée.
    Bien cordialement.

    Chaka_Sobek

  2. #2
    Membre expérimenté
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juillet 2020
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juillet 2020
    Messages : 352
    Points : 1 376
    Points
    1 376
    Par défaut
    Make est un builder = un programme qui permet de gérer les dépendances entre différents fichiers d'un projet. Il permet de construire ce qu'il faut dans l'ordre et uniquement lorsque cela est nécessaire.
    Make n'est pas le seul à faire ça mais c'est le plus ancien et le plus courant (on va dire) sous Unix.

    Un makefile est un fichier interprété par Make qui décrit un projet particulier.

    Ici on ne parle de script que pour les fichiers interprétés par un shell en général. Les .c sont nommés des sources. Leurs compilations produit des fichiers objets qui seront liés en un exécutable (ou une bibliothèque ou …).

    Le plus simple pour apprendre Make est de commencer par la doc dispo ici → https://gl.developpez.com/tutoriel/outil/makefile/

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Décembre 2021
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Décembre 2021
    Messages : 28
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par WhiteCrow Voir le message
    Make est un builder = un programme qui permet de gérer les dépendances entre différents fichiers d'un projet. Il permet de construire ce qu'il faut dans l'ordre et uniquement lorsque cela est nécessaire.
    Make n'est pas le seul à faire ça mais c'est le plus ancien et le plus courant (on va dire) sous Unix.

    Un makefile est un fichier interprété par Make qui décrit un projet particulier.

    Ici on ne parle de script que pour les fichiers interprétés par un shell en général. Les .c sont nommés des sources. Leurs compilations produit des fichiers objets qui seront liés en un exécutable (ou une bibliothèque ou …).

    Le plus simple pour apprendre Make est de commencer par la doc dispo ici → https://gl.developpez.com/tutoriel/outil/makefile/
    Merci pour votre message!

    Si j'ai bien compris ce que je viens de lire, le makefile donnerait quelque chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     lzw : lzw.o
    gcc -o lzw lzw.o
    lzw.o : lzw.c algorithms.c
    gcc -o lzw.o -c lzw.c -c algorithms.c (pas sûr de moi ..)
    ........ ainsi de suite
    Pouvez-vous me le confirmer ?
    Merci par avance.
    Bonne soirée.

    Chaka_Sobek

  4. #4
    Membre expérimenté
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juillet 2020
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juillet 2020
    Messages : 352
    Points : 1 376
    Points
    1 376
    Par défaut
    non

    Dans un premier temps on définit le compilateur, les options de compilations, d'édition des liens, etc.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    CC=gcc
    CFLAGS=-Wall -Wextra -g
    LDFLAGS=-lm #uniquement dans le cas où c'est nécessaire
    Une fois cette étape effectuée il est habituel de définir une cible par défaut (pour ne pas avoir à la taper en ligne de commande) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    .PHONY: all
    all: lzw
    la directive .PHONY indique à Make que la cible all doit toujours être prise en compte, même si un fichier all existe.

    Ensuite il faut décrire le projet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    lzw: lzw.o algorithms.o
    Ici on indique que l'exécutable lzw sera construit à partir de l'édition des liens de deux fichiers objets : lzw.o et algorithms.o ; en outre il y a aura la prise en compte de la libm (spécifiée dans LDFLAGS).
    Il n'y a rien besoin d'autre car Make sait comment faire ça.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    lzw.o: lzw.c lzw.h
    Ici on indique que le fichier objet est obtenu en compilant le lzw.c, Make à nouveau sait comment faire. On indique en plus que si un des fichiers lzw.c ou lzw.h est modifié par la suite il faudra recompiler lzw.c.

    De manière similaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    algorithms.o: algorithms.c algorithms.h lzw.h
    J'extrapole en supposant qu'un fichier algorithms.h existe …

    En général on dispose aussi d'une cible permettant de faire le ménage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    .PHONY: clean
    clean:
    <ici il y a une tabulation>${RM} algorithms.o lzw.o
     
    .PHONY: cleanall
    cleanall: clean
    <ici il y a une tabulation>${RM} lzw
    Il y a des moyens un peu plus complexes pour gérer les dépendances automatiquement mais c'est déjà un bon début.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Décembre 2021
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Décembre 2021
    Messages : 28
    Points : 9
    Points
    9
    Par défaut
    Merci beaucoup!

    Cependant, je ne comprends pas pourquoi pour lzw on précise qu'il dépend de lzw.o et algorithms.o mais à l'inverse on ne précise pas que algorithms.o dépend de algorithms.c qui dépend lui même de file.c, array.c, ...

    Peux-tu m'éclairer sur ce point ?

    Merci par avance.

  6. #6
    Membre expérimenté
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juillet 2020
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juillet 2020
    Messages : 352
    Points : 1 376
    Points
    1 376
    Par défaut
    Si il est bien précisé que algorithms.o dépend non seulement de algorithms.c, pour la compilation, mais également du header (s'il existe) et des headers inclus dans algorithms.c pour déclencher la construction.

    Un fichier objet ne dépend (en général) que de son source et des headers inclus dans ce source. C'est le concept même de compilation séparée. Modifier un source ne doit déclencher la recompilation que du fichier objet associé, l'édition des liens se refaisant avec la nouvelle version de cet objet plus tous les autres qui n'ont pas eu besoin d'une recompilation.

  7. #7
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    Je m'attaque maintenant aux makefile (qui ont l'air souvent utilisés)!
    Euh non , a part les débutants qui veulent absolument la mano , personne en pro ne l'utilise (ou des amateur aguerri),il y'a des IDE ou des constructeur mieux foutu comme Cmake ou Xmake (qui permet entre autre de générer des makefile automatiquement ).

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par WhiteCrow Voir le message
    Ici on indique que le fichier objet est obtenu en compilant le lzw.c, Make à nouveau sait comment faire.
    Moi il me semblait qu'il fallait le spécifier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    lzw.o: lzw.c lzw.h
    	$(CC) $(CFLAGS) -c lzw.c
    En tout cas j'ai jamais essayé sans. Et malheureusement suis pas chez-moi pour tester... (enfin j'essayerai plus tard).
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  9. #9
    Membre expérimenté
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juillet 2020
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juillet 2020
    Messages : 352
    Points : 1 376
    Points
    1 376
    Par défaut
    Normalement il y a les règles par défaut (en tout cas avec gnu make). On peut les consulter avec un make -p et par exemple pour compiler un source en objet on a :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    %.o: %.c
    #  recipe to execute (built-in):
            $(COMPILE.c) $(OUTPUT_OPTION) $<
    avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    # default
    OUTPUT_OPTION = -o $@
    ...
    # default 
    COMPILE.c = $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c

  10. #10
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Je plussoie aussi à l'utilisation de CMake plutôt que d'écrire manuellement des Makefiles.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 31/12/2018, 12h22
  2. Réponses: 2
    Dernier message: 17/07/2009, 22h17
  3. [UC][DC] utilité, méthode de réalisation
    Par Haage dans le forum Cas d'utilisation
    Réponses: 6
    Dernier message: 13/02/2008, 09h08
  4. Problème à réaliser un Makefile
    Par Goundy dans le forum Systèmes de compilation
    Réponses: 2
    Dernier message: 05/10/2007, 15h56

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