0x01 origin函数
origin
函数并不操作变量的值,它告诉我们一些关于变量的信息,尤其是变量是从哪里来的。
origin
语法格式:
$(origin variable)
0x02 测试origin
测试用的mk文件: hello.mk
$(info case1: environment)
var = LANG
var1 = $(origin $(var))
$(info $(var) is $($(var)))
$(info $(var) origins from "$(var1)")
$(info case2: command line or file)
MYVAR = "value_from_file"
var2 = $(origin MYVAR)
$(info MYVAR is $(MYVAR))
$(info MYVAR origins from "$(var2)")
ifeq "$(origin MYVAR)" "command line"
FLAG_COMMAND_LINE = 1
else
FLAG_COMMAND_LINE = 0
endif
$(info case3: file)
var3 = local var
$(info var3 is $(var3))
$(info var3 origins from "$(origin var3)")
$(info case4: undefined)
$(info novar origins from "$(origin novar)")
$(info case5: default)
$(info CC origins from "$(origin CC)")
$(info case6: override)
override myvar2 = "value from file"
$(info myvar2 is $(myvar2))
$(info myvar2 origins from $(origin myvar2))
$(info case7: file)
CC = gcc
$(info CC origins from "$(origin CC)")
.PHONY: sayhello
sayhello:
@echo 'hello'
执行hello.mk
- 不带参数
make -f hello.mk
$ make -f hello.mk
case1: environment
LANG is zh_CN.UTF-8
LANG origins from "environment"
case2: command line or file
MYVAR is "value_from_file"
MYVAR origins from "file"
case3: file
var3 is local var
var3 origins from "file"
case4: undefined
novar origins from "undefined"
case5: default
CC origins from "default"
case6: override
myvar2 is "value from file"
myvar2 origins from override
case7: file
CC origins from "file"
hello
- 带参数
make -f hello.mk MYVAR="value_from_command_line" myvar2="value from command line"
增加了2个参数:MYVAR=”value_from_command_line” myvar2=”value from command line”,这两个参数在hello.mk中也定义了。
$ make -f hello.mk MYVAR="value_from_command_line" myvar2="value from command line"
case1: environment
LANG is zh_CN.UTF-8
LANG origins from "environment"
case2: command line or file
MYVAR is value_from_command_line
MYVAR origins from "command line"
case3: file
var3 is local var
var3 origins from "file"
case4: undefined
novar origins from "undefined"
case5: default
CC origins from "default"
case6: override
myvar2 is "value from file"
myvar2 origins from override
case7: file
CC origins from "file"
hello
0x03 结论
LANG是环境变量(
environment
),所有printenv
打印出来的变量,origin该变量,应该都是environment
。对于普通的变量
MYVAR
,其origin为file
;但是,如果在命令行指定了同样的变量(make -f hello.mk MYVAR="value_from_command_line"
),则其origin为command line
,MYVAR的值也会被命令行中的参数取代。可见,命令行参数的优先级大于本地变量。但是也有办法阻止命令行参数覆盖局部变量,即采用override
。变量
myvar2
是override
类型的,其origin为override
。可以看到,即使在命令行指定了myvar2
(make -f hello.mk myvar2="value from command line"
),也不会覆盖hello.mk
中的myvar2
的值。未定义的变量
novar
,其origin为undefined
。make中预置的隐含变量(例如 CC),其origin为
default
。如果在mk文件中对CC进行重新赋值,则其origin为file
,与普通本地变量一样。
0x04 参考
https://www.gnu.org/software/make/manual/make.html#Origin-Function