makefile – GNU Make获取由先前规则生成的目录中的所有文件的列
发布时间:2020-12-16 09:55:55 所属栏目:百科 来源:网络整理
导读:我正在寻找Makefile宏来获取目录中作为rule1处理生成并使用此列表进行规则2处理的所有文件的列表. 这是我想要实现的目标: 规则1:生成源.c文件(使用xml文件)并将它们放在$(MYDIR)目录中. 规则2:获取$(MYDIR)中所有文件的列表并创建目标文件并将它们放在$(O
我正在寻找Makefile宏来获取目录中作为rule1处理生成并使用此列表进行规则2处理的所有文件的列表.
这是我想要实现的目标: >规则1:生成源.c文件(使用xml文件)并将它们放在$(MYDIR)目录中. 问题是,我想在处理规则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 $@ $< $(SOURCES)显示为空,但实际上它应该包含generated_source1.c和generated_source2.c 解决方法
你不能真的(并且不是真的想)在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,$(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,$(xml:.xml=.c)): $(xml))) 如果输入和输出文件共享一个基本名称,那么这个.xml到.c步骤会更容易,因为你可以使用它并完成. %.c: %.xml cat $^ > $@ (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |