make and Makefile学习之一Makefile文件书写规则
- 一、基础使用
- 附A.1 关于变量的说明
- 附 B.1 vpath关键字使用
- 附 C.1 使用格式
- 附 D.1隐式规则
- 附 E.1 伪目标
一、基础使用
test $ ls -l
总用量 20
drwxrwxr-x 2 hww-arm hww-arm 4096 9月 12 13:14 file
drwxrwxr-x 2 hww-arm hww-arm 4096 9月 12 13:14 hello
drwxrwxr-x 2 hww-arm hww-arm 4096 9月 12 11:03 include
-rw-rw-r-- 1 hww-arm hww-arm 558 9月 12 11:02 main.c
-rw-rw-r-- 1 hww-arm hww-arm 339 9月 12 13:26 Makefile
test $ vim Makefile
#以下为Makefile文件内容
#
VERSION = 1
PATCHLEVEL = 0
SUBLEVEL = 0
EXTRAVERSION =
NAME = TEST
CC =gcc #变量CC定义编译器,关于变量说明, 见附A.1
FLAGS = #变量FLAGS为编译器参数
LD = #变量LD为编译器的链接,如使用到线程时,需要定义变量LD = lpthread
vpath %.c ./hello/ #见附B.1
vpath %.c ./file/
MYOBJ_o = main.o file.o hello.o #变量MYOBJ_o,用于保存所有的依赖文件*.o
myobj : $(MYOBJ_o) #见附C.1
$(CC) -o myobj $(MYOBJ_o)
main.o : main.c
$(CC) -c main.c
file.o : file.c #见附D.1
hello.o : hello.c
clean :
-rm -f *.o myobj
.PHONY:clean #见附E.1
#
test $ make
gcc -c main.c
gcc -c -o hello.o ./hello/hello.c
gcc -c -o file.o ./file/file.c
gcc -o myobj main.o hello.o file.o
附A.1 关于变量的说明
1、Makefile文件中,变量名可以自定义,一般能表达其意思即可,在linux内核中,一般前面几行都用如下变量用于表达Kernel版本信息:
VERSION =
PATCHLEVEL =
SUBLEVEL =
EXTRAVERSION =
NAME =
以上普通变量类似于c语言中的宏,在C语言中,但使用变量方式和C语言中的宏有区别,Makefile中变量的使用方式:
$(VERSION)
2、变量中的变量 : ’ = ’ 、 ’ := ’ 、 ’ ?= ’ 、 ‘ += ’
2.1 = 操作符
1、 = 左侧为变量,右侧为变量的值,但这个值可以也是变量;
2、 = 右侧的值不一定是已经定义好的,可以是在后续行中定义的,即,支持以下方式:
NAME = $(FIRST) $(LAST)
FIRST = Zhang
LAST = San
3、例:
#
NAME = $(FIRST) $(LAST)
FIRST = Zhang
LAST = San
all:
echo $(NAME)
.PHONY:all
#
test $ make
echo Zhang San
Zhang San
2.2 := 操作符
:=操作符和=操作符不同之处在于,使用 := 右侧的变量前,变量必须赋值,否则认为主空,
例:
#
NAME := $(FIRST) $(LAST)
FIRST = Zhang
LAST = San
all:
echo $(NAME)
.PHONY:all
#
test $ make
echo
2.3 ?= 操作符
?=操作符和=操作符不同之处在于,如果事先变量被赋值,此次将不再被赋值,如果没有赋值,将被赋值
例:
#
NAME = Li Si
NAME ?= $(FIRST) $(LAST)
NAME2 ?= $(FIRST) $(LAST)
FIRST = Zhang
LAST = San
all:
echo $(NAME)
echo $(NAME2)
.PHONY:all
#
test $ make
echo Li Si
Li Si
echo Zhang San
Zhang San
2.4 += 操作符
+=操作符功能:如果变量事先定义了值,现在需要进行增加值,此时可以使用
例:
#
NAME = Li Si
NAME += $(FIRST) $(LAST)
FIRST = Zhang
LAST = San
all:
echo $(NAME)
.PHONY:all
#
test $ make
echo Li Si Zhang San
Li Si Zhang San
附 B.1 vpath关键字使用
vpath关键字使用方法:
vpath <pattern> <dir> //在dir目录中搜索pattern规则的文件如:%.c文件 、%.o文件 、.h文件等
vpath <pattern> //删除某个搜索规则,如不搜索.h文件
vpath //取消所有的搜索,只搜索当前目录
一般可用于配合隐匿规则使用
附 C.1 使用格式
1、Makefile文件中,使用目标文件有两种表达方式:
方式一:
targets(即目标文件) : prerequistites(即依赖文件)
command1(即生成目标文件需要执行的命令)
command2
............
方式二:
targets(即目标文件) : prerequistites(即依赖文件);command1
command2
............
附 D.1隐式规则
make工具会自动使用gcc -c 命令,将一个扩展名为.c的源文件编译成一个同名的.o的目标文件,
因此,当编译一个单独的.c文件到.o文件时,可以使用隐含的规则,让make工具自己推导
此案例中,使用vpath关键字和隐式规则配合使用。
附 E.1 伪目标
1、伪目标格式:
伪目标 :
command
.PHONY 伪目标
2、使用
make 伪目标
3、例
test $ make clean
根据实例,执行make clean命令后,将会执行执行命令:
-rm *.o myobj
这个命令比shell中多了一个符号 ‘ - ’,其作用是忽略命令执行错误,继续向下执行,即,如果没有.o文件,也会删除myobj文件,反之相同。
和上述命令具有相同功能的命令方式如下:
clean :
rm *.o myobj
.IGNORE:clean
#//同样声明clean为伪目标,并且忽略命令执行过程中的错误