每次你从源代码编译的东西的时候,你去通过相同的3个步骤:
$ ./configure
$ make
$ make install
我明白了,这是有意义的安装过程划分为不同的步骤,但我不明白,为什么在这个星球上每一个编码器必须重新编写相同的三个命令,并再次只是为了获得一个单一的工作做好。 从我的角度来看,这将使得完全意义上有一个./install.sh
与包含以下文本的源代码自动传送脚本:
#!/bin/sh
./configure
make
make install
为什么人们分别做3个步骤?
因为每一步做不同的事情
准备(设置)环境建设
./configure
这个脚本有很多,你应该更改选项。 像--prefix
或--with-dir=/foo
。 这意味着每个系统都有不同的配置。 同时./configure
检查应安装缺少的库。 这里有什么问题会导致不来构建应用程序 。 这就是为什么发行版有一个安装在不同的地方包,因为每一个发行版认为这是更好地安装某些库和文件到特定的目录。 据说运行./configure
,但事实上,你应该总是改变它。
例如看看拱Linux软件包网站 。 在这里,你会看到任何包使用不同的配置参数(假定他们使用自动工具为构建系统)。
构建系统
make
这实际上是make all
默认。 而每个品牌都有不同的动作做。 有的做建筑,做一些试验建成后,有的来自外部SCM仓库签。 通常你没有给任何参数,但是又有些不同的软件包执行它们。
安装到系统中
make install
这将安装包与配置所指定的地方。 如果你愿意,你可以指定./configure
指向你的主目录。 然而,大量的配置选项都指向/usr
或/usr/local
。 这意味着,你必须真正使用sudo make install
,因为只有root用户可以将文件复制到/ usr和/ usr /本地。
现在你看到每一个步骤是下一步预先要求。 每一步都是一个准备做的事情在problemless流工作。 发行版使用这个比喻来构建软件包(如RPM,DEB等)。
在这里,你会看到每一步实际上是一个不同的状态。 这就是为什么包经理有不同的包装。 下面是一个包装,让你一步到位建全包的例子。 但请记住,每个应用程序都有一个不同的包装(实际上这些包装有这样的规格,PKGBUILD等的名称):
def setup:
... #use ./configure if autotools is used
def build:
... #use make if autotools is used
def install:
... #use make all if autotools is used
在这里,人们可以使用自动工具,这意味着./configure
, make
和make install
。 但是,另外一个可以使用SCons,就Python的相关设置或不同的东西。
正如你看到的每一个分裂状态,使东西维护和部署,特别是对包维护和发行版容易得多。
首先,它应该是./configure && make && make install
,因为每个取决于前者的成功。 部分原因是原因的演变和部分便利的开发流程。
原来,大多数Makefile
s就只包含编译程序的命令和安装是留给用户。 一个额外的规则允许make install
放置在可能是正确的地方编译后的输出; 仍然有很多的,你可能不希望这样做,包括不被系统管理员充分的理由,不希望在所有安装。 此外,如果我开发软件,我可能不想安装它。 我想做出一些改变和测试版本坐在我的目录。 这变得更加突出,如果我将有多个版本躺在附近。
./configure
去和检测什么环境中可用和/或由用户需要确定如何构建软件。 这是不是需要经常改变,往往需要一定的时间。 再次,如果我是一个开发者,这是不值得不断地重新配置时间。 更重要的是,因为make
使用时间戳来重建模块,如果我重新运行configure
有一种可能性,即标志将改变现在一些在我建立的组件将与一组标志和其他被编译一组不同的标志可能导致不同的,不兼容的行为。 只要我不重新运行configure
,我知道我的编译环境仍然即使我改变我的消息来源是相同的。 如果我重新运行configure
,我应该make clean
第一,清除积累的来源,以确保事情均匀建。
其中三个命令是连续运行的唯一情况是当用户安装该程序或包建(例如,Debian的debuild或RedHat的的rpmbuild)。 并且假设包可以给出一个普通的configure
,这通常不是用于包装,其中,至少,壳体--prefix=/usr
是期望的。 和pacakgers就像有做的时候对付假根make install
一部分。 因为有很多例外,使得./configure && make && make install
规则将是不方便的,很多人谁做它一个更加频繁的基础上!
configure
如果发现相关性缺失可能会失败。
make
运行一个默认的目标,在Makefile中列出的第一个。 通常,这一目标all
,但并非总是如此。 所以,你只能make all install
,如果你知道这是目标。
所以...
#!/bin/sh
if ./configure $*; then
if make; then
make install
fi
fi
要么:
./configure $* && ./make && ./make install
该$*
被包括在内,因为人常常提供的选项configure
。
但是,为什么不只是让人们自己做? 这真的是这样一个巨大的胜利?
首先的./configure并不总是发现它的需要,或在其他情况下,它认为有需要就可以使用一切,但不是万能的一切。 在这种情况下,你会想知道它(和你的运行./install.sh脚本无论如何都会失败!)非故障与意外后果的典型例子,从我的角度来看,是编制大型应用,如ffmpeg的mplayer的或。 这些都将使用库(如果有),但无论如何将编译,如果他们都没有,留下禁用一些选项。 问题是,你后来发现它是没有一些格式或其他支持编辑,因此需要你回去重做。
另一件事的./configure确实有些交互是给您制定系统将被安装的应用程序的选项。 不同的发行/环境有不同的约定,你可能会想坚持到您的系统上的惯例。 此外,您可能想在本地安装(只为自己)。 传统的./configure和make步骤不以root身份运行,同时使安装(除非是只安装自己)必须以root身份运行。
特定分布经常提供一种以分布敏感的方式执行此运行./install.sh功能的脚本-例如, 源的RPM + spec文件+的rpmbuild或slackbuilds 。
(附注:他这样说,我同意的./configure; make; make install的,可以得到极其乏味。)