2016-10-18 8 views
0

と仮定I以下のファイル階層があります。GNUは、各サブディレクトリを作る

Makefile 
dir1/ 
    script.sh 
    other_files.txt 
dir2/ 
    script.sh 
    other_stuff.dat 
dir3/ 
    script.sh 
    other_data.csv 

... script.sh(例えばecho "Hello world!"私の本当の例では、各dirを任意のメイクができ、出力を生成せずに実行するスクリプトです。 Rパッケージです)。

ディレクトリ内の何かが変更された場合にのみ、それぞれにscript.shを実行するMakefileを作成しようとしています。 script.shの各呼び出しはちょうど新しいrun.dirXファイル(例えばdir/script1.sh; touch run.dir1)をタッチして続いている

DIRS := dir1 dir2 dir3 
RUNFILES := $(DIRS:%=run.%) 

.PHONY: all ${DIRS} 

all: ${DIRS} 

dir2: dir3 

% : run.% 

run.% : $(wildcard %/*) 
    $(@D)/script.sh 
    touch [email protected] 

...:私はこれまで試したことはこれです。しかし、これは動作しません - make allを実行するだけでは、ターゲットがないと言う。

スクリプトをメイクファイル全体を生成させるという厄介な解決策がなければ、これを行うにはクリーンな方法が必要だと思われますが、それが何であるか分かりません。何かご意見は?

+0

あなたはと何も変わっていない場合にだけ、スクリプトを実行するようにしてくださいしたいですか?通常、Makeは何かが変更された場合にのみ、物事を行います。あなたが求めるものは可能ですが、解決策は厄介かもしれません。 – Beta

+0

私は、何かが変わったならば、典型的な方法で変化することを意味しました。それに応じて私の質問を改訂しました。 –

答えて

1

あなたはとても近くです。我々はいくつかの不要な手順を排除し、主なターゲットとしてrunfilesを持つことができます。

DIRS := dir1 dir2 dir3 
RUNFILES := $(DIRS:%=run.%) 

.PHONY: all 
all: $(RUNFILES) 

唯一のトリックは、私たちが前提リストにwildcardを置けば、作ることbuild--するターゲットかを決める前にそれを拡大する傾向がありますパターンルールがまだパターンルールであり、スキャンする "%"という名前のディレクトリがない場合。だから我々はそれがステムを選択した後にまで拡大を延期するようにしてください取得するSECONDEXPANSIONを使用して、余分な「$」:

.SECONDEXPANSION: 
run.%: $$(wildcard %/*) 
    @$*/script.sh 
    @touch [email protected] 
+0

'.SECONDEXPANSION' - これは何の魔術師ですか?ありがとう、これは美しく働いた! –