makefile:函数调用中的变量求值?

时间:2014-04-23 23:01:35

标签: makefile

说我有这样的makefile:

DIRS=foo bar

我希望枚举这些目录的子目录中的文件,因此我可以将所有这些文件一次性传递给程序。这不起作用:

UNIT_FILES=()
find_units:
    for c in $(DIRS); do UNIT_FILES+=($(wildcard $(c)/systemd/*)); done

然而,这有效:

UNIT_FILES=()
find_units:
    UNIT_FILES+=($(wildcard foo/systemd/*))

所以我知道问题在于我对wildcard的调用中的变量评估。我已经尝试了相应的变体,包括$(c)$$c等,但我只是在黑暗中刺伤。

有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:2)

这里:

for c in $(DIRS); do UNIT_FILES+=($(wildcard $(c)/systemd/*)); done

你正在使用一个shell for-loop,它将被make:

调用
$(SHELL) -c "for c in $(DIRS); do UNIT_FILES+=($(wildcard $(c)/systemd/*)); done"

实际上没有任何内容扩展到UNIT_FILES,因为此命令不在Makefile级别执行。

使用make builtin function foreach

可以实现您想要的效果
UNIT_FILES += $(foreach DIR, $(DIRS), $(wildcard $(DIR)/systemd/*))

扩展为:

UNIT_FILES += $(wildcard foo/systemd/*) $(wildcard bar/systemd/*)