March 31, 2024

Debian12でPython3.12のdebパッケージを作る

前回、Debian12にPython3.12をソースからインストールできたので、debパッケージを作ってみた。

作成したパッケージはDebianにアップロードせず、自身の環境でのみ使う簡易手順。
ちゃんとした手順はちゃんとした人が考えてくれるはず。

用意したもの

前回と同じくDebian 12を最小構成でセットアップしたVM
amd64(x86_64)でも、arm64(aarch64)どちらでも

手順

メンテナー情報

作ったdebパッケージのメンテナー情報(これを読んでいるあなたのこと)を書いておく。

~/.bashrc

DEBEMAIL="your.email.address@example.org"
DEBFULLNAME="Firstname Lastname"
export DEBEMAIL DEBFULLNAME

パッケージ追加

sudo apt update
sudo apt upgrade
sudo apt install curl build-essential libssl-dev zlib1g-dev devscripts debmake -y

前回と同じように、必要なものがあればaptでパッケージ追加しておく。

The following modules are *disabled* in configure script:
_sqlite3

The necessary bits to build these optional modules were not found:
_bz2                  _ctypes               _ctypes_test
_curses               _curses_panel         _dbm
_gdbm                 _lzma                 _tkinter
_uuid                 nis                   readline
To find the necessary bits, look in configure.ac and config.log.
モジュール対応するaptパッケージ
_sqlite3libsqlite3-dev
_bz2libbz2-dev
_ctypeslibffi-dev
_ctypes_testlibffi-dev
_curseslibncurses-dev
_curses_panellibncurses-dev
_dbmlibgdbm-compat-dev
_gdbmlibgdbm-dev
_lzmaliblzma-dev
_tkintertk-dev
_uuiduuid-dev
nis不明、今時NISは要らないと思う…
readlinelibreadline-dev

全部追加するならこれ

sudo apt install libsqlite3-dev libbz2-dev libffi-dev libncurses-dev libgdbm-compat-dev libgdbm-dev liblzma-dev tk-dev uuid-dev libreadline-dev

作成

mkdir -p ~/mypkg/python312
cd ~/mypkg/python312
curl -OL https://www.python.org/ftp/python/3.12.2/Python-3.12.2.tar.xz
tar xf Python-3.12.2.tar.xz
mv Python-3.12.2 python312-3.12.2
tar czf python312-3.12.2.tar.gz python312-3.12.2
cd python312-3.12.2
debmake

debmakeの最後の辺りで聞かれる↓の質問は、Pythonスクリプトのdebパッケージを作るのではなく、Pythonそのもののバイナリパッケージを作りたいから"y"で良いはず…多分

W: many ext = "python" type extension programs without matching -b set.
?: -b":python, ..." or -b":python3" missing. Continue? [Y/n]: y

debianディレクトリの以下のファイルを書き換える

debian/control

Source: python312
Section: python
Priority: optional
Maintainer: Firstname Lastname <your.email.address@example.org>
Build-Depends: debhelper-compat (= 13)
Standards-Version: 4.5.1
Homepage: https://www.python.org/
Rules-Requires-Root: no

Package: python312
Architecture: arm64 # arm64かamd64
Multi-Arch: allowed
Depends: ${misc:Depends}, ${shlibs:Depends}
Description: auto-generated package by debmake
 This Debian binary package was auto-generated by the
 debmake(1) command provided by the debmake package.

debian/changelog はそのままでも良い

python312 (3.12.2-1) UNRELEASED; urgency=low

  * Initial release. Closes: #nnnn
    <nnnn is the bug number of your ITP>

 -- Firstname Lastname <your.email.address@example.org>  Fri, 08 Mar 2024 04:28:05 +0000

debian/rules (パーミッションは755、空白ではなくタブ)

#!/usr/bin/make -f

%:
	dh $@ --without autoreconf

override_dh_auto_configure:
	./configure --prefix=/opt/python312 --enable-optimizations --with-lto

パッケージ作成

debuild -us -uc -ui -b

作成したパッケージをインストール

1つ上のディレクトリにpython312_3.12.2-1_$(dpkg-architecture -q DEB_BUILD_ARCH).debができているはず
scpや何らかの方法でインストールしたいサーバーの/tmpへ移す

インストール

sudo apt install /tmp/python312_3.12.2-1_a*64.deb

※ /tmpに置かなくてもインストールはできるけど、_aptというユーザーがアクセスできる場所でないとパッケージの検証ができなくて以下のメッセージが表示される。

N: Download is performed unsandboxed as root as file '/root/python312_3.12.2-1_arm64.deb' couldn't be accessed by user '_apt'. - pkgAcquire::Run (13: Permission denied)

Python 3.11との共存

Debian 12はデフォルトでPython 3.11がインストールされていて /usr/bin/python3python3.11 へのシンボリックリンクとなっている。
update-alternatives で切り替えられるようにする。

sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.11 1
sudo update-alternatives --install /usr/bin/python3 python3 /opt/python312/bin/python3.12 2
python3 --version

一次情報源

© 2020 nissy-lab.com