用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
。
默认情况下,lib和bin目录都使用prefix参数。我们可以使用prefix参数来指定我们要安装程序的位置。
当我们想确保一个软件包遵循我们自己的结构时,我们可以用GNU的diffutil软件包作为例子。它默认安装到/usr/lib。让我们把prefix设为/usr,把libdir设为/usr/lib64 —
$ ./configure --prefix=/usr --libdir=/usr/lib64
由于我们没有指定bindir,它默认为/usr/bin,因为我们指定了前缀/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
当我们改变前缀时,其他参数如libdir和bindir使用/home/user/diffutil/usr作为基础目录。
使用DESTDIR
当我们运行./configue时,我们正在改变构建和安装过程,所以安装的文件会使用这些路径。例如,应用程序可能需要安装图标、声音文件等资源,它必须能够找到它们。让我们使用 –prefix=/path/to/dir 在我们安装 diffutils 的目录里面找寻前缀。
$ strings /home/tpoint/diffutils/usr/bin/diff | grep /home/tpoint/diffutils/usr
/home/tpoint/diffutils/usr/share/locale
我们可以看到,在我们刚刚下载的二进制文件内的/home/user/bin/diffutils/usr路径中发现了字符串。如果我们不把新版本安装在不同的位置,那就没有问题。
我们有时只是想把一个程序安装到另一个地方,而不改变其内部的文件夹结构。
一个例子是当我们想为一个已安装的程序创建一个tarball,然后把它复制到另一台电脑上。如果发生这种情况,那么我们通常会先把软件包安装到一个空的、临时的目录中。所以,软件包不需要提到这个临时地址。
为了正确执行,我们
$ 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设置一个变量,我们将使用变量=值这个参数。让我们把前缀改为/usr,把libdir改为__/usr/lib64_ _ –
$ make clean
$ make prefix=/usr libdir=/usr/lib64
$ make prefix=/usr libdir=/usr/lib64 install
我们需要重新编译软件包,然后使用相同的配置再次安装。
Makefile中的变量将使用./configure惯例进行设置,前缀变量将被用作其他选项的基础位置。
现在我们可以像先前使用 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
我们将diffutilis安装在/home/baeldung/diffutils,使用的路径是/usr/local。二进制文件中没有DESTDIR目录的跟踪文件。
只有DESTDIR是大写的,而PREFIX、LIBDIR等则是小写的。
当软件包提供./configure脚本时,我们也可以使用Makefiles的环境变量。如果你使用./configure,那么make变量将优先于任何configure参数。
结论
我们学习了如何在使用make install安装软件包时设置它们的安装位置。
最初,我们研究了执行./configure命令,然后切换了目录。如果没有./configure存在,我们可以编辑makefile变量来代替。