zoukankan      html  css  js  c++  java
  • makefle-2

    一、变量的定义可能出现的地方只有两种
    1、makefile全局变量:一定在target外部
    2、出现在target内的shell内部的变量

    3、target内部:
    3.1:如果是makefile中的关键字语法,前面一定不能出现tab,否则会当成命令处理。
    3.2:target内部若用的时shell的语法命令,必然会以tab开始。

    举例:
    all:
    @if [ "debug" = "debug" ];
    then
    TV3=test3_yes;
    echo $$TV3;
    else
    TV3=test3_no;
    fi

    TV3=MYTV
    all:
    @if [ "debug" = "debug" ];
    then
    TV3=test3_yes;
    echo $$TV3;
    echo $(TV3); #引用的是makefile中的变量
    else
    TV3=test3_no;
    fi

    all:
    @for i in 1 2 3;
    do
    echo "building " $$i;
    done
    @echo "finall"

    知识点1:
    makefile会将上述内嵌的shell脚本当作一个独立的单元,它们在单独的进程中运行。里边定义的变量,只能在这个shell单独进程进行局部使用。
    知识点2:
    Shell进程使用自己的变量,应该以$$开头,且自己的变量是不需要括号。
    shell进程内也可以引用全局的makefile变量。
    知识点3:
    Shell脚本在target里才有效,其它地方都被忽略掉了。target外可以用$(shell 语句)方式 ,如:$(PWD)

    //makefile中语法关键字+tab(make时直接报错,语法错误)
    all:
    ifeq (1,1)
    @echo "123"
    endif

    //不加空格(make时不会报错,但不会识别出这是一个shell脚本执行命令(也可以叫执行程序),将不会开启一个shll进程去执行程序,所以什么事情都不会做)
    all:
    @if [ "debug" = "debug" ];
    then
    TV3=test3_yes;
    echo $$TV3;
    else
    TV3=test3_no;
    fi

    //每一条shell脚本都是一个独立的进程,进程间变量不共享
    all:
    @if [ "debug" = "debug" ];
    then
    TV3=test3_yes;
    echo $$TV3;
    else
    TV3=test3_no;
    fi
    echo $$TV3

    重点解析:echo $$TV3
    执行结果:echo $TV3 + 换行

    makefile执行顺序:
    1、先将$$TV3 执行一次扩展,第一个$指的时引用变量,后面的$TV3指的是变量,此时回输出:echo $TV3
    2、扩展后得到的echo $TV3又被shell解析,此时由于V3在makefile中并没有定义此变量,所以会输出换行。

    4、命令前@符号问题

    如果不添加@,会将shell命令打印出来。

    echo $(KVAL)       
    @echo $(LIBS)           //不会把shell本身的命令echo打印出来。
    

    if前已经有了@,及时内部的echo没有@打印时也不会将命令本身打印出来。
    all:
    @if [ "debug" = "debug" ];
    then
    TV3=test3_yes;
    echo $$TV3;
    else
    TV3=test3_no;
    fi

    总结:
    上述的shll命令体现了:if then 、 for i in、makefile语法则有ifeq
    shll脚本单条语句有;号,以""进行连接。makefile自身语法执行上不加;号。

    参考文档:
    https://www.cnblogs.com/LiuYanYGZ/p/5438441.html

    https://blog.csdn.net/qq_34369618/article/details/52973720

  • 相关阅读:
    在Python中使用多进程快速处理数据
    深度学习中Embedding层有什么用?
    split("\s+") 和 split(" +") 有什么区别?
    python merge、concat合并数据集
    机器学习中常见的损失函数
    XGBoost、LightGBM的详细对比介绍
    $(function(){})的执行过程分析
    jQuery.extend({...})分析
    jquery核心功能分析
    print打印网页相关
  • 原文地址:https://www.cnblogs.com/retry/p/11558658.html
Copyright © 2011-2022 走看看