阅读时长:6分钟
介绍
我们在linux上安装软件时,常常会使用如下命令
1
2
3
./configure
make
make install
这种命令是如何工作的呢?
这种命令有哪些作用?
linux上使用源码编译安装软件一般有如下三步
配置软件(Configurethesoftware)
configure脚本负责完成在指定系统上建立软件的打算工作,它确保后续的建立和安装过程中所有须要的依赖可以使用,但是找出使用这种依赖所需的任何信息。
Unix/Linux程序常常使用C语言编撰,所以我们常常须要C编译器来建立这种程序。在这个场景下,configure脚本会确保你的系统中确实存在一个C编译器,但是找到这个C编译器的名子和位置。
建立软件(Buildthesoftware)
一旦configure命令执行完成,我们可以调用make命令来建立软件。这个步骤会执行定义在Makefile文件中的一系列任务来将软件从源码建立为最终可执行程序。
你下载的软件源码tar包一般不包含最终的Makefile文件,而是包含名为Makefile.in的模板文件。之后借助configure脚本针对当前的系统借助Makefile.in文件生成的多样化的Makefile文件。
安装软件(Installthesoftware)
现今软件早已建立完成,可以运行了,相关文件可以被拷贝到它们的最终目录。makeinstall命令会将打造出的可执行文件和它的依赖库、文档拷贝到正确的位置。
这一般意味着软件的二补码文件会被拷贝到你的PATH路径下,软件的操作指南会被拷贝到你的MANPATH路径下,同时软件依赖的其他文件也会被安全地保存到相应的位置。
由于安装步骤也是定义在Makefile文件中,所以软件的安装位置可以通过某个参数传递给configure脚本qq linux,或则由configure脚本借助某个系统变量来实现指定安装位置。
按照软件的安装位置,您可能须要升级此步骤的权限,便于可以将文件复制到系统目录。使用sudo一般可以达到目的。
这种脚本是怎样形成的?
上述步骤之所以能成功工作,是由于configure脚本会检测你的系统,并使用它找到的信息将Makefile.in模板转换为Makefile文件,而且configure脚本和Makefile.in模板是如何形成的呢?
假如你当初打开过configure脚本,或则相关的Makefile.in文件,你会发觉这种文件里包含几千行的脚本句子。有时侯那些支持配置的脚本句子比要安装的程序的源代码还要长。
虽然借助已有的configure脚本文件开始编撰,自动编撰完成一个configure脚本也是十分繁重的。不过不用担忧:这种脚本不是手工打造的。
以这些方法建立的软件一般使用一个称作autotools的工具集进行打包。这个工具集包含autoconf、automake等工具,所有的这种工具致使维护软件生命周期显得很容易。最终用户不须要了解这种工具,同时让软件在不同的Unix/Linux系统的安装步骤显得简单。
HelloWorld案例
我们以一个简单的HelloWorldC语言程序为例,来瞧瞧怎样使用autotools工具集打包。
下边是程序源代码,在一个名为main.c的文件中
1
2
3
4
5
6
7
#include
int main(int argc, char* argv[])
{
printf("Hello Worldn");
return 0;
}
创建configure脚本
不须要自动编撰configure脚本,我们须要创建一个使用m4sh语言(m4宏命令和POSIXshell脚本的组合)编撰的configure.ac文件来描述configure脚本须要做的事情。
我们须要第一个调用的m4宏为AC_INIT,它会初始化autoconf而且设置一些关于打包软件的基本信息。我们的软件名为helloworld,版本为0.1,维护者为:
1
AC_INIT([helloworld], [0.1], [george@thoughtbot.com])
这个项目中我们会使用automake,所以我们须要使用AM_INIT_AUTOMAKE宏命令来初始化automake
1
AM_INIT_AUTOMAKE
下边,我们须要告诉autoconf让configure脚本须要寻觅的相关依赖,在本例中,configure脚本仅须要使用C编译器,我们可以使用AC_PROG_CC宏命令设置。
1
AC_PROG_CC
假如有其他的依赖项,那我们可以使用其他的m4宏命令来设置,如使用AC_PATH_PROG宏表示在用户的PATH路径中搜索一个特定的程序。
此时我们早已列举了使用的依赖,上面有提及,configure脚本会依据用户系统的系统信息和Makefile.in模板文件生成Makefile文件。
下边一行使用AC_CONFIG_FILES宏命令告诉autoconf工具configure脚本文件须要做这种工作:configure脚本文件须要找到一个名为Makefile.in的文件,将文件内的站位符使用对应的值替换,比如将@PACKAGE_VERSION@替换为0.1,之后将结果写入到Makefile文件。
1
AC_CONFIG_FILES([Makefile])
最后,当我们告诉autoconf工具所有configure脚本须要做的工作后,可以调用AC_OUTPUT宏命令输出脚本内容
1
AC_OUTPUT
下边是configure.ac中的所有代码,相比4737行的configure脚本文件,这种代码很多了。
1
2
3
4
5
AC_INIT([helloworld], [0.1], [george@thoughtbot.com])
AM_INIT_AUTOMAKE
AC_PROG_CC
AC_CONFIG_FILES([Makefile])
AC_OUTPUT
还差一点我们就可以发布软件了,configure脚本须要一个Makefile.in文件,将系统相关信息填充进去后,生成最终的Makefile文件。
创建Makefile文件
与configure脚本文件相比,Makefile.in模板文件特别长且复杂。为此,我们不是手工编撰,而是编撰一个较短的Makefile.am文件,之后借助automake使用该文件为我们生成Makefile.in文件。
首先,我们须要设置一些参数来告诉automake工具本项目的结构,由于这儿的反例不是标准的GNU项目的结构,所以结构申明为foreign。
1
AUTOMAKE_OPTIONS = foreign
接出来告诉automake我们希望Makefile编译的软件名为helloworld:
1
bin_PROGRAMS = helloworld
这行包含了好多打包信息,谢谢automake的统一命名规则
PROGRAMS后缀成为primary主要信息linux系统安装,它告诉automake工具helloworld文件具有什么属性。诸如PROGRAMS须要被编译,相比SCRIPTS和DATA文件不须要被编译。
bin前缀告诉automake工具,这儿列举的文件应当被安装到bindir变量指定的路径下。autotools工具还为我们定义了其他目录linux 安装configure,包括bindir,libdir,pkglibdir,我们也可以自定义自己须要的目录。
假如我们的程序有一部份是Ruby脚本,我们可以定义rubydir变量但是告诉automake安装我们的ruby文件到该路径。
1
2
rubydir = $(datadir)/ruby
ruby_DATA = my_script.rb my_other_script.rb
可以在安装目录之前添加其他前缀,以进一步分辨automake的行为。
由于我们早已定义了RPOGRAM,我们须要告诉automake在那里可以找到它的源文件。在这些情况下,前缀是那些源文件建立的程序的名称linux 安装configure,而不是它们将安装的位置:
1
helloworld_SOURCES = main.c
这是我们的helloworld程序的整个Makefile.am文件。与configure.ac和configure脚本一样,它比它生成的Makefile.in要短得多:
1
2
3
AUTOMAKE_OPTIONS = foreign
bin_PROGRAMS = helloworld
helloworld_SOURCES = main.c
把它们置于一起
如今我们早已编撰了配置文件,我们可以运行autotools并生成完成的configure脚本和Makefile.in模板。
首先,我们须要生成一个m4环境供autotools使用:
1
aclocal
如今我们可以运行autoconf将configure.ac转换为configure脚本,并运行automake将Makefile.am转换为Makefile.in`:
1
2
autoconf
automake --add-missing
分发程序
最终用户不须要查看我们的autotools工具的设置,因而我们可以分发configure脚本和Makefile.in,而无需分发用于生成它们的所有文件。
辛运的是,autotools工具也将帮助我们进行分发。Makefile包含各类有趣的目标,包括建立项目tarball的目标,其中包含我们须要分发的所有文件:
1
2
./configure
make dist
您甚至可以测试分发tarball是否可以在各类条件下安装:
1
make distcheck
总览
如今我们晓得编译安装命令从何而至以及它是怎样运作的!
在维护者的系统上:
1
2
3
4
5
aclocal # Set up an m4 environment
autoconf # Generate configure from configure.ac
automake --add-missing # Generate Makefile.in from Makefile.am
./configure # Generate Makefile from Makefile.in
make distcheck # Use Makefile to build and test a tarball to distribute
在最终用户的系统上:
1
2
3
./configure # Generate Makefile from Makefile.in
make # Use Makefile to build the program
make install # Use Makefile to install the program
参考:
linux
LicensedunderCCBY-NC-SA4.0
文章评论