zoukankan      html  css  js  c++  java
  • MakeFile中export的使用

       在shell中,可以使用export修改当前进程的环境变量。

        例如:export PATH=.:$PATH

        将当前路径加入可执行文件查找路径(PATH)中,这样你就不要敲“./excutable” 来执行当前路径中的excutable。而只需要键入 “excutable” 就行了。

        make可以执行shell命令,当然也包括export。同时,make本身的语法,也含有export操作符。这样,在同一个Makefile中,两个export可能遵循完全不同的语法,shell命令语法和make语法,他们的作用也就完全不同。

    1)Makefile中shell版export

        小标题的意思是,这里的export是shell命令。它通常包含在Makefile的规则中,成为某规则的命令行的一部分。

        例如:

             init:
                 export DEBUG=1
                 ……
                 ……
             run: init
                 ./myapp
        第一条init规则的本意是设置环境变量DEBUG=1(可能作者想让以后启动的程序myapps在Debug模式下运行)。

    但是上述规则没有起到作者想要的作用:对后来启动的程序apps来说,DEBUG并没有改变。原因何在?
        首先,上面export行是shell命令;对每一行shell命令,make将启动一个新的进程执行这行shell命令

    由于新启动的子进程的环境变量完全跟父进程不相干,因此export并不能改变父进程的环境变量,进而也不能改变父进程以后启动的子进程,或曰“弟弟进程”的环境变量。


        正确的写法应该是:
             run:
                 export DEBUG=1 && ./myapp
        或者:
             run:
                 env DEBUG=1 ./myapp

    2)Makefile中make版export

        同上,小标题的意思是,这里的export完全是make语法中的操作符。它通常是用来向后来发起的make进程(这些后起的make进程由当前的make进程启动)传送变量

        例如:

             recursively_build:
                 $(MAKE) –c arch/src/ arch=x86_64
        而arch变量是文件arch/src/Makefile中的一个关键的开关变量,它将决定哪一种architecture的源文件将被编译链接。

    为了将变量arch传递给将要处理arch/src/Makefile的子make进程,需要用export:
                 export arch
        这里的export出来的变量arch将被子make进程继承。

  • 相关阅读:
    BZOJ_2002_[Hnoi2010]Bounce 弹飞绵羊_LCT
    BZOJ_4154_[Ipsc2015]Generating Synergy_KDTree
    BZOJ_2801_[Poi2012]Minimalist Security_dfs树+特判+乱搞
    BZOJ_3123_[Sdoi2013]森林_主席树+启发式合并
    2019集训队作业做题实况[1](1-30):
    牛客挑战赛33 F 淳平的形态形成场(无向图计数,EGF,多项式求逆)
    【NOIP2019模拟2019.10.07】果实摘取 (约瑟夫环、Mobius反演、类欧、Stern-Brocot Tree)
    CodeChef Max-digit Tree(动态规划)
    骚操作:c++如何用goto便捷地写人工栈?
    Comet OJ
  • 原文地址:https://www.cnblogs.com/pjl1119/p/9798773.html
Copyright © 2011-2022 走看看