为什么总是./configure; 使; make install; 作为3个单独的步骤?

eri*_*ork 112 unix makefile configure make-install

每次从源代码编译时,都会经历相同的3个步骤:

$ ./configure
$ make
$ make install
Run Code Online (Sandbox Code Playgroud)

我理解,将安装过程划分为不同的步骤是有道理的,但我不明白,为什么这个星球上的每个编码器必须一次又一次地编写相同的三个命令才能完成一个单独的工作.从我的角度来看./install.sh,使用包含以下文本的源代码自动交付脚本是完全合理的:

#!/bin/sh
./configure
make
make install
Run Code Online (Sandbox Code Playgroud)

人们为什么要分开做3个步骤?

Fat*_*lan 115

因为每一步都做不同的事情

准备(设置)建筑环境

./configure
Run Code Online (Sandbox Code Playgroud)

此脚本有许多您应该更改的选项.喜欢--prefix--with-dir=/foo.这意味着每个系统都有不同的配置.还./configure检查应该安装的缺失库.这里有什么不对,导致不构建你的应用程序.这就是为什么发行版具有安装在不同位置的软件包,因为每个发行版都认为将某些库和文件安装到某些目录会更好.据说它会运行./configure,但实际上你应该总是改变它.

例如,看看Arch Linux软件包网站.在这里,您将看到任何包使用不同的configure参数(假设它们使用autotools构建系统).

建立系统

make
Run Code Online (Sandbox Code Playgroud)

这实际上make all是默认的.每个品牌都有不同的行动要做.有些人正在建设,有些人在建设后进行测试,有些人从外部SCM存储库进行检查.通常您不必提供任何参数,但是一些包再次执行它们.

安装到系统

make install
Run Code Online (Sandbox Code Playgroud)

这会将程序包安装在使用configure指定的位置.如果需要,可以指定./configure指向您的主目录.但是,许多配置选项指向/usr/usr/local.这意味着你必须实际使用,sudo make install因为只有root可以将文件复制到/ usr和/ usr/local.


现在您看到每个步骤都是下一步的预先要求.每一步都是让事情在无问题的流程中发挥作用的准备.发行版使用这个比喻来构建包(如RPM,deb等).

在这里,您将看到每个步骤实际上是一个不同的状态.这就是包管理器拥有不同包装器的原因.下面是一个包装器的示例,它允许您一步构建整个包.但请记住,每个应用程序都有一个不同的包装器(实际上这些包装器的名称类似于spec,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
Run Code Online (Sandbox Code Playgroud)

在这里可以使用autotools,这意味着./configure,makemake install.但另一个可以使用SCons,Python相关的设置或不同的东西.

正如您所看到的那样,拆分每个状态会使维护和部署变得更加容易,特别是对于包维护者和发行版.

  • 再读一遍,大约一年后,我必须补充一点,这一切都是有道理的,并且仍然可以有一个命令调用,它使用默认配置完成所有3个步骤.它们都有默认配置,否则你不能简单地在没有参数的情况下调用它们. (22认同)
  • `install`取决于`all`因此`make install`将调用`make all` (3认同)

apm*_*ell 29

首先,它应该是./configure && make && make install因为每个都取决于前者的成功.部分原因是进化,部分原因是开发工作流程的便利性.

最初,大多数Makefiles只包含编译程序的命令,安装留给用户.额外的规则允许make install将编译的输出放在可能正确的位置; 您可能不想这样做有很多充分的理由,包括不是系统管理员,根本不想安装它.而且,如果我正在开发软件,我可能不想安装它.我想进行一些更改并测试位于我的目录中的版本.如果我将要有多个版本,这将变得更加突出.

./configure去检测环境中可用的内容和/或用户希望确定如何构建软件.这不是需要经常更改的东西,通常需要一些时间.同样,如果我是开发人员,则不值得花时间不断重新配置.更重要的是,由于make使用时间戳来重建模块,如果我重新运行,configure有可能标志会改变,现在我的构建中的一些组件将使用一组标志进行编译,而其他组件则使用不同的标志集可能导致不同的,不相容的行为.只要我不重新运行configure,我就知道即使我改变了我的源代码,我的编译环境仍然保持不变.如果我重新运行configure,我应该make clean首先删除任何构建的源,以确保统一构建内容.

三个命令连续运行的唯一情况是用户安装程序或构建包(例如,Debian的debuild或RedHat的rpmbuild).并且假设包装可以是普通的configure,这通常不是包装的情况,至少--prefix=/usr需要包装.在做这个make install部分时,pacakgers喜欢处理假根.由于存在许多例外情况,因此./configure && make && make install对于许多在更频繁的情况下执行此操作的人来说,制定规则会很不方便!

  • 感谢"&&"的建议! (2认同)