我有这样的文件和目录结构:
.
├── Makefile
└── packages
├── Makefile
└── subdir
└── Makefile
和top Makefile看起来像这样:
define aa
make -C $1 $2
endef
packages=$(shell find ./packages -type d)
p1=$(filter-out . .., $(packages))
all:
$(foreach f,$(p1),$(call aa,$(f),compile))
和./packages/和./packages/subdir/中的Makefile都有“编译”目标。
我试图在“packages”子目录中自动调用所有Makefile,而不将它们单独添加到Makefile中。
当我在顶级目录中运行make时出现错误:
make -C ./packages compile make -C ./packages/subdir compile
make[1]: *** packages/subdir: No such file or directory. Stop.
Makefile:16: recipe for target 'all' failed
make: *** [all] Error 2
我想知道为什么make的两个调用(应该是单独的调用)放在一行中?
当我在“aa”宏的末尾添加行尾时,如下所示:
define aa
make -C $1 $2
endef
一切都按预期工作。 我的问题是为什么没有这个行结束时这个宏不起作用?
答案 0 :(得分:0)
因为变量定义在define
之后的换行符之后开始,并且在该行之前的换行符之前结束。
引用gnumake手册:
普通作业中的值不能包含换行符;但是,将定义值中的行分隔的换行符成为变量值的一部分(除了在该行之前的最终换行符,并且不被视为该行的一部分)。
所以你的定义相当于aa = make -C $1 $2
,因为foreach不会在每个扩展之间添加任何内容,所以你得到了这个结果。