GNUInstallDirs
今天會先介紹一些安裝時需要知道的概念, 所以沒有提供 sample code
Day 20 才會開始實作
說到安裝, 就代表著我們的專案已經完成開發並充分測試過, 可以準備讓別人使用了
既然有了使用者, 就代表我們的程式將會在一個未知的條件下執行, 所以在開始準備安裝的 scripts 前, 我們要先想想幾個問題
GNUInstallDirs
CMake 提供了 GNUInstallDirs
modules
該 module 幫我們將 GNU Coding Standards 中 install 的規則抽象出來
也可以參考 Filesystem Hierarchy Standard
根據 FHS, CMake 幫我們設定了很多 cache variables, 以下列出常用的幾個 directory 與對應的用法
BINDIR
bin
SBINDIR
sbin
LIBEXECDIR
libexec
SYSCONFDIR
etc
LOCALSTATEDIR
var
LIBDIR
lib
bin
, sbin
使用的 librariesINCLUDEDIR
include
OLDINCLUDEDIR
/usr/include
DATADIR
share
上述這些 directories 會產生對應的 cache variables CMAKE_INSTALL_<dir>
就可以搭配 install(TARGETS)
的 DESTINATION
使用, 比如
include(GNUInstallDirs)
install(TARGETS Main SharedLib StaticLib)
install(TARGETS)
的用法會在 Day 20 介紹
RPATH, 又稱作 rumtime path, 是寫死在 binary 中的多個路徑, 告訴 dynamic linker 在執行程式的時候要去哪裡找需要的 shared libraries, 我們可以用 Day 17 提過的 readelf -d <binary>
或是 objdump -x <binary>
來查看 binary 的 rpath, 這個會在 Day 20 介紹
我們在 build-time 的 binary rpath 和 install 時通常是不同的, 這可以透過設定 CMake target properties 來控制
BUILD_RPATH
dlopen()
時能夠找到該 so
BUILD_RPATH_USE_ORIGIN
$ORIGIN
而非 build tree 的絕對路徑$ORIGIN
, 這就讓我們能夠 relocate 專案而不會壞掉INSTALL_RPATH
INSTALL_RPATH_USE_LINK_PATH
下一篇會接著介紹安裝會用到的指令!