Makefile
Un makefile est un fichier de configuration pour le programme make. Ce dernier contient des instructions pour compiler un ou plusieurs programmes.
Voici un exemple d'un fichier makefile pour compiler un programme C++ portant le nom progC. De plus, les options nécessaires pour utiliser la librairie CPLEX sont présentes.
- Makefile
# Exemple de makefile pour un programme cplex en C++ CFLAGS=-Wall -O #CFLAGS=-Wall -g CPPFLAGS=-DNDEBUG -DIL_STD CXX=g++ OBJ=progC.o progC2.o progC: $(OBJ) $(CXX) $(CFLAGS) -o progC $(OBJ) -lm -lilocplex -lconcert -lcplex -lpthread # ^ TAB obligatoire en début de ligne # ----- librairies pour CPLEX ---------- progC.o: progC.cpp $(CXX) $(CFLAGS) $(CPPFLAGS) -c progC.cpp progC2.o: progC2.cpp $(CXX) $(CFLAGS) $(CPPFLAGS) -c progC2.cpp clean: rm -f progC progC.o
Tout d'abord, vous remarquerez qu'il y a le signe hashtag (dièse) au tout début de certaines lignes. Ce caractère indique à make que la ligne est un commentaire et qu'elle ne doit pas être prise en considération.
L'instruction CFLAGS=-Wall -O
, est une affectation à une variable. La variable CFLAGS aura la valeur -Wall -O. Plus tard, on peut utiliser cette variable avec la syntaxe $(CFLAGS). Dans le cas présent, cette variable est utilisée pour spécifier des options de compilation indiquant d'afficher plus d'avertissements de compilation et aussi d'optimiser le programme.
L'instruction CPPFLAGS=-DNDEBUG -DIL_STD
, est une autre affectation de variable. Cette variable est utilisée pour donner des paramètres au préprocesseur C++. Dans ce cas-ci, on indique de définir NDEBUG et IL_STD. Ces définitions sont nécessaires pour qu'un fichier utilisant CPLEX compile correctement.
CXX=g++, indique d'utiliser le compilateur g++. OBJ=progC.o progC2.o, ici on défini la variable OBJ comportera progC.o et progC2.o
progC: $(OBJ)
$(CXX) $(CFLAGS) -o progC $(OBJ) -lm -lilocplex -lconcert -lcplex -lpthread
progC.o: progC.cpp
$(CXX) $(CFLAGS) $(CPPFLAGS) -c progC.cpp
progC2.o: progC2.cpp
$(CXX) $(CFLAGS) $(CPPFLAGS) -c progC2.cpp
clean:
rm -f progC progC.o
Voici le code source du fichier progC.cpp
- C++
#include "progC2.h" int main(int argc, char **argv) { int n; if (argc < 2) { printf("Usage: ./progC n \n"); exit(1); } n = atoi(argv[1]); Fibonacci(n); return(1); }
Voici le code source du fichier progC2.cpp
- c++
#include "progC2.h" /* Afficher la suite de Fibonacci du nieme nombre ou n est entree au clavier */ void Fibonacci(int n) { int count, t1=0, t2=1, display=0; printf("Fibonacci Series: %d - %d - ", t1, t2); /* Afficher 2 premier nombres */ count=2; /* count=2 parce que les 2 premier nombres sont déjà affichés */ while (count<n) { display=t1+t2; t1=t2; t2=display; ++count; printf("%d - ",display); } printf("\n"); }
Finalement, voici le code source du fichier .h (header)
- c++
#include <cstdio> #include <cstdlib> #include <cmath> void Fibonacci(int n);
Un fichier makefile a des règles de base concernant sa forme:
cible: dependance
commande
Avant chaque commande il y a un TAB (caractère de tabulation).
Pour l'invoquer le fichier makefile, nous devons taper make.
Voici la sortie standard (sortie à l'écran) de l'invocation de la commande make
>make g++ -Wall -O -DNDEBUG -DIL_STD -c progC.cpp g++ -Wall -O -o progC progC.o progC2.o -lm -lilocplex -lconcert -lcplex -lpthread
Voici les fichiers qui se retrouve dans votre répertoire suite à l'invocation de la commande make
makefile makefile~ progC progC2.cpp progC2.cpp~ progC2.h progC2.h~ progC2.o progC.cpp progC.cpp~ progC.o
Voici une exécution du programme
>./progC 14 Fibonacci Series: 0 - 1 - 1 - 2 - 3 - 5 - 8 - 13 - 21 - 34 - 55 - 89 - 144 - 233 -
Voici l'invocation de make clean (défini plus haut dans notre fichier makefile)
>make clean rm -f progC progC.o