2017-11-07 33 views
2

ここでは、私がやろうとしていることの最小限の例を示します。再帰的に作成されたファイルへの依存

ディレクトリ構造:

. 
├── Makefile 
└── subdir 
    ├── a 
    └── Makefile 

./subdir/Makefile:

a.copy: a 
     cp a a.copy 

./Makefile:

.PHONY: build_subdir 

a.copy: subdir/a.copy 
     cp subdir/a.copy a.copy 
build_subdir: 
     $(MAKE) -C subdir 

subdir/a.copy: build_subdir 

私はmake初めて実行するとき、すべての罰金:

$ make    
make -C subdir 
make[1]: Entering directory `/home/kkourt/src/tests/make/subdir' 
cp a a.copy 
make[1]: Leaving directory `/home/kkourt/src/tests/make/subdir' 
cp subdir/a.copy a.copy 

再runingてのmakeは(何も起こりません)も結構です:

$ make 
make -C subdir 
make[1]: Entering directory `/home/kkourt/src/tests/make/subdir' 
make[1]: `a.copy' is up to date. 
make[1]: Leaving directory `/home/kkourt/src/tests/make/subdir' 

私はsubdir/aを更新した場合は、しかし、./aが更新されていない:

$ touch subdir/a  
$ make 
make -C subdir 
make[1]: Entering directory `/home/kkourt/src/tests/make/subdir' 
cp a a.copy 
make[1]: Leaving directory `/home/kkourt/src/tests/make/subdir' 

私はmakeをもう一度実行すると、 ./aが更新されます。

なぜこれが起こりますか? subdir/a.copya.copyより古いかどうかのチェックは行わないでください。の後にbuild_subdirのターゲットは終了していますか?これを修正する方法はありますか?

編集

マッドサイエンティストは、私はダミーのレシピを追加し、それが動作する、示唆したように:

subdir/a.copy: build_subdir 
    @: 
+1

これは一度だけビルド対象ですが、この「ダミー」レシピによって引き続きmakeがサブシェルを起動することに注意してください。また、そのコメントはmakeコメントとはみなされないので、サブシェルには 'true#dummy recipe'というテキストが送られます。ターゲットの性能を心配する場合は、空のレシピか、 '@:'のようなものを選択して、ノーオペレーションで、シェルを起動しません(ただし、タイムスタンプ)。 – MadScientist

+0

@MadScientistありがとう!私は答えを編集して、ノーオペレシピを含めました。私はあなたの元の答えからこれを選ぶのが好きです。何が起きているのかが分かりやすいからです。 – ynimous

答えて

3

あなたのルールsubdir/a.copy: build_subdirは何のレシピを持っていないので、makeはそれはない実際にことを「知っています」タイムスタンプをsubdir/a.copyに変更してください。

あなたは多分このように、それにダミーのレシピを追加する必要があります。

subdir/a.copy: build_subdir ; 

(注意私は今、この権利をテストすることはできませんが、私はそれがうまくいくと思います)。

関連する問題