Makefile 学习笔记(二) Makefile总述
2014-12-14 20:35
225 查看
1 Makefile里包含什么
Makefile主要包含了5个部分:显式规则、隐晦规则、变量定义、文件指示和注释
显式规则
明显指出要生成的目标文件,其依赖的文件,生成的命令
隐晦规则
make具有自动推导文件以及文件依赖关系后面的命令的功能,故而可以简略书写makefile
变量定义
在Makefile中可以定义一些变量(一般是字符串),其类似C语言里的宏
文件指示
1
在一个Makefile中引用另一个Makefile,类似C的include
2
根据某些情况指定Makefile中的有效部分,类似C的#if
3
定义一个多行的命令
注释
Makefile中只有行注释,符号是#
2 Makefile的文件名
默认情况下,make命令会在当前目录下按顺序寻找文件名为"Makefile"、"makefile"、"GNUmakefile"的文件,找到了就解释这个文件。不过最好不用使用"GNUmakefile",这个文件是GNU的make命令识别的。
自定义文件名,如"Make.Linux"、"Make.AIX",则需要使用make的参数"-f"或"--file",如make -f Make.Linux或make --file Make.AIX
3 引用其他的Makefile
在Makefile使用include关键字就可以把别的Makefile包含进来。
include语法: include <filename> 其中filename可以是当前操作系统shell的文件模式(可以包含路径和通配符)
*示例:
有几个Makefile文件,a.mk、b.mk、c.mk,foo.make,还有一个包含e.mk和f.mk的变量$(bar),则:
include foo.make *.mk $(bar) 等价于 include foo.make a.mk b.mk c.mk e.mk f.mk
*查找路径:
<1> 如果文件都没有指定绝对路径或是相对路径时,make会在当前目录下首先查找。
<2> 如果在当前目录找不到时,则按如下查找:
2.1> 如果make执行时,有"-I"或"--include-dir"参数,则make就会在这个参数所指定的目录下去寻找。
2.2> 如果目录<prefix>/include(一般是:/usr/local/bin或是/usr/include)存在的话,make也去找。
*文件不存在:
如果查找的文件不存在,则会产生一条警告信息,但不会马上出现致命错误。它会等include 中其他的makefile都读取完成后再重试,如果还是不行,make才会产生一条致命信息。
如果想让make不理那些无法读取的文件,而继续执行,你可以在include前面加一个减号-,如:
-include <filename>
其表示,无论include过程中出现什么错误,都不要报错继续执行。
4 环境变量MAKEFILES
如果当前环境中定义了环境变量MAKEFILES(其值是其他的Makefile,用空格分隔),make会把这个变量中的值做一个类似于include的动作。其与include的区别就是从这个环境变量中引入的Makefile的"target"不会起作用,即使环境变量中定义的文件发现错误,make也不会处理。
5 make的工作方式
GNU的make工作时的执行步骤:
1>读入所有的Makefile。
2>读入被include的其他Makefile。
3>初始文件中的变量。
4>推导隐晦规则,并分析所有规则。
5>为所有的目标文件创建依赖关系链。
6>根据依赖关系,决定哪些目标要重新生成。
7>执行生成命令。
Makefile主要包含了5个部分:显式规则、隐晦规则、变量定义、文件指示和注释
显式规则
明显指出要生成的目标文件,其依赖的文件,生成的命令
隐晦规则
make具有自动推导文件以及文件依赖关系后面的命令的功能,故而可以简略书写makefile
变量定义
在Makefile中可以定义一些变量(一般是字符串),其类似C语言里的宏
文件指示
1
在一个Makefile中引用另一个Makefile,类似C的include
2
根据某些情况指定Makefile中的有效部分,类似C的#if
3
定义一个多行的命令
注释
Makefile中只有行注释,符号是#
2 Makefile的文件名
默认情况下,make命令会在当前目录下按顺序寻找文件名为"Makefile"、"makefile"、"GNUmakefile"的文件,找到了就解释这个文件。不过最好不用使用"GNUmakefile",这个文件是GNU的make命令识别的。
自定义文件名,如"Make.Linux"、"Make.AIX",则需要使用make的参数"-f"或"--file",如make -f Make.Linux或make --file Make.AIX
3 引用其他的Makefile
在Makefile使用include关键字就可以把别的Makefile包含进来。
include语法: include <filename> 其中filename可以是当前操作系统shell的文件模式(可以包含路径和通配符)
*示例:
有几个Makefile文件,a.mk、b.mk、c.mk,foo.make,还有一个包含e.mk和f.mk的变量$(bar),则:
include foo.make *.mk $(bar) 等价于 include foo.make a.mk b.mk c.mk e.mk f.mk
*查找路径:
<1> 如果文件都没有指定绝对路径或是相对路径时,make会在当前目录下首先查找。
<2> 如果在当前目录找不到时,则按如下查找:
2.1> 如果make执行时,有"-I"或"--include-dir"参数,则make就会在这个参数所指定的目录下去寻找。
2.2> 如果目录<prefix>/include(一般是:/usr/local/bin或是/usr/include)存在的话,make也去找。
*文件不存在:
如果查找的文件不存在,则会产生一条警告信息,但不会马上出现致命错误。它会等include 中其他的makefile都读取完成后再重试,如果还是不行,make才会产生一条致命信息。
如果想让make不理那些无法读取的文件,而继续执行,你可以在include前面加一个减号-,如:
-include <filename>
其表示,无论include过程中出现什么错误,都不要报错继续执行。
4 环境变量MAKEFILES
如果当前环境中定义了环境变量MAKEFILES(其值是其他的Makefile,用空格分隔),make会把这个变量中的值做一个类似于include的动作。其与include的区别就是从这个环境变量中引入的Makefile的"target"不会起作用,即使环境变量中定义的文件发现错误,make也不会处理。
5 make的工作方式
GNU的make工作时的执行步骤:
1>读入所有的Makefile。
2>读入被include的其他Makefile。
3>初始文件中的变量。
4>推导隐晦规则,并分析所有规则。
5>为所有的目标文件创建依赖关系链。
6>根据依赖关系,决定哪些目标要重新生成。
7>执行生成命令。
相关文章推荐
- Makefile学习笔记4:Makefile的一些模板
- makefile学习笔记(二)
- Makefile的学习笔记
- u-boot-1.1.6 学习笔记——顶层目录 Makefile
- Makefile学习笔记
- linux环境arm裸机程序学习笔记1----makefile,中断,下载程序方法
- Makefile学习笔记
- Makefile 学习笔记 (1)
- Makefile学习笔记 - 我的CPP之路 - C++博客
- Linux Makefile学习笔记
- Makefile学习笔记3:Linux下makefile基础 (zz)
- linux学习笔记-读《Linux编程技术详解》(2)-make与makefile
- makefile学习笔记
- makefile学习笔记
- 学习笔记——Makefile中的=与:=
- Makefile学习笔记1:Linux平台Makefile文件的编写基础篇(zz)
- 操作系统学习笔记(5)--makefile文件实例
- 笔记:学习vc之makefile
- android 学习笔记(八)底层8.2 学习makefile 其中的函数
- 2012.2.29 linux学习笔记 gcc makefile的使用