如何基于同一CMake/CPP源码通过debuild生成多个Debian软件包?
解决方案
要通过debuild生成package1.deb和package2.deb两个独立包,核心思路有两种,具体如下:
方案一:一次构建编译所有组件(推荐)
这是Debian多二进制包的标准做法,一次构建完成所有代码编译,再通过.install文件拆分到不同包中,效率更高。
- 修改
debian/rules,同时开启两个CMake编译开关
%: dh $@ --buildsystem=cmake override_dh_auto_configure: dh_auto_configure -- --no-warn-unused-cli -DPACKAGE_ONE=ON -DPACKAGE_TWO=ON
- 启用
debian/control中的package2配置
取消原文件中package2相关代码的注释,确保两个包的元数据都生效:
Source: blabla Maintainer: ME <me@here.com> Section: misc Priority: optional Build-Depends: debhelper-compat (= 12), cmake (>= 3.10.0), Package: package1 Architecture: any Pre-Depends: ${misc:Pre-Depends} Depends: ${misc:Depends}, ${shlibs:Depends}, ${debconf:Depends}, unzip Description: Package 1 The first package. Package: package2 Architecture: any Pre-Depends: ${misc:Pre-Depends} Depends: ${misc:Depends}, ${shlibs:Depends}, ${debconf:Depends}, unzip Description: Package 2 The second package.
- 完善
.install文件
确保package1.install和package2.install分别指定各自包需要打包的文件路径,示例如下:
package1.install:
usr/bin/package1-executable usr/share/doc/package1/*
package2.install:
usr/bin/package2-executable usr/share/doc/package2/*
执行debuild后,会自动生成两个独立的deb包。
方案二:针对不同包使用差异化CMake参数(按需使用)
如果两个包需要完全不同的编译配置(比如特定编译选项仅针对其中一个包),可以通过debian/rules的条件判断实现:
- 修改
debian/rules添加分目标配置
%: dh $@ --buildsystem=cmake # 仅编译package1的配置 override_dh_auto_configure::package1 dh_auto_configure -- --no-warn-unused-cli -DPACKAGE_ONE=ON -DPACKAGE_TWO=OFF -DPACKAGE1_CUSTOM_OPTION=ON # 仅编译package2的配置 override_dh_auto_configure::package2 dh_auto_configure -- --no-warn-unused-cli -DPACKAGE_ONE=OFF -DPACKAGE_TWO=ON -DPACKAGE2_CUSTOM_OPTION=ON # 默认全量编译配置(可选) override_dh_auto_configure:: dh_auto_configure -- --no-warn-unused-cli -DPACKAGE_ONE=ON -DPACKAGE_TWO=ON
- 添加构建清理逻辑
为避免多次构建的文件冲突,在debian/rules中添加清理规则:
override_dh_auto_clean: dh_auto_clean rm -rf build/
- 单独构建指定包
执行debuild时可以指定仅构建某个包,比如:
debuild -b -ppackage1
关键注意事项
- 确保
CMakeLists.txt能兼容PACKAGE_ONE和PACKAGE_TWO同时为ON的情况,避免编译冲突。 - CMake中需通过
install(TARGETS ... DESTINATION ...)明确指定文件安装路径,确保与.install文件的路径匹配。
内容的提问来源于stack exchange,提问作者Ferenc Deak
相关产品推荐
相关产品推荐

