2013-11-01 50 views
1

多個可執行文件要構建從同一來源的多個可執行文件,我必須用不同的編譯器開關每個源文件的翻譯。對於每個變體,我都有一組要定義的定義。我想將生成的對象文件存儲到不同的子文件夾中。我有一個變量,保留所有變體的所有對象文件。現在我有問題要定義一個適當的靜態規則,以從源頭上構建的目標文件:產生來自相同來源

SOURCEEXT=.c 
ALL_OBJECT_FILES := abcdefg/cctalkio.o tollcoll/cctalkio.o 
source-from-object = $(addsuffix $(SOURCEEXT),$(basename $(notdir $(1)))) 

$(ALL_OBJECT_FILES): %.o: $(call source-from-object,%.o) 
    @echo $*.o 

當我運行make abcdefg/cctalkio.o,我得到:

make: *** No rule to make target 'abcdefg/cctalkio.c', needed by 'abcdefg/cctalkio.o'. Schluss. 

同樣的,當我simpify的規則:

abcdefg/cctalkio.o: %.o: $(call source-from-object,%.o) 
    @echo $*.o 

但是,當我改變規則:

abcdefg/cctalkio.o: %.o: $(call source-from-object,abcdefg/cctalkio.o) 
    @echo $*.o 

我得到abcdefg/cctalkio.o作爲輸出。所以幹似乎是abcdefg/cctalkio,從而%.o應該是一樣的abcdefg/cctalkio.o。但是爲什麼兩種情況下的表現都不一樣?

當我「調試」源從對象功能:

debug: 
    @echo $(call source-from-object,/abcdefg/cctalkio.o) 

我得到預期的結果cctalkio.c,所以它看起來像功能正在工作。

+1

棒的'$(信息源從對象參數:$ 1)'在你的源從對象功能的線路之一的開始,看看我在我的答案議論紛紛。 –

+0

不錯,我有'%.o' :-) –

回答

1

$(call)的前提條件是立即發生的事情,所以你的函數實際上,傳入%的.o(不匹配的結果如你預期)。

你將不得不使用這樣的:

.SECONDEXPANSION: 
abcdefg/cctalkio.o: %.o: $$(call source-from-object,%.o) 
     ... 

得到你想要什麼,我相信。

或者你很可能在你的目標文件迴路和靜態給他們正確的必備條件,只是讓靜態模式規則供給人體。

+0

感謝您解釋問題。我想我明白了。你的解決方案對我而言並不適用,但是'$(ALL_OBJECT_FILES):%.o:$(調用source-from-object,$(%。o))似乎可以做到這一點:-)(即使沒有.SECONDEXPANSION) –

+0

我的解決方案不起作用?我不知道我看到你的工作方式,但如果你說的確如此,那肯定會有的。你爲此使用了什麼? –

+0

隨着你的解決方案,我得到'***沒有規則,使'tollcoll/cctalkio.o'所需的'$(call)'目標。 Stop.' –