Wine パッケージガイドライン

提供: ArchWiki
2023年6月28日 (水) 22:59時点におけるKgx (トーク | 投稿記録)による版 (→‎サンプル: リンクを修正)
ナビゲーションに移動 検索に移動

Windows プログラムにも Linux で役に立つものがたくさんあります。Windows プログラムのパッケージも作ることが可能です。オペレーティングシステムの違いがあるためにやや面倒なところがあります。このガイドラインでは Win32 バイナリについて記述します。ソースが利用できるプロジェクトが Linux に移植されているためです。

確認事項

  • ライセンス: ライセンスがプログラムの再配布を許可しているか。
  • インストーラー: ユーザーが特に操作しなくてもプログラムをインストールできるか。インストーラー不要のバージョンは存在するか。
  • ポータビリティ: プログラムはポータブルか。ファイルシステムを汚さないか。

プログラムがポータブルかどうかというのはレジストリやプログラムディレクトリの外に書き込みを行わないことを意味します。ファイルシステムを汚さないプログラムとはユーザーフォルダに設定を書き込むプログラムを意味します。両方の条件を満たすプログラム (例: 設定をどこにも書き込まない) もあれば、どちらにも当てはまらないプログラも存在します (例: あらゆるところに書き込みを行う)。

ライセンス

通常、ライセンスはインストールディレクトリにテキストファイルの形で存在します。見つけられない場合、インストール時の表示を確認してください。大抵のライセンスはファイルの削除や再パッケージを許可していません。前者の場合、makepkg の処理によってファイルが消えないように注意する必要があります。post_install で無駄なファイルを削除してしまう可能性があるためです (例: アンインストーラー)。後者の場合、インストールは全て post_install で行う必要があります。build ではインストールファイルのコピーだけを行います。

インストーラ

Windows インストーラーよりも .zip などの圧縮ファイルのほうがパッケージにするのが簡単です。プログラムがインストーラーによってしか配布されていない場合、インターネットを検索してソフトウェアをユーザーの操作なしでインストールする方法がないか探してください。検索する場所としては MSFN が良いでしょう。方法が見つからない場合、解凍ユーティリティを使ってインストーラーを解凍できないか試してみてください。

ポータビリティ

ポータブルなプログラムであれば Wine でファイルシステムをエミュレートする必要はありません。パッケージングするプログラムにポータブル版が存在しないか Portable Freeware で確認してみてください。

ガイドライン

Windows のプログラムをパッケージ化するということは、プログラムのファイルを JVM と Java のバイトコードと同じように、Wine が解釈するただのデータとして使うことです。

したがって、プログラムは /usr/share/"$pkgname" にインストールし、プログラムは必要なものを全て "$HOME"/."$pkgname" に書き込むようにします。/usr/bin/"$pkgname" に保存したスクリプトを使って、フォルダを作成したり必要な準備を行って、それからプログラムを起動します。

次のセクションでは必要なステップについて説明します。

この方法ではあれば個々のユーザーがそれぞれ設定を保持することができ、他のユーザーに干渉することがありません。

インストール

プログラムにインストーラが存在しない場合、インストールはファイルの解凍にすぎません。"$pkgdir"/usr/share/$pkgname に展開して、パーミッションを適切に設定します。以下のコマンドでパーミッションを確認できます:

$ find "$pkgdir"/usr/share -type f -exec chmod 644 "{}" \;
$ find "$pkgdir"/usr/share -type d -exec chmod 755 "{}" \;

プログラムを簡単にインストールできない場合、Wine 環境を作成する必要があります:

$ install -m755 -d "$srcdir"/tmp "$srcdir"/tmp/env "$srcdir"/tmp/local
$ export WINEPREFIX="$srcdir"/tmp/env
$ export XDG_DATA_HOME="$srcdir"/tmp/local
$ wine "$srcdir"/installer.exe /silentoptions

移植性についてはまだ説明していませんが、プログラムが変更したレジストリキーが必要ない場合は、次の場所からディレクトリをコピーするだけで済みます。

"$srcdir"/tmp/env/drive_c/Program\ Files/programname

それ以外の場合は、すべてのレジストリファイルもコピーし、最終的にはプログラムがインストールしたファイルもコピーする必要があります。"$srcdir"/tmp/local にはメニューアイコンとデスクトップファイルが含まれているため、これらをパッケージにコピーするとよいでしょう。プログラムをサイレントインストールする方法がない場合は、.tar.gz ファイルを作成して、どこかにアップロードして下さい。自動化が不可能な場合は、ユーザーにインストーラーに従うよう強制し、インストールが台無しにならないことを願い、存在しない可能性のあるフォルダーをやみくもにコピーする前に (例えば、ユーザーが'Cancel'を押したなど)、いくつかのチェックを書いてください。

/usr/bin スクリプト

スクリプトでは設定フォルダを用意してプログラムを起動します。プログラムがポータブルな場合、以下のようになります:

#!/bin/bash
unset WINEPREFIX
if [ ! -d "$HOME"/.programname ] ; then
   mkdir -p "$HOME"/.programname
   #prepare the environment here
fi
WINEDEBUG=-all wine "$HOME"/.programname/programname "$@"

If it is clean, it will look like this:

#!/bin/bash
export WINEPREFIX="$HOME"/.programname/wine
if [ ! -d "$HOME"/.programname ] ; then
   mkdir -p "$HOME"/.programname/wine
   wineboot -u
   #copy the registry file if needed
fi
WINEDEBUG=-all wine /usr/share/programname "$@"

ご覧のとおり、2 番目のケースでは環境の準備がありません。実際、クリーンなアプリケーションはフォルダーに書き込む必要がないため、/usr/share から直接起動され、その設定はエミュレートされたファイルシステムのどこかに書き込まれます。

アプリケーションがクリーンでもポータブルでもない場合は、2 つのアイデアを組み合わせる必要があります。

アプリケーションが設定をまったく書き込まない場合は、if をスキップして、/usr/share から起動します。

環境を準備するタスクはアプリケーションによって大きく異なる場合がありますが、次の経験則に従ってください。: プログラムの場合:

  • ファイルを読み、シンボリックリンクする必要がある。
  • ファイルに書き込む必要がある場合は、それをコピーする。
  • ファイルを使用しない場合は、無視する。

もちろん、最小値は WINEDEBUG=-all wine /usr/share/programname "$@" を開始するだけです。

通常、環境は "$HOME"/.programname ディレクトリと /usr/share/programname ファイルをシンボリックリンクすることで作られます。しかし、Windows のプログラムによってはパスが非常に気まぐれなので、"$HOME"/.プログラムの名前/wine/drive_c/Program Files/プログラムの名前 ディレクトリに直接シンボリックリンクする必要があるかもしれません。

もちろん、これらは Linux 環境に Win32 アプリケーションを統合するための単なるアイデアです。知性と勇気を忘れないでください。

たとえば、μTorrent はデフォルトではクリーンなアプリケーションですが、簡単な手順でポータブルアプリケーションとして使用できます。これは単一のファイルであり、wine 環境を作成するのにかなり小さいため (約 5MB)、おそらくやりすぎです。実行可能ファイルをシンボリックリンクし、空の settings.dat を作成して、それを $HOME/.utorrent ディレクトリに移植可能に使用することをお勧めします。さらに、ユーザーは .utorrent フォルダにアクセスするだけで、ダウンロードした .torrent ファイルのコピーを確認できるという利点もあります。

UnionFsFuse

unionfs-fuse パッケージで UnionFsFuse プログラムを使うことができます。UnionFsFuse はベースディレクトリを /usr/share に保持して、書き込みに必要なアプリケーションのファイルのコピーを $HOME/.programname に自動的に配置します。

UnionFsFuse を使用することは追加の依存関係を意味し、すべてのユーザーがロードするとは限らないヒューズモジュールが必要になります。 ただし、アプリケーションに多くのシンボリックリンクが必要な場合、またはアプリケーションに何を記述する必要があるか正確に不明な場合には、これを行う価値があるかもしれません。UnionF を正しくマウントおよびアンマウントするようにしてください。

サンプル

eMule 用のパッケージを作成します。Portable Freeware によると、eMule はレジストリにいくつかの (役に立たない) キーを書き込むため、完全に移植可能ではありません。

一方で、設定ファイルを作成し、ダウンロードしたファイルをインストールフォルダーに保存するため、クリーンでもありません。

幸いなことに、インストーラーなしのバージョンが利用可能 があります。

そこで、PKGBUILD を作成します。唯一の依存関係は wine です。md5sums を追加する必要があります。

# Maintainer: You <youremail>
pkgname=emule
pkgver=0.49b
pkgrel=1
pkgdesc="One of the biggest and most reliable peer-to-peer file sharing
clients around the world."
arch=(i686 x86_64)
url="http://www.emule-project.net"
license=('GPL')
depends=()
depends=(wine)
makedepends=(unzip)
source=(emule http://prdownloads.sourceforge.net/emule/eMule$pkgver.zip)
noextract=()
options=(!strip)

build() {
  rm -f src/eMule"$pkgver"/license* #It is GPL

  install -d -m755 pkg/usr/share/emule
  cp -ra src/eMule"$pkgver"/* pkg/usr/share/emule
  find pkg/usr/share/emule -type d -exec chmod 755 "{}" \;
  find pkg/usr/share/emule -type f -exec chmod 644 "{}" \;

  install -d -m755 pkg/usr/bin
  install -m755 emule pkg/usr/bin 
}

ここで、emule ファイルを作成します。これは、build に従って、/usr/bin にコピーされてに実行可能になります。

#!/bin/bash
export WINEARCH=win32 WINEPREFIX="$HOME/.emule/wine"

if [ ! -d "$HOME"/.emule ] ; then
  mkdir -p "$HOME"/.emule/wine || exit 1
  #Each user will have its config, we copy the default file since emule
  #needs to write here.
  cp -r /usr/share/emule/config "$HOME"/.emule || exit 1
  #We symlink the files emule needs to read to work
  ln -s /usr/share/emule/emule.exe "$HOME"/.emule/emule || exit 1
  ln -s -T /usr/share/emule/lang "$HOME"/.emule/lang || exit 1
  ln -s -T /usr/share/emule/webserver "$HOME"/.emule/webserver || exit 1
fi

wine "$HOME"/.emule/emule "$@"

より正確にしたい場合は、wine がメニューを台無しにするため、検索履歴を無効にする必要があることをユーザーに伝えるメッセージを .install ファイルに追加できます。最適な設定を含むデフォルトの設定ファイルを提供することもできます。以上です... $ makepkg を実行し、パッケージフォルダーを確認してインストールします。

Gecko と Mono

そのソフトウェアが .NET ランタイム (パッケージ wine-gecko および wine-mono) のブラウザを必要とすることが明確にわかっていない限り、Gecko/Mono のデフォルトの wine インストール プロンプトは望ましくありません。

HTML レンダリング、バイトコード サポート、およびダイアログを無効にするには、スクリプトで dloverride を使用する必要があります。

Gecko の場合:

export WINEDLLOVERRIDES="mshtml="

Mono の場合:

export WINEDLLOVERRIDES="mscoree="

両方の場合:

export WINEDLLOVERRIDES="mscoree,mshtml="

winecfg で無効化することもできます。mscoree/mshtml を Disable に設定してください。