Makefile文件(二)_总述

Makefile总述

一、Makefile里面有什么

Makefile主要包含了五个东西:显示规则、隐晦规则、变量定义、文件指示和注释。

显示规则:明显指出要生成的文件,文件的依赖文件,生成的命令

隐晦规则:make具有自动推导功能,隐晦规则可以比较粗糙地简略书写Makefile

变量定义:如一中的objects

文件指示:一个Makefile中引用另一个Makefile;根据某些情况指定Makefile中的有效部分;定义一个多行的命定

注释:‘#’,文件中使用该符号可以利用转义符号‘/#’

注:Makefile中的命令,必须以Tab键开始。

二、Makefile的文件名

默认情况下,make命令会在当前目录下按顺序寻找“GNUmakefile”、“makefile”、“Makefile”文件。最好使用“Makefile”。

还可使用别的文件名来书写Makefile,比如:“Make。Linux”,“Make.Solaris”,“Make.AIX”等。如果要制定特定的Makefile,可以使用make的“-f”和“--file”参数,如:make -f Make.Linux或make --file Make.AIX。

三、引用其他的Makefile

在Makefile中使用include关键字可以把别的Makefile包含进来,被包含的文件会原模原样的放在当前文件的包含位置。

include语法是:

include<filename>    #filename可以是当前操作系统的Shell的文件模式,可以包含路径和通配符

在include前面可以有一些空字符,但是绝不能是Tab键开始。include和<filename>可以用一个或多个空格隔开。

例子,现有这样几个Makefile:a.mk,b.mk,c.mk,还有一个文件foo.make,变量¥(bar)=e.mk f.mk,那么

include  foo.make  *.mk  $(bar)    ====》》》 等价于:include foo.make a.mk b.mk c.mk e.mk f.mk

make命令开始时,会找寻include所指出的其他Makefile,并把其内容安置在当前的位置。如果文件没有指定绝对路径或是相对路径的话,make会在当前目录下首先寻找,如果当前目录下没有找到,那么make还会在以下几个目录找:

1、如果make执行时,有“-I”或“--include-dir”参数,那么make就会在这个参数所指定的目录下寻找

2、如果目录<prefix>/include(一般是:/usr/local/bin或/usr/include)存在的话,make也会去找

如果文件没有找到的话,make会生成一条警告信息,但不会马上出现致命错误,他会继续载入其他文件,一旦完成makefile的读取,make会再重试这些没有找到或是不能读取的文件,如果还是不行,make才会出现一条致命信息。若想make不理会那些无法读取的文件继续执行,可在include前加‘-’。如:-include<filename>。和其他版本make兼容的相关命令是sinclude,作用一样。

四、环境变量MAKEFILES

(我也没看懂到底是个啥,就记住了最好不要用,如果出错可以检查是否用了)

如果当前环境中定义了环境变量MAKEFILES,那么,make会把这个变量中的值做一个类似include的动作。这个变量中的值是其他的Makefile,用空格分隔。只是他与include不同的是,从这个环境变量中引入的Makefile的目标不会起作用,如果环境变量中定义的文件发现错误,make也不理会。

建议不要使用环境变量,因为一旦定义,当时用make时,所有的Makefile都会受到影响。

五、make的工作方式

GUN的make工作执行步骤如下:

1、读入所有的Makefile

2、读入被include的其他Makefile

3、初始化文件中的变量

4、推导隐晦规则,分析所有规则

5、为所有目标文件创建依赖关系链

6、根据依赖关系,决定哪些目标要重新生成。

7、执行生成命令。

567解释了先生成所有的依赖关系,再执行命令,很好的完成了哪些需要重新编译

1-5:第一个阶段,6-7:第二个阶段。第一阶段中,如果定义的变量被使用了,那么make会把其展开在使用的位置,但make并不会完全马上展开,make使用的是拖延战术。如果变量出现在依赖关系的规则中,那么仅当这条依赖被决定要使用了,变量才会在其内部展开。(也没懂)

时间: 2024-10-10 21:59:20

Makefile文件(二)_总述的相关文章

Makefile文件(六)_使用条件判断

参考:http://blog.csdn.net/liang13664759/article/details/1771246/ 使用条件判断,可以让make根据运行时的不同情况选择不同的执行分支.条件表达式可以使比较变量的值,或是比较变量和常量的值. 一.示例 判断$(CC)变量是否"GCC",如果是的话,则用GNU函数编译目标. libs_for_gcc=lgnu normal_libs= foo:$(objects) ifeq($(CC),gcc) $(CC)  -o foo $(o

Makefile文件(七)_使用函数

参考http://blog.csdn.net/liang13664759/article/details/1771246/ 一.函数的调用语法 函数调用,如变量的使用,也是以"$"来标识的,语法如下: $(<function> <arguments>) 或者: ${<function> <arguments>} 这里,<function>是函数名,make支持的函数不多,<arguments>是函数的参数,参数间以

Linux makefile教程之总述二[转]

Makefile 总述——————— 一.Makefile里有什么? Makefile里主要包含了五个东西:显式规则.隐晦规则.变量定义.文件指示和注释. 1.显式规则.显式规则说明了,如何生成一个或多的的目标文件.这是由Makefile的书写者明显指出,要生成的文件,文件的依赖文件,生成的命令. 2.隐晦规则.由于我们的make有自动推导的功能,所以隐晦的规则可以让我们比较粗糙地简略地书写Makefile,这是由make所支持的. 3.变量的定义.在Makefile中我们要定义一系列的变量,变

很详细、很移动的Linux makefile教程:介绍,总述,书写规则,书写命令,使用变量,使用条件推断,使用函数,Make 的运行,隐含规则 使用make更新函数库文件 后序

很详细.很移动的Linux makefile 教程 内容如下: Makefile 介绍 Makefile 总述 书写规则 书写命令 使用变量 使用条件推断 使用函数 make 的运行 隐含规则 使用make更新函数库文件 后序 近期在学习Linux下的C编程,买了一本叫<Linux环境下的C编程指南>读到makefile就越看越迷糊,可能是我的理解能不行. 于是google到了以下这篇文章.通俗易懂.然后把它贴出来,方便学习. 后记,看完发现这篇文章和<Linux环境下的C编程指南>

Makefile文件(三)_书写规则

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

Makefile文件(四)_书写命令

变量说明: [email protected]       --->      目标文件 $^       --->       所有的依赖文件 $<       --->       第一个依赖文件 一.显示命令 @echo 正在编译xx模块...... 当make执行时,会输出"正在编译xx模块......",但不会输出命令 echo 正在编译xx模块...... make将输出:echo 正在编译xx模块......  正在编译xx模块...... 说明:

Makefile总述②

Makefile的内容 在一个完整的 Makefile 中,包含了 5 个东西:显式规则.隐含规则.变量定义.指示符和注释. 显式规则:它描述了在何种情况下如何更新一个或者多个被称为目标的文件( Makefile 的目标文件).书写 Makefile 时需要明确地给出目标文件.目标的依赖文件列表以及更新目标文件所需要的命令(有些规则没有命令,这样的规则只是纯粹的描述了文件之间的依赖关系). 隐含规则:它是make根据一类目标文件(典型的是根据文件名的后缀)而自动推导出来的规则. make根据目标

linux中Makefile文件相关内容

第一章.概述什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional(专业)的程序员,makefile还是要懂.这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解HTML的标识的含义.特别在Unix下的软件编译,你就不能不自己写makefile了,会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力.因为,makefile关系到了整个

makefile文件操作大全

 Makefile的规则 -- 转自 :http://blog.csdn.net/ruglcc/article/details/7814546/ 在讲述这个Makefile之前,还是让我们先来粗略地看一看Makefile的规则.  target... : prerequisites ...           command           ...           ...         --------------------------------------------------