Autoconf编译配置

Autoconf编译配置1、大型项目编译过程./configuremakemakeinstallLinux中的configure/make/makeinstall到底在做些什么1)./configure:configure是一个脚本,一般由Autoconf工具生成,它会检验当前的系统环境,看是否满足安装软件所必需的条件:比如当前系统是否支持待安装软件,是否已经安装软件依赖等。configure脚本最后会生成一个Makefile文件。2)makemake是一个命令,它使用第1步得到的Makefile文件,如果

大家好,又见面了,我是你们的朋友全栈君。

1、大型项目编译过程

./configure
make
make install

Linux中的configure/make/make install 到底在做些什么

1)./configure:
configure是一个脚本,一般由Autoconf工具生成,它会检验当前的系统环境,看是否满足安装软件所必需的条件:比如当前系统是否支持待安装软件,是否已经安装软件依赖等。configure脚本最后会生成一个Makefile文件。
2)make
make是一个命令,它使用第1步得到的Makefile文件,如果只有”make”命令,而没有指明”目标”,一般情况下是编译源码。
3)make install
make install表示运行”目标为install的make命令”,即将编译后的结果复制到相应目录中。

2、使用Autoconf过程

Autoconf工具只是autotools系列工具中的一个,运行之后可对configure.in脚本配置文件进行处理进而生成configure可执行文件。简单来说是用来简化Makefile文件的编写,涉及到的几个重要过程如下

  • 使用命令aclocal会生成m4文件(全称是macro,m后面有4个字母),m4是一种宏处理器,它是 POSIX 标准的一部分
  • autoconf,是生成configure文件的,configure是一个脚本,它能设置源程序来适应各种不同的操作系统平台,并且根据不同的系统来产生合适的Makefile,从而可以使你的源代码能在不同的操作系统平台上被编译出来。
  • automake用来生成Makefile.in文件

简单总结一下,这个编译过程涉及几个命令工具,大体的功能点如下。

aclocal # 产生 aclocal.m4

autoconf # 根据 configure.in 生成configure

automake –add-missing # 根据 Makefile.am生成Makefile.in

整个流程图:

在这里插入图片描述

具体操作过程:

  1. 源码根目录调用autoscan脚本,生成configure.scan文件。在给定目录以及其子目录树中检测源文件,若没有给定目录,就是在当前目录及其子目录树中检查。
  2. 修改【configure.ac】,利用autoconf提供的各种M4宏,配置项目需要的各种自动化探测项目
  3. 编写【自定义宏】,建议每个宏一个单独的*.m4文件;
  4. 调用aclocal收集configure.ac中用到的各种非Autoconf的宏,包括自定义宏;
  5. 调用autoheader,扫描configure.ac(configure.in)、acconfig.h(如果存在),生成config.h.in宏定义文件,里面主要是根据configure.ac中某些特定宏(如AC_DEFINE)生成的#define和#undefine宏,configure在将根据实际的探测结果决定这些宏是否定义
  6. 按照automake规定的规则和项目的目录结构,编写一个或多个【Makefile.am】(Makefile.am数目和存放位置和源码目录结构相关),Makefile.am主要写的就是编译的目标及其源码组成。
  7. 调用automake,将每个Makefile.am转化成Makefile.in,同时生成满足GNU编码规范的一系列文件(带-a选项自动添加缺少的文件,但有几个仍需要自己添加,在执行automake前需执行touch NEWS README AUTHORS ChangeLog)。如果configure.ac配置了使用libtool(定义了AC_PROG_LIBTOOL宏(老版本)或LT_INIT宏),需要在此步骤前先在项目根目录执行libtoolize –automake –copy –force,以生成ltmain.sh,供automake和config.status调用。
  8. 调用autoconf,利用M4解析configure.ac,生成shell脚本configure。以上几步完成后,开发者的工作就算完成了,后面的定制就由开源软件的用户根据需要给configure输入不同的参数来完成。
  9. 用户调用configure,生成Makefile,然后make && make install。

需要操作的过程:

  • 【修改configure.ac文件】
  1. 添加AM_INIT_AUTOMAKE宏

    AM_INIT_AUTOMAKE是检查automake尝试Makefile时的工具,传到这个宏里的参数是要编译的应用程序的名称和版本号(这些参数成为config.h中定义的PACKAGE和VERSION值)

  2. AC_CONFIG_HEADERS([config.h])

    这个宏的目的是输出config.h,这是一个C的头文件,里面主要是包含很多宏定义#define,说到这里其实就很明确了,输出这个文件的目的就是提供各种相关的宏

  3. 添加编译链接需要的程序

    AC_PROG_CXX

    AC_PROG_CC

    AC_PROG_RANLIB

    如果使用libtool编译,则选项如下,注意使用了libtool则需要将AC_PROG_RANLIB去掉

    LT_INIT

  4. 在AC_OUTPUT上一行添加AC_CONFIG_FILES宏

    添加这个宏的目的是制定Autoconf输出哪些文件,常见的文件就是Makefile文件,config.h在AC_CONFIG_HEADERS宏里面指定了,这里不需要再次指定。例如:

  • 【编写Makefile.am文件】

    三大原则:编写Makefile.am主要是完成3件事情:编译(make)、安装(make install)、打包(make dist)

    1)**原则1:**每个目录一个Makefile.am文件;同时在configure.ac的AC_CONFIG_FILES宏中指定输出所有的Makefile文件,例如:

    2)**原则2:**父目录需要包含子目录

    3)**原则3:**Makefile.am中指明当前目录如何编译

  1. 编译安装

    编译和安装的规则是绑定在一起的,通过同一条语句同时指定了编译和安装的处理方式

    具体的格式为:安装目录_编译类型=编译目标

    1.1:常用缺省的安装目录如下

    目录 Makefile.am中的变量 使用方式
    prefix /usr/local 安装目录,通过–prefix指定
    exec_prefix ${prefix} 同prefix
    bindir ${exec_prefix}/bin bin_编译类型
    libdir ${exec_prefix}/lib lib_编译类型
    includedir ${prefix}/include include_编译类型
    noinstdir noinst_编译类型,特殊的目录,表示编译目标不安装。

    自定义目录:

    在根目录下的Makefile.am中添加如下内容:

    configdir=${prefix}/config => 定义一个自定义的目录名称config,注意dir后缀是固定的

    config_DATA=config/test.ini => 使用自定义的目录config,必须要有这句,否则目录不会创建, =号后面如果有对应的文件,安装时会将对应的文件拷贝到config目录下

1.2:编译类型

​ 常见编译类型如下,没有自定义编译类型

类型 说明 使用方式
PROGRAMS 可执行程序 bin_PROGRAMS
LIBRARIES 库文件 lib_LIBRARIES
LTLIBRARIES libtool库文件 lib_LTLIBRARIES
HEADERS 头文件 include_HEADERS
SCRIPTS 脚本文件,有可执行权限 test_SCRIPTS(需要自定义test目录)
DATA 数据文件,无可执行权限 conf_DATA(需要自定义conf目录)
	**1.3:编译配置**

​ 标准的编译配置

​ _SOURCES:对应gcc命令中的源代码文件

​ _LIBADD:编译链接库时需要链接的其它库,对应gcc命令中的*.a等文件

​ _LDADD:编译链接程序时需要链接的其他库,对应gcc命令中的*.a等文件

​ _LDFLAGS:链接选项,对应gcc命令中的-L, -l, -shared, -fpic等选项

​ _LIBTOOLFLAGS:libtool编译时的选项

​ **FLAGS(例如_CFLAGS/_CXXFLAGS):编译选项,对应gcc命令中的-O2, -g, -I等选项

3、实例:

  1. 源文件:hello.c

  2. 运行autoscan得到configure.scan文件,将该文件重命名为configure.ac,编辑如下:此文件的相关内容需要根据软件和系统的环境进行配置,但是AM_INIT_AUTOMAKE宏需要自己添加,它是automake所必备的宏[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传在这里插入图片描述

  3. 执行aclocal用于扫描configure.ac文件生成aclocal.m4,告诉autoconf如何找到新的宏

  4. 执行autoheader,会生成一个config.h.in文件

  5. 执行autoconf生成configure

  6. 编写Makefile.am文件:Automake工具会根据configure.in中的参量把Makefile.am转换成Makefile.in文件

在这里插入图片描述

  1. 新建NEW,AUTHONS,README,ChangeLog文件

  2. 执行automake –add-missing或者 7,8步骤可用automake -a命令自动添加文件

  3. 执行./configure ,它将makefile.in文件生成Makefile文件

  4. 最后执行make,生成了可执行文件hello
    在这里插入图片描述

  5. make install 安装到/usr/local/lib库中

参考资料:

  1. 大型项目使用Automake/Autoconf完成编译配置
  2. Linux中的configure,make,make install
  3. linux 源码编译 ./configure 的配置和用法
  4. autoconf手册
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/138791.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号