原文:configure、 make、 make install 背后的原理
原文:The magic behind configure, make, make install
原文: 用make install改变安装目录
当我们在linux平台上通过下列几条命令安装软件时, 背后到底发生了什么?
1 | ./configure |
做了什么?
整个过程分为三步:
配置
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系统上的安装步骤变得简单.