GNU Make 获取目录中由先前规则生成的所有文件的列表
GNU Make get the list of all files in a directory that were generated by previous rule
我正在寻找 Makefile 宏来获取目录中作为 rule1 处理生成的所有文件的列表,并将此列表用于 rule2 处理。
这是我想要实现的目标:
- 规则 1:生成源
.c
文件(使用 xml 文件)并将它们放在 $(MYDIR)
目录中。
- 规则2:获取
$(MYDIR)
中所有文件的列表并创建目标文件并将它们放置在$(OBJDIR)
中。
问题是,我想在处理完规则 1 后更新规则 2 中的文件列表,否则 $(MYDIR)
中的文件列表将为空。
all : rule_1 rule_2
rule1 : $(MYDIR)/generated_source1.c $(MYDIR)/generated_source2.c
$(MYDIR)/generated_source1.c:
xsltproc generator1.xml style_generator.xsl -o $(MYDIR)/generated_source_1.c
$(MYDIR)/generated_source2.c:
xsltproc generator2.xml style_generator.xsl -o $(MYDIR)generated_source_2.c
#Get list of all $(MYDIR).*c , create corresponding $(OBJDIR)/*.o list.
SOURCES := $(wildcard $(MYDIR)/*.c)
OBJECTS := $(notdir ${SOURCES})
GENERATED_OBJS := $(patsubst %.c,$(OBJDIR)/%.o,$(OBJECTS))
#This rule is compiling of all .c generated in rule1.
rule2 : $(GENERATED_OBJS)
ld -r -o $(OBJDIR)/generated_lib.o $(GENERATED_OBJS)
$(OBJDIR)/%.o: $(MYDIR)/%.c
gcc $(CFLAGS) -c -o $@ $<
$(SOURCES)
显示为空,但实际上它应该包含 generated_source1.c
和 generated_source2.c
我不确定 .SECONDEXPANSION
规则如何适用于我的案例。
你真的不能(也不想)在 make 过程的 运行 期间让 make 重新评估文件存在。
你想要做的是在 make 中从头到尾跟踪文件,然后你就有了所有的列表。
您可以从任一方向开始,但从初始源开始往往更容易。
所以从
开始
MYDIR:=dir
OBJDIR:=obj
XML_SOURCES := $(wildcard $(MYDIR)/*.xml)
然后从那里翻译成生成的源文件
SOURCES := $(subst generator,generated_source,$(XML_SOURCES:.xml=.c))
然后从那里到生成的目标文件
GENERATED_OBJS := $(patsubst $(MYDIR)/%.c,$(OBJDIR)/%.o,$(SOURCES))
此时您可以定义默认目标
all: $(OBJDIR)/generated_lib.o
然后定义每一步的规则
$(MYDIR)/%.c:
cat $^ > $@
$(OBJDIR)/%.o: $(MYDIR)/%.c
cat $^ > $@
$(OBJDIR)/generated_lib.o: $(GENERATED_OBJS)
ld -r -o $@ $^
$(MYDIR)/%.c
规则需要一些额外的魔法才能真正正常工作。您需要定义特定的 input/output 对,以便该规则正确使用它们。
$(foreach xml,$(XML_SOURCES),$(eval $(subst generator,generated_source,$(xml:.xml=.c)): $(xml)))
如果输入和输出文件共享一个基本名称,这个 .xml
到 .c
的步骤会更容易,因为您可以使用它并完成。
%.c: %.xml
cat $^ > $@
我正在寻找 Makefile 宏来获取目录中作为 rule1 处理生成的所有文件的列表,并将此列表用于 rule2 处理。
这是我想要实现的目标:
- 规则 1:生成源
.c
文件(使用 xml 文件)并将它们放在$(MYDIR)
目录中。 - 规则2:获取
$(MYDIR)
中所有文件的列表并创建目标文件并将它们放置在$(OBJDIR)
中。
问题是,我想在处理完规则 1 后更新规则 2 中的文件列表,否则 $(MYDIR)
中的文件列表将为空。
all : rule_1 rule_2
rule1 : $(MYDIR)/generated_source1.c $(MYDIR)/generated_source2.c
$(MYDIR)/generated_source1.c:
xsltproc generator1.xml style_generator.xsl -o $(MYDIR)/generated_source_1.c
$(MYDIR)/generated_source2.c:
xsltproc generator2.xml style_generator.xsl -o $(MYDIR)generated_source_2.c
#Get list of all $(MYDIR).*c , create corresponding $(OBJDIR)/*.o list.
SOURCES := $(wildcard $(MYDIR)/*.c)
OBJECTS := $(notdir ${SOURCES})
GENERATED_OBJS := $(patsubst %.c,$(OBJDIR)/%.o,$(OBJECTS))
#This rule is compiling of all .c generated in rule1.
rule2 : $(GENERATED_OBJS)
ld -r -o $(OBJDIR)/generated_lib.o $(GENERATED_OBJS)
$(OBJDIR)/%.o: $(MYDIR)/%.c
gcc $(CFLAGS) -c -o $@ $<
$(SOURCES)
显示为空,但实际上它应该包含 generated_source1.c
和 generated_source2.c
我不确定 .SECONDEXPANSION
规则如何适用于我的案例。
你真的不能(也不想)在 make 过程的 运行 期间让 make 重新评估文件存在。
你想要做的是在 make 中从头到尾跟踪文件,然后你就有了所有的列表。
您可以从任一方向开始,但从初始源开始往往更容易。
所以从
开始MYDIR:=dir
OBJDIR:=obj
XML_SOURCES := $(wildcard $(MYDIR)/*.xml)
然后从那里翻译成生成的源文件
SOURCES := $(subst generator,generated_source,$(XML_SOURCES:.xml=.c))
然后从那里到生成的目标文件
GENERATED_OBJS := $(patsubst $(MYDIR)/%.c,$(OBJDIR)/%.o,$(SOURCES))
此时您可以定义默认目标
all: $(OBJDIR)/generated_lib.o
然后定义每一步的规则
$(MYDIR)/%.c:
cat $^ > $@
$(OBJDIR)/%.o: $(MYDIR)/%.c
cat $^ > $@
$(OBJDIR)/generated_lib.o: $(GENERATED_OBJS)
ld -r -o $@ $^
$(MYDIR)/%.c
规则需要一些额外的魔法才能真正正常工作。您需要定义特定的 input/output 对,以便该规则正确使用它们。
$(foreach xml,$(XML_SOURCES),$(eval $(subst generator,generated_source,$(xml:.xml=.c)): $(xml)))
如果输入和输出文件共享一个基本名称,这个 .xml
到 .c
的步骤会更容易,因为您可以使用它并完成。
%.c: %.xml
cat $^ > $@