Chinaunix首页 | 论坛 | 博客
  • 博客访问: 9860
  • 博文数量: 1
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 30
  • 用 户 组: 普通用户
  • 注册时间: 2014-06-17 10:14
文章分类

全部博文(1)

文章存档

2015年(1)

我的朋友
最近访客

分类: 嵌入式

2015-09-16 23:41:05

1 Makefile规则

1.1 第一种规则

       targets : prerequisites

              command

              …

targets这里可以多个目标,可以是object file,可以是执行文件,还可以是label(伪目标),但是make只认第一个目标,一个makefike只有一个目标;prerequisites为需要依赖的文件;command为生成目标需要执行的命令(shell命令),command要以tab键作为开头

 

make命令默认会在当前目录按照“GNUmakefile”、“makefile”、“Makefile”的顺序找文件,如果要特别指定某一文件xxx,可以使用“-f”和“--file”参数,如:make –f xxx或make –file xxx

 

1.2 第二种规则

       Targets : target-pattern : prereq-patterns

              Command

              …

这是一种静态模式,target-pattern定义了目标的形式,prereq-patterns根据目标来指定该依赖的文件

 

 

2 引用include

include<filename>

 

make命令开始时,会先找寻include包含的其他文件,默认目录为当前目录;如果自己要指定某目录可以用参数”-I”“—include-dir”;如果包含的文件没找到,而且想要忽略这些错误而继续执行,可以在include前面加上减号“-”,如:-include

 

 

3通配符

“*”“[…]””~”

“~/test”表示当前用户的$HOME目录下的test目录

 

 

4文件搜寻

VPATH=<目录>:<目录>

多个目录之间用冒号分隔,make在当前目录中找不到依赖和目标文件就会去以上目录去找

 

 

5伪目标

.PHONY

 

 

6 自动依赖性

Cc编译:-M选项使得.c文件自动依赖它自己的.h文件

Gcc编译:-MM选项使得.c文件自动依赖它自己的.h文件

 

 

7 命令

》》make命令参数

-n:显示命令,但是不执行命令

-s:禁止命令的显示

-i:忽略错误的命令

-k:发现出错命令,终止该命令,继续执行其他命令

-w:进入下层目录,显示进入目录信息

-e:系统环境变量将覆盖Makefile中定义的变量

-f:指定运行某一makefile文件

-t:把目标文件的时间更新,也就是说,make 假装编译目标,但不是真正的编译目标,只是把目标变成已编译过的状态。

-q:这个参数的行为是找目标的意思,也就是说,如果目标存在,那么其什么也不会输出,当然也不会执行编译,如果目标不存在,其会打印出一条出错信息。

-B:认为所有的目标都需要更新(重编译)

-C:指定读取 makefile 的目录

-d:输出调试信息

-h:帮助信息

-I:指明包含文件的目录

-p:输出所有信息

 

 

》》命令字符:@

@时,make执行命令不会显示此条命令;没有@时,命令会显示出来

 

》》命令执行

当依赖目标新于目标时,也就是当规则的目标需要被更新时,make 会一条一条的执行其后的命令。需要注意的是,如果你要让上一条命令的结果应用在下一条命令时,你应该使用分号分隔这两条命令。比如你的第一条命令是 cd 命令,你希望第二条命令得在 cd 之后的基础上运行,那么你就不能把这两条命令写在两行上,而应该把这两条命令写在一行上,用分号分隔

 

》》忽略错误信息

可以在命令前面加减号“-”

 

》》子目录makefile

使用export可以让总makefile中的变量传递到下级的makefile中,但是不会覆盖变量

 

 

》》定义命令包

define 命令变量

相关命令

……..

Endef

使用命令变量:$(命令变量)

 

 

8 变量

、变量名区分大小写

、在使用变量时,最好加上小括号()或者中括号{},这样是为了安全,当然也可以不加

、如果在变量后有空格,而且在同一行空格后还加了注释符(#),那个空格就加入了定义的变量

8.1 变量定义

》》(A = B

此变量可以定义在任何地方

》》(A := B

这种方式令变量只能使用前面已定义好的,不能使用后面才定义的

》》(A ?= B

如果A没有被定义过,那么A的值就是B,否则这条语句就什么也不做

》》(A += B

B追加到A中,“+=”会继承于前次操作的赋值符

 

》》(  $(var:a=b) 

把变量var中所有以a结尾的字符串替换成b

》》( override A:=B 

Override使得通过make的命令行参数进行设置的变量A无效,变量A只定义于Makefike文件中

》》( define…endef

可以用于多行变量

》》( export

传递上层变量到下层变量中

 

8.2 目标变量

目标变量的作用范围只作用于此目标范围内,语法如下:

<target ...> : <variable-assignment>

<target ...> : overide <variable-assignment>

target这个label中的变量只作用于label

 

8.3模式变量

模式变量和目标变量的语法一样,不同在于对于目标,模式变量使得目标是个模式,如下:

%.o : CFLAGS = -O

%.o指定了所有.o文件,要模式匹配的目标

 

 

9 条件判断

》》ifeq(1,2)  else   endif

》》ifneq(1,2)  else   endif

》》ifdef    else    endif     #只会判断是否有值,并不会进行扩展

》》ifndef    else    endif

 

 

10 函数

函数语法:$(<function> <arguments>)${<function> <arguments>}

10.1 字符串处理函数

》》(   $(subst <from>,<to>,<text>)   

把字串<text>中的<from>字符串替换成<to>

》》(   $(patsubst <pattern>,<replacement>,<text>)   

text中符合pattern模式的字符串替换成replacement模式

》》(   $(strip <string>)  

去掉<string>字串中开头和结尾的空字符

》》(   $(findstring <find>,<in>)  

在字串<in>中查找<find>字串,如果找到,那么返回<find>,否则返回空字符串

》》(   $(filter <pattern...>,<text>)  

<pattern>模式过滤<text>字符串中的单词,保留符合模式<pattern>的单词,可以有多个模式

》》(   $(filter-out <pattern...>,<text>)  

<pattern>模式过滤<text>字符串中的单词,去除符合模式<pattern>的单词,可以有多个模式。

》》(   $(sort <list>) 

给字符串<list>中的单词排序(升序)

》》(   $(word <n>,<text>)  

取字符串<text>中第<n>个单词。(从一开始)

》》(   $(wordlist <s>,<e>,<text>)  

从字符串<text>中取从<s>开始到<e>的单词串。<s><e>是一个数字。

》》(   $(words <text>)  

统计<text>中字符串中的单词个数

》》(   $(firstword <text>)  

取字符串<text>中的第一个单词

 

10.2 文件名操作函数

》》(   $(dir <names...>)  

从文件名序列<names>中取出目录部分。目录部分是指最后一个反斜杠(“/”)之前的部分。如果没有反斜杠,那么返回“./”

》》(   $(notdir <names...>)  

从文件名序列<names>中取出非目录部分。非目录部分是指最后一个反斜杠(“/”)之后的部分

》》(   $(suffix <names...>)  

从文件名序列<names>中取出各个文件名的后缀

》》(   $(basename <names...>)  

从文件名序列<names>中取出各个文件名的前缀部分

》》(   $(addsuffix <suffix>,<names...>)  

把后缀<suffix>加到<names>中的每个单词后面

》》(   $(addprefix <prefix>,<names...>)  

把前缀<prefix>加到<names>中的每个单词后面

》》(   $(join <list1>,<list2>)  

连接函数,$(join aaa bbb , 111 222 333),返回值为“aaa111 bbb222 333”

 

10.3 其他函数

》》(   $(foreach <var>,<list>,<text>)  

把参数<list>中的单词逐一取出放到参数<var>所指定的变量中,然后再执行<text>所包含的表达式。每一次<text>会返回一个字符串,循环过程中,<text>的所返回的每个字符串会以空格分隔,最后当整个循环结束时,<text>所返回的每个字符串所组成的整个字符串(以空格分隔)将会是 foreach函数的返回值

Var是一个局部变量,相当于C for语句中的i,举例:

names := a b c d

files := $(foreach n,$(names),$(n).o),返回值为:a.o b.o c.o d.o

》》(   $(if <condition>,<then-part>)$(if <condition>,<then-part>,<else-part>)  

if 函数的返回值是,如果<condition>为真(非空字符串),那个<then-part>会是整个函数的返回值,如果<condition>为假 (空字符串), 那么<else-part>会是整个函数的返回值,此时如果<else-part>没有被定义,那么,整个函数返回空字串

》》(   $(call <expression>,<parm1>,<parm2>,<parm3>...)  

make 执行这个函数时, <expression>参数中的变量,如$(1) $(2) $(3)等,会被参数<parm1> <parm2><parm3>依次取代。而<expression>的返回值就是 call 函数的返回值

reverse = $(2) $(1)

foo = $(call reverse,a,b),返回值:b a

》》(   $(origin <variable>)  

注意,<variable>是变量的名字,不应该是引用。所以你最好不要在<variable>中使用“$”字符。Origin函数会以其返回值来告诉你这个变量的“出生情况”,下面,是 origin 函数的返回值:

“undefined”

如果<variable>从来没有定义过,origin 函数返回这个值“undefined”。

“default”

如果<variable>是一个默认的定义,比如“CC”这个变量,这种变量我们将在后面讲述。

“environment”

如果<variable>是一个环境变量,并且当 Makefile 被执行时,“-e”参数没有被打开。

“file”

如果<variable>这个变量被定义在 Makefile 中。

“command line”

如果<variable>这个变量是被命令行定义的。

“override”

如果<variable>是被 override 指示符重新定义的。

“automatic”

如果<variable>是一个命令运行中的自动化变量。

》》(   $(shell <command>)  

它的参数应该就是操作系统 Shell 的命

》》(   $(error <text ...>)  

执行后,make会停止

》》(   $(warning <text ...>)  

这个函数很像 error 函数,只是它并不会让 make 退出,只是输出一段警告信息,而 make 继续执行

 

 

11 隐含规则

11.1 隐含规则使用的变量

》》关于命令的变量

AS  CC  RM

》》关于命令参数的变量

ASFLAGS  CFLAGS  CPPFLAGS  LDFLAGS

11.2 自动化变量

》》$@

表示规则中的目标文件集

》》$%

仅当目标是函数库文件中,表示规则中的目标成员名。例如,如果一个目标是"foo.a(bar.o)",那么,"$%"就是"bar.o""$@"就是"foo.a"。如果目标不是函数库文件(Unix 下是[.a]Windows 下是[.lib]),那么,其值为空。

》》$<

依赖目标中的第一个目标名字。如果依赖目标是以模式(即"%")定义的,那么"$<"将是符合模式的一系列的文件集。注意,其是一个一个取出来的。

》》$?

所有比目标新的依赖目标的集合。以空格分隔。

》》$^

所有的依赖目标的集合。以空格分隔。

》》$+

这个变量很像"$^",也是所有依赖目标的集合。只是它不去除重复的依赖目标。

》》$*

这个变量表示目标模式中"%"及其之前的部分。如果目标是"dir/a.foo.b",并且目标的模式是"a.%.b",那么,"$*"的值就是"dir/a.foo"

 

 

 

 

阅读(964) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:没有了

给主人留下些什么吧!~~