从CMake项目创建Debian软件包

enyaitl3  于 2022-12-29  发布在  其他
关注(0)|答案(2)|浏览(266)

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

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

我做了一些研究,当我使用CMake作为我的构建系统时,似乎至少存在三种不同的方法来创建Debian软件包:
1.使用Debian文档(第8章)中描述的debmake过程。
1.使用cmake-debhelper
1.使用dh-cmake
我已经研究了所有三种方法,似乎每一种都有一些优点和缺点。

德马克

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

cmake-debhelper

我尝试使用它,但收到了很多错误。github页面有一个open issue没有解决方案,所以我停止了寻找这个。这也是paho-mqtt-c构建系统目前正在使用的,但由于链接的问题,它不工作。

dh-cmake

我简单地看了一下这个,它似乎是最现代的解决方案,应该有可能与CPack合并。然而,似乎dh-cmake只适用于Ubuntu 18.04和16.04,但我使用的是Ubuntu 19.10,所以我无法在我的系统上安装dh-cmake。
我的研究是否遗漏了什么?从CMake管理的软件创建Debian软件包的推荐步骤是什么?哪些文档值得阅读?

but5z9lq

but5z9lq1#

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

debian/
 changelog
 control
 copyright
 rules

然后运行debuild,它会运行cmake install到临时文件夹,并从其中打包一个可安装的deb软件包。要快速创建这些debian文件,请运行dh_make --createorig并按s查看源代码包。然后您需要仔细编辑debian文件,如Debian New Maintainers' Guide的Chapter 4. Required files under the debian directory所述。
如果您需要设置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就不起作用了,因为它的buildbot无论如何都会运行debhelper(debuild的简短版本),所以它需要debian文件夹

q5lcpyga

q5lcpyga2#

或者您可以将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脚本,但它不适用于更多内容。

相关问题