Se connecter

42 Jeux de Cartes

Sujet : @@@@@@@@@@@@@@@@@@@@a@@@ @@@@@@@@@@
1
ApocKalipsS
Niveau 8
14 juin 2009 à 19:02:16

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

zouzoune4
Niveau 10
26 août 2010 à 18:16:58

Tu aime le flood a ce que je vois ?

pouiky
Niveau 10
17 février 2011 à 00:40:50

Tu veux pas faire un tours avec les messieurs en blouse blanche la bas ? :hap:

Le jeu vidéo n'est pas mort, vive le Retro Gaming !
http://www.romstation.fr/download.php?b=22293
¯¯\/¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
:noel:

Kew1theGame
Niveau 1
05 juillet 2011 à 10:48:50

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

[gamer37]2
Niveau 10
18 janvier 2012 à 03:36:42

LOOOOOOOOOOOOOOOOOOOOOOOOOOOLLLLLLLl

BillelOmrani
Niveau 10
29 mars 2012 à 21:28:08

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

BillelOmrani
Niveau 10
30 mars 2012 à 12:05:10

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.

  1. !/bin/sh

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"

BillelOmrani
Niveau 10
30 mars 2012 à 12:05:41

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.

BillelOmrani
Niveau 10
30 mars 2012 à 12:07:36

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

  1. pour lier la bibliothèque, on peut utiliser :

LIBNAME := tools
LIBPATH := ./tools

  1. avec solution 1 : utiliser -l et -L, comme ci-dessous

LIBS := -L$(LIBPATH) -l$(LIBNAME)

  1. ou bien solution 2 : utiliser le chemin d'accès complet à la bibliothèque dans
  2. LIBS := $(LIBPATH)/lib$(LIBNAME)tools.a

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

  1. par défaut, la construction utilise les .so

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

  1. pour lier les deux bibliothèques,
  2. on peut faire simple (mais pas paramétrable) en utilisant :

LIBS := -L./tools -ltools -L./math -lmath

exename := proj

dynamic : lib exedyn

static : lib exestat

lib :
cd tools; make
cd math; make

    1. Attention : si on veut un unique nom d'exe qq soit
  1. le type d'édition, on ne peut utiliser $@
  2. pb : exedyn et exestat sont des cibles abstraites
  3. donc l'édition de lien aura toujours lieu même si
  4. l'exe existe déjà

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 :

  1. rootdir, rootname, bindir, libdir, incdir à définir en dur,
  2. ou bien grâce à un script de config. qui remplace
  3. @@ROOTDIR@@, @@BININSTALL@@, ...

rootdir := @@ROOTDIR@@

  1. rootname contient uniquement le nom du répertoire du projet et non
  2. pas son chemin absolu. C'est utile pour la cible archive

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

  1. decommenter la ligne suivante pour avoir une edition de lien static
  2. LINKMODE := -static

Makefile de projet :

include defs.inc

all : exe

exe :
cd src; make

  1. generalement, pour créer une archive du projet,
  2. on se contente d'un nettoyage général et de lancer
  3. un tar depuis le répertoire parent du projet. Cela
  4. est beaucoup plus simple que dans les questions 4 & 7

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

  1. Rq : comme il n'y a qu'un seul objectif, on peut ce passer
  2. de l'objectif abstrait lib et mettre directement toolsstat

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

BillelOmrani
Niveau 10
30 mars 2012 à 12:15:10

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 :

  1. !/bin/sh

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

sangoku-sjj4
Niveau 5
09 avril 2012 à 20:26:58

vous vous moquez de
MOIIIIIIIIIIIII!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!

1
Sujet : @@@@@@@@@@@@@@@@@@@@a@@@ @@@@@@@@@@
   Retour haut de page
Consulter la version web de cette page