• makefile 杂项


    1. ########################################
    2. # makefile 中使用环境变量
    3. # 在shell 命令中,用$$即可,$$被make解析为$
    4. # 例子:
    5. ########################################
    6. all:
    7. @echo $$PATH # $$被解析为$, 执行的shell 命令为 echo $path, 所以说环境变量的引用要用两个$
    8. @echo "-----"
    9. @echo $PATH # $P 被认为是一个变量,解析成一个空,所以只显示ATH


        

    测试结果: make
    /opt/bin:/opt/ffmpeg_build/bin:/home/hjj/bin:/usr/local/sbin:/usr/local/bin
    -----
    ATH

    ########################################
    # Makefile 立即赋值和延时赋值研究
    ########################################
    var1 = foo
    var2 = $(var1)
    var3 := $(var2)        # 因为是:= 所以立即求值了,就是解析到数据库时就已经求值了
    #var3 = $(var2)        # 因为是 = 赋值,所以在使用时才会求值,就是执行echo 命令时
    var1 = bar

    all:
        @echo $(var3)

    =========================================================================
    当用 := 时,解析到数据库时就已经把数据求值了
    # makefile (从“Makefile”,行 5)
    var2 = $(var1)
    # makefile (从“Makefile”,行 6)
    var3 := foo
    # makefile (从“Makefile”,行 8)
    var1 = bar
    #  要执行的配方 (从“Makefile”,行 11):
        @echo $(var3)
    还注意到,第4行 var1 = foo 根本在数据库中没有出现,但var1 = bar 出现了.
    =========================================================================
    当用 = 时, 解析到数据库还是原样照印,没有求值。

    # makefile (从“Makefile”,行 7)
    var3 = $(var2)

    关于第4行 var1 = fool 还是没有出现, 因为它没有必要再数据库中出现了,也没有它的位置,
    因为后面var1 = bar 出现了。 谁再引用var1变量,那便是"bar" 了


    所以 make 的过程大体分2步。
    第一步:把文件source 到数据库中,需要立即求值的先展开求值。这里的求值叫立即求值
    第二步: 根据数据库及依赖规则来调用命令make 目标,这里的求值叫延时求值

    #####################################################################
    再研究一个复杂点的例子
    #####################################################################
    var1 = foo                # = 赋值,是滞后展开, $(flavor var1)=recursive
    var2 = $(var1)
    #var3 := $(var2)        # 因为是:= 所以立即求值了,就是解析到数据库时就已经求值了, 其flavor 是simple
    var3 = $(var2)        # 因为是 = 赋值,所以在使用时才会求值,就是执行echo 命令时
    y-$(var3) = "abc"        #目标中有变量,都会立即展开. 这样显然简化了make的运算
    #var1 = bar

    all:
        @echo "var3 is " $(var3)
        $(warning "var1 flavor is "$(flavor var1))
        @echo "y-$(var3) is " $(y-$(var3))

    结论:
        立即求值的变量其flavor是simple,延时求值的是recursive
        目标变量中包含变量求值的会立即先求值得到目标变量名称

  • 相关阅读:
    QT中QRadioButton实现分组C++
    react-hooks的节流与闭包,以及useCallback的用处
    基于SpringBoot+Vue网上商城系统的设计与实现
    分布式架构在云计算平台中的应用及优缺点
    【Linux】进程间通信
    GRACE球谐数据滤波处理(利用matlab实现GRACE月水储量的二维傅里叶变化滤波)
    【软考】模块之间的耦合性及其代码示例
    500含文档+PPT+源码等]精品微信小程序二手汽车拍卖系统+后台管理系统|前后分离VUE[包运行成功]微信小程序毕业设计项目源码计算机毕设
    Debezium 同步 MySQL 实时数据并解决数据重复消费问题
    CIE A-Level化学Paper1真题讲解(6)
  • 原文地址:https://blog.csdn.net/hejinjing_tom_com/article/details/126225065