Linux程序源码编译安装的configure配置详解

Linux环境下,如果通过源代码编译安装程序的简单过程可以描述为:./configure–>make–>make install。其中./configure配置脚本功能就是对你的系统做很多的测试,以用来检测出你的安装平台的目标特征,比如它会检测你是不是有CC或GCC,它是个shell脚本,是autoconf的工具的基本应用,它会产生一个输出文件"./Makefiles",接下来make程序通过该文件来实现编译。

configure脚本有大量的命令行选项,对不同的软件包来说,这些选项可能会有变化,但是许多基本的选项是不会改变的。configure脚本位于待安装程序源码根目录下面,会有一个configure可执行文件,使用’./configure --help’命令就可以看到可用的所有选项,尽管许多选项是很少用到的,但是当你为了特殊的需求而configure一个包时,知道他们的存在是很有益处的。下面对每一个选项进行简略的介绍。

configure脚本选项的配置内容基本上分成9块内容,分别是:

  1. 配置区【Configuration】

  2. 程序安装目录区【Installation directories】

  3. 程序名称区【Program names】

  4. 系统类型区【System types】

  5. 可选特性区【Optional Features】

  6. 可选安装包区【Optional Packages】

  7. 影响安装的环境变量区【Some influential environment variables】

  8. 其他信息


  1. configuration

这块内容主要是对./configure脚本本身运行的过程进行配置,如是否显示运行结果给用户,是否创建cache文件啊。由于这些选项都比较简单,就不翻译了。

-h, --help display this help and exit

  --help=short        display options specific to this package

  --help=recursive    display the short help of all the included packages

-V, --version display version information and exit

-q, --quiet, --silent do not print `checking…’ messages

  --cache-file=FILE  cache test results in FILE [disabled]

-C, --config-cache alias for `–cache-file=config.cache’

-n, --no-create do not create output files

  --srcdir=DIR        find the sources in DIR [configure dir or `..']

其中重点解释下:

–cache-file=FILE

'configure’会在你的系统上测试存在的特性(或者bug!),为了加速随后进行的配置,测试的结果会存储在一个cache file里,尤其当configure一个复杂的源码树时,一个很好的cache file的存在会对性能有很大帮助。

–no-create

'configure’中的一个主要函数会制作输出文件(./Makefile),此选项阻止’configure’生成这个文件,你可以认为这是一种演习(dry run),尽管缓存(cache)仍然被改写了。

  1. Installation directories

这个区块是./configure脚本中经常被配置的选项区,这里的主要作用就是配置你要安装的软件的安装后的目录,默认情况下(用户没有主动配置),./configure会将软件安装在/usr/local/bin/和/usr/local/lib/等目录下面。

先介绍两个重要的选项:([]这个里面的内容是该选项的默认值的意思)

–prefix=PREFIX install architecture-independent files in PREFIX [/usr/local]

–exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX]

即如果你想指定2你安装的程序的具体目录,就用这2个选项,他们之间的区别就只有是否平台相关性。通过指定这2个选项后,你的程序就完全的被安装在你指定的目录下面了,此时以后删除该程序,只需要简单的移除该目录下所有内容就可以了。

当然,如果你想进一步指定软件安装后的具体目录(如可执行文件的目录,共享库的目录等),你可以使用如下选项来配置:

–bindir=DIR user executables [EPREFIX/bin]

–sbindir=DIR system admin executables [EPREFIX/sbin]

–libexecdir=DIR program executables [EPREFIX/libexec]

–sysconfdir=DIR read-only single-machine data [PREFIX/etc]

–sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]

–localstatedir=DIR modifiable single-machine data [PREFIX/var]

–libdir=DIR object code libraries [EPREFIX/lib]

–includedir=DIR C header files [PREFIX/include]

–oldincludedir=DIR C header files for non-gcc [/usr/include]

–datarootdir=DIR read-only arch.-independent data root [PREFIX/share]

–datadir=DIR read-only architecture-independent data [DATAROOTDIR]

–infodir=DIR info documentation [DATAROOTDIR/info]

–localedir=DIR locale-dependent data [DATAROOTDIR/locale]

–mandir=DIR man documentation [DATAROOTDIR/man]

–docdir=DIR documentation root [DATAROOTDIR/doc/mysql]

–htmldir=DIR html documentation [DOCDIR]

–dvidir=DIR dvi documentation [DOCDIR]

–pdfdir=DIR pdf documentation [DOCDIR]

–psdir=DIR ps documentation [DOCDIR]

  1. Program names

如果你想改变安装后程序的名称,如你安装qq程序,但是你不想称呼它为“qq“,而想叫它为“360”,那么可以通过下面这些选项来配置了。

–program-prefix=PREFIX prepend PREFIX to installed program names

–program-suffix=SUFFIX append SUFFIX to installed program names

–program-transform-name=PROGRAM run sed PROGRAM on installed program names

  1. System types

一个程序开发完成以后,对源代码进行编译,将编译后的文件发布出去形成所谓的各个平台的安装版本(非开源的都是这么干的,开源的也可以这样编译后不同运行平台的编译版本),这就是所谓的交叉编译。下面介绍有关这平台相关性的选项。

–build=BUILD configure for building on BUILD [guessed]

–host=HOST cross-compile to build programs to run on HOST [BUILD]

–target=TARGET configure for building compilers for TARGET [HOST]

通过–build选项来指定执行代码编译工作的主机,通常该值默认是cofig.guess(该shell脚本和./configure在同一目录)来猜即可(一般就是你执行编译操作的主机),当然你也可以通过这个选项指定具体的值。

编译的程序在什么机器上运行是由–host选项指定的,其默认值都是–build,当两者不一样的时候就是所谓的交叉编译。

–target选项用来配置编译工具,它只有在建立交叉编译环境的时候用到,正常编译和交叉编译都不会用到。他用–build主机上的编译器,编译一个新的编译器(binutils, gcc,gdb等),这个新的编译器将来编译出来的其他程序将运行在target指定的系统上。
5. Optional Features

当你想在./configure时使用某个特性的时候,可以来配置该区块中的选项值,它主要分为disable和enable两大类,具体有哪些特性可以用过“./configure --help“来查询。下面主要来总的介绍下这2类配置。

–disable-FEATURE

当你想禁用某个FEATURE的时候可以使用它(尤其是某些软件可能默认开启某些特性,而实际上你是不需要的),例如:$ ./configure --disable-gui

-enable-FEATURE[=ARGUMENT]

相反的,一些软件包可能提供了一些默认被禁止的特性,这时你可以使用“–enable-FEATURE“来起用它,一个特性可能会接受一个可选的参数值。例如:$ ./configure --enable-buffers=128

`–enable-FEATURE=no’与上面提到的’–disable-FEATURE’是同义的

  1. Optional Packages

软件的包安装的时候,可能会存在依赖。加上a软件依赖于b软件,那么在安装a软件的时候,必须要先安装b软件,而此时b软件偏偏不在系统的默认查询目录(即系统无法查询到,或者你不想使用系统默认的b软件而想使用你自己安装的b软件(整个系统有2个b软件)),你就可用通过with选项来指定具体的软件包地址,通过without选项来指定不使用指定的软件包。

–with-PACKAGE[=ARGUMENT]

–without-PACKAGE

‘–with-PACKAGE=no’与下面将提到的’–without-PACKAGE’是同义的.

例如:

$ ./configure --with-tcl=/usr/local --with-tk=/usr/local

$ ./configure --without-gnu-ld

关于这些这个选项区块,有些软件会有类似下面2个比较特殊的选项。

–x-includes=DIR

这个选项是’–with-PACKAGE’选项的一个特例,它提供了向’configure’脚本指明包含X11头文件的目录的方法。

–x-libraries=DIR

类似的,’–x-libraries’选项提供了向’configure’脚本指明包含X11库的目录的方法。

关于第5/6两块,和具体程序的相关性就比较高了,很多程序的不同配置都可以在这里面指定。

  1. Some influential environment variables

这块主要是影响编译器的编译环境变量。

最后一个问题,一个软件包通过编译源代码安装后,如何完全的卸载呢?

如果原先的source还在的话,很多source的Makefile都有写uninstall规则,直接在Souce里make uninstall(make install & make clean)就可行,不过如果碰到无良作者没写的,那一句一句看Makefile里install部分他都干了些什么,然后挨个删除。如果source没了,那就悲剧了。
'configure’脚本有大量的命令行选项。
下面对每一个选项进行简略的介绍:

–cache-file=FILE

‘configure’ 会在你的系统上测试存在的特性(或者bug!)。为了加速随后进行的配置,测试的结果会存储在一个cache file里。当configure一个每个子树里都有’configure’脚本的复杂的源码树时,一个很好的cache file的存在会有很大帮助。

–no-create

'configure’中的一个主要函数会制作输出文件。此选项阻止’configure’生成这个文件。你可以认为这是一种演习(dry run),尽管缓存(cache)仍然被改写了。

–quiet

–silent

当 'configure’进行他的测试时,会输出简要的信息来告诉用户正在作什么。这样作是因为’configure’可能会比较慢,没有这种输出的话用户将会被扔在一旁疑惑正在发生什么,使用这两个选项中的任何一个都会把你扔到一旁。(译注:这两句话比较有意思,原文是这样的:If there was no such output, the user would be left wondering what is happening. By using this option, you too can be left wondering!)

–prefix=PEWFIX
'–prefix’是最常用的选项。制作出的’Makefile’会查看随此选项传递的参数,当一个包在安装时可以彻底的重新安置他的结构独立部分。举一个例子,当安装一个包,例如说Emacs,下面的命令将会使Emacs Lisp file被安装到"/opt/gnu/share":
$ ./configure --prefix=/opt/gnu
很多的选项,个人认为,你可以忽略其他的一切,但请把—prefix加上。这里以安装supersparrow-0.0.0为例,我们打算把它安装到目录 /usr/local/supersparrow,于是在supersparrow-0.0.0目录执行带选项的脚本./configure --prefix=/usr/local/supersparrow,执行成功后再编译、安装(make,make install);安装完成将自动生成目录supersparrow,而且该软件所有的文件都被复制到这个目录。为什么要指定这个安装目录?是为了以后的维护方便,如果没有用这个选项,安装过程结束后,该软件所需的软件被复制到不同的系统目录下,很难弄清楚到底复制了那些文件、都复制到哪里去了—基本上是一塌糊涂。

用了—prefix选项的另一个好处是卸载软件或移植软件。当某个安装的软件不再需要时,只须简单的删除该安装目录,就可以把软件卸载得干干净净;移植软件只需拷贝整个目录到另外一个机器即可(相同的操作系统)。

一个小选项有这么方便的作用,建议在实际工作中多多使用

不指定prefix,则可执行文件默认放在/usr/local/bin,库文件默认放在/usr/local/lib,配置文件默认放在 /usr/local/etc。其它的资源文件放在/usr/local/share。你要卸载这个程序,要么在原来的make目录下用一次make uninstall(前提是make文件指定过uninstall),要么去上述目录里面把相关的文件一个个手工删掉。
指定prefix,直接删掉一个文件夹就够了。

–exec-prefix=EPREFIX
与’–prefix’选项类似,但是他是用来设置结构倚赖的文件的安装位置,编译好的’emacs’二进制文件就是这样一个问件。如果没有设置这个选项的话,默认使用的选项值将被设为和’–prefix’选项值一样。

–bindir=DIR
指定二进制文件的安装位置,这里的二进制文件定义为可以被用户直接执行的程序。

–sbindir=DIR
指定超级二进制文件的安装位置。这是一些通常只能由超级用户执行的程序。

–libexecdir=DIR
指定可执行支持文件的安装位置。与二进制文件相反,这些文件从来不直接由用户执行,但是可以被上面提到的二进制文件所执行。

–datadir=DIR
指定通用数据文件的安装位置。

–sysconfdir=DIR
指定在单个机器上使用的只读数据的安装位置。

–sharedstatedir=DIR
指定可以在多个机器上共享的可写数据的安装位置。

–localstatedir=DIR
指定只能单机使用的可写数据的安装位置。

–libdir=DIR
指定库文件的安装位置。

–includedir=DIR
指定C头文件的安装位置。其他语言如C++的头文件也可以使用此选项。

–oldincludedir=DIR
指定为除GCC外编译器安装的C头文件的安装位置。

–infodir=DIR
指定Info格式文档的安装位置.Info是被GNU工程所使用的文档格式。

–mandir=DIR

指定手册页的安装位置。

–srcdir=DIR

这个选项对安装没有作用,他会告诉’configure’源码的位置。一般来说不用指定此选项,因为’configure’脚本一般和源码文件在同一个目录下。

–program-prefix=PREFIX

指定将被加到所安装程序的名字上的前缀。例如,使用’–program-prefix=g’来configure一个名为’tar’的程序将会使安装的程序被命名为’gtar’。当和其他的安装选项一起使用时,这个选项只有当他被`Makefile.in’文件使用时才会工作。

–program-suffix=SUFFIX
指定将被加到所安装程序的名字上的后缀。

–program-transform-name=PROGRAM

这里的PROGRAM是一个sed脚本。当一个程序被安装时,他的名字将经过`sed -e PROGRAM’来产生安装的名字。

–build=BUILD
指定软件包安装的系统平台。如果没有指定,默认值将是’–host’选项的值。

–host=HOST
指定软件运行的系统平台。如果没有指定。将会运行`config.guess’来检测。

–target=GARGET
指定软件面向(target to)的系统平台。这主要在程序语言工具如编译器和汇编器上下文中起作用。如果没有指定,默认将使用’–host’选项的值。

–disable-FEATURE
一些软件包可以选择这个选项来提供为大型选项的编译时配置,例如使用Kerberos认证系统或者一个实验性的编译器最优配置。如果默认是提供这些特性,可以使用’–disable-FEATURE’来禁用它,这里’FEATURE’是特性的名字,例如:

$ ./configure --disable-gui

-enable-FEATURE[=ARG]

相反的,一些软件包可能提供了一些默认被禁止的特性,可以使用’–enable-FEATURE’来起用它。这里’FEATURE’是特性的名字。一个特性可能会接受一个可选的参数。例如:

$ ./configure --enable-buffers=128

`–enable-FEATURE=no’与上面提到的’–disable-FEATURE’是同义的。

–with-PACKAGE[=ARG]

在自由软件社区里,有使用已有软件包和库的优秀传统。当用’configure’来配置一个源码树时,可以提供其他已经安装的软件包的信息。例如,倚赖于 Tcl和Tk的BLT器件工具包。要配置BLT,可能需要给’configure’提供一些关于我们把Tcl和Tk装的何处的信息:

$ ./configure --with-tcl=/usr/local --with-tk=/usr/local

‘–with-PACKAGE=no’与下面将提到的’–without-PACKAGE’是同义的。

–without-PACKAGE

有时候你可能不想让你的软件包与系统已有的软件包交互。例如,你可能不想让你的新编译器使用GNU ld。通过使用这个选项可以做到这一点:

$ ./configure --without-gnu-ld

–x-includes=DIR

这个选项是’–with-PACKAGE’选项的一个特例。在Autoconf最初被开发出来时,流行使用’configure’来作为 Imake的一个变通方法来制作运行于X的软件。’–x-includes’选项提供了向’configure’脚本指明包含X11头文件的目录的方法。

–x-libraries=DIR

类似的,’–x-libraries’选项提供了向’configure’脚本指明包含X11库的目录的方法。

在源码树中运行’configure’是不必要的同时也是不好的。一个由’configure’产生的良好的’Makefile’可以构筑源码属于另一棵树的软件包。在一个独立于源码的树中构筑派生的文件的好处是很明显的:派生的文件,如目标文件,会凌乱的散布于源码树。这也使在另一个不同的系统或用不同的配置选项构筑同样的目标文件非常困难。建议使用三棵树:一棵源码树(source tree),一棵构筑树(build tree),一棵安装树(install tree)。这里有一个很接近的例子,是使用这种方法来构筑GNU malloc包:

$ gtar zxf mmalloc-1.0.tar.gz
$ mkdir build && cd build
$ …/mmalloc-1.0/configure

creating cache ./config.cache
checking for gcc… gcc
checking whether the C compiler (gcc ) works… yes
checking whether the C compiler (gcc ) is a cross-compiler… no
checking whether we are using GNU C… yes
checking whether gcc accepts -g… yes
checking for a BSD compatible install… /usr/bin/install -c
checking host system type… i586-pc-linux-gnu
checking build system type… i586-pc-linux-gnu
checking for ar… ar
checking for ranlib… ranlib
checking how to run the C preprocessor… gcc -E
checking for unistd.h… yes
checking for getpagesize… yes
checking for working mmap… yes
checking for limits.h… yes
checking for stddef.h… yes
updating cache …/config.cache
creating ./config.status

这样这棵构筑树就被配置了,下面可以继续构筑和安装这个包到默认的位置’/usr/local’:

$ make all && make install

你可能感兴趣的:(希望能帮自己记住,linux)