What is the difference between the GNU Makefile variable assignments =, ?=, := and +=?
任何人都能清楚地解释变量赋值在makefiles中是如何工作的吗?
有什么区别:
1 2 3 4 | VARIABLE = value VARIABLE ?= value VARIABLE := value VARIABLE += value |
我已经阅读了GNU Make手册中的部分,但对我来说仍然没有意义。
懒惰集
1 | VARIABLE = value |
变量的正常设置-使用变量时,变量中的值将递归展开,而不是声明变量时
立即集1 | VARIABLE := value |
通过简单扩展变量内部值来设置变量-声明时扩展变量内的值。
如果没有设置1 | VARIABLE ?= value |
仅当变量没有值时才设置变量
追加1 | VARIABLE += value |
将提供的值附加到现有值(如果变量不存在,则设置为该值)
使用
1 2 3 4 5 6 7 8 9 10 | HELLO = world HELLO_WORLD = $(HELLO) world! # This echoes"world world!" echo $(HELLO_WORLD) HELLO = hello # This echoes"hello world!" echo $(HELLO_WORLD) |
使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | HELLO = world HELLO_WORLD := $(HELLO) world! # This echoes"world world!" echo $(HELLO_WORLD) HELLO = hello # Still echoes"world world!" echo $(HELLO_WORLD) HELLO_WORLD := $(HELLO) world! # This echoes"hello world!" echo $(HELLO_WORLD) |
使用
使用
1 2 3 4 5 | HELLO_WORLD = hello HELLO_WORLD += world! # This echoes"hello world!" echo $(HELLO_WORLD) |
如果使用类似于
我建议你用"make"做一些实验。下面是一个简单的演示,演示了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | /* Filename: Makefile*/ x := foo y := $(x) bar x := later a = foo b = $(a) bar a = later test: @echo x - $(x) @echo y - $(y) @echo a - $(a) @echo b - $(b) |
1 2 3 4 | x - later y - foo bar a - later b - later bar |
在这里查看更详细的解释
当使用
1 2 3 4 5 | VAL = foo VARIABLE = $(VAL) VAL = bar # VARIABLE and VAL will both evaluate to"bar" |
当你使用
1 2 3 4 5 | VAL = foo VARIABLE := $(VAL) VAL = bar # VAL will evaluate to"bar", but VARIABLE will evaluate to"foo" |
使用
在上述答案中,理解"在声明/使用时扩展值"的含义很重要。给出类似于
请在包含一些C文件的目录中尝试以下生成文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | VAR1 = *.c VAR2 := *.c VAR3 = $(wildcard *.c) VAR4 := $(wildcard *.c) VAR5 = $(shell ls *.c) VAR6 := $(shell ls *.c) all : touch foo.c @echo"now VAR1 = "$(VAR1)"" ; ls $(VAR1) @echo"now VAR2 = "$(VAR2)"" ; ls $(VAR2) @echo"now VAR3 = "$(VAR3)"" ; ls $(VAR3) @echo"now VAR4 = "$(VAR4)"" ; ls $(VAR4) @echo"now VAR5 = "$(VAR5)"" ; ls $(VAR5) @echo"now VAR6 = "$(VAR6)"" ; ls $(VAR6) rm -v foo.c |
运行