@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Tu aime le flood a ce que je vois ?
Tu veux pas faire un tours avec les messieurs en blouse blanche la bas ?
Le jeu vidéo n'est pas mort, vive le Retro Gaming !
http://www.romstation.fr/download.php?b=22293
¯¯\/¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
11111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111
1111111111111111111
LOOOOOOOOOOOOOOOOOOOOOOOOOOOLLLLLLLl
Visual basic : basic (beginner's all purpose symbolic instruction code : code
d'instructions génériques symboliques pour débutant : à l'inverse de fortran et cobol à
ses débuts) ; puis microsoft a créé VBA (visual basic for applications)
Dans la littérature sur ce langage on fait la différence entre :
Module : emplacement où se trouve le code VBA
Module de formulaire et d'état : code associé à un état ou un formulaire
Module standard : code associé à un objet de base (cas général)
Procédure : chaque module est divisé en procédures (sub) et en fonctions
Exercice 5 :
* créer un script triparam qui trie les paramètres donnés au script.
* Les paramètres possibles sans valeur sont écrits en dur dans le script. Par exemple : argnoval="-a -b -c".
* Les paramètres possibles avec valeur sont écrits en dur dans le script. Par exemple : argval="-d -e -f ".
* Les paramètres possibles avec valeur optionnelle sont écrits en dur dans le script. Par exemple : argo ptval="-g -h".
* Le tri consiste à mettre les paramètres et éventuelle ment leur valeur dans 3 listes différentes.
* La liste des paramètres sans valeur est mise dans une variable lstnoval.
* La liste des paramètres avec valeur est mise dans une variable lstval.
* La liste des paramètres avec valeur optionelle est mise dans une variable lstopt.
* Si le script rencontre un paramètre avec valeur non suivi par une valeur, il affiche une erreur et s'arrête.
* Si le script rencontre un paramètre inconnu, il affiche une erreur et s'arrête.
* Si le script rencontre un paramètre avec valeur optionnelle et que la valeur est un des paramètres possibles, il affiche une erreur et s'arrête.
* A la fin du traitement, le script affiche le contenu des trois listes lstnoval, lstval, lstopt.
optval="-a -b -c -d"
optnoval="-e -f -g"
testoptval () {
for i in $optval
do
if [ "$1" = "$i" ]; then
echo 1
return
fi
done
echo 0
}
testoptnoval () {
for i in $optnoval
do
if [ "$1" = "$i" ]; then
echo 1
return
fi
done
echo 0
}
lstoptval=""
lstoptnoval=""
lstohter=""
while [ "$1" != "" ]
do
rep1=$(testoptval $1)
rep2=$(testoptnoval $1)
if [ $rep1 -eq 1 ]; then
if [ "$2" = "" ]; then
echo "pb avec option $1 : pas de valeur"
exit 1
else
rep1=$(testoptval $2)
rep2=$(testoptnoval $2)
if [ $rep1 -eq 0 ] && [ $rep2 -eq 0 ]; then
lstoptval="${lstoptval}$1 $2 "
shift;shift
else
echo "pb avec option $1 : $2 n'est pas une valeur"
exit 1
fi
fi
elif [ $rep2 -eq 1 ]; then
lstoptnoval="${lstoptnoval}$1 "
shift
else
lstother="${lstother}$1 "
shift
fi
done
echo "options valeur : $lstoptval"
echo "options sans valeur : $lstoptnoval"
echo "autres : $lstother"
Exercice 1 : création du projet
* Dans votre home directory NFS, créez un répertoire systeme/projet.
* Dans systeme/projet créez les répertoires : src, bin, lib, include.
* Allez dans src.
* Créez un répertoire tools.
* Dans tools créez les fichiers (cliquez sur les liens pour avoir les sources) : pile.h, pile.c.
* Dans src créez les fichiers (cliquez sur les liens pour avoir les sources) : main.c, eval.h, eval.c
Exercice 2 : réalisation du makefile de tools
* Dans tools, créez un makefile nommé Makefile qui permet de compiler les sources de tools, en utilisant des règles explicites.
* Ce makefile contient :
o une cible all qui permet de construire une bibliothèque statique libtools.a composée des fichiers C compilés (Remarque : dans cet exercice, il n'y a que pile.o mais il faut faire un Makefile qui permette d'ajouter facilement d'autres fichiers).
o une cible install qui permet de copier la bibliothèque dans lib et les fichiers .h dans le répertoire include.
o une cible clean qui efface les .o, la bibliothèque dans le répertoire courant et lib, et les .h concernés dans include.
* Rappel : pour rassembler des objets en une bibliothèque statique, on utilise la commande ar (cf. man ar).
Exercice 3 : réalisation du makefile de src
* Dans src, créez un makefile nommé Makefile qui permet de compiler les sources de src, en utilisant des règles implicites.
* Ce makefile contient :
o une cible all qui permet de construire l'exécutable composé de main.o eval.o et de libtools.a.
o une cible install qui permet de copier l'exécutable dans bin, et les .h dans include.
o une cible clean qui efface les .o, l'exécutable dans le répertoire courant et bin, et les .h concernés dans include.
* Attention : ce makefile doit provoquer l'appel au makefile de tools pour éventuellement construire la bibliothèque.
Exercice 4 : réalisation du makefile de projet
* Dans projet, créez un makefile nommé Makefile, qui contient :
o une cible all qui permet de construire l'exécutable en appelant le makefile de src.
o une cible archive qui permet d'archiver dans un .tar l'arborescence, avec uniquement les makefile, les .c et .h.
o une cible clean qui efface l'exécutable et la bibliothèque dans bin et lib, et qui appelle le makefile de src pour effacer les .o
Exercice 5 : travail sur les sources
* Allez dans src.
* Dans eval.c, modifiez le message final en anglais par un message en français.
* Dans main.c, modifiez le message d'erreur en anglais par un message en français.
* Relancez le makefile de projet pour voir quelles actions fait make (recompilation, édition de liens, ...)
Exercice 6 : développement de fonctions supplémentaires au projet
* On veut ajouter la possiblité de faire une factorielle en plus des opérations de bases.
* Dans src, créez un répertoire math.
* Dans math créez les fichiers (cliquez sur les liens pour avoir les sources) : ops.h, ops.c, opserr.c.
* Créez un makefile dans math qui contient :
o une cible all qui construit une bibliothèque partagée libmath.so et une bibliothèque statique libmath.a à partir de ops.o et opserr.o.
o une cible install qui copie les bibliothèques dans lib et le .h dans include.
o une cible clean qui efface les .o, les bibliothèques dans le répertoire courant et lib, et le .h concerné dans include.
Exercice 7 : Modification des source et des makefile
* Dans eval.c ajoutez après le dernier else if :
else if (expr[i][0] == '!') {
ret1 = depiler(p,&op1);
if (ret1 == 1) empiler(p,fact(op1));
}
* Dans main.c, remplacez
char *defExpr[9] = {"4","12","34","56","+","*","5","-","/"}; par
char *defExpr[10] = {"4","!","12","34","56","+","*","5","-","/"}; et mettez argc = 10;
* Modifiez le makefile de projet, notamment les cibles archive et clean, pour prendre en compte les nouvelles sources.
* Ajoutez à ce makefile les cibles static et dynamic qui permettent respectivement d'obtenir un exécutable statique utilisant libmath.a ou dynamique utilisant libmath.so.
* Modifiez le makefile de src pour que l'exécutable soit construit avec la bonne bibliothèque en fonction de la cible choisie. Si elle n'existe pas, le makefile doit appeler celui de math pour la construire.
* Retournez dans projet et vérifiez que les commandes make static et make dynamic fonctionnent correctement.
* Essayez de lancer l'exécutable dynamique : ça ne marche pas ! Vous obtenez le message d'erreur suivant :
error while loading shared libraries: libmath.so: cannot open shared object file: No such file or directory
* Modifiez LD_LIBRARY_PATH pour que ça marche.
Pour ceux qui ont fini en avance :
Exercice 8 : production paramétrée d'une configuration du projet
* Dans la racine du projet, créez un fichier defs.inc.in (cliquez sur les liens pour avoir les sources) : defs.inc.in
* Ce fichier est un prototype qui va être modifié avec sed pour produire le véritable defs.inc.
* Ecrire un script configure qui prend comme options :
o --root=chemin_root : chemin_root est le répertoire dans lequel bin, lib et include vont être par défaut.
o --bin=chemin_bin : chemin_bin est le répertoire dans lequel les binaires du projet vont être installés.
o --lib=chemin_lib : chemin_lib est le répertoire dans lequel les bibliothèques du projet vont être installées.
o --inc=chemin_inc : chemin_inc est le répertoire dans lequel les includes du projet vont être installés.
* Si les options ne sont pas présentes alors prendre les valeurs par défaut suivantes : chemin_root = $N/systeme/projet, chemin_bin = chemin_root/bin, chemin_lib = chemin_root/lib, chemin_inc = chemin_root/inc".
* Si les options sont présentes mais sont des chemins d'accès relatifs, il faut concaténer leur valeur avec chemin_root.
* le script commence par effacer defs.inc s'il existe.
* le script vérifie ensuite que les valeurs données correspondent bien à des répertoires existants. Sinon, il demande pour chaque à l'utilisateur s'il veut les créer. Si la création échoue, configure s'arrête.
* le script recherche dans defs.inc.in les chaînes @@BINDIR@@, @@LIBDIR@@, @@INCDIR@@ pour les remplacer avec sed par les valeurs par défaut ou données en paramètre. Le résultat est mis dans le fichier defs.inc.
Exercice 9 : utilisation de la configuration paramétrée
* Modifiez tous les makefile existants du projet, notamment pour qu'ils incluent le fichier defs.inc (instruction include).
* Vérifiez que tout fonctionne encore correctement.
Exercice 2 : réalisation du makefile de tools
OBJ = pile.o
libname = libtools.a
all : lib
lib : $(libname)
$(libname) : $(OBJ)
ar r $(libname) $(OBJ)
pile.o : pile.c pile.h
gcc -c pile.c
install :
cp $(libname) ../../lib
cp pile.h ../../include
clean :
rm -f $(libname)
rm -f $(OBJ)
clean-install :
rm -f ../../lib/$(libname)
rm -f ../../include/pile.h
Comme on peut le constater en ligne 23, la solution comporte une cible supplémentaire qui permet de "désinstaller" les includes et la bibliothèque.
Exercice 3 : réalisation du makefile de src
OBJ := main.o eval.o
LIBNAME := tools
LIBPATH := ./tools
LIBS := -L$(LIBPATH) -l$(LIBNAME)
exename := proj
all : lib exe
lib :
cd $(LIBPATH); make
exe : $(exename)
$(exename) : $(OBJ)
gcc -o $@ $^ $(LIBS)
install :
cd tools; make install
cp $(exename) ../bin
cp eval.h ../include
clean :
cd tools; make clean
rm -f $(exename)
rm -f $(OBJ)
clean-install :
rm -f ../bin/$(exename)
rm -f ../include/eval.h
Remarque : contrairement au TD où c'est le makefile de projet qui appelle celui de tools, c'est cette fois celui de src. En fait, les deux solutions sont à peu près équivalentes, cependant, comme dans le TP, le répertoire tools est inclus dans src, il est plus logique que ce soit le makefile ci-dessus qui appelle celui de tools (cf. ligne 16).
Exercice 4 : réalisation du makefile de projet
archname := projet.tar
all : exe
exe :
cd src; make
archive :
tar cvf $(archname) --no-recursion ../projet \
../projet/src ../projet/src/tools ../projet/bin \
../projet/lib ../projet/include
tar rvf $(archname) ../projet/Makefile ../projet/src/*.c \
../projet/src/*.h ../projet/src/Makefile \
../projet/src/tools/*.c ../projet/src/tools/*.h \
../projet/src/tools/Makefile
clean :
cd src; make clean
rm -f $(archname)
Remarque : ce Makefile n'est absolument pas paramétré puisqu'il n'utilise quasi aucune variable. Ce point est abrodé dans la question 8.
Exercice 6 : développement de fonctions supplémentaires au projet
OBJ := ops.o opserr.o
LIBNAME := math
DYNNAME := lib$(LIBNAME).so
STATNAME := lib$(LIBNAME).a
all : dyn stat
dyn : $(DYNNAME)
stat : $(STATNAME)
$(SYNNAME) : $(OBJ)
gcc -shared -o $@ $^
$(STATNAME) : $(OBJ)
ar r $@ $^
install :
cp $(DYNNAME) ../../lib
cp $(STATNAME) ../../lib
cp ops.h ../../include
clean :
rm -f $(OBJ)
rm -f $(DYNNAME)
rm -f $(STATNAME)
clean-install :
rm -f ../../lib/$(DYNNAME)
rm -f ../../lib/$(STATNAME)
rm -f ../../include/ops.h
Exercice 7 : Modification des source et des makefile
* Modifiez le makefile de projet, notamment les cibles archive et clean, pour prendre en compte les nouvelles sources.
* Ajoutez à ce makefile les cibles static et dynamic qui permettent respectivement d'obtenir un exécutable statique utilisant libmath.a ou dynamique utilisant libmath.so.
archname := projet.tar
all : exe
exe : dynamic
static :
cd src; make static
dynamic :
cd src; make dynamic
archive :
tar cvf $(archname) --no-recursion ../projet \
../projet/src ../projet/src/tools ../projet/src/math \
../projet/bin ../projet/lib ../projet/include
tar rvf $(archname) ../projet/Makefile ../projet/src/*.c \
../projet/src/*.h ../projet/src/Makefile \
../projet/src/tools/*.c ../projet/src/tools/*.h \
../projet/src/tools/Makefile \
../projet/src/math/*.c ../projet/src/math/*.h \
../projet/src/math/Makefile
clean :
cd src; make clean
rm -f $(archname)
* Modifiez le makefile de src pour que l'exécutable soit construit avec la bonne bibliothèque en fonction de la cible choisie. Si elle n'existe pas, le makefile doit appeler celui de math pour la construire.
OBJ := main.o eval.o
LIBS := -L./tools -ltools -L./math -lmath
exename := proj
dynamic : lib exedyn
static : lib exestat
lib :
cd tools; make
cd math; make
exedyn : $(OBJ)
gcc -o $(exename) $^ $(LIBS)
exestat : $(OBJ)
gcc -static -o $(exename) $^ $(LIBS)
install :
cd tools; make install
cd math; make install
cp $(exename) ../bin
cp eval.h ../include
clean :
cd tools; make clean
cd math; make clean
rm -f $(exename)
rm -f $(OBJ)
clean-install :
rm -f ../bin/$(exename)
rm -f ../include/eval.h
Exercice 9 : utilisation de la configuration paramétrée
* Modifiez tous les makefile existants du projet, notamment pour qu'ils incluent le fichier defs.inc (instruction include), contenant les variables globales au projet.
defs.inc :
rootdir := @@ROOTDIR@@
rootname := @@ROOTNAME@@
bindir := @@BININSTAL@@
libdir := @@LIBINSTALL@@
incdir := @@INCINSTALL @@
srcdir := $(rootdir)/src
toolsdir := $(srcdir)/tools
mathdir := $(srcdir)/math
exename := proj
mathname := math
mathdyn := lib$(mathname).so
mathstat := lib$(mathname).a
toolsname := tools
toolsstat := lib$(toolsname).a
archname := projet.tar
Makefile de projet :
include defs.inc
all : exe
exe :
cd src; make
archive :
cd $(srcdir); make clean; cd $(rootdir); cd ..; \
tar cvf $(archname) $(rootname)
clean :
cd src; make clean
rm -f $(archname)
Makefile de src :
include ../defs.inc
OBJ := main.o eval.o
LIBS := -L$(toolsdir) -l$(toolsname) -L$(mathdir) -l$(mathname)
all : lib exe
lib :
cd $(toolsdir); make
cd $(mathdir); make
exe : $(exename)
$(exename) : $(OBJ)
gcc $(LINKMODE) -o $(exename) $^ $(LIBS)
install :
cd $(toolsdir); make install
cd $(mathdir); make install
cp $(exename) $(bindir)
cp eval.h $(incdir)
clean :
cd $(toolsdir); make clean
cd $(mathdir); make clean
rm -f $(exename)
rm -f $(OBJ)
clean-install :
rm -f $(bindir)/$(exename)
rm -f $(incdir)/eval.h
Makefile de tools :
include ../../defs.inc
OBJ := pile.o
all : $(toolsstat)
$(toolsstat) : $(OBJ)
ar r $(toolsstat) $(OBJ)
install :
cp $(toolsstat) $(libdir)
cp pile.h $(incdir)
clean :
rm -f $(toolsstat)
rm -f $(OBJ)
clean-install :
rm -f $(libdir)/$(toolsstat)
rm -f $(incdir)/pile.h
Makefile de math :
include ../../defs.inc
OBJ := ops.o opserr.o
all : dyn stat
dyn : $(mathdyn)
stat : $(mathstat)
$(mathdyn) : $(OBJ)
gcc -shared -o $@ $^
$(mathstat) : $(OBJ)
ar r $@ $^
install :
cp $(mathdyn) $(libdir)
cp $(mathstat) $(libdir)
cp ops.h $(incdir)
clean :
rm -f $(OBJ)
rm -f $(mathdyn)
rm -f $(mathstat)
clean-sintall :
rm -f $(libdir)/$(mathdyn)
rm -f $(libdir)/$(mathstat)
rm -f $(incdir)/eval.h
3°/ Cas pratique
3.1°/ hypothèses.
On dispose d'un projet dont la racine est le répertoire proj.
* Dans proj, il existe 3 répertoires : src, lib, bin.
* src contient un sous répertoire libliste.
* bin et lib sont les répertoires d'installation par défaut de l'exécutable et des bibliothèques produits.
* Dans src se trouvent les fichiers main.c, gestion.c, gestion.h.
* Dans libliste se trouvent les fichiers tools.c, tools.h, liste.c, liste.h, defs.h.
* inclusions :
o main.c inclut libliste/defs.h
o gestion.c inclut gestion.h
o tools.c inclut defs.h et tools.h
o liste.c inclut defs.h et liste.h
* L'objectif est double :
o construire les bibliothèques libliste.a et libliste.so, à partir des sources de libliste.
o construire un exécutable, à partir des sources de src et de libliste.so.
* On peut également ajouter deux objectifs secondaires :
o une cible abstraite install qui permet de copier l'exécutable et les bibliothèque dans les répertoire d'installation,
o une cible abstraite clean qui permet d'effacer les fichiers créés.
3.3°/ Version basique
* un seul makefile est créé, se trouvant dans le répertoire src
EXENAME := monexe
LIBDIR := libliste
LIBDYN := $(LIBDIR)/libliste.so
LIBSTAT := $(LIBDIR)/libliste.a
OBJMAIN := main.o gestion.o
OBJLIB := $(LIBDIR)/tools.o $(LIBDIR)/liste.o
all : lib exe
lib : $(LIBDYN) $(LIBSTAT)
exe : $(EXENAME)
$(LIBDYN) : $(OBJLIB)
gcc -shared $^ -o $@
$(LIBSTAT) : $(OBJLIB)
ar r $@ $^
$(EXENAME) : $(OBJMAIN) $(LIBDYN)
gcc $^ -o $@
main.o : main.c $(LIBDIR)/defs.h
gcc -c $<
gestion.o : gestion.c gestion.h
gcc -c $<
$(LIBDIR)/tools.o : $(LIBDIR)/tools.c $(LIBDIR)/tools.h $(LIBDIR)/defs.h
gcc -c $< -o $@
$(LIBDIR)/liste.o : $(LIBDIR)/liste.c $(LIBDIR)/liste.h $(LIBDIR)/defs.h
gcc -c $< -o $@
install :
cp $(EXENAME) ../bin
cp $(LIBDYN) ../lib
cp $(LIBSTAT) ../lib
clean :
rm $(OBJMAIN) $(OBJLIB)
rm $(EXENAME)
rm $(LIBDYN) $(LIBSTAT)
3.4°/ Version "règles implicites"
* un seul makefile est créé, se trouvant dans le répertoire src
EXENAME := monexe
LIBDIR := libliste
LIBDYN := $(LIBDIR)/libliste.so
LIBSTAT := $(LIBDIR)/libliste.a
OBJMAIN := main.o gestion.o
OBJLIB := $(LIBDIR)/tools.o $(LIBDIR)/liste.o
all : lib exe
lib : $(LIBDYN) $(LIBSTAT)
exe : $(EXENAME)
$(LIBDYN) : $(OBJLIB)
gcc -shared $^ -o $@
$(LIBSTAT) : $(OBJLIB)
ar r $@ $^
$(EXENAME) : $(OBJMAIN) $(LIBDYN)
gcc $^ -o $@
install :
cp $(EXENAME) ../bin
cp $(LIBDYN) ../lib
cp $(LIBSTAT) ../lib
clean :
rm $(OBJMAIN) $(OBJLIB)
rm $(EXENAME)
rm $(LIBDYN) $(LIBSTAT)
$(LIBDIR)/%.o : $(LIBDIR)/%.c
$(CC) $(CFLAGS) -c $< -o $@
3.5°/ Version multi-makefile
make.inc contient :
ROOTDIR := /home/toto/proj
SRCDIR := $(ROOTDIR)/src
LIBDIR := $(SRCDIR)/libliste
INSTALLDIR := /home/toto/proj
BININST := $(INSTALLDIR)/bin
LIBINST := $(INSTALLDIR)/lib
EXENAME := monexe
LIBNAME := liste
LIBDYN := lib$(LIBNAME).so
LIBSTAT := lib$(LIBNAME).a
makefile de projet contient :
include make.inc
all : lib exe
lib :
cd $(LIBDIR); make
exe :
cd $(SRCDIR); make
install :
cd $(LIBDIR); make install
cd $(SRCDIR); make install
clean :
cd $(LIBDIR); make clean
cd $(SRCDIR); make clean
makefile de src contient :
include ../make.inc
OBJ := main.o gestion.o
LIBS := -L$(LIBDIR) -lliste
all : $(EXENAME)
$(EXENAME) : $(OBJ)
gcc $^ $(LIBS) -o $@
install :
cp $(EXENAME) $(BININST)
clean :
rm -f $(OBJ) $(EXENAME)
makefile de libliste contient :
include ../../make.inc
OBJ := tools.o liste.o
all : $(LIBDYN) $(LIBSTAT)
$(LIBDYN) : $(OBJ)
gcc -shared $^ -o $@
$(LIBSTAT) : $(OBJ)
ar r $@ $^
install :
cp $(LIBDYN) $(LIBINST)
cp $(LIBSTAT) $(LIBINST)
clean :
rm -f $(OBJ) $(LIBDYN) $(LIBSTAT) 3.6°/ Paramétrisation de make.inc
* make.inc.base contient :
ROOTDIR := @@ROOT@@
SRCDIR := $(ROOTDIR)/src
LIBDIR := $(SRCDIR)/libliste
INSTALLDIR := @@INSTALL@@
BININST := $(INSTALLDIR)/bin
LIBINST := $(INSTALLDIR)/lib
EXENAME := monexe
LIBNAME := liste
LIBDYN := lib$(LIBNAME).so
LIBSTAT := lib$(LIBNAME).a
* script configure contient :
root=$(pwd)
inst=$root
while [ .$1 != . ]; do
case $1 in
-root=*) root=$(echo $1 | sed 's!.*=!!')
shift;;
-install=*) inst=$(echo $1 | sed 's!.*=!!')
shift;;
*) shift;;
esac
done
sed "s!@@ROOT@@!$root!" make.inc.base > /tmp/mk.1
sed "s!@@INSTALL@@!$inst!" /tmp/mk.1 > make.inc
rm /tmp/mk.1
vous vous moquez de
MOIIIIIIIIIIIII!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!