1

如何将文件名列表转换为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

但是如何在makefile中制作呢?

例子:

./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 $@
    ....

./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)

伊利亚

4

2 回答 2

1

我对这个( 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 中的每个文件创建一个变量。

伊利亚

于 2013-07-19T01:15:28.700 回答
1

假设您使用的是 GNU make,您可以使用:

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

我相信会做你想做的事。

于 2013-07-18T13:09:13.377 回答