2010-10-04 5 views
4

Est-il possible de spécifier un répertoire en tant que dépendance dans une règle Makefile? En fait, j'ai un Makefile dans un répertoire et un autre répertoire contenant tous les fichiers source.Répertoire en tant que dépendance dans la règle make

. 
. 
|_ Makefile 
|_ src 
    |_a.c 
    |_a.h 

Maintenant, je veux que chaque fois que je fais tout changement dans le répertoire src dire dans l'une des a.c ou a.h, une règle particulière dans mon Makefile se faire appel à l'émission commande. Quelque chose comme

Makefile 
. 
. 
. 
build: src 
    <commands> 

clean: 
    <commands> 
+0

... Les règles normales pour les fichiers '.c' et' .h' ne devraient-elles pas déjà le faire? –

+0

L'horodatage du répertoire change uniquement lorsque des fichiers sont ajoutés ou supprimés. Lorsque le contenu des fichiers d'un répertoire change, l'horodatage du répertoire n'est pas mis à jour. –

Répondre

3

Il est possible d'avoir un répertoire en tant que dépendance, dans le sens que si elle n'existe pas, il sera reconstruit. Il est même possible d'organiser une règle qui s'exécutera quand quelque chose dans le répertoire changera, mais c'est difficile. Et dans ce cas, il est presque certainement exagéré.

Si votre intention est ordinaire, la méthode habituelle suffira:

OBJ_FILES = foo.o bar.o baz.o 
# There are ways to be more succinct, but for now we'll keep it simple. 

build: $(OBJ_FILES) 
    <commands...> 

%.o: src/%.c src/%.h 
    <commands for building something.o> 

clean: # This should not require prerequisites 
    <commands...> 
+0

En général, comme votre réponse l'indique déjà clairement: l'exigence de * un répertoire en tant que dépendance * n'est pas bien spécifiée. Parfois (mais très rarement) vous voulez reconstruire quand le répertoire a lui-même une heure de modification, parfois quand un fichier existant dans le répertoire change, parfois quand un fichier d'un certain type change, parfois vous voulez aussi reconstruire quand les fichiers d'un certains types sont ajoutés, supprimés ou renommés, parfois vous souhaitez inclure récursivement le contenu des sous-répertoires. – reinierpost

2

Bien qu'il soit possible d'avoir un répertoire en tant que dépendance, il y a quelques petites choses à être au courant. Considérez ceci:

directory: 
     @mkdir -p directory 

directory/file : directory 
     commands-to-make-the-file 

Cela fera ce que vous pensez. Cependant, il exécute le commands-to-make-the-file lorsque file est plus ancien que directory, ce qui peut ne pas être ce que vous voulez.

Vous devez prendre en compte les scénarios dans lesquels l'horodatage de directory est mis à jour. Cela se produit chaque fois que des fichiers sont ajoutés ou supprimés du répertoire, mais cela ne se produit pas lorsqu'un fichier existant est modifié. Donc, une action non reliée qui met à jour le répertoire rendra le fichier obsolète, peut-être inutilement, ce qui déclenchera les commandes pour le re-créer.

+0

C'est exactement mon problème. Y at-il une solution de contournement pour cela? Ce dont j'ai réellement besoin est: si 'directory' n'existe pas, créez-le avant de construire' file'. Je pourrais juste mettre 'mkdir -p directory' avant' commands-to-make-the-file', mais c'est la même chose que cibler 'directory' quand' file' est obsolète ... Fonctionne exactement comme j'ai besoin, mais est moche = ( – matheuscscp

+0

@matheuscscp la documentation Makefile adresse exactement ce cas: https://www.gnu.org/software/make/manual/html_node/Prerequisite-Types.html –

Questions connexes