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知识点总结的更多相关文章

  1. makefile知识点归纳的

    以一个样例開始,文件文件夹结构例如以下 ---------(当前文件夹)-----------main.c                   |                   |------- ...

  2. Makefile知识点

    1.标准Makefile文件示例如下: #把.o .C .cxx .cpp .hxx .h添加到后缀列表中. .SUFFIXES: .o .C .cxx .cpp .hxx .h #设置变量并赋值,方 ...

  3. Makefile 知识点

    $@ $@ is the name of the target. $? The $? macro stores the list of dependents more recent than the ...

  4. 剑指Offer——知识点储备--Linux基本命令+Makefile

    剑指Offer--知识点储备–Linux基本命令 1.linux下查看进程占用cpu的情况(top): 格式 top [-] [d delay] [q] [c] [S] [s] [i] [n] 主要参 ...

  5. makefile文件知识点记录

    1赋值 = 是最基本的赋值:= 是覆盖之前的值?= 是如果没有被赋值 += 是添加等号后面的值 1.“=” make会将整个makefile展开后,再决定变量的值.也就是说,变量的值将会是整个make ...

  6. Makefile常用知识点

    格式 目标:最终要去生成的文件, 定格写,后面是冒号(冒号后面是依赖) 依赖:用来生成目标的源材料 命令:加工的方法,命令前面一定是Tab, make的过程就是使用命令将依赖加工成目标的过程 工作原理 ...

  7. Makefile 赋值 函数定义 等小知识点

    1.赋值 == 到用的时候实际才去赋值:= 立刻赋值?= 未赋值才赋值+= 2.多层变量 多层变量引用(各种复杂组合...)a =bb= cc= dd =1$($($($(a)))) 最终等于1 3. ...

  8. makefile小例子

    makefile的知识点应该很多,看网上的很多教程就能看出来,长的可以写一本书.记录一下自己用的一个简单的makefile, 方便以后查找. 先看一下程序的目录结构: [root@localhost ...

  9. php高级面试题知识点(转载)

    php高级面试题知识点大全 时间:2016-01-26 06:36:22来源:网络 导读:php高级面试题知识点大全,本套面试题内容包括php魔术方法.php单点登录.linux基本命令.前端开发技术 ...

随机推荐

  1. 重写console.log的一些理解

    关于重写console.log的方式通常都是这样的: console.log = (function(oriLogFunc){ return function(str) { oriLogFunc.ca ...

  2. Log4Net 添加自定义字段并保存到数据库

    Log4Net是常用的功能强大的日志插件,该插件提供了几个默认字段 大家可能都用过Log4Net插件来记录日志,该插件默认提供了这几个字段@log_date, @thread, @log_level, ...

  3. Petrozavodsk Winter Camp, Day 8, 2014, Mosaic

    给你三个数字a,b,c,让你用1-m的数字凑出来 结论:有2个1和2个2肯定凑不出来,然后就搜索 #include <bits/stdc++.h> using namespace std; ...

  4. 数据结构与算法之PHP排序算法(堆排序)

    一.堆的定义 堆通常是一个可以被看做一棵树的数组对象,其任一非叶节点满足以下性质: 1)堆中某个节点的值总是不大于或不小于其父节点的值: 每个节点的值都大于或等于其左右子节点的值,称为大顶堆.即:ar ...

  5. Xgboost: 一把屠龙刀的自我修养

    目录 引言 Xgboost 参考文献 引言 集成学习, 在机器学习中是一个非常重要的思想: 把多个弱分类器精巧地组合在一起,成为一个很强大的学习器. 集成学习也因此一直处在风口浪边. 集成学习主要分为 ...

  6. IIS+NGINX 负载web服务器

    Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行.其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在 ...

  7. webpack配置接口路径

    比如在webpack.config.js中的plugins中加入 new webpack.DefinePlugin({ 'process.env.NODE_ENV': JSON.stringify(' ...

  8. 为DBNavigator的按钮加中文

    转自:http://hi.baidu.com/debiansir/item/0699f5b6bb4d99f063388e71 /*Delphi中数据库控件DBNavigator使用起来不错,但是按钮上 ...

  9. django+celery +rabbitmq

    celery是一个python的分布式任务队列框架,支持 分布的 机器/进程/线程的任务调度.采用典型的生产者-消费者模型 包含三部分:1. 队列 broker :可使用redis ,rabbitmq ...

  10. ionic3 使用swiper插件 实现轮播效果

    由于app的更新迭代 我需要完成新版本设计图的开发 刚开始就遇到一个问题  首页的banner图需要实现某种效果 而ionic3自带的轮播图效果怎么改都改不到我想要的效果 效果图如下  自动播放 不断 ...