Makefile export
1)
1.在(parent,上层的)makefile中export出来变量,子makefile(sub make)中,是可以访问的。
2. 而同一级别的makefile(可通过makefile中内置变量MAKELEVEL查看得知当前makefile的levlel),是无法通过export来传递变量的,即一个makefile中export出来一个变量,同一级的另外一个makefile中,是无法访问/得到的。
3.makefile中的export是导出变量到子makfile,而目标对应执行的动作中的export,是属于shell中的export,其作用是导出变量到当前shell。此两个export的作用是不同的。
https://blog.csdn.net/yu704645129/article/details/50441963
2)
向子make 通讯变量
https://www.cnblogs.com/gaojian/archive/2012/10/01/2709739.html
通过显式的需求,顶级make的变量可以被传递给子make,但是不会覆盖子make的值,除非你使用了 -e选项(*note Summary of Options: Options Summary.)。
为了下传,或者导出一个变量,make 追加此变量和它的值到片段运行的每一行的环境中。子make,依照顺序,使用环境来初始化它自己的变量表。*Note Variables from the Environment: Environment.
除了被显式地请求,make仅仅当一个变量或者定义在环境里或者被设置在命令行里的时候,才会导出此变量,并且它的名字只能由 字母,数字和下划线组成。有些shell 不能 处理变量名含有其他字符的情况。
make 变量 SHELL 的值不会导出。反而,SHELL 变量的值从激活shell的环境中传递到子make, 你可通过export 指令,强迫 make 为SHELL变量导出值,下面会有讲述。*Note Choosing the Shell::
特殊变量 MAKEFLAGS 总是要导出的(除非你特意不导出),如果你设置它为任何值,它都要导出。
make 通过把变量值放入 MAKEFLAGS 里,自动地传递那些命令行中定义的变量值。*Note Options/Recursion::
如果变量是由make缺省地创建的,那么通常不会传递下去(*note Variables Used by Implicit Rules:Implicit Variables),子make将会自己定义这些值。
如果你想要导出特定的变量到一个子make, 使用 export 指令,像如下这样:
export VARIABLE ...
如果你想防止一个变量被导出,使用unexport 指令,像这样:
unexport VARIABLE ...
在上述的试样中,需要导出和限制导出的参数被扩展,这样变量或者函数可以被导出。
作为一个方便的方法,你可以在将变量定义和导出放在一起:
export VARIABLE = value
和如下的有同样的效果:
VARIABLE = value
export VARIABLE
或者
export VARIABLE := value
和如下的有同样的效果:
VARIABLE := value
export VARIABLE
与此类似,
export VARIABLE += value
就像是:
VARIABLE += value
export VARIABLE
https://www.cnblogs.com/gaojian/archive/2012/10/01/2709770.html
你也许注意到了 export 和 unexport 指令在make的工作方式和shell的工作方式一致。
如果你想要所有的变量都被缺省地导出,你可以用 export 自身:
export
这告诉make ,没有被显式地在export 或者unexport 中提及的变量,将被导出。任何在unexport指令 中给出的变量仍然不会到处。如果你使用了export自身来缺省地导出变量,名字中包含其他字符的变量将不会导出,除非你在export 指令中特别提及。
被一个export 自身指令引出的行为在旧版本的GNU make 中是缺省的。如果你的makefile依赖于这种行为而且你想要保持对旧版本make的兼容性,你可以为特殊目的 .EXPORT_ALL_VARIABLES 写一个规则,而不是用 export 指令。这个将被旧版本的 make 忽略掉,此时,export 指令会导致一个语法错误。
类似地,你可以使用 unexport 自身来告诉make 缺省地不要到处变量。因为这是缺省的行为,如果export 自身已经被之前使用了(也许是在一个被包含了的makefile里面)你只需要使用 unexport自身就行了。你不能在某些片段里通过使用export自身来导出某些变量同时又通过使用 unexport自身来缺省不导出某些变量。最后出现的export 或者 unexport 指令会决定整个make的行为。
作为一个特殊的功能,变量 MAKELEVEL 在从一层向下一层传递的时候会改变。这个变量的值是一个字符串,是一个10进制数字的深度值。顶级make为0,子make为1,子-子make为2,以此类推。make为一个片段设置环境的时候,发生数值增长。
MAKELEVEL的主要用途是在一个条件性的指令中测试(*note Conditional Parts of Makefiles:Conditionals.);这样你可以写一个makefile, 在某种条件下递归运行,另外一种条件下直接运行。
你可以使用变量 MAKEFILES来导致所有的make 命令用额外的makefile。MAKEFILES的值是一个空格分隔的文件名字列表。这个值,被定义在外层makefile中,在环境中向下传递;然后给子make提供一个增强makefile列表来读取。*Note The Variable 'MAKEFILES': MAKEFEILES 变量。
<3>
通过简单地声明 .EXPORT_ALL_VARIABLES ,可以告诉 make 来到出所有的变量给 子进程。
*Note Communicating Variables to a Sub-make: Variables/Recursion.
https://www.cnblogs.com/gaojian/archive/2012/09/25/2701375.html
为了学习 .EXPORT_ALL_VARIABLES ,查阅了如下的文章:
http://blog.csdn.net/zplove003/article/details/7066595
这个文章写得很棒,演示了makefile 的嵌套调用。
这里我把其中的 顶层 Makefile改一下,用 .EXPORT_ALL_VARIABLES 来代替。

//顶层目录下的Makeflie文件
cc=gcc
SUBDIRS=f1 \
f2 \
main \
obj
OBJS=f1.o f2.o main.o
BIN=myapp
OBJS_DIR=obj
BIN_DIR=bin #export CC OBJS BIN OBJS_DIR BIN_DIR OBJS
./EXPORT_ALL_VARIABLES all:CHECK_DIR $(SUBDIRS)
CHECK_DIR:
mkdir -p $(BIN_DIR)
$(SUBDIRS):ECHO
make -C $@
ECHO:
@echo $(SUBDIRS)
@echo begin compile
CLEAN:
@$(RM) $(OBJS_DIR)/*.o
@rm -rf $(BIN_DIR)

改动后,也是可以完成编译动作。
Makefile export的更多相关文章
- linux内核的makefile.txt讲解
linux内核的linux-3.6.5\Documentation\kbuild\makefiles.txt Linux Kernel Makefiles This document describe ...
- Linux内核Makefile文件(翻译自内核手册)
--译自Linux3.9.5 Kernel Makefiles(内核目录documention/kbuild/makefiles.txt) kbuild(kernel build) 内核编译器 Thi ...
- openwrt: Makefile 框架分析
openwrt: Makefile 框架分析 原文链接:blog.chinaunix.net/uid-26675482-id-4704952.html 本篇的主要目的是想通过分析Makefile,了解 ...
- Linux Kernel的Makefile与Kconfig文件的语法
https://www.kernel.org/doc/Documentation/kbuild/kconfig-language.txt Introduction ------------ The c ...
- kernel Makefile Kconfig说明
实际文档位置:Documentation/kbuild/makefiles.txt,此为翻译稿. *************************************************** ...
- 转载一篇makefile,说的很详细
March 3, 2015 8:19 PM 原文见:https://www.cnblogs.com/OpenShiFt/p/4313351.html Makefile 文件的编写 学习前的准备 需要准 ...
- openwrt: Makefile 框架分析[转载]
openwrt目录结构 上图是openwrt目录结构,其中第一行是原始目录,第二行是编译过程中生成的目录.各目录的作用是: tools - 编译时需要一些工具, tools里包含了获取和编译这些工具的 ...
- 编写通用的Makefile
一个应用程序的形成是少不了一下几个步骤的. 1. 预处理 #检查语法错误.包含头文件.展开#if.#define等宏定义 2. 编译 #把.c文件转换为汇编文件.s 3. 汇编 #把.s汇编转换为机器 ...
- 内核移植和文件系统制作(2):linux内核最小系统和initramfs文件系统
linux内核最小系统,使用内核版本:https://www.kernel.org/pub/linux/kernel/v3.0/linux-3.8.1.tar.bz2 1,FL2440板子的基本硬件: ...
随机推荐
- 转: OSIP协议栈使用入门
转自百度文库 很长时间之前,简单粗略地看了下Osip,eXosip,ortp等并快速“封装”了一个Windows下的基于VC6的MFC的SIP软电话(全部源代码VC6工程文件及Lib库可在本Blog共 ...
- CSS 美化网页元素
一.为什么使用CSS 1.有效的传递页面信息 2.使用CSS美化过的页面文本,使页面漂亮.美观,吸引用户 3.可以很好的突出页面的主题内容,使用户第一眼可以看到页面主要内容 4.具有良好的用户体验 二 ...
- 最短路-A - 畅通工程续
A - 畅通工程续 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多.这 ...
- HTML文档快捷键
一.web浏览器 1.刷新网页 F5 二.VS Code 常用快捷键 1.快速生成HTML代码 首先,建立一个空文档,选择编程语言为HTML: 其次,按下!(英文状态下),再按下tab键,就可以了 ...
- yolov3 进化之路,pytorch运行yolov3,conda安装cv2,或者conda安装找不到包问题
yolov3 进化之路,pytorch运行yolov3,conda安装cv2,或者conda安装找不到包问题 conda找不到包的解决方案. 目前是最快最好的实时检测架构 yolov3进化之路和各种性 ...
- vue animate.css训练动画案例 列表循环
制作目标动画:向上入场添加数据,点击数据右滑动离场 简单页面效果: 实现代码如下: <!DOCTYPE html> <html> <head> <meta c ...
- python中可变类型和不可变类型数据的复制
常见的复制方式有以下5种第1种:通过等号[=]复制 - 不论可变还是不可变数据类型,通过[=]复制后都指向同一个内存地址: - 改变复制后的数据(例子中的anotherStr,anotherList) ...
- tkinter页面卡死
tkinter界面卡死的解决办法 1.如果点击按钮,运行了一个比较耗时的操作,那么界面会卡死 import tkinter as tk import time def onclick(text, ...
- 微信小程序 selectComponent 值为null
这个东西的执行时间感觉有点迷, 我遇到的情况是在page 的onReady onShow 当中 使用 selectComponent 无法获取到子组件的对象 只好退而求其次 在需要触发的方法当中 ...
- 《TCP/IP入门经典》摘录--Part 1
TCP/IP基础知识 什么是TCP/IP Transmission Control Protocol/Internet Protocol的简写,中译名为传输控制协议/因特网互联协议,又名网络通讯协议, ...