2013-03-05 49 views
0

我知道這已經被問過了,但請耐心等待。 run_test是我想要創建的文件的名稱。我更喜歡用'make run_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是,如果讓-C前提條件(prereq_dir/Makefile中)檢測前提條件的依賴是老前提條件需要重建更新。

這個問題是總是調用rebuilt_test.sh,我認爲這是因爲執行了run_test的依賴關係之一(因爲它是PHONY)。

run_test:: build_prereq 

run_test:: prereq_dir/prereq_ts 
    rebuild_test.sh 

.PHONY: build_prereq 

build_prereq: 
    make -C prereq_dir 

這是一個很好的解決方案:

我已經改變RUN_TEST來解決這個問題?這首先運行build_prereq,然後如果prereq_dir/prereq_ts被更新(如果需要,會在build_prereq的make調用中發生),然後運行rebuild_test.sh。

有沒有更正確的方法來做到這一點。我不想創建額外的目標,因爲它不允許直接調用make,即'make run_test'。

+0

這是有點不清楚。假設'prereq_dir/prereq_ts'沒有改變,但是'prereq'的先決條件有;應該讓'run_test'做任何事情? – Beta 2013-03-06 00:58:20

+0

不,run_test不應該重建。如果prereq更改的先決條件,則會觸及prereq_dir/prereq_ts,並且應該導致重建run_test。 – nachum 2013-03-06 01:16:53

回答

0

使支持完全符合您的要求。

.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是否過期。

完美。

0

如果你願意成爲非便攜,GNU make支持訂單僅先決條件(請參閱GNU使手動)你想這正是:

run_test: | build_prereq 

build_prereq: 
     $(MAKE) -C prereq_dir 

(注意:總是使用$(MAKE)調用子製作時,從不使用make

+0

不,這在'prereq_dir/prereq_ts'(i)可能在'build_prereq'運行時觸及並且(ii)是'run_test'的正常前置請求時不起作用。 – bobbogo 2013-03-06 16:27:10