AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 519986
Accepted
Stewart
Stewart
Asked: 2019-05-21 07:05:24 +0800 CST2019-05-21 07:05:24 +0800 CST 2019-05-21 07:05:24 +0800 CST

为 Debian 打包 CMake 组件

  • 772

我有一个使用 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文件?

packaging deb
  • 1 1 个回答
  • 1632 Views

1 个回答

  • Voted
  1. Best Answer
    Stewart
    2019-05-21T07:05:24+08:002019-05-21T07:05:24+08:00

    一个标准的 debhelperdebain/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) 开始,它还不可用。

    • 2

相关问题

  • 构建 Debian 软件包时出现“无法创建本地存储库”错误

  • DEB:多包,在包构建过程中忽略某些文件的安装

  • 是否有 .sh 安装程序(软件存档附加到 .sh 平面文本文件)为 unix 生成工具?

  • 不同类别的 Linux 软件包

  • 为 Linux 制作下载和安装风格的程序

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve