在Makefile中我们经常看到 =、:=、?=、+= 这几个赋值运算符,他们之间的区别一直傻傻分不清,暂且总结一下。
1. "="
"=" 是最普通的等号,然而在Makefile中确实最容易搞错的赋值等号,使用”=”进行赋值,变量的值是整个makefile中最后被指定的值。
make会将整个makefile展开后,再决定变量的值。也就是说,变量的值将会是整个makefile中最后被指定的值。
2. ":="
":=" 就表示直接赋值,赋予当前位置的值。
变量的值决定于它在makefile中的位置,而不是整个makefile展开后的最终值。
举例说明下 "=" 和 ":=" 的区别:
x = foo
y = $(x) bar
x = xyz
=》这里 y 的值将会是 xyz bar ,而不是 foo bar 。
x := foo
y := $(x) bar
x := xyz
=》这里 y 的值将会是 foo bar ,而不是 xyz bar 了。
3. "?="
"?=" 表示如果该变量没有被赋值,则赋予等号后的值。
x ?= foo
=》如果 x 在之前没有被赋值,那么 x 的值就为 foo,否则此处不进行赋值操作,如下例所示。
x := foo
x ?= xyz
=》x 的值为 foo
4. "+="
"+=" 和平时写代码的理解是一样的,表示将等号后面的值添加到前面的变量上
小白在 makefile 中遇到的一些坑(待继续补充)
1. Makefile中变量定义中末尾不能有空格,尽量每一行末尾都不要有空格。
2. #开头的注释的行末不能有空格加上反斜杠,否则后面的行也会被当做注释,引发异常。
[Makefile] 缩进与空格--记录踩过的坑: https://zhuanlan.zhihu.com/p/145439685
参考:
https://blog.csdn.net/FJDJFKDJFKDJFKD/article/details/83090568