2014-09-01 31 views
0

我試圖創建我發現這裏的目標是用於.D搜索依賴在必要條件列表中獲取目標名稱中的函數[生成文件]

多虧了答案一個makefile herehere.SECONDEXPANSION:完成這項工作。然而,我遇到了嵌套功能這個看起來奇怪的問題。違規的規則是這樣的:的

.SECONDEXPANSION: 
$(APPS): %: $$(patsubst %.c,%.o,$$(wildcard [email protected]/*.c)) $$(INC_OBJS) 
     $(CC) $(CFLAGS) $^ -o [email protected] 

代替:

gcc -Wall -std=c99 unittest.d/unittest.o common/cards.o -o unittest

這是我想要的,我得到:

gcc -Wall -std=c99 unittest.d/unittest.c common/cards.o -o unittest

由於某種原因沒有按」 t用.o代替.c。所以看來我幾乎在那裏,我只需要讓替代工作。所有的幫助表示讚賞,如果你認爲這是一個糟糕的方式來組織一個makefile,在這方面的批評歡迎。

回答

3

問題是,您試圖一次使用%作爲兩個不同的通配符,即靜態模式干涉和patsubst通配符。因此,請讓幹更換和得到這個:

$(patsubst unittest.c,unittest.o,$(wildcard [email protected]/*.c)) 

然後patsubst什麼也不做,因爲它沒有發現任何「unittest.c」來代替。 (請注意,「unittest.c」在「unittest.d/unittest.c」不匹配,因爲沒有一個通配符,patsubst尋找一個完美的比賽。)

沒有必要爲這是一個靜態的模式規則(你永遠不會使用該功能),所以你可以消除一部分,其餘應該工作:

.SECONDEXPANSION: 
$(APPS): $$(patsubst %.c,%.o,$$(wildcard [email protected]/*.c)) $$(INC_OBJS) 
    $(CC) $(CFLAGS) $^ -o [email protected] 
+0

是做到了!我想我明白你在說什麼,但爲什麼它不會變成'$(patsubst unittest.c,unittest.o,$(通配符$ @ .d/* .c))'?由於模式(目標)是單元測試? – Luis 2014-09-01 19:55:50

+0

@路易斯:對不起,我的錯誤,我太快瀏覽了這個問題。你說得對,我會編輯... – Beta 2014-09-01 20:04:51

相關問題