【发布时间】:2014-06-19 23:09:53
【问题描述】:
我正在尝试将一些复杂的 makefile 规则放在一起,以针对多个编译器自动构建项目。我有一个规则,它创建一些动态生成的变量并将变量分配给它们,然后将这些变量传递给调用以构建单独的规则。
.PHONY: all
all:
@echo "Detected CPULIST:${CPULIST_DETECTED}"
@echo "CPULIST:${CPULIST}"
@for cpu in $(CPULIST_DETECTED); do \
echo "CPU:$${cpu}:"; \
eval VARIANTLIST_DETECTED=$(shell 2>&1 find ./.build/linux/$$cpu -mindepth 1 -maxdepth 1 | grep -v '\.svn' | grep -v warning ); \
eval echo "Detected Variant List:$${VARIANTLIST_DETECTED}"; \
eval variant_$${cpu}=$${cpu}; \
eval echo "variant_\$${cpu}:\$${variant_$${cpu}}"; \
$(MAKE) build CPULIST=$${cpu}; \
done
.PHONY: build
build: sanity_check $(TARGET)
@true
我有两个问题。首先是,尽管通过$$cpu 对cpu 进行了双重转义,但它在该行中转换为null:
eval VARIANTLIST_DETECTED=$(shell 2>&1 find ./.build/linux/$$cpu -mindepth 1 -maxdepth 1 | grep -v '\.svn' | grep -v warning ); \
因此,find 命令在循环的每次迭代中搜索./.build/linux/,而不是像我预期的那样循环遍历./.build/linux/arm 和./.build/linux/x86。我已经包含了一个帖子,在下面的参考资料中对此进行了描述。我怀疑这可能会导致问题,因为我是在规则本身而不是在 makefile 的全局分配部分(在规则之前)尝试这样做。
另一个问题发生在完全相同的行。似乎shell 命令被评估,分配给VARIANTLIST_DETECTED,但随后VARIANTLIST_DETECTED 被执行,就像它是一个命令一样,因为我在构建过程中收到以下错误:
Detected CPULIST:arm x86
CPULIST:
CPU:arm:
/bin/sh: 3: ./.build/linux/x86: Permission denied
Detected Variant List:
variant_arm:arm
它试图在我的查询中运行第一个结果,就好像它是一个命令一样。该行也应该类似于./.build/linux/x86/so。
我该如何解决这两个问题?它们是阻碍我完成 makefile 的最后两根刺。
谢谢!
参考文献
-
将 makefile 变量值分配给 bash 命令结果?,于 2014 年 6 月 19 日访问,
<https://stackoverflow.com/questions/2373081/assign-a-makefile-variable-value-to-a-bash-command-result>
【问题讨论】: