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

Règle pour Makefile

4 réponses
Avatar
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.

4 réponses

Avatar
Matthieu Moy
Thomas Nemeth writes:

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

Avatar
Thomas Nemeth
Matthieu Moy a tapoté :

Thomas Nemeth writes:

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.


Avatar
Damien Wyart
* Thomas Nemeth in fr.comp.os.unix:
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

Avatar
Matthieu Moy
Thomas Nemeth writes:

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