我想弄清楚如何在 makefile 中使用环境变量。我有(某种)特定的用例,我需要执行以下步骤:
- 运行命令1
- 将 command2 的输出分配给 env 变量
- 运行 command3 读取步骤 2 中分配的环境变量
这是实现上述步骤的 makefile。但是,当我运行时它会打印一个空变量。我究竟做错了什么?当我在 bash 中运行这些命令时,它工作得很好)
答案1
美元符号由 make 使用,因此如果您希望将它们传递到 shell,则需要转义它们。你可以通过将它们加倍来做到这一点。
test:
@bash -c "\
echo 'need to run some program before assigning env variable';\
echo 'The make CC variable is set to :${CC}:';\
export TEST=\"\$$(date)\";\
echo 'printing env';\
echo \$${TEST};\
"
testwithout:
@echo 'need to run some program before assigning env variable';\
echo 'The make CC variable is set to :${CC}:';\
export TEST="$$(date)";\
echo 'printing env';\
echo $${TEST};
其他问题是由两次解释字符串引起的。make
获取配方,转换序列反斜杠换行符,并将结果提供给 shell 执行。当您使用双引号时,bash -c " .... "
这会导致 shell 扩展美元符号,因此您最终会得到 `bash -c "echo 'need ...' ;export TEST=Mon Sep...; echo ;"。添加一些反斜杠字符可以保护美元符号和内部双引号。
可能没有必要使用bash -c
.如无目标测试所示。您仍然需要将命令构建为一行。 Gnu make 具有.ONESHELL
使用单个 shell 来执行配方的功能,而不是每个逻辑行使用一个 shell,这使您可以避免扭曲。