【问题标题】:How to build debian package with CPack to execute setup.py?如何使用 CPack 构建 debian 包来执行 setup.py?
【发布时间】:2023-03-12 07:30:02
【问题描述】:

到目前为止,我的项目只有 .cpp 文件被编译成不同的二进制文件,我设法配置 CPack 来构建一个合适的 debian 包 没有任何问题。

最近我编写了几个 python 应用程序并将它们添加到项目中,以及一些我也想合并到包中的自定义模块。

在编写了setup.py 脚本后,我想知道如何将这些文件添加到 CPack 配置中,以便在用户在系统上安装软件包时自动执行setup.py get dpkg -i package.deb

我正在努力寻找有关如何配置 CPack 以安装自定义 python 应用程序/模块的相关信息。有人试过吗?

【问题讨论】:

标签: python cmake packages deb cpack


【解决方案1】:

我想出了一个办法,但这并不是很简单。我会尽力解释程序,所以请耐心等待。

这种方法的想法是使用 postinstprerm 从系统中安装和删除 python 应用程序。

在定义项目的 CMakeLists.txt 中,您需要声明 CPACK 将用于生成 .deb 包。有一些变量需要填写与包本身相关的信息,但是一个名为 CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA 的变量非常重要,因为它用于指定 postinstprerm 的位置,它们是 debian 打包系统 的标准脚本,在安装/删除软件包时由 dpkg 自动执行。

在你的 ma​​in CMakeLists.txt 的某个时刻,你应该有这样的东西:

add_subdirectory(name_of_python_app)

set(CPACK_COMPONENTS_ALL_IN_ONE_PACKAGE 1)

set(CPACK_PACKAGE_NAME "fake-package")
set(CPACK_PACKAGE_VENDOR "ACME")
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "fake-package - brought to you by ACME")
set(CPACK_PACKAGE_VERSION "1.0.2")
set(CPACK_PACKAGE_VERSION_MAJOR "1")
set(CPACK_PACKAGE_VERSION_MINOR "0")
set(CPACK_PACKAGE_VERSION_PATCH "2")
SET(CPACK_SYSTEM_NAME "i386")

set(CPACK_GENERATOR "DEB")
set(CPACK_DEBIAN_PACKAGE_MAINTAINER "ACME Technology")
set(CPACK_DEBIAN_PACKAGE_DEPENDS "libc6 (>= 2.3.1-6), libgcc1 (>= 1:3.4.2-12), python2.6, libboost-program-options1.40.0 (>= 1.40.0)")
set(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA "${CMAKE_SOURCE_DIR}/name_of_python_app/postinst;${CMAKE_SOURCE_DIR}/name_of_python_app/prerm;")
set(CPACK_SET_DESTDIR "ON")

include(CPack)

其中一些变量是可选的,但出于教育目的,我会用信息填充它们。

现在,让我们看一下脚本:

postinst

#!/bin/sh
# postinst script for fake_python_app

set -e

cd /usr/share/pyshared/fake_package
sudo python setup.py install

预售

#!/bin/sh
# prerm script
#
# Removes all files installed by: ./setup.py install
sudo rm -rf /usr/share/pyshared/fake_package
sudo rm /usr/local/bin/fake_python_app

如果您注意到,脚本 postinst 会进入 /usr/share/pyshared/fake_package 并执行放置在那里的 setup.py 以在系统上安装应用程序。这个文件来自哪里以及它是如何在那里结束的?此文件由您创建,当您的软件包安装在系统上时,它将被复制到该位置。这个动作配置在name_of_python_app/CMakeLists.txt:

install(FILES setup.py
        DESTINATION "/usr/share/pyshared/fake_package"
)

install(FILES __init__.py
        DESTINATION "/usr/share/pyshared/fake_package/fake_package"
)

install(FILES fake_python_app
        DESTINATION "/usr/share/pyshared/fake_package/fake_package"
)

install(FILES fake_module_1.py
        DESTINATION "/usr/share/pyshared/fake_package/fake_package"
)

install(FILES fake_module_2.py
        DESTINATION "/usr/share/pyshared/fake_package/fake_package"
)

您可能知道,除了我要安装的 python 应用程序之外,我还编写了 2 个自定义 python 模块,它们也需要安装。下面我描述了最重要的文件的内容:

setup.py

#!/usr/bin/env python
from distutils.core import setup

setup(name='fake_package',
      version='1.0.5',
      description='Python modules used by fake-package',
      py_modules=['fake_package.fake_module_1', 'fake_package.fake_module_2'],
      scripts=['fake_package/fake_python_app']
     )

_init_.py:是一个空文件。

fake_python_app:将安装在 /usr/local/bin 中的 Python 应用程序

差不多就是这样!

【讨论】:

  • 你能用 install(DIRECTORY fake_package DESTINATION /usr/share/pyshared/ USE_SOURCE_PERMISSIONS) 吗?
  • 我不知道,我猜你将不得不进行实验。
【解决方案2】:

setup.py 文件相当于标准 unix 源代码分发版的 configure && make && make install 舞蹈,因此不适合作为分发包安装过程的一部分运行。请参阅 this discussion 了解将 Python 模块包含在 .deb 包中的不同方法。

【讨论】:

  • 谢谢,我以前读过,但我不能使用那些工具,我必须用 CMake/CPack 来做。
  • 那么您可能必须自己手动实现Debian Python Policy,但我很确定您不使用现有工具来构建 debs 会让您的生活变得艰难。
  • 我发现 CPack 非常简单易用。但是我需要它做的事情有点复杂。我将在这里发布我的方法,以便你们判断它:)
  • 我猜讨论的链接坏了。
猜你喜欢
  • 2020-09-19
  • 2011-07-11
  • 2012-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-04
  • 2015-05-27
  • 2018-03-25
相关资源
最近更新 更多