我有一個先決條件,我需要聲明的需要始終運行之前,我嘗試建立目標對象一個虛假的前提條件。它實際上並不生成文件。問題是,如果我宣佈它作爲目標本身的第一依賴,那麼假依賴於$ ^捲起和混淆連接的後續步驟。
下面是一個例子:
.PHONY: start
sample-prog-1 : start sample-prog-1.o
在其他地方我有一個從目標文件建立一個可執行的規則:
%: %.o
echo "Building executable [email protected]";$(CC) $(LDFLAGS) $^ $(LOADLIBES) $(LDLIBS) -o [email protected] $([email protected])
問題是,「開始」是假目標,所以它不存在,但鏈接階段被稱爲「開始」作爲其中一個目標文件,所以構建過程呱呱叫!
我發現了一個變通辦法,這簡直是從對象的文件列表中去掉「開始」:
%: %.o
echo "Building executable [email protected]";$(CC) $(LDFLAGS) $(shell echo "$^" | sed s/start//g) $(LOADLIBES) $(LDLIBS) -o [email protected] $([email protected])
但除了似乎很哈克和醜陋,這也意味着我可以」沒有任何有「開始」的源文件。我總是重新構建sample-prog-1,因爲「開始」總是被重新制作。
這似乎只是錯誤的解決方案,但我在一個無所適從的「正確」的方式做到這一點。我想我應該做的事情,我分析出的可執行文件是這樣的:
sample-prog-1 : sample-prog-1.o
do_sample-prog-1 : start sample-prog-1
但是,這是直觀的,因爲現在如果我想建立一個給定的目標,我必須記住前面或後面附加一些其他字符串指向該目標名稱,以便在構建可執行文件之前運行開始代碼。
正是我在找什麼,謝謝! – Michael 2012-03-09 22:42:08
奇怪的是,使沒有運行我的命令,唯一的前提首先,雖然我不知道它是如何知道它可以擺脫這一點。但它確實搞亂了輸出,因爲現在我看到編譯的東西之前我回應了開始編譯的細節,這是開始的一件事情。 – Michael 2012-03-09 23:14:16
如果你想有一個前提條件,以某事的構建運行之前,它需要的是東西前提條件。在這個例子中,'start'不是.o文件將的前提條件,所以(如果使用-j或同時)的.o文件將可能會先建。目前唯一隱含的順序是'start'在鏈接步驟之前運行。 – 2012-03-09 23:42:29