我正在努力编写一些复杂的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
。如何解决这两个问题?它们是我 makefiles 完成的最后两个难点。
谢谢!
参考:
1.《将 makefile 变量值分配给 bash 命令结果?》, 2014-06-19 访问,
<https://dev59.com/HXE95IYBdhLWcg3wSsCD>
VARIANTLIST_DETECTED
和variant_$cpu
。这些都是本地shell变量。然后你运行一个子make,并且没有以任何方式将这些变量传递给子make。因此,设置它们是完全无用的:即使你从未设置这些变量,你的makefile也会以完全相同的方式工作。除非你所做的事情比你展示的更多;如果是这样,如果你展示你真正想做什么,我们将能够给你更好的建议。 - MadScientist