Makefile

Makefile细节

  1. 基本格式,Makefile中的命令,必须要以 [Tab] 键开始
target : prerequisitions
	command1
	command2
	...
#或者
targets : prerequisites ; command1
	command2
...
  1. 变量使用:在 Makefile 一开始声明,调用时,用 $(variable) 即可,其中反斜杠(/)是换行符的意思
objects = main.o kbd.o command.o display.o /
	insert.o search.o files.o utils.o
main : $(objects)
	gcc -o main $(objects)
  1. GNU的make很强大,它可以自动推导文件以及文件依赖关系后面的命令,于是我们就没必要去在每一个[.o]文件后都写上类似的命令,只要make看到一个[.o]文件,它就会自动的把[.c]文件加在依赖关系中,如果make找到一个whatever.o,那么whatever.c,就会是whatever.o的依赖文件。并且 gcc -c whatever.c 也会被推导出来
files.o : files.c defs.h buffer.h command.h
	gcc -c files.c
#可以简化成
files.o : defs.h buffer.h command.h
  1. clean不是一个文件,它只不过是一个动作名字,有点像C语言中的lable一样,其冒号后什么也没有,那么,make就不会自动去找文件的依赖性,也就不会自动执行其后所定义的命令。要执行其后的命令,就要在make命令后明显得指出这个lable的名字。
    例如:
clean :
	rm edit main.o kbd.o command.o display.o /
		insert.o search.o files.o utils.o
  1. 更稳妥的做法如下,其中.PHONY意思表示clean是一个“伪目标”,而在rm命令前面加了一个小减号的意思是,也许某些文件出现问题,但不要管,继续做后面的事。
.PHONY : clean
clean :
	-rm edit $(objects)
  1. 执行该命令时
make clean
  1. Makefile中只应该有一个最终目标,其它的目标都是被这个目标所连带出来的,第一条规则中的目标将被确立为最终的目标,如果第一条规则中的目标有很多个,那么,第一个目标会成为最终的目标。
  2. make 会把其要执行的命令行在命令执行前输出到屏幕上,若用“@”字符在命令行前,那么,这个命令将不被make显示出来
#Makefile内容
	echo It is compiling module f1
#make执行时,显示
echo It is compiling module f1
It is compiling module f1

#Makefile内容
	@echo It is compiling module f1
#执行make时,显示
It is compiling module f1
  1. make参数 “-n” 或 “–just-print” ,那么其只是显示命令,但不会执行命令
#显示Makefile执行的命令
make -n
make --just-print
  1. make参数 “-s” 或 “–slient” 则是全面禁止命令的显示
#执行Makefile但不显示命令
make -s
make --silent
  1. 如果一个规则中的某个命令出错了(命令退出码非零),那么make就会终止执行当前规则,这将有可能终止所有规则的执行,则忽视命令的错误而继续执行的方法有:
  • 局部办法:Makefile的命令行前加一个减号 “-”(在Tab键之后),标记为不管命令出不出错都认为是成功的
clean:
	-rm -f hello.o hello
  • 全局办法1:给make加上 “-i ” 或是 “–ignore-errors” 参数,那么,Makefile中所有命令都会忽略错误。
make -i
make --ignore-errors
  • 全局办法2:给make加上 “-k ” 或是 “–keep-going” 参数,表示如果某规则中的命令出错了,那么就终目该规则的执行,但继续执行其它规则。
make -k
make --keep-going
  1. 函数

字符串操作函数

subst 函数在这里插入图片描述
patsubst 函数
在这里插入图片描述
strip 函数
在这里插入图片描述

findstring 函数
在这里插入图片描述
filter 函数
在这里插入图片描述
filter-out 函数
在这里插入图片描述
sort 函数
在这里插入图片描述
word 函数
在这里插入图片描述
wordlist 函数
在这里插入图片描述
words 函数
在这里插入图片描述
firstword 函数
在这里插入图片描述

  1. 模式的匹配:
  • 一般来说,因为"%“代表一个或多个字符,所以在定义好了的模式中,我们把”%“所匹配的内容叫做"茎”。
  • 例如"%.c"所匹配的文件"test.c"中"test"就是"茎"。因为在目标和依赖目标中同时有"%“时,依赖目标的"茎"会传给目标,当做目标中的"茎”。
  • 当一个模式匹配包含有斜杠(实际也不经常包含)的文件时,那么在进行模式匹配时,目录部分会首先被移开,然后进行匹配,成功后,再把目录加回去。在进行"茎"的传递时,我们需要知道这个步骤。例如有一个模式"e%t",文件"src/eat"匹配于该模式,于是"src/a"就是其"茎",如果这个模式定义在依赖目标中,而被依赖于这个模式的目标中又有个模式"c%r",那么,目标就是"src/car"。("茎"被传递)

参考文章:Makefile 详细解析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值