• make quick-example I: 变量语法 & 变量插值


    本章记录下make怎么使用变量

    makefile广泛用于各种类型的项目(包括kubernetes),还是要学习下,不然真的跟看天书一样

    两种赋值方式

    1. 递归扩展式

    递归式扩展的意思是,这种变量使用=或者define赋值,赋值运算符右边如果包含其他变量,这些变量也会被解析并进行插值。

    比如下面例子,输出为Huh?

    foo = $(bar)
    bar = $(ugh)
    ugh = Huh?
    
    all:;echo $(foo)
    

    解析链为:

    $(foo) => $(bar) = >$(ugh) => Huh?
    

    也就是说只要赋值运算符右边有其他变量,这些变量就会被解析,直到全部扩展为普通文本,这种赋值方式称为为递归式扩展(recursive expansion)。

    1. 简单扩展

    简单扩展使用的赋值符号是:=.

    简单扩展只能进行简单插值,如下所示:

    x := foo
    y := $(x) bar
    
    hello:
    	echo $(x)
    

    输出为:

    echo foo bar
    foo bar
    

    以下两个例子可以解释直接扩展的插值时机为赋值动作发生时,而不是输出时。

    • 例子A
    x := $(t) # x=''
    y := $(x) bar  # y=bar
    t := sfd
    
    hello:
    	echo $(y)
    
    • 例子B
    t := foo
    x := $(t)   # x=foo 
    y := $(x) bar # y= foo bar
    
    hello:
    	echo $(y) 
    

    那如果把例子A里的赋值符改成=,则会输出y=foo bar

    条件赋值

    条件赋值符(onditional variable assignment operator)为?=

    比如下面这个例子,取消第一行注释,输出为hello,不取消则输出为bar

    # FOO = hello
    FOO ?= bar # 如果未定义则赋值为bar
    
    hello:
    	echo $(FOO)
    

    条件赋值符相当于一种语法糖,复杂写法相当于:

    # FOO = hello
    ifeq ($(origin FOO), undefined)
      FOO = bar
    endif
    
    hello:
    	echo $(FOO)
    

    替换插值

    替换插值很好理解,就是字符串替换。

    foo := a.o b.o c.o
    bar := $(foo:.o=.c)
    hello:
    	echo $(bar)  # => a.c b.c c.c
    

    $(var: a=b)这种语法会将子串a替换为子串b.

  • 相关阅读:
    Netty 4.1.98.Final 发布
    react hook: useId
    释放静电行为监测识别系统
    盘点 | 2022年上半年国内的电邮安全事件
    pytorch 实战【以图像处理为例】
    常用的日期格式整理
    linux傻瓜式安装Java环境及中间件
    JSR303是啥?有啥用处?
    牛客刷题总结——Python入门03:运算符
    【EMC专题】电磁兼容学科的发展
  • 原文地址:https://blog.csdn.net/qq_33745102/article/details/127101518