Chinaunix首页 | 论坛 | 博客
  • 博客访问: 369340
  • 博文数量: 124
  • 博客积分: 30
  • 博客等级: 民兵
  • 技术积分: 11
  • 用 户 组: 普通用户
  • 注册时间: 2011-08-29 22:22
文章分类

全部博文(124)

文章存档

2016年(8)

2015年(52)

2014年(53)

2013年(11)

分类: 嵌入式

2014-10-22 16:45:33

原文地址:Makefile中的export 作者:Yiran_Linux

在shell中,可以使用export修改当前进程的环境变量。例如,
    export 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进程继承。

 

 

http://emacs23.spaces.live.com/blog/cns!1F3F5DFF08CD1B19!122.entry

阅读(497) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~