Makefile GNU Make获取目录中由上一条规则生成的所有文件的列表

Makefile GNU Make获取目录中由上一条规则生成的所有文件的列表,makefile,Makefile,我正在寻找Makefile宏,以获取目录中作为rule1处理生成的所有文件的列表,并将此列表用于rule2处理 以下是我努力实现的目标: 规则1:生成源.c文件(使用xml文件)并将它们放在$(MYDIR)目录中 规则2:获取$(MYDIR)中所有文件的列表,创建目标文件并将其放置在$(OBJDIR)中 问题是,我想在处理规则1后更新规则2中的文件列表,否则$(MYDIR)中的文件列表将为空 all : rule_1 rule_2 rule1 : $(MYDIR)/generated_so

我正在寻找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 $@ $<
all:规则1规则2
规则1:$(MYDIR)/生成的\u source1.c$(MYDIR)/生成的\u source2.c
$(MYDIR)/生成的\u source1.c:
xsltproc generator1.xml style_generator.xsl-o$(MYDIR)/generated_source_1.c
$(MYDIR)/生成的\u source2.c:
xsltproc generator2.xml style_generator.xsl-o$(MYDIR)generated_source_2.c
#获取所有$(MYDIR)的列表。*c,创建相应的$(OBJDIR)/*.o列表。
来源:=$(通配符$(MYDIR)/*.c)
对象:=$(notdir${SOURCES})
生成的_OBJS:=$(patsubst%.c,$(OBJDIR)/%.o,$(对象))
#此规则是编译规则1中生成的所有.c。
规则2:$(生成的对象)
ld-r-o$(OBJDIR)/generated_lib.o$(generated_OBJS)
$(OBJDIR)/%.o:$(MYDIR)/%.c
gcc$(CFLAGS)-c-o$@$<
$(SOURCES)
显示为空,但实际上它应该包含
生成的\u source1.c
生成的\u 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
规则需要一些额外的魔法才能真正正常工作。您需要定义特定的输入/输出对,以便该规则正确使用它们

$(foreach xml,$(XML_SOURCES),$(eval $(subst generator,generated_source,$(xml:.xml=.c)): $(xml)))
如果输入和输出文件共享一个basename,那么从
.xml
.c
这一步会更容易,因为您可以使用它来完成

%.c: %.xml
        cat $^ > $@