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. 调用window Api 进行对特定窗口的进程ID进行操作

    /// <summary> /// 获取窗口句柄 /// </summary> /// <param name="lpClassName">&l ...

  2. C# 一次循环获取树的两种方法

    第一种方法好些 第二种方法如果中间断开就会成为一级 private static List<Menu> MenuTree() { , ParentId = , Name = "a ...

  3. RSA学习档案

    RSA 学习档案 基本原理 随机选择两个质数p,q模数n=p*qφ(n)=(p−1)(q−1)选择加密指数e: 1 < e < φ(n)计算机密指数d: e*d % φ(n) = 1c = ...

  4. 2018ICPC南京站Problem G. Pyramid

    题意: 找有多少个等边三角形 解析: 首先打标找规律,然后对式子求差分 0,1,5,15,35,70,126,210... 1,4,10,20,35,56... 3,6,10,15,21... 3,4 ...

  5. JSON JavaScriptSerializer 进行序列化或反序列化时出错。字符串的长度超过了为 maxJsonLength 属性设置的值

    在.net mvc的controller中,方法返回JsonResult,一般我们这么写:   [HttpPost]   public JsonResult QueryFeature(string u ...

  6. [AH2017/HNOI2017] 单旋 - Splay

    Splay 暴力维护节点信息即可 #include<iostream> #include<cstdio> #include<cstring> #include< ...

  7. android TextView 支持长按自由复制

    因为EditText支持系统的长按自由复制,所以只需要把EditText通过配置达到TextView效果就行了 <EditText android:id="@+id/subject_i ...

  8. Cleaning Data in R

    目录 R 中清洗数据 常见三种查看数据的函数 Exploring raw data 使用dplyr包里面的glimpse函数查看数据结构 \(提取指定元素 ```{r} # Histogram of ...

  9. 10.pandas的替换和部分替换(replace)

    在处理数据的时候,很多时候会遇到批量替换的情况,如果一个一个去修改效率过低,也容易出错.replace()是很好的方法.   源数据 1.替换全部或者某一行 replace的基本结构是:df.repl ...

  10. python中os.sep的作用以及sys._getframe().f_back.f_code.co_xxx的含义

    https://blog.csdn.net/gufenchen/article/details/98338552