在 makefile 目标中使用 env 变量

在 makefile 目标中使用 env 变量

我想弄清楚如何在 makefile 中使用环境变量。我有(某种)特定的用例,我需要执行以下步骤:

  1. 运行命令1
  2. 将 command2 的输出分配给 env 变量
  3. 运行 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,这使您可以避免扭曲。

相关内容