2013-03-22 52 views
1
BUILT_DIR = /tmp/obj 
SRC = /source/dir 

/tmp/obj/%/builtin.o : $(SRC)/%/*.c 
     gcc $^ -o [email protected] 

但是你要知道:通配符隱含規則的先決條件

爲了使圖案應用規則,它的目標模式必須考慮文件的名稱和它的所有先決條件(模式替換後)相匹配必須命名存在或可以製作的文件。

如果我執行make /tmp/obj/hfa/builtin.o,使會抱怨:

make: *** No rule to make target /tmp/obj/hfa/builtin.o」。 Stop.`

我怎樣才能修改Makefile,以滿足我的要求?

+0

製作只會在這種情況下抱怨,因爲沒有'/來源/目錄/ HFA/*。C'文件。由於不存在'.c'文件,因此不存在目標模式匹配,因此隱式規則不匹配。你的要求是什麼? – 2013-03-22 05:02:56

+0

我在'/ source/dir/hfa /'中有'hfa.c' – 2013-03-22 06:40:03

+0

你使用什麼版本的Make? (如果您不知道,請嘗試'make -v'。) – Beta 2013-03-22 12:19:08

回答

4

您可以使用二次發泡

BUILT_DIR = /tmp/obj 
SRC = /source/dir 
.SECONDEXPANSION: 
/tmp/obj/%/builtin.o : $$(wildcard $(SRC)/%/*.c) 
     gcc $^ -o [email protected] 
0

您所看到的錯誤表示有自%轉化爲hfa匹配的模式$(SRC)/hfa/*.c這是任何.c文件。所以不能使用你定義的規則。

使然後開始使用隱式規則來建設,它不會匹配。

最後放棄。

我剛剛證實,只有在$(SRC)/hfa目錄中沒有*.c文件時,我纔會得到相同的Makefile和相同的錯誤。

否則,我看到gcc命令得到執行。

從你的問題來看,你的要求不是很清楚。

+0

'* .c'是通配符。我在'$(SRC)/ hfa'中有'hfa.c'。只有當'/tmp/obj/%/builtin.o:$(SRC)/%/ hfa.c'才能成功。 – 2013-03-22 06:02:53

+0

@jianxisun - 你在問爲什麼只有在make make目標爲'/ tmp/obj/hfa/builtin.o'時才能成功?要回答這個問題,是的,因爲只有在這種情況下,你的規則纔會匹配。 – Tuxdude 2013-03-22 06:08:35

+0

爲什麼需求不能有通配符。如果寫入要求像'$(SRC)/%/ * c',make將不會匹配任何內容。我已經檢查了符合規則的$(SRC)/%/ hfa.c'。 – 2013-03-22 06:17:59