Packaging

為 Debian 打包 CMake 組件

  • May 22, 2019

我有一個使用 cmake 的上游源包,我想將它打包為兩個二進制 debian 包。

$ tree proj
proj/
├── app1.c
├── app2.c
└── CMakeLists.txt

Upstream 的CMakeLists.txt寫作已經考慮到了這一點。他們使用 COMPONENTS 參數install

$ cat proj/CMakeLists.txt
include(GnuInstallDirs)

add_executable(app1 app1.c)
install(
 TARGETS app1 
 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
 COMPONENT app1)

add_executable(app2 app2.c)
install(
 TARGETS app2
 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
 COMPONENT app2)

要在本地編譯/安裝,非常簡單:

$ mkdir build && cd build
$ cmake ../proj -DCMAKE_INSTALL_PREFIX=/usr/local  # Configure
$ cmake --build .                                  # Build
$ cmake -DCOMPONENT=app1 -P cmake_install.cmake    # Install app1 component
$ cmake -DCOMPONENT=app2 -P cmake_install.cmake    # Install app2 component

但是您將如何為此建構debian/rules文件?

一個標準的 debhelperdebain/rules文件可能看起來像這樣(buildsystem 會自動檢測更新的兼容級別的 cmake)。

%:
       dh $@    # --buildsystem=cmake  <-- older compat levels may need this

這將有效地執行make install DESTDIR=debian/tmp。但這會將所有內容都放在一個目的地,需要您debian/*.install手動編寫文件以將其拆分(請參閱dh_install(1))。這是將單一的 cmake 原始碼轉換為多個二進製文件的正常方法,這裡的 Debian 手冊中有一個很好的指南。

但是,上游通過定義 COMPONENT 安裝為您完成了這項工作。

要利用這一點,請覆蓋您自己的安裝配方以指定包/組件關聯:

include /usr/share/dpkg/architecture.mk

%:
       dh $@

override_dh_auto_install:
       sed -i -e 's/\-P/\-DCOMPONENT\=app1\ \-P/g' obj-$(DEB_HOST_MULTIARCH)/Makefile
       dh_auto_install --destdir=debian/app1

       sed -i -e 's/\-DCOMPONENT\=app1/\-DCOMPONENT\=app2/g' obj-$(DEB_HOST_MULTIARCH)/Makefile
       dh_auto_install --destdir=debian/app2

debian/<binary_package_name>表示/該二進制包中的根。

我對sed命令有點失望。我希望通過傳遞-- -DCOMPONENT=app1給 dh_auto_install 目錄來做到這一點。相反,這些命令編輯由 cmake 自動生成的 Makefile。該解決方案假定您正在使用make,並且唯一的-P字元串將出現在您的安裝命令中(到目前為止我檢查過的項目似乎就是這種情況)。我很高興接受對此答案的編輯,並提供更好的解決方案。

注意:Kitware(cmake 開發人員)正在開發一個新的 debhelper 擴展dh-cmake,它看起來會讓這變得更加容易。但是,從 Debian 10 (buster) 開始,它還不可用。

引用自:https://unix.stackexchange.com/questions/519986