Linux安装软件有一种方式就是通过源码安装,源码通常是一个压缩包,打开压缩包,经常会看到一个叫configure的文件,而不见makefile文件。通常我们在自己的电脑写应用的时候都是通过makefile来生成可执行的文件,但是为什么源码里面没有呢。实际上,编译器在开始工作前要知道当前的系统环境,比如安装的位置要在哪里、要依赖什么组件等等,由于每台电脑的环境不一样,可以通过configure配置文件指定编译参数。运行这个脚本就可以获知编译参数,编译器就可以灵活地实现针对你个人电脑的“私人定制”,这也是linux源码安装的一个优势。用户也可以自定义参数,比如假设我们要自定义安装目录,可以./configure  --prefix=/usr/local/apache2。又比如假如要动态库和静态库一起编译,使用./config shared --prefix=/usr/local --openssldir=/usr/local/ssl,假如我们要加入一些模块支持(如mysql),使用

./configure --prefix=/www --with-mysql

configure通常是由autoconf这个工具生成的,下载:

sudo  apt-get  install  autoconf

autoconf:只是autotools系列工具中的一个,运行之后可对configure.in脚本配置文件进行处理进而生成configure可执行文件,其他还包括了-----

aclocal:生成一个名称为aclocal.m4的用于处理本地宏定义的文件

autoscan:在给定目录以及其子目录树中检测源文件,若没有给定目录,就是在当前目录及其子目录树中检查。
autoheader:负责生成config.in文件,该工具通常从“acconfig.h”文件中复制用户附加的符号定义。
automake:它要用到的脚本配置文件是makefile.am,用户需要自己创建相应的文件,然后利用automake工具转换成makefile.in,此时运行configure自动配置设置文件就可将该.in文件生成makefile文件

网上摘取的一种图,解释了这套工具的工作流程:

运行autoscan,它会自动搜寻指定目录(默认是当前或者当前目录的子目录)的源文件,并且创建configure.scan文件

autoscan会尝试读入”configure.ac”(同configure.in的配置文件)文件,此时没有创建该配置文件,于是它会自动生成“configure.in”的原型文件“configure.scan”,该文件和源文件是在同一个目录下的,用户可以通过cat命令查看:

AC_PREREQ(2.61)
AC_INIT(hello, 1.0)
AM_INIT_AUTOMAKE(hello, 1.0)
AC_CONFIG_SRCDIR([hello.c])
AC_CONFIG_HEADER([config.h])
# Checks for programs.
AC_PROG_CC
# Checks for libraries.
# Checks for header files.
AC_CHECK_HEADERS([sys/time.h])
# Checks for typedefs, structures, and compiler characteristics.
AC_HEADER_TIME
# Checks for library functions.
AC_CHECK_FUNCS([gettimeofday])
AC_CONFIG_FILES([Makefile])
AC_OUTPUT

解释-----

AC_PREREQ:这个宏用于声明本文件要求的autoconf版本

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

AM_INIT_AUTOMAKE:automake必备的宏,使automake自动生成Makefile

AC_CONFIG_SRCDIR:检查所指定的源文件是否存在,以及源代码目录的有效性。

AC_CHECK_HEADERS:用于生产config.h文件供autoheader使用

AC_CONFIG_FILES:用于生成相应的Makefile

AC_PROG_CC:使配置脚本搜索C编译器并使用其名称定义变量CC。 Automake生成的src / Makefile.in文件使用变量CC构建hello,因此当配置从src / Makefile.in创建src / Makefile时,它将使用它找到的值定义CC。如果要求Automake创建一个使用CC的Makefile.in,但是configure.ac没有定义它,它会建议你添加一个调用AC_PROG_CC

AC_OUTPUT:是一个关闭命令,实际上产生脚本的一部分,负责创建用AC_CONFIG_HEADERS和AC_CONFIG_FILES注册的文件

AC_CHECK_FUNCS:检查C标准库中是否存在函数。 如果找到,则定义预处理器宏HAVE_ [function]。它生成一个测试程序,声明一个具有相同名称的函数,然后编译并链接它。更改函数名称中的几个字符(使测试失败)并检查config.log,当测试程序失败时,您将看到测试程序的源代码。假如缺失这个宏,会遇到下面的警告:

configure.ac: warning: missing AC_CHECK_FUNCS(gettimeofday)

这是autoscan告诉你,因为gettimeofday是一个潜在的可移植性问题,你应该有一个配置检查它。所以你需要做的是添加 AC_CHECK_FUNCS(gettimeofday) 配置.ac,重新运行autoreconf,然后装饰你的C代码 #ifdef HAVE_GETTIMEOFDAY ,这是一般的过程

AC_HEADER_TIME:这个不是必要宏,当源代码中有依赖于time.h和sys/time.h时,则定义TIME_WITH_SYS_TIME,这个宏在使用例如struct timeval和struct  tm的程序中很有用,它最好结合HAVE_SYS_TIME_H一起使用,可以使用AC_CHECK_HEADERS检查它

你的c程序就可以添加下面的一段:
#if TIME_WITH_SYS_TIME
# include <sys/time.h>
# include <time.h>
#else
# if HAVE_SYS_TIME_H
#  include <sys/time.h>
# else
#  include <time.h>
# endif
#endif

环境:ubuntu14.04

编辑一个文件,命名为hello.c

#include<stdio.h>

#include<sys/time.h>

int main(int argc,char *argv)

{

float sec;

struct timeval time;

gettimeofday(&time,NULL);

sec=time.tv_sec;

sec+=time.tv_usec/1000000.0;

printf("hello-world\n sec=%e\n",sec);

return 0;

}

执行autoscan(如果是sudo权限执行新生成的两个文件所有者和所属组都是root,不能编辑),生成两个文件:

其中autoscan.log显示一个宏被请求的信息日志

configure.scan原文件内容:

#                                               -*- Autoconf -*-

# Process this file with autoconf to produce a configure script.

AC_PREREQ([2.69])

AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])

AC_CONFIG_SRCDIR([hello.c])

AC_CONFIG_HEADERS([config.h])

# Checks for programs.

AC_PROG_CC

# Checks for libraries.

# Checks for header files.

AC_CHECK_HEADERS([sys/time.h])

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.

AC_CHECK_FUNCS([gettimeofday])

AC_OUTPUT

修改一下

红色部分改为AC_INIT(hello, 1.0)

并且在AC_CONFIG_SRCDIR([hello.c])之后加上
AM_INIT_AUTOMAKE(hello, 1.0)

AC_OUTPUT之前加上

AC_CONFIG_FILES([Makefile])

修改完后执行mv  configure.scan   configure.ac

旧版本的autoconf编译是用configure.in,但是现在推荐使用configure.ac。另外注意configure.ac中的宏最好是单独成行的,AC_INIT必须在check之前调用,而AC_OUTPUT必须在结尾调用,某些宏在运行的时候会检查一些另外宏是否已经先运行。

宏的顺序一般是这样的:

AC_INIT

测试程序

测试函数库

测试头文件

测试类型定义

测试结构

测试编译器特性

测试库函数

测试系统调用

AC_OUTPUT

该文件包含autoconf宏的调用,其实configure.ac里面的内容也可以包含shell指令

执行aclocal,此时会生成一个叫aclocal.m4的新文件(告诉autoconf如何找到新的宏)

执行autoconf或autoconf  --install

假如遇到错误:

试试:

解决:

sudo  apt-get  install   libtool

然后再autoconf

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

创建一个脚本配置文件Makefile.am

AUTOMAKE_OPTIONS=foreign

bin_PROGRAMS=hello

hello_SOURCES=hello.c

说明:AUTOMAKE_OPTIONS为设置automake的选项。GNU对自己发布的软件有严格的规范,例如必须附带许可证声明文件COPYING等,否则automake执行时会报错。automake提供了3种软件等级:foreign、gnu和gnits,默认为gnu。这里使用foreign,只检测必须的文件

bin_PROGRAMS定义要生成的可执行文件名。如果要产生多个可执行文件,每个可执行文件的文件名要用空格隔开 .对于可执行文件和静态库类型,如果只想编译,不想安装到系统中,可以用noinst_PROGRAMS代替bin_PROGRAMS,noinst_LIBRARIES代替lib_LIBRARIES。

hello_SOURCES用于定义“hello”这个可执行程序所需要的依赖文件,如果有多个,要全部列出来,用空格隔开。如果要生成多个执行程序,那么要定义多个filename_SOURCES

然后执行automake  -a,自动添加一些脚本并生成configure.in文件

如果遇到警告:

configure.ac:7: warning: AM_INIT_AUTOMAKE: two- and three-arguments forms are deprecated.  For more info, see:

configure.ac:7: http://www.gnu.org/software/automake/manual/automake.html#Modernize-AM_005fINIT_005fAUTOMAKE-invocation

configure.ac:12: installing './compile'

configure.ac:7: installing './install-sh'

configure.ac:7: installing './missing'

Makefile.am: installing './depcomp'

先到http://www.gnu.org/software/automake/manual/automake.html#Modernize-AM_005fINIT_005fAUTOMAKE-invocation 查看一下问题:

现在AM_INIT_AUTOMAKE只需要引入一个参数

一个空格分隔的automake选项列表应该应用到项目树中的每个Makefile.am,效果如同每个选项在AUTOMAKE_OPTIONS中列出。

之前使用的AM_INIT_AUTOMAKE是一种比较老旧的配置:

AM_INIT_AUTOMAKE(PACKAGE,VERSION,[NO-DEFINE])

在这种形式中,有两个必需要的参数:PACKAGE,VERSION

包和版本已经可以从autoconf的AC_INIT宏获得。但是和AC_INIT调用发生的情况不同,此时AM_INIT_AUTOMAKE调用支持包和版本参数中的shell变量扩展(否则分别为通过AC_INIT调用定义的PACKAGE_TARNAME和PACKAGE_VERSION),也就是AM_INIT_AUTOMAKE支持Makefile中引入shell指令

解决:编辑configure.ac

方法1:将AM_INIT_AUTOMAKE的参数取消

方法2:默认情况下,这个宏AC_DEFINE的PACKAGE和VERSION。这可以通过传递no-define选项来避免

AM_INIT_AUTOMAKE([no-define ...])

不过这样也不是最稳妥的,链接的文章后面提到

如果您从早期版本的Automake升级configure.ac,将包和版本参数从AM_INIT_AUTOMAKE直接移动到AC_INIT并不总是正确的,如上例所示。 AC_INIT的第一个参数应该是程序包的名称(例如“GNU Automake”),而不是您传递给AM_INIT_AUTOMAKE的tarball名称(例如“automake”)。 Autoconf尝试从软件包名称派生tarball名称,该名称应该适用于大多数但不是所有软件包名称。 (如果它不适用于你,你可以使用AC_INIT的四参数形式明确地提供tarball名称)。

然后执行./configure

它将makefile.in文件生成Makefile文件

最后执行make,生成了可执行文件hello

资料

GNU Autoconf, Automake and Libtool(http://www.shlomifish.org/lecture/Autotools/slides/

automake(http://www.gnu.org/software/automake/manual/automake.html#index-AC_005fINIT

autoconf(https://www.gnu.org/software/autoconf/manual/autoconf.html#Shell-Script-Compiler

GNU Document(http://www.delorie.com/gnu/docs/)

使用autotools生成makefile文件入门http://www.cnblogs.com/flatfoosie/archive/2010/12/21/1912946.html

Makefile学习与进阶之Makefile.am和$$(M)的意思(http://www.cnblogs.com/zmlctt/p/4161547.html

GNU  AutoMake的中文翻译(http://blog.csdn.net/brace/article/details/726168

Autoconf学习---编写configure脚本(http://www.cnblogs.com/flyfish10000/articles/1986054.html

例解autoconf和automake生成makefile文件(https://www.ibm.com/developerworks/cn/linux/l-makefile/

configure.ac(configure.in)详解(http://www.ivpeng.com/pblog/configure-ac.html

Makefile.am规则和实例详解(http://www.ivpeng.com/pblog/makefile-am.html

Technorati Tags: Lnux

Configure文件学习的更多相关文章

  1. 用python代码做configure文件

    在lua中,我一直用lua作为config文件,或者承载数据的文件 - 好处是lua本身就很好阅读,然后无需额外写解析的代码,还支持在configure文件中读环境变量,条件判断等,方便又强大! (在 ...

  2. PHP操作XML文件学习笔记

    原文:PHP操作XML文件学习笔记 XML文件属于标签语言,可以通过自定义标签存储数据,其主要作用也是作为存储数据. 对于XML的操作包括遍历,生成,修改,删除等其他类似的操作.PHP对于XML的操作 ...

  3. Python文件学习

    Python文件学习 文章 Python文件学习 open函数 基本的用法模式:file_object=open('',access_mode='r',buffering=-1) 其中access_m ...

  4. python代码制作configure文件

    在lua中,一直用lua作为config文件,或承载数据的文件 - 好处是lua本身就很好阅读,然后无需额外写解析的代码,还支持在configure文件中读环境变量,条件判断等. 在lua中通过loa ...

  5. Sphinx/Coreseek 4.1 执行 buildconf.sh 报错,无法生成configure文件

    参考的网址: http://blog.csdn.net/jcjc918/article/details/39032689 错误现象: 执行 buildconf.sh 报错,无法生成configure文 ...

  6. python第三方库——xlrd和xlwt操作Excel文件学习

    python第三方库——xlrd和xlwt操作Excel文件学习 1安装: C:\Users\Lenovo>pip install xlwtCollecting xlwt  Downloadin ...

  7. mfix添加文件后重新生成configure文件

    mfix给了一些程序接口,大部分时候只用修改现有程序即可满足要求,这种情况不用修改configure文件,但是如果添加了新文件就需要做一些修改. 我用了Jian Cai的程序尝试了一下编译,该学者在2 ...

  8. 源码安装缺少configure文件

    源代码中没有configure的软件安装方法 今天下载了一个旧版的GeoIP软件包,解压以后发现代码包中没有configure文件,现在这这里记录一下安装遇到的问题 网上大部分GeoIP下载地址已经失 ...

  9. Makefile文件学习总结

    Makefile文件相当于是一种脚本编程语言,目的是实现自动化编译.编写makefile文件的过程中可以使用变量.控制结构和函数等一般编程语言的特性. Makefile文件的组成内容.makefile ...

随机推荐

  1. Ubuntu16.04 下虚拟环境的创建与使用

    1. 虚拟环境   虚拟环境(virtual environment),顾名思义是虚拟出来的环境,通俗来讲,可以借助虚拟机,docker来理解虚拟环境,就是把一部分内容独立出来,我们把这部分独立出来的 ...

  2. C#编程之神奇程序找数

    C#编程之神奇程序找数 问题1:这个程序要找的是符合什么条件的数? 问题2:这样的数存在么?符合这一条件的最小的数是什么? 问题3:在电脑上运行这一程序,你估计多长时间才能输出第一个结果?时间精确到分 ...

  3. 【SQLSERVER】动态游标的实现

    方法1: CREATE   TABLE   #tabTmp(id   int)    INSERT   #tabTmp   EXECUTE('SELECT   id   FROM   '+@Table ...

  4. testNg-build.xml

    <?xml version="1.0" encoding="UTF-8" standalone="no"?> <proje ...

  5. 关于JEE web项目 Servlet中 “/” 的解释 ;

    1.关于"/" 可以代表web应用的根目录,也可以代表站点的根目录: 1>如果交给浏览器解析,则代表web站点的根目录,如果交给web服务器解析则代表项目的根目录: 2> ...

  6. RPM 安装oracle18c 修改字符集的方法

    1. 安装完preinstall 和 oracle 的rpm版本之后 到这个界面 rpm -ivh oracle-database-preinstall-18c-.el7.x86_64.rpm war ...

  7. js仿QQ拖拽删除

    原生js实现仿QQ拖拽删除交互,无需任何依赖. 项目演示请看这里, gitHub请移步这里. 由于源码很长,所以贴到最下面了. 效果截图如下: 核心思想呢,就是点击圆点的时候全屏覆盖个canvas,在 ...

  8. 转:机器学习中的算法(2)-支持向量机(SVM)基础

    机器学习中的算法(2)-支持向量机(SVM)基础 转:http://www.cnblogs.com/LeftNotEasy/archive/2011/05/02/basic-of-svm.html 版 ...

  9. 关于dismissViewControllerAnimated值得注意的一点(deinit)

    在使用dismissViewControllerAnimated退出当前视图的时候,理论上,该视图对象就会被清除了, 也就是说会进去当前类的析构函数deinit里面.但是有时候会发现,dismiss之 ...

  10. Udp广播的发送与接收(C#+UdpClient) 上篇

    简介: Udp广播消息用在局域网的消息传递很方便.本文使用UdpClient类在WPF下实现Udp广播收发 发送: void MainWindow_Loaded(object sender, Rout ...