在Makefile中定义

时间:2015-08-15 17:14:52

标签: makefile

我有这样的文件和目录结构:

.
├── 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

一切都按预期工作。 我的问题是为什么没有这个行结束时这个宏不起作用?

1 个答案:

答案 0 :(得分:0)

因为变量定义在define之后的换行符之后开始,并且在该行之前的换行符之前结束。

引用gnumake手册:

  

普通作业中的值不能包含换行符;但是,将定义值中的行分隔的换行符成为变量值的一部分(除了在该行之前的最终换行符,并且不被视为该行的一部分)。

所以你的定义相当于aa = make -C $1 $2,因为foreach不会在每个扩展之间添加任何内容,所以你得到了这个结果。