是否可以为依赖项名称扩展%
两次?
我将项目拆分为几个部分,其中每个部分都在其自己的文件夹和同名文件中,例如
sections/first/first.c
,sections/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'.
有没有办法扩展%
两次?
答案 0 :(得分:2)
无法让%
扩展多次。如果您需要,您必须做一些更有趣的事情:您可以使用secondary expansion或eval
。例如,这应该有效:
.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
来设置可执行文件名等
请注意在cd
和make -f ...
周围使用parens,以便这些命令在“新”shell中运行,因此当make
退出时,执行位于原始顶级目录并准备循环以在下一个目录中再次完成所有操作。