Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Makefile

24 réponses
Avatar
fabrizio
Bonjour,

Je ne parviens pas à trouver de solution en terme de Makefile pour faire
la chose suivante : dans le code, une certain nombre de conditions de
précompilation permet de gérer des petites différences entre une version
verbeuse de développement et une version de production. Je voudrais au
final obtenir quelque chose du genre :
- make prod : génère la version de production ;
- make verbose : génère la version verbeuse.

Tout cela est conditionné par des define géré à la ligne de compilation :
gcc -DDEVEL -DVERBOSE ...
gcc -DPROD ...

Pour l'instant, au mieux j'utilise une condition dans le Makefile. Ce
qui m'oblige à aller modifier ledit Makefile pour changer de version.
DEBUG=yes
ifeq ($(DEBUG),yes)
CFLAGS=...
else
CFLAGS=...

Impossible de transcrire cette idée (somme toute assez basique) dans un
Makefile. N'auriez-vous pas une idée qui me permette de m'en sortir ?

Toute idée sera la bienvenue,
F.

10 réponses

1 2 3
Avatar
Marc Boyer
On 2007-10-15, fabrizio wrote:
15/10/2007 15:41 - Marc Boyer :
Je peux te file la doc Make que je donne à mes étudiants. J'y
fait cette manip.


Ça ne peut pas me faire de mal. Je prends et t'en remercie.


Si tu me donnes une adresse mail valide, sans pb.

Marc Boyer
--
Si tu peux supporter d'entendre tes paroles
Travesties par des gueux pour exciter des sots
IF -- Rudyard Kipling (Trad. André Maurois)


Avatar
Olivier Miakinen
Le 15/10/2007 15:55, Marc Boyer répondait à fabrizio :

Si tu me donnes une adresse mail valide, sans pb.


Et si ton adresse n'est pas valide, fabrizio, tu devrais la suffixer
par le nom de domaine réservé INVALID :
fabrizio

Avatar
fabrizio
15/10/2007 16:04 - Olivier Miakinen :
Et si ton adresse n'est pas valide, fabrizio, tu devrais la suffixer
par le nom de domaine réservé INVALID :
fabrizio


Voilà qui est fait.

Avatar
fabrizio
15/10/2007 15:37 - Matthieu Moy :
debug:
$(MAKE) DEBUG=yes all

all:
...


Après test, cette solution me va très bien. Je vous remercie tous.

F.

Avatar
Paul Gaborit
À (at) Mon, 15 Oct 2007 13:39:01 +0000 (UTC),
Marc Boyer écrivait (wrote):
Tout cela est conditionné par des define géré à la ligne de compilation :
gcc -DDEVEL -DVERBOSE ...
gcc -DPROD ...


Tu ajoutes deux règles (prod: et verbose:) qui rappellent le make via
$(MAKE) avec des paramètres qui te permettent de positionner les
$(CFLAGS) etc. (voire directement avec les valeurs de ces variables).
Si c'est GNU make, la doc a une section là-dessus ("Recursive
use of make", de mémoire).


Le problème de ça, c'est qu'on risque de lier des .o en version
debug avec de .o en version prod.
A moins bien sur de faire systématiquement le 'clean' qui va
bien entre...


A priori, dans cette situation, je préfère la solution de Marc : deux
arborescences de compilation séparées (utilisant les même sources),
l'une pour la version de test et l'autre pour la version de prod.

Mais on peut aussi faire avec une seule. Mais le changement (prod <=>
test) nécessite de tout recompiler. Pour garantir cela, il faut
utiliser un fichier dont dépendent toutes les compilations et le
'toucher' à chaque fois qu'on change. Je ferai donc deux fichiers
d'options (un pour prod et un pour test) :

---- Make-TEST --------------
#+++ Pour version de TEST +++
CFLAGS=-g -DDEBUG -DVERBOSE ...

Make-TEST: Make-PROD
touch Make-TEST
-----------------------------

---- Make-PROD --------------
#+++ Pour version de PROD +++
CFLAGS=-DPROD ...

Make-PROD: Make-TEST
touch Make-PROD
-----------------------------

Le Makefile principale inclura celui qu'il faut selon l'option qu'on
lui passe (par défaut TEST) :


----- Makefile ------------------

VERS=TEST

include Make-${VERS}

%.o: %.c Make-${VERS}
gcc -c ${CFLAGS} -o $@ $<
---------------------------------

Toutes les règles de compilation doivent dépendre de Make-${VERS} pour
garantir la (re)compilation à chaque fois qu'on change.

Et on appelle soit par :

make VERS='TEST'
ou
make

soit par :

make VERS='PROD'

Avec un truc comme ça, ça doit marcher...

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>



Avatar
Olivier Miakinen

Et si ton adresse n'est pas valide, fabrizio, tu devrais la suffixer
par le nom de domaine réservé INVALID :
fabrizio


Voilà qui est fait.


Merci beaucoup !


Avatar
Marc Boyer
On 2007-10-15, Paul Gaborit wrote:
A priori, dans cette situation, je préfère la solution de Marc : deux
arborescences de compilation séparées (utilisant les même sources),
l'une pour la version de test et l'autre pour la version de prod.


Oui, ça me semble même la solution la plus classique.

Mais on peut aussi faire avec une seule. Mais le changement (prod <=>
test) nécessite de tout recompiler. Pour garantir cela, il faut
utiliser un fichier dont dépendent toutes les compilations et le
'toucher' à chaque fois qu'on change. Je ferai donc deux fichiers
d'options (un pour prod et un pour test) :

---- Make-TEST --------------
#+++ Pour version de TEST +++
CFLAGS=-g -DDEBUG -DVERBOSE ...

Make-TEST: Make-PROD
touch Make-TEST


Et là, je rajouterais le
make -f Make-PROD clean
histoire de pas avoir les .o de test et les .o de prod qui
se mélangent.

Toutes les règles de compilation doivent dépendre de Make-${VERS} pour
garantir la (re)compilation à chaque fois qu'on change.


Je préfère la version avec clean. Non ?

M'enfin bon, c'est beaucoup d'emmerdes pour éviter les deux
répertoires...

Marc Boyer
--
Si tu peux supporter d'entendre tes paroles
Travesties par des gueux pour exciter des sots
IF -- Rudyard Kipling (Trad. André Maurois)

Avatar
Paul Gaborit
À (at) Tue, 16 Oct 2007 08:29:17 +0000 (UTC),
Marc Boyer écrivait (wrote):
On 2007-10-15, Paul Gaborit wrote:
Mais on peut aussi faire avec une seule. Mais le changement (prod <=>
test) nécessite de tout recompiler. Pour garantir cela, il faut
utiliser un fichier dont dépendent toutes les compilations et le
'toucher' à chaque fois qu'on change. Je ferai donc deux fichiers
d'options (un pour prod et un pour test) :

---- Make-TEST --------------
#+++ Pour version de TEST +++
CFLAGS=-g -DDEBUG -DVERBOSE ...

Make-TEST: Make-PROD
touch Make-TEST


Et là, je rajouterais le
make -f Make-PROD clean
histoire de pas avoir les .o de test et les .o de prod qui
se mélangent.

Toutes les règles de compilation doivent dépendre de Make-${VERS} pour
garantir la (re)compilation à chaque fois qu'on change.


Je préfère la version avec clean. Non ?


L'intérêt de la dépendance supplémentaire est de pouvoir gérer les
choses plus finement. On peut imaginer que la production de certains
fichiers sont indépendantes de l'aspect TEST/PROD. Et puis, même si on
oublie le 'clean', ça marchera.

M'enfin bon, c'est beaucoup d'emmerdes pour éviter les deux
répertoires...


Oui... ;-)

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>


Avatar
Matthieu Moy
Paul Gaborit writes:

L'intérêt de la dépendance supplémentaire est de pouvoir gérer les
choses plus finement. On peut imaginer que la production de certains
fichiers sont indépendantes de l'aspect TEST/PROD. Et puis, même si on
oublie le 'clean', ça marchera.


Au passage, si on en est à ajouter des dépendances, une solution est
d'avoir un fichier config.h qui contienne, ou ne contienne pas
#define DEBUG, en remplacement du -DDEBUG.

Si le Makefile est bien foutu, il prendra en compte la dépendance, et
y'aura qu'à modifier le fichier et à faire "make" pour changer de
mode. Bien sûr, ça, c'est si on ne compte pas avoir deux builds
séparés en parallèle pour les deux modes (i.e. si on est pret à payer
le prix d'une recompilation complete à chaque changement).

--
Matthieu

Avatar
James Kanze
On Oct 15, 2:33 pm, Marc Boyer
wrote:
On 2007-10-15, fabrizio wrote:
Je ne parviens pas à trouver de solution en terme de
Makefile pour faire la chose suivante : dans le code, une
certain nombre de conditions de précompilation permet de
gérer des petites différences entre une version verbeuse de
développement et une version de production. Je voudrais au
final obtenir quelque chose du genre :
- make prod : génère la version de production ;
- make verbose : génère la version verbeuse.

Tout cela est conditionné par des define géré à la ligne de com pilation :
gcc -DDEVEL -DVERBOSE ...
gcc -DPROD ...

Pour l'instant, au mieux j'utilise une condition dans le Makefile. Ce
qui m'oblige à aller modifier ledit Makefile pour changer de version.
DEBUG=yes
ifeq ($(DEBUG),yes)
CFLAGS=...
else
CFLAGS=...

Impossible de transcrire cette idée (somme toute assez
basique) dans un Makefile. N'auriez-vous pas une idée qui me
permette de m'en sortir ?


Facile à faire dans deux rep distinct, ou avec des noms différents.

Avec des noms différents:
CFLAGS_PROD= -DPROD
CFLAGS_DEV= -DDEVEL -DVERBOSE
# .od = .o version debug
.SUFFIXES: .h .c .o .od

.c.od:
$(CC) $(CFLAGS_DEV) $*.c -o $*.od
.c.o:
$(CC) $(CFLAGS_PROD) $*.c -o $*.o


À mon avis, il vaut mieux garder les noms des objets en .o, et
maintenir les .o dans des répertoires différents. Avec GNU make,
on put bien faire quelque chose comme :

prod/%.o : %.c
$(CC) $(CFLAGS_PROD) ...

dev/%.o : %.c
$(CC) $(CFLAGS_DEV) ...

Mais c'est une extension de GNU make, je crois. (En revanche,
étant donné qu'il n'y a pas de norme pour make, et qu'ils
varient de toute façon, autant faire se standardiser sur GNU
make. C'est un problème de portabilité en moins.)

--
James Kanze (GABI Software) email:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


1 2 3