2012-03-09 52 views
1

我有一個先決條件,我需要聲明的需要始終運行之前,我嘗試建立目標對象一個虛假的前提條件。它實際上並不生成文件。問題是,如果我宣佈它作爲目標本身的第一依賴,那麼假依賴於$ ^捲起和混淆連接的後續步驟。

下面是一個例子:

.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 

但是,這是直觀的,因爲現在如果我想建立一個給定的目標,我必須記住前面或後面附加一些其他字符串指向該目標名稱,以便在構建可執行文件之前運行開始代碼。

回答

3

你可能會考慮一個order-only prerequisite

sample-prog-1 : sample-prog-1.o | start 

除其他事項外,訂單隻有先決條件不會出現在$^

+0

正是我在找什麼,謝謝! – Michael 2012-03-09 22:42:08

+0

奇怪的是,使沒有運行我的命令,唯一的前提首先,雖然我不知道它是如何知道它可以擺脫這一點。但它確實搞亂了輸出,因爲現在我看到編譯的東西之前我回應了開始編譯的細節,這是開始的一件事情。 – Michael 2012-03-09 23:14:16

+0

如果你想有一個前提條件,以某事的構建運行之前,它需要的是東西前提條件。在這個例子中,'start'不是.o文件將的前提條件,所以(如果使用-j或同時)的.o文件將可能會先建。目前唯一隱含的順序是'start'在鏈接步驟之前運行。 – 2012-03-09 23:42:29

1

你可以把假目標的.o目標之後再使用$<代替$^

sample-prog-1 : sample-prog-1.o start 

%: %.o 
     echo "Building executable [email protected]";$(CC) $(LDFLAGS) $< $(LOADLIBES) $(LDLIBS) -o [email protected] $([email protected]) 

或者,如果你正在使用的GNU-make,使用內建filter得到公正的對象文件:

$(CC) $(LDFLAGS) $(filter %.o $^) $(LOADLIBES) $(LDLIBS) -o [email protected] 
+0

只要目標不需要多個目標文件,第一種方法就沒有問題。第二個是有效的,只有輕微kludgey。 +1 – Beta 2012-03-09 22:43:24

+0

在某些情況下,我有多個對象文件,因此必須使用第二種方法。這只是我嘗試的一個較短版本,我認爲它的問題仍然是它仍然會嘗試重新構建可執行文件,即使它不需要,因爲它認爲開始改變了。 – Michael 2012-03-09 23:45:53