iT邦幫忙

2023 iThome 鐵人賽

DAY 19
0
Software Development

30 天 CMake 跨平台之旅系列 第 19

[Day 19] Install Basics

  • 分享至 

  • xImage
  •  

本日內容

  • 安裝前需要思考的問題
  • 安裝架構
  • GNUInstallDirs
  • RPATH
  • 預告

今天會先介紹一些安裝時需要知道的概念, 所以沒有提供 sample code
Day 20 才會開始實作

安裝前需要思考的問題

說到安裝, 就代表著我們的專案已經完成開發並充分測試過, 可以準備讓別人使用了
既然有了使用者, 就代表我們的程式將會在一個未知的條件下執行, 所以在開始準備安裝的 scripts 前, 我們要先想想幾個問題

  1. 目標使用者 (TA) 的平台是什麼?
  2. 專案要用什麼形式打包, 讓使用者安裝?
  3. 我們的檔案是否依賴目標系統上的外部套件?
  4. 我們的檔案是否要裝在特定路徑下才能執行?
  5. 如果使用者曾經裝過舊版, 我們是否支援多版本共存?

安裝架構

GNUInstallDirs

CMake 提供了 GNUInstallDirs modules
該 module 幫我們將 GNU Coding Standards 中 install 的規則抽象出來
也可以參考 Filesystem Hierarchy Standard
根據 FHS, CMake 幫我們設定了很多 cache variables, 以下列出常用的幾個 directory 與對應的用法

  • BINDIR
    • bin
    • User binaries
  • SBINDIR
    • sbin
    • System binaries
  • LIBEXECDIR
    • libexec
    • Program binaries
  • SYSCONFDIR
    • etc
    • Program configs
  • LOCALSTATEDIR
    • var
    • Files continually changing during execution
  • LIBDIR
    • lib
    • bin, sbin 使用的 libraries
  • INCLUDEDIR
    • include
    • GCC include files
  • OLDINCLUDEDIR
    • /usr/include
    • Non-GCC include files
  • DATADIR
    • share
    • Architecture-independent shared data

上述這些 directories 會產生對應的 cache variables CMAKE_INSTALL_<dir>
就可以搭配 install(TARGETS)DESTINATION 使用, 比如

include(GNUInstallDirs)
install(TARGETS Main SharedLib StaticLib)

install(TARGETS) 的用法會在 Day 20 介紹

RPATH

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
    • 會將該路徑加入 binary 的 search path
    • 通常是給 Module library 用的, 讓 dlopen() 時能夠找到該 so
  • BUILD_RPATH_USE_ORIGIN
    • 很重要的 property, rpath 會是相對於 build-time 的 $ORIGIN 而非 build tree 的絕對路徑
    • 由於是相對於 $ORIGIN, 這就讓我們能夠 relocate 專案而不會壞掉
  • INSTALL_RPATH
    • 預設是空的
    • 最好要能反應安裝的架構
  • INSTALL_RPATH_USE_LINK_PATH
    • 會拿 build-time link 到的外部 libraries 的路徑當作 rpath
    • 但不太可靠, 因為使用者系統上的 libraries 路徑可能會換

預告

下一篇會接著介紹安裝會用到的指令!


上一篇
[Day 18] 注意! Link dependencies
下一篇
[Day 20] 安裝 Project
系列文
30 天 CMake 跨平台之旅30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言