如何将文件名列表转换为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中创建呢?
示例:
./模块/ 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
./生成文件
....
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)
伊利亚安德
答案 0 :(得分:0)
假设您正在使用GNU make,您可以使用:
$(foreach name,$(subst .,_,$(subst /,_,$(C_SRC))),$(eval $(name)_opt := $($(name))))
我相信会做你想做的事。
答案 1 :(得分: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中的每个文件创建一个变量。
伊利亚安德