#
6 ビルド済み配布物を作成する

``ビルド済み配布物'' とは、おそらく皆さんが通常 ``バイナリパッケージ'' とか ``インストーラ'' (背景にしている知識によって違います) と考えて いるものです。とはいえ、配布物が必然的にバイナリ形式になるわけでは ありません。配布物には、 Python ソースコード、かつ/またはバイトコード が入るからです; また、我々はパッケージという呼び方もしません。 すでに Python の用語として使っているからです (また、 ``インストーラ'' という言葉は Windows 特有の用語です

##
6.1 ダム形式のビルド済み配布物を作成する

##
6.2 RPM パッケージを作成する

RPM 形式は、Red Hat, SuSE, Mandrake といった、多くの一般的な Linux ディストリビューションで使われています。普段使っているのがこれらの 環境のいずれか (またはその他の RPM ベースの Linux ディストリビューション) なら、同じディストリビューションを使っている 他のユーザ用に RPM パッケージを作成するのはとるに足らないことでしょう。 一方、モジュール配布物の複雑さや、 Linux ディストリビューション間の 違いにもよりますが、他の RPM ベースのディストリビューションでも動作 するような RPM を作成できるかもしれません。

通常、モジュール配布物の RPM を作成するには、`bdist_rpm` コマンドを使います:

    python setup.py bdist_rpm

あるいは、`bdist` コマンドを --format オプション付きで使います:

    python setup.py bdist --formats=rpm

前者の場合、 RPM 特有のオプションを指定できます; 後者の場合、 一度の実行で複数の形式を指定できます。両方同時にやりたければ、 それぞれの形式について各コマンドごとにオプション付きで `bdist_*` コマンドを並べます:

    python setup.py bdist_rpm --packager="John Doe <jdoe@python.net>" \
                    bdist_wininst --target_version="2.0"

Distutils が setup スクリプトで制御されているのとほとんど同じく、 RPM パッケージの作成は、 .spec で制御されています。 RPM の作成を簡便に解決するため、`bdist_rpm` コマンドでは 通常、 setup スクリプトに与えた情報とコマンドライン、そして Distutils 設定ファイルに基づいて .spec ファイルを作成します。 .spec ファイルの様々なオプションやセクション情報は、 以下のようにして setup スクリプトから取り出されます:

RPM .spec ファイルのオプションまたはセクション | Distutils setup スクリプト内のオプション
--- | ---
Name | name
Summary (preamble 内) | description
Version | version
Vendor | author と author_email, または & maintainer と maintainer_email
Copyright | licence
Url | url
%description (セクション) | long_description

また、.spec ファイル内の多くのオプションは、 setup スクリプト 中に対応するオプションがありません。これらのほとんどは、以下に示す `bdist_rpm` コマンドのオプションで扱えます:

RPM .spec ファイルのオプションまたはセクション | `bdist_rpm` オプション | デフォルト値
--- | --- | ---
Release | 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)

言うまでもなく、こうしたオプションをコマンドラインで指定するのは 面倒だし、エラーの元になりますから、普通は setup.cfg に 書いておくのがベストです -- 4 節を参照してください。 沢山の Python モジュール配布物を配布したりパッケージ化したりしている のなら、配布物全部に当てはまるオプションを個人用の Distutils 設定 ファイル (~/.pydistutils.cfg) に入れられます。

バイナリ形式の RPM パッケージを作成する際には三つの段階があり、 Distutils はこれら全ての段階を自動的に処理します:

1. RPM パッケージの内容を記述する .spec ファイルを作成します (.spec ファイルは setup スクリプトに似たファイルです; 実際、 setup スクリプトのほとんどの情報が .spec ファイルから 引き揚げられます)
2. ソース RPM を作成します
3. ``バイナリ (binary)'' RPM を生成します (モジュール配布物に Python 拡張モジュールが入っているか否かで、バイナリコードが 含まれることも含まれないこともあります)

通常、RPM は最後の二つのステップをまとめて行います; Distutils を使うと、普通は三つのステップ全てをまとめて行います。

望むなら、これらの三つのステップを分割できます。`bdist_rpm` コマンドに --spec-only を指定すれば、単に .spec を作成して終了します; この場合、.spec ファイルは ``配布物ディレクトリ (distribution directory)''-- 通常は dist/ に作成されますが、 --dist-dir オプションで変更することもできます。(通常、 .spec ファイルは ``ビルドツリー (build tree)''、すなわち `build_rpm` が作成する一時ディレクトリの中から引き揚げられます。)

##
6.3 Windows インストーラを作成する

実行可能なインストーラは、Windows 環境ではごく自然なバイナリ配布形式 です。インストーラは結構なグラフィカルユーザインタフェースを表示して、 モジュール配布物に関するいくつかの情報を setup スクリプト内のメタデータ から取り出して示し、ユーザがいくつかのオプションを選んだり、インストール を決行するか取りやめるか選んだりできるようにします。

メタデータは setup スクリプトから取り出されるので、Windows インストーラ の作成は至って簡単で、以下を実行するだけです:

    python setup.py bdist_wininst

あるいは、`bdist` コマンドを --formats オプション付きで実行します:

    python setup.py bdist --formats=wininst

(pure Python モジュールとパッケージだけの入った) pure モジュール 配布物の場合、作成されるインストーラは実行バージョンに依存しない 形式になり、 foo-1.0.win32.exe のような名前になります。 pure モジュールの Windows インストーラは Unix や MacOS といったプラットフォームでも作成できます。

非 pure 配布物の場合、拡張モジュールは Windows プラットフォーム上 だけで作成でき、Python のバージョンに依存したインストーラになります。 インストーラのファイル名もバージョン依存性を反映して、 foo-1.0.win32-py2.0.exe のような形式になります。 従って、サポートしたい全てのバージョンの Python に対して、 別々のインストーラを作成しなければなりません。

インストーラは、ターゲットとなるシステムにインストールを実行 した後、 pure モジュールを通常 (normal) モードと最適化 (optimizing) モードでコンパイルしようと試みます。何らかの理由があってコンパイル させたくなければ、`bdist_wininst` コマンドを --no-target-compile かつ/または --no-target-optimize オプション付きで実行します。

デフォルトでは、インストーラは実行時にクールな ``Python Powered'' ロゴを表示しますが、自作のビットマップ画像も指定できます。 画像は Windows の .bmp ファイル形式でなくてはならず、 --bitmap オプションで指定します。

インストーラを起動すると、デスクトップの背景ウィンドウ上にでっかい タイトルも表示します。タイトルは配布物の名前とバージョン番号から 作成します。--title オプションを使えば、 タイトルを別のテキストに変更できます。

インストーラファイルは ``配布物ディレクトリ (distribution directory)'' -- 通常は dist/ に作成されますが、--dist-dir オプションで指定することもできます。

###
6.3.1 インストール後実行スクリプト (postinstallation script)

Python 2.3 からは、インストール実行後スクリプトを --install-script オプションで指定できるように なりました。スクリプトはディレクトリを含まないベースネーム (basename) で指定しなければならず、スクリプトファイル名は setup 関数の scripts 引数中に挙げられていなければなりません。

指定したスクリプトは、インストール時、ターゲットとなるシステム上で 全てのファイルがコピーされた後に実行されます。このとき argv[1] を ``-install'' に設定します。また、アンインストール時には、 ファイルを削除する前に argv[1] を ``-remove'' に設定して 実行します。

Windows インストーラでは、インストールスクリプトは埋め込みで実行 され、全ての出力 (sys.stdout、 sys.stderr) はバッファにリダイレクト され、スクリプトの終了後に GUI 上に表示されます。

インストール後実行スクリプトでは、インストール/アンインストール のコンテキストで特に有用な機能をいくつか使えます。

    directory_created(pathname)
    file_created(pathname)

これらの関数は、インストール後実行スクリプトがディレクトリやファイル を作成した際に呼び出さなければなりません。この関数はアンインストーラ に作成されたパス名を登録し、配布物をアンインストールする際にファイルが 消されるようにします。安全を期すために、ディレクトリは空の時にのみ 削除されます。

    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 の ドキュメントを参照してください。