【问题标题】:How to use environment variables defined inside a makefile?如何使用在makefile中定义的环境变量?
【发布时间】:2020-01-02 09:27:09
【问题描述】:

我目前有一个看起来像这样的 Makefile:

some_process:
    VAR1=1
    VAR2=2

    python3 ./main.py --arg1 /home/user1/something/ \
                      --arg2 $VAR1 \
                      --arg3 $VAR2

当我运行这段代码时,我得到了错误:

main.py: error: argument --arg2: expected one argument

我尝试在 VAR1VAR2 周围使用括号,但我注意到如果我这样做,那么 Makefile 将无法识别(?)参数。我也尝试转义 $ 符号(即$$VAR1),但这也不起作用。

将 Makefile 用于环境变量的正确方法是什么?谢谢。

编辑

以防万一原始问题不清楚,我正在使用 Makefile 来复制我通常在命令行中执行的操作:

user@thing:$ export VAR1=1
user@thing:$ export VAR2=2
user@thing:$ python3 ./main.py --arg1 /home/user1/something --arg2 $VAR1 --arg3 $VAR2

【问题讨论】:

  • 你试过这样吗:$(VAR1)
  • 是的,我有。这实际上就是我所说的“括号”。我试过括号和大括号,但都不起作用。 :(
  • 您是否尝试将变量导出到 makefile 中?
  • @Phantom 我实际上没有尝试过,我不知道这是可能的。我会研究一下。

标签: makefile


【解决方案1】:

显示的代码有两个基本问题...

some_process:
    VAR1=1
    VAR2=2

    python3 ./main.py --arg1 /home/user1/something/ \
                      --arg2 $VAR1 \
                      --arg3 $VAR2

首先,make 在其自己的 shell 中从规则的命令部分运行每一行。所以VAR1=1 在shell 中运行,然后实际上丢失了。其次,$VAR1 等标记将由make 而不是shell 扩展。在这种情况下——因为没有括号——$VAR1 将被make 解释为$(V)AR1。即变量V 的值后跟文本AR1。您可以使用$$ 强制make 忽略扩展。

考虑到以上所有因素,您可以尝试(未经测试)...

some_process:
    VAR1=1; \
    VAR2=2; \
    python3 ./main.py --arg1 /home/user1/something/ \
                      --arg2 $$VAR1 \
                      --arg3 $$VAR2

【讨论】:

    【解决方案2】:

    首先,作为@G.M.指出,make 在单独的子 shell 中运行规则中的每个命令;所以单独行中的变量分配将不起作用。还要注意变量引用格式。 $(VAR1)${VAR1} 如果需要扩展make$$VAR1 如果需要在子shell 中扩展。

    话虽如此,您可以将VAR1VAR2 定义为make 变量和export 以使它们可用于您的some_process 规则。

    VAR1 := 1
    VAR2 := 2
    
    export VAR1 VAR2
    
    some_process:
        python3 ./main.py --arg1 /home/user1/something/ \
            --arg2 $$VAR1 \
            --arg3 $$VAR2
    

    这样,您可以在需要时在调用规则时覆盖变量值。

    $ make some_process VAR2=22
    

    顺便说一句,由于您明确地将变量作为命令行参数提供给您的 python 脚本,它们不需要是exported;所以以下应该可以正常工作。

    VAR1 := 1
    VAR2 := 2
    
    some_process:
        python3 ./main.py --arg1 /home/user1/something/ \
            --arg2 $(VAR1) \
            --arg3 $(VAR2)
    

    【讨论】:

    • 最后一个例子是我认为最“make-ish”的解决方案。另外,您可以轻松更改这些值,而无需编辑您的 makefile,只需运行 make VAR1=7 等即可。
    猜你喜欢
    • 2014-04-09
    • 1970-01-01
    • 2017-03-17
    • 2016-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-21
    • 2015-05-07
    相关资源
    最近更新 更多