Existe-il un moyen (simple) de faire ce que je veux avec les commandes
Gnu-Makefile ?
Existe-il un moyen (simple) de faire ce que je veux avec les commandes
Gnu-Makefile ?
Existe-il un moyen (simple) de faire ce que je veux avec les commandes
Gnu-Makefile ?
ayant surtout l'habitude de travailler sous Linux, j'utilise
des choses de ce type:
all:
ifdef DIRECTORIES
@for dir in $(DIRECTORIES); do
$(MAKE) -ks -C $$dir all;
done
endif
Maintenant je dois travailler sous Windows et Msys pose des
problèmes, aussi je travaille sans émulateur de shell Linux.
Globalement je m'en sors très bien sauf pour refaire le cas
précédent.
Sur
http://www.gnu.org/software/make/manual/html_chapter/make_toc.html
je n'ai rien trouvé sur les boucles dans un Makefile :-(
D'après
http://www.gnu.org/software/make/manual/html_chapter/make_4.html#SEC41
il serait possible de simuler cela avec des .PHONY targets
mais je n'y arrive pas.
Existe-il un moyen (simple) de faire ce que je veux avec les
commandes Gnu-Makefile ?
Comment faire cela avec le shell windows ? (mon Makefile teste
l'OS et pourrait donc s'adapter)
A partir de
http://www.horstmann.com/bigj/help/windows/advanced.html j'ai
essayé d'écrire:
all:
ifdef DIRECTORIES
for %d in (Rep1,Rep2) do $(MAKE) $(OPTIONS) -C %d all
endif
mais ça ne fonctionne pas (ni avec %%d au lieu de %d). Si
jamais cette dernière version fonctionnait, il resterait alors
le problème de construire une liste (Rep1,Rep2,Rep3) à partir
de "Rep1 Rep2 Rep3". Pour cela, comment faire avec patsubst ?
@echo $(patsubst % ,%,,$(DIRECTORIES)) ne donne pas le bon résultat.
ayant surtout l'habitude de travailler sous Linux, j'utilise
des choses de ce type:
all:
ifdef DIRECTORIES
@for dir in $(DIRECTORIES); do
$(MAKE) -ks -C $$dir all;
done
endif
Maintenant je dois travailler sous Windows et Msys pose des
problèmes, aussi je travaille sans émulateur de shell Linux.
Globalement je m'en sors très bien sauf pour refaire le cas
précédent.
Sur
http://www.gnu.org/software/make/manual/html_chapter/make_toc.html
je n'ai rien trouvé sur les boucles dans un Makefile :-(
D'après
http://www.gnu.org/software/make/manual/html_chapter/make_4.html#SEC41
il serait possible de simuler cela avec des .PHONY targets
mais je n'y arrive pas.
Existe-il un moyen (simple) de faire ce que je veux avec les
commandes Gnu-Makefile ?
Comment faire cela avec le shell windows ? (mon Makefile teste
l'OS et pourrait donc s'adapter)
A partir de
http://www.horstmann.com/bigj/help/windows/advanced.html j'ai
essayé d'écrire:
all:
ifdef DIRECTORIES
for %d in (Rep1,Rep2) do $(MAKE) $(OPTIONS) -C %d all
endif
mais ça ne fonctionne pas (ni avec %%d au lieu de %d). Si
jamais cette dernière version fonctionnait, il resterait alors
le problème de construire une liste (Rep1,Rep2,Rep3) à partir
de "Rep1 Rep2 Rep3". Pour cela, comment faire avec patsubst ?
@echo $(patsubst % ,%,,$(DIRECTORIES)) ne donne pas le bon résultat.
ayant surtout l'habitude de travailler sous Linux, j'utilise
des choses de ce type:
all:
ifdef DIRECTORIES
@for dir in $(DIRECTORIES); do
$(MAKE) -ks -C $$dir all;
done
endif
Maintenant je dois travailler sous Windows et Msys pose des
problèmes, aussi je travaille sans émulateur de shell Linux.
Globalement je m'en sors très bien sauf pour refaire le cas
précédent.
Sur
http://www.gnu.org/software/make/manual/html_chapter/make_toc.html
je n'ai rien trouvé sur les boucles dans un Makefile :-(
D'après
http://www.gnu.org/software/make/manual/html_chapter/make_4.html#SEC41
il serait possible de simuler cela avec des .PHONY targets
mais je n'y arrive pas.
Existe-il un moyen (simple) de faire ce que je veux avec les
commandes Gnu-Makefile ?
Comment faire cela avec le shell windows ? (mon Makefile teste
l'OS et pourrait donc s'adapter)
A partir de
http://www.horstmann.com/bigj/help/windows/advanced.html j'ai
essayé d'écrire:
all:
ifdef DIRECTORIES
for %d in (Rep1,Rep2) do $(MAKE) $(OPTIONS) -C %d all
endif
mais ça ne fonctionne pas (ni avec %%d au lieu de %d). Si
jamais cette dernière version fonctionnait, il resterait alors
le problème de construire une liste (Rep1,Rep2,Rep3) à partir
de "Rep1 Rep2 Rep3". Pour cela, comment faire avec patsubst ?
@echo $(patsubst % ,%,,$(DIRECTORIES)) ne donne pas le bon résultat.
La solution la plus simple, à mon avis, c'est d'installer
CygWin.
Je ne connais pas bien Windows, mais il me semble que la syntaxe
pour une variable là est %nom%.
Essayer donc avec %d% à la place
de %d.
[Make] Mais en tant que langage, il est encore plus
tordu, et de loin, que les templates en C++.
La solution la plus simple, à mon avis, c'est d'installer
CygWin.
Je ne connais pas bien Windows, mais il me semble que la syntaxe
pour une variable là est %nom%.
Essayer donc avec %d% à la place
de %d.
[Make] Mais en tant que langage, il est encore plus
tordu, et de loin, que les templates en C++.
La solution la plus simple, à mon avis, c'est d'installer
CygWin.
Je ne connais pas bien Windows, mais il me semble que la syntaxe
pour une variable là est %nom%.
Essayer donc avec %d% à la place
de %d.
[Make] Mais en tant que langage, il est encore plus
tordu, et de loin, que les templates en C++.
On 26 Oct 2005 03:18:12 -0700, "kanze" :La solution la plus simple, à mon avis, c'est d'installer
CygWin.
Ou MinGW ?
Y'a un truc qui me gonfle dans Cygwin : il ne semble pas qu'on puisse
avoir deux installations indépendantes sur la même machine, même si
les deux font des trucs totalement différents (par exemple, serveur
SSH pour des backups et programmation). Du coup, ça introduit un
couplage artificiel qui me déplait.
On 26 Oct 2005 03:18:12 -0700, "kanze" <kanze@gabi-soft.fr>:
La solution la plus simple, à mon avis, c'est d'installer
CygWin.
Ou MinGW ?
Y'a un truc qui me gonfle dans Cygwin : il ne semble pas qu'on puisse
avoir deux installations indépendantes sur la même machine, même si
les deux font des trucs totalement différents (par exemple, serveur
SSH pour des backups et programmation). Du coup, ça introduit un
couplage artificiel qui me déplait.
On 26 Oct 2005 03:18:12 -0700, "kanze" :La solution la plus simple, à mon avis, c'est d'installer
CygWin.
Ou MinGW ?
Y'a un truc qui me gonfle dans Cygwin : il ne semble pas qu'on puisse
avoir deux installations indépendantes sur la même machine, même si
les deux font des trucs totalement différents (par exemple, serveur
SSH pour des backups et programmation). Du coup, ça introduit un
couplage artificiel qui me déplait.
Aurélien Barbier-Accary writes:Existe-il un moyen (simple) de faire ce que je veux avec les commandes
Gnu-Makefile ?
Peut-etre en utilisant la recursion. C'est simple, mais pas
necessairement efficace. Je chercherais plutot a faire fonctionner
Msys ou cygwin.
A+
Aurélien Barbier-Accary <nospam_star-shoot_mapson@fr.st> writes:
Existe-il un moyen (simple) de faire ce que je veux avec les commandes
Gnu-Makefile ?
Peut-etre en utilisant la recursion. C'est simple, mais pas
necessairement efficace. Je chercherais plutot a faire fonctionner
Msys ou cygwin.
A+
Aurélien Barbier-Accary writes:Existe-il un moyen (simple) de faire ce que je veux avec les commandes
Gnu-Makefile ?
Peut-etre en utilisant la recursion. C'est simple, mais pas
necessairement efficace. Je chercherais plutot a faire fonctionner
Msys ou cygwin.
A+
[Ça sort vraiment du sujet C++, mais passons...]
Pour ton exemple, ça doit marcher :
all : subdirs
.PHONY subdirs
subdirs : $(DIRECTORIES)
$(SUBDIRS):
$(MAKE) -C $@
Sinon, il existe une fonction $(foreach...) ; je crois que
quelque chose comme :
define subdirHandling
.PHONY $(1)
$(1) :
$(MAKE) -C $@
endef
all : $(DIRECTORIES)
$(foreach dir,$(DIRECTORIES),$(eval $(call subdirHandling,$(dir))))
ferait l'affaire. (Je m'en suis servi pour quelque chose de
semblable chez moi. Mais justement, c'était chez moi, et je me
trouve au travail à l'instant. Je ne peux donc pas vérifier la
syntaxe exacte.)
Enfin, il y a toujours la méthode brutale : tu as l'if, et les
fichiers de make sont des fonctions. Alors :
all : recurse
.PHONY recurse
recurse: $(DIRECTORIES)
ifneq ($(DIRECTORIES),)
$(MAKE) -C $<
$(MAKE) 'DIRECTORIES=$(wordlist 2,10000,$^)'
endif
Si le nombre de répertoires n'est pas trop grand, ça risque
d'être acceptable. (En fait, je crois que je mettrais la
récursion dans un fichier de make à part, avec :
all :
$(MAKE) -f makeInDirs.mk
dans le fichier principal.)
En tant que langage, si on considère les sous-make comme des
fonctions, GNU make est « Turing complete ». On peut donc faire
tout ce qu'on pourrait faire dans n'importe quel langage de
programmation. Mais en tant que langage, il est encore plus
tordu, et de loin, que les templates en C++.
[Ça sort vraiment du sujet C++, mais passons...]
Pour ton exemple, ça doit marcher :
all : subdirs
.PHONY subdirs
subdirs : $(DIRECTORIES)
$(SUBDIRS):
$(MAKE) -C $@
Sinon, il existe une fonction $(foreach...) ; je crois que
quelque chose comme :
define subdirHandling
.PHONY $(1)
$(1) :
$(MAKE) -C $@
endef
all : $(DIRECTORIES)
$(foreach dir,$(DIRECTORIES),$(eval $(call subdirHandling,$(dir))))
ferait l'affaire. (Je m'en suis servi pour quelque chose de
semblable chez moi. Mais justement, c'était chez moi, et je me
trouve au travail à l'instant. Je ne peux donc pas vérifier la
syntaxe exacte.)
Enfin, il y a toujours la méthode brutale : tu as l'if, et les
fichiers de make sont des fonctions. Alors :
all : recurse
.PHONY recurse
recurse: $(DIRECTORIES)
ifneq ($(DIRECTORIES),)
$(MAKE) -C $<
$(MAKE) 'DIRECTORIES=$(wordlist 2,10000,$^)'
endif
Si le nombre de répertoires n'est pas trop grand, ça risque
d'être acceptable. (En fait, je crois que je mettrais la
récursion dans un fichier de make à part, avec :
all :
$(MAKE) -f makeInDirs.mk
dans le fichier principal.)
En tant que langage, si on considère les sous-make comme des
fonctions, GNU make est « Turing complete ». On peut donc faire
tout ce qu'on pourrait faire dans n'importe quel langage de
programmation. Mais en tant que langage, il est encore plus
tordu, et de loin, que les templates en C++.
[Ça sort vraiment du sujet C++, mais passons...]
Pour ton exemple, ça doit marcher :
all : subdirs
.PHONY subdirs
subdirs : $(DIRECTORIES)
$(SUBDIRS):
$(MAKE) -C $@
Sinon, il existe une fonction $(foreach...) ; je crois que
quelque chose comme :
define subdirHandling
.PHONY $(1)
$(1) :
$(MAKE) -C $@
endef
all : $(DIRECTORIES)
$(foreach dir,$(DIRECTORIES),$(eval $(call subdirHandling,$(dir))))
ferait l'affaire. (Je m'en suis servi pour quelque chose de
semblable chez moi. Mais justement, c'était chez moi, et je me
trouve au travail à l'instant. Je ne peux donc pas vérifier la
syntaxe exacte.)
Enfin, il y a toujours la méthode brutale : tu as l'if, et les
fichiers de make sont des fonctions. Alors :
all : recurse
.PHONY recurse
recurse: $(DIRECTORIES)
ifneq ($(DIRECTORIES),)
$(MAKE) -C $<
$(MAKE) 'DIRECTORIES=$(wordlist 2,10000,$^)'
endif
Si le nombre de répertoires n'est pas trop grand, ça risque
d'être acceptable. (En fait, je crois que je mettrais la
récursion dans un fichier de make à part, avec :
all :
$(MAKE) -f makeInDirs.mk
dans le fichier principal.)
En tant que langage, si on considère les sous-make comme des
fonctions, GNU make est « Turing complete ». On peut donc faire
tout ce qu'on pourrait faire dans n'importe quel langage de
programmation. Mais en tant que langage, il est encore plus
tordu, et de loin, que les templates en C++.
[Ça sort vraiment du sujet C++, mais passons...]
Oui désolé mais je ne savais pas où demander de l'aide pour ça
:-o
Pour ton exemple, ça doit marcher :
all : subdirs
.PHONY subdirs
subdirs : $(DIRECTORIES)
$(SUBDIRS):
$(MAKE) -C $@
je n'y suis pas parvenu car je ne vois pas comment gérer des
$@ différents (pour les règles all, clean et cleanall par
exemple). Du coup j'ai essayé de fouiller du côté de ta
proposition suivante.
Sinon, il existe une fonction $(foreach...) ; je crois que
quelque chose comme :
define subdirHandling
.PHONY $(1)
$(1) :
$(MAKE) -C $@
endef
all : $(DIRECTORIES)
$(foreach dir,$(DIRECTORIES),$(eval $(call subdirHandling,$(dir))))
ferait l'affaire. (Je m'en suis servi pour quelque chose de
semblable chez moi. Mais justement, c'était chez moi, et je
me trouve au travail à l'instant. Je ne peux donc pas
vérifier la syntaxe exacte.)
chez moi j'avais des messages d'erreur avec la fonction "eval"
(non définie semble-t-il) et j'ai donc une demi-solution avec
la fonction "shell" et un appel à la commande shell "call":
DIRECTORIES := $(patsubst %,$(MAKE)_-C_%_$$@,$(DIRECTORIES))
.PHONY: truc
truc:
ifdef DIRECTORIES
@echo $(foreach cmd, $(DIRECTORIES),
$(shell call $(subst $$@,$@,$(subst _, ,$(cmd)))))
else
@echo FEUILLE du Makefile
endif
L'inconvénient de "foreach" c'est qu'elle renvoie une liste en
remplaçant les sauts de ligne par des espaces et du coup mon
affichage est tout moche :-(
Enfin, il y a toujours la méthode brutale : tu as l'if, et les
fichiers de make sont des fonctions. Alors :
all : recurse
.PHONY recurse
recurse: $(DIRECTORIES)
ifneq ($(DIRECTORIES),)
$(MAKE) -C $<
$(MAKE) 'DIRECTORIES=$(wordlist 2,10000,$^)'
endif
Si le nombre de répertoires n'est pas trop grand, ça risque
d'être acceptable. (En fait, je crois que je mettrais la
récursion dans un fichier de make à part, avec :
all :
$(MAKE) -f makeInDirs.mk
dans le fichier principal.)
ça je ne l'ai pas encore bien compris ni testé...
En tant que langage, si on considère les sous-make comme des
fonctions, GNU make est « Turing complete ». On peut donc
faire tout ce qu'on pourrait faire dans n'importe quel
langage de programmation. Mais en tant que langage, il est
encore plus tordu, et de loin, que les templates en C++.
je ne suis pas encore convaincu qu'on puisse tout faire ;-p
mais ce qui est sûr c'est que ce n'est pas très intuitif :-)
[Ça sort vraiment du sujet C++, mais passons...]
Oui désolé mais je ne savais pas où demander de l'aide pour ça
:-o
Pour ton exemple, ça doit marcher :
all : subdirs
.PHONY subdirs
subdirs : $(DIRECTORIES)
$(SUBDIRS):
$(MAKE) -C $@
je n'y suis pas parvenu car je ne vois pas comment gérer des
$@ différents (pour les règles all, clean et cleanall par
exemple). Du coup j'ai essayé de fouiller du côté de ta
proposition suivante.
Sinon, il existe une fonction $(foreach...) ; je crois que
quelque chose comme :
define subdirHandling
.PHONY $(1)
$(1) :
$(MAKE) -C $@
endef
all : $(DIRECTORIES)
$(foreach dir,$(DIRECTORIES),$(eval $(call subdirHandling,$(dir))))
ferait l'affaire. (Je m'en suis servi pour quelque chose de
semblable chez moi. Mais justement, c'était chez moi, et je
me trouve au travail à l'instant. Je ne peux donc pas
vérifier la syntaxe exacte.)
chez moi j'avais des messages d'erreur avec la fonction "eval"
(non définie semble-t-il) et j'ai donc une demi-solution avec
la fonction "shell" et un appel à la commande shell "call":
DIRECTORIES := $(patsubst %,$(MAKE)_-C_%_$$@,$(DIRECTORIES))
.PHONY: truc
truc:
ifdef DIRECTORIES
@echo $(foreach cmd, $(DIRECTORIES),
$(shell call $(subst $$@,$@,$(subst _, ,$(cmd)))))
else
@echo FEUILLE du Makefile
endif
L'inconvénient de "foreach" c'est qu'elle renvoie une liste en
remplaçant les sauts de ligne par des espaces et du coup mon
affichage est tout moche :-(
Enfin, il y a toujours la méthode brutale : tu as l'if, et les
fichiers de make sont des fonctions. Alors :
all : recurse
.PHONY recurse
recurse: $(DIRECTORIES)
ifneq ($(DIRECTORIES),)
$(MAKE) -C $<
$(MAKE) 'DIRECTORIES=$(wordlist 2,10000,$^)'
endif
Si le nombre de répertoires n'est pas trop grand, ça risque
d'être acceptable. (En fait, je crois que je mettrais la
récursion dans un fichier de make à part, avec :
all :
$(MAKE) -f makeInDirs.mk
dans le fichier principal.)
ça je ne l'ai pas encore bien compris ni testé...
En tant que langage, si on considère les sous-make comme des
fonctions, GNU make est « Turing complete ». On peut donc
faire tout ce qu'on pourrait faire dans n'importe quel
langage de programmation. Mais en tant que langage, il est
encore plus tordu, et de loin, que les templates en C++.
je ne suis pas encore convaincu qu'on puisse tout faire ;-p
mais ce qui est sûr c'est que ce n'est pas très intuitif :-)
[Ça sort vraiment du sujet C++, mais passons...]
Oui désolé mais je ne savais pas où demander de l'aide pour ça
:-o
Pour ton exemple, ça doit marcher :
all : subdirs
.PHONY subdirs
subdirs : $(DIRECTORIES)
$(SUBDIRS):
$(MAKE) -C $@
je n'y suis pas parvenu car je ne vois pas comment gérer des
$@ différents (pour les règles all, clean et cleanall par
exemple). Du coup j'ai essayé de fouiller du côté de ta
proposition suivante.
Sinon, il existe une fonction $(foreach...) ; je crois que
quelque chose comme :
define subdirHandling
.PHONY $(1)
$(1) :
$(MAKE) -C $@
endef
all : $(DIRECTORIES)
$(foreach dir,$(DIRECTORIES),$(eval $(call subdirHandling,$(dir))))
ferait l'affaire. (Je m'en suis servi pour quelque chose de
semblable chez moi. Mais justement, c'était chez moi, et je
me trouve au travail à l'instant. Je ne peux donc pas
vérifier la syntaxe exacte.)
chez moi j'avais des messages d'erreur avec la fonction "eval"
(non définie semble-t-il) et j'ai donc une demi-solution avec
la fonction "shell" et un appel à la commande shell "call":
DIRECTORIES := $(patsubst %,$(MAKE)_-C_%_$$@,$(DIRECTORIES))
.PHONY: truc
truc:
ifdef DIRECTORIES
@echo $(foreach cmd, $(DIRECTORIES),
$(shell call $(subst $$@,$@,$(subst _, ,$(cmd)))))
else
@echo FEUILLE du Makefile
endif
L'inconvénient de "foreach" c'est qu'elle renvoie une liste en
remplaçant les sauts de ligne par des espaces et du coup mon
affichage est tout moche :-(
Enfin, il y a toujours la méthode brutale : tu as l'if, et les
fichiers de make sont des fonctions. Alors :
all : recurse
.PHONY recurse
recurse: $(DIRECTORIES)
ifneq ($(DIRECTORIES),)
$(MAKE) -C $<
$(MAKE) 'DIRECTORIES=$(wordlist 2,10000,$^)'
endif
Si le nombre de répertoires n'est pas trop grand, ça risque
d'être acceptable. (En fait, je crois que je mettrais la
récursion dans un fichier de make à part, avec :
all :
$(MAKE) -f makeInDirs.mk
dans le fichier principal.)
ça je ne l'ai pas encore bien compris ni testé...
En tant que langage, si on considère les sous-make comme des
fonctions, GNU make est « Turing complete ». On peut donc
faire tout ce qu'on pourrait faire dans n'importe quel
langage de programmation. Mais en tant que langage, il est
encore plus tordu, et de loin, que les templates en C++.
je ne suis pas encore convaincu qu'on puisse tout faire ;-p
mais ce qui est sûr c'est que ce n'est pas très intuitif :-)
Encore merci pour toutes ces infos, je vais aller voir les
Makefile de ta librairie.
Encore merci pour toutes ces infos, je vais aller voir les
Makefile de ta librairie.
Encore merci pour toutes ces infos, je vais aller voir les
Makefile de ta librairie.