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

如何在makefile中设置环境?

  •  7
  • polyglot  · 技术社区  · 16 年前

    setup library1
    setup library2
    source some_other_setup_script.bash
    g++ blah.c
    # setup is a executable on my system that run some scripts
    

    6 回复  |  直到 16 年前
        1
  •  6
  •   Matthew    9 年前

    如果变量导出没有像在命令行上那样工作,这表明Make正在选择一个与您正在使用的shell不同的shell,使用不同的语法来处理变量( export VAR=remember; echo $VAR /bin/sh 默认情况下,但您可以使用SHELL变量覆盖此选项,Make会这样做 export VAR=remember 再做一次实验。

        2
  •  11
  •   Dav Clark    10 年前

    您还可以使用GNU make的机制正确添加环境变量,如下所示:

    export TEST:="Something Good!"
    test:
        echo $$TEST
    

    TEST2:="Something not quite so useful?"
    test2:
        echo ${TEST2}
    

    我认为,在传递到外壳之前,内部的替换会做什么。请注意,export命令在目标块中不起作用,只是作为立即执行的命令不包含。

        3
  •  3
  •   DigitalRoss    16 年前

    最终,您需要在shell列表甚至脚本中定义变量并执行编译器,而不是在单独的脚本中 make 命令。不过,您可以添加一些改进。你看得出 制作 关于脚本:

    maintarget: script.sh blah.c
        source script.sh; g++ blah.c
    
    script.sh:
        setup include script here
    

    另一件事是在同一个shell中执行所有这些内容

    maintarget: blah.c
        run this; run that; run the other thing; g++ blah.c 
    

    制作 ; 列表位于同一个shell中,但始终可以使用 (list)

    不要忘记让适当的目标依赖于脚本本身。顺便说一句,有些 制作 版本( pmake bsd make )可以在定义make变量和的所有版本时执行命令 制作 然后出口这些。但我不这么认为 gmake

        4
  •  1
  •   Ted Mielczarek    16 年前

    您可以编写另一个shell脚本来执行所有这些命令,然后打印出可以使用的变量赋值。运行脚本,将其输出通过管道传输到一个文件,然后从Makefile中包含该文件。例如:

    all:
        echo $(FOO)
    
    test.mk: test.sh
        ./$< > $@
    
    include test.mk
    

    test.sh

    echo "FOO=1"
    

    在包含此Makefile的目录中运行“make”会生成:

    make: Entering directory `/home/luser/build/mktest'
    Makefile:7: test.mk: No such file or directory
    ./test.sh > test.mk
    make: Leaving directory `/home/luser/build/mktest'
    make: Entering directory `/home/luser/build/mktest'
    echo 1
    1
    make: Leaving directory `/home/luser/build/mktest'
    

    make通过运行shell脚本创建test.mk,然后将其包括在内。test.mk包含test.sh的输出,并被解析为Makefile。看见 http://www.gnu.org/software/make/manual/make.html#Include 更多细节。
    我们在Mozilla的client.mk中使用了一种变体,允许您在“mozconfig”文件中定义选项: http://mxr.mozilla.org/mozilla-central/source/client.mk#138

        5
  •  0
  •   ingyhere    13 年前

    重申:如何将shell变量放入make文件?

    比如:

    MYVAR := $(shell echo $(MYVAR)) <any_makefile_additions_here> 
    

        6
  •  0
  •   user1240076    12 年前

    可能有意思的是,为了覆盖已在makefile中定义的选项, make 支持(我指的是GNU Make 3.82,但其他版本可能也支持)选项 -e .

    生成文件:

    CC=gcc
    ...
    

    运行品牌:

    CC=gcc-4.7
    make -e