make/Makefile学习之一Makefile文件书写规则

一、基础使用

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文件内容
#/*以下为常用模板,用于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
#/* Makefile end  */

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、例:


#/*vim Makefile   start */
NAME  = $(FIRST) $(LAST)
FIRST = Zhang
LAST  = San
all:
        echo $(NAME)
.PHONY:all

#/* end*/

 test $ make
echo Zhang San
Zhang San
     2.2  :=  操作符
            :=操作符和=操作符不同之处在于,使用 := 右侧的变量前,变量必须赋值,否则认为主空,
            例:

#/*vim Makefile   start */
NAME  := $(FIRST) $(LAST)
FIRST = Zhang
LAST  = San
all:
        echo $(NAME)
.PHONY:all

#/* end*/

 test $ make
echo 

     2.3  ?=  操作符
            ?=操作符和=操作符不同之处在于,如果事先变量被赋值,此次将不再被赋值,如果没有赋值,将被赋值
            例:

#/*vim Makefile   start */
NAME = Li Si
NAME ?= $(FIRST) $(LAST)
NAME2 ?= $(FIRST) $(LAST)
FIRST = Zhang
LAST  = San
all:
        echo $(NAME)
        echo $(NAME2)
.PHONY:all

#/* end*/

 test $ make
echo Li Si
Li Si
echo Zhang San
Zhang San
     2.4  +=  操作符
            +=操作符功能:如果变量事先定义了值,现在需要进行增加值,此时可以使用
            例:
#/*vim Makefile   start */
NAME = Li Si
NAME += $(FIRST) $(LAST)
FIRST = Zhang
LAST  = San
all:
     echo $(NAME)
.PHONY:all

#/* end*/

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为伪目标,并且忽略命令执行过程中的错误

猜你喜欢

转载自blog.csdn.net/weixin_47273317/article/details/108511958