2017-08-26 4 views
0

J'ai un Makefile avec le format suivant:faire Explicitement une cible avec un nom de variable

.PHONY: all 

target1 := file1 
target2 := $(target1).txt 

all: $(target2) 

$(target1): prerequisite1 
    recipe 

$(target2): $(target1) 
    recipe 

target2 dépend de target1 et make substituera correctement les chaînes pour créer les noms de fichiers. Cependant, sur mon système, les noms de fichiers et les chemins sont assez fastidieux à taper; Je me demande s'il n'y a aucune façon de faire spécifiquement target1 tout en se référant à son nom pas comme le chemin du fichier, mais comme la variable.

Par exemple, je voudrais pouvoir invoquer:

$ make $(target1) 

plutôt que

$ make path/to/file1 

Je veux le faire parce que je change les variables tout à fait un peu et la structure de mon Makefile a de nombreux intermédiaires qui sont parfois difficiles à retracer à leurs chemins de fichiers littéraux, mais sont faciles à make sur la base des noms de variables que je leur ai assignés. Ce qui précède ne fonctionne pas, et j'ai lu la page man ainsi que fait un peu de recherche ici et sur Google. Je me demande simplement si quelqu'un a déjà rencontré ce problème et trouvé une solution.

+0

Une cible qui ressemble à quelque chose comme 'variable-%: $ ($ *);' et appelée via 'make variable-target1', peut-être? – user2722968

+0

@ utilisateur2722968 Merci. :) Désolé, je suis peut-être coincé dans la syntaxe, mais les retours 'make target1' ne permettent pas de trouver la cible. –

Répondre

1

C'est un peu maladroit à utiliser en raison de la récursivité, mais il fait ce que vous voulez:

target1 := file1 

$(target1): 
    @echo "Hello from [email protected]" 

variable-%: 
    $(MAKE) $($*) 

donne

$ make variable-target1 
make file1 
Hello from file1 
+0

Wow, je suis désolé que je n'ai pas compris de votre commentaire, mais c'est absolument parfait et exactement ce que je cherchais. Merci beaucoup! –

+0

Alors que cela fonctionne, 'make' serait confus s'il y avait un fichier * réel * par le nom' variable-target1'. Par conséquent, je ne recommanderais pas cette solution "délicate". –

0

C'est ce que cibles sont fausses pour. Une cible phony cible est une cible qui n'est pas le nom d'un fichier de sortie. Souvent, la cible par défaut (c'est-à-dire la cible apparaissant en premier dans le Makefile) est phony et par convention appelée all. Il suffit donc de modifier votre Makefile à quelque chose comme ceci:

.PHONY: all target1 target2 

target1 := file1 
target2 := $(target1).txt 

# phony rules with dependencies 
all: target2 

target2: $(target2) target1 

target1: $(target1) 

# file rules with prerequisites 
$(target1): prerequisite1 
    recipe 

$(target2): 
    recipe 

En tant que « meilleure pratique », la liste des dépendances qui ne sont pas directement utilisés pour créer les cibles réelles dans la liste préalable des cibles et le faux les dépendances qui sont en effet des fichiers d'entrée dans la liste des prérequis des cibles de fichier réelles.


Notez cela fonctionnera sans déclarer les cibles dans .PHONYtant que il n'y a pas par hasard un fichier avec le nom de la cible phony . Un tel fichier serait confondre make, donc toujours énumérer toutes vos cibles phony dans .PHONY, donc make sait qu'ils ne produisent pas un fichier de leur nom.