资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,*,Makefile,讲解,Makefile,概述,Makefile,编写,Makefile,运行,Makefile,应用实例,课前培训,什么是,Unix shell,脚本,什么是,Makefile,什么是程序的编译链接,Makefile,概述,Makefile,的规则,Makefile,的内容,Makefile,的文件名,Makefile,的工作原理,Makefile,的工作方式,Makefile,的简单实例,Makefile,的规则,target.:mand,target,目标文件,prerequisites,源文件,command,源文件生成目标文件的规则,shell,命令,Makefile,内容,Makefile,里主要包含了五项内容,显式规则,隐晦规则,变量 引用文件,注释,Makefile,的文件名,默认的三种文件名,GNUMakefile,、,Makefile,、,makefile,执行时直接使用,make,命令,make,make -f,Makefile,自定义文件名,可使用自定义文件名,,makelib,执行时使用,make,的“,-f”,和“,-file”,参数,make f,makelib,make,的工作方式,1,、读入,Makefile,。,2,、读入引用,Makefile,等文件。,3,、初始化文件中的变量。,4,、推导隐晦规则,并分析所有规则。,5,、为所有的目标文件创建依赖关系链。,6,、根据依赖关系,决定哪些目标要重新生成。,7,、执行生成命令。,Makefile,的默认工作原理,找到第一个目标文件,并把该文件作为最终文件,根据依赖关系进行工作,如果目标文件的依赖文件不存在或者更新,会重新编译目标文件,如果没有依赖文件,,make,不会自动执行,command,命令,在过程中出现错误,,make,会直接退出并报错,简单的,Makefile,实例,objects=,main.o,kbd.o,command.o,display.o,insert.o,search.o,files.o,utils.o,edit:$(objects)cc-o edit$(objects),main.o,:,defs.h,kbd.o,:,defs.h,command.h,command.o,:,defs.h,command.h,display.o,:,defs.h,buffer.h,insert.o,:,defs.h,buffer.h,search.o,:,defs.h,buffer.h,files.o,:,defs.h,buffer.h,command.h,utils.o,:,defs.h,Makefile,的编写,Makefile,的书写规则,Makefile,的引用文件,Makefile,的引用变量,Makefile,的条件语法,Makefile,的引用函数,Makefile,的字符含义,Makefile,的书写规则,规则语法,target.:mand,targets:prerequisites;command,command,targets,文件名,以空格分开,prerequisites,目标所依赖的文件,以空格分开多个文件,command,命令行,,Tab,键,开头,用分号做为分隔,Makefile,的引用文件,include ,filename,文件名称路径,特点,符合,shell,的任意文件模式,多个文件以空格分开,include,不能以,Tab,键开始,可以存在空格,Makefile,的引用变量,变量命名语法,包含字符、数字,下划线(可以是数字开头),不能使用“,:”,、“,#”,、“,=”,或是空字符(空格、回车等),大小写敏感,定义,变量在声明时需要赋初值,使用,在变量名前加上“,$”,符号,建议使用小括号“()”或是大括号“,”,变量引用变量,$(,var:a,=b)”,或是“,$,var:a,=b,操作符,“,=”,和”,:=”,的区别,操作符“,?=”,Makefile,的条件语法,条件表达式的语法为:,endif,以及:,else,endif,其中,表示条件关键字,这个关键字有四个,ifeq,,,ifneq,,,ifdef,,,ifndef,允许多余的空格,,else,endif,不能以,Tab,键做为开始,Makefile,的条件语法,ifeq,(,),比较两个参数的值是否相同,相同为真,ifneq,(,),比较两个参数的值是否相同,不同为真,ifdef,变量的值非空,则表达式为真,Ifndef,变量的值为空,则表达式为真,Makefile,的引用函数,调用语法,$()$,函数名,函数的参数,语法要求,参数间以逗号“,”,分隔,函数名和参数之间以“空格”分隔,函数调用以“,$”,开头,,以圆括号或花括号把函数名和参数括起,Makefile,的引用函数,调用举例,$(,subst,),名称:字符串替换函数,subst,。功能:,-,被替换前的字符串,-,被替换后的字符串,-,被替换的字串,$(,subst,ee,EE,feet,on the street),原为,feet on the street,调用函数后为,fEEt,on the street,Makefile,的字符含义,命令间的“;”,上条命令结果应用到下条命令,命令行前的字符“,”,不显示执行命令,命令行前的字符“,-”,忽略执行该命令的错误,命令行前的字符“,#”,用于注释,,Makefile,中只有行注释,命令中的波浪号“,”,“/test”,,这就表示当前用户的,$HOME,目录下的,test,目录,“,hchen,/test”,则表示用户,hchen,的宿主目录下的,test,目录,命令中的波浪号“,”,换行符,文件中的通配符“*”,“,?”,和“,.”,Makefile,的运行,特点,命令同操作系统,Shell,的命令行,命令的开头以,Tab,键开头,或者紧跟在依赖规则后面的分号后,按,UNIX,的标准,Shell,解释执行“,/bin/,sh,”,make,按顺序执行命令,Makefile,的运行,make,命令执行结束的退出码,0,表示成功执行。,1,如果,make,运行时出现任何错误,其返回,1,。,2,使用,make,的“,-q”,选项,返回,0,则说明要更新,返回是,2,说明有错误发生。,Makefile,的运行,默认执行文件,GNUMakefile,、,Makefile,、,Makefile,指定执行文件,make f,hchen.mk,默认目标,Makefile,中的第一个(组)目标,指定目标,make fxl00101,Makefile,的运行,Makefile,的运行参数,-f-,指定需要执行的,Makefile,-n-,仅输出执行过程中的命令序列,但并不执行,-s-,全面禁止命令的显示,-t-,更新目标文件的时间,-q-,不运行命令,也不输出。仅仅是检查所指定的目标是否需要更新。如果是,0,则说明要更新,如果是,2,则说明有错误发生。,-i-,在执行时忽略所有的错误,-h-,显示帮助信息,-o -,指定生成的文件名称,-p-,输出,Makefile,中的所有数据,包括所有的规则和变量。,-,qp,输出信息而不执行,Makefile,p f/dev/null,查看执行,Makefile,前的预设变量和规则,Makefile,的运行,Makefile,的运行参数,“,debug=”,输出,make,的调试信息。它有几种不同的级别可供选择,如果没有参数,那就是输出最简单的调试信息。下面是,的取值:,a,也就是,all,,输出所有的调试信息。(会非常的多),b,也就是,basic,,只输出简单的调试信息。即输出不需要重编译的目标。,v,也就是,verbose,,在,b,选项的级别之上。输出的信息包括哪个,Makefile,被解析,不需要被重编译的依赖文件(或是依赖目标)等。,i,也就是,implicit,,输出所以的隐含规则。,j,也就是,jobs,,输出执行规则中命令的详细信息,如命令的,PID,、返回码等。,m,也就是,Makefile,,输出,make,读取,Makefile,,更新,Makefile,,执行,Makefile,的信息。,-d-,默认等同于,d=a,隐含规则,特点,是,Makefile,默认运行的规则,可使用系统变量,可自定义隐含规则,显式规则优于隐含规则,隐含规则,隐含规则实例,foo,:,foo.o,cc o,foo,foo.o,等价于,foo.o,:,foo.c,cc c,foo.c,隐含规则一览,编译,C,程序的隐含规则,“,.o”,的目标的依赖目标会自动推导为“,.c”,,并且其生成命令是,$(CC)c$(CPPFLAGS)$(CFLAGS),编译,C+,程序的隐含规则,编译,Pascal,程序的隐含规则,编译,Fortran/,Ratfor,程序的隐含规则,预处理,Fortran/,Ratfor,程序的隐含规则,汇编和汇编预处理的隐含规则,链接,Object,文件的隐含规则,“,”,目标依赖于“,.o”,,通过运行,C,的编译器来运行链接程序生成,其生成命令是:,$(CC)$(LDFLAGS).o$(LOADLIBES)$(LDLIBS),自定义隐性规则,规则语法,在目标定义中使用,“,%”,规则实例,%.o:%.c$(CC)-c$(CFLAGS)$(CPPFLAGS)$-o$,%.,tab.c,%.,tab.h,:%.y bison-d$,重载内建隐含规则,%.o:%.c$(CC)-c$(CPPFLAGS)$(CFLAGS)-,D$(date,),老式风格的,后缀规则,双后缀,定义一对后缀:目标文件的后缀和依赖目标的后缀。例如,“,.,c.o,”,相当于,“,%o:%c”,单后缀,定义一个后缀,也就是依赖目标的后缀。例如,.c,相当于,%:%.c“,自定义后缀,伪目标,.SUFFIXES:.,pco,.cob.pc,自定义隐性规则,自动化变量列表,$,表示规则中的目标文件集。,$%,仅当目标是函数库文件中,表示规则中的目标成员名。,$,依赖目标中的第一个目标名字。,$?,所有比目标新的依赖目标的集合,以空格分隔。,$,所有的依赖目标的集合,以空格分隔。如果在依赖目标中有多个重复的,那个这个变量会去除重复的依赖目标,只保留一份。,$+,这个变量很像,$,,也是所有依赖目标的集合。只是它不去除重复的依赖目标。,$*,这个变量表示目标模式中,%,及其之前的部分。,隐含规则搜索算法,找到目标文件,创建目标文件和依赖文件的规则列表,测试是否所有的依赖文件都存在或是理当存在,如果存在或是理当存在,形成规则,执行规则其相当的命令,并加载自定义变量,Makefile,的应用实例,谢谢,
展开阅读全文