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
本文介绍了Makefile中origin函数的使用方法及其测试案例。通过实际例子展示了如何获取变量来源,包括环境变量、命令行参数、文件定义及未定义变量等不同情况。此外,还探讨了override关键字的作用。

418

被折叠的 条评论
为什么被折叠?



