浅析 ./configure; make; make install

00 intro

大意翻译自:http://tldp.org/LDP/LG/current/smith.html,并参考wikipedia make 词条
在*nix系统中,我们经常会用到configure; make; make install 这三步来安装程序。可悲的是,很多计算机使用者,甚至部分码农(比如我- - )并不知道这些操作的意义。我们更喜欢双击一个安装包来安装,比如pkg 比如exe... 但是作为*nix使用者,原理还是科普一下比较好。

01 make

configure相对另外两个步骤来说比较新,反正这三步有明确的独立的目的。我们先来解释make。make,暂且把它翻译成编译。make这一模块内置于历代Unix中。这一模块被设计用来减轻程序员的工作量。有一个很好的说法是,这一举措减少了程序员需要记录(document)的东西。这个想法是:让我们建立起一套规则,用一种更码农友好的方式来把源代码生成可执行的程序。make模块有一套内置的规则,然而开发者也可以自己制定一些规则,并且保存在自己的文件目录里-----这就是makefile。经过编译,会生成对应的.o 文件。具体的生成规则同样可以在makefile里自定义。
假如你在目录里输入make love 然后make 模块会在目录里寻找对应的makefile 即这里的love。如果不提供对应的makefile,那系统就会用它内置的规则进行编译。大多数linux系统下的原文件都是用c写的,所以一般makefile是一个.c 文件。make的过程会检查是否存在应有的.o文件,如果然后查看时间戳这是不是最新的.o文件。如果不存在这个文件,或者不是最新的,那就重新make。make之所以被广泛应用的一个原因就是它支持多种语言,如果源文件是.c 拿它就会用gcc 来编译,如果是其他语言就会选择对应的编译器。
嗯 有这么一个古老的unix段子:
The old UNIX joke, by the way, is what early versions of make said when it could not find the necessary files. In the example above, if there was no love.o, love.c or any other source format, the program would have said:
make: don't know how to make love. Stop.
回到正题,如果我们打开一个makefile的话,可以看到里面主要是对于make模块其中的一些变量进行赋值,指明编译器的路径,程序的版本号。
//这个是maxima的makefile.in
屏幕快照-2015-02-08-下午2.48.02

10 configure

对于不同的系统,各个语言编译器的路径不同;有人可能用ZSH而不是Bash作为shell;程序需要知道主机的名字;可能有些用dbm库,还得知道系统有没有gdbm 或者 ndbm 以及一系列这样的事情。开发者原来需要在makefile里进行这一系列的配置。开发者需要有一张完备的关于不同环境的细节的表格。
随着日益增多的软件和符合POSIX平台(POSIX-compliant platform)的出现。要维护这张表格的成本上升。(没错就是为了偷个懒~)于是乎,configure 应运而生,这是一个shell脚本。通俗来说,configure读取系统环境,并且给makefile提供指导,或者生成适合本机的makefile。

11 make install

make install 可以理解为把一个可执行文件(install)添加到 /usr/local/ 路径中

Conclusion

我们整理一下:
我们一开始执行configure脚本,这创建了一个新的makefile。
然后我们用make 对其编译,让源文件生成一个可执行文件。
最后我们用make install 来安装。这里我们又一次调用了make,用来找到install这么一个虚拟的文件(细节见: http://zh.wikipedia.org/wiki/Make)

Comments

Popular posts from this blog

Malware Report: iauzzy.exe

Malware Report: withme.exe

根因分析之iDice 文章复现