Compilation avec Make



Documents pareils
Cours Langage C/C++ Programmation modulaire

Quelques éléments de compilation en C et makefiles

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

Algorithmique et Programmation, IMA

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

Le prototype de la fonction main()

Construction de logiciel et packaging

Introduction au langage C

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


Chapitre 10 : Logiciels

Chaîne de production d un programme

Programmation système I Les entrées/sorties

Programmation en C. École Nationale Supérieure de Techniques Avancées. Pierre-Alain Fouque et David Pointcheval

3IS - Système d'exploitation linux - Programmation système

Programmation système en C/C++

Programmation C. Apprendre à développer des programmes simples dans le langage C

INFO-F-404 : Techniques avancées de systèmes d exploitation

Optimisation de logiciels de modélisation sur centre de calcul

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

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Compression de Données - Algorithme de Huffman Document de Conception

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

Cours Programmation Système

TP1. Outils Java Eléments de correction

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

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

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

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Cours de C. Petits secrets du C & programmation avancée. Sébastien Paumier

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

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Cours 6 : Tubes anonymes et nommés

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

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

Le langage C. Introduction, guide de reference

TP1 - Prise en main de l environnement Unix.

Archivage Messagerie Evolution pour usage HTML en utilisant Hypermail

UE Programmation Impérative Licence 2ème Année

Programmation C. J.-F. Lalande. 15 novembre 2012

Unix : Programmation Système

Outils pour la pratique

Les chaînes de caractères

Programmation impérative

Notes de Cours - Programmation Pascal Ferraro

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

Programmation système de commandes en C

ALGORITHMIQUE ET PROGRAMMATION En C

Systeme d'exploitation

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

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

TP1 : Initiation à Java et Eclipse

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

Lier Erlang avec d autres langages de programmation

I. Introduction aux fonctions : les fonctions standards

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Programmation en langage C

TD séances n 3 et n 4 Répertoires et Fichiers sous Unix

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

Projet De Stijl Plate-forme pour robots mobiles

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

Exercice sur les Dockers

Cours de Programmation 2

PROJET ALGORITHMIQUE ET PROGRAMMATION II

Cours Java Native Interface

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

TP 1 Prise en main de l environnement Unix

Les structures. Chapitre 3

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

Notes du cours 4M056 Programmation en C et C++ Vincent Lemaire et Damien Simon

Langage Éric Guérin 5 octobre 2010

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

SUPPORT DE COURS. Langage C

Créer son premier package.deb. 19 août

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

Introduction à MATLAB R

Votre premier projet Android

Derrière toi Une machine virtuelle!

Bases de programmation. Cours 5. Structurer les données

Table des matières Avant-propos... V Scripting Windows, pour quoi faire?... 1 Dans quel contexte?

Support de Cours de Langage C. Christian Bac

Algorithmique & Langage C IUT GEII S1. Notes de cours (première partie) cours_algo_lgc1.17.odp. Licence

Programmation en langage C Eléments de syntaxe

I00 Éléments d architecture

Environnements et Outils de Développement Cours 1 Introduction


Conventions d écriture et outils de mise au point

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

1 Description générale de VISFIELD

Programmation en C - Sommaire

Programmation en C/C++

Introduction à C++ et à wxwidgets

Utiliser Java sans BlueJ

Introduction à l héritage en C++

Programmation Classique en langage C

Cours 1 : Qu est-ce que la programmation?

La mémoire. Un ordinateur. L'octet. Le bit

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

INF 104 (SELC) Introduction au langage C

Transcription:

Compilation avec Make Laurent Réveillère Enseirb-Matmeca / IPB Département Télécommunications Laurent.reveillere@ipb.fr http://http://reveille.vvv.enseirb-matmeca.fr/ Objectifs Automatiser la reconstruction d un exécutable composé d un ou plusieurs: Modules objets Librairies Fichiers entêtes Avantages Assure la compilation séparer des différentes ressources Utilise des macro-commandes et des variables Permet ne recompiler que le code nécessaire Permet d utiliser des commandes shell arbitraire» Scripts d installations» Scripts de désinstallation» Scripts de nettoyage» Etc. 2 1

Quelques Définitions Cible Exécutable à (re)construire Commande a exécuter (installation, nettoyage, ) Dépendances Élément(s) dont dépend la cible Exemple en C» Cible dépendant d un fichier source.c» Cible construite que si le fichier source est plus récent que le fichier de la cible Commande Commande(s) permettant de reconstruire la cible Fichier makefile Fichier contenant la définition des dépendances et des règles de reconstruction des cibles 3 Exemple Le programme «calcul» se décompose en 4 fichiers input.c fonctions de lecture des fichiers de données matrix.c fonctions de calcul matriciel graph.c fonction d affichage graphique main.c programme principal input.h,matrix.h,graph.h fichiers d entêtes 4 2

Premier Makefile Permet de définir les cibles, les dépendances et les commandes pour reconstruire les cibles calcul: main.o input.o matrix.o graph.o gcc o calcul main.o input.o matrix.o graph.o main.o: main.c input.h matrix.h graph.h gcc c main.c input.o: input.c input.h gcc c input.c matrix.o: matrix.c matrix.h gcc c matrix.c graph.o: graph.c graph.h matrix.h gcc c graph.c 5 Règles de reconstruction d une cible Forme générale CIBLE(s):DEPENDANCES <tab>commande(s) Contraintes syntaxiques Cibles et dépendances sont sur une même ligne Le caractère «\» peut forcer make à ignorer le retour à la ligne Commandes commencent toujours par une tabulation Commandes sur plusieurs lignes» chaque ligne est séparée par le caractère «\»» Sauf la dernière ligne 6 3

Commandes Exécution d une commande Texte de la commande affichée sur la sortie standard Préfixer la commande par le caractère «@» pour ne pas l afficher Chaque ligne de commande est exécutée par un interpréteur différent du shell (sous Unix /bin/sh) Mettre plusieurs commandes sur une même ligne ou séparées par «\» pour utiliser le même interpréteur Comportement en cas d erreur L exécution d une règle et tout le processus sont abandonnés Indiquer «-» en début de commande pour indiquer à make qu il ignore l échec de cette commande Interruption d un make en cours d exécution d une règle» La cible est détruite par défaut 7 Exemples dir/prog: a.o b.o Incorrect cd dir gcc o prog../a.o../b.o dir/prog: a.o b.o cd dir ;\ gcc o prog../a.o../b.o -rm *.o @echo "done" 8 4

Évaluation d un fichier Makefile Commande make sans argument La première règle rencontrée est évaluée Commande make avec argument Le nom de la règle passée en argument est évaluée Évaluation d une règle 1. Analyse des dépendances 2. Si une dépendance est la cible d'une autre règle du Makefile, cette règle est à son tour évaluée. 3. Lorsque l'ensemble des dépendances est analysé et si la cible ne correspond pas à un fichier existant ou si un fichier dépendance est plus récent que la règle, les différentes commandes sont exécutées 9 Cas d étude #include <stdio.h> #include <stdlib.h> #include "hello.h" void Hello(void) { printf("%s\n", HELLO_MSG); } hello.c #ifndef HELLO_H #define HELLO_H #define HELLO_MSG Hello World extern void Hello(void); #endif /* HELLO_H */ hello.h #include <stdio.h> #include <stdlib.h> #include "hello.h" int main(int argc, char **argv) { Hello(); return EXIT_SUCCESS; } main.c 10 5

Compilation avec make $ emacs Makefile hello: hello.o main.o gcc -o hello hello.o main.o hello.o: hello.c hello.h gcc -o hello.o -c hello.c -Wall -ansi main.o: main.c hello.h gcc -o main.o -c main.c -Wall -ansi $ make 11 Que se passe t-il? 1. La première règle du Makefile est la règle hello 2. Évaluation de la règle hello 3. Analyse des dépendances 1. Évaluation des cibles hello.o et main.o 2. Analyses des dépendances pour la cible hello.o 3. Analyses des dépendances pour la cible main.o 4. Exécution des commandes si nécessaires 4. Exécution de la commande si nécessaire Exercice Regarder les fichiers générés par make 12 6

Limitations Difficile de gérer plusieurs exécutables pour des plateformes différentes Tous les fichiers intermédiaires sont conservés Pollution du répertoire de travail Impossible de forcer la régénération complète du projet Suppression manuel des fichiers temporaires obligatoire 13 Cibles standard all Première règle explicite pour définir ce qui est fait par défaut install Installation du programme construit Création de la structure de répertoire, copies des fichiers, uninstall Défait ce que install a fait Ne supprime pas les fichiers temporaires de la compilation clean Supprime du répertoire courant tous les fichiers construits par make all mrproper Remet les répertoires sources dans leur état initial 14 7

Application all: hello hello: hello.o main.o gcc -o hello hello.o main.o hello.o: hello.c hello.h gcc -o hello.o -c hello.c -Wall -ansi main.o: main.c hello.h gcc -o main.o -c main.c -Wall ansi rm -f *.o rm -f *~ hello 15 Notion de variables Motivations Simplifie l évolution des règles Factorise la définition des outils utiliés (compilateur, ) Définition NOM_VARIABLE = VALEUR Contrainte sur le nom» séquence de caractères sauf :, # = <tab> espace Utilisation $(NOM_VARIABLE) Exemple foo.o: foo.c $(CC) c foo.c o foo.o 16 8

Noms de variables standards AR Programme de maintenance d'archive CC Compilateur C CXX Compilateur C++ RM Commande pour effacer un fichier ARFLAGS Paramètres à passer au programme de maintenance d'archives CFLAGS Paramètres à passer au compilateur C LDFLAGS Paramètres à passer à l éditeur de lien EXEC Nom de l exécutable principal à générer 17 Application CFLAGS = -Wall -ansi LDFLAGS = EXEC = hello all: $(EXEC) $(EXEC): hello.o main.o $(CC) -o $(EXEC) hello.o main.o $(LDFLAGS) hello.o: hello.c hello.h $(CC) -o hello.o -c hello.c $(CFLAGS) main.o: main.c hello.h $(CC) -o main.o -c main.c $(CFLAGS) rm -f *.o rm -f *~ $(EXEC) 18 9

Variables automatiques $@ Nom de la cible de la règle $< Nom de la première dépendance $? Nom de toutes les dépendances qui sont plus récentes que la cible $^ Nom de toutes les dépendances d une cible $* Radical associé à une règle implicite Si la cible est toto.o désignée par %.o, alors $* est toto 19 Application CFLAGS = -Wall -ansi LDFLAGS = -Wall -ansi EXEC = hello all: $(EXEC) $(EXEC): hello.o main.o $(CC) -o $@ $^ $(LDFLAGS) hello.o: hello.c hello.h $(CC) -o $@ -c $< $(CFLAGS) main.o: main.c hello.h $(CC) -o $@ -c $< $(CFLAGS) rm -f *.o rm -f *~ $(EXEC) 20 10

Règles implicites Objectif Construction d un module objet (.o) à partir d un fichier source (.c) Règles appelées automatiquement pour construire toutes les cibles ayant pour suffixe.o Syntaxe %.o: %.c commandes Notation plus ancienne.c.o: commandes 21 Application CFLAGS = -Wall -ansi LDFLAGS = -Wall -ansi EXEC = hello all: $(EXEC) $(EXEC): hello.o main.o $(CC) -o $@ $^ $(LDFLAGS) %.o: %.c $(CC) -o $@ -c $< $(CFLAGS) rm -f *.o rm -f *~ $(EXEC) 22 11

Problème de dépendance Dans l exemple précédent main.o n'est plus reconstruit si hello.h est modifié Solution Préciser les dépendances séparément des règles implicites Illustration main.o: hello.h %.o: %.c $(CC) -o $@ -c $< $(CFLAGS) 23 Application CFLAGS = -Wall -ansi LDFLAGS = -Wall -ansi EXEC = hello all: $(EXEC) $(EXEC): hello.o main.o $(CC) -o $@ $^ $(LDFLAGS) main.o: hello.h hello.o: hello.h %.o: %.c $(CC) -o $@ -c $< $(CFLAGS) rm -f *.o rm -f *~ $(EXEC) 24 12

Problèmes avec les règles utilisateur Contexte clean est la cible d'une règle ne présentant aucune dépendance Supposons que clean soit également le nom d'un fichier présent dans le répertoire courant Problème Le fichier sera toujours plus récent que ses dépendances La règle ne sera jamais exécutée Solution Cible particulière.phony Dépendances systématiquement reconstruites.bashrc PATH=/opt/jumble/bin:$PATH Ou alias make= /opt/jumble/bin/make 25 Application CFLAGS = -Wall -ansi LDFLAGS = -Wall -ansi EXEC = hello all: $(EXEC) $(EXEC): hello.o main.o $(CC) -o $@ $^ $(LDFLAGS) main.o: main.c hello.h hello.o: hello.c hello.h %.o: %.c $(CC) -o $@ -c $< $(CFLAGS).PHONY: clean mrproper rm -f *.o rm -f *~ $(EXEC) 26 13

Substitution de variable Principe Définition d une variable par substitution des éléments d une autre variable Syntaxe $(VARIABLE:OLD=NEW) Utilisation Construction de la liste des modules objets à partir des fichiers sources SRC» Variable contenant la liste des fichiers sources du projet OBJ» Variable contenant la liste des fichiers objets du projet OBJ= $(SRC:.c=.o) 27 Application CFLAGS = -Wall -ansi LDFLAGS = EXEC = hello SRC = hello.c main.c OBJ = $(SRC:.c=.o) all: $(EXEC) $(EXEC): $(OBJ) $(CC) -o $@ $^ $(LDFLAGS) main.o: hello.h hello.o: hello.h %.o: %.c $(CC) -o $@ -c $< $(CFLAGS).PHONY: clean mrproper rm -f $(OBJ) rm -f *~ $(EXEC) 28 14

Gestion des fichiers sources Objectifs Générer automatiquement la liste des fichiers sources Attention» À utiliser avec précautions Méthode Utilisation de joker à la shell (*.c) pour obtenir tous les fichiers d extensions c du répertoire courant Utilisation des caractères joker par la commande wildcard Exemple SRC = $(wildcard *.c) 29 Application CFLAGS = -Wall -ansi LDFLAGS = EXEC = hello SRC = $(wildcard *.c) OBJ = $(SRC:.c=.o) all: $(EXEC) $(EXEC): $(OBJ) $(CC) -o $@ $^ $(LDFLAGS) main.o: hello.h hello.o: hello.h %.o: %.c $(CC) -o $@ -c $< $(CFLAGS).PHONY: clean mrproper rm -f *.o rm -f *~ $(EXEC) 30 15

Makefile conditionel Exécution conditionnelle d une partie d un makefile Principe proche des #ifdef en C Utilisation Définir des valeurs de variables différentes en fonction du contexte Exemple ifeq ($(DEBUG),yes) CFLAGS=-Wall -ansi -g LDFLAGS=-g else CFLAGS=-Wall -ansi LDFLAGS= endif 31 Application CFLAGS = -Wall -ansi LDFLAGS = EXEC = hello SRC = $(wildcard *.c) OBJ = $(SRC:.c=.o) DEBUG = yes ifeq ($(DEBUG),yes) CFLAGS=-Wall -ansi -g LDFLAGS=-g echo "Generating debug mode" else CFLAGS=-Wall -ansi LDFLAGS= echo "Generating release mode" endif all: $(EXEC) $(EXEC): $(OBJ) $(CC) -o $@ $^ $(LDFLAGS) main.o: hello.h %.o: %.c $(CC) -o $@ -c $< $(CFLAGS).PHONY: clean mrproper rm -f *.o rm -f *~ $(EXEC) 32 16

Génération automatique des dépendances CFLAGS = -Wall -ansi LDFLAGS = EXEC = hello SRC = hello.c main.c OBJ = $(SRC:.c=.o) DEPFLAGS = all: dep $(EXEC) dep: Makefile.dep Makefile.dep: $(SRC) @touch Makefile.dep $(CC) -MM $(DEPFLAGS) $(SRC) > $@ $(EXEC): $(OBJ) $(CC) -o $@ $^ $(LDFLAGS) %.o: %.c $(CC) -o $@ -c $< $(CFLAGS).PHONY: clean mrproper dep rm -f $(OBJ) rm -f *~ $(EXEC) Makefile.dep ifneq ($(wildcard Makefile.dep),) include Makefile.dep endif 33 Conventions de nommage prefix racine du répertoire d'installation (/usr/local) exec_prefix Racine pour les binaires ($(prefix)) bindir Répertoire d'installation des binaires ($(exec_prefix)/bin) libdir Répertoire d'installation des librairies ($(exec_prefix)/lib) datadir Répertoire d'installation des données statiques pour le programme ($(exec_prefix)/lib) statedir Répertoire d'installation des données modifiables par le programme ($(prefix)/lib) 34 17

Conventions de nommage (suite) includedir Répertoire d'installation des en-têtes ($(prefix)/include) mandir Répertoire d'installation des fichiers de manuel ($(prefix)/man) manxdir Répertoire d'installation des fichiers de la section x du manuel ($(prefix)/manx) infodir Répertoire d'installation des fichiers info ($(prefix)/info) srcdir Répertoire d'installation des fichiers source ($(prefix)/src) 35 18