2017-05-22 1 views
0

Je dois écrire un code makefile qui obtiendrait une liste de tous les répertoires sous un chemin spécifique et extraire le nom de dir et le concaténer en une chaîne. Ce que j'ai à ce jour estGNU Makefile obtenir les noms de répertoire et la chaîne de concat

list-dir: 
    for dir in $(wildcard mypath/*/); do \ 
     echo $$dir ; \ 
    done 

Cependant ce retourne un chemin dir complet par exemple

mypath/a/ 
mypath/b/ 
mypath/c/ 

De là, je dois être en mesure d'obtenir a, b et c et les concaténer à Foo- donc ce que je dois est

foo-a 
foo-b 
foo-c 

Tout ce que j'essaie de faire avec les fonctions gnou, par exemple patsubst ou basename la sortie est

list-dir: 
    for dir in $(wildcard mypath/*/); do \ 
     echo $$dir ; \ 
     $(patsubst %\,,$$dir) ; \ 
    done 
mypath/a/: is a directory 
mypath/b/: is a directory 
mypath/c/: is a directory 

Je ne comprends pas ce qui n'est pas appelé correctement ici.

Répondre

2

Le résultat que vous voulez est calculable par make sans l'utilisation de une cible ou de la recette:

Makefile (1)

DIRS := $(patsubst %,foo-%,$(notdir $(wildcard mypath/*))) 
$(info $(DIRS)) 

qui fonctionne comme:

$ make 
foo-c foo-b foo-a 
make: *** No targets. Stop. 

Utilisez le résultat calculé dans une recette comme ceci:

Makefile (2)

DIRS := $(patsubst %,foo-%,$(notdir $(wildcard mypath/*))) 

.PHONY: all 

all: 
    echo $(DIRS) 

qui fonctionne comme:

$ make 
echo foo-c foo-b foo-a 
foo-c foo-b foo-a 

Sinon, vous pourriez écrire une cible avec une recette composée de script shell pour produire le résultat:

Makefile (3)

.PHONY: all 

all: 
    for d in $$(ls mypath); do \ 
     echo "foo-"$$d; \ 
    done 

qui fonctionne comme:

$ make 
for d in $(ls mypath); do \ 
    echo "foo-"$d; \ 
done 
foo-a 
foo-b 
foo-c 

Ce que vous ne pouvez pas faire est de mélanger les deux façons de le faire. make a effectué ses évaluations $(...) avant d'exécuter la recette pour toute cible. La recette qui est exécutée pour toute cible, après toutes ces évaluations $(...) sont effectuées, se compose de commandes shell, seulement. Au moment où votre recette:

list-dir: 
    for dir in $(wildcard mypath/*/); do \ 
     echo $$dir ; \ 
     $(patsubst %\,,$$dir) ; \ 
    done 

s'exécuter, il est:

for dir in mypath/c/ mypath/b/ mypath/a/; do \ 
    echo $dir ; \ 
    $dir ; \ 
done 

qui va clairement échouer.Et cela parce que $(patsubst %\,,$$dir) a été évaluée par make lorsqu'il analyse la recette et, étant donné que la marque d'expansion de $$dir est $dir, et il n'y a pas de match pour %\ dans $dir, toute expression $(patsubst %\,,$$dir) est évaluée à $dir, et est remplacé par $dir dans la recette.