zoukankan      html  css  js  c++  java
  • GNU autotools自动生成Makefile 介绍

    一、目的
    使用autotools工具来帮助我们自动地生成符合自由软件惯例的makefile(这样就可以像常见的GNU程序一样,只要使用“./configure”, “make”, “make install” 就可以把程序安装到linux系统中去了)
    GNU的软件风格的编译安装步骤:
    # ./configure 侦测系统的环境,确定软件安装目录,生成Makefile
    (用户执行configure时可以通过它的命令行参数指定自己所需的编译选项
    例如:安装目录通过--prefix= PREFIX设置,缺省情况下PREFIX为/usr/local
    默认安装时,执行文件安装到/usr/local/bin目录;
    库安装到/usr/local/lib目录;
    数据文件安装到/usr/local/share目录)
    # make 调用系统中的编译器进行编译和连接
    # make install 将软件安装到设定的目录
    二、GNU autotools
    1、主要包括三个软件: autoconf ,automake,libtool。
    很多linux发行版都会默认安装这几个工具,软件包是通过pkgsrc,他们在pkgsrc目录为devel/autoconf,devel/automake,devel/libtool。
    2、简介:configure.ac里面主要是m4宏,用于侦测系统;Makefile.am里面主要是编译相关的设置信息。使用autoconf工具将configure.ac转换为configure执行文件,使用automake将Makefile.am转换为Makefile.in。执行configure脚本时会读取Makefile.in里面的设置信息,并与侦测信息一起写到Makefile文件中。
    (autoscan)->configure.ac->(autoconf)->configure
    Makefile.am->(automake)->Makefile.in->(configure)->Makefile
    3、命名习惯:
    .ac后缀的文件,是autoconf的输入文件(旧版本中configure.in等同于configure.ac,虽然新版本也
    可以识别,但它不符合命名规则,所以新版本的文件应该使用ac后缀)
    .am后缀的文件,是automake的输入文件
    .in后缀的文件,是configure的输入文件
    三、步骤
    1、建立目录,放入文件。按照GNU的习惯,将程序的源码放入src子目录,其他的数据文件也放在各自的子目录中。
    2、autoscan
    autoconf软件包里的autoscan工具根据参数指定目录生成一个configure.ac的模板文件configure.scan。autoscan如果不加参数则默认当前目录为工作目录。
    3、重命名configure.scan->configure.ac(autoconf的输入文件),然后在此基础上进行修改
    分析configure.scan文件:
    ① configure.ac文件是autoconf的输入文件,经过autoconf处理,展开里面的m4宏,输出的是
    configure脚本,其主要作用是侦测系统。
    ② #开始的行为注释,其他都是m4宏命令,宏参数中会使用`[]`来表示其中的字符串是一个整体
    AC_PREREQ([2.69]) 声明本文件要求的autoconf版本
    AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
    定义软件的名称和版本等信息,第三项BUG-REPORT-ADDRESS是可选项,一般写成作者的邮
    件地址,此处可修改为AC_INIT(helloworld, 1.0)
    AC_CONFIG_SRCDIR 该宏通过侦测所指定的源码文件是否存在,来确定源码目录的有效性。
    可以选择源码目录中的任何一个文件作为代表。
    AC_CONFIG_HEADER 宏用于生成config.h文件,里面存放configure脚本侦测到的信息。如果
    程序需要使用其中的定义,就在源码中加入#include <config.h>
    ⑦ 其他的一些宏是标准的侦测过程,可以保留不动。configure.ac文件要求AC_INIT必须放在开头位
    置,AC_OUTPUT放在文件末,中介用来检测编译环境的各种宏没有特别的先后次序要求,由宏之
    间相互关系决定Makefile文件的产生。
    AC_INIT_AUTOMAKE 简单的Makefile.in可以手动编写,如果使用automake产生,需要在
    configure.ac中加入该宏进行声明
    AC_CONFIG_FILES 要输出Makefile文件,需要在configure.ac中使用该宏进行声明该宏并不只
    是处理Makefile,而是将FILE.in文件转换为FILE文件
    **注意:因为makefile可以遍历子目录,如果子目录中存在Makefile,也将同时处理。例如在src
    目录下是源码, 其他目录下是数据文件的多个子目录的实例中,可以使用单独一个Makefile放
    在根目录下面,也可以用多个Makefile。由于每个子目录的Makefile只处理本目录的文件,分工
    明确,是模块化的方法,推荐使用。因此在configure.ac中增加下面的宏,表示软件根目录和子
    目录中都需要生成Makefile文件:
    AC_CONFIG_FILES([Makefile
    src/Makefile
    data/Makefile
    docs/Makefile
    fonts/Makefile
    images/Makefile
    music/Makefile
    sound/Makefile])
    4、编写Makefile.am文件
    ① 软件根(非叶子)目录Makefile.am:
    由于该目录下面保存的是与autotools相关的文件,没有需要编译安装的文件,所以只注明需要
    进一步处理的子目录信息:
    SUBDIRS = src data docs fonts images music sound
    ② 文件(叶子)目录Makefile.am
    (具体语法后续再详细研究)
    5、运行autotools
    准备好configure.ac和Makefile.am,就可以用autotools的命令来处理这些文件:
    ① aclocal命令:它根据configure.ac的定义,将需要使用的m4宏定义复制到aclocal.m4中。缺省
    时,m4 宏是从 autoconf 的安装目录和系统的aclocal目录搜索。如果需要使用其他路径下的宏,可
    以通过命令行的-I选项指定。
    ② autoheader命令,生成config.h.in文件,这里面的C语言宏定义也是通过解析configure.ac产生。
    ③ automake命令,处理Makefile.am,生成Makefile.in
    **注意:
    a. GNU对自己发布的软件有严格的规范,比如必须附带许可证声明文件COPYING等等,否则
    automake执行时会报错。
    b. automake提供了三种软件等级:foreign,gnu和gnits,让用户选择。默认为gnu,foreign指
    它只检测必须的文件和有一些必须的脚本文件可以从automake软件包里复制过来。
    c. --add-missing选项:将缺失的标准文件添加到包中
    ④ autoconf命令,生成configure文件
  • 相关阅读:
    浪潮之巅阅读笔记01
    2018年春季个人阅读计划
    问题账户需求分析
    需求工程解析图收获
    《软件需求分析》阅读笔记
    《软件需求》阅读笔记之三
    《小账本》开发日志 第六天
    《小账本》开发日志 第五天
    [POI2009]KAM-Pebbles BZOJ1115 [ 待填坑 ] 博弈
    打谷机 BZOJ 1603 模拟
  • 原文地址:https://www.cnblogs.com/sunhaohao/p/8484369.html
Copyright © 2011-2022 走看看