Makefile 学习笔记(二) Makefile总述

1 Makefile里包含什么

    Makefile主要包含了5个部分:显式规则、隐晦规则、变量定义、文件指示和注释

显式规则

明显指出要生成的目标文件,其依赖的文件,生成的命令

隐晦规则

make具有自动推导文件以及文件依赖关系后面的命令的功能,故而可以简略书写makefile

变量定义

Makefile中可以定义一些变量(一般是字符串),其类似C语言里的宏

文件指示

1 在一个Makefile中引用另一个Makefile,类似Cinclude

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>执行生成命令。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值