我在訂單唯一的先決條件中遇到問題。這些首先根本不執行。我錯誤理解訂單唯一的先決條件的工作方式嗎?只有訂單的先決條件在GNU make中不能正常工作?
下面讓腳本:
.PHONY: mefirst mefirst2
mefirst:
@echo "I'm first!"
mefirst2:
@echo "I'm first too!"
normaltarget: normaltarget2 | mefirst2
@echo "normaltarget done"
normaltarget2: a b c
@echo "normaltarget2 done"
helloworld: normaltarget | mefirst
@echo "helloworld done"
.DEFAULT_GOAL := go
go: helloworld
@echo "go done"
a:
@echo a
b:
@echo b
c:
@echo c
...打印出以下幾點:
a
b
c
normaltarget2 done
I'm first too!
normaltarget done
I'm first!
helloworld done
go done
...什麼,而不是我所期望的:
I'm first!
I'm first too!
a
b
c
normaltarget2 done
normaltarget done
helloworld done
go done
上午什麼我做錯了?
謝謝你澄清Reinier。我首先嚐試了一下,但是在使用-j標誌和嚴格的並行性時它不起作用。 「myfirst」的先決條件將在下面的同時執行,因爲它們都是平行的,並且嘗試製作所有先決條件。 –
在這種情況下,如果你真的需要在y之前(重新)製作x,即使在平行的情況下,也必須使x本身成爲y的先決條件,而不是將它們放在同一行上。這正是前提條件列表的要求:指出哪個目標取決於哪個目標(並因此首先需要(重新)制定哪個目標)。但是,您的問題不夠詳細,無法爲您的案例提供確切的解決方案,因爲不清楚您的不同目標的依賴關係應該是什麼。有很多方法可以實現你的輸出。 –
對不起,但在許多重要方面,這個答案是錯誤的**。正如@喬治指出的那樣,構建的順序不是從左到右。如果你的makefile依賴於這個,那麼它就會被破壞。上述建議的錯誤是錯誤的。而且,'|'之後的前提條件是以完全正常的方式構建的。如果他們不是最新的,那麼他們的食譜將被運行。關鍵的區別在於,在這樣的更新之後,_make_將不會繼續運行原始目標的配方。這與普通的pre-reqs形成鮮明對比 - 如果這些需要更新,那意味着目標已過時。 – bobbogo