为依赖性扩展模式两次

时间:2016-01-03 10:39:52

标签: c makefile

是否可以为依赖项名称扩展%两次?

我将项目拆分为几个部分,其中每个部分都在其自己的文件夹和同名文件中,例如

sections/first/first.csections/hello/hello.c

现在我想为每个部分构建另一个文件夹build中的目标;我提出了以下

SECTIONS = $(wildcard sections/*/*.c)
TARGETS = $(addprefix build/,$(notdir $(SECTIONS)))

$(TARGETS): build/%.c: sections/%/%.c
    # do something

但问题是%只展开一次,所以我最终会出错

make: *** No rule to make target 'sections/first/%.c', needed by 'build/first.o'.

有没有办法扩展%两次?

2 个答案:

答案 0 :(得分:2)

无法让%扩展多次。如果您需要,您必须做一些更有趣的事情:您可以使用secondary expansioneval。例如,这应该有效:

.SECONDEXPANSION:
$(TARG) : build/%.c : source/$$*/$$*.c
        @echo copy $< $@

要进行更深入的讨论,您可以查看these blog posts

答案 1 :(得分:0)

SECTIONS = $(wildcard sections/*)

.PHONY: all

all: $(SECTIONS)
    $(foreach dir,$(SECTIONS), \
    ( cd $d && $(MAKE) -f ../makefile.bot name=$(dir) all ); )

上面的位置是顶级makefile 第二个makefile(在本例中为makefile.bot)执行实际工作。

与干净安装的all规则类似的规则将在顶级makefile中,但目标将从all更改为clean

makefile.bot将使用$name来设置可执行文件名等

请注意在cdmake -f ...周围使用parens,以便这些命令在“新”shell中运行,因此当make退出时,执行位于原始顶级目录并准备循环以在下一个目录中再次完成所有操作。