Makefile中origin函数

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 结论

  1. LANG是环境变量(environment),所有printenv打印出来的变量,origin该变量,应该都是environment

  2. 对于普通的变量MYVAR,其origin为file;但是,如果在命令行指定了同样的变量(make -f hello.mk MYVAR="value_from_command_line"),则其origin为command line,MYVAR的值也会被命令行中的参数取代。可见,命令行参数的优先级大于本地变量。但是也有办法阻止命令行参数覆盖局部变量,即采用override

  3. 变量myvar2override类型的,其origin为override。可以看到,即使在命令行指定了myvar2make -f hello.mk myvar2="value from command line"),也不会覆盖hello.mk中的myvar2的值。

  4. 未定义的变量novar,其origin为undefined

  5. make中预置的隐含变量(例如 CC),其origin为default。如果在mk文件中对CC进行重新赋值,则其origin为file,与普通本地变量一样。

0x04 参考

https://www.gnu.org/software/make/manual/make.html#Origin-Function

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值