configure, make, make install 背后的原理

原文:configure、 make、 make install 背后的原理
原文:The magic behind configure, make, make install
原文: 用make install改变安装目录

当我们在linux平台上通过下列几条命令安装软件时, 背后到底发生了什么?

1
2
3
./configure 
make
make install

做了什么?

整个过程分为三步:

配置

configure脚本负责在你使用的系统上准备好软件的构建环境. 确保接下来的构建和安装过程所需要的依赖准备好, 并且搞清楚使用这些依赖需要的东西.

unix程序一般是用C语言写的, 所有我们通常需要一个C编译器去构建它们. 在这个例子中configure要做的就是确保系统中有c编译器, 并确定它的名字和路径.

构建

当configure配置完毕后, 可以使用make命令执行构建. 这个过程会执行在Makefile文件中定义的一系列任务将软件源代码编译成可执行文件.

你下载的源码包一般没有一个最终的Makefile文件, 一般是一个模板文件Makefile.in文件, 然后configure根据系统的参数生成一个定制化的Makefile文件.

一般来说, 软件包被安装在默认路径下. 也就是说当你在运行./configure且不提供参数时, 是安装在默认路径下, 默认路径一般由这个Makefile文件决定.

当使用autoconf/automake来构建软件包是, 会提供一个带有几个标准参数和(有时)额外的自定义参数的configure脚本. 有时软件包不适用autoconf, 但它们通过提供一个兼容./configure脚本.

我们可以通过使用参数指定make在运行./configure是将创建哪些目录

  • -prefix= - 默认情况下, 这通过是/usr或/usr/local, 它是用于其他设置的目录.
  • -libdir= - 这是库的目录, 通常默认为${prefix}/lib 或 ${prefix/lib64}
  • bindir= - 这是可执行文件的目录, 通常默认为${prefix}/bin

默认情况下, lib和bin目录都使用prefix参数. 我们可以使用prefix参数来指定我们要安装程序的位置.

虽说是这样, 但实际情况还是建议去看生成好的Makefile的注释

安装

现在软件已经被构建后并且可以执行, 接下来要做的就是将可执行文件复制到最终的路径. make install 命令就是将可执行文件, 第三方依赖包和文档复制到正确的路径.

这通常意味着, 可执行文件被复制到某个PATH包含的路径, 程序的调用文档被复制到某个MANPATH包含路径, 然后程序依赖的文件也会被存放在合适的路径.

因为按照这一步也是被定义在Makefile中, 所有程序安装的路径可以通过configure命令的参数指定, 或者configure通过系统参数决定.

如果要将可执行文件安装在系统路径, 执行这步需要赋予相应的权限, 一般是通过sudo.

如果生成的Makefile文件支持指定安装目录, 甚至可以将指定安装目录的步骤推迟到这一步. 但还是要去看Makefile文件的

这些脚本是怎么产生的

安装过程简单说就是configure脚本根据系统信息将Makefile.in模板文件转换为Makefile文件, 但是configure和Makefile.in文件是怎么产生的呢?

如果你曾经试着打开configure或者Makefile.in文件, 你会发现超长而且复杂的shell脚本语言. 有时候这些脚本代码比它们要安装的程序源代码还要长.

如果想手动构建一个这样的configure脚本文件是非常可怕, 好消息是这些脚本是通过代码生成的.

通过这种方式构建的软件通常是通过一个叫做autotools的工具集打包的. 这个工具集包含autoconf, automake等工具, 所有的这些工具使得维护软件生命周期变得很容易. 最终用户不需要了解这些工具, 但却可以让软件在不同的Unix系统上的安装步骤变得简单.