Ecrire un Makefile, sans douleur et en quelques leçons.



Documents pareils
Quelques éléments de compilation en C et makefiles

Cours Langage C/C++ Programmation modulaire

Introduction à la programmation Travaux pratiques: séance d introduction INFO0201-1

Mon premier rpm. 7 juin Avant de commencer RPM URPMI RPMBUILD... 2

Le langage C++ est un langage de programmation puissant, polyvalent, on serait presque tenté de dire universel, massivement utilisé dans l'industrie

Conventions d écriture et outils de mise au point

Algorithmique et Programmation, IMA

Outils pour la pratique

I. Introduction aux fonctions : les fonctions standards

Informatique I. Sciences et Technologies du Vivant (Semestre 1)


Utilisation d objets : String et ArrayList

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

TP1. Outils Java Eléments de correction

Introduction à l héritage en C++

Introduction au langage C

Factorisation Factoriser en utilisant un facteur commun Fiche méthode

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java

TP1 : Initiation à Java et Eclipse

Optimisation de logiciels de modélisation sur centre de calcul

Programmation C++ (débutant)/instructions for, while et do...while

Projet d informatique M1BI : Compression et décompression de texte. 1 Généralités sur la compression/décompression de texte

Introduction à la programmation orientée objet, illustrée par le langage C++ Patrick Cégielski

Utiliser Java sans BlueJ

C++ Programmer. en langage. 8 e édition. Avec une intro aux design patterns et une annexe sur la norme C++11. Claude Delannoy

L informatique en BCPST

Remise à niveau d un programme JAVA du domaine public

Programmation stochastique

Seance 2: En respectant la méthode de programmation par contrat, implémentez les autres fonctions de jeu.

Cours de C/C++ par la pratique. Hugues Talbot

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Introduction à l algorithmique et à la programmation M1102 CM n 3

La création d un paquet Debian. Aurélien Jarno. Journées du Logiciel Libre. 15 octobre 2005

Claude Delannoy. 3 e édition C++

TP : Gestion d une image au format PGM

TP1 : Initiation à Java et Eclipse

TP 1 Prise en main de l environnement Unix

Cours de C++ François Laroussinie. 2 novembre Dept. d Informatique, ENS de Cachan

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Premiers Pas en Programmation Objet : les Classes et les Objets

Cours d initiation à la programmation en C++ Johann Cuenin

Chapitre I Notions de base et outils de travail

Cours d Algorithmique et de Langage C v 3.0

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

Cahier n o 6. Mon ordinateur. Fichiers et dossiers Sauvegarde et classement

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Analyse tarifaire en ligne (TAO) de l'omc

Gestion des documents avec ALFRESCO

Chapitre 2. Classes et objets

1 Démarrage de Marionnet

Polymorphisme, la classe Object, les package et la visibilité en Java... 1

1) Installation de Dev-C++ Téléchargez le fichier devcpp4990setup.exe dans un répertoire de votre PC, puis double-cliquez dessus :

Introduction à la Programmation Parallèle: MPI

CREG : versailles.fr/spip.php?article803

Introduction au pricing d option en finance

INSTALLATION ET CONFIGURATION DE OPENLDAP

Une introduction à Java

Eclipse atelier Java

Compilation (INF 564)

Tutoriel Atout Facture. 14/01/2015 Codelpi

Systeme d'exploitation

< Atelier 1 /> Démarrer une application web

Algorithmique et programmation : les bases (VBA) Corrigé

Base est le module pour les bases

Génie Logiciel I. Cours VI - Typage statique / dynamique, fonctions virtuelles et classes abstraites, flots d entrées / sorties, et string

Le Langage C Version 1.2 c 2002 Florence HENRY Observatoire de Paris Université de Versailles florence.henry@obspm.fr

Cours 14 Les fichiers

Les chaînes de caractères

Programmation système en C/C++

Cours 1 : Introduction Ordinateurs - Langages de haut niveau - Application

Cours de Programmation 2

Anne Tasso. Java. Le livre de. premier langage. 10 e édition. Avec 109 exercices corrigés. Groupe Eyrolles, , ISBN :

Introduction au logiciel de gestion bibliographique Zotero

Chap III : Les tableaux

Utiliser Dev-C++ .1Installation de Dev-C++ Table des matières

Tutoriel code::blocks

Manuel d Utilisation Nouvelle Plateforme CYBERLIBRIS : ScholarVox Management

0.1 Mail & News : Thunderbird

Initiation à la librairie graphique VTK

Tp 1 correction. Structures de données (IF2)

IMAGES NUMÉRIQUES MATRICIELLES EN SCILAB

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Créer le schéma relationnel d une base de données ACCESS

Rapports d activités et financiers par Internet. Manuel Utilisateur

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Initiation. àl algorithmique et à la programmation. en C

Langages et Concepts de Programmation Introduction à la programmation en langage C

30.avr.10 Présentation miniprojet. 9.mars.10 Cours 3 4.mai.10 Cours C mars.10 Cours 4 11.mai.10 Cours C++ 2

Stocker des données sur Amazon S3

1 Description générale de VISFIELD

Chaîne de production d un programme

COURS WINDEV NUMERO 3

Le langage C. Séance n 4

Débuter avec Excel. Excel

Arguments d un programme

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

TP Bases de données réparties

wxwidgets dans un environnement Microsoft Windows

Création et Gestion des tables

Transcription:

Ecrire un Makefile, sans douleur et en quelques leçons. M. Billaud Département Informatique Institut Universitaire de Technologie Université Bordeaux 1 Mai 2010 Résumé Ce document montre comment écrire un Makefile lisible pour un projet de programmation, en tirant profit des dépendances implicites, règles par défaut etc. Table des matières 1 A quoi ça sert? 2 1.1 Exemple : un source C++................................ 2 1.2 Un premier Makefile :.................................. 2 1.3 Explications........................................ 2 1.4 Avantages......................................... 2 1.5 Avec plusieurs cibles................................... 3 2 Makefiles pour la compilation séparée 3 2.1 Un exemple........................................ 3 2.2 Le Makefile, version naïve................................ 4 3 Variables cible, liste de dépendances, première dépendance 4 3.1 Makefile avec variables cible, dépendances......................... 5 4 Variables définies par l utilisateur 5 5 Les commandes par défaut 6 5.1 Utiliser les variables prédéfinies............................. 6 5.2 Redéfinir une règle par défaut.............................. 7 5.3 Makefile.......................................... 7 6 Construction automatique des dépendances 8 6.1 la commande makedepend................................ 8 6.2 Makefile final....................................... 8 6.3 Mode d emploi...................................... 9 7 Un exemple plus complexe (Programmation Objet) 9 1

1 A quoi ça sert? Un fichier Makefile est un texte qui indique à la commande makecomment fabriquer des fichiers à partir d autres fichiers. On rentre dans un fichier Makefile des règles qui indiquent comment on fabrique les fichiers, et la commande make lance la fabrication. Le plus souvent, c est utilisé pour se simplifier la vie pour le développement des programmes d une certaine taille, dont les sources sont répartis en plusieurs morceaux compilés séparément. Mais commençons par un exemple simple. 1.1 Exemple : un source C++ Vous avez écrit un programme hello.cc #include <iostream > int main ( ) { std : : cout << Hello, world << std : : endl ; } à la main vous compilez ce programme en lançant la commande g++ -Wall -o hello hello.cc 1.2 Un premier Makefile : Vous obtiendrez le même résultat en créant un fichier Makefile qui contiendrait h e l l o : h e l l o. cc g++ Wall o h e l l o h e l l o. cc (attention, la seconde ligne commence par une tabulation, pas par des espaces) et en lançant la commande make quand vous voulez recompiler. 1.3 Explications Ce Makefile se lit ainsi Le fichier cible hello dépend de hello.cc. On considère qu il est à jour si il existe (!) et qu il a été fabriqué i après /i la dernière modification de hello.cc pour le (re)-fabriquer, il faut lancer la commande g++... 1.4 Avantages Pour recompiler le source 1. plus besoin de relancer une longue commande, il suffit de taper «make» 2. si le fichier hello est à jour, la commande make ne recompilera pas hello.cc, puisque c est inutile. Sur un exemple aussi simple (un seul source à compiler), l intérêt d avoir à apprendre l utilisation des Makefiles n est pas flagrant, mais ça va venir. 2

1.5 Avec plusieurs cibles Un Makefile comporte généralement plusieurs cibles, voyons un exemple plus détaillé h e l l o : h e l l o. cc g++ Wall o h e l l o h e l l o. cc h e l l o. pdf : h e l l o. cc Makefile a2ps o h e l l o. cc Makefile ps2pdf h e l l o. pdf # # C i b l e s h a b i t u e l l e s # c l e a n : rm f mrproper : c l e a n rm f h e l l o Quelques explications 1. La commande «make» sans paramètre lance la fabrication (éventuelle) de la première cible hello. On aurait le même effet en lançant «make hello». 2. «make hello.pdf» fabrique un fichier PDF contenant le source et le makefile. 3. «make clean» fait le ménage dans les fichiers intermédiaires (fichiers de sauvegarde l éditeur de textes, etc) 4. «make mrproper» fait le grand ménage, en ne conservant normalement que les sources de l application. Recommandation : Avoir ces cibles clean et mrproper (Monsieur Propre), est une pratique usuelle (et fortement conseillée). 2 Makefiles pour la compilation séparée C est la compilation séparée qui fait apparaître tout le charme du Makefile aux yeux des programmeurs. 2.1 Un exemple Vous avez eu l idée d écrire une fonction afficher(string message) ; dans un fichier séparé // f i c h i e r a f f i c h e r. cc #include <iostream > #include a f f i c h e r. h void a f f i c h e r ( std : : s t r i n g message ) { std : : cout << message << std : : endl ; } Le prototype est déclaré dans un fichier d entête : 3

// f i c h i e r a f f i c h e r. h #include <iostream > void a f f i c h e r ( std : : s t r i n g message ) ; et le programme hello.cc y fait référence // f i c h i e r h e l l o. cc #include a f f i c h e r. h int main ( ) { a f f i c h e r ( Bonjour, monde ) ; } 2.2 Le Makefile, version naïve La compilation séparée comportera deux étapes la compilation séparée des deux sources (.cc) pour fabriquer les modules objets (.o) l édition des liens des fichiers objets (.o) pour constituer l exécutable h e l l o : h e l l o. o a f f i c h e r. o g++ o h e l l o h e l l o. o a f f i c h e r. o g++ Wall c h e l l o. cc a f f i c h e r. o : a f f i c h e r. cc a f f i c h e r. h g++ Wall c a f f i c h e r. cc h e l l o. pdf : h e l l o. cc a f f i c h e r. h a f f i c h e r. cc Makefile a2ps o h e l l o. cc a f f i c h e r. h a f f i c h e r. cc Makefile \ ps2pdf h e l l o. pdf # # C i b l e s h a b i t u e l l e s # c l e a n : rm f. o mrproper : c l e a n rm f h e l l o 3 Variables cible, liste de dépendances, première dépendance Le Makefile ci-dessus peut être largement simplifié en utilisant 3 variables prédéfinies. $@ cible $^ liste des dépendances $< première dépendance 4

Dans une commande, $@ contient la cible (target). La première règle (édition des liens) pourrait s écrire h e l l o : h e l l o. o a f f i c h e r. o g++ o $@ h e l l o. o a f f i c h e r. o $ˆ contient la liste des dépendances. La première règle peut être simplifiée davantage h e l l o : h e l l o. o a f f i c h e r. o g++ o $@ $ˆ de même que la 3ième h e l l o. pdf : h e l l o. cc a f f i c h e r. h a f f i c h e r. cc Makefile a2ps o $ˆ ps2pdf $@ qui devient beaucoup plus lisible. $<, qui contient la première dépendance, rend service pour les compilations séparées g++ Wall c $< 3.1 Makefile avec variables cible, dépendances... h e l l o : h e l l o. o a f f i c h e r. o g++ o $@ $ˆ g++ Wall c $< a f f i c h e r. o : a f f i c h e r. cc a f f i c h e r. h g++ Wall c $< h e l l o. pdf : h e l l o. cc a f f i c h e r. h a f f i c h e r. cc Makefile a2ps o $ˆ ps2pdf $@ #... 4 Variables définies par l utilisateur On peut définir des variables pour travailler plus commodément. Par exemple on s en sert pour définir la liste des fichiers sources, la liste des entêtes, et la liste de modules objet. s o u r c e s=h e l l o. cc a f f i c h e r. cc e n t e t e s=a f f i c h e r. h o b j e t s=$ ( s o u r c e s :. cc =.o ) h e l l o : $ ( o b j e t s ) g++ o $@ $ˆ g++ Wall c $< a f f i c h e r. o : a f f i c h e r. cc a f f i c h e r. h g++ Wall c $< 5

h e l l o. pdf : $ ( s o u r c e s ) $ ( e n t e t e s ) Makefile a2ps o $ˆ ps2pdf $@ #... l affectation se passe de commentaires on peut ajouter des élements à une variable. On aurait pu écrire : s o u r c e s s o u r c e s... = h e l l o. cc += a f f i c h e r. cc l expansion d une variable se fait par dollar parenthèses possibilité de substitution pendant l expansion. Ligne 3, la liste des modules objets est déduite de la liste des fichiers sources, en remplaçantles suffixes.cc par.o 5 Les commandes par défaut La commande make possède un stock de dépendances et de règles par défaut qu on peut mettre à profit pour allèger encore les Makefiles. Par exemple, si vous avez dans votre répertoire un fichier «prog.cc» la commande «make prog.o» lance automatiquement la commande g++ prog.cc -o prog sans qu on ait écrit quoi que ce soit dans le Makefile. C est le résultat d une dépendance implicite : si prog.cc existe dans le répertoire, alors le fichier prog dépend de prog.cc d une commande par défaut : pour fabriquer un exécutable (sans suffixe) à partir d un source C++ (nom + suffixe.cc), on lance la commande de compilation adaptée g++... si rien d autre n est précisé. 5.1 Utiliser les variables prédéfinies Ici se pose un petit problème : conserver l option «-Wall» pour les compilations séparées. Heureusement, les commandes par défaut sont paramétrables par l intermédiaire de variables. Ici on affecte donc l option à la variable CXXFLAGS CXXFLAGS= Wall s o u r c e s=h e l l o. cc a f f i c h e r. cc e n t e t e s=a f f i c h e r. h o b j e t s=$ ( s o u r c e s :. cc =.o ) h e l l o : $ ( o b j e t s ) g++ o $@ $ˆ a f f i c h e r. o : a f f i c h e r. cc a f f i c h e r. h ### h e l l o. pdf : $ ( s o u r c e s ) $ ( e n t e t e s ) Makefile a2ps o $ˆ ps2pdf @< 6

c l e a n : rm f. o mrproper : c l e a n rm f h e l l o 5.2 Redéfinir une règle par défaut Pour la première cible, malheureusement, la commande par défaut ne convient pas. Si on écrivait CXXFLAGS= Wall h e l l o : $ ( o b j e t s )... make lancerait «gcc -o hello hello.o afficher.o» (au lieu de g++), donc sans faire référence à la bibliothèque standard C++. Un moyen de s en sortir est de redéfinir les commandes par défaut, en disant : pour fabriquer un fichier exécutable (sans suffixe) à partir de son module objet (suffixe.o) et d autres éventuellement, il faut lancer la commande d éditions des liens adaptée à C++. Ce qui s écrit : %: %.o $ (LINK. cc ) o $@ $ˆ Comme vous l avez deviné, la variable prédéfinie LINK.cc contient la commande qui va bien pour l édition des liens. 5.3 Makefile CXXFLAGS= Wall s o u r c e s=h e l l o. cc a f f i c h e r. cc e n t e t e s=a f f i c h e r. h o b j e t s=$ ( s o u r c e s :. cc =.o ) %: %.o $ (LINK. cc ) o $@ $ˆ h e l l o : $ ( o b j e t s ) a f f i c h e r. o : a f f i c h e r. cc a f f i c h e r. h ### h e l l o. pdf : $ ( s o u r c e s ) $ ( e n t e t e s ) Makefile a2ps o $ˆ ps2pdf @< c l e a n : rm f. o 7

mrproper : c l e a n rm f h e l l o 6 Construction automatique des dépendances On peut faire encore mieux : s éviter en grande partie la fastidieuse écriture des dépendances. 6.1 la commande makedepend La commande makedepend est un outil complémentaire qui effectue à votre place la recherche des dépendances entre fichiers sources. En pratique, si on tape makedepend hello.cc afficher.cc les lignes suivantes # DO NOT DELETE a f f i c h e r. o : a f f i c h e r. h h e l l o. o : a f f i c h e r. h sont ajoutées à la fin du Makefile, remplaçant éventuellement les lignes qui étaient déjà après DO NOT DELETE. Ces dépendances sont obtenues en examinant les fichiers cités, pour trouver quels fichiers sont inclus (inclusions à plusieurs niveaux éventuellement) Les dépendances calculées se combinent harmonieusement avec les dépendances implicites (afficher.o : afficher.cc, etc.) et les commandes par défaut pour que tout se passe bien. Il n y a donc plus besoin d indiquer comment fabriquer les modules objets. C est fait pour. 6.2 Makefile final Voici donc la version finale du Makefile : CXXFLAGS= Wall s o u r c e s = h e l l o. cc a f f i c h e r. cc e n t e t e s = a f f i c h e r. h o b j e t s = $ ( s o u r c e s :. cc =.o ) %: %.o $ (LINK. cc ) o $@ $ˆ h e l l o : $ ( o b j e t s ) ### h e l l o. pdf : $ ( s o u r c e s ) $ ( e n t e t e s ) Makefile a2ps o $ˆ ps2pdf @< c l e a n : rm f. o. bak mrproper : c l e a n rm f h e l l o 8

depend : makedepend $ ( s o u r c e s ) Comparez avec la première version... 6.3 Mode d emploi 1. Avant la première utilisation, faire «make depend pour créer la liste des dépendances 2. idem quand vous ajoutez de nouveaux fichiers sources, ou que vous changez les #include dans vos programmes. 7 Un exemple plus complexe (Programmation Objet) Prenons un exemple plus complexe : deux programmes paie.cc et emploidutemps.cc qui font référence à des classes Titulaire et Vacataire dérivées de Enseignant (classe abstraite). Ces mêmes classes sont utilisées dans 2 programmes de test testtitulaire.cc et testvacataire.cc. Construction par morceaux : tout bien compté, il y a donc 3 classes avec leurs entêtes c l a s s e s=enseignant. cc T i t u l a i r e. cc Vacataire. cc et 4 programmes dont il faudra produire les exécutables progs=t e s t T i t u l a i r e. cc t e s t V a c a t a i r e. cc paie. cc emploidutemps. cc avec les dépendance explicites paie : paie. o Enseignant. o T i t u l a i r e. o Vacataire. o emploidutemps : emploidutemps. o Enseignant. o T i t u l a i r e. o Vacataire. o t e s t T i t u l a i r e : t e s t T i t u l a i r e. o Enseignant. o T i t u l a i r e. o t e s t V a c a t a i r e : t e s t V a c a t a i r e. o Enseignant. o Vacataire. o ce qui nous fait 10 sources, 7 modules objets et 4 exécutables. Mais le makefile reste à taille humaine! CXXFLAGS= Wall a p p l i s = paie. cc emploidutemps. cc t e s t s = t e s t T i t u l a i r e. cc t e s t V a c a t a i r e. cc c l a s s e s = Enseignant. cc T i t u l a i r e. cc Vacataire. cc e n t e t e s = $ ( c l a s s e s :. cc =.h ) execs = $ ( t e s t s :. cc ) $ ( progs :. cc=) a l l : $ ( execs ) paie : paie. o Enseignant. o T i t u l a i r e. o Vacataire. o emploidutemps : emploidutemps. o Enseignant. o T i t u l a i r e. o Vacataire. o t e s t T i t u l a i r e : t e s t T i t u l a i r e. o Enseignant. o T i t u l a i r e. o t e s t V a c a t a i r e : t e s t V a c a t a i r e. o Enseignant. o Vacataire. o l i s t i n g. pdf : $ ( a p p l i s ) $ ( e n t e t e s ) $ ( c l a s s e s ) Makefile a2ps o $ˆ ps2pdf @< l i s t i n g t e s t s. pdf : $ ( t e s t s ) $ ( e n t e t e s ) $ ( c l a s s e s ) Makefile 9

######### a2ps o $ˆ ps2pdf @< %: %.o c l e a n : $ (LINK. cc ) o $@ $ˆ rm f. o. bak mrproper : c l e a n rm f $ ( e xecs ) depend : makedepend $ ( progs ) $ ( c l a s s e s ) 10