1、Make介绍,王旭峰,Make是什么,是一种解释执行语言,有自己的语法规则,命令以及关键字 最初设计是为了维护C程序文件防止不必要的重新编译 用来构建和管理工程的工具 好处:自动化编译,工作原理,工作原理通过比较目标文件和依赖文件的最后修改时间来决定哪些文件需要更新依赖文件包括源文件以及文件中include的所有头文件,Makefile命名,Make文件命名不指定Makefile的情况下,make会在工作目录下按照“GNUmakefile”, “makefile”, “Makefile”的文件名顺序查找。可以通过指定要执行的makefile文件make -f your_makefile,基本规
2、则,基本规则 target . : prerequisites . Command 1. target也就是目标,可能为如下三种情况, 1. 执行文件2. 目标文件3. 伪目标 2. Prerequisites,必要条件,要生成当前target所需要的文件或是需要完成的子target 3. Command必须以字符开始,make程序会将其交给系统的shell 程序去解释执行,伪目标,伪目标Makefile中把没有任何依赖只有执行动作的目标称为“伪目标”(phony targets) 比如:clean。clean : rm *.o *.a make默认把第一个目标认作default目标,clea
3、n一般都是放在文件的最后 通过.PHONY来声明一个伪目标.PHONY: clean,伪目标使用,伪目标使用.PHONY: cleanclean :-rm /*.o 说明: 通过“.PHONY”特殊目标将“ clean”目标声明为伪目标。防止当磁盘上存在一个名为“clean”文件时,“clean”所在规则的命令无法执行 在命令行之前使用“-”,意思是忽略命令“rm”的执行错误,强制目标,实现和伪目标相同的功能,如:clean: FORCE -rm $(objects) FORCE: 如果一个规则没有依赖、也没有命令,则make认为只要该规则运行,该目标就已被更新。意味着,以这种规则为依赖的目标
4、,它们的命令将总被执行,Makefile内容,一个完整的 Makefile中,包含了五种内容: 1. 显式规则明确地给出目标文件、目标的依赖文件列表以及更新目标文件所需要的命令 2. 变量定义就是使用一个字符串代表一段文本串 3. 隐含规则make根据目标文件的命名而自动推导出来的规则 4. Makefile指示符执行一定任务的命令,包括Include语句、条件语句等等。 5. 注释“#”字符后的内容都被作为是注释内容处理,显式规则,明确给定的规则,如:libtest.a : file1.o file2.o $(AR) $(ARFLAGS) libtest.a file1.o file2.o
5、main: main.old main.o o main.omain.o: main.cgcc -c main.c -o main.o,变量定义,变量的概念 变量的赋值 变量的作用域 自动化变量,变量的概念,基本特征 1. 变量名由不包括:、“#”、“=”、前置空白和尾空白的任何字符串组成(尽量由字母、数字和下划线组成) 2. 变量可以用来代表一个文件名列表、编译选项列表、程序运行的选项参数列表、搜索源文件的目录列表、编译输出的目录列表 3. 变量名是大小写敏感的 4. 内置变量,自动化变量,像”$”,”$”,”$?”,”$*”等,变量的赋值,赋值的类型递归调用型(=)、静态(:=)、追加(+
6、=)、条件(?=)variable = deferredvariable ?= deferredvariable := immediatevariable += deferred or immediatedefine variabledeferredendef对于附加操作符+=,右边变量如果在前面使用(:=)定义为简单扩展变量则是立即变量,其它均为延时变量。 问题赋值variable = $(variable) OTHER_VALUE,变量的作用域,上层Makefile可以明确指定将一些变量的定义通过环境变量的方式传递给子Makefile过程。比如:make PROJECT=$(PRJNAME
7、) -f Makefile 传递变量到下级Makefile,应该在上层Makefile中使用指示符”export”对此变量进行声明。格式如下:export VARIABLE = value也可以写作:VARIABLE = valueexport VARIABLE没有明确指定的变量,不会被传递子Makefile unexport可以取消当前变量的传递 子make中存在同名变量定义,则上层传递的变量定义不会覆盖子Make中定义的值,自动化变量,特点: 不需要给它们赋值,根据运行上下文自动为其赋值 $ - 表示规则中的目标 $ - 表示规则中目标的第一依赖文件 $? - 表示规则中所有比目标新的条件
8、,组成一个列表,以空格分隔。 $ - 表示规则中的所有依赖条件,组成一个列表,以空格分隔 $* - 表示是目标规则中”%”所代表的部分,当文件名中存在目录时,$*也包含目录部分,隐含规则,内建隐含规则 模式规则,内建隐含规则,部分隐含规则 “.o”的依赖目标会自动推导为“.c”“.o” 依赖目标会自动推导为“.cc”或是“.C”CC = ccCXX = g+COMPILE.c = $(CC) $(CFLAGS) $(TARGET_ARCH) -c%.o: %.c$(COMPILE.c) $(OUTPUT_OPTION) $ 使用make -p可以查看内建隐含规则,模式(pattern)规则,在
9、规则中,目标定义包含“%“字符的。“%“可以匹配任何非空字符串(通配符) 目标中的“%“的值决定了依赖目标中的“%“的值 模式规则示例:OBJ = main.o kbd.o display.o files.o utils.otarget:$(OBJ)$(LINK) -o target $(OBJ)%.o : %.c $(CC) -c $(SELF_CFLAGS) $ -o $,Make指示符,Include指令 条件语句,include指令,include指令告诉make暂停读取当前Makefile文件,先读完include指令指定的Makefile文件后再继续 include和文件名之间以空
10、格隔开,两个文件名之间也以空格隔开 -include:如果文件不存在则忽略错误,条件语句,条件语句的规则类似C语言的语法,以ifeq、ifdef、ifneq和ifndef开头,以endif结束 语法ifeq conditionendif,ifeq condition else endif,Make其他内容,内置函数 文件搜索路径,内置函数,函数调用类似变量的使用,也是以”$”开头使用的,函数使用()或括起来调用,语法格式:$(function arguments) 函数大致分类: 1. 文本处理函数 2. 文件名处理函数 3. make的控制函数 4. 其他函数,文本处理函数,strip函数去
11、空格函数 $(subst ,) -字符串替换函数 $(patsubst ,) 模式字符串替换函数。如:$(patsubst %.c, %.o, $(SOURCES) $(findstring ,) 字符串查找函数,文件名处理函数,$(dir NAMES)取目录函数 $(notdir NAMES)取文件名,不包含目录 $(suffix NAMES) 取文件后缀 $(basename NAMES) 取文件名 $(wildcard PATTERN) 根据模式匹配获取文件列表,make的控制函数,$(error TEXT) 产生致命错误,打印信息”TEXT”,同时,make退出执行 $(warning
12、 TEXT)不会导致致命错误(make不退出),而只是提示”TEXT”,make的执行过程继续。可以用于在Makefile中添加log。,其他函数,if 函数语法:$(if conditions,then-part,else-part) foreach函数语法:$(foreach var,list,text) eval函数根据其参数的关系、结构,对它们进行替换展开 shell函数使用它来和外部通信,文件搜索路径,一般搜索(变量VPATH)VPATH = ./src /headers当前目录是第一搜索目录,然后搜索目录顺序按照变量“VPATH”定义中顺序进行 选择性搜索(关键字vpath)1、vpath 为符合模式的文件指定搜索目录vpath %.h $(INCPATHS)2、vpath 清除符合模式的文件的搜索目录 3、vpath 清除所有已被设置好了的文件搜索目录,谢 谢!,