0

これは以前に尋ねられたことがあることは知っていますが、ご容赦ください。run_testは、作成したいファイルの名前です。'makerun_test'として呼び出す方が好きです。make run_testを呼び出すたびに、prereqのmakefileが呼び出されるようにします。ただし、prereqのmakeを呼び出して、run_testを強制的に再構築する必要はありません。

run_test: build_prereq prereq_dir/prereq_ts
  rebuild_test.sh

.PHONY: build_prereq

build_prereq:
  make -C prereq_dir

prereq_dir / prereq_tsは、make -C prereq(prereq_dir / makefile)がprereqの依存関係が古く、prereqを再構築する必要があることを検出した場合に更新されます。

これに伴う問題は、rebuilt_test.shが常に呼び出されることです。これは、run_testの依存関係の1つが実行されているためだと思います(PHONYであるため)。

run_testを次のように変更することで、この問題を解決しました。

run_test:: build_prereq

run_test:: prereq_dir/prereq_ts
  rebuild_test.sh

.PHONY: build_prereq

build_prereq:
  make -C prereq_dir

これは良い解決策ですか?これは最初にbuild_prereqを実行し、次にprereq_dir / prereq_tsが更新された場合にrebuild_test.shを実行します(これは、必要に応じてbuild_prereqのmake呼び出しで発生します)。

これを行うためのより適切な方法はありますか?makeを直接呼び出すことができないため、追加のターゲットを作成したくありません。つまり、「makerun_test」です。

4

2 に答える 2

0

移植性を持たないことをいとわない場合、GNU makeは注文のみの前提条件(GNU makeマニュアルを参照)をサポートします。これは、まさにあなたが望むことを実行します。

run_test: | build_prereq

build_prereq:
        $(MAKE) -C prereq_dir

(サブメイクを呼び出すときは常に使用することに注意してください$(MAKE)。決して使用しないでくださいmake

于 2013-03-06T13:02:09.207 に答える
0

Makeはあなたが望むものを正確にサポートします。

.PHONY: build_prereq
build_prereq:
    ${MAKE} -C prereq_dir

prereq_dir/prereq_ts: build_prereq ; 

run_test: prereq_dir/prereq_ts
    rebuild_test.sh

だから、あなたはmakeにビルドするように頼みますrun_test

  1. prereq_dir/prereq_ts最新であることを確認するために、最初にのレシピを実行しbuild_prereqます。
  2. 次に、のレシピを実行しますprereq_dir/prereq_ts(これは何もしません。それを参照してください;)。
  3. ここで、のタイムスタンプをチェックして、古くなっているprereq_dir/prereq_tsかどうかを判断run_testします。

完全。

于 2013-03-06T16:35:25.853 に答える