Contents

使用make install更改安装目录

 1. 概述

安装包时,通常将其安装在默认目录中。然而,每个 Linux 用户都是不同的,我们可能希望使用其他目录。例如,有些人喜欢使用*/usr*,而其他人则喜欢使用*/usr/local*。此外,我们可能希望为特定用户安装一个包,而不是为整个系统安装它。

在本教程中,我们将了解如何在使用*make install*安装包时更改目标路径。

2.使用*./configure*参数

当包使用Autotools 时,它会提供一个* ./configure脚本来更改其配置。这个脚本接受几个标准参数,每个包都可以向它添加更多自定义参数。有些包可能不使用 Autotools,但有时它们会提供类似且兼容的./configure*脚本。

当我们运行*./configure时,**我们可以使用参数来更改make install*将安装文件的目录**:

  • –prefix=dir – 这通常默认为*/usr/usr/local*,它是其他参数中使用的前缀
  • –libdir=dir – 这是库目录,默认情况下通常是*${prefix}/lib${prefix}/lib64*
  • –bindir=dir – 这是可执行文件目录,默认情况下通常是*${prefix}/bin*

我们可以看到libdirbindir默认使用prefix参数。因此,我们可以使用前缀参数更改安装目录。

一个常见的用法是当想要确保包遵循我们的系统结构时。我们可以使用 GNU 的diffutils 包作为例子。这个包默认安装到/usr/local 。让我们将prefix设置为/usr,将libdir设置为*/usr/lib64*:

$ ./configure --prefix=/usr --libdir=/usr/lib64

因为我们没有配置bindir,所以它会自动设置为*/usr/bin因为我们将prefix定义为/usr*。prefix参数仅适用于我们未明确设置的目录。

接下来,我们可以运行make install并且diffutils包将安装在所需的目录中。因为我们要安装到*/usr*,所以我们需要root权限。让我们安装它:

$ make install
$ ls -l /usr/bin/diff
-rwxr-xr-x 1 root root 1078184 Jun  6 11:21 diff

**我们还可以更改目录以将软件包安装在我们用户的主目录中。**当我们这样做时,我们不需要root权限来安装它。

让我们使用make clean清理包并重新配置它以将其安装在*/home/blogdemo/diffutils/usr*中:

$ make clean
$ ./configure --prefix=/home/blogdemo/diffutils/usr

当我们更改prefix时,其他参数(例如libdirbindir)将使用/home/blogdemo/diffutils/usr作为基本目录。

3. 使用DASTID

当我们使用*./configure*时,我们正在更改构建和安装过程,因此安装的文件将使用这些目录。例如,包可能会安装图标和声音等资源,它需要知道它们的位置。

让我们在使用*–prefix=/home/blogdemo/diffutils/usr*安装的二进制文件中搜索前缀:

$ strings /home/blogdemo/diffutils/usr/bin/diff | grep /home/blogdemo/diffutils/usr
/home/blogdemo/diffutils/usr/share/locale

我们可以注意到strings 在已安装的二进制文件中找到了路径*/home/blogdemo/diffutils/usr/share/locale 。*只要我们不将安装的包移动到另一个位置,就可以了。

有时,我们只是想将包安装到另一个地方而不改变其内部目录结构。一个例子是当我们想要制作安装包的tarball 并将其复制到另一台 PC 时。在那种情况下,我们通常将软件包安装在一个空的临时目录中。所以,包不应该有任何参考这个临时位置。

为了正确地做到这一点,我们将在运行make install时设置DESTDIR=dir变量。此路径将添加到所有安装目录中。让我们删除之前的安装并使用DESTDIR重新安装diffutils

$ rm -r /home/blogdemo/diffutils
$ make clean
$ ./configure --prefix=/usr
$ make
$ make DESTDIR=/home/blogdemo/diffutils install

使用此配置,make将使用*/home/blogdemo/diffutils作为目标目录来安装它。此外,我们将diffutils配置为使用/usr*作为前缀。让我们看看结果:

$ ls -l /home/blogdemo/diffutils/usr/bin
total 1740
-rwxr-xr-x 1 blogdemo users  191456 Jun  6 12:48 cmp
-rwxr-xr-x 1 blogdemo users 1078184 Jun  6 12:48 diff
-rwxr-xr-x 1 blogdemo users  300552 Jun  6 12:48 diff3
-rwxr-xr-x 1 blogdemo users  204376 Jun  6 12:48 sdiff
$ strings /home/blogdemo/diffutils/usr/bin/diff | /home/blogdemo/diffutils

如我们所见,我们将包安装在*/home/blogdemo/diffutils中。这一次,没有引用使用DESTDIR*配置的路径。

4. 使用Makefile参数

有些包没有*./configure脚本,但它们提供了一个Makefile文件。**如果Makefile遵循GNU 约定 ,我们可以使用与./configure*相同的参数。**

如果我们想用make设置一个变量,我们将使用参数variable=value。让我们将前缀更改为*/usr并将libdir* 更改为*/usr/lib64*:

$ make clean
$ make prefix=/usr libdir=/usr/lib64
$ make prefix=/usr libdir=/usr/lib64 install

这些目录可能存储在已编译的二进制文件中,因此我们必须编译包并使用相同的配置安装它。

Makefile中的变量将遵循相同的*./configure*约定,前缀变量用作其他参数的基目录。

**最后,我们可以像上一节中那样以类似的方式使用DESTDIR通过这样做,我们可以在任何目的地安装包而不改变包结构。这次让我们使用prefix=/usr/local,并添加DESTDIR以在/home/blogdemo/diffutils中安装diffutils

$ rm -r /home/blogdemo/diffutils
$ make clean
$ make prefix=/usr/local
$ make prefix=/usr/local DESTDIR=/home/blogdemo/diffutils install

我们首先删除目标目录,以防有以前安装的旧文件。让我们看看结果:

$ ls -l /home/blogdemo/diffutils/usr/local/bin
total 1740
-rwxr-xr-x 1 blogdemo users  191456 Jun 6 22:59 cmp
-rwxr-xr-x 1 blogdemo users 1078184 Jun 6 22:59 diff
-rwxr-xr-x 1 blogdemo users  300552 Jun 6 22:59 diff3
-rwxr-xr-x 1 blogdemo users  204376 Jun 6 22:59 sdiff
$ strings /home/blogdemo/diffutils/usr/local/bin/diff | /home/blogdemo/diffutils

如我们所见,我们使用前缀*/usr/local/home/blogdemo/diffutils中安装了diffutils*。此外,二进制文件中没有DESTDIR目录的痕迹。

请注意,只有DESTDIR是大写的,而prefixlibdir和其他都是小写的。

最后,当包提供*./configure脚本时,我们还可以使用Makefile变量。在这种情况下,make变量将覆盖./configure*参数。