Makefile文件(二)_总述

Makefile总述spa

1、Makefile里面有什么

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

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

隐晦规则:make具备自动推导功能,隐晦规则能够比较粗糙地简略书写Makefileblog

变量定义:如上一篇中的objects变量编译

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

注释:‘#’,文件中使用该符号能够利用转义符号‘/#’变量

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

2、Makefile的文件名

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

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

3、引用其余的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还会在如下几个目录找:

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

二、若是目录<prefix>/include(通常是:/usr/local/bin或/usr/include)存在的话,make也会去找

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

4、环境变量MAKEFILES

我也没看懂究竟是个啥,就记住了最好不要用,若是出错能够检查是否用了

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

建议不要使用环境变量,由于一旦定义,当使用make时,全部的Makefile都会受到影响。

5、make的工做方式

GUN的make工做执行步骤以下:

一、读入全部的Makefile

二、读入被include的其余Makefile

三、初始化文件中的变量

四、推导隐晦规则,分析全部规则

五、为全部目标文件建立依赖关系链

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

七、执行生成命令。

567解释了首先生成全部的依赖关系,再执行命令,很好的解释了哪些须要从新编译

1-5:第一个阶段,6-7:第二个阶段。第一阶段中,若是定义的变量被使用了,那么make会把其展开在使用的位置,但make并不会彻底立刻展开,make使用的是拖延战术。若是变量出如今依赖关系的规则中,那么仅当这条依赖被决定要使用了,变量才会在其内部展开。

相关文章
相关标签/搜索