Ecriture d un Makefile



Documents pareils
Cours Langage C/C++ Programmation modulaire

Quelques éléments de compilation en C et makefiles

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

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

Construction de logiciel et packaging

Chapitre 10 : Logiciels

Optimisation de logiciels de modélisation sur centre de calcul

Perl Console. Votre compagnon pour développer en Perl. Les Journées du Perl , 17 novembre, Lyon. Alexis Sukrieh

TP 1 Prise en main de l environnement Unix

Environnements et Outils de Développement Cours 1 Introduction

Chaîne de production d un programme

Cours de Programmation 2

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Unix/Linux I. 1 ere année DUT. Université marne la vallée

TP1 - Prise en main de l environnement Unix.

C.M. 1 & 2 : Prise en main de Linux

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

Conventions d écriture et outils de mise au point

Comment avoir le logiciel? Le serveur web APACHE peut être téléchargé gratuitement du site web de APACHE:

Partie II Cours 3 (suite) : Sécurité de bases de données

Outils pour la pratique

INSTALLATION ET CONFIGURATION DE OPENLDAP

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

Installation et compilation de gnurbs sous Windows

Titre: Version: Dernière modification: Auteur: Statut: Licence:

Programmation système en C/C++

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

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

Programmation impérative

Raisonnement probabiliste

Formula Negator, Outil de négation de formule.

Connexion à SQL server

Factorisation Factoriser en utilisant un facteur commun Fiche méthode

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

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

Le langage C. Séance n 4

Fiche PanaMaths Calculs avec les fonctions sous Xcas

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

TP1 : Initiation à l algorithmique (1 séance)

Installation et prise en main

Préparation d un serveur Apache pour Zend Framework

Manuel d utilisation 26 juin Tâche à effectuer : écrire un algorithme 2

TP1 : Initiation à Java et Eclipse

Cours 1 : La compilation

Testez votre installation. Créer un répertoire vide

MICROINFORMATIQUE NOTE D APPLICATION 1 (REV. 2011) ARITHMETIQUE EN ASSEMBLEUR ET EN C

Unix : Programmation Système

Compilation (INF 564)

Systèmes d exploitation

Cours de Systèmes d Exploitation

TP1. Outils Java Eléments de correction

Rappels Entrées -Sorties

Introduction...3. Objectif...3. Manipulations...3. La Sauvegarde...4. Les différents types...4. Planification...4. Les outils...5

TP3 : Manipulation et implantation de systèmes de fichiers 1

Représentation d un entier en base b

TP n 2 : Installation et administration du serveur ProFTP. Partie 1 : Fonctionnement du protocole FTP (pas plus de 15min)

Déployer des applications Perl

Évaluation et implémentation des langages

Argument-fetching dataflow machine de G.R. Gao et J.B. Dennis (McGill, 1988) = machine dataflow sans flux de données

UTILITAIRE BRM BACKING UP, RESTORING AND MOVING CONTENT

SSH et compagnie : sftp, scp et ssh-agent

TP1 : Initiation à Java et Eclipse

Brique BDL Gestion de Projet Logiciel

Archivage Messagerie Evolution pour usage HTML en utilisant Hypermail

Projet Robot Centaure

Installation LTE-SIM. Simulation du réseau 4G (LTE-SIM) en vue d optimiser les ressources spectrales de l opérateur.

Haka : un langage orienté réseaux et sécurité

DA MOTA Anthony - Comparaison de technologies : PhoneGap VS Cordova

GEMA Prévention - Portrait des conducteurs de 2 roues d'aujourd'hui

(Exemple ici de calcul pour une Ducati 748 biposto, et également pour un S2R1000, équipé d un disque acier en fond de cloche, et ressorts d origine)

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

Seconde Généralités sur les fonctions Exercices. Notion de fonction.

TP LINUX : MISE EN PLACE DU SERVEUR DE MESSAGERIE QMAIL

Environnements de développement (intégrés)

Table des matières Hakim Benameurlaine 1

Suivant les langages de programmation, modules plus avancés : modules imbriqués modules paramétrés par des modules (foncteurs)

Projet audio. Analyse des Signaux ELE2700

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

Les BRMS Business Rules Management System. Groupe GENITECH

Apprendre Java et C++ avec NetBeans

STAGE IREM 0- Premiers pas en Python

Configuration d un Client VPN «TheGreenBow» 1) Création d un compte utilisateur dans la base LDAP Netasq

Étude de l application DNS (Domain Name System)

Chapitre 2. Classes et objets

Styler un document sous OpenOffice 4.0

Le filtrage de niveau IP

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Plate-forme de travail collaboratif Agorazimut

Introduction à Linux (pour le HPC) «Linux 101» Présentation :

SE CONNECTER A LA MESSAGERIE ACADEMIQUE ET A CIRCON SCRIPT

Traitement de données

avec des nombres entiers


Classes et Objets en Ocaml.

Installer une caméra de surveillance

utiliser un Macintosh dans la classe

Le support de la vidéo par Asterisk

PARAGON Disk Wiper. Guide de l utilisateur. Paragon Technology GmbH, System Programmierung. Copyright Paragon Technology GmbH

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

Transcription:

Ecriture d un Makefile ENSIMAG 1A Année scolaire 2008 2009 Un Makefile est un fichier, utilisé par le programme make, regroupant une série de commandes permettant d exécuter un ensemble d actions, typiquement la compilation d un projet. Un Makefile peut être écrit à la main, ou généré automatiquement par un utilitaire (exemples : automake, gmake,...). Il est constitué d une ou de plusieurs règles de la forme : cible: dépendances commandes Lors du parcours du fichier, le programme make évalue d abord la première règle rencontrée, ou celle dont le nom est spécifié en argument. L évaluation d une règle se fait récursivement : 1. les dépendances sont analysées : si une dépendance est la cible d une autre règle, cette règle est à son tour évaluée ; 2. lorsque l ensemble des dépendances a été analysé, et si la cible est plus ancienne que les dépendances, les commandes correspondant à la règle sont exécutées. 1 Exemple Ce qui suit présente la création d un Makefile pour un exemple de projet. Supposons pour commencer que ce projet regroupe trois fichiers exemple.h, exemple.c et main.c. 1.1 Makefile de base Un fichier Makefile de base de ce projet pourrait s écrire : gcc -o mon_executable exemple.o main.o 1

En effet pour créer l exécutable mon_executable, nous avons besoin des fichiers objets exemple.o et main.o. make va d abord rencontrer exemple.o, et va donc évaluer la règle dont ce fichier est la cible. La seule dépendance de cette règle étant exemple.c, qui n est pas cible d une autre règle, make va exécuter la commande : De la même façon, make va ensuite analyser la règle dont main.o est la cible et exécuter la commande : Finalement, toutes les dépendances de la règle initiale ayant été analysées, make va exécuter la commande : gcc -o monexecutable exemple.o main.o 1.2 Un premier raffinement Pour améliorer ce Makefile, on peut rajouter quelques cibles standards : all : à placer généralement au début du fichier ; les dépendances associées correspondent à l ensemble des exécutables à produire ; clean : normalement pas de dépendance ; la commande associée supprime tous les fichiers intermédiaires (notamment les fichiers objets) ; mrproper : la commande correspondante supprime tout ce qui peut être regénéré, ce qui permet une reconstruction complète du projet lors de l appel suivant à make. Notre Makefile devient donc ici : all: mon_executable gcc -o mon_executable exemple.o main.o rm -f mon_executable 2

1.3 Introduction de variables Il est possible de définir des variables dans un Makefile. Elles se déclarent sous la forme NOM=valeur et sont appelées sous la forme $(NOM), à peu près comme dans un shellscript. Parmi quelques variables standards pour un Makefile de projet C ou C++, on trouve : CC qui désigne le compilateur utilisé ; CFLAGS qui regroupe les options de compilation ; LDFLAGS qui regroupe les options d édition de liens ; EXEC ou TARGET qui regroupe les exécutables. Pour notre projet exemple, cela donne : $(CC) -o mon_executable exemple.o main.o $(LDFLAGS) $(CC) -o exemple.o -c exemple.c $(CFLAGS) $(CC) -o main.o -c main.c $(CFLAGS) Il existe aussi, et c est encore plus intéressant car très puissant, des variables internes au Makefile, utilisables dans les commandes ; notamment : $@ : nom de la cible ; $< : nom de la première dépendance ; $ˆ : liste des dépendances ; $? : liste des dépendances plus récentes que la cible ; $* : nom d un fichier sans son suffixe. On peut donc encore compacter notre Makefile : 3

1.4 Règles d inférences On voit néanmoins qu il y a encore moyen d améliorer ce Makefile : en effet les règles dont les deux fichiers objets sont les cibles se ressemblent fortement. Or justement, on peut créer des règles génériques dans un Makefile : il suffit d utiliser le symbole % à la fois pour la cible et pour la dépendance. Il est également possible de préciser séparement d autres dépendances pour les cas particuliers, par exemple pour ne pas oublier la dépendance au fichier exemple.h pour la règle dont main.o est la cible. Ceci nous donne : main.o: exemple.h %.o: %.c 4

1.5 Liste des fichiers objets et liste des fichiers sources On peut encore simplifier ce Makefile. En effet, on constate que la génération de l exécutable dépend de tous les fichiers objets. Ceci peut être long à écrire dans le cas d un gros projet! Pour simplifier l écriture, sachant que tous les fichiers objets correspondent aux fichiers sources en remplaçant l extension.c par l extension.o, on peut utiliser les variables SRC et OBJ et définir OBJ=$(SRC :.c=.o). SRC sera définie par la liste des fichiers sources... ce qui n a fait que déplacer le problème! Là encore, une syntaxe particulière permet de simplifier le Makefile : SRC=$(wildcard *.c). wildcard permet l utilisation de la variable $* en dehors d une commande. Le Makefile du projet exemple devient finalement : SRC=$(wildcard *.c) OBJ=$(SRC:.c=.o) mon_executable: $(OBJ) main.o: exemple.h %.o: %.c Il existe encore bien d autres possibilités pour simplifier un Makefile. Il est notamment possible de créer des Makefile pour des sous-répertoires correspondant à des sous-parties du projet, et d avoir un Makefile maître très simple qui appelle ces sous-makefile, avec la variable MAKE. Il existe également des outils de génération automatique. 5