GNU Make获取由先前规则生成的目录中的所有文件的列表

Nei*_*lue 4 makefile

我正在寻找Makefile宏来获取目录中作为rule1处理生成并使用此列表进行规则2处理的所有文件的列表.

这是我想要实现的目标:

  • 规则1:生成源.c文件(使用xml文件)并将它们放在$(MYDIR)目录中.
  • 规则2:获取所有文件的列表$(MYDIR)并创建目标文件并将其放入$(OBJDIR).

问题是,我想在处理规则1后更新Rule2中的文件列表,否则文件列表$(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 $@ $<
Run Code Online (Sandbox Code Playgroud)

$(SOURCES)显示为空,但实际上它应该包含generated_source1.c,generated_source2.c 我不知道.SECONDEXPANSION规则将如何适用于我的情况.

Eta*_*ner 8

你不能真的(并且不是真的想)在make过程的运行过程中使用make来重新评估文件的存在.

您要做的是在make中从头到尾跟踪文件,然后列出所有列表.

您可以从任一方向开始,但从初始源开始往往更容易.

所以从一开始

MYDIR:=dir
OBJDIR:=obj

XML_SOURCES := $(wildcard $(MYDIR)/*.xml)
Run Code Online (Sandbox Code Playgroud)

然后从那里翻译到生成的源文件

SOURCES := $(subst generator,generated_source,$(XML_SOURCES:.xml=.c))
Run Code Online (Sandbox Code Playgroud)

从那里到生成的目标文件

GENERATED_OBJS := $(patsubst $(MYDIR)/%.c,$(OBJDIR)/%.o,$(SOURCES))
Run Code Online (Sandbox Code Playgroud)

此时您可以定义默认目标

all: $(OBJDIR)/generated_lib.o
Run Code Online (Sandbox Code Playgroud)

然后定义每个步骤的规则

$(MYDIR)/%.c:
        cat $^ > $@

$(OBJDIR)/%.o: $(MYDIR)/%.c
        cat $^ > $@

$(OBJDIR)/generated_lib.o: $(GENERATED_OBJS)
        ld -r -o $@ $^
Run Code Online (Sandbox Code Playgroud)

$(MYDIR)/%.c规则需要一些额外的魔力才能真正正常工作.您需要定义特定的输入/输出对,以便该规则正确使用它们.

$(foreach xml,$(XML_SOURCES),$(eval $(subst generator,generated_source,$(xml:.xml=.c)): $(xml)))
Run Code Online (Sandbox Code Playgroud)

.xml.c步骤如果输入和输出文件共享的基本名称,你可以就用这个和做会更容易.

%.c: %.xml
        cat $^ > $@
Run Code Online (Sandbox Code Playgroud)