从 CMake 项目创建一个 Debian 软件包



我正在考虑从现有的库(paho-mqtt-c(创建一个Debian软件包。该项目使用 CMake 作为其构建系统。经过一些研究,我认为我需要创建两个或三个不同的包:

  • libpaho-mqtt3(带有库.so文件和相关内容(
  • libpaho-mqtt3-dev (带头文件(
  • 也许我需要第三个包含示例文件或文档的包(称为paho-mqtt3

我做了一些研究,当我使用 CMake 作为我的构建系统时,似乎至少有三种不同的方法可以创建 Debian 软件包:

  1. 使用 Debian 文档(第 8 章(中描述的 debmake 过程。
  2. 使用 cmake-debhelper。
  3. 使用 dh-cmake

我已经研究了所有三种方法,似乎每种方法都有一些优点和缺点。

德贝马克

据我所知,使用 debmake 假设我有一个包含源代码和构建系统的上游压缩包,然后我在提取的压缩包上调用 debmake。之后,我得到了很多模板,我需要手动调整这些模板以填补缺失的空白。我开始这样做,但它似乎很复杂。

cmake-debhelper

我尝试使用它,但收到很多错误。github页面有一个没有解决方案的未解决问题,所以我停止查看此内容。这也是paho-mqtt-c构建系统当前正在使用的,但由于链接的问题,它不起作用。

DH-cmake

我简要地研究了一下,它似乎是最现代的解决方案,应该可以将其与 CPack 相结合。但是,似乎dh-cmake仅适用于Ubuntu 18.04和16.04,但是我使用的是Ubuntu 19.10,因此无法在我的系统上安装dh-cmake。

我在研究中遗漏了什么吗?从使用 CMake 管理的软件创建 Debian 软件包的推荐步骤是什么,哪些文档对阅读有用?

简而言之,在 Ubuntu 上,您至少需要创建以下文件:

debian/
changelog
control
copyright
rules

然后运行debuild,它将cmake install运行到临时文件夹并从中打包一个可安装的deb包。 若要快速创建这些debian文件,请运行dh_make --createorig并按源包的s。 然后你需要仔细编辑 debian 文件,如第 4 章所述。debian 目录下的必需文件 的 Debian 新维护者指南。

如果您需要设置 cmake 属性或进行任何其他配置,则需要在rules中调整override_dh_auto_configure

#!/usr/bin/make -f
# See debhelper(7) (uncomment to enable)
export DH_VERBOSE = 1
%:
dh $@
override_dh_auto_configure:
dh_auto_configure -- 
-DCMAKE_LIBRARY_PATH=$(DEB_HOST_MULTIARCH) 
-DIWINFO_SUPPORT=OFF

在这里,-DCMAKE_LIBRARY_PATH=$(DEB_HOST_MULTIARCH)-DIWINFO_SUPPORT=OFF将直接传递给cmake。

然后,您可以将软件包上传到 Ubuntu PPA:

debuild -S -I
dput dput ppa:your-launchpad-user/your-ppa ../*_source.changes

之后,PPA 构建机器人将编译您的包并将其发布到 PPA,您将在 https://launchpad.net/~your-launchpad-user/+archive/ubuntu/your-ppa/+packages 上看到它们

不幸的是,还有很多其他步骤,我只是简要描述了。

dh-cmake需要更复杂的东西。如果您想发布到 PPA,CPack 对您不起作用,因为它的构建机器人无论如何都会运行 debhelper(debuild 的简短版本(,因此它需要debian文件夹

或者你可以将cpackcmake一起使用来生成一个相当容易做到的deb,但cmakecpack的文档很少,但它们仍然运行良好 我建议在CMakeLists的底部添加以下内容.txt

# generate postinst file in ${CMAKE_BINARY_DIR} from template                        #
CONFIGURE_FILE("${CMAKE_SOURCE_DIR}/contrib/postinst.in" "postinst" @ONLY IMMEDIATE)

# generate a DEB when cpack is run
SET(CPACK_GENERATOR "DEB")
SET(CPACK_PACKAGE_NAME ${CMAKE_PROJECT_NAME})
SET(CPACK_SET_DESTDIR TRUE)
SET(CPACK_DEBIAN_PACKAGE_MAINTAINER "grizzlysmit@smit.id.au")
SET(CPACK_PACKAGE_VERSION_MAJOR "0")
SET(CPACK_PACKAGE_VERSION_MINOR "0")
SET(CPACK_PACKAGE_VERSION_PATCH "1")
include(GNUInstallDirs)
SET(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_SOURCE_DIR}/docs/CPack.Description.txt")
SET(CPACK_RESOURCE_FILE_README "${CMAKE_SOURCE_DIR}/docs/README.md")
SET(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/docs/LICENCE")
SET(CPACK_DEBIAN_PACKAGE_DEPENDS "libreadline8, libreadline-dev")
SET(CPACK_PACKAGE_VENDOR "Grizzly")
# make postinst run after install                                                #
SET(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA "${CMAKE_BINARY_DIR}/postinst;")


include(CPack)

postisnt是在安装后运行脚本,请参阅 CMAKE/CPACK:我想让 deb 在安装后执行一个 bash 脚本,但它对此不起作用。

最新更新