3、Linux初级——Makefile

目录

一、安装make

 二、语法

Makefile执行的规则

三、目标与依赖的互相嵌套(类似函数调用)

四、应用

五、Makefile代码

版本一

版本二

版本三(通用)

六、常见的函数

1、$(subst FROM,TO,TEXT) 

2、$(wildcard PATTERN)

3、override(是一个变量)

4、.PHONY

5、选定某个makefile文件执行

七、其他应用

1、递归定义

2、直接定义

3、条件定义

(1)定义变量

(2)多行命令定义方式

4、追加变量的值

5、修改变量的值

 八、变量的注意事项(作为翻阅资料即可)

九、系统预定义变量

十、自动化变量

一、安装make

sudo apt install make

 二、语法

目标:依赖
    命令

(1)目标必须存在

(2)依赖可以没有

(3)命令前面必须是一个制表符"TAB"

(4) Makefile 文件的命名一般是 Makefile没有后缀也没有前缀,

 

Makefile执行的规则

1、工程管理器会默认在当前路径下寻找Makefile文件

2、确定Makefile文件中的目标

3、最终目标存在,没有依赖则不运行,有写依赖则检查这个依赖是否真的存在,若真的存在,检查时间戳判断是否执行,不存在依赖则直接报错

若最终目标不存在,则直接执行规则

4、规则中没有写依赖,则规则总会执行,若目标已经存在+没有写依赖则不执行

三、目标与依赖的互相嵌套(类似函数调用)

Even:Jacy
    @echo "Hello Makefile"

Jacy:ChuiHua
    @echo "Hello Even"

ChuiHua:
    @echo "Hello Jacy"

执行结果

make // 工程管理器把第一个目标当成最终目标 Even
结果:
Hello Jacy
Hello Even
Hello Makefile

make Jacy // 告诉工程管理器 Jacy是我们需要的最终目标
结果:
Hello Jacy
Hello Even

四、应用

对于以下的工程

./bin/main:./src/*.c  
#目标: ./bin/main
#依赖: ./src/*.c
gcc ./src/*.c -o ./bin/main -I./inc -L./lib -lmy_lib

五、Makefile代码

版本一

1 TAG=./bin/main     #目标
2 SRC=./src/*.c      #依赖
3 CC=gcc
4 O=-o
5 CONFIG=-I./inc -L./lib -lmy_lib
6
7
8 $(TAG):$(SRC)
9 $(CC) $(SRC) $(O) $(TAG) $(CONFIG)
10
11
12 clean:      #make clean就可以调用
13 rm ./bin/*

版本二

TAG=./bin/main
SRC=./src/Input.c ./src/main.c ./src/Oper.c ./src/Output.c 
OBJ=$(SRC:%.c=%.o)
CC=gcc
O=-o
CONFIG=-I./inc 

$(TAG):$(OBJ)
    $(CC) $(^) $(O) $(@) $(CONFIG)

%.o:%.c
    $(CC) $< -o $(@) $(CONFIG) -c 

clean:
    $(RM) ./bin/* ./src/*.o

版本三(通用)

TAG=./bin/main   #治党目标文件所在的路径+名字
SRC= $(wildcard src/*.c)   #在./SRC/中匹配所有的.c文件作为SRC变量的列表
OBJ=$(SRC:%.c=%.o)          #把变量SRC中所有符合xx.c文件换成.o
CC=gcc
override CONFIG += -I./inc  #在原本的列表中添加一个选项
#override防止make被执行的时候用户不小心覆盖了原来的变量

#生成最终目标
$(TAG):$(OBJ)     #当前列表是一堆.o的文件名
    $(CC) $(^) -o $(@) $(CONFIG)

%.o:%.c    #可以给静态(隐式)规则提供一些选项
    $(CC) $< -o $(@) $(CONFIG) -c

clean:  
    $(RM) ./bin/* ./src/*.o

.PHONY:clean   #强调不要运用任何隐式规则

六、常见的函数

1、$(subst FROM,TO,TEXT) 

功能: 将字符串 TEXT 中的字符 FROM 替换为 TO,返回的是替换后的新字符串

范例:A = $(subst pp,PP,apple tree),返回A=”aPPle tree”

2、$(wildcard PATTERN)

功能:获取匹配模式为 PATTERN 的文件名

返回:匹配模式为 PATTERN 的文件名。

范例:A = $(wildcard *.c)
假设当前路径下有两个.c 文件 a.c 和 b.c,则处理后 A 的值为:”a.c b.c”。

3、override(是一个变量)

范例:override CFLAGS += -Wall

4、.PHONY

.PHONY 来明确地告诉 Makefile,不要对 clean 运用任何隐式规则,不能运用隐式规则的目标被称为 伪目标.

.PHONY:clean 
用来修饰 clean 清空的工作不会被误以为是一个目标来执行

5、选定某个makefile文件执行

Makefile1,Makefile2

通过make -f Makefile1来指定运行哪一个

七、其他应用

1、递归定义

A = I love $(B) # 在第一行使用到变量B但是还没有定义,以此管理器进行全文搜索找到B并引用
B = China

2、直接定义

B = China
A := I love $(B)
A := I love $(B) # A在B之前引用B 则为空
B = China

3、条件定义

(1)定义变量

A = apple
A ?= I love China

对 A 进行了两次定义,其中第二次是条件定义,其含义是:如果 A 在此之前没有 定义,则定义为“I love China”,否则维持原有的值。

(2)多行命令定义方式

define commands
    echo “thank you!”
    echo “you are welcome.”
endef

4、追加变量的值

A = apple
A += tree

变量A的值就是apple tree

5、修改变量的值

A = srt.c string.c tcl.c
B = $(A:%.c=%.o)

Even:
    @echo $(B)

make,则输出srt.o string.o tcl.o

 八、变量的注意事项(作为翻阅资料即可)

在Makefile 中变量属于弱类型,在Makefile中变量就是一个名字(像是C语言中的宏),代表 一个文本字符串(变量的值),在Makefile的目标、依赖、命令中引用一个变量的地方。 在Makefile中变量的特征有以下几点:

1. 变量和函数的展开(除规则的命令行以外),是在make读取Makefile文件时进行 的,这里的变量包括了使用“=”定义和使用指示符“define”定义的变量。

2. 变量可以用来代表一个文件名列表、编译选项列表、程序运行的选项参数列表、搜 索源文件的目录列表、编译输出的目录列表和所有我们能够想到的事物。

3. 变量名能包括“:”、“#”、“=”、前置空白和尾空白的任何字符串。需要注意的是, 尽管在GNU make中没有对变量的命名有其它的限制,但定义一个包含除字母、数字和下 划线以外的变量的做法也是不可取的,因为除字母、数字和下划线以外的其它字符可能会在 以后的make版本中被赋予特殊含义,并且这样命名的变量对于一些Shell来说不能作为环 境变量使用。

4. 变量名是大小写敏感的。变量“foo”、“Foo”和“FOO”指的是三个不同的变量。 Makefile传统做法是变量名是全采用大写的方式。推荐的做法是在对于内部定义的一般变 量(例如:目标文件列表objects)使用小写方式,而对于一些参数列表(例如:编译选项 CFLAGS)采用大写方式,这并不是要求的。但需要强调一点:对于一个工程,所Makefile 中的变量命名应保持一种风格,否则会显得你是一个蹩脚的开发者(就像代码的变量命名风 格一样),随时有被鄙视的危险。

5. 另外有一些变量名只包含了一个或者很少的几个特殊的字符(符号)。称它们为自 动化变量。像“<”、“@”、“?”、“*”、“@D”、“%F”、“^D”等等,后面会详 述之。

6. 变量的引用跟Shell脚本类似,使用美元符号和圆括号,比如有个变量叫A,那么对 他的引用则是$(A),有个自动化变量叫@,则对他的引用是$(@),有个系统变量是CC则 对其引用的格式是$(CC)。对于前面两个变量而言,他们都是单字符变量,因此对他们引用 的括号可以省略,写成$A和$@。

九、系统预定义变量

十、自动化变量

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值