試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

Windows向けバイナリ差分取得/パッチ当てツールWinIPSをWineでビルドして使用するための自動インストールスクリプト

バイナリデータの差分を取ったり当てたりできる*1Windows向けのWinIPSというツール(M.K.S氏作)があり、Wine上でそのまま問題なく動作はするが、ソースが公開されている上に小規模なツールなので、Wineの開発パッケージを用いてビルドしてみたところ、「Wine上でMIDIマッパー設定が行えるGUIツールについて(後半)」のMIDIせれくたーに近い要領で一部修正を行うことにより、表示も含めて正しく動作した。
ここではWinIPSのソースを取得し、修正後ビルドを行って専用のWine環境(既定では[ホームディレクトリ]/.wine-winips/とする)へインストールし、freedesktop.orgのメニューから起動できるようにするところまでを自動化したスクリプトを貼り付ける。
動作にはWineの開発パッケージ*2unzipに加え、wgetもしくはcurlが必要。
[任意]ファイル名: wine-winips-install.sh ライセンス: LGPL-2 (or lator)

#! /bin/sh

# download/patch/build/install script for WinIPS 0.64
# version 20100221
# (C) 2010 kakurasan
# Licensed under LGPLv2+

URL=smblabo.web.fc2.com/files/src/wi064src.zip

TEMPDIR=$(mktemp --tmpdir -d winips.XXXXXXXX)
if [ ${?} -ne 0 ]; then
  echo "cannot create tempdir"
  exit 1
fi
cd ${TEMPDIR}

export WINEPREFIX="${WINEPREFIX:-${HOME}/.wine-winips}"
APPDIR="${WINEPREFIX}"/dosdevices/c:/"Program Files"/winips
APPDIR_DOS="$(winepath -w "${APPDIR}" | sed 's:\\:\\\\:g')"

# fetch
if ! wget ${URL}; then
  if ! curl ${URL}; then
    exit 1
  fi
fi
echo "dd1547ec2057b945f584764cf917597f  wi064src.zip" | md5sum -c || exit 1

# extract
unzip $(basename ${URL}) || exit 1

# fix japanese text
cat <<EOF | base64 -d | zcat | patch -p1
H4sIAB2PgEsCA0vJTEtT0C0tUijPzMssKNY10DMz0csvykzXL0otzi8tSk7VK0pGlkQW5+XS1dXF
q5OXS1tbG7d2BwcFXSMjHXMFbSBppuDgwMulAETKmWkKiimpaZl5qSkajm4R8UGuwf6hQc6u8S4+
PpoKNTUKyJIhjkHu8V4BfpoQnUAphfhwTz9jI6DzfBz93EMd3V0VQIx4L8cARz/XYFcdheBQJ7CI
i6ubY6hPCEhnQVFiem6iQnJ+Smp8QWJ6qoalsRHYyNS8FKB79PVhhipA3G1oYgpyuKGJCZACuxwE
XP1coKwA/4DQAAWlrWfu71l3V0MtQFMJKuHk6u7pB3SbAhT4uvqFeoa4+ioo9b9tOtn3YqJ/08mp
MX3LNNRCNJV0FODA08U33j8gxNPfL97RJ9wxMtjfL8Q/ABjC+A0iwSTsPjh788x9DTUPdPcDAJtS
TPQ6AgAA
EOF

# build info
winemaker -D_WIN32 -I/usr/include/wine/windows winips.dsp || exit 1

# build
make CFLAGS="-m32" || exit 1

# set PATH / create wine prefix
cat <<EOF > path.reg || exit 1
REGEDIT4

[HKEY_CURRENT_USER\Environment]
"PATH"="${APPDIR_DOS}"
EOF
regedit path.reg || exit 1

# install
mkdir -p "${APPDIR}" || exit 1
strip winips.exe.so || exit 1
cp winips.exe.so "${APPDIR}" || exit 1
cp -a *.txt appicon.ico "${APPDIR}" || exit 1

# .desktop
mkdir -p ~/.local/share/applications/wine/Programs/ || exit 1
cat <<EOF > ~/.local/share/applications/wine/Programs/winips.desktop || exit 1
[Desktop Entry]
Name=WinIPS
Comment=Binary diff/patch utility
Exec=env WINEPREFIX="${WINEPREFIX}" wine winips.exe.so
Type=Application
StartupWMClass=Wine
Path=${APPDIR}
Icon=${APPDIR}/appicon.ico
EOF
update-desktop-database ~/.local/share/applications || exit 1

# cleanup
cd ..
rm ${TEMPDIR} -fr

(2010/2/21)スクリプトエンコーディングを指定せずに処理ができるように修正・PATH指定の部分なども調整/修正

使い方についてはユーザインターフェースが非常にシンプルなので迷うことはないが

  • パッチ作成:「操作」を「IPSファイル作成」にして元のファイルと変更後のファイルを指定後「作成」を押す
  • パッチ適用:「操作」を「IPSパッチ」にしてIPSファイルとパッチを当てるファイルを指定後「適用」を押す

となる。
アンインストールする場合は

  1. Wine環境の[ホームディレクトリ]/.wine-winips/以下を消す
  2. [ホームディレクトリ]/.local/share/applications/wine/Programs/winips.desktopを消す
  3. コマンド「update-desktop-database ~/.local/share/applications」を実行

の流れで作業を行う。

使用したバージョン:

  • Wine 1.1.37
  • WinIPS 0.64

*1:対応するパッチ形式はこのツール向けのWinIPS形式のみ

*2:「(lib)wine-devel」「(lib)wine-dev」などの名前のパッケージ