2009-02-17 6 views
3

Si j'ai un makefile qui appelle un autre makefile, comment obtenir le makefile maître pour vérifier correctement si les dépendances du makefile subordonné ont changé?Comment vérifier les dépendances lors de l'invocation d'une sous-marque à générer en cas de modifications?

Par exemple, si je la règle

server: 
    @cd $(SERVERDIR) && $(MAKE) 

qui invoque faire dans le sous-répertoire dans lequel je construis un exécutable « serveur ». Cependant, si je change l'un des fichiers qui composent le serveur, le parent make ne voit pas les changements et refuse de reconstruire le serveur - "make:` server 'est à jour. "

Comment puis-je obtenir le makefile maître pour détecter correctement quand il y a un changement dans l'un des fichiers dépendants (quelque chose comme $ (SERVERDIR) de /server.c, par exemple?

Répondre

7

On dirait que vous voulez utiliser une cible phony

.PHONY: server 
server: 
    @cd $(SERVERDIR) && $(MAKE) 

Il y a une description détaillée de la cible Phony here, mais la description courte vous est racontons le makefile qu'il n'y aura jamais un fichier correspond à cette cible de serveur, et par conséquent, il ne considérera pas le serveur à jour s'il existe un fichier nommé serveur dans le répertoire.

+0

Ce serait normalement une bonne solution, mais je ne veux pas * toujours * reconstruire la cible, je veux qu'elle se comporte comme une cible normale non-récursive et ne construise que lorsque quelque chose a changé. – Zxaos

+2

C'est la responsabilité de votre sous-fichier Makefile. –

+0

Ce que Randy a dit. Puisque votre cible de serveur n'a pas de dépendances, elle ne sait pas "quelque chose a changé". Sinon, quel est le point d'avoir le fichier submake? – mbyrne215

1

Votre nom cible correspond au nom de l'un des fichiers ou des répertoires dans votre principale

répertoire Makefile en supposant que vous devez tout construire dans un sous-répertoire appelé server, cette règle.

server: 
    $(MAKE) -C server 

ne fonctionnera pas, comme la cible server est un répertoire, n'a pas de fichiers source et n'a pas besoin d'être construit alors.

Celui-ci:

srv: 
    $(MAKE) -C server 

fonctionnera, tant qu'il n'y a pas de fichier ou un répertoire appelé srv.

Questions connexes