代码之家  ›  专栏  ›  技术社区  ›  qweruiop

make命令前后的变量赋值

  •  6
  • qweruiop  · 技术社区  · 6 年前

    make 可以将变量赋值作为其命令行的一部分。是 DEBUG=1 make 与…一样 make DEBUG=1 ? 使用这个简单的Makefile,两个 echo 1 .

    $ cat Makefile
    all:
            echo ${DEBUG}
    

    很明显,在后一种情况下, DEBUG=1 是论点的一部分 制作 ,但第一个似乎只是shell中的变量赋值。所以我想 制作 获取不同的值。对差异进行一些澄清将很有帮助。

    1 回复  |  直到 6 年前
        1
  •  7
  •   jfMR    6 年前

    DEBUG=1 make 与…一样 make DEBUG=1 ?

    不是真的。

    • 在里面 调试=1 make : make 环境 . 也就是说,shell设置变量 DEBUG 然后 制作 并且它(正在运行的进程 制作 )继承该环境变量。
    • 在里面 使调试=1 : 制作 命令行 (即: 制作 设置变量本身)。

    相关差异

    从命令行获取的变量 推翻 从环境中获得的变量。即,在:

    DEBUG=0 make DEBUG=1
    

    调试 1 0 .

    还要注意,从命令行获得的变量 推翻 在makefile中设置的变量(除非 override 指令),而环境变量不使用(除非选项 -e or --environment-override 已传递给 制作 ).

    因此,如果makefile设置一个名为 调试 如下所示:

    DEBUG = 0
    all:
        @echo ${DEBUG}
    

    然后:

    make DEBUG=1
    

    回声 1. ,鉴于:

    DEBUG=1 make
    

    回声 0 .


    这个 origin 内置功能

    您可以使用 origin 内置函数,用于找出变量的来源。考虑对makefile进行以下修改:

    $ cat Makefile
    all:
        @echo DEBUG is from $(origin DEBUG)
    

    然后:

    $ make DEBUG=1
    DEBUG is from command line
    

    但是:

    $ DEBUG=1 make
    DEBUG is from environment