zoukankan      html  css  js  c++  java
  • 【Makefile】2Makefile的介绍及原理


    前言

    • 本笔记主要记录Makefile一些概念要点。
    • 本笔记为提取性笔记,章节与《跟我一起写Makefile》同步,所以会看到有些小标题会跳过。

    概念

    Chapter 2:介绍

    2.1 makefile的规则

    target ... : prerequisites ...
        command
        ...
        ...
    
    • target

      • 可以是一个object file(目标文件)
      • 也可以是一个执行文件
      • 还可以是一个标签(label)。
    • prerequisites

      • 生成该 target 所依赖的文件 和 / 或 targe。
    • command

      • 为该 target 要执行的命令(任意的shell命令)。
    • 注:prerequisites 中如果有一个以上的文件比 target 文件要新的话,command 所定义的命令就会被执行

    2.3 make 是如何工作的 **

    在默认的方式下,也就是我们只输入 make 命令,就会按下面流程走

    1. make会在当前目录下找名字叫 Makefilemakefile 的文件。
      • GNU make找寻默认的Makefile的规则是在当前目录下依次找三个文件—— GNU-makefilemakefileMakefile
    2. 如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到edit这个文件,并把这个文件作为最终的目标文件。
      • 注:此处的 "edit" 是第一个目标,例子就不贴出来了。
    3. 如果 edit 文件不存在,或是edit所依赖的后面的.o文件的文件修改时间要比 edit 这个文件新,那么,他就会执行后面所定义的命令来生成 edit 这个文件。
    4. 如果 edit 所依赖的.o文件也不存在,那么 make 会在当前文件中找目标为.o文件的依赖性,如果找到则再根据那一个规则生成.o文件。(这有点像一个堆栈的过程)
    5. 当然,你的 C 文件和 H 文件是存在的啦,于是 make 会生成.o文件,然后再用.o文件生成make的终极任务,也就是执行文件 edit 了。

    2.5 让 make 自动推导

     该功能了解一下。
     只要make看到一个.o文件,它就会自动地把.c文件加在依赖关系中,如果make找到一个whatever.o,那么whatever.c就会是whatever.o的依赖文件。并且cc -c whatever.c也会被推导出来。
    如:

    whatever.o : whatever.h
    # 等价于
    whatever.o : whatever.c whatever.h
        cc -c whatever.c
    

    2.8 Makefile 里面有什么

    Makefile 里主要包含了五个东西:
    * 显式规则
    * 隐晦规则
    * 变量定义
    * 文件指示
    * 注释

    • 注:还值得一提的是,在Makefile中的命令,必须要以Tab键开始。
      以上几点详细解释参考《跟我一起写Maefile》对于章节

    2.9 Makefile 的文件名

    • 默认情况下,make命令会在当前目录下按顺序找寻文件名为 GNUmakefilemakefileMakefile的文件。
      • 推荐使用 Makefile 命名。
    • 也可以使用别名命名,如 Makefile.buildabcde等等,只需要使用 make -f 文件名make -file 文件名 来指定文件名即可。

    2.10 引用其它的Makefile

    • 在 Makefile 使用 include 关键字可以把别的 Makefile 包含进来,这很像 C 语言的 #include ,被 包含的文件会原模原样的放在当前文件的包含位置。
    • include 语法:
      • filename 可以是当前操作系统 Shell 的文件模式(可以包含路径、通配符和多个文件)(多个文件时用空格隔开)。
    include <filename>
    

    寻找其它的 Makefile 路径及顺序

    1. 先在 filename 指定路径找。如:include <./Makefile.build> ,表示在当前路径先找。
    2. 如果 filename 没有指定路径的话,就先从 make 当前路径先找。
    3. 以上两个都没有,便开始找 make-I--include-dir 指定路径找。
    4. 还没找到便去目录 /include (一般是:/usr/local/bin 或 /usr/include)找。
    5. 都没有便发出警告。(若想略过警告,可以使用 - 号,-include
    • 总结一下:filename指定路径->当前路径->-I或--include-dir 指定路径->最后路径

    2.11 环境变量 MAKEFILES

    不建议使用 MAKEFILE 变量。需要了解,可以看文档。
    **若使用Makefile时,出现了神奇的 bug ,可以先看看当前环境变量中有没有定义这个变量。

    2.12 make 的工作方式

    GNU 的 make 工作时的执行步骤如下:

    1. 读入所有的 Makefile。
    2. 读入被 include 的其它 Makefile。
    3. 初始化文件中的变量。
    4. 推导隐晦规则,并分析所有规则。
    5. 为所有的目标文件创建依赖关系链。
    6. 根据依赖关系,决定哪些目标要重新生成。
    7. 执行生成命令。

    参考

    书籍

    • 《GUN Makefile》
    • 《跟我一起写Makefile》
  • 相关阅读:
    oracle中next_day()、last_day()函数解析
    Oracle数据库统一审核的启用测试与关闭
    20170722上课笔记
    20170721上课笔记
    20170720上课笔记
    20170719上课笔记
    20170718上课笔记
    20170717上课笔记
    《Linux系统基础》随堂笔记5
    《oracle的安装》
  • 原文地址:https://www.cnblogs.com/lizhuming/p/13793132.html
Copyright © 2011-2022 走看看