如何使用CPack构建debian包来执行setup.py?

发布于 2024-12-02 13:38:24 字数 402 浏览 0 评论 0原文

到目前为止,我的项目只有 .cpp 文件被编译成不同的二进制文件,并且我设法配置 CPack 来构建正确的 debian 包,而无需任何问题。

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

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

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

Until now, my project had only .cpp files that were compiled into different binaries and I managed to configure CPack to build a proper debian package without any problems.

Recently I wrote a couple of python applications and added them to the project, as well as some custom modules that I would also like to incorporate to the package.

After writing a setup.py script, I'm wondering how to add these files to the CPack configuration in a way that setup.py get's executed automatically when the user installs the package on the system with dpkg -i package.deb.

I'm struggling to find relevant information on how to configure CPack to install custom python applications/modules. Has anyone tried this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

你的背包 2024-12-09 13:38:24

我想出了一种方法,但它不是很简单。我会尽力解释该过程,所以请耐心等待。

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

在定义项目的 CMakeLists.txt 中,您需要声明 CPACK 将用于生成 .deb 包。有一些变量需要填充与包本身相关的信息,但是名为 CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA 的变量非常重要,因为它用于指定 postinst的位置prerm,它们是 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

prerm

#!/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 :你的 python 应用程序将安装在 /usr/local/bin 中

,仅此而已!

I figured out a way to do it but it's not very simple. I'll do my best to explain the procedure so please be patient.

The idea of this approach is to use postinst and prerm to install and remove the python application from the system.

In the CMakeLists.txt that defines the project, you need to state that CPACK is going to be used to generate a .deb package. There's some variables that need to be filled with info related to the package itself, but one named CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA is very important because it's used to specify the location of postinst and prerm, which are standard scripts of the debian packaging system that are automatically executed by dpkg when the package is installed/removed.

At some point of your main CMakeLists.txt you should have something like this:

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)

Some of these variables are optional, but I'm filling them with info for educational purposes.

Now, let's take a look at the scripts:

postinst:

#!/bin/sh
# postinst script for fake_python_app

set -e

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

prerm:

#!/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

If you noticed, script postinst enters at /usr/share/pyshared/fake_package and executes the setup.py that is laying there to install the app on the system. Where does this file come from and how it ends up there? This file is created by you and will be copied to that location when your package is installed on the system. This action is configured in 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"
)

As you can probably tell, besides the python application I want to install there's also 2 custom python modules that I wrote that also need to be installed. Below I describe the contents of the most important files:

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: is an empty file.

fake_python_app : your python application that will be installed in /usr/local/bin

And that's pretty much it!

东京女 2024-12-09 13:38:24

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

A setup.py file is the equivalent of the configure && make && make install dance for a standard unix source distribution and as such is inappropriate to run as a part of a distributions package install process. See this discussion of the different ways to include Python modules in a .deb package.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文