码迷,mamicode.com
首页 > 其他好文 > 详细

makefile 文件

时间:2015-08-09 18:59:55      阅读:101      评论:0      收藏:0      [点我收藏+]

标签:编译器   程序   扩展名   

makefile三要素:目标,依赖,命令

GNU make 的主要预定义变量 

make -f makefilename   指定makefile文件

1.预定义变量 含义

$* 不包含扩展名的目标文件名称。

$+ 所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件。

$< 第一个依赖文件的名称。

$? 所有的依赖文件,以空格分开,这些依赖文件的修改日期比目标的创建日期晚。

$@ 目标的完整名称。

$^ 所有的依赖文件,以空格分开,不包含重复的依赖文件。

$% 如果目标是归档成员,则该变量表示目标的归档成员名称。例如,如果目标名称为 mytarget.so(image.o),则 $@ 为 mytarget.so,而 $% 为 image.o。

AR 归档维护程序的名称,默认值为 ar。

ARFLAGS 归档维护程序的选项。

AS 汇编程序的名称,默认值为 as。

ASFLAGS 汇编程序的选项。

CC C 编译器的名称,默认值为 cc。

CCFLAGS C 编译器的选项。

CPP C 预编译器的名称,默认值为 $(CC) -E。

CPPFLAGS C 预编译的选项。

CXX C++ 编译器的名称,默认值为 g++。

CXXFLAGS C++ 编译器的选项。

FC FORTRAN 编译器的名称,默认值为 f77。

FFLAGS FORTRAN 编译器的选项。



#注释符

@用于命令前,编译时,该命令不回显

[TAB] 命令前必须加[TAB]


2.

在模式规则中,规则的目标和依赖文件名代表了一类文件名。命令是对所有这一类文件重建过程的描述,显然,在命令中不能指定特定的文件名,否则模式规则将没


有了意义。那么在模式规则的命令行中该如何表示文件,将成我们这一小节的讨论重点。make中使用了“自动环变量”来实现这个目的,自动化变量的取值是根据具


体的规则决定的,就是说对不同的规则其所代表的文件名不同

3.变量

$() 和${}是一样的

递归展开赋值  : A=2 B=$(A) A=3  则最终B==3

直接展开赋值: A:=2 B:=$(A) A:=3  则最终B==2


一般情况下,只使用直接展开赋值

变量的替换引用:

//foo := a.o b.o c.o 

//bar := $(foo:.o=.c) 

//“bar”的值就为“a.c b.c c.c”

变量追加

objects += another.o 将使用空格隔开   相当于objects := $(objects) another.o

4.函数

调用方式: ${funname var1,var2,...}


comma:= , 

empty:= 

space:= $(empty) $(empty)    #空格的表示方法

foo:= a b c 

bar:= $(subst $(space),$(comma),$(foo)) 



4.1文本处理函数

$(subst FROM,TO,TEXT) 字符串替换函数   把字串“TEXT”中的“FROM”字符替换为“TO”

$(subst ee,EE,feet on the street) 

结果是新的字符串“fEEt on the strEEt”。  

$(patsubst PATTERN,REPLACEMENT,TEXT)  模式替换函数(以空格为分隔匹配模式) 

$(patsubst %.c,%.o,x.c m.c bar.c) 

结果是 x.o m.o bar.o

$(strip STRINT)  去空格函数—strip。

STR =        a    b c    

LOSTR = $(strip $(STR)) 

结果是“a b c”。 

$(findstring FIND,IN)  查找字符串函数

$(findstring a,a b c) 

$(findstring a,b c) 

第一个函数结果是字“a”;第二个值为空字符。

$(filter PATTERN…,TEXT) 过滤函数

sources := foo.c bar.c baz.s ugh.h 

$(filter %.c %.s,$(sources))

函数返回值为“foo.c bar.c baz.s”。

$(filter-out PATTERN...,TEXT) 反过滤函数

$(sort LIST) 排序函数

$(sort foo bar lose foo) 

返回值为:“bar foo lose”。 

$(word N,TEXT)   取单词函数

$(word 2, foo bar baz) 

返回值为“bar”。 

$(wordlist S,E,TEXT)  取单词函数

$(wordlist 2, 3, foo bar baz) 

返回值为:“bar baz”。 

$(words TEXT) 统计单词数目函数

$(words, foo bar) 

返回值是“2”。

$(firstword NAMES…) 取首单词函数

$(firstword foo bar) 

返回值为“foo”。

4.2 文件名处理函数

$(dir NAMES…)  取目录函数

$(dir src/foo.c hacks) 

返回值为“src/ ./”。 

$(notdir NAMES…) 取文件名函数

$(notdir src/foo.c hacks) 

  返回值为:“foo.c hacks”。 

$(suffix NAMES…)  取后缀函数

$(suffix src/foo.c src-1.0/bar.c hacks) 

返回值为“.c .c”。 

$(basename NAMES…)  取前缀函数

$(basename src/foo.c src-1.0/bar.c /home/jack/.font.cache-1 hacks) 

返回值为:“src/foo src-1.0/bar /home/jack/.font hacks”。 

$(addsuffix SUFFIX,NAMES…) 加后缀函数

$(addsuffix .c,foo bar) 

返回值为“foo.c bar.c”。 

$(addprefix PREFIX,NAMES…)  加前缀函数

$(addprefix src/,foo bar) 

返回值为“src/foo src/bar”。 

$(join LIST1,LIST2) 单词连接函数

$(join a b c , .c .o) 

返回值为:“a.c b.o c”。 

$(wildcard PATTERN) 获取匹配模式文件名函数

$(wildcard *.c) 

返回值为当前目录下所有.c 源文件列表。 

$(foreach VAR,LIST,TEXT)  循环函数  执行时把“LIST”中使用空格分割的单词依次取出赋值给变量“VAR” ,然后执行“TEXT”表达式。

dirs := a b c d 

files := $(foreach dir,$(dirs),$(wildcard $(dir)/*)) 

if 函数

$(call VARIABLE,PARAM,PARAM,...)  call函数 将它的参数“PARAM”依次赋值给临时变量“$(1)”、“$(2)”

$(value VARIABLE)  value函数

eval函数

$(origin VARIABLE)  origin函数

shell函数   contents := $(shell cat foo) 





















本文出自 “tech记录” 博客,谢绝转载!

makefile 文件

标签:编译器   程序   扩展名   

原文地址:http://a1liujin.blog.51cto.com/5519498/1683115

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!