代码之家  ›  专栏  ›  技术社区  ›  Chris G.

是否可以在Makefile中设置环境变量-之后使用

  •  1
  • Chris G.  · 技术社区  · 6 年前

    我试图在Makefile中设置一个环境变量,这样它就可以在samshell中运行的另一个程序中使用 make 制作 已经跑了。

    步骤:

    1. 运行 make test export TEST_ENV_ONE=OneString
    2. 运行另一个程序,可以读取 TEST_ENV_ONE

    不工作:

    test:
        export TEST_ENV_ONE=OneString
        $(shell export TEST_ENV_TWO=TwoString)
    

    之后这是空的:

    echo $TEST_ENV_ONE
    echo $TEST_ENV_TWO
    
    2 回复  |  直到 5 年前
        1
  •  3
  •   Renaud Pacalet    5 年前

    如果希望将环境变量导出到从中调用的shell,则会有点困难,因为如所述,不能直接从子进程导出环境变量( make )到其父进程(从中调用的shell 制作 ). 但如果你同意这样做:

    eval "$(make)"
    

    那么它确实是可能的:只是回声 export VARIABLE1=VALUE1; export VARIABLE2=VALUE2; ...

    $ cat Makefile
    export TEST_ENV_ONE := OneString
    
    all:
        @printf 'make variable TEST_ENV_ONE = %s\n' "$(TEST_ENV_ONE)" 1>&2
        @printf 'in-recipe shell variable TEST_ENV_ONE = %s\n' "$$TEST_ENV_ONE" 1>&2
        @printf 'export TEST_ENV_ONE="%s"\n' '$(TEST_ENV_ONE)'
    
    $ unset TEST_ENV_ONE
    $ printenv TEST_ENV_ONE
    $ eval "$(make)"
    make variable TEST_ENV_ONE = OneString
    in-recipe shell variable TEST_ENV_ONE = OneString
    $ printenv TEST_ENV_ONE
    OneString
    

    make中的变量可以来自运行make的环境。 每一个环境变量,使看到当它启动是 转换为具有相同名称和值的make变量。 参数,重写环境。(如果指定了-e标志, 然后,来自环境的值将覆盖makefile中的赋值。

    因此,除非变量的值是make自身复杂计算的结果,否则获得相同结果的更自然的方法是在父shell中定义环境变量,并像在Makefile中一样使用它:

    $ cat Makefile
    all:
        @printf 'make variable TEST_ENV_ONE = %s\n' "$(TEST_ENV_ONE)"
        @printf 'in-recipe shell variable TEST_ENV_ONE = %s\n' "$$TEST_ENV_ONE"
    
    $ export TEST_ENV_ONE=OneString
    $ make
    make variable TEST_ENV_ONE = OneString
    in-recipe shell variable TEST_ENV_ONE = OneString
    $ printenv TEST_ENV_ONE
    OneString
    
        2
  •  9
  •   jfMR    6 年前

    你的 export TEST_ENV_ONE=OneString 上面是在一个专用的shell中运行的。随后的命令在其他shell实例中运行。因此,它们不会继承环境变量 TEST_ENV_ONE .


    您可以使用顶级(即,不在目标配方中) export directive 在makefile中:

    export env_var := MyEnvVariable
    
    .PHONY: all
    all:
        echo env_var: $$env_var
    

    这样,变量 env_var

    如果你跑了 make 使用上面的makefile:

    $ make
    echo env_var: $env_var
    env_var: MyEnvVariable
    

    从输出中可以看到,运行的shell echo env_var: $env_var 有变量吗 环境变量 在它的环境中。