makefile 文件

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

GNU make 的主要预定义变量

make -f makefilename   指定makefile文件

1.预定义变量 含义

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

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

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

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

[email protected] 目标的完整名称。

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

$% 如果目标是归档成员,则该变量表示目标的归档成员名称。例如,如果目标名称为 mytarget.so(image.o),则 [email protected] 为 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)

时间: 2024-11-05 10:46:14

makefile 文件的相关文章

linux中make命令的简单使用以及Makefile文件的书写

Makefile 会不会写makele,从一个侧面说明了一个是否具备完成大型工程的能力. 一个工程中的源件不计数,其按类型.功能.模块分别放在若干个目录中,makele定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makele就像一个Shell脚本一样,其中也可以执行操作系统的命令.makele带来的好处就是"自动化编译",一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率. ma

Makefile文件编写和autotools的使用

在Linux或Unix环境下,对于只含有几个源代码文件的小程序(如hello.c)的编译,可以手工键入gcc命令对源代码文件逐个进行编译:然而在大型的项目开发中,可能涉及几十到几百个源文件,采用手工键入的方式进行编译,则非常不方便,而且一旦修改了源代码,尤其头文件发生了的修改,采用手工方式进行编译和维护的工作量相当大,而且容易出错.所以在Linux或Unix环境下,人们通常利用GNU make工具来自动完成应用程序的维护和编译工作.实际上,GNU make工具通过一个称为Makefile的文件来

Makefile文件(三)_书写规则

Makefile书写规则包含两部分,一个是依赖关系,一个是生成目标.在Makefile中,规则的顺序很重要,因为Makefile中只有一个最终目标.一般,定义在Makefile中的目标可能会有很多,但是第一条规则中的目标将被确立为最终目标.如果第一条规则中的目标有多个,那么第一个目标会成为最终目标,也就是make所完成的目标. 一.规则举例 foo.o:foo.c defs.h  #foo模块 cc -c -g foo.c 这个规则告诉我们:文件的依赖关系,还有如果要生成或更新foo.o文件,则

C++学习笔记25:makefile文件2

Makefile文件语法 行解析:命令按行解析 命令行的行首字符为Tab键,其他行的行首字符不得为Tab键,但可以使用多个空格缩进 换行:命令太长时,行尾使用"\"换行 注释:行首字符为"#"的文本行 关闭回显:在行首字符后和命令前添加"@" 未关闭回显时,make会首先回显(打印)命令,然后执行该命令 通常仅在注释和纯显示的echo命令前使用此功能 include filename:包含其他文件 处理模式与c/c++类似 行首加"-&

工程管理之makefile与自动创建makefile文件过程

(风雪之隅 http://www.laruence.com/2009/11/18/1154.html) Linux Makefile自动编译和链接使用的环境 想知道到Linux Makefile系统的真相么,想知道Linux Makefile系统中藏有的内在奥义么,只有我来给大家全面讲解介绍Linux Makefile系统作为Linux下的程序开发人员,大家一定都遇到过Linux Makefile,用make命令来编译自己写的程序确实是很方便.一般情况下,大家都是手工写一个简单Linux Mak

Linux平台Makefile文件的编写基础入门(课堂作业)

根据老师的要求,写一个超简单的makefile准备:       准备三个文件:file1.c, file2.c, file2.h       file1.c: #include "file2.h" int main() { printf("print file1$$$$$$$$$$$$$$$$$$$$$$$$\n"); File2Print(); return 0; } file2.h: #include <stdio.h> #ifndef FILE2

Linux学习之Makefile文件的编写

转自:http://goodcandle.cnblogs.com/archive/2006/03/30/278702.html 目的:       基本掌握了 make 的用法,能在Linux系统上编程.环境:       Linux系统,或者有一台Linux服务器,通过终端连接.一句话:有Linux编译环境.准备:       准备三个文件:file1.c, file2.c, file2.h       file1.c:              #include <stdio.h>    

从简入难makefile文件编写,Linux C++编程,简单vi命令

 1.一个最基本的C++程序 2.第二个c++程序 3.第一个入门级别的简单的makefile 4.在makefile中定义变量. 5.编写makefile的依赖 如果start:标识后面的某个.o没有,则重新编译没有编译的那个文件 6.最终的makefile文件 总结:makefile是通过.o文件是否存在已经.cpp最后的修改时间来判断是否重新编译.o文件. 7.makefile不管理.h文件,它是编译器来进行管理的. vi: i在光标之前插入 a在光标后面插入 x删除后面的字符 dd删

C++学习笔记24:makefile文件

makefile make命令:负责c/c++程序编译与链接 make根据指定命令进行建构 建构规则文件:GNUmakefile , makefile,Makefile makefile 文件格式 makefile 语法 --基本语法,变量,条件判断,循环,函数 makefile 文件的基本格式 target...:prerequisites... [tab键]  commands makefile文件的规则 makefile 文件由一系列规则构成 规则目的:建构目标的先决条件是什么以及如何构建

Contiki 2.7 Makefile 文件(四)

3.第三部分 这里我们假设TARGET为native (1) OBJECTDIR = obj_$(TARGET) LOWERCASE = -abcdefghijklmnopqrstuvwxyz UPPERCASE = _ABCDEFGHIJKLMNOPQRSTUVWXYZ TARGET_UPPERCASE := ${strip ${shell echo $(TARGET) | sed y!$(LOWERCASE)!$(UPPERCASE)!}} CFLAGS += -DCONTIKI=1 -DC