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

时间:2011-08-30 20:32:34

标签: python cmake packages deb cpack

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

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

编写setup.py脚本后,我想知道如何将这些文件添加到 CPack 配置中,以便{...}}在用户安装时{}}自动执行使用setup.py在系统上打包。

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

2 个答案:

答案 0 :(得分:13)

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

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

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

在你的主要 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

这就是它!

答案 1 :(得分:1)

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