【问题标题】:GNU Make get the list of all files in a directory that were generated by previous ruleGNU Make 获取目录中由先前规则生成的所有文件的列表
【发布时间】:2015-01-11 18:16:41
【问题描述】:

我正在寻找 Makefile 宏来获取目录中所有文件的列表,这些文件是作为规则 1 处理生成的,并将此列表用于规则 2 处理。

这是我想要达到的目标:

  • 规则一:生成源.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.cgenerated_source2.c 我不确定.SECONDEXPANSION 规则如何适用于我的情况。

【问题讨论】:

    标签: makefile


    【解决方案1】:

    你不能真的(也不想)在 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)))
    

    如果输入和输出文件共享一个基本名称,那么 .xml.c 的这一步会更容易,因为您可以使用它并完成。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-07
      • 1970-01-01
      • 2018-08-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多