configure.in文件里基本的内容就是一系列的m4宏,在运行时根据传递给它们的参数,定义的宏就会扩展为shell的脚本代码段。也可以手工书写shell代码。不过我们就不说这个了,要想完全的理解configure.in怎样写,其实是要求有一些m4的知识,还要一些 Bourneshell的知识。要这么多知识做基础好难,不过还好的的是,有省事的方法,就是可以找一个已有的configure.in文件,然后以此来修改它以适应你所要完成的任务。如果想了解可以看看autoconf手册,其中介绍了很多预先写好的宏。

下面我们就来通过一个简单的configure.ac文件,来了解一些非常常用的宏和含义:

AC_INIT(src/hello.c)

AM_CONFIG_HEADER(config.h)

AM_INIT_AUTOMAKE(GnomeHello,0.1)

AM_MAINTAINER_MODE

AM_ACLOCAL_INCLUDE(macros)

GNOME_INIT

AC_PROG_CC

AC_ISC_POSIX

AC_HEADER_STDC

AC_ARG_PROGRAM

AM_PROG_LIBTOOL

GNOME_COMPILE_WARNINGS

ALL_LINGUAS=”es”

AM_GNU_GETTEXT

AC_SUBST(CFLAGS)

AC_SUBST(CPPFLAGS)

AC_SUBST(LDFLAGS)

AC_OUTPUT([

Makefile

macros/Makefile

src/Makefile

intl/Makefile

po/Makefile.in

pixmaps/Makefile

doc/Makefile

doc/C/Makefile

doc/es/Makefile

])

下面我们逐一对例子中的代码进行一下解释,例子中以AC开头的宏来自autoconf,以AM开头的宏来自automake。可以从autoconf或 automake中寻求帮助,这一点很有用。以GNOME开头的宏来自于Gnomemacros目录。这些宏都是用m4宏语言写的。如果将 autoconf和automake安装在/usr目录下,autoconf和automake中的标准宏一般放在/usr/share/aclocal 目录下。

AC_INIT总是configure.in中的第一个宏。它扩展为许多可由其他configure脚本共享的模板文件代码。这些代码解析传到 configure中的命令行参数。这个宏的一个参数是一个文件名,这个文件应该在源代码目录中,它用于健全性检查,以保证configure脚本已正确定位源文件目录。

AM_CONFIG_HEADER指定了要创建的头文件,差不多总是config.h。创建的头文件包含由configure定义的C预处理符号。最低限度应该定义PACKAGE和VERSION符号,这样可以将应用程序名称和版本传送到代码中,而无须对它们硬编码(非公用的源文件应该包含 config.h(#include)以利用这些定义。然而,不要将config.h文件安装到系统中,因为它有可能与其他的软件包冲突)。

AM_INIT_AUTOMAKE初始化automake。传到这个宏里的参数是要编译的应用程序的名称和版本号(这些参数成为config.h中定义的PACKAGE和VERSION值)。

AM_MAINTAINER_MODE关闭缺省时仅供程序维护者使用的makefile目标,并修改以使configure能理解 –enable-maintainer-mode选项。–enable-maintainer-mode将maintaineronly目标重新打开。仅供维护者使用的makefile目标允许最终用户清除自动生成的文件,比如configure,这意味着要修复编译故障,必须安装有autoconf和automake软件。注意,因为autogen.sh脚本主要是给开发人员用的,autogen.sh会自动传递一个–enable- maintainer-mode选项给configure。

AM_ACLOCAL_INCLUDE指定一个附加的目录,用于搜索m4宏。在这里,它指定为macros子目录。在这个目录中应该有Gnome宏的拷贝。

GNOME_INIT给configure添加一个与Gnome相关的命令行参数个数,并为Gnome程序定义一些makefile变量,这些变量中包含了必要的预处理程序和链接程序标志。这些标志是由gnome-config脚本取得的。安装gnome-libs时会安装gnome- config脚本。

AC_PROG_CC定位C编译器。

AC_CHECK_LIB如果程序中加入了多线程用到的锁的话就要加入像 AC_CHECK_LIB([pthread], [main])这样的检测,这个宏的含义如下:

LIBS是link的一个选项,程序中使用了读写锁,所以要测试pthread库中是否存在pthread_rwlock_init函数。

AC_PROG_RANLIB如果是多线程的程序的话要加入这句话,要不运行automake命令时会出错。

AC_ISC_POSIX添加一些在某些平台上实现POSIX兼容需要的标志。

AC_HEADER_STDC检查当前平台上是否有标准的ANSI头文件,如果有,则定义STDC_HEADERS。

AC_ARG_PROGRAM添加一些选项到configure中,让用户能够修改安装程序的名称(如果在用户系统上碰巧有一个与要安装的程序名称相同的程序,这是很有用的)。

AM_PROG_LIBTOOL是由automake用来设置libtool的用途的。只在计划编译共享库或动态可加载模块时才需要设置这个值。

GNOME_COMPILE_WARNINGS给gcc命令行添加许多警告选项,但是在其他绝大多数的编译器上什么也不做。

ALL_LINGUAS=“es”不是一个宏,只是一句shell代码。它包含一个由空格分隔的语言种类缩写表,对应于po子目录下的.po文件。.po文件包含翻译成其他语言的文本,所以ALL_LINGUAS应该列出程序已经被翻译成的所有语言。

AM_GNU_GETTEXT由automake使用,但是这个宏会随gettext软件包发布。它让 automake执行一些与国际化相关的任务。

AC_SUBST输出一个变量到由configure生成的文件中。具体内容将在后面说明。

AC_OUTPUT列出由configure脚本创建的文件。这些文件都是由带.in后缀的同名文件生成的。例如,src/Makefile是由src/Makefile.in生成的,config.h是由config.h.in生成的。在执行AC_OUTPUT宏时,configure脚本处理包含有两个@符号标志的变量(例如@PACKAGE@)的文件。只有用AC_SUBST输出了变量,它才能识别这些变量(许多在上面讨论过的预先写好的宏都用AC_SUBST定义变量)。这些特征用于将一个Makefile.in文件转换成一个Makefile文件。典型情况下,Makefile.in 是由automake从Makefile.am(了解更多Makefile.am的写法请阅读《Makefile.am 规则和实例详解》)生成的(不过,你可以只用autoconf,而不用automake,自己编写一个 Makefile.in)。

上面例子中提到的宏都是基本配置和常用的,还有一些可以用到的宏大家有兴趣的话可以学习收集下,不过基本上上面所说的已经可以完成一次配置,不过这里写的一些配置大多数是收集于网络,希望大家和鹏博客共同学习提高,有不对的地方希望大家能之出,希望大家能支持。

作者:id被吃
链接:https://www.jianshu.com/p/befa2fc2420c
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

configure.in详解的更多相关文章

  1. PHP编译参数configure配置详解(持续更新中)

    编译参数-使用 ./configure -h在源代码目录中,该命令可以查看所有编译参数以及对应的英文解释 编译参数-说明 --prefix=/opt/php //指定 php 安装目录--with-a ...

  2. nginx编译安装之-./configure 参数详解

    参考官方文档 http://nginx.org/en/docs/configure.html --with开头的,默认是禁用的(没启动的,想使用的话需要在编译的时候加上) --without开头的,默 ...

  3. Linux中./configure、make、make install详解

     ./configure && make && make install详解 2010-08-03 23:30:05 标签:休闲 ./configure &&a ...

  4. [转载]Linux 命令详解:./configure、make、make install 命令

    [转载]Linux 命令详解:./configure.make.make install 命令 来源:https://www.cnblogs.com/tinywan/p/7230039.html 这些 ...

  5. linux ./configure 的参数详解

    转载自http://blog.csdn.net/zjt289198457/article/details/6918656 linux ./configure 的参数详解   ./configure 该 ...

  6. Node.js npm 详解

    一.npm简介 安装npm请阅读我之前的文章Hello Node中npm安装那一部分,不过只介绍了linux平台,如果是其它平台,有前辈写了更加详细的介绍. npm的全称:Node Package M ...

  7. org.apache.log4j.Logger详解

    org.apache.log4j.Logger 详解 1. 概述 1.1. 背景 在应用程序中添加日志记录总的来说基于三个目的 :监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析工 ...

  8. Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解

    转载:http://freeloda.blog.51cto.com/2033581/1288553 大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负 ...

  9. coreseek 安装及使用方法详解

    coreseek 安装及使用 一般站点都需要搜索功能,如果是php+mysql站点,建议选择coreseek,如果是java站点建议使用lucene,coreseek 是一款很好的中文全文检索/搜索软 ...

随机推荐

  1. C# 解决读取dbf文件,提示Microsoft Jet 数据库引擎找不到对象的问题

    前言 最新项目需要经常和dbf文件打交道,在实际场景中很多软件需要和一些老的系统进行数据交互,而这些系统都在使用foxpro数据库,读取dbf文件一般都是分为两种情况:第一:安装foxpro的驱动进行 ...

  2. sencha touch/Ext Js 6 + 自定义扩展的用法

    app.js中加入以下代码 //指定ux起调目录 Ext.Loader.setPath({ 'ux': 'app/ux' }); 在app目录中创建一个ux文件夹 假如我们使用这个扩展,扩展地址:ht ...

  3. spark on yarn 无法提交任务问题

    java.lang.NoClassDefFoundError: com/sun/jersey/api/client/config/ClientConfig spark任务提交出错. 原因: spark ...

  4. go语言字符串处理

    string包:            查找字串是否在指定的字符串中:strings.Contains("seafood", "foo")//true      ...

  5. day10 十 函数、形参和实参

    一.形参和实参 1.形参:在函数定义()中出现的参数形参就是拷贝实参的值,随着函数的调用才产生,随着函数调用结束而销毁 def fn(a, b, c): print(a) print(b) print ...

  6. 初学的linux命令行

    这几条命令是今天刚初学的,以前总看别人输入命令,好利落,到自己了,真心觉得难.目前就学了这几个命令.后期等学会了,再进行添加 vm 文件名 ——> 新建文件: :wq  ——>  保存并退 ...

  7. [No0000FC]C# 预处理器指令

    预处理器指令指导编译器在实际编译开始之前对信息进行预处理. 所有的预处理器指令都是以 # 开始.且在一行上,只有空白字符可以出现在预处理器指令之前.预处理器指令不是语句,所以它们不以分号(;)结束. ...

  8. [No0000D4]批处理全部代码详解Allbat

    COPY REM Copies one or more files from one location to another. REM [/d] - Allows the encrypted file ...

  9. tensorflow的ckpt文件总结

    1.TensorFlow的模型文件 --checkpoint_dir | |--checkpoint | |--MyModel.meta | |--MyModel.data-00000-of-0000 ...

  10. Transfrom笔记

    1.在不是以左上角为缩放点进行缩放时,其实比例不能为0,因为0将导致缩放可能出现动画效果不可控,务必选取0.1等较小值来变化