Règle pour Makefile

Le
Thomas Nemeth
Bonjour,

Je compile habituellement mes propres programmes grâce à un
système de build fait maison basé, bien évidemment, sur make
(grosso-modo : un fichier spécifique au projet, inclu dans
un Makefile générique).

Pour mes projets, j'ai un fichier "version.c" qui contient
la chaîne de description de la version du projet (comme son
nom l'indique) et qui est recompilé à chaque fois que je
lance une compilation (générant une chaîne de la forme
"X.Y.Z-B", avec B le numéro de build).

Pour l'instant, la règle pour (gnu-)make que j'utilise est
la suivante :

8<
version.o: FORCE

FORCE:
8<


Cependant j'aurais aimé faire en sorte que version.c ne soit
pas recompilé à chaque fois que je lance "make" mais à chaque
fois qu'au moins 1 fichier du projet est compilé

Y a-t-il un moyen simple de faire ça ?


Merci d'avance.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Matthieu Moy
Le #6626121
Thomas Nemeth
Cependant j'aurais aimé faire en sorte que version.c ne soit
pas recompilé à chaque fois que je lance "make" mais à chaque
fois qu'au moins 1 fichier du projet est compilé...

Y a-t-il un moyen simple de faire ça ?


J'en vois au moins un :

executable: $(OBJS)
XXX > version.c
gcc -c version.c
gcc $(OBJS) version.o -o $@

mais je trouve pas ça très beau.

Ce qui est souvent fait dans ces cas là, c'est de dissocier la
configuration de la compilation : on a une commande qui génère un
Makefile ou un fichier de config du Makefile (le ./configure de
beaucoup de logiciels), et on regarde le numéro de version à ce moment
là. Ensuite, "make" ne s'en soucie plus.

--
Matthieu

Thomas Nemeth
Le #6631561
Matthieu Moy a tapoté :

Thomas Nemeth
Cependant j'aurais aimé faire en sorte que version.c ne soit
pas recompilé à chaque fois que je lance "make" mais à chaque
fois qu'au moins 1 fichier du projet est compilé...

Y a-t-il un moyen simple de faire ça ?


J'en vois au moins un :

executable: $(OBJS)
XXX > version.c
gcc -c version.c
gcc $(OBJS) version.o -o $@

mais je trouve pas ça très beau.


Moi non plus :)
Déjà le XXX n'est pas nécessaire : le fichier n'a pas vocation à
être généré automatiquement. Il ne contient que, grosso-modo :

#include "config.h"
#define INFO PROGRAM" version "VERSION", build "BUILD".n"
char * version_get_info(void)
{
return INFO;
}

Sachant que BUILD est passé en paramètre lors du make (-DBUILD=XXX)

D'autre part, version.c existant au préalable, mon makefile a déjà
une règle le compilant :

SRCS = $(shell ls *.c)
OBJS = $(SRCS:%.c=%.o)
[...]
%.o: %.c
$(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $<




Ce qui est souvent fait dans ces cas là, c'est de dissocier la
configuration de la compilation : on a une commande qui génère un
Makefile ou un fichier de config du Makefile (le ./configure de
beaucoup de logiciels), et on regarde le numéro de version à ce moment
là. Ensuite, "make" ne s'en soucie plus.


Dans mon cas, ce n'est nullement de la configuration mais un système
de mise-à-jour automatique du numéro de build. En l'occurence, un
système à double commande (genre un ./build qui ferait appel à make)
ferait les commandes suivantes :
if make -n | grep -qv version. ; then
make
fi

Mais bon, j'aurais préféré gérer ça directement dans le makefile :
je ne souhaite pas avoir une pléthore de fichiers spécifique au
système de build dans mes projets :)


Thomas.


Damien Wyart
Le #6632361
* Thomas Nemeth
Pour l'instant, la règle pour (gnu-)make que j'utilise est
la suivante :

---8<------------------------------
version.o: FORCE

FORCE:
---8<------------------------------

Cependant j'aurais aimé faire en sorte que version.c ne soit
pas recompilé à chaque fois que je lance "make" mais à chaque
fois qu'au moins 1 fichier du projet est compilé...


Peut-être un fichier annexe servant de "timestamp" et mis à jour avec
touch dès qu'un fichier du projet est compilé ? Et ensuite, un prérequis
sur ce fichier pour version.o, donc une compilation seulement quand le
timestamp est plus récent que version.o. Comme il n'y a pas tout le
Makefile, peut-être que je rate quelque chose et que ce système se
mordra la queue...

--
DW

Matthieu Moy
Le #6634191
Thomas Nemeth
D'autre part, version.c existant au préalable, mon makefile a déjà
une règle le compilant :

SRCS = $(shell ls *.c)
OBJS = $(SRCS:%.c=%.o)
[...]
%.o: %.c
$(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $<


donc, en repartant de ma solution, tu peux faire un truc genre

version.o: FORCE

executable: $(OBJS)
$(MAKE) version.o
gcc $(OBJS) version.o -o ...

Si version.o n'est pas dans $(OBJS).

--
Matthieu

Publicité
Poster une réponse
Anonyme