makefile -01- 初识

0. 声明http://blog.51cto.com/11134889/2108086

本系列(makefile)文章,从零基础开始,通过实验逐步分析makefile的语法特性,并最终打造一个可复用、可移植的专业编译环境。

参考:

1.DT 唐老师门徒计划课程

2.GNU make 手册:http://www.gnu.org/software/make/manual/make.html

1.Make与makefile

  • Make是一个应用程序:接续源程序之间的依赖关系,根据依赖关系自动维护编译工作,执行宿主操作系统中的各种命令。

  • Makefile是一个描述文件:定义了系列的规则来指定源文件编译后的先后顺序,拥有特定的语法规则,支持函数定义和函数调用,能够直接集成操作系统的各种命令,本质上也是一种脚本。

    两者的联系:

  • Makefile中的描述用于指导make程序如何完成工作;

  • make根据Makefile中的规则执行命令,最后完成编译输出;

    简单示例:

hello:                          // 目标
    echo “hello makefile”       // 实现目标要执行的命令,注意行首是一个table(\t)
make -f mf.txt hello // -f表示指定mf.txt文件为规则定义文件(Makefile),并执行文件里的hello目标
make // 执行默认规则定义文件(Makefile/makefile)中的默认目标(第一个目标)

2.Makefile结构

2.1.Makefile的意义:

Makefile 用于定义源文件和依赖关系,说明如何编译各个源文件并生成可执行文件

依赖的定义:

targets:prerequests; command1
    Command2

2.2.Makefile中的元素含义:

targets // 通常是需要生成的目标文件名,make所需要执行的命令名称

prerequisite // 当前目标所依赖的其他目标或文件

command // 完成目标所需要的命令

2.3.注意事项:

  • 目标和依赖可以有多个,使用空格分隔

  • 每一个命令行必须以【tab】字符开始,用于高速make程序(解析器),此行时一个命令行

  • 续行符: \ 可以将内容分开写到下一行,提高可读性

  • Makefile中可以在命令前加上@符,作用为命令无回显(Makefile默认会打印执行的每一个条命令)

    技巧:

    开发中可以将可执行文件名和all 同时作为makefile中第一条规则的目标,这样,当执行make命令并且目标已经存在时,将不会继续执行(除非依赖文件有更新)

    2.4.依赖规则:

    当目标对应的文件不存在,执行对应命令

    当依赖在时间上比目标更新,执行对应命令

    当依赖关系发生时,对比依赖链上每一个目标

hello.out all : func.o main.o
    gcc -o hello.out func.o main.o

func.o : func.c
    gcc -o func.o -c func.c

main.o : main.c
    gcc -o main.o -c main.c

3.伪目标的引入

3.1.Makefile中的目标究竟是什么?

默认情况下,make认为目标对应着一个文件,make会比较文件和依赖关系的新旧关系,决定执行是否执行命令,make以文件处理作为第一优先级。

所以当出现和目标同名的文件时,则在文件不被更新的前提下,目标不会被执行

3.2.Makefile中的伪目标

通过PHONY关键字声明一个伪目标,伪目标不对应任何实际的文件,不管伪目标的依赖时否更新,命令总是执行。

伪目标的语法:先声明,后使用

本质:伪目标是make中特殊的目标:.PHONY的依赖

.PHONY : clean

clean :
    rm *.o hello.out -rf

3.3.伪目标的妙用:

规则调用,模拟C语言函数的概念。

原理:当一个目标的依赖包含伪目标时,伪目标所定义的命令总是会被执行。

.PHONY : rebuild clean all

rebuild : clean all

all : hello.out

clean :
    rm *.o hello.out  -rf

3.4.绕开.PHONY关键字定义伪目标

原理:如果一个规则没有命令或者依赖,并且他的目标不是一个存在的文件名,在执行此规则是,目标总会被认为是最新的。
 

clean : FORCE
    rm *.o hello.out -rf

FORCE :

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值