http://blog.chinaunix.net/uid-29460203-id-4191975.html

https://www.xuebuyuan.com/1148403.html?mobile=1

https://www.cnblogs.com/gaojian/archive/2012/09/25/2701669.html

1.

字符串替换函数原型:$(subst <from>,<to>,<text>)

例:$(subst , / , \ , $(APP_PATH) )

2.

.SUFFIXES用于通知make新的扩展名

.SUFFIXES:清空所有的文件拓展名识别

.SUFFIXES:.o .c .s .mix .dep 声明五个文件拓展名

3.

$(filter <pattern>,<text>):从text中过滤出pattern所指的字符串

$(filter-out <pattern>,<text>);从text中过滤掉pattern后的字符串

例:$(filter all , $(MAKECMDGOALS) ):从变量MAKECMDGOALS中过滤出all字符串

4.

递归 make 指令应当总是使用变量 MKAE,不是显式命令名称 make ,像如下这样:

subsystem:
cd subdir && $(MAKE)

这个变量的值就是make 被激活所关联的文件名。如果文件名为 /bin/make,那么执行的片段就是 cd subdir && /bin/make。如果你使用一个特殊版本的make 来运行顶层的makefie,那么此版本也会为下层的makefile来递归调用。

作为一个特殊的功能,在一个规则的片段里使用变量 MAKE有 -t(--touch), -n(--just-print), 或者 -q(--question)选项。

使用 MAKE 变量时,在片段行的起始处用 + 符号同样有效。*Note Instead of Executing the Recipes: Instead of Execution

这个特殊的功能只有在 MAKE变量在片段里直接出现的时候才有效。MAKE变量被通过其他变量扩展而来时无效。在之后的场合,你必须使用 + 令牌来获得这些效果。

考虑一下在上述例子中的命令 make -t。(-t 选项标记目的为最新,而没有真正运行任何片段;see *note Instead of Execution::)

后面跟着 -t 选项后,此例子中的 make -t 命令会创建一个名字为 subsystem的文件,并且不会做其他的事情。你所真正想要做的是 运行 cd subdir && make -t,但是那样需要执行片段,而 -t 却不需要执行片段。

特殊的功能是的make 作了你想要的。当一个规则的片段行包含了变量 MAKE, 标志 -t -n 和-q 将不会作用到那个行。 包含MAKE的片段行会正常执行而不管标志的存在。通常的 MAKEFLAGS机制传递这些标志到make中(*note Communication Options to a sub-make: Options/Recursion),因此你需要使此文件保持最新,或者打印片段等的要求,会被传播到子系统中。

如果你没有想要向下传递其他的标志,你必须改变MAKEFLAGS标志,像这样:

subsystem:
cd subdir && $(MAKE) MAKEFLAGS=

命令行变量定义确实出现在变量 MAKEOVERRIDES中,并且 MAKEFLAGS 包含一个对此变量的引用。如果你想要正常地向下传递标志,但是不想向下传递命令行变量定义,你可以设置 MAKEOVERRIDES 为空值,像下面这样:

MAKEOVERRIDES =

这么做通常是没有用的。但是有些系统在环境的大小方面有一个小小的限制,把很多的信息放入MAKEFLAGS 可能会超出大小。如果你看到错误信息 '参数列表太长(Arg list too long)',可能就是这个原因造成。(为了严格遵循POSIX.2 的兼容性,如果.POSIX出现在makefile中,那么改变MAKEOVERRIDES 不会影响到 MAKEFLAGS)

有一个类似的变量 MFLAGS,是为了向后兼容性的考虑。它和MAKEFLAGS 一样拥有同样的值,但是它不包含命令行变量定义,并且总是开始于一个连字符除非它是空(MAKEFLAGS 仅当它开始于一个非单字母的时候才开始于一个连字符,例如 --warn-undefined-variables)。MFLAGS在递归make命令中是显式地被传统地使用的,例如像这样:

subsystem:

cd subdir && $(MAKE) $(MFLAGS)

但是现在 MAKEFLAGS 使得这种用法冗余了。如果你想要你的makefile和旧的make兼容,可以使用这个技巧;它也可以和很多现代的make版本一起工作。

如果你想每次在你运行make的时候,用特定的选项,比如 -k(*note Summary of Options: Options Summary),MAKEFLAGS 变量也是有用的。你简单地在环境中给 MAKEFLAGS 设置一个值。

你也可以在一个makefile中设置 MAKEFLAGS ,来指定需要在此makefile中生效的附加标志。(注意你不能用这种方式来用 MFLAGS,那个变量只是为了兼容性;make 不会翻译你一个你给MFLAGS设置的值)

当make翻译了MAKEFLAGS的值,如果这个值之前没有连线符,它首先就插入一个连线符。然后它把这个值用空格分成两半。如果这些值在命令行有选项还解析这些词(-C -f -h -o -W除外,它们的长名字版本被忽略;对一个无效的选项不报错)。

如果你在环境中设置了 MAKEFLAGS,你需要确定不要包含任何严重影响到 make 的动作或者削弱了makefile目的的选项。例如,-t -n 和 -q 选项,如果送入了这样的变量,可能会带来灾难性的后果,至少也是令人惊讶或升起的后果。

你可以写一个测试 make 命令标志的条件式,如通过使用findstring函数处理变量 MAKEFLAGS 来测试标志 -t (*note Functions for String Substitution and Analysis: Text Functions.)。

findstring 函数决定是否一个字符串作为子串出现在另一个字符串中。如果你想要测试 -t 标志,使用t 作为findstring的第一个参数,MAKEFLAGS 作为另一个参数。

例如,这里有一个如何使用 ranlib -t 来 完成 标记某个库为最新的例子:

archive.a: ...
ifneq (,$(findstring t,$(MAKEFLAGS)))
+touch archive.a
+ranlib -t archive.a
else
ranlib archive.a
endif

+前缀标记那些片段行为递归,因此无论是否使用了-t 标记,它们都将会被执行。*Note Recursive Use of make: Recursion.

MAKEFILE_LIST/CURDIR/MAKECMDGOALS/MAKEOVERRIDES/MAKEFLAGS的更多相关文章

  1. Linux CentOS 6.9 Minimal 编译 OpenJDK 7

    今天学习<深入理解Java虚拟机:JVM高级特性与最佳实践>一书,并动手在Linux系统上编译OpenJDK 7,初次搞不太顺利,特记录下编译操作细节. 一.前期准备 约定:工具默认安装目 ...

  2. openJDK环境搭建编译(fedora)

    1.安装VMware  VMware-workstation-full-10.0.7-2844087.exe    破解码:HY06L-F334P-9Z6H9-6R2XM-23C6J  安装完成之后, ...

  3. 关于MFLAGS与MAKEFLAGS

    与子make通讯的选项 诸如‘-s’和‘-k’标志通过变量MAKEFLAGS自动传递给子make.该变量由make自动建立,并包含make收到的标志字母.所以,如果您是用‘make –ks’变量MAK ...

  4. shell变量$(CURDIR),$0,$1,$2,$#含义解释

    $(CURDIR):   CURDIR是make的内嵌变量, 为当前目录 实例 SRCTREE := $(CURDIR) *$(CURDIR)为当前目录,相当于SRCTREE=./ MKCONFIG ...

  5. Makefile中的MAKECMDGOALS

      make 在执行时会设置一个特殊变量 -- "MAKECMDGOALS" ,该变量记录了命令行参数指定的终极目标列表,没有通过参数指定终极目标时此变量为空.该变量仅限于用在特殊 ...

  6. Python3基础 os listdir curdir 查看当前工作目录的所有文件的名字

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  7. Python3基础 os listdir curdir pardir 查看工作目录及其上一级目录的所有文件名

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  8. Traceback (most recent call last): File "setup.py", line 22, in <module> execfile(join(CURDIR, 'src', 'SSHLibrary', 'version.py')) NameError: name 'execfile' is not defined

    在python3环境下安装robotframework-SSHLibraray报错: Traceback (most recent call last): File "setup.py&qu ...

  9. 嵌入式Linux-GNU Make 使用手册(中译版)

    GNU Make 使用手册(中译版) 翻译:于凤昌 译者注:本人在阅读Linux源代码过程中发现如果要全面了解Linux的结构.理解Linux的编程总体设计及思想必须首先全部读通Linux源代码中各级 ...

随机推荐

  1. ASP.NET MVC 方法View返回的两种方式

    1.参数为字符串类型 例如我们在地址栏输入http://localhost:56431/Test/Index,会查找TestController类下的Index方法并执行,如下图 当我们返回字符串类型 ...

  2. BZOJ4566&&lg3181 HAOI找相同字符(广义后缀自动机)

    BZOJ4566&&lg3181 HAOI找相同字符(广义后缀自动机) 题面 自己找去 HINT 给定两个文本串,问从两个串中各取一个非空子串,使这俩子串相同,问方案有多少种.我的思路 ...

  3. 141.内置上下文处理器debug、request、auth、messages、media、static、csrf

    上下文处理器 上下文处理器可以返回一些数据,在全局模板中都可以使用,比如登录后的用户数据,在很多页面中都需要使用,那么我们就可以方在上下文处理器中,就没有必要在每个视图中返回这个对象了. 在setti ...

  4. C++ lvalue(左值)和rvalue(右值)

    lvalue(左值)和rvalue(右值) 昨天写代码遇见一个这样的错误:{ "cannot bind non-const lvalue reference of type 'int& ...

  5. JS 获取验证码 倒计时

    setInterval 一个定时器搞定 <style> button{ background: #45BCF9; color: #fff; padding: 4px 10px; borde ...

  6. pip问题:Traceback (most recent call last): File "/usr/bin/pip", line 9, in

    源作者blog https://blog.csdn.net/vmxhc1314/article/details/81869676 编辑提示的文件,进行更改即可. 解决方法: 将 /usr/bin/pi ...

  7. python接口自动化之pytest环境准备与入门(五)

    安装的pytest版本应该与安装的python版本对应,不然会有问题 (我的环境是python3.6与pytest4.5.0) 1.安装pytest pip install pytest==4.5.0 ...

  8. H3C RIP配置

    一.RIP简介 RIP(Routing Information Protocol,路由信息协议)是一种较为简单的内部网关协议(Interior Gateway Protocol,IGP),主要用于规模 ...

  9. 占位 CP

    占位 CP include: CP403 CP404 CP405

  10. Ansible:playbook-nagios

    一.创建目录结构 cd /etc/ansible/roles/ mkdir nagios/{files,templates,vars,handlers,meta,default,tasks} -pv ...