使用 make install 更改安装目录


概述

通常,软件包安装在默认目录中。根据系统的 Linux 版本,可能需要使用不同的目录,例如 /usr 或 /user/local。我们可能还希望为单个用户而不是整个系统安装特定的软件应用程序。

我们将了解如何通过运行 make uninstall 来更改软件包的安装位置。

使用./configure 参数

当使用 autoconf/automake 构建软件包时,会提供一个包含多个标准参数(有时还有其他自定义参数)的 configure 脚本。有些软件包不使用 autoconf,但它们通常会提供一个兼容的 ./configure 脚本。

我们可以使用参数指定 make 在运行 ./configue 时将创建哪些目录。

  • –prefix=<dir> − 默认情况下,这通常是 /usr 或 usr/local,它是用于其他设置的目录。

  • –libdir=<dir> − 这是库目录,默认情况下通常是 ${prefix}/lib 或 ${prefix}/lib64

  • –bindir=<dir> − 这是可执行文件目录,默认情况下通常是 ${prefix}/bin

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

当我们希望确保软件包遵循我们自己的结构时,可以使用 GNU 的 diffutil 软件包作为示例。它默认安装到 /usr/lib。让我们将 prefix 设置为 /usr,并将 libdir 设置为 /usr/lib64 −

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

由于我们没有指定 bindir,因此它默认为 /usr/bin,因为我们指定了 prefix /usr。prefix 参数不适用于我们没有显式设置的目录。

运行 make install 后,diffutil 软件包将安装到所需的位置。我们将安装到 /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/tpoint/diffutils/usr −

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

当我们更改 prefix 时,其他参数(例如 libdir 和 bindir)将使用 /home/user/diffutil/usr 作为基本目录。

使用 DESTDIR

当我们运行 ./configue 时,我们正在更改构建和安装过程,因此安装的文件将使用这些路径。例如,应用程序可能需要安装图标、声音文件等资源,并且必须能够找到它们。让我们在使用 --prefix=/path/to/dir 安装 diffutils 的目录中查找 prefix。

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

我们可以看到,在刚刚下载的二进制文件中,路径 /home/user/bin/diffutils/usr 中找到了字符串。如果我们不在其他位置安装新版本,那也没关系。

有时我们只想将程序安装到另一个位置,而不更改其内部文件夹结构。

一个例子是,当我们想要创建一个已安装程序的 tarball 并将其复制到另一台计算机时。如果发生这种情况,那么我们通常首先将软件包安装到一个空且临时的目录中。因此,软件包不需要提及此临时地址。

为了正确执行,我们在运行 make install 时将使用 DESTDIR=<dir> 环境变量。此路径将添加到所有安装目录中。我们将从系统中卸载 diffutils,方法是删除其当前安装并使用 DESTDIR 重新安装它。

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

Make 将使用 /home/tpoint/diffutils 作为其安装位置。我们已将 DiffUtils 配置为使用 /usr 作为其默认目录。以下是结果 −

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

正如我们所看到的,我们将软件包安装在 /home/tpoint/diffutils 中。这次,二进制文件中没有对 DESTDIR 指定的目录的引用。

使用Makefile 参数

如果软件包不包含 ./configure 文件,它可能会提供一个使用 GNU 约定的 makefile。在这种情况下,可以使用 ./configure 中使用的参数。

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

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

我们需要重新编译软件包,然后使用相同的配置再次安装它。

Makefile 中的变量将使用 ./configure 约定进行设置,并且 prefix 变量将用作其他选项的基本位置。

我们现在可以像之前使用 PREFIX 一样使用 DESTDIR。这样做允许我们将软件包安装到任何位置,而无需更改其结构。这次让我们使用 prefix=/usr/local,并添加 DESTDIR 将 diffutils 安装到 /home/tpoint/diffutils −

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

首先,我们删除目标文件夹,以防其中有先前安装的应用程序的旧副本。让我们看一下结果 −

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

我们使用路径 /usr/local 将 diffutilis 安装到 /home/baeldung/diffutils 中。二进制文件中没有 DESTDIR 目录的跟踪文件。

只有 DESTDIR 为大写,而 PREFIX、LIBDIR 等为小写。

当软件包提供 ./configure 脚本时,我们也可以使用 Makefiles 的环境变量。如果您使用的是 ./configure,则 make 变量将优先于任何 configure 参数。

结论

我们学习了如何在使用 make install 安装软件包时设置软件包的安装位置。

最初,我们查看了执行 ./configure 命令,然后切换目录。如果没有 ./configure,我们可以编辑 makefile 变量。

更新于: 2023年1月3日

4K+ 阅读量

开启您的 职业生涯

通过完成课程获得认证

开始学习
广告
© . All rights reserved.