Makefile文件的基本单元 —— 规则
Posted 狱典司
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Makefile文件的基本单元 —— 规则相关的知识,希望对你有一定的参考价值。
Makefile文件的基本单元是规则
- 一条规则指定一个或多个目标文件:编译生成该目标文件所依赖的文件或模块,生成或更新目标文件所使用的命令。
规则的格式
- 目标文件列表 分隔符 依赖文件列表 [;命令]
[命令]
[命令]
注:“[ ]”中的内容是可选的。
Makefile文件的组成部分
- 一个完整的Makefile文件由5部分构成:
①显式规则
②隐含规则
③使用变量
④流程控制
⑤注释#
明确的典型规则
foo.o :foo.c defs.h
gcc –c –g foo.c
规则的主要思想是:目标文件的内容由依赖文件决定,依赖文件的任何一处改动,将导致目前已经存在的目标文件过时。
规则的命令为重新生成目标文件提供了方法,这些命令都是shell命令。
一条规则中可以有一个或多个命令行,每个命令行以Tab键开头
可以在Tab键后先加上一个加号(+)、减号(-)、或@,后再跟命令。
如果Tab键后没有这3个符号中的一个,则make使用缺省的命令行属性:即,执行该命令行时先打印出命令,命令遇到执行错误时就退出make
各符号的意义:
-:执行本命令行的命令时如果遇到错误,继续执行而不退出make
+:本行命令始终被执行(执行本命令行的命令时如果遇到错误,退出make)
@:执行本行命令时不在屏幕上打印命令的内容
例:在Makefile文件中有如下规则
file.o :file.c head1.c head2.c(:分隔符后的都是依赖文件)
-mv file.o \\tmp
gcc –c file.c
这个规则的含义是:如果发现file.o过时,先将过时的file.o文件备份到/tmp下,然后再生成新的目标文件。
- 在第一次执行Makefile文件中的命令时,由于file.o不存在,mv命令就会出错,默认情况下一旦出错make就会停止运行。但在mv命令前加上减号“-”后,遇到错误时,make忽略它而继续执行。
伪目标
- 共三种:(1).没有依赖文件 (2).PHONY (3).all
在Makefile文件中,目标文件可以分为两类:实目标和伪目标。
- 实目标:
是真正要生成的、以文件的形式存放在硬盘上的目标 - 伪目标:
不要求生成实际文件,而是为了让make执行一些辅助命令,如打印些信息,删除无用的中间文件等。
—————————————————————————
(1)没有依赖文件
目的是让make执行该目标的命令
例:
clean :
-rm -f *.o 没有依赖文件
#make clean
这里的clean后面没有依赖文件,规则中的命令部分也不是用来生成目标文件的,而是用来删除当前目录下所有以.o结尾的文件。
rm前的减号-表示,如果执行这个命令时出错,忽略错误而继续执行。
——————————————————————————
(2)伪目标.PHONY(.PHONY:伪目标名)(强制执行)
当使用make命令指定此目标时,这个目标所在规则中的命令无论目标文件是否存在都会被无条件执行。
例:
.PHONY :clean (强制执行clean目标)
其中:clean:
-rm -f *.o
#make clean
——————————————————————————
(3)all 伪目标
all伪目标可以有自己的依赖文件。
在一个目录下如果需要生成多个可执行程序时 使用
通常Makefile中第一个目标是最终目标,使用一个称为“all”的伪目标来作为最终目标,它的依赖文件就是那些需要创建的可执行程序。
all : program1 program2 program3 (all的依赖3个文件,make all之后要生成三个可执行文件)
.PHONY: all (强制执行all)
program1: program1.c utils.h
gcc -o program1 program1.c
program2: program2.c
gcc -o pragram2 program2.c
program3: program3.c comm.h utils.h
gcc -o pragram3 program3.c
隐含规则
由make根据目标而自动推导出的规则。
make根据目标文件的文件名,自动产生目标的依赖文件和生成目标的命令。
例:module1.o: head1.c
可简写为 .c.o: 即由.c文件编译生成.o文件
即
.c.o:
gcc -c *.c
make根据目标文件名module1.o的后缀.o,自动产生目标的依赖文件module1.c和生成目标所使用的命令
使用变量
一般在具有一定规模的项目中,编写Makefile文件时通常会使用到变量。Makefile中定义变量 的一般形式是:
变量名 赋值符 变量值
1)、赋值符主要是: =
2)、变量值是一个文本字符串
引用变量: ( 变 量 名 ) 或 (变量名)或 (变量名)或变量名
流程控制—条件语句
通过在Makefile中使用条件语句,使得可以根据条件来指定要参与编译的部分,而忽略不符合条件的部分。如根据用户所使用的硬件平台来选择适合的库。
1、if,ifeq, else, endif
例:一个使用条件语句的的Makefile片断,它对变量“CC”进行判断,其值如果是“gcc”,那么程序在链接时使用库“libgnu”,否则不链接任何库(normal_libs的值为空)。
CC=gcc
libs_for_gcc = -lgnu
normal_libs =
foo: foo.c
ifeq ($(CC) , gcc)
$(CC) -o foo foo.c $(libs_for_gcc)
else
$(CC) -o foo foo.c $(normal_libs)
endif
以上是关于Makefile文件的基本单元 —— 规则的主要内容,如果未能解决你的问题,请参考以下文章