2017-05-22 5 views
0

特定のパスの下にあるすべてのディレクトリのリストを取得し、ディレクトリ名を抽出して文字列に連結するmakefileコードを記述する必要があります。私は今のところしかし、これは、例えば、完全なディレクトリパスを返しますGNU Makefileディレクトリ名と連結文字列を取得する

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

でいる何 私は、bとcを取得し、foo-ためにそれらを連結できるようにする必要があり、ここから

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

ので、私は必要なもの

foo-a 
foo-b 
foo-c 

私は、例えば、GNUの機能をどうしようと何でもありpatsubstまたはbasenameの出力は

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 

ここで正しく呼び出されないものはわかりません。あなたが欲しい

答えて

2

結果は を使用せずにmakeによって計算可能である任意の目標やレシピ:

Makefileの(1)

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

のように実行される:

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

計算結果を次のようなレシピで使用します。

のMakefileのように実行します(2)

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

.PHONY: all 

all: 
    echo $(DIRS) 

:あなたは結果を出力にシェルスクリプトの からなるレシピでターゲットを書くことができ代わり

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

メイクファイル(3)

以下のように実行します
.PHONY: all 

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

:あなたができないことは何

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

はそれを行うための二つの方法をミックスです。 makeは、ターゲットのレシピが実行される前にその $(...)の評価を行っています。 がすべてのターゲットに対して実行され、$(...)評価が完了した後、 はシェルコマンドで構成されます。のみです。時間によってあなたのレシピ:

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

を実行します、それは次のとおりです。はっきりと失敗します

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

$(patsubst %\,,$$dir)は、それがレシピを解析時にmake によって評価と、$$dirのメイク拡大が$dirあり、そして$dir%\ため 一致がないことから、全体$(patsubst %\,,$$dir)表現 が$dirに評価し、交換されたので、それはありますレシピの$dirによって