使用 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.