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

提供: ArchWiki
2023年6月28日 (水) 22:51時点におけるKgx (トーク | 投稿記録)による版 (→‎/usr/bin スクリプト: 翻訳)
ナビゲーションに移動 検索に移動

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 に自動的に配置します。

Using UnionFsFuse means an additional dependency and it requires the fuse module that not all users might load. Yet, it might be worthwhile if the application would need lots of symlinking or if it is unclear exactly what it needs to be written. Just ensure to mount and unmount the UnionFs correctly.

サンプル

We will make a package for eMule. According to Portable Freeware, eMule is not completely portable since it writes some (useless) keys in the registry.

On the other hand, it is not clean either since it writes its configuration files and puts its downloads in its installation folder.

Luckily there is an installer-less version available.

So we make our PKGBUILD; the only dependency is wine. The md5sums should be added.

# 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 
}

Now we make our emule file, which according to build, will be copied and made executable in /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 "$@"

If you want to be more precise, you may add a message in the .install file telling the user that they should disable search history since wine messes up that menu. You may even provide a default config file with the best settings. And that's it... run $ makepkg, check the package folder to be sure, and install.

Gecko と Mono

Unless you know for sure, that software require browser of .NET runtime (packages wine_gecko[リンク切れ: 置換パッケージ: wine-gecko] and wine-mono in official repositories), default wine installation prompts for Gecko/Mono are undesirable.

HTML レンダリング, バイトコードサポート, ダイアログを無効果するにはスクリプトで dlloverride を使う必要があります。

Gecko の場合:

export WINEDLLOVERRIDES="mshtml="

Mono の場合:

export WINEDLLOVERRIDES="mscoree="

両方の場合:

export WINEDLLOVERRIDES="mscoree,mshtml="

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