2011-10-17 4 views
0

Apprentissage make, Dans le Makefile suivant, comment puis-je définir la dépendance de %.tar.bz2 à somefile.tar.bz2?make: fonction de texte dans une dépendance

Ce serait quelque chose comme: %.tar.bz2: $(function_to_cut_from_end_till_/ %.tar.bz2) Mais je ne pouvais pas trouver comment le faire dans man make. Est-ce que je m'approche de cela du mauvais côté?

source=http://example.net/somefile.tar.bz2 
source:=$(subst :,\:,$(source)) 

.PHONY: download 

download: $(source) 

%.tar.bz2: 
     @wget "[email protected]" 
+1

« function_to_cut_from_end_till_/» existe et est appelé « notDIR », mais: 1. les fonctions que vous utilisez dans les conditions d'une règle de modèle ne sont évalués une fois, * avant * l'espace réservé '%' est remplacé par autre chose, et 2. même en ignorant cela, je ne vois pas comment '% .tar.bz2: $ (function_to_cut_from_end_till_ /% .tar.bz2)' est un chose utile à faire. Pourriez-vous expliquer le résultat que vous essayez d'atteindre? – slowdog

+0

Je voulais juste utiliser make, au lieu de shell pour obtenir le nom de fichier - vous avez raison, le mettre comme une dépendance n'aura aucun sens. J'utiliserai 'notdir' à l'intérieur d'une règle. cela vous dérangerait-il de le poster comme réponse pour que je puisse l'accepter? –

Répondre

1

Pour la partie du nom de fichier du nom cible dans les commandes de la règle %.tar.bz2, vous pouvez utiliser the notdir function ou the $(@D) variable. Vraiment, cependant, vous devriez faire en sorte que le nom de la cible corresponde au fichier de sortie, afin que make puisse vérifier l'existence du fichier et ne tentera pas de le télécharger à nouveau chaque fois que vous l'exécuterez. Une façon simple de le faire serait

source=somefile.tar.bz2 

.PHONY: download 

download: $(source) 

%.tar.bz2: 
     @wget "http://example.net/[email protected]" 

ou, si vous avez des archives de différentes sources à télécharger à partir de différents endroits (que j'imagine que vous faites, sinon pourquoi s'embêter avec une règle de modèle du tout?), Vous pouvez utiliser un target-specific variable pour stocker l'URL de téléchargement, comme celui-ci

source=somefile.tar.bz2 some-other-file.tar.bz2 
somefile.tar.bz2: URL=http://example.net 
some-other-file.tar.bz2: URL=http://example.org/foobar 

.PHONY: download 

download: $(source) 

%.tar.bz2: 
     @wget "$(URL)/[email protected]" 
0

Eh bien, aucune raison d'être trop compliqué - alors qu'il pourrait être possible de le faire, ne serait-il beaucoup plus facile à lire pour ce faire:

domain=http://example.net/ 
filename=somefile.tar.bz2 
source=$(DOMAIN)$(FILENAME) 

Ensuite, le nom du fichier est là utiliser

Vous pouvez également essayer

$(patsubst %/,,$(source)) 

qui devrait enlever tout jusqu'à la dernière avant slash de $(source)

Questions connexes