2013-07-18 56 views
0

如何將文件名列表轉換爲makefile中變量名稱集?如何將文件名列表轉換爲makefile中變量名稱集

例如,我的文件名列表和設置的變量:

filename := file1 file2 file3 ... 
    file1 := opt1 
    file2 := opt2 
    file3 := opt3 
    ... 
    ... 

,現在我要創建一套新的變量:

file1_opt := $(file1) 
    file2_opt := $(file2) 
    file3_opt := $(file3) 
    ... 
    ... 

怎麼辦呢Makefile中?

對於bash這很簡單:

for name in $(filenames) 
    do 
     $($(subst .,_,$(subst /,_,name)))_opt := $($(subst .,_,$(subst /,_,name))) 
    done 

但是,如何讓它在生成文件?

實施例:

./module/files.mk

C_SRC := a_file.c b_file.c 
    CPP_SRC := c_file.cpp d_file.cpp 

    a_file_c := -O2 
    b_file_c := -DN_DEBUG 

./Makefile

.... 

    SRCDIR := module 
    include makef.mk 
    .... 
    $(C_OBJ) : $(OBJDIR)/%.o : %.c 
     $(CC) -c $(C_FLAGS) $(C_FLAGS_$(subst .,_,$(subst /,_,$<))) $< -o [email protected] 
    .... 

./makef.mk

SAVE_C_SRC := $(C_SRC) 
    SAVE_CPP_SRC := $(CPP_SRC) 

    C_SRC := 
    CPP_SRC := 

    include $(SRCDIR)/files.mk 
    MK_DIRS += $(OBJDIR)/$(SRCDIR) 

    ----[ problem site ]---- 
    # this work for bash but not for make 
    for name in $(C_SRC) 
    do 
     C_FLAGS_$(SRCDIR)_$($(subst .,_,$(subst /,_,name))) := $($(subst .,_,$(subst /,_,name))) 
     $($(subst .,_,$(subst /,_,name))) := 
    done 
    ----[ end of problem site ]---- 


    SAVE_C_SRC += $(C_SRC:%=$(SRCDIR)/%) 
    SAVE_CPP_SRC += $(CPP_SRC:%=$(SRCDIR)/%) 

    C_SRC := $(SAVE_C_SRC) 
    CPP_SRC := $(SAVE_CPP_SRC) 

伊利亞安德

+0

您不能使用腳本來創建基於此列表的新的makefile嗎? –

回答

0

假設你使用了GNU make,你可以使用:

$(foreach name,$(subst .,_,$(subst /,_,$(C_SRC))),$(eval $(name)_opt := $($(name)))) 

,我相信會做你想要什麼。

0

在這個(http://www.gnu.org/software/make/manual/html_node/Foreach-Function.html)中,我被單詞「級聯[---]做出foreach的結果」混淆了:「結果是文本擴展的次數與列表中的空格分隔的單詞相同。將多個文本擴展連接在一起,並使用它們之間的空格來實現foreach的結果。「 (我被認爲「的foreach」的那個結果一根弦始終。)

但這:

clear_name = $(subst .,_,$(subst /,_,$(1))) 

    define rename_var 
    $(2)_$(call clear_name,$(SRCDIR))_$(call clear_name,$(1)) := $($(call clear_name,$(1))) 
    $(call clear_name,$(1)) := 
    endef 

    $(foreach name,$(C_SRC),$(eval $(call rename_var,$(name),C_FLAGS))) 

就是工作,使一個變量在C_SRC每個文件。

ilya

相關問題