栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

关于Makefile的学习

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

关于Makefile的学习

Makefile规则

一个简单的Makefile文件包含一系列的“规则”,其样式如下:

目标(target)...依赖(prerequiries)

命令(command)

目标(target)通常是要生成的文件的名称,可以是可执行文件或OBJ文件,也可以是一个执行的动作名称,诸如`clean’。

依赖是用来产生目标的材料(比如源文件),一个目标经常有几个依赖。

命令是生成目标时执行的动作,一个规则可以含有几个命令,每个命令占一行。

目标 :依赖1 依赖2 ...

当“目标文件不存在“,或某个依赖文件比目标文件”新“,则执行”命令“

注意:每个命令行前面必须是一个Tab字符,即命令行第一个字符是Tab。这是容易出错的地方。

通常,如果一个依赖发生了变化,就需要规则调用命令以更新或创建目标。但是并非所有的目标都有依赖,例如,目标“clern”的作用是清除文件,它没有依赖。

规则一般是用于解释怎样和何时重建目标。make首先调用命令处理依赖,进而才能创建或更新目标。当然,一个规则也可以是用于解释怎样和何时执行一个动作,即打印提示信息。

一个Makefile文件可以包含规则以外的其他文本,但一个简单的Makefile文件仅仅需要包含规则。虽然真正的规则比这里展示的例子复杂,但格式是完全一样的。

Makefile的简单使用

a.通配符 :   %.o

       $@ 表示目标

       $< 表示第一个依赖文件

       $^ 表示所有的依赖文件

        ...仅列出几个常用的通配符

b.假象目标:

执行make[目标](若没有目标执行就执行第一个目标)

例如该txt文件下的Makefile的例子 在Linux下运行 make 则相当于运行 make test !

当文件夹内存在与Makefile内规则要生成的文件同时存在时,Makefile将不会执行该规则。

例:如下列代码所示 文件下存在clean文件,但是我的Makefile想执行clean规则,这里冲突了clean规则将不会被执行!

所以引入 PHONY 假象目标来解决上诉问题

test:a.o b.o c.o
	gcc -o test a.o b.o c.o

%.o : %.c
	gcc -c -o $@ $<
clean: 
	rm *.o test
.PHONY: clean

c.即时变量、延时变量,export

简单变量(即时变量)

A := xxx         #A的值即可确定

B = xxx          #B到使用时才确定

:= #即时变量

= #延时变量

?= #延时变量,如果是第一次定义才有效,如果在前面该变量已定义则忽略这句

+= #附加,它是即时变量还是延时变量取决于前面的定义

A := $(C)
B = $(C)
C = abc

all:
	@echo $(A)
	@echo $(B)

运行结果 

运行make指令,C为空。

A := $(C)该指令使用时A的值被确定为C,因此打印出空字符

而B = xxx指令是当该指令运行时才确定B被赋予的值,即输出C的最终结果!C的最终结果为abc

常用函数

$(filter pattern...,text)

把text中符合pattern格式的内容,filter(过滤)出来、留下来。

$(wildcard pattern)

pattern所列出的文件是否存在,把存在的文件都列出来。

$(filter-out pattern...,text)

把text中符合pattern格式的内容,filter-out(过滤)出来、扔掉。

$(patsubst pattern,replacement,text)

寻找`text’中符合格式`pattern’的字,用`replacement’替换它们。`pattern’和`replacement’中可以使用通配符。

以上函数用一个实例来表示

A = a b c
B = $(foreach f, $(A), $(f).o)		//将A中的值全部转化为.o格式

C = a b c d/
D = $(filter %/, $(C))  //将C中有/的值赋给D
E = $(filter-out %/, $(C))	//滤除C中含有/的值并赋值给E,即将C中除了/以外的值都赋给E

files = $(wildcard *.c) //查询文件夹中是否含有.c文件并赋值给files
files2 = a.c b.c c.c d.c e.c abc
files3 = $(wildcard $(files2))//查询该文件夹下是否存在file2s里面存在的文件
dep_files = $(patsubst %.c,%.d,$(files2))//将files2中的所有.c转换为.d

all:
	@echo B = $(B)
	@echo D = $(D)
	@echo E = $(E)
	@echo files = $(files)
	@echo files2 = $(files3)
	@echo dep_files = $(dep_files)

运行结果

 

 以上是最近学习Makefile的一些浅显的见解,写的不好,烦请各位大佬多多指正!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/728066.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号