zoukankan      html  css  js  c++  java
  • 7、使用autotools自动产生makefile

      通过之前的学习可以知道,makefile拥有复杂的语法结构,编写与维护都不是很方便于是设计出了专门用来生成Makefile的autotools工具,以减轻制作makefile文件的负担。

      自主软件主要以源码形式发布,着需要在多种系统上重新编译。源代码包安装分为3个步骤,configure、make和make install,在构建过程中涉及到许多文件,制作起来十分复杂,使用autotools工具生成Makefile文件,可以大大方便源码安装包的制作。

    1、Autotools的工作原理

      一个autotool项目至少需要一个名为configure的配置脚本和一个名为Makefile.in的makefile模板。项目的每个目录中有一个Makefile.in文件。Autotools项目还使用其他文件,这些文件不是必须的,有的还是自动产生的,如果去查看相关文件内容,会发现它们非常负责,不过这些文件是Autotools通过容易编写的模板文件生成的。

      实际上并不需要Autotools来建立Autotools包,configure是在最基础的Shell上运行的Shell脚本,它检查用户系统获取每个特征,通过模板写出makefile文件。

      configure在每个目录中创建所有文件。这个目录称为创建目录。如果从源码运行他,可以使用./configure,创建目录也是同样的。

      configure在命令行接受几个选项,用于在不同的目录中安装文件。可以通过执行configure --help命令来获得相关帮助,这里给出最常用的选项列表。

      --help:列出所有的变量选项。
    
      --help host:编译以使其在另一个系统上运行(交叉编译)
    
      --prefix dir:选择根目录已安装项目路径,默认的是/usr/local

      configure产生几个附加文件:config.log(日志文件,出现问题以获得详细信息)、config.status(一个shell脚本,可以真实的了解当前的配置)、config.h(头文件,从模板config.h.in中产生),不过这些文件并不特别重要。

      由configure产生的makefie文件比较复杂,其定义是由GNU标准所需的所有标准目标,常用的目标列举如下:

    make或make all:创建程序
    make install:安装程序
    make distclean:删除由configure产生的所有文件。

      生成configure过程中各文件之间的关系图

    2、Autotools工具

      autotools由autoconf、automake、prel语言环境和M4等组成。它所包含的命令有5个:aclocal(处理本地的宏定义)、autoscan(检查源文件)、autoconf(根据autoscan收集的信息及用户的修改生成配置程序configure)、autoheader(创建配置头文件)、automake(创建Makefile的模板makefile.in)。

      下面为使用apt-get指令安装autoconf

    3、Autotools示例

    1、准备源代码

       首先编写main.c

    #include <stdio.h>
    
    #include "common.h"
    
    int main()
    
    {
    
    	hello_method();
    
    	return 0;
    
    }

      hello.c文件

    #include <stdio.h>
    #include "common.h"
    void hello_method()
    {
    	printf("hello_world!
    ");
    }
    

      common.h文件

    void hello_method();
    

    2、运行autoscan命令

      切换到项目工作目录,执行autoscan命令扫描工作目录生成configure.scan文件

      生成的configure.scan文件

    #                                               -*- Autoconf -*-
    # Process this file with autoconf to produce a configure script.
    
    AC_PREREQ([2.69])
    AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
    AC_CONFIG_SRCDIR([main.c])
    AC_CONFIG_HEADERS([config.h])
    
    # Checks for programs.
    AC_PROG_CC
    
    # Checks for libraries.
    
    # Checks for header files.
    
    # Checks for typedefs, structures, and compiler characteristics.
    
    # Checks for library functions.
    
    AC_OUTPUT
    

       其中都是M4宏命令,这些宏命令的主要内容是检测系统。

    3、修改autoscan.scan文件,并重命名为configure.ac

      configure.ac文件是autoconf的配置文件,修改编辑配置文件如下:

    #                                               -*- Autoconf -*-
    # Process this file with autoconf to produce a configure script.
    
    AC_PREREQ([2.69])
    AC_INIT([hello], [1.0], [mynoticeable@gmail.com])
    AC_CONFIG_SRCDIR([hello.c])
    AC_CONFIG_HEADERS([config.h])
    AM_INIT_AUTOMAKE
    # Checks for programs.
    AC_PROG_CC
    
    # Checks for libraries.
    
    # Checks for header files.
    
    # Checks for typedefs, structures, and compiler characteristics.
    
    # Checks for library functions.
    AC_CONFIG_FILES([Malkefile])
    AC_OUTPUT

      这里修改了宏AC_INIT,添加了宏AM_INIT_AUTOMAKE和AC_CONFIG_FILES.

      configure.ac配置文件中的宏的解释如下表 

     

     4、执行aclocal命令

      执行aclocal命令,扫描configure.ac文件生成aclocal.m4文件

       

    aclocal.m4文件主要处理本地的宏定义。aclocal命令根据已经安装的宏、用户定义宏和acinclude.m4文件中的宏,将configure.ac文件需要的宏集中定义到文件aclocal.m4文件中。

    5、执行autoconf命令

       执行autoconf命令生成configure文件。

    该命令将configure.ac文件中的宏展开,生成configure脚本。这个过程可能要用到aclocal.m4中定义的宏。

    6、执行autoheader命令

      执行autoheader命令生成config.h.in文件。

    如果用户需要附加一些符号定义,可以创建acconfig.h文件,autoheader会自动从acconfig.h文件中复制符号定义。

    7、创建Makefile.am文件

      在项目目录下创建要给Makefile.am文件,供automake工具根据configure.in中的参数将Makefile.am转换称Makefile.in文件。Makefile文件定义了一些生成Makefile的规则。本例中创建的Makefile.am的内容如下:

    AUTOMARK_OPTIONS = foreign
    bin_PROGRAMS = hello
    hello_SOURCES = main.c hello.c common.h
    

      其中AUTOMARK_OPTION为automake的选项。GNU对自己发布的软件有严格的规范,如必须附带许可证声明文件COPYING等,否则automake执行时会报错,automake提供了3个软件等级;foreign、gnu和gnits供用户选择,默认为GNU,本例中使用最低的foreign等级,只检测必需的文件。

      bin_PROGRAMS定义了要产生的可执行文件名,如果要产生多个可执行文件,每个文件名间用空格隔开。

      file_SOURCES定义了生成可执行文件需要依赖的源文件。

    7、执行automake命令

      在项目目录下执行automake命令生成Makefile.in文件。通常要使用--add-missing让automake自动添加一些必需的脚本文件。不过这里还有几个必需的文件没创建,这里先通过touch命令来创建,然后再执行automake命令。

      至此,使用autotools工具完成了源码安装的准备,接下来可以按照源码安装的3个步骤完成软件的编译和安装。

    9、执行./configure命令

      执行./configure命令,基于Makefile.in生成最终的Makefile文件,该命令将一些配置参数添加到Makefile文件中。

    10、执行make命令并运行程序

       执行make命令,基于Makefile文件编译源代码文件并生成可执行文件。

      接着在该目录下运行所产生的可执行文件进行测试。

     

    10、执行make install命令

      在项目目录下执行make install 命令将软件包安装到系统中,默认设置会将软件安装到/usr/local/bin目录,需要root权限,安装完毕后,可以直接运行hello命令

      

      自动产生的Makefile文件指出主要的目标,如执行make uninstall命令将安装的软件从系统中卸载;执行make clean命令清除已编译的文件,包括目标文件*.o和可执行文件。make命令默认执行的是make all命令。

    11、执行make dist命令对软件进行打包

      如果要对外发布,可以在项目目录下执行make dist命令将程序和相关的文档打包为一个压缩文档。如下

    参考资料

    Autoconf

    GNU_makefile中文手册

  • 相关阅读:
    Python数据类型知识点
    CentOS上部署Kubernetes集群
    运维面试题(持续更新)
    shell拷贝文件到另一台机器
    第十一章——线程【01】
    07 类 | 类的静态成员
    【C++ Primer | 19】控制内存分配
    002 模板实参推断、重载与模板
    16 模板与泛型编程 | 定义模板
    C++ | 类
  • 原文地址:https://www.cnblogs.com/noticeable/p/8889820.html
Copyright © 2011-2022 走看看