Makefile知识点总结
1.=,:=,+=区别
= 是最基本的赋值
:= 是覆盖之前的值
?= 是如果没有被赋值过就赋予等号后面的值
+= 是添加等号后面的值
、“=”
make会将整个makefile展开后,再决定变量的值。也就是说,变量的值将会是整个makefile中最后被指定的值。看例子:
x = foo
y = $(x) bar
x = xyz
在上例中,y的值将会是 xyz bar ,而不是 foo bar 。
、“:=”
“:=”表示变量的值决定于它在makefile中的位置,而不是整个makefile展开后的最终值。
x := foo
y := $(x) bar
x := xyz
在上例中,y的值将会是 foo bar ,而不是 xyz bar 了。
2.MAKEFLAGS += -rR --no-print-directory
MAKEFLAGS是make内置的环境变量,这些参数的含义,可以通过man make 获得详细解释.
以上”-rR“表示禁用内置的隐含规则和变量定义,
--no-print-directory 是 Turn off -w, even if it was turned on implicitly.
3.ifeq、ifneq、ifdef
使用条件判断,可以让make根据运行时的不同情况选择不同的执行分支。条件表达式可以是比较变量的值,或是比较变量和常量的值。 一、示例 下面的例子,判断$(CC)变量是否“gcc”,如果是的话,则使用GNU函数编译目标。 libs_for_gcc = -lgnu
normal_libs = foo: $(objects)
ifeq ($(CC),gcc)
$(CC) -o foo $(objects) $(libs_for_gcc)
else
$(CC) -o foo $(objects) $(normal_libs)
endif 可见,在上面示例的这个规则中,目标“foo”可以根据变量“$(CC)”值来选取不同的函数库来编译程序。 我们可以从上面的示例中看到三个关键字:ifeq、else和endif。ifeq的意思表示条件语句的开始,并指定一个条件表达式,表达式包含两个参数,以逗号分隔,表达式以圆括号括起。else表示条件表达式为假的情况。endif表示一个条件语句的结束,任何一个条件表达式都应该以endif结束。 当我们的变量$(CC)值是“gcc”时,目标foo的规则是: foo: $(objects)
$(CC) -o foo $(objects) $(libs_for_gcc) 而当我们的变量$(CC)值不是“gcc”时(比如“cc”),目标foo的规则是: foo: $(objects)
$(CC) -o foo $(objects) $(normal_libs) 当然,我们还可以把上面的那个例子写得更简洁一些: libs_for_gcc = -lgnu
normal_libs = ifeq ($(CC),gcc)
libs=$(libs_for_gcc)
else
libs=$(normal_libs)
endif foo: $(objects)
$(CC) -o foo $(objects) $(libs) 二、语法 条件表达式的语法为: <conditional-directive>;
<text-if-true>;
endif 以及: <conditional-directive>;
<text-if-true>;
else
<text-if-false>;
endif 其中<conditional-directive>;表示条件关键字,如“ifeq”。这个关键字有四个。 第一个是我们前面所见过的“ifeq” ifeq (<arg1>;, <arg2>;)
ifeq '<arg1>;' '<arg2>;'
ifeq "<arg1>;" "<arg2>;"
ifeq "<arg1>;" '<arg2>;'
ifeq '<arg1>;' "<arg2>;" 比较参数“arg1”和“arg2”的值是否相同。当然,参数中我们还可以使用make的函数。如: ifeq ($(strip $(foo)),)
<text-if-empty>;
endif 这个示例中使用了“strip”函数,如果这个函数的返回值是空(Empty),那么<text-if-empty>;就生效。 第二个条件关键字是“ifneq”。语法是: ifneq (<arg1>;, <arg2>;)
ifneq '<arg1>;' '<arg2>;'
ifneq "<arg1>;" "<arg2>;"
ifneq "<arg1>;" '<arg2>;'
ifneq '<arg1>;' "<arg2>;" 其比较参数“arg1”和“arg2”的值是否相同,如果不同,则为真。和“ifeq”类似。 第三个条件关键字是“ifdef”。语法是: ifdef <variable-name>; 如果变量<variable-name>;的值非空,那到表达式为真。否则,表达式为假。当然,<variable-name>;同样可以是一个函数的返回值。注意,ifdef只是测试一个变量是否有值,其并不会把变量扩展到当前位置。还是来看两个例子: 示例一:
bar =
foo = $(bar)
ifdef foo
frobozz = yes
else
frobozz = no
endif 示例二:
foo =
ifdef foo
frobozz = yes
else
frobozz = no
endif 第一个例子中,“$(frobozz)”值是“yes”,第二个则是“no”。 第四个条件关键字是“ifndef”。其语法是: ifndef <variable-name>; 这个我就不多说了,和“ifdef”是相反的意思。 在<conditional-directive>;这一行上,多余的空格是被允许的,但是不能以[Tab]键做为开始(不然就被认为是命令)。而注释符“#”同样也是安全的。“else”和“endif”也一样,只要不是以[Tab]键开始就行了。 特别注意的是,make是在读取Makefile时就计算条件表达式的值,并根据条件表达式的值来选择语句,所以,你最好不要把自动化变量(如“$@”等)放入条件表达式中,因为自动化变量是在运行时才有的。 而且,为了避免混乱,make不允许把整个条件语句分成两部分放在不同的文件中。
4.origin
$(origin VARIABLE) 函数功能:函数“origin”查询参数“VARIABLE” (一个变量名)的出处。
函数说明: “VARIABLE”是一个变量名而不是一个变量的引用。因此通常它不
包含“$”(当然,计算的变量名例外)。
返回值:返回“VARIABLE”的定义方式。用字符串表示。
函数的返回情况有以下几种:
. undefined
变量“VARIABLE”没有被定义。
. default
变量“VARIABLE”是一个默认定义(内嵌变量) 。如“CC”、“MAKE”、“RM”
等变量(参考 10.3 隐含变量 一节)。如果在Makefile中重新定义这些变量,
函数返回值将相应发生变化。
. environment
变量“VARIABLE” 是一个系统环境变量, 并且make没有使用命令行选项“-e”
(Makefile中不存在同名的变量定义,此变量没有被替代)。参考 10.7 make
的命令行选项 一节
. environment override
变量“VARIABLE”是一个系统环境变量,并且make使用了命令行选项“-e”。
Makefile中存在一个同名的变量定义,使用“make -e”时环境变量值替代了
文件中的变量定义。 参考 9.7 make的命令行选项 一节
. file
变量“VARIABLE”在某一个 makefile 文件中定义。
. command line
变量“VARIABLE”在命令行中定义。
. override
变量“VARIABLE”在 makefile 文件中定义并使用“override”指示符声明。
. automatic
变量“VARIABLE”是自动化变量。 函数“origin”返回的变量信息对我们书写 Makefile 是相当有用的,可以使我们在
使用一个变量之前对它值的合法性进行判断。假设在 Makefile 其包了另外一个名为
bar.mk 的 makefile 文件。我们需要在 bar.mk 中定义变量“bletch”(无论它是否是一
个环境变量),保证“make –f bar.mk”能够正确执行。另外一种情况,当Makefile 包
含bar.mk,在Makefile包含bar.mk之前有同样的变量定义,但是我们不希望覆盖bar.mk
中的“bletch”的定义。一种方式是:我们在bar.mk中使用指示符“override”声明这
个变量。但是它所存在的问题时,此变量不能被任何方式定义的同名变量覆盖,包括命
令行定义。另外一种比较灵活的实现就是在bar.mk 中使用“origin”函数,如下: ifdef bletch
ifeq "$(origin bletch)" "environment"
bletch = barf, gag, etc.
endif
endif 这里,如果存在环境变量“bletch”,则对它进行重定义。 ifneq "$(findstring environment,$(origin bletch))" ""
bletch = barf, gag, etc.
endif 这个例子实现了:即使环境变量中已经存在变量“bletch”,无论是否使用“make -e”
来执行 Makefile,变量“bletch”的值都是“barf,gag,etc”(在 Makefile 中所定义的) 。
环境变量不能替代文件中的定义。
如果“$(origin bletch)”返回“environment”或“environment override”,都将对
变量“bletch”重新定义。
5.DIR = $(CURDIR)
CURDIR是make的内嵌变量,自动设置为当前目录 测试 all: @echo $(CURDIR) make 后就显示当前路径
6.$(CURDIR)/Makefile Makefile: ;
这是一条"空指令",Makefile中使用它来阻止make使用隐含规则构建指定目标。
make 在执行时,需要一个命名为Makefile 的文件。在一个完整的Makefile 中,一般包含了5部分:规则(显示指定和隐含规则)、变量定义(同样包含显示变量和隐含变量)、指示符( include, define 等)和注释。
显 示规则是由作者显示写出的规则,而隐含规则则是内建在make 中,为make 提供了重建某一类目标文件(.o 等)的通用方法,同时这些隐含规则所用到的变量也就是所谓的隐含变量。隐含规则和隐含变量可以通过make -p -f /dev/null 查看。隐含规则的好处是在Makefile 中不需要明确给出重建某一个目标的命令,甚至可以不需要规则。make会为你自动搜寻匹配的隐含规则链。
这个世界上没有免费的午餐,隐含规则的代价之一就是低效,系统必须搜索可能的隐含规则链。同时隐含规则也有可能应用了不是你想要的规则而引入很难debug的错误。
Cancel implicit rules on top Makefile的意思就是取消上述makefile的隐含规则。 大家会奇怪为什么要定义一个没有命令的规则。其唯一的原因是,空命令行可以防止make在执行时试图为重建这个目标去查找隐含命令(包括了使用隐含规则中的命令
和“.DEFAULT”指定的命令。
7.if
$(if CONDITION,THEN-PART[,ELSE-PART]) 函数功能:第一个参数“CONDITION” ,在函数执行时忽略其前导和结尾空字
符,如果包含对其他变量或者函数的引用则进行展开。如果“CONDITION”的
展开结果非空,则条件为真,就将第二个参数“THEN_PATR”作为函数的计算
表达式;“CONDITION”的展开结果为空,将第三个参数“ELSE-PART”作为
函数的表达式,函数的返回结果为有效表达式的计算结果。
返回值:根据条件决定函数的返回值是第一个或者第二个参数表达式的计算结
果。当不存在第三个参数“ELSE-PART” ,并且“CONDITION”展开为空,函
数返回空。
函数说明:函数的条件表达式“CONDITION”决定了函数的返回值只能是
“THEN-PART”或者“ELSE-PART”两个之一的计算结果。
8.filter-out
$(filter-out PATTERN...,TEXT)
函数名称:反过滤函数—filter-out。
函数功能:和“filter”函数实现的功能相反。过滤掉字串“TEXT”中所有符合模式
“PATTERN”的单词,保留所有不符合此模式的单词。可以有多个模式。
存在多个模式时,模式表达式之间使用空格分割。。
返回值:空格分割的“TEXT”字串中所有不符合模式“PATTERN”的字串。
函数说明: “filter-out”函数也可以用来去除一个变量中的某些字符串, (实现和
“filter”函数相反)。
示例:
objects=main1.o foo.o main2.o bar.o
mains=main1.o main2.o $(filter-out $(mains),$(objects))
实现了去除变量“objects”中“mains”定义的字串(文件名)功能。它的返回值
为“foo.o bar.o”。
9.FORCE
FORCE 首先分析一下这个依赖,它的规则定式义在内核源码主目录的Makefile中: PHONY += FORCE
FORCE: 这个规则没有命令也没有依赖,它的目标也不是一个存在的文件名。fu在执行此规则时,目标FORCE总会被认为是最新的。这样当它作为其它规则的依赖时,因为依赖总被认为被更新过的,所以那个规则的中定义的命令总会被执行。
Makefile知识点总结的更多相关文章
- makefile知识点归纳的
以一个样例開始,文件文件夹结构例如以下 ---------(当前文件夹)-----------main.c | |------- ...
- Makefile知识点
1.标准Makefile文件示例如下: #把.o .C .cxx .cpp .hxx .h添加到后缀列表中. .SUFFIXES: .o .C .cxx .cpp .hxx .h #设置变量并赋值,方 ...
- Makefile 知识点
$@ $@ is the name of the target. $? The $? macro stores the list of dependents more recent than the ...
- 剑指Offer——知识点储备--Linux基本命令+Makefile
剑指Offer--知识点储备–Linux基本命令 1.linux下查看进程占用cpu的情况(top): 格式 top [-] [d delay] [q] [c] [S] [s] [i] [n] 主要参 ...
- makefile文件知识点记录
1赋值 = 是最基本的赋值:= 是覆盖之前的值?= 是如果没有被赋值 += 是添加等号后面的值 1.“=” make会将整个makefile展开后,再决定变量的值.也就是说,变量的值将会是整个make ...
- Makefile常用知识点
格式 目标:最终要去生成的文件, 定格写,后面是冒号(冒号后面是依赖) 依赖:用来生成目标的源材料 命令:加工的方法,命令前面一定是Tab, make的过程就是使用命令将依赖加工成目标的过程 工作原理 ...
- Makefile 赋值 函数定义 等小知识点
1.赋值 == 到用的时候实际才去赋值:= 立刻赋值?= 未赋值才赋值+= 2.多层变量 多层变量引用(各种复杂组合...)a =bb= cc= dd =1$($($($(a)))) 最终等于1 3. ...
- makefile小例子
makefile的知识点应该很多,看网上的很多教程就能看出来,长的可以写一本书.记录一下自己用的一个简单的makefile, 方便以后查找. 先看一下程序的目录结构: [root@localhost ...
- php高级面试题知识点(转载)
php高级面试题知识点大全 时间:2016-01-26 06:36:22来源:网络 导读:php高级面试题知识点大全,本套面试题内容包括php魔术方法.php单点登录.linux基本命令.前端开发技术 ...
随机推荐
- CentOS7配置httpd虚拟主机
本实验旨在CentOS7系统中,httpd-2.4配置两台虚拟主机,主要有以下要求: (1) 提供两个基于名称的虚拟主机: www1.stuX.com,页面文件目录为/web/vhosts/www1: ...
- httpd常见配置
httpd常见配置 配置文件 /etc/httpd/conf/httpd.conf 主配置文件 /etc/httpd/conf.d/*.conf 辅助配置文件 配置文件语法检查及重新加载配置文 ...
- Intellij IDEA 最新旗舰版注册激活破解(2018亲测,可用)
1.2017年亲测 参考:https://www.haxotron.com/jetbrains-intellij-idea-crack-123/ 安装IntelliJ IDEA 最新版 启动Intel ...
- SAP跳过权限检查/前提是有debug权限
SE37,AUTH_CHECK_TCODE加断点: 执行事务代码,进入断点,修改sy-subrc = 0,执行,就可以跳过权限检查. 只给了事务代码权限,没有操作权限: CL_SUID_TOOLS== ...
- springcloud-Ribbon-负载均衡组件
Ribbon负载均衡 1.Ribbon简介 ribbin是Netflix发布的负载均衡器,有助于控制http和tcp客户端的行为,为ribbon配置服务提供者列表后,ribbon就可以基于某种负载均衡 ...
- jsp请求转发与重定向区别小结
1.当使用转发时,JSP容器将使用一个内部方法来调用目标页面,新的页面继续处理同一个请求,而浏览器不会知道这个过程; 2.重定向是第一个页面通知浏览器发送一个新的页面请求. 3.转发不改变URL,重定 ...
- IE浏览器使用VLC实时显示视频(海康、大华)
VLC2.X 下载地址: https://download.csdn.net/download/zhutouaizhuwxd/10692873 CSDN必须要加分,你们用分下载吧 使用方法: 只需要添 ...
- 《JavaScript Dom 编程艺术》读书笔记-第5章
上一篇随笔中记录了用JavaScript建一个基础图片库,但实际上还有很多地方可以改进.第五章将逐步进行改进,这一章里需要明白的道理是达到目标的过程和达到目标同样重要~ 第五章:最佳实践 5.1 过去 ...
- 2018 ICPC 区域赛 焦作场 D. Keiichi Tsuchiya the Drift King(计算几何)
http://codeforces.com/gym/102028/problem/D 题意:根据题中给的那个图,然后题目给你 a,b,r,d,让你求出最小的满足矩形通过弯道的w 思路:
- 将100道计算题输出至txt文件,再读取文件至控制台,在控制台中输入答案并评判对错
我在课堂上基本完成了输出100道题和创建文档,但是因为对输入输出流不熟悉,所以并没有实现将输出的计算题导出到文档里,在课下我又请教了宿舍的大佬,基本完成如下: 源代码: import java.io. ...