我有一个使用 cmake 的上游源包,我想将其打包为两个二进制 debian 包。
$ tree proj
proj/
├── app1.c
├── app2.c
└── CMakeLists.txt
上游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
为此建立一个文件呢?
答案1
标准的 debhelperdebain/rules
文件可能如下所示(构建系统自动检测较新的兼容级别中的 cmake)。
%:
dh $@ # --buildsystem=cmake <-- older compat levels may need this
这将有效地运行make install DESTDIR=debian/tmp
。但这会将所有内容放入一个目的地,需要您debian/*.install
手动写入文件以将其拆分(请参阅dh_安装(1))。这是将单一 cmake 源代码转换为多个二进制文件的正常方法,Debian 手册中有一个很好的指南这里。
然而,上游已经通过定义组件安装为您完成了这项工作。
要利用这一点,请覆盖您自己的安装配方以指定包/组件关联:
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) 开始,它还不可用。