说我有这样的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
等,但我只是在黑暗中刺伤。
有人能指出我正确的方向吗?
答案 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/*)