嵌入式系统设计与开发 Make项目管理工具使用及Makefile文件编写

上传人:e****s 文档编号:243687983 上传时间:2024-09-28 格式:PPT 页数:90 大小:393.50KB
返回 下载 相关 举报
嵌入式系统设计与开发 Make项目管理工具使用及Makefile文件编写_第1页
第1页 / 共90页
嵌入式系统设计与开发 Make项目管理工具使用及Makefile文件编写_第2页
第2页 / 共90页
嵌入式系统设计与开发 Make项目管理工具使用及Makefile文件编写_第3页
第3页 / 共90页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,第一级,第二级,第三级,第四级,第五级,*,*,*,单击此处编辑母版标题样式,第一级,第二级,第三级,第四级,第五级,*,*,*,单击此处编辑母版标题样式,第一级,第二级,第三级,第四级,第五级,*,*,*,单击此处编辑母版标题样式,第一级,第二级,第三级,第四级,第五级,*,*,*,单击此处编辑母版标题样式,第一级,第二级,第三级,第四级,第五级,*,*,*,单击此处编辑母版标题样式,第一级,第二级,第三级,第四级,第五级,*,*,*,单击此处编辑母版标题样式,第一级,第二级,第三级,第四级,第五级,*,*,*,单击此处编辑母版标题样式,第一级,第二级,第三级,第四级,第五级,*,*,*,单击此处编辑母版标题样式,第一级,第二级,第三级,第四级,第五级,*,*,*,单击此处编辑母版标题样式,第一级,第二级,第三级,第四级,第五级,*,*,*,单击此处编辑母版标题样式,第一级,第二级,第三级,第四级,第五级,*,*,*,单击此处编辑母版标题样式,第一级,第二级,第三级,第四级,第五级,*,*,*,单击此处编辑母版标题样式,第一级,第二级,*,Version 2.0,单击此处编辑母版标题样式,第一级,第二级,单击此处编辑母版标题样式,第一级,第二级,*,单击此处编辑母版标题样式,第一级,第二级,*,单击此处编辑母版标题样式,第一级,第二级,*,单击此处编辑母版标题样式,第一级,第二级,*,单击此处编辑母版标题样式,第一级,第二级,*,单击此处编辑母版标题样式,第一级,第二级,*,单击此处编辑母版标题样式,第一级,第二级,*,单击此处编辑母版标题样式,第一级,第二级,*,单击此处编辑母版标题样式,第一级,第二级,*,主讲:油海东院系:信息学院通信教研室,302,专业:通信,07,,信工,07,,电信,07,,计本,07,嵌入式系统设计与开发,第,5,章,Make,及,makefile,文件的编写,1.,概述,2. Makefile,的规那么,4. 规那么的命令,中的变量,6.,执行,make,什么是make?,程序的编译和链接,源程序,(.c/.cpp/.s),编译,(compile),链接,(linker),形成目标文件,语法正确、变量和函数声明正确,Windows,:,.obj,UNIX/Linux,:,.o,形成可执行程序,链接函数和全局变量,链接只关心目标文件。多个目标文件形成一个库,Windows,:,.lib,UNIX/Linux,:,.a,、,.o,什么是make?,Make是大型程序维护工具,Make工作时,需要名字为“makefile的makefile文件。,Make就是一个解释makefile文件中指令的命令工具。,程序文件之间的依赖关系,makefile文件,在makefile(Makefile)文件中,采用自顶向下到的方法来说明依赖关系,1,gcc o network 2,3,gcc c 4,: 5,gcc c 6,执行make,在makefile(Makefile)文件所在的目录中,执行make命令,语法:make 选项 宏定义 目标文件,Make的工作过程,在当前目录下找名字叫“Makefile或“makefile的文件,2.如果找到,它会找文件中的第一个目标文件target,比方找到“network这个文件,并把这个文件作为最终的目标文件。,3.如果network文件不存在,或是network所依赖的后面的 .o 文件的文件修改时间要比network这个文件新,那么,他就会执行后面所定义的命令来生成network这个文件。,4.如果network所依赖的.o文件也存在,那么make会在当前文件中找目标为.o文件的依赖性,如果找到那么再根据那一个规那么生成.o文件使用源文件和.h文件。这有点像一个堆栈的过程,make时,哪些文件被重新编译,1. 所有的源文件没有被编译过,那么对各个 C源文件进行编译并进行链接,生成最后的可执行程序;,2. 每一个在上次执行make之后修改正的C源代码文件在本 make时将会被重新编译;,3. 头文件在上一次执行 make 之后被修改。那么所有包含此头文件的 C 源文件在本次执行make 时将会被重新编译。,关于Makefile文件名,默认的情况下,make命令会在当前目录下按顺序找寻文件名为“GNUmakefile、“makefile、“Makefile的文件,找到了解释这个文件。,也可以使用别的文件名来书写Makefile,这是执行Make命令时,需使用“-f和“-file参数。如:make -f 或make -file,makefile规那么介绍,一个简单的Makefile描述规那么组成:,TARGET. : PREREQUISITES.,COMMAND,.,-target:规那么的目标。,-通常是程序中间文件(.o)或者最后可执行文件名,-目标也可以是一个make执行的动作的名称,如目标“clean,这样的目标是“伪目标,-prerequisites:规那么的依赖。,-生成规那么目标所需要的文件名列表。通常一个目标依赖于一个或者多个文件。,-command:规那么的命令行,-是 make程序所有执行的动作任意的 shell 命令或者可在 shell下执行的程序,-一个规那么可以有多个命令行,每一条命令占一行。注意:每一个命令行必须以Tab字符开始,对“规那么的再认识,在 Makefile 中“规那么就是描述在什么情况下、如何重建规那么的目标文件,,通常规那么中包括了目标的依赖关系目标的依赖文件和重建目标的命令。,make执行重建目标的命令,来创立或者重建规那么的目标此目标文件也可以是触发这个规那么的上一个规那么中的依赖文件。,规那么包含了目标和依赖的关系以及更新目标所要求的命令。,一个简单的例子,#sample Makefile,edit : ,cc -o edit ,:,cc -c,:,cc -c,:,cc -c,:,cc -c,:,cc -c,:,cc -c,:,cc -c,:,cc -c,clean :,rm edit ,1.注释以#开头,2.一个较长行可以使用反斜线分解为多行,后不能有空格,3.目标“clean不是一个文件,它仅仅代表了执行一个动作的标识。 Makefile中把那些没有任何依赖只有执行动作的目标称为“伪目标 在执行make时,它所指定的动作不会被执行。除非执行make时明确地指定它作为重建目标。而且目标“clean没有任何依赖文件,它只有一个目的,就是通过这个目标名来执行它所定义的命令。Makefile中把执行“clean目标所定义的命令,可在shell下输入:make clean。,make工作过程的再分析-1,当在 shell 提示符下输入“make命令以后。make读取当前目录下的 Makefile文件,并将Makefile文件中的第一个目标作为“终极目标,开始处理第一个规那么。,make在处理这个规那么之前,首先将处理目标“edit的所有的依赖文件例子中的那些.o 文件的更新规那么,对.o文件所在的规那么的处理有以下三种情况:,1. 目标.o 文件不存在,使用其描述规那么创立它;,2. 目标.o 文件存在,目标.o 文件所依赖的.c 源文件、.h 文件中的任何一个比目标.o 文件“新在上一次 make之后被修改。那么根据规那么重新编译生成它;,3. 目标.o 文件存在,目标.o 文件比它的任何一个依赖文件的.c 源文件、.h 文件“更新它的依赖文件在上一次 make之后没有被修改,那么什么也不做。,make工作过程的再分析-2,完成了对.o 文件的创立第一次编译, make程序将处理终极目标“edit所在的规那么,分为以下三种情况:,1. 目标文件“edit不存在,那么执行规那么创立目标“edit。,2. 目标文件“edit存在,其依赖文件中有一个或者多个文件比它“更新,那么根据规链接生成“edit。,3. 目标文件“edit存在,它比它的任何一个依赖文件都“更新,那么什么也,要正确的编译一个工程。需要在提供给 make 程序的 Makefile 中来保证其依赖关系的正确性、和执行命令的正确性。,使用变量,在上例的 Makefile中可是添加这样一行:,objects = ,“objects作为一个变量,它代表所有的.o文件的列表,在需要使用这些.o文件列表的地方使用“$(objects)来表示它,objects = ,edit : $(objects),cc -o edit $(objects),.,.,clean :,rm edit $(objects),使用变量的例子,exe :,gcc -o exe,: gcc -g -c o,:,gcc -g -c -o,OBJS,=,CC,= gcc,CFLAGS,= -g,exe: $(,OBJS,) $(,CC,) $(,OBJS,) -o exe,:,$(,CC,) $(,CFLAGS,) c -o,:,$(,CC,) $(,CFLAGS,) -c -o,自动推导规那么(隐含规那么),make中,编译.o文件时,make会认为其源程序就是同文件名的.c源文件,因此依赖列表中可以省略.c文件,这是make的隐含规那么,书写 Makefile时,对于一个.c 文件如果使用 make的隐含规那么,那么它会被自动作为对应.o 文件的一个依赖文件对应是指:文件名除后缀外,其余都相同的两个文件。因此可以在规那么中省略目标的倚赖.c 文件。,使用隐含规那么和变量的例子,# sample Makefile,objects = ,edit : $(objects),cc -o edit $(objects),:,:,:,:,:,:,:,:,.PHONY : clean,clean :,rm edit $(objects),清洗工作目录过程文件,clean :,rm edit $(objects),一般写为:,.PHONY : clean,clean :,-rm edit $(objects),两个实现有两点不同:,1. 通过“.PHONY特殊目标将“clean目标声明为伪目标。防止当磁盘上存在一个名为“clean文件时,“clean所在规那么的命令无法执行。,2. 在命令行之前使用“-,意思是忽略命令“rm的执行错误,第,7,章,Make,及,makefile,文件的编写,1.,概述,2. Makefile,的规那么,4. 规那么的命令,中的变量,6.,执行,make,21,Makefile的内容,在一个完整的 Makefile 中,包含了 5 个东东:,显式规那么,隐含规那么,变量的定义,指示符,注释,它描述了在何种情况下如何更新一个或者多个被称为目标的文件。,在书写,Makefile,是需要明确地给出目标文件、目标的依赖文件列表以及更新目标文件所需要的命令。,它是make根据此类目标文件的命名典型的是文件名的后缀而自动推导出来的规那么。,make根据目标文件的名字,自动产生目标的依赖文件并使用默认的命令来对目标进行更新。,就是使用一个字符串代表一段文本串,当定义了变量以 后,,Makefile,后续在需要使用此文本串的地方,通过引用这个变量来实现对文本串的使用,指明在 make程序读取 makefile文件过程中所要执行的一个动作。包括:,1. 读取给定文件名的文件。,2.决定通常是根据一个变量的得值处理或忽略Makefile中的某一特定局部,3.定义一个多行变量。,Makefile 中“#字符后的内容被作为是注释内容,注释行的结尾如果存在反斜线,那么下一行也被作为注释行,当在 Makefile中需要使用字符“#时,可以使用反斜线加“#来实现,makefile文件的命名,执行make命令时,默认的情况下,make 会在工作目录执行 make 的目录下按照文件名顺序寻找 makefile文件读取并执行,查找的文件名顺序为:“GNUmakefile、“makefile、“Makefile。,通常应该使用“makefile或者“Makefile作为一个 makefile 的文件名,“GNUmakefile 不推荐使用,因为以此命名的文件只有“GNU make才可以识别。,当 makefile文件的命名不是这三个任何一个时,需要通过 make的“-f或者“-file选项来指定 make 读取的 makefile 文件。,包含其它的Makefile,include FILENAMES.,make暂停读取当前的Makefile,转而去读取include下的Makefile,结束后,继续当前的Makefile,书写在独立的一行,不可以tab开头,可使用“-include来代替“include,忽略由于包含文件不存在或者无法创立时的错误提示(“-的意思是告诉 make,忽略此操作的错误。make继续执行),MAKEFILES变量,如果当前环境定义了一个“MAKEFILES的环境变量,make执行时首先将此变量的值作为需要读入的Makefile文件,多个文件之间使用空格分开。类似使用指示符“include包含其它Makefile文件一样,变量“MAKEFILES主要用在“make的递归调用过程中的的通信,实际应用中很少设置此变量。,MAKEFILE_LIST变量,make程序在读取多个 makefile文件时,在对这些文件进行解析执行之前,将会被自动的追加到变量“MAKEFILE_LIST的定义域中。,make如何解析Makefile,分为两个阶段,第1阶段:读取所有的Makefile文件,内建所有的变量、明确规那么和隐含规那么,并建立所有目标和依赖之间的依赖关系结构链表。,第2阶段:根据第1阶段建立的目标和依赖之间的依赖关系结构链表决定哪些目标需要更新,并使用响应的规那么,对该目标进行更新。,理解 make执行过程的两个阶段是很重要的。它能帮助我们更深入的了解执行过程中变量以及函数是如何被展开的。,在make的第1阶段,变量和函数被展开的,称为立即展开,否那么为延后展开。,第,7,章,Make,及,makefile,文件的编写,1.,概述,2. Makefile,的规那么,4. 规那么的命令,中的变量,6.,执行,make,28,Makefile规那么,Makefile中,规那么描述了何种情况下使用什么命令来重建一个特定的文件,此文件被称为规那么“目标通常规那么中的目标只有一个。,规那么所罗列的其他文件称为“目标的依赖,规那么中的命令是用来更新或者创立此规那么的目标,终极目标所在的规那么,应该是Makefile中的第1个规那么,其余规那么不分次序。,终极目标,终极目标,就是执行make时,没有指明具体目标时,make默认的那个目标。,第1个规那么有多个目标时,第1个目标为终极目标,除非以下两种情况,1.目标名以点号.隔开,其后没有斜线/,2.作为模式规那么的目标,“终极目标“是执行 make的唯一目的,其所在的规那么作为第一个规那么。,规那么的语法,通常规那么的语法格式如下:,TARGETS : PREREQUISITES,COMMAND,.,或者是这样:,TARGETS : PREREQUISITES ; COMMAND,COMMAND,.,规那么的核心思想,规那么的中心思想就是:目标文件的内容是由依赖文件决定,依赖文件的任何一处改动,将导致目前已经存在的目标文件的内容过期。规那么的命令为重建目标提供了方法。这些命令运行在系统 shell 之上。,规那么中的命令被执行有两种情况,1. 目标文件不存在;,2. 存在一个依赖的最后修改时间比目标的最后修改时间晚,依赖的类型,常规依赖,常规依赖中的任何一个文件更新,都会导致重建目标。常用的形式,order-only依赖,在更新目标目标文件已经存在时,只需要根据依赖文件中的局部来决定目标是否需要被重建,而不是在依赖文件的任何一个被修改后都重建目标。,依赖的改动不会导致目标重建,称为order-only依赖,在书写规那么时,“order-only依赖使用管道符号“|开始,左边是常规依赖,管道符右边的全部是order-only依赖。,举例,LIBS =,foo : | $(LIBS),$(CC) $(CFLAGS) $ $ 等价于,bigoutput :,generate -big bigoutput,littleoutput :,generate -little littleoutput,多规那么目标,Makefile中,一个文件作为多个规那么的目标出现。,此目标文件的所有依赖文件将会被合并成此目标一个依赖文件列表,其中任何一个依赖文件比目标更新比较目标文件和依赖文件的时间戳时,make将会执行特定的命令来重建这个目标。,重建此目标的命令只能出现在一个规那么中。如果多个规那么同时给出重建此目标的命令,make将使用最后一个规那么所用的命令,同时提示错误信息,如果目标的任何一个规那么没有定义重建此目标的命令,make将会寻找一个适宜的隐含规那么来重建此目标。,多规那么目标举例,objects =,:,:,$(objects) :,这是一个描述规那么,仅仅用来描述依赖关系,和都是多规那么的目标,如果文件发生变化,那么和都会自动重建。,静态模式规那么,静态模式规那么是这样一个规那么:规那么存在多个目标,并且不同的目标可以根据目标文件的名字来自动构造出依赖文件。,根本语法,TARGETS .: TARGET-PATTERN: PREREQ-PATTERNS,COMMANDS,.,-“TAGETS列出了此规那么的一系列目标文件,-可以使用通配符,-目标模式TAGET-PATTERN,-依赖模式PREREQ-PATTERNS,-说明了如何为目标文件生成依赖文件,-生成方法:从目标模式的目标文件中抽取一局部字符(称为茎)来代替依赖模式中的相应局部。,自动生成依赖文件的过程,在目标模式和依赖模式中,一般需要包含模式字符 %。在目标模式TAGET-PATTERN中“%可以匹配目标文件的任何局部,模式字符“%匹配的局部就是“茎。比方目标“符合模式“%.o,其“茎为“foo。而目标“和“就不符合此目标模式。,每一个目标的依赖文件是使用此目标的“茎代替依赖模式 PREREQ-PATTERNS中的模式字符“%而得到。如果依赖模式PREREQ-PATTERNS为“%.c,那么使用“ foo替代依赖模式中的“%得到的依赖文件就是“。,静态模式举例,objects =,all: $(objects),$(objects): %.o: %.c,$(CC) -c $(CFLAGS) $ -o $,对目标,根据目标模式%.o,所以其茎应为foo,使用该茎,替代依赖模式%.c中的模式字符“%,因此的依赖文件就是,命令行中“$和“$是自动化变量,“$表示规那么中的第一个依赖文件。 $表示规那么中的目标文件,:,$(CC) -c $(CFLAGS) -o,:,$(CC) -c $(CFLAGS) -o,双冒号规那么,双冒号规那么就是使用“:代替普通规那么的“:得到的规那么,双冒号规那么允许在多个规那么中为同一个目标指定不同的重建目标的命令,注意:Makefile中,一个目标可以出现在多个规那么中。但是这些规那么必须是同一种规那么,要么都是普通规那么,要么都是双冒号规那么。而不允许一个目标同时出现在两种不同的规那么中,双冒号规那么和普通规那么的区别,对于一个没有依赖而只有命令行的双冒号规那么,当引用此目标时,规那么的命令将会被无条件执行。普通规那么呢?,当同一个文件作为多个双冒号规那么的目标时。这些不同的规那么会被独立的处理。就是说多个双冒号规那么中的每一个的依赖文件被改变之后,make 只执行此规那么定义的命令,而其它的以这个文件作为目标的双冒号规那么将不会被执行普通规那么呢?,双冒号规那么举例,Newprog :,$(CC) $(CFLAGS) $ -o $,Newprog :,$(CC) $(CFLAGS) $ ./foo,foo : bar/lose,cd bar; ,gobble lose ./foo,或,命令执行的错误,规那么中的命令在运行结束后,make会检测命令执行的返回状态,返回成功,就执行下一条命令,出错返回状态非 0,make就会放弃对当前规那么的执行,也有可能会终止所有规那么的执行。,在命令之前加一个减号“-在Tab字符之后, make忽略此命令的执行失败。,clean:,-rm *.o,即使删除.o文件失败,make也继续执行,命令执行的错误,在执行 make 时,如果使用命令行选项“-i或者“ignore-errors, make 会忽略所有规那么中命令执行的错误。但会提示有错误出现,并提示该错误被忽略。后续命令可能不能继续执行,退出make。,使用 make的命令行选项“-k或者“-keep-going ,当出现错误时不立即退出,而是继续后续命令的执行。直到无法继续执行命令时才异常退出。,在 make 执行失败时,修改错误之后再次执行 make 之前,使用“make clean明确的删除第一次错误重建的所有目标 。为什么?,中断make的执行,CTRL+C,再次执行make之前,请先使用make clean来去除中断make时产生的目标文件。,make的递归执行,在 Makefile 中使用“make作为一个命令来执行本身或者其它makefile 文件。,一般用在一个存在有多级子目录的工程中。,举例:当前目录下,包含一个子目录subdir,子目录中也有一个Makefile,当前目录下make时,完成包括子目录的所有编译,在当前目录下的Makefile中,就可以使用make的递归,subsystem:,cd subdir & $(MAKE),subsystem:,$(MAKE) -C subdir,或,变量MAKE,在使用 make 的递归调用时,在 Makefile 中规那么的命令行中应该使用变量“MAKE来代替直接使用“make,使用MAKE变量的目的,保证最上层使用的 make程序和其子目录下执行的 make保持一致,对某些make的选项不起作用,subsystem:,cd subdir & $(MAKE),make t时,直接使用make,和使用MAKE变量,会有很大的区别。,变量和递归,上层Makefile中,使用“export 变量名声明的变量,会传递给子make过程中。,变量“SHELL和“MAKEFLAGS除非使用指示符“unexport对它们进行声明,否那么在整个 make 的执行过程中它们会始终被自动的传递给子 make,指示符“export或者“unexport的参数变量局部,如果它是对一个变量或者函数的引用,这些变量或者函数将会被立即展开。并赋值给export或者unexport的变量,export的用法,定义变量时,同时进行声明。例如,1. export VARIABLE = value,等效于:,VARIABLE = value,export VARIABLE,2. export VARIABLE := value,等效于:,VARIABLE := value,export VARIABLE,不带任何参数的指示符“export ,表示将此 Makefile 中定义的所有变量传递给子 make 过程,变量MAKELEVEL,在多级递归调用的 make 执行过程中。变量“MAKELEVEL代表了调用的深度。,最上一级时“MAKELEVEL的值为“0、下一级时为“1、再下一级为“2 :,命令行选项和递归,在 make的递归执行过程中。最上层可以称之为主控make的命令行选项“-k、“-s等被自动的通过环境变量“MAKEFLAGS传递给子 make 进程。,在主控执行make时使用“-k和“-s选项,那么“MAKEFLAGS的值就为“ks,“-C、“-f、“-o和“-W,这些命令行选项不会被赋值给变量“MAKEFLAGS,定义命令包,什么是命令包?,类似,C,语言中的自定义函数,语法格式:,define,名称,命令块,endef,命令包的使用和对变量的使用一样,:,$(run-yacc),define run-yacc,yacc $(firstword $),mv $,endef,自动化变量,空命令,规那么中,只有目标文件可以有依赖文件,但一般不用,但没有命令行。这就是空命令规那么。,格式:target: ;,使用空命令行可以防止make在执行时图重建这个目标而查找隐含命令,第,7,章,Make,及,makefile,文件的编写,1.,概述,2. Makefile,的规那么,4. 规那么的命令,中的变量,6.,执行,make,70,使用变量/宏,Makefile中的变量有如下特征,1. Makefile 中变量和函数的展开除规那么的命令行以外,是在 make 读取 makefile 文件时进行的,2.变量名是不包括“:、“#、“=、前置空白和尾空白的任何字符串,但建议只使用字母、数字、下划线,3.变量名是大小写敏感的,4.自动化变量。,变量的引用,“$VARIABLE_NAME或者“$ VARIABLE_NAME 来引用一个变量,变量的引用展开过程完全和 c语言中的宏展开的过程一样,是一个严格的文本替换过程。,objects =,program : $(objects),cc -o program $(objects),$(objects) :,program :,cc -o program,:,展开后,两种变量定义,一个变量的定义有两种方式或者称为风格,递归展开式变量,直接展开式变量,变量的这两种不同的风格的区别在于:1. 定义方式;2. 展开时机。,递归展开式变量,变量的定义使用“=或者“define指示符来定义,在引用的地方是严格的文本替换过程,如果此变量定义中存在对其他变量的引用,这些被引用的变量会在它被展开的同时被展开,foo = $(bar),bar = $(ugh),ugh = Huh?,all:;echo $(foo),执行make时,显示“Huh?替换过程为:首先“$(foo)被替换“$(bar),接下来“$(bar)被替换为“$(ugh),最后“$(ugh)被替换为“Hug?。整个替换的过程是在执行“echo $(foo)时进行的。,优缺点,优点:可以引用其它的之前没有定义的变量,可能在后续局部定义,或者是通过 make 的命令行选项传递的变量,缺点:1.可能会由于出现变量的递归定义而导致 make 陷入到无限的变量展开过程中,最终使 make 执行失败。例如,x = $(y),y = $(x) $(z),2.如果引用了函数,那么函数总会在其被引用的地方被执行。,直接展开式变量,使用“:=来定义的变量,该类型变量值中对另外变量的引用或者函数的引用在定义时被展开,不能实现对其后定义变量的引用,推荐使用这种方式定义变量,x := foo,y := $(x) bar,x := later,y := foo bar,x := later,“?=操作符,只有此变量在之前没有赋值的情况下才会对这个变量进行赋值,FOO ?= bar,如果变量“FOO没有定义过,就给它赋值“bar。否那么不改变它的值,追加变量的值,在便令定义时,赋给一个根本的值,后续根据需要,给它增加一些必要的值,使用“+=操作符,objects =,objects +=,会把追加到objects的末尾,并以空格分隔,目标指定变量,在Makefile中定义一个变量,这个变量对此Makefile的所有规那么都是有效的。是一个“全局的变量。,另一种变量是目标指定变量“ Target-specific Variable。允许对于相同变量根据目标指定不同的值,目标指定的变量值只在指定它的目标的上下文中有效。此种变量是“局部的。.,设置一个目标指定变量的语法为:,TARGET . : VARIABLE-ASSIGNMENT,或者:,TARGET . : override VARIABLE-ASSIGNMENT,目标指定变量说明,“VARIABLE-ASSIGNMENT可以使用任何一个有效的赋值方式,“=递归、“:=静态、“+=追加或者“? =条件。,使用目标指定变量值时,目标指定的变量值不会影响同名的那个全局变量的值。只对指定的这些目标有效,目标指定的变量变量会作用到由这个目标所引发的所有的规那么中去。,prog : CFLAGS = -g,prog :,对于目标“prog以及其所引发的所有包含目标为“、“和“的所有规那么规那么,变量“CFLAGS值都是“-g。,目标指定变量举例,# sample Makefile,CUR_DIR = $(shell pwd),INCS := $(CUR_DIR)/include,CFLAGS := -Wall I$(INCS),EXEF := foo bar,.PHONY : all clean,all : $(EXEF),foo :,foo : CFLAGS+=-O2,bar :,bar : CFLAGS+=-g,.,.,$(EXEF) :,$(CC) $(CFLAGS) $(addsuffix .c,$) o $,clean :,$(RM) *.o *.d $(EXES),使用目标指定变量可以在,Makefile,实现,对于不同的目标文件使用不同的编译参数,第,7,章,Make,及,makefile,文件的编写,1.,概述,2. Makefile,的规那么,4. 规那么的命令,中的变量,6.,执行,make,82,执行make的一般方法,在shell提示符下,执行make命令,会自动读取该目录下的Makefile文件,从而执行相应的规那么。,执行make的其它用途:,1. 使用 make更新一局部过时文件而不是全部,2. 需要使用另外的编译器或者重新定义编译选项,3. 只需要观察哪些文件被修改,而不需要重新编译,为了到达这些目的,就需要使用make的命令行参数,Make退出的状态,0:状态为 0 时,表示执行成功。,2:执行过程出现错误,同时会提示错误信息。,1:在执行make时使用了“-q参数,而且当前存在过时的目标文件,指定Makefile文件,当需要将一个普通命名的文件作为makefile文件时,需要使用make的“-f、“-file或者“-makefile选项,默认情况,在没有使用“-f“-file或者“-makefile指定文件时。make会在工作目录当前目录依次搜索命名为“GNUmakefile、“makefile和“Makefile的文件,最终解析执行的是这三个文件中首先搜索到的那一个。,指定终极目标,默认情况下,终极目标就是出现在Makefile中,除以点号“.开始的第1个规那么中的目标。,点号开始的是什么目标?(.PHONY),如果第1个规那么中有多个目标,那么第1个目标就是终极目标。,可以指定此次make过程的终极目标,方法为:make 目标名,例如:make clean。,变量“MAKECMDGOALS记录了命令行参数指定的终极目标列表。,防止特定文件重建,当修改了工程中的某一个文件后,并不希望重建那些依赖于这个文件的目标。例如头文件修改后,并不对于依赖该头文件的目标造成任何影响。,方法:1.执行编译,使用“make o HEADERFILE,“HEADERFILE为需要忽略更改的头文件,防止那些依赖于这个头文件的目标被重建。-o参数的这种使用方式仅限于头文件.h文件,2.执行make -t,常用的make命令行选项,-n:指定 make 执行空操作不执行规那么的命令,只打印出需要重建目标使用的命令只打印过期的目标的重建命令,而不对目标进行重建。,-t:新所有目标文件的时间戳对于过时的目标文件不进行内容更新,只更新时间戳。,-q:不执行任何命令并且不打印任何输出信息,只检查所指定的目标是否已经是最新更。如果是那么返回 0,否那么返回 1,自动化变量,$-代表规那么中的目标文件名,$ -规那么的第一个依赖文件名,$-规那么的所有依赖文件列表,使用空格分隔,$%-规那么的目标文件是一个静态库文件时,代表静态库的一个成员名。例如,规那么的目标是,“),那么,“$%的值就为“,“$的值为“。如果目标不是函数库文件,其值为空,谢谢,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 幼儿教育


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!