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. A - 小孩报数问题

    有N个小孩围成一圈,给他们从1开始依次编号,现指定从第W个开始报数,报到第S个时,该小孩出列,然后从下一个小孩开始报数,仍是报到S个出列,如此重复下去,直到所有的小孩都出列(总人数不足S个时将循环报数 ...

  2. python 多返回值

    多返回值: def count(): fs = [] for i in range(1, 4): def f(j): def g(): return j*j return g fs.append(f( ...

  3. python-and和 or用法

    python中的逻辑运算 and和or执行逻辑运算,但是它们不会返回bool值,而是返回它们进行比较的值之一 and >>> 1 and 2 取2 >>>1 and ...

  4. AtCoder Beginner Contest 070|Elena|8.12|#471

    打了场beginner的AtCoder,也是我第一次打AtCoder,虽然AK了,但是由于手速慢+撒比,才#471… 比赛链接:https://beta.atcoder.jp/contests/abc ...

  5. LeetCode_7.Reverse Integer

    问题 Given a 32-bit signed integer, reverse digits of an integer. Example 1: Input: 123 Output: 321 Ex ...

  6. shell脚本之通过发送带\n字符串或expect脚本实现交互输入自动化

    编写shell脚本难免遇到需要交互式输入指令的步骤: 方法一: # cat action.sh #!/bin/sh read -p "enter number:" no; read ...

  7. xcode工程编译错误:一般错误总结

    1.Apple LLVM 8.0 Error Group /’all-product-headers.yaml’ not found 最近升级了xcode打包后出现了个BUG,记录解决的方法. 现象: ...

  8. Python不使用int()函数把字符串转换为数字

    Python不使用int()函数把字符串转换为数字 2018年05月21日 14:18:45 边缘ob边缘ob 阅读数:1035 https://blog.csdn.net/qq_33192555/a ...

  9. 转:AOP与JAVA动态代理

    原文链接:AOP与JAVA动态代理 1.AOP的各种实现 AOP就是面向切面编程,我们可以从以下几个层面来实现AOP 在编译期修改源代码 在运行期字节码加载前修改字节码 在运行期字节码加载后动态创建代 ...

  10. Oracle shrink table

    shrink必须开启行迁移功能. alter table table_name enable row movement ; 在oracle中可以使用alter table table_name shr ...