30

Zeph (./29) :
Oui, c'est ce que je viens de faire, mais du coup ça oblige à avoir des tonnes de ".d" partout alors que j'aurais pu avoir un "Makefile.deps" qui contienne l'ensemble des dépendances sad

J'aime pas les .d non plus, du coup j'utilise "-MF $(@D)/.$(@F).d" pour en faire des fichiers cachés, c'est moins moche.
Ça marche, mais je trouve dommage de ne pas pouvoir éviter de séparer les dépendances.

Dans mon cas je ne pourrais pas n'avoir qu'un seul fichier, parce que ça veut dire le regénérer complètement à chaque compilation, et donc reparser tous les fichiers sources. Il se peut que ça soit assez couteux, pour les projets qui contiennent beaucoup de fichiers. L'avantage avec les .d indépendants c'est que ça ne fait que le strict minimum à chaque fois.
So much code to write, so little time.

31

nitro (./30) :
J'aime pas les .d non plus, du coup j'utilise "-MF $(@D)/.$(@F).d" pour en faire des fichiers cachés, c'est moins moche.

Pas con smile (mais je suis sous Windows, donc pas possible non plus :/)
Dans mon cas je ne pourrais pas n'avoir qu'un seul fichier, parce que ça veut dire le regénérer complètement à chaque compilation, et donc reparser tous les fichiers sources. Il se peut que ça soit assez couteux, pour les projets qui contiennent beaucoup de fichiers. L'avantage avec les .d indépendants c'est que ça ne fait que le strict minimum à chaque fois.

Oui, je pensais ne pas le régénérer à chaque compilation ; les dépendances ne changent pas aussi souvent que les fichiers, du coup ça ne me gêne pas de devoir les créer à la main (avec une règle "depends" par exemple) si ça permet de les conserver dans un seul dossier.

Mais tant pis, faute de mieux je reste sur la solution des .d (non masqués sad).

[edit] Bon, finalement j'ai fait autrement : les .d et .o sont générés dans un dossier "obj" au même niveau que "src". Le makefile est obligé de créer des répertoires pour conserver la même arborescence, mais ça m'évite de pourrir "src" avec trop de fichiers temporaires.
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

32

Zeph (./31) :
Bon, finalement j'ai fait autrement : les .d et .o sont générés dans un dossier "obj" au même niveau que "src". Le makefile est obligé de créer des répertoires pour conserver la même arborescence, mais ça m'évite de pourrir "src" avec trop de fichiers temporaires.

Ah ouais pas mal, je pense que je vais faire comme ça aussi, car ça a un autre avantage, celui de pouvoir garder les fichiers intermédiaires de plusieurs architectures (en ayant plusieurs "obj") en parallèle.
So much code to write, so little time.

33

Bon, je fais des compilations, et j'ai quelques petites questions :

1.
Comment se fait-il que j'aie un warning (corrigé depuis) "la variable retournée peut ne pas être initialisée" en compilant en -O2, et pas sans ce switch ? Quel rapport ? J'utilise -W -Wall -Wextra -pedantic, pourquoi tout ça ne m'a pas averti ??


2.
Peut-on redéfinir une variable Makefile à partir d'elle-même ?
truc = $(truc) -machin

Il a pas l'air d'aimer sad J'ai même essayé en passant pas une tierce variable :
tmp = $(truc)
$truc = $(tmp) -machin
Il n'aime pas non plus. Il n'y a pas un trick ?


3.
Je n'ai pas réussi à mettre plus de une ligne à exécuter dans un if/else/endif. Là aussi, il n'y a pas un workaround ?


4.
Je fais un "echo" pour indiquer dans la sortie si on compile en DEBUG ou en RELEASE. Je mets ça dans la règle "all", évidemment ça l'affiche tout à la fin (et encore, si il y a quelque chose à faire).
Si je le mets dans la règle "%.o:", ça l'affiche après la compilation de chaque fichier. Ce n'est pas non plus ce que je veux, je voudrais l'afficher en tête du log.

Solution : ??? Rajouter une règle aux .cpp, qui fait l'echo et crée un fichier dont la présence indique de ne pas refaire l'echo ? J'ai même pas essayé, mais de toute façon c'est hyper crade.

Une solution ?


Merci pour tout. smile

34

Folco (./33) :
Comment se fait-il que j'aie un warning (corrigé depuis) "la variable retournée peut ne pas être initialisée" en compilant en -O2, et pas sans ce switch ? Quel rapport ? J'utilise -W -Wall -Wextra -pedantic, pourquoi tout ça ne m'a pas averti ??


En activant les optimisations, gcc effectue des analyses en plus, ce qui lui permet de faire plus de warnings.
Peut-on redéfinir une variable Makefile à partir d'elle-même ?truc = $(truc) -machin


truc += -machin
Je n'ai pas réussi à mettre plus de une ligne à exécuter dans un if/else/endif. Là aussi, il n'y a pas un workaround ?


Normalement ça marche.. fais voir ton code ?
Je fais un "echo" pour indiquer dans la sortie si on compile en DEBUG ou en RELEASE. Je mets ça dans la règle "all", évidemment ça l'affiche tout à la fin (et encore, si il y a quelque chose à faire).
Si je le mets dans la règle "%.o:", ça l'affiche après la compilation de chaque fichier. Ce n'est pas non plus ce que je veux, je voudrais l'afficher en tête du log.

Solution : ??? Rajouter une règle aux .cpp, qui fait l'echo et crée un fichier dont la présence indique de ne pas refaire l'echo ? J'ai même pas essayé, mais de toute façon c'est hyper crade.
Une solution ?


Oui, il faut faire un truc du genre :

all: foo.so foo.a

print-mode:
        @echo mode

foo.so: $(OBJ) | print-mode
        ...

foo.a: $(OBJ) | print-mode
        ...


L'astuce c'est l'utilisation du '|' pour déclarer une dépendance "order-only" (voir http://www.gnu.org/s/hello/manual/make/Prerequisite-Types.html)
So much code to write, so little time.

35

Merci pour tout !!!
nitro (./34) :
En activant les optimisations, gcc effectue des analyses en plus, ce qui lui permet de faire plus de warnings.

Non, là c'est juste nul :/
Donc tu compiles en debug, donc sans optimisations, il va même pas t'avertir à propos d'énormités de ce genre ? neutral

36

./32 : si tu trouves comment faire ça de façon portable ("mkdir -p" n'existe pas sous Windows), je suis preneur ^^

$(OBJ)/%.d: $(SRC)/%.c
	cd . $(foreach d,$(subst /, ,${@D}), && mkdir $d && cd $d)
	$(CC) $(CFLAGS) -MM -MP -MF "$@" -MT "$(@:.d=.o)" "$<"

ne marche pas, sous Windows mkdir retourne une erreur si le dossier existe déjà (et je n'ai vu aucune option pour éviter ça). Le "foreach" est moche, mais pour créer plusieurs dossiers d'un coup sous Unix il faut un switch "-p" qui n'est pas reconnu (et pas nécessaire) avec le mkdir de Windows.

J'aurais bien tenté de tricher comme ça :
$(OBJ)/%.d: $(SRC)/%.c | $(dir $@)/.exists
	$(CC) $(CFLAGS) -MM -MP -MF "$@" -MT "$(@:.d=.o)" "$<"

%.exists:
	cd . $(foreach d,$(subst /, ,${@D}), && mkdir $d && cd $d)
	echo "dummy" > "$@"

mais d'une part c'est sacrément laid, d'autre part impossible de mettre une expression dans les dépendances d'une règle, donc c'est fichu aussi.

Des idées ? grin

[edit] en attendant, j'ai ajouté un "-" devant le mkdir pour éviter de faire échouer la compilation à cause de ça, mais ça me fait une floppée d'erreurs à chaque fois que je compile, c'est vraiment pas top sad
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

37

aucune cheeky

je connaissais pas le pipe dans les prérequis, c'est cool!