Question

Supposons un foo.tar cible, qui dépend d'une liste des fichiers foo.files, par exemple.

FOO_FILES := $(shell cat foo.files)

foo.tar: foo.files $(FOO_FILES)
    tar -cf foo $(FOO_FILES)

Supposons maintenant que foo.files doivent être générés par exemple:.

foo.files: foo.files.template
    sed -e "s/@{VERSION}/$(VERSION)/" < $< > $@

Il est clair que foo.files dépend foo.files.template, mais comment peut-on faire en sorte que FOO_FILES est évalué après foo.files est généré?

Était-ce utile?

La solution

Vos règles d'origine sont corrects. Parce que provoque la mise à jour foo.files la valeur de FOO_FILES pour devenir obsolète il vous suffit de vous assurer que votre Makefile est réévalué par marque gnu lorsque foo.files a été mis à jour en faisant votre Makefile dépendra foo.files:

Makefile : foo.files

Autres conseils

Alors, je l'ai trouvé une réponse à propos de la lecture avancée Génération automatique des dépendances sur au < em> mad-scientist.net . Au fond, il est possible de réévaluer un makefile au moyen d'une fonction GNU / Marque. Quand il y a une règle pour générer un Makefile inclus, l'ensemble makefile sera relue après la génération du fichier inclus. Ainsi -

# -*- mode: make -*-
VERSION := 1.2.3

foo.tar: foo.files $(FOO_FILES)
    tar cf $@ $(FOO_FILES)

clean:
    rm -f foo.files foo_files.mk foo.tar

foo.files: foo.files.template
    sed -e "s/@{VERSION}/$(VERSION)/" < $< > $@

# -- voodoo start here --
# This will ensure that FOO_FILES will be evaluated only
# *after* foo.files is generated.
foo_files.mk: foo.files
    echo "FOO_FILES := `xargs < $<`" > $@

include foo_files.mk
# -- voodoo ends here --

.PHONY: clean

-. Semble faire la bonne chose


... et juste pour être complet:

foo.files.template est:

a-$(VERSION)
b-$(VERSION)

et supposons que la présence de a-1.2.3 et b-1.2.3.

Il ne peut se faire en une seule passe; Faire détermine quels objectifs doivent être recréés avant qu'il exécute en fait une règle, et dans ce cas, la liste complète des cibles n'existe pas tant que l'une des règles est exécuté.

Cela devrait le faire:

FOO_FILES := $(shell cat foo.files)

foo.tar: foo.files
    $(MAKE) foo-tarball

.PHONY: foo-tarball
foo-tarball: $(FOO_FILES)
    tar -cf foo $^

EDIT:
Comme l'OP souligne, cela ne fonctionnera pas comme écrit; Je suis parti une condition sine qua non:

foo.tar: foo.files $(FOO_FILES)
    ...

Notez que cela récursif même si foo.files n'a pas changé, ce qui est pas strictement nécessaire; il est possible de corriger cette situation, mais pas avec élégance. (À titre de comparaison, la solution choisie, qui je l'avoue est plus propre que la mienne, récursif même si la cible n'a rien à voir avec foo.tar.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top