Makefile 札记

目标

基础语法、变量、分支判断、头文件依赖、隐含规则、自动化变量、模式规则、函数

GNU make

一个典型的例子

gcc -o hell hello_main.c hello_func/hello_func.c -I ./hello_func/
使用这个例子基本上就可以编译所有的工程了,哈哈哈
在依赖后面加上 -I,就可以指明被依赖的头文件的路径了

makefile 中竖线 “|” 管道符的作用

散点

如果规则重复定义了,会以最后定义的规则为准。

warning: ignoring old recipe for target '__build'

Makefile中的MAKECMDGOALS

Makefile中的MAKECMDGOALS

关于 include

假设当前目录下有个 ./lk_boot/project/board.mk

make -Iinclude -Ilk_boot -Ilk -Ilk/external

以后
-include lk_boot/project/board.mk-include project/board.mk
就都能用了。

静态模式

静态模式是相当重要的,是一个相当强大的功能。常见的重复展开的操作,都是基于静态模式来实现的。
直接上一个例子:

objects = foo.o bar.o
all: $(objects) 
$(objects): %.o: %.c 
	$(CC) -c $(CFLAGS) $< -o $@

展开后就是:

foo.o : foo.c 
	$(CC) -c $(CFLAGS) foo.c -o foo.o 
bar.o : bar.c 
	$(CC) -c $(CFLAGS) bar.c -o bar.o

$(objects) 里有多少个目标,就会展开多少次。

静态模式的语法抽象是:
<targets …> : < target-pattern >: <prereq-patterns …>
< commands >

关于 .PHONY

只要我们不期待生成目标文件,就应该把它定义成伪目标
定义为伪目标,可以保证目标总是会被执行,而不是先检查更新再执行

比如如果代码中不写“.PHONY:clean”语句,并且在目录下创建一个名为clean的文件,那么当 执行“make clean”时,clean的命令并不会被执行。

伪目标的一个特性是:只有被指定执行,便总是会被执行。(普通目标是否被执行,要看它的依赖是不是比他新)
所以,如果一个目标依赖一个伪目标的话,那这个目标便总是会被执行。

关于 VPATH

Makefile 文件中的一个特殊变量,它会把一个路径告诉 make。当 make 在当前目录找不到源文件时,就会到指定的目录中去找寻。

VPATH = src:…/headers
目录由“冒号”分隔。

关于变量赋值

“=” :延时赋值,该变量只有在调用的时候,才会被赋值
“:=” :直接赋值,与延时赋值相反,使用直接赋值的话,变量的值定义时就已经确定了。
“?=” :若变量的值为空,则进行赋值,通常用于设置默认值。
“+=” :追加赋值,可以往变量后面增加新的内容。

当我们想使用变量时,其语法如下:
$(变量名)

需要重点注意的是延时赋值直接赋值

关于目标变量

可以为某个目标设置局部变量,这种变量被称为“Target-specific Variable”。
类似于 C 语言。
它可以和“全局变量”同名,因为它的作用范围只在这条规则以及连带规则中,所以其值也只在作用范围内有效。
而不会影响规则链以外的全局变量的值。

关于@,以及 echo 和 @echo

Makefile默认会显示出正在执行的命令。
但是如果在命令前面加上 @,就不会显示该命令了。

特殊的,echo执行时会同时显示命令和结果。echo 和 @ 的组合是:
echo:会在shell中显示echo这条命令和这条命令的输出结果
@echo:不会在shell中显示echo这条命令,但是会显示命令的输出结果

模式规则

至少在规则的目标定义中要包涵“%”,否则就是一般规则。

关于 %

”%”是一个通配符,如”%.o”表示所 有以”.o”结尾的文件。

关于 $@、$<

特殊的变量”$@”,”$<”,可理解为Makefile文件保 留的关键字,是系统保留的自动化变量。
”$@”代表了目标文件
”$<”代表了第一个依赖文件

关于 $^

使用自动化变量“$^”表示所有的依赖文件

关于函数

函数格式及示例
以“ ( ) ”或“ ()”或“ (){}”符号包含函数名和参数,具体语法如下:
$(函数名 参数)
或者使用花括号
${函数名 参数}

关于打印

有三个可以用于打印的函数:info,warning,error
其中 error 可以停止当前 makefile 的编译

注:echo只能在target:后面的语句中使用,且前面要有 TAB,

多级目录,参数传递

export CC TOPDIR OBJDIR BINDIR BIN OBJLINK OBJ

函数字典

patsubst

# $(patsubst pattern,replacement,text)
$(patsubst %.c,%.o,x.c.c bar.c)
# 得到:x.c.o bar.o

eval

evaluate 的意思。
它的作用是将一串文本进行 make 解析。
理解它的最简单方法是用 info 函数替换eval。
替换后,会打印出一段字符串,这个段字符串如果在 eval 函数中就会被解析了。

如何在makefile中使用eval函数?

strip

$(strip string)
作用是去除字符串中多余的空格。
看起来作用不大,但实际上和想象的不一样。

The function strip can be very useful when used in conjunction with conditionals.
When comparing something with the empty string ‘’ using ifeq or ifneq, you usually want a string of just whitespace to match the empty string.

所以它经常和 if 一起出现。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值