zoukankan      html  css  js  c++  java
  • 【Makefile】4-Makefile书写命令


    前言

    • 本笔记主要记录Makefile一些概念要点。

    概念

    Chapter 4:书写命令

    • 每条规则中的命令和操作系统 Shell 的命令行是一致的。
    • 每条命令必须以 Tab 键开头,除非,命令是紧跟在依赖规则后面的分号后的。
    • make 一般是使用环境变量 SHELL 中所定义的系统 Shell 来执行命令,默认情况下是 /bin/sh —— UNIX 的标准 Shell 解释执行的。

    4.1 显示命令

    • 是否显示命令
      • 在命令行前使用 @ 字符,那么该命令将不被make显示出来
    • 只显示,不执行
      • make 执行时,带入 make 参数 -n--just-print
      • 作用:一般用于调试,查看make执行的顺序。
    • 全面禁止,命令的显示:
      • make 参数 -s--silent--quiet 则是全面禁止命令的显示。

    4.2 命令执行 *

    • 当依赖目标新于目标时,make 会一条一条的执行其后的命令。
    • 如果要让上一条命令的结果应用在下一条命令时,你应该使用分号分隔这两条命令。
      • 例子1:输出为:【当前目录路径】
    exec:
    cd /home/lss
    pwd
    
    * 例子2:输出为:/home/lss
    
    exec:
    cd /home/lss; pwd
    
    • 命令解析器寻找顺序
      • 首先,在 SHELL 所指定的路径中找寻 --> 在当前盘符中的当前目录中寻找 --> 在 PATH 环境变量中所定义的所有路径中寻找。
      • MS-DOS 中,如果定义的命令解释器没有找到,其会给你的命令解释器加上诸如 .exe 、.com 、.bat 、.sh 等后缀。

    4.3 命令出错

    • 每当命令运行完后,make 会检测每个命令的返回码,码为零则成功。
    • 忽略命令失败
      • 方法一:减号
        • 在命令前( Tab 键后)加上一个减号 - 即可。
      • 方法二:全局(分两种)
        • make 加上 -i 或是 --ignore-errors 参数
        • 果一个规则是以 .IGNORE 作为目标的,该规则中的所有命令将会忽略错误。
    • 命令失败,但只终止当前规则
      • make 的参数的是 -k 或是 --keep-going
        • 意思是:某规则中的命令出错了,就终止该规则的执行,但继续执行其它规则。

    4.4 嵌套执行 make

    • 总控 Makefile + 各个子目录 Makefile。
    • 父级 Makefile
      • -C 切换到其它目录
    subsystem:
        make -C subdir # 或者:cd subdir && make
    
    • 传递变量到下级,声明方法:

      • export <variable ...>;
      • 注:注意 等号:(意思是 export 后,就不是 延时变量)
        • export variable = value 等价于 export variable := value
        • 传递时默认不覆盖,加上 -e 即可覆盖下级重新赋值的变量
    • 不想让该变量传递到下级,声明方法:

      • unexport <variable ...>;
    • 注意两个变量 *

      • SHELLMAKEFLAGS 这两个变量不管你是否 export,其总是要传递到下层 Makefile 中。
      • MAKEFLAGS
        • 包含了 make 的参数信息。
      • 不想让 MAKEFLAGS 往下传递的做法
    subsystem:
       cd subdir && $(MAKE) MAKEFLAGS=
    
    • 不往下传递的 参数

      • make 命令中 -C , -f , -h, -o-W 参数是不往下传递的。
    • 信息打印 *

      • -w 或是 --print-directory 会在 make 的过程中输出目前的工作目录。如:执行 make -w
    # 进入该目录时会答应如下信息
    make: Entering directory `/home/hchen/gnu/make'.
    
    # 在完成下层 make 后离开目录时:
    make: Leaving directory `/home/hchen/gnu/make'
    
    * 当你使用 **-C** 参数来指定 **make** 下层 **Makefile** 时,**-w** 会被自动打开的。如果参数中有 **-s(--slient)**或是 **--no-print-directory** ,那么,**-w** 总是失效的。
    

    4.5 定义命令包

    • 相当于 C 中的函数。
    • 语法以 define 开始,以 endef 结束。
    • 例子:
      • run-yacc
        • 命令包名字
      • 中间两句就是 命令包内容
    define run-yacc
    yacc $(firstword $^)
    mv y.tab.c $@
    endef
    
    • 调用方法
      • 采用 $
    foo.c:foo.y
        $(run-yacc)
    

    参考

    • 《GUN Makefile》
    • 《跟我一起写Makefile》
  • 相关阅读:
    HDU 2544 (Djikstra)
    HDU 1237(表达式求值)
    HDU1690 (Floyd)
    《大道至简》读后感
    第6周总结
    第8周总结
    第7周总结
    第四周总结
    第5周总结
    java程序
  • 原文地址:https://www.cnblogs.com/lizhuming/p/13818173.html
Copyright © 2011-2022 走看看