• makefile 使用 Tricks


    • .phony是表示目标是伪目标,并不生成相应的文件。.phony标志的文件总是执行的。

    1. 短横(-)与@

    • @(常用在 echo 之前):make 在执行编译打包等命令前会在命令行输出此命令,称之为回显,如果要执行的命令前以字符@开始,则不会回显该条命令,

      echo XXX...
      
      # 执行该条命令时,将输出:
      
      
      echo XXX...
      XXX...
          # 不仅会输出echo要输出的信息(XXX...),还会输出echo这一命令信息
      
      @echo XXX...
      
      # 执行命令时,将输出:
      
      XXX...
          # 不会输出echo命令
    • -短横(用在 clean 目标, rm 命令前),忽略本条命令的执行成功与否,会继续执行后续命令,类似于 try catch finally 的 finally 代码段

      clean:
          rm *.o
          rm *.a
      如果 rm *.o 命令发生错误,rm *.a 将不会被执行,
      
      clean:
          -rm *.o
          -rm *.a

      不论 -rm .o,是否执行成功,-rm .a 都会被执行;

    2. 特殊符号

    • $@, $^, $<
      • $@ 代表目标
      • $^ 代表所有的依赖对象
      • $< 代表第一个依赖对象
    • =/:=/+=

      • +=:变量的值的尾部增加内容
      foo = abc
      foo += efg
          # foo 的值就是 abc efg
      • :=:立即生效;=:变量被引用时递归生效;
      bar=456
      foo=${bar}
      bar=${xxx}
      xxx=123
      
      all:
         echo ${foo}          # 递归生效,echo 显示的内容为123
      bar=456
      foo:=${bar}
      bar=${xxx}
      xxx=123
      
      all:
         echo ${foo}
             # 立即生效,echo 显示的内容为 456

    3. all

    all : hello another
    
    hello : hello.cpp
        g++ -o $@ $<
    
    another : another.cpp
        g++ -o $@ $<
    
    • make hello 的话只编译 hello.cpp
    • make another 的话只编译 another.cpp
    • 直接 make 或 make all 的话会执行 hello.cpp 和 another.cpp 的编译命令
    • 后面不加参数的话,会把第一个目标作为默认的(因此,make 等价于 make all,因为 all 为第一个目标)
  • 相关阅读:
    JSTL EL 详解
    什么是JavaBean
    easy.jsp出现According to TLD or attribute directive in tag file, attribute value does not accept any expressions
    搭建sendmail
    系统运维工程师之路
    centos7 搭建安装zabbix3.0服务端实例(一)
    单例模式
    cassandra-压缩策略
    cassandra的坑-windows平台压缩策略
    Quick Sort
  • 原文地址:https://www.cnblogs.com/mtcnn/p/9420974.html
Copyright © 2020-2023  润新知