使用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*
我们可以看到libdir和bindir默认使用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时,其他参数(例如libdir和bindir)将使用/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是大写的,而prefix、libdir和其他都是小写的。
最后,当包提供*./configure脚本时,我们还可以使用Makefile变量。在这种情况下,make变量将覆盖./configure*参数。