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一个大概的认识,不全面的地方一定会有。

  • 相关阅读:
    蓝桥网试题 java 基础练习 特殊的数字
    蓝桥网试题 java 基础练习 杨辉三角形
    蓝桥网试题 java 基础练习 查找整数
    蓝桥网试题 java 基础练习 数列特征
    蓝桥网试题 java 基础练习 字母图形
    蓝桥网试题 java 基础练习 01字串
    蓝桥网试题 java 基础练习 回文数
    蓝桥网试题 java 基础练习 特殊回文数
    Using text search in Web page with Sikuli
    each of which 用法
  • 原文地址:https://www.cnblogs.com/tocy/p/GNU-Make-intro.html
Copyright © 2011-2022 走看看