跳至內容

Wine 打包準則

出自 Arch Linux 中文维基
Arch 打包準則

32 位安全CLRCMakeDKMSEclipseElectronFree PascalGNOMEGoHaskellJava交叉編譯工具KDELispMesonMinGW內核模塊Node.jsNonfreeOCamlPerlPHPPythonRRubyRustShellVCSWebWine字體

有不少 Windows 軟體在 Linux 上也很有用,所以我們也可以為它們創建軟體包,但兩個作業系統上的區別使這一過程變得有點複雜。由於提供了源碼的軟體通常都會被移植到 Linux 上,因此本文將主要討論 Win32 二進制文件相關內容。

首先檢查

  • 許可證:是否允許重新打包?
  • 安裝器:是否提供免安裝版本?如果沒有,是否可以靜默安裝?
  • 便攜性與潔淨性:軟體是否有便攜性?是否潔淨?

這裡提到的便攜性是指軟體從不向註冊表或目錄外進行寫入;潔淨是指軟體從不向自身目錄進行寫入,但可能會將設置寫入到用戶目錄中。一個軟體可以二者兼具(例如從不寫入設置信息)或二者兼非(例如會向自身目錄、其它目錄和註冊表等進行寫入)。

許可證

通常來說許可證是安裝路徑下的一個文本文件。如果沒找到,可以參考安裝時顯示的界面。如果它沒有提到與重新打包相關的內容,則代表作者沒有進行限制,可以繼續。如果有相關內容,那通常會不允許移除任何文件,甚至是不允許進行重新打包。對於前者,只需確保 makepkg 時沒有文件丟失,然後可以在 post_install 階段移除不需要的文件(例如卸載器)。對於後者,安裝操作必須在 post_install 階段完成,build 階段只可用於複製安裝文件。

安裝器

類似 .zip 的壓縮文件比 Windows 安裝器處理起來簡單得多。如果作者堅持通過安裝器來分發軟體包,可以查一下 MSFN 或其它網頁看看安裝器是否支持靜默安裝。如果找不到辦法,可以試試通過其它解壓工具打開安裝器,有時能行。

便攜性與潔淨性

便攜軟體無需獨立的 Wine 模擬文件系統,可以在 Portable Freeware 上查下你的軟體是否便攜。

指南概要

打包 Windows 軟體的過程基本上就是將應用文件作為數據,由 Wine 進行解析,就像 JVM 和 Java 字節碼一樣。

我們將把應用安裝到 /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 文件,然後傳到網上以供下載。如果無法將安裝過程自動化,可以強制用戶使用安裝器,並使用一些檢查項來確保安裝過程中沒有出現異常(例如用戶點了取消按鈕)。

/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 "$@"

如果應用具有潔淨性,那麼腳本如下:

#!/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 "$@"

可以看到,第二種情況中的腳本沒有環境配置的步驟。實際上,由於潔淨應用不會向自身目錄進行寫入,因此可以直接從 /usr/share 啟動應用,設置信息會被寫入到模擬文件系統中。

如果應用不具備便攜性和潔淨性,那就必須將這兩種方法混合使用。

如果應用完全不寫入設置信息,那麼可以跳過 if 這一段,直接從 /usr/share 啟動應用。

環境配置的具體步驟取決於應用,但可以參考以下經驗法則: 如果應用:

  • 只需要對文件進行讀取,可以創建符號連結
  • 如果需要對文件進行寫入,則需要將其複製
  • 如果無需使用某個文件,則可以無視

顯然,最小運行步驟為 WINEDEBUG=-all wine /usr/share/programname "$@"

通常,環境是通過在 "$HOME"/.programname 目錄與 /usr/share/programname 文件之間建立符號連結來創建的。但由於某些 Windows 程序對路徑非常挑剔,你可能需要直接在 "$HOME"/.programname/wine/drive_c/Program\ Files/programname 目錄中創建符號連結。

當然,這些只是將 Win32 應用整合到 Linux 環境中的一種方法,可以自己進行變通和嘗試。

舉個例子,μTorrent 默認是個潔淨應用,但很容易就能將其作為便攜應用使用。鑑於該應用為單個文件且體積較小,單獨為其創建 Wine 環境(約 5MB)有些小題大做了。更好的方法是符號連結到可執行文件,創建一個空 settings.dat 文件,使得能在 $HOME/.utorrent 目錄下便攜使用該應用。該方法還使用戶可以在 .utorrent 目錄中找到下載的 .torrent 文件副本。

UnionFsFuse

可以考慮使用 UnionFsFuseunionfs-fuseAUR),它可以將基礎目錄保留在 /usr/share,然後基本上全自動地將應用需寫入的文件複製到 $HOME/.programname

使用 UnionFsFuse 意味著需添加額外依賴,並會用到不是所有用戶都已加載的 fuce 模塊。但如果應用需要大量符號連結,或是不清楚應用具體需要寫入哪些文件,那可以考慮使用該方法,只要確保 UnionFs 正確被掛/卸載即可。

示例

可在 https://aur.archlinux.org/rpc/v5/search/wine?by=depends 查找依賴於 wine 的 AUR 軟體包作為示例。

本文或本節內容已經過時。

原因: AUR 中沒有 emule 軟體包,需要使用其它示例。 (在Talk:Wine 打包準則討論)

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=('x86_64')
url="https://www.emule-project.net"
license=('GPL')
depends=()
depends=(wine)
makedepends=(unzip)
source=(emule https://sourceforge.net/projects/emule/files/eMule/$pkgver/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 configuration file with the best settings. And that's it... run $ makepkg, check the package folder to be sure, and install.

Gecko 和 Mono

除非你確定軟體需要 .NET 運行時的瀏覽器功能(wine-geckowine-mono 軟體包),否則 Wine 默認不應提示安裝 Gecko/Mono。

要禁用 HTML 渲染、字節碼支持和提示窗口,需要在腳本中使用 dlloverride。 對於 Gecko:

export WINEDLLOVERRIDES="mshtml="

對於 Mono:

export WINEDLLOVERRIDES="mscoree="

對於二者:

export WINEDLLOVERRIDES="mscoree,mshtml="

還可以打開 winecfg,然後將 mscoree/mshtml 禁用。