5. ビルド済み配布物を作成する¶
“ビルド済み配布物” とは、おそらく皆さんが通常 “バイナリパッケージ” とか “インストーラ” (背景にしている知識によって違います) と考えているものです。とはいえ、配布物が必然的にバイナリ形式になるわけではありません。配布物には、Python ソースコード、かつ/またはバイトコードが入るからです; また、我々はパッケージという呼び方もしません。すでに Python の用語として使っているからです (また、”インストーラ” という言葉は主流のデスクトップシステム特有の用語です)
ビルド済み配布物は、モジュール配布物をインストール作業者にとってできるだけ簡単な状況にする方法です: ビルド済み配布物は、RPM ベースの Linux システムユーザにとってはバイナリ RPM、Windows ユーザにとっては実行可能なインストーラ、Debian ベースの Linux システムでは Debian パッケージ、などといった具合です。当然のことながら、一人の人間が世の中にある全てのプラットフォーム用にビルド済み配布物を作成できるわけではありません。そこで、Distutils の設計は。開発者が自分の専門分野 — コードを書き、ソース配布物を作成する — に集中できる一方で、パッケージ作成者 (packager) と呼ばれる、開発者とエンドユーザとの中間に位置する人々がソースコード配布物を多くのプラットフォームにおけるビルド済み配布物に変換できるようになっています。
もちろん、モジュール開発者自身がパッケージ作成者かもしれません; また、パッケージを作成するのはオリジナルの作成者が利用できないプラットフォームにアクセスできるような “外部の” ボランティアかもしれませんし、ソース配布物を定期的に取り込んで、アクセスできるかぎりのプラットフォーム向けにビルド済み配布物を生成するソフトウェアかもしれません。作業を行うのが誰であれ、パッケージ作成者は setup スクリプトを利用し、 bdist コマンドファミリを使ってビルド済み配布物を作成します。
単純な例として、Distutils ソースツリーから以下のコマンドを実行したとします:
python setup.py bdist
すると、Distutils はモジュール配布物 (ここでは Distutils 自体) をビルドし、”偽の (fake)” インストールを (build
ディレクトリで) 行います。そして現在のプラットフォームにおける標準の形式でビルド済み配布物を生成します。デフォルトのビルド済み形式とは、Unixでは “ダム (dumb)” の tar ファイルで、 Windows ではシンプルな実行形式のインストーラになります。(tar ファイルは、特定の場所に手作業で解凍しないと動作しないので、 “ダム: 賢くない” 形式とみなします。)
従って、 Unix システムで上記のコマンドを実行すると、 Distutils-1.0.plat.tar.gz
を作成します; この tarball を正しい場所で解凍すると、ちょうどソース配布物をダウンロードして python setup.py install
を実行したのと同じように、正しい場所に Distutils がインストールされます。 (“正しい場所 (right place)” とは、ファイルシステムのルート下か、 Python の prefix
ディレクトリ下で、これは bdist_dumb に指定するコマンドで変わります; デフォルトの設定では、 prefix
からの相対パスにインストールされるダム配布物が得られます。)
言うまでもなく、pure Python 配布物の場合なら、python setup.py install
するのに比べて大して簡単になったとは言えません—しかし、非 pure 配布物で、コンパイルの必要な拡張モジュールを含む場合、拡張モジュールを利用できるか否かという大きな違いになりえます。また、RPM パッケージや Windows 用の実行形式インストーラのような “スマートな” ビルド済み配布物を作成しておけば、たとえ拡張モジュールが一切入っていなくてもユーザにとっては便利になります。
The bdist command has a --formats
option, similar to the
sdist command, which you can use to select the types of built
distribution to generate: for example,
python setup.py bdist --format=zip
とすると、Unix システムでは、 Distutils-1.0.plat.zip
を作成します— 先にも述べたように、Distutils をインストールするには、このアーカイブ形式をルートディレクトリ下で展開します。
ビルド済み配布物として利用できる形式を以下に示します:
フォーマット |
説明 |
注釈 |
---|---|---|
gztar |
gzip 圧縮された tar ファイル ( |
(1) |
bztar |
bzip 圧縮された tar ファイル ( |
|
xztar |
xzip 圧縮された tar ファイル ( |
|
ztar |
compress 圧縮された tar ファイル ( |
(3) |
tar |
tar ファイル ( |
|
zip |
zip ファイル ( |
(2),(4) |
rpm |
RPM 形式 |
(5) |
pkgtool |
Solaris pkgtool 形式 |
|
sdux |
HP-UX swinstall 形式 |
|
wininst |
Windows 用の自己展開形式 ZIP ファイル |
(4) |
msi |
マイクロソフト・インストーラー。 |
バージョン 3.5 で変更: xztar
形式のサポートが追加されました。
注釈:
Unixでのデフォルト形式です
Windows でのデフォルト形式です
外部の compress ユーティリティが必要です。
外部ユーティリティの zip か、
zipfile
モジュール (Python 1.6 からは標準 Python ライブラリの一部になっています) が必要です外部ユーティリティの rpm 、バージョン 3.0.4 以上が必要です (バージョンを調べるには、
rpm --version
とします)
You don’t have to use the bdist command with the --formats
option; you can also use the command that directly implements the format you’re
interested in. Some of these bdist “sub-commands” actually generate
several similar formats; for instance, the bdist_dumb command
generates all the “dumb” archive formats (tar
, gztar
, bztar
,
xztar
, ztar
, and zip
), and bdist_rpm generates both
binary and source RPMs. The bdist sub-commands, and the formats
generated by each, are:
コマンド |
Formats |
---|---|
bdist_dumb | tar, gztar, bztar, xztar, ztar, zip |
bdist_rpm | rpm, srpm |
bdist_wininst | wininst |
bdist_msi | msi |
bdist_* コマンドについては、以下の節で詳しく述べます。
5.1. RPM パッケージを作成する¶
RPM 形式は、Red Hat, SuSE, Mandrake といった、多くの一般的な Linux ディストリビューションで使われています。普段使っているのがこれらの環境のいずれか (またはその他の RPM ベースの Linux ディストリビューション) なら、同じディストリビューションを使っている他のユーザ用に RPM パッケージを作成するのはとるに足らないことでしょう。一方、モジュール配布物の複雑さや、Linux ディストリビューション間の違いにもよりますが、他の RPM ベースのディストリビューションでも動作するような RPM を作成できるかもしれません。
通常、モジュール配布物の RPM を作成するには、 bdist_rpm コマンドを使います:
python setup.py bdist_rpm
or the bdist command with the --format
option:
python setup.py bdist --formats=rpm
前者の場合、 RPM 特有のオプションを指定できます; 後者の場合、一度の実行で複数の形式を指定できます。両方同時にやりたければ、それぞれの形式について各コマンドごとにオプション付きで bdist_* コマンドを並べます:
python setup.py bdist_rpm --packager="John Doe <jdoe@example.org>" \
bdist_wininst --target-version="2.0"
Distutils が setup スクリプトで制御されているのとほとんど同じく、 RPM パッケージの作成は、 .spec
で制御されています。 RPM の作成を簡便に解決するため、 bdist_rpm コマンドでは通常、 setup スクリプトに与えた情報とコマンドライン、そして Distutils 設定ファイルに基づいて .spec
ファイルを作成します。 .spec
ファイルの様々なオプションやセクション情報は、以下のようにして setup スクリプトから取り出されます:
RPM |
Distutils setup スクリプト内のオプション |
---|---|
名前 |
name |
Summary (preamble 内) |
description |
Version | version |
Vendor |
|
Copyright | license |
Url | url |
%description (section) | long_description |
また、 .spec
ファイル内の多くのオプションは、 setup スクリプト中に対応するオプションがありません。これらのほとんどは、以下に示す bdist_rpm コマンドのオプションで扱えます:
RPM |
bdist_rpm オプション |
デフォルト値 |
---|---|---|
リリース |
release |
“1” |
Group | group |
“Development/Libraries” |
Vendor | vendor |
(上記参照) |
Packager | packager |
(none) |
Provides | provides |
(none) |
Requires | requires |
(none) |
Conflicts | conflicts |
(none) |
Obsoletes | obsoletes |
(none) |
Distribution | distribution_name |
(none) |
BuildRequires | build_requires |
(none) |
Icon | icon |
(none) |
Obviously, supplying even a few of these options on the command-line would be
tedious and error-prone, so it’s usually best to put them in the setup
configuration file, setup.cfg
—see section setup 設定ファイル (setup configuration file) を書く. If
you distribute or package many Python module distributions, you might want to
put options that apply to all of them in your personal Distutils configuration
file (~/.pydistutils.cfg
). If you want to temporarily disable
this file, you can pass the --no-user-cfg
option to setup.py
.
バイナリ形式の RPM パッケージを作成する際には三つの段階があり、Distutils はこれら全ての段階を自動的に処理します:
RPM パッケージの内容を記述する
.spec
ファイルを作成します (.spec
ファイルは setup スクリプトに似たファイルです; 実際、 setup スクリプトのほとんどの情報が.spec
ファイルから引き揚げられます)ソース RPM を作成します
“バイナリ (binary)” RPM を生成します (モジュール配布物に Python 拡張モジュールが入っているか否かで、バイナリコードが含まれることも含まれないこともあります)
通常、RPM は最後の二つのステップをまとめて行います; Distutils を使うと、普通は三つのステップ全てをまとめて行います。
If you wish, you can separate these three steps. You can use the
--spec-only
option to make bdist_rpm just create the
.spec
file and exit; in this case, the .spec
file will be
written to the “distribution directory”—normally dist/
, but
customizable with the --dist-dir
option. (Normally, the .spec
file winds up deep in the “build tree,” in a temporary directory created by
bdist_rpm.)
5.2. Windows インストーラを作成する¶
実行可能なインストーラは、Windows 環境ではごく自然なバイナリ配布形式です。インストーラは結構なグラフィカルユーザインタフェースを表示して、モジュール配布物に関するいくつかの情報を setup スクリプト内のメタデータから取り出して示し、ユーザがいくつかのオプションを選んだり、インストールを決行するか取りやめるか選んだりできるようにします。
メタデータは setup スクリプトから取り出されるので、Windows インストーラの作成は至って簡単で、以下を実行するだけです:
python setup.py bdist_wininst
or the bdist command with the --formats
option:
python setup.py bdist --formats=wininst
(pure Python モジュールとパッケージだけの入った) pure モジュール配布物の場合、作成されるインストーラは実行バージョンに依存しない形式になり、 foo-1.0.win32.exe
のような名前になります。 pure モジュールの Windows インストーラは Unix や Mac OS X でも作成できます。
非 pure 配布物の場合、拡張モジュールは Windows プラットフォーム上だけで作成でき、Python のバージョンに依存したインストーラになります。インストーラのファイル名もバージョン依存性を反映して、 foo-1.0.win32-py2.0.exe
のような形式になります。従って、サポートしたい全てのバージョンの Python に対して、別々のインストーラを作成しなければなりません。
The installer will try to compile pure modules into bytecode after installation
on the target system in normal and optimizing mode. If you don’t want this to
happen for some reason, you can run the bdist_wininst command with
the --no-target-compile
and/or the --no-target-optimize
option.
By default the installer will display the cool “Python Powered” logo when it is
run, but you can also supply your own 152x261 bitmap which must be a Windows
.bmp
file with the --bitmap
option.
The installer will also display a large title on the desktop background window
when it is run, which is constructed from the name of your distribution and the
version number. This can be changed to another text by using the
--title
option.
The installer file will be written to the “distribution directory” — normally
dist/
, but customizable with the --dist-dir
option.
5.3. Windows でのクロスコンパイル¶
Python 2.6 から、distutils は Windows プラットフォーム間でのクロスコンパイルに対応しました。これによって、必要なツールがインストールされていれば、32bit 版の Windows で 64bit 版の拡張を作成したり、その逆が可能になりました。
To build for an alternate platform, specify the --plat-name
option
to the build command. Valid values are currently ‘win32’, ‘win-amd64’ and
‘win-ia64’. For example, on a 32bit version of Windows, you could execute:
python setup.py build --plat-name=win-amd64
Windows インストーラもこのオプションをサポートしています。なので次のコマンドを実行すると:
python setup.py build --plat-name=win-amd64 bdist_wininst
64bit のインストーラを32bitのWindowsで作成できます。
クロスコンパイルするためには、Python のソースコードをダウンロードして Python 自体をターゲットのプラットフォーム用にクロスコンパイルしなければなりません。 Python のバイナリインストールからではクロスコンパイルできません。(他のプラットフォーム用の .lib などのファイルが含まれないからです。) 具体的に言えば、拡張のクロスコンパイルができるようになるには、 32bit OS のユーザーは Visual Studio 2008 を使って Python ソースツリー内の PCBuild/PCbuild.sln
ソリューションファイルを開き、 “x64” コンフィギュレーションで ‘pythoncore’ プロジェクトをビルドしなければなりません。
デフォルトでは、Visual Studio 2008 は 64bit のコンパイラーなどのツールをインストールしないことに注意してください。Visual Studio セットアッププロセスを再実行して、それらのツールを選択する必要があるでしょう。(コントロールパネル -> [追加と削除] から簡単に既存のインストールをチェック、修正できます。)
5.3.1. インストール後実行スクリプト (postinstallation script)¶
Starting with Python 2.3, a postinstallation script can be specified with the
--install-script
option. The basename of the script must be
specified, and the script filename must also be listed in the scripts argument
to the setup function.
This script will be run at installation time on the target system after all the
files have been copied, with argv[1]
set to -install
, and again at
uninstallation time before the files are removed with argv[1]
set to
-remove
.
Windows インストーラでは、インストールスクリプトは埋め込みで実行され、全ての出力 (sys.stdout
、sys.stderr
) はバッファにリダイレクトされ、スクリプトの終了後に GUI 上に表示されます。
インストールスクリプトでは、インストール/アンインストールのコンテキストで特に有用ないくつかの機能を、追加の組み込み関数として利用することができます。
-
directory_created
(path)¶ -
file_created
(path)¶ これらの関数は、インストール後実行スクリプトがディレクトリやファイルを作成した際に呼び出さなければなりません。この関数はアンインストーラに作成された path を登録し、配布物をアンインストールする際にファイルが消されるようにします。安全を期すために、ディレクトリは空の時にのみ削除されます。
-
get_special_folder_path
(csidl_string)¶ この関数は、「スタートメニュー」や「デスクトップ」といった、Windows における特殊なフォルダ位置を取得する際に使えます。この関数はフォルダのフルパスを返します。csidl_string は以下の文字列のいずれかでなければなりません:
"CSIDL_APPDATA" "CSIDL_COMMON_STARTMENU" "CSIDL_STARTMENU" "CSIDL_COMMON_DESKTOPDIRECTORY" "CSIDL_DESKTOPDIRECTORY" "CSIDL_COMMON_STARTUP" "CSIDL_STARTUP" "CSIDL_COMMON_PROGRAMS" "CSIDL_PROGRAMS" "CSIDL_FONTS"
該当するフォルダを取得できなかった場合、
OSError
が送出されます。どの種類のフォルダを取得できるかは、特定の Windows のバージョンごとに異なります。また、おそらく設定によっても異なるでしょう。詳細については、
SHGetSpecialFolderPath()
関数に関する Microsoft のドキュメントを参照してください。
-
create_shortcut
(target, description, filename[, arguments[, workdir[, iconpath[, iconindex]]]])¶ この関数はショートカットを作成します。 target はショートカットによって起動されるプログラムへのパスです。 description はショートカットに対する説明です。 filename はユーザから見えるショートカットの名前です。コマンドライン引数があれば、 arguments に指定します。 workdir はプログラムの作業ディレクトリです。 iconpath はショートカットのためのアイコンが入ったファイルで、 iconindex はファイル iconpath 中のアイコンへのインデクスです。これについても、詳しくは
IShellLink
インタフェースに関する Microsoft のドキュメントを参照してください。
5.4. Vista のユーザアカウント制御 (UAC)¶
Starting with Python 2.6, bdist_wininst supports a --user-access-control
option. The default is ‘none’ (meaning no UAC handling is done), and other
valid values are ‘auto’ (meaning prompt for UAC elevation if Python was
installed for all users) and ‘force’ (meaning always prompt for elevation).