為 Debian 打包 CMake 組件
我有一個使用 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
文件?
一個標準的 debhelper
debain/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) 開始,它還不可用。