zoukankan      html  css  js  c++  java
  • GNU make简介

    引言

    接触开源项目有一段时间了,对自动化编译工具一直很好奇。近期有时间正好整理下GNU make。后续可以深入了解下。
    本文主要整理GNU make的学习的基本资料,同时简要介绍make的功能、语法。

    GNU Make

    GNU Make主要用于自动化构建可执行程序(库文件),比较经典的用法如下:

    make
    make install
    make clean
    make distclean

    Make使用makefile中规则构建程序。
    makefile关系到了整个工程的编译规则。一个工程中的源文件不计其数,按类型、功能、模块分别放在若干个目录中,makefile 定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 makefile 就像一个Shell脚本一样,其中也可以执行操作系统的命令。
    makefile 带来的好处就是——“自动化编译”,一旦写好,只需要一个 make 命令,整个工程完全自动编译,极大的提高了软件开发的效率。make 是一个命令工具,是一个解释 makefile 中指令的命令工具,一般来说,大多数的 IDE 都有这个命令,比如:Delphi 的 make,Visual C++的 nmake,Linux 下 GNU 的 make。可见,makefile 都成为了一种在工程方面的编译方法。

    说白了,GNU make搭建了构建和编译的桥梁,通过makefile实现了自动构建脚本的生成和执行,同时支持自定义扩展(比如make clean、make install)。

    Make的功能

    • 自动化构建和安装
    • 增量编译及自动更新
    • 适用于多语言,比如c/c++、java、php等
    • 支持自定义功能扩展(只要有意义,都是可以放到makefile中)

    makefile的规则和目标

    Make是一个规则解释语言,也是一种宏语言。
    其核心是通过规则(Rule)描述了工作目标与依赖项之间的关系,通过这种关系实现自动构建,增量更新。其基本语法如下:

    target:   dependencies ...
              commands
    

    一个规则包括target,及其构建的依赖项(dependencies);comands前面必须是' '(Tab键),给出由依赖项构建target需要调用的shell脚本命令。在make调用时可以指定特定的target,

    规则通常分为具体规则、模式规则、隐含规则等。
    默认的c语言编译时,*.o依赖于*.c文件,这就是隐含规则,通常是约定俗成的。
    写成下面形式:

    *.o : *.c
    	$(CC) -c $(CFLAGS) $< -o $@
    

    这种就是模式规则,是由用户自定义的规则。
    如果是形式比如下面:

    test: test.c
    	gcc $< -o $@
    

    这就是具体规则。

    由于makefile也是脚本的一种,通常支持通配符、变量、函数调用、宏等。有兴趣的可以参考下后续的资料。
    注意上面的(@、)<是自动变量的一种,分别表示“工作目标的文件名”、“第一个必要条件的文件名”。

    GNU make的学习

    在很多开源项目中都会用到makefile,建议还是先了解下具体的使用,再学习Make的基本语法。其官网是:https://www.gnu.org/software/make/。

    中文版的参考资料可以阅读:陈皓的"跟我一起写 Makefile"(麻烦自己搜索,网上很多版本)

    也可以参考"Managing Projects with GNU Make"(中译名《GNU Make项目管理》)。
    这本书上有比较全面详细的GNU Make介绍。

    当然,最全面的还是GNU Make的用户手册,网上也有很多中译版。

    小结

    接触很久makefile,终于下定决心了解并深入下,虽然做不到专业,但是最起码能看懂,出现问题或疑问知道怎么解决,也算一种进步。后续有机会可以深入了解下Linux/开源项目的Makefile用法。另外,Android的NDK其实也是很多Makefile的集合。

    这里说明一点,这不是一篇对GNU Make介绍很全面的文章,这仅仅是我在近期对GNU Make一个大概的认识,不全面的地方一定会有。

  • 相关阅读:
    【算法】一致性Hash算法
    P1576 最小花费 题解
    Vijos1234 口袋的天空 题解
    P1379 八数码难题 题解
    Tarjan求无向图必经点 笔记
    P3372 【模板】线段树 1 题解
    CF1332A Exercising Walk 题解
    P6270 [SHOI2002]取石子游戏 题解
    P6269 [SHOI2002]空中都市 题解
    P6268 [SHOI2002]舞会 题解
  • 原文地址:https://www.cnblogs.com/tocy/p/GNU-Make-intro.html
Copyright © 2011-2022 走看看