2017-09-30 4 views
0

Dans mon makefile, je veux vérifier si les sous-répertoires sont présents dans un dossier donné. Voilà comment je le fais maintenant ..Vérifiez si les sous-répertoires sont présents dans ./work lorsqu'il est créé dans le fichier makefile?

setup: 
     mkdir -p ./work 

DIR=$(shell find ./work -maxdepth 0 -type d -print) 
check: 
    if [-z $(DIR) ]; then \ 
     echo "null" ; \ 
    else \ 
     echo "present" ; \ 
    fi; 

Je ne peux pas créer le ./work en dehors du makefile. Donc, le problème est que depuis que ./work est créé dans le makefile, cela me donne une erreur/avertissement que ./work n'est pas présent avant d'exécuter le script.

Existe-t-il un moyen de vérifier si les sous-répertoires sont présents dans ./work lorsqu'il est créé dans le fichier makefile?

Répondre

1

Une possibilité, qui soutient également le principe make pour créer/créer uniquement des éléments dont dépend votre cible, est order-only prérequis. Maintenant que vous avez entendu ce terme commander seulement Je veux que vous le remplaciez mentalement par le terme bien meilleur "existence seulement" (qui est complètement non officiel parce que je l'ai inventé) pour gagner une compréhension plus facile. sur commande Les prérequis sont écrits dans la liste des prérequis sur le côté droit d'un symbole de tube | et leur signification est la suivante: la cible de cette règle dépend de l'existence de cette condition préalable mais pas de son horodatage. C'est exactement ce que nous voulons d'une règle qui doit placer quelque chose dans un répertoire: si le répertoire existe, nous ne nous soucions pas de sa date (principalement parce que les répertoires Unix reçoivent un nouvel horodatage quand un nouveau fichier est créé) et nous continuons avec le reste des dépendances de cibles. Si toutefois le répertoire n'existe pas, exécutez d'abord sa règle, qui créera le répertoire:

.PHONY: all 
all: foo 
    @cat subdir/subsubdir/subsubsubdir/foo.txt 

subdir/subsubdir/subsubsubdir/foo.txt: | subdir/subsubdir/subsubsubdir 
    @echo This is file foo.txt > subdir/subsubdir/subsubsubdir/foo.txt 

subdir: 
    mkdir subdir 

subdir/subsubdir: | subdir 
    mkdir subdir/subsubdir 

subdir/subsubdir/subsubsubdir: | subdir/subsubdir 
    mkdir subdir/subsubdir/subsubsubdir 
+0

Salut Vroomfondel, Merci beaucoup. Maintenant, je sais à propos de la commande seulement par-requis et c'est très utile. – yathrakaaran

+0

Cependant dans mon cas, même si je fais 'setup' comme une commande seulement par-requisite, la commande shell est exécutée avant même que la commande ne reçoive l'erreur que 'find command n'a pas trouvé ./work ça va créer le même. – yathrakaaran

+0

Etrange, pour moi cela fonctionne. Utilisez-vous vraiment l'affectation 'DIR =' qui sera développée plus tard, ou utilisez-vous 'DIR: ='? BTW vous devriez renommer 'check'target en' work', car make exécute toujours cette règle si la cible n'est pas présente dans le système de fichiers. – Vroomfondel