2011-01-29 2 views
2

J'utilise automake et autoconf.Automake: dépendance au résultat de construction

Dans le sous-répertoire src/Makefile.am contient le

bin_PROGRAMS = hello 
hello_SOURCES = hello.c 

Après avoir construit bonjour je veux exécuter un outil (certains analyseur/optimiseur installé sur le système) sur le binaire pour modifier (par exemple la bande) ou générer des statistiques (ex: nains, pahole ...). A cet effet, le Makefile.am dans le haut niveau répertoire contient

tool: 
     tool src/hello 

Lors de la construction bonjour avec la marque et l'exécution font tout outil est très bien. Le problème se produit lorsque l'utilisateur exécute make tool sans construire le binaire. Comment puis-je forcer la construction de bin_PROGRAMS (qui peut être une liste) ou simplement le binaire Hello comme dépendance de l'outil cible?

Ni

tool: bin_PROGRAMS 
     tool src/hello 

ni

tool: src/hello 
     tool src/hello 
travail

.

+1

Pouvez-vous publier le fichier makefile dans son intégralité? – Kevin

Répondre

1

Une cible Makefile nommée 'outil' est supposée créer un fichier nommé 'outil'. Comme 'tool' existe déjà, Make suppose qu'il n'a plus besoin d'exécuter la commande (je simplifie, mais seulement un peu).

Une construction comme celui-ci devrait fonctionner:

tool_output: tool src/hello 
    tool src/hello > tool_output 

De plus, en général, je crois que vous ne pouvez pas utiliser bin_PROGRAMS ou tout autre Automake variables (attribué à =) en tant que dépendance , mais je pourrais être faux.

+0

Ce problème est ce que '.PHONY: tool' est supposé résoudre. – ptomato

+0

Ceci est peut-être seulement un style personnel, mais je ne pense pas que '.PHONY' /' FORCE' soit censé être utilisé pour cela.Ils sont une défense contre les indésirables dans votre répertoire de construction, pas un moyen de contourner la sémantique normale des cibles makefile. – zwol

+0

Ma question portait sur la dépendance, pas sur le problème .PHONY. Je suis conscient que l'outil cible doit être une cible .PHONY, car il ne crée en aucun cas un fichier de sortie et certains fichiers indésirables peuvent entrer en collision avec son nom. Mais dans tous les cas, il a besoin du binaire dans le sous-répertoire. – aquo

1

Vous voulez:

 
tool: $(bin_PROGRAMS) 

Mais vous aurez le même problème que si vous spécifiez src/bonjour explicitement. (A savoir, le Makefile de haut niveau ne sait pas comment construire bonjour dans src.) Vous seriez probablement mieux de faire quelque chose comme: dans le niveau supérieur

 
tool: 
     cd src && $(MAKE) $(AM_MAKEFLAGS) tool 

et mettre la règle réelle dans src/Makefile .am, où vous pouvez lister la dépendance. Mais c'est une très mauvaise idée aussi. Probablement la meilleure chose à faire est d'utiliser une règle tout locale et mettre quelque chose comme:

 
all-local: 
     tool hello 

dans src/Makefile.am. Cela garantira que l'outil est exécuté chaque fois que vous exécutez make sans arguments, mais il ne mettra pas à jour la sortie lorsque hello est reconstruit. Si cela est acceptable, alors c'est une solution raisonnable. Une autre option est de faire:

 
tool-output: hello 
     tool hello 

dans src/Makefile.am et outil de sortie de liste noinst_DATA dans src/Makefile.am.

+0

Merci pour vos conseils. Je pense que je vais m'en tenir à la première solution et recurse dans le sous-répertoire. Les outils dont j'ai besoin sont optionnels et j'ai seulement besoin de la possibilité de les exécuter exprès. – aquo

Questions connexes