ここでは、私がやろうとしていることの最小限の例を示します。再帰的に作成されたファイルへの依存
ディレクトリ構造:
.
├── 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.copy
がa.copy
より古いかどうかのチェックは行わないでください。の後にbuild_subdir
のターゲットは終了していますか?これを修正する方法はありますか?
編集:
マッドサイエンティストは、私はダミーのレシピを追加し、それが動作する、示唆したように:
subdir/a.copy: build_subdir
@:
これは一度だけビルド対象ですが、この「ダミー」レシピによって引き続きmakeがサブシェルを起動することに注意してください。また、そのコメントはmakeコメントとはみなされないので、サブシェルには 'true#dummy recipe'というテキストが送られます。ターゲットの性能を心配する場合は、空のレシピか、 '@:'のようなものを選択して、ノーオペレーションで、シェルを起動しません(ただし、タイムスタンプ)。 – MadScientist
@MadScientistありがとう!私は答えを編集して、ノーオペレシピを含めました。私はあなたの元の答えからこれを選ぶのが好きです。何が起きているのかが分かりやすいからです。 – ynimous