configure是一个用于自动化软件构建的强大工具。使用configure,可以生成Makefile,从而自动处理各种构建任务,例如编译源代码,生成二进制文件,安装软件等。在本文中,我们将从多个方面对configure进行详细阐述,以帮助读者深入了解这个工具的作用和使用。
一、原理
configure是由GNU Autoconf软件包提供的脚本,其工作原理是通过检测系统环境中的各种软件和库的可用性,从而确定软件包可以支持哪些功能和选项。configure使用类似shell脚本的语法和一套特定的宏命令来描述系统环境和软件包选项,并生成一个Makefile和一个config.h文件,以指导软件编译和安装。
configure的一个重要特点是它可以在不同的系统环境中自适应,因此可以方便地支持多平台、多架构和多种编译器。这得益于Autoconf能够通过检测系统描述文件(如header文件、库文件、系统命令等)来获取系统环境信息,并生成适用于这个环境的Makefile和config.h。这个过程可以在开发机上完成,然后将生成的Makefile和config.h文件打包到发布版本中,以供用户在不同的目标系统上编译和安装。
configure主要由三个阶段构成:检查、配置和输出。检查阶段通过执行一系列检查宏来确认目标系统上各种软件和库的可用性;配置阶段根据检查阶段的结果,决定选择哪些软件包功能或选项,并根据用户自定义的配置参数生成Makefile和config.h;输出阶段将生成的Makefile和config.h输出到标准输出或指定文件。
二、语法
configure使用一种特殊的shell语言——M4宏语言来描述检查、配置和输出的过程。M4语言是一种基于宏替换的文本处理语言,其特点是可以通过预定义和自定义宏来完成文本替换、格式化、条件编译和动态代码生成等任务。
configure脚本中包含大量的宏定义,其中一些是Autoconf预定义的,如AC_CHECK_HEADERS、AC_CHECK_LIB等,用于检查系统环境中某些文件或库是否存在;另一些是用户可以自定义的宏,通过定义AM_CONDITIONAL、AC_ARG_ENABLE等,可以控制软件包的不同功能和选项。
下面是一个简单的configure脚本示例:
#! /bin/sh # configure script for myapp AC_INIT([myapp], [1.0], [myapp-dev@mydomain.com]) AM_INIT_AUTOMAKE AC_CHECK_HEADERS([stdio.h]) AC_CHECK_LIB([m], [sqrt]) AC_ARG_ENABLE([debug], [AS_HELP_STRING([--enable-debug], [build with debugging symbols])], [], [enable_debug=no]) if test "$enable_debug" = "yes"; then CFLAGS="$CFLAGS -g" AC_DEFINE([DEBUG], [1], [Define to enable debugging]) fi AC_OUTPUT(Makefile)
这个脚本用于为名为myapp的软件包生成Makefile。AC_INIT宏用于指定软件名、版本号和联系人;AM_INIT_AUTOMAKE则用于初始化自动安装和打包机制。AC_CHECK_HEADERS和AC_CHECK_LIB宏分别用于检查头文件和库文件的可用性。AC_ARG_ENABLE宏定义了一个选项-debug,用于在编译时开启调试信息。AC_OUTPUT宏用于输出Makefile。
三、使用
使用configure可以大大简化软件构建和安装的过程。只需要按照Autoconf的规范编写configure脚本,在软件包发布之前,运行configure脚本即可生成Makefile和config.h。然后,用户只需要在目标系统上运行“make”和“make install”命令即可完成软件的编译和安装。这个过程可以自动处理各种系统差异和目标平台的要求。
下面是一个典型的使用configure的流程:
- 编写软件代码和Makefile.am文件
- 使用Automake生成Makefile.in文件
- 编写configure.ac文件,包含必要的检查和选项宏
- 运行autoconf命令生成configure脚本
- 运行configure脚本生成Makefile和config.h文件
- 在目标系统上运行make和make install命令安装软件
注意,使用configure需要遵循GNU Autoconf的规范,包括定义AC_INIT和AM_INIT_AUTOMAKE等宏、使用AC_CHECK_HEADERS和AC_CHECK_LIB等宏检查系统环境、定义AM_CONDITIONAL和AC_ARG_ENABLE等宏控制不同功能和选项、编写Makefile.am文件等。这些规范可以在Autoconf的官方文档或网站上找到详细的说明。
四、扩展
除了基本的检查和配置功能,configure还支持许多扩展,以满足特定的需求。例如,可以使用AC_DEFINE和AC_CONFIG_FILES宏定义宏和文件,以在代码中引用它们或替换它们;使用AX_CHECK_COMPILE_FLAG和AX_CHECK_LINK_FLAG宏检查编译器选项和库链接选项;使用PKG_CHECK_MODULES宏检查外部依赖库;使用AC_MSG_CHECKING和AC_MSG_RESULT宏向用户显示检查结果等。
下面是一个示例,演示如何使用configure配置NumPy库和Cython扩展的构建:
#! /bin/sh # configure script for mymodule AC_MSG_CHECKING([numpy module]) AC_ARG_ENABLE([numpy], [AS_HELP_STRING([--enable-numpy], [build with NumPy support])], [], [enable_numpy=yes]) if test "$enable_numpy" = "yes"; then PKG_CHECK_MODULES([NUMPY], [numpy]) AC_DEFINE([HAVE_NUMPY], [1], [Enable NumPy support in C code]) AC_SUBST([NUMPY_CFLAGS]) AC_SUBST([NUMPY_LIBS]) AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi AC_MSG_CHECKING([Cython module]) AC_ARG_ENABLE([cython], [AS_HELP_STRING([--enable-cython], [build with Cython support])], [], [enable_cython=yes]) if test "$enable_cython" = "yes"; then AC_PATH_PROG([CYTHON], [cython]) if test -z "$CYTHON"; then AC_MSG_ERROR([Cython not found]) fi AC_DEFINE([HAVE_CYTHON], [1], [Enable Cython support in Python code]) AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi AC_OUTPUT(Makefile)
这个脚本用于为Python模块mymodule生成Makefile。使用PKG_CHECK_MODULES宏检查NumPy库的可用性,并定义HAVE_NUMPY宏和NUMPY_CFLAGS、NUMPY_LIBS变量;使用AC_PATH_PROG宏检查Cython命令的可用性,并定义HAVE_CYTHON宏。这样,在Python模块和Cython扩展的代码中就可以使用这些定义和变量了。
五、总结
configure是一种强大的自动化软件构建工具,可以用于生成Makefile和config.h文件,方便软件包的编译和安装。configure采用M4宏语言描述构建过程,可以自适应不同的系统环境和编译器选项。使用configure需要遵循Autoconf的规范,包括定义AC_INIT和AM_INIT_AUTOMAKE等宏、使用AC_CHECK_HEADERS和AC_CHECK_LIB等宏检查系统环境、定义AM_CONDITIONAL和AC_ARG_ENABLE等宏控制不同功能和选项、编写Makefile.am文件等。 configure还支持许多扩展,如定义宏和文件、检查编译器选项和库链接选项、检查外部依赖库、显示检查结果等。掌握configure的使用和扩展,可以大大简化软件构建和维护的工作。