Wine 软件包指南
32 位 – CLR – CMake – 交叉编译工具 – DKMS – Eclipse 插件 – Electron – 字体 – Free Pascal – GNOME – Go – Haskell – Java – KDE – 内核模块 – Lisp – Meson – MinGW – Node.js – 非自由软件 – OCaml – Perl – PHP – Python – R – Ruby – Rust - 安全 – Shell – VCS – Web – Wine
许多 Windows 程序在 Linux 中仍然有用,因此我们可能希望为它们打包。两个操作系统之间的差异使这项任务有点复杂。在本指南中,我们将讨论 Win32 二进制文件,因为有源代码的项目通常会被移植到 Linux。
首要检查事项
- 许可证:许可证是否允许重新打包程序?
- 安装程序:是否可以静默安装程序? 更好的是,是否存在无安装程序的版本?
- 便携性和清洁性:程序是否便携? 它是否清洁?
这里我们所说的程序便携是指它从不写入注册表或其目录之外; 我们所说的程序清洁是指它从不写入其目录,但可能会将其设置写入用户文件夹。 程序也可以两者兼具(例如,它从不写入设置)或两者都不具备(例如,它写入其目录,它到处写入,它写入注册表...)
许可证
通常许可证位于安装目录中的文本文件中。 如果找不到它,请尝试在安装过程中按照屏幕提示操作。 如果没有提及重新打包,请继续。 作者并不在意。 否则,许可证通常不允许删除文件或完全不允许重新打包。 在前一种情况下,只需注意 makepkg 进程不会丢失任何文件,您可以在 post_install
阶段删除不需要的文件(例如,卸载程序); 在后一种情况下,所有安装过程都必须在 post_install
阶段完成。 build
阶段仅用于复制安装文件。
安装程序
使用像 .zip
这样的压缩文件比使用 Windows 安装程序容易得多。 如果您别无选择,因为作者坚持使用安装程序分发其程序,请在 Internet 上搜索是否可以静默安装该软件。 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
您可以考虑使用 UnionFsFuse 程序,该程序可作为 unionfs-fuseAUR 使用。 UnionFsFuse 允许将基本目录保留在 /usr/share
中,并将应用程序需要写入的文件副本几乎自动地放入 $HOME/.programname
中。
使用 UnionFsFuse 意味着额外的依赖项,并且它需要并非所有用户都可能加载的 fuse 模块。 然而,如果应用程序需要大量符号链接,或者不清楚到底需要写入什么,那么它可能是有价值的。 只需确保正确挂载和卸载 UnionFs。
一个例子
我们将为 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=('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 }
现在我们制作我们的 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 "$@"
如果您想更精确,您可以在 .install
文件中添加一条消息,告诉用户他们应该禁用搜索历史记录,因为 wine 会搞砸该菜单。 您甚至可以提供具有最佳设置的默认配置文件。 就是这样... 运行 $ makepkg
,检查软件包文件夹以确保安全,然后安装。
Gecko 和 Mono
除非您确定该软件需要浏览器或 .NET 运行时(软件包 wine-gecko 和 wine-mono),否则默认的 wine 安装会提示安装 Gecko/Mono,这是不希望看到的。
要禁用 HTML 渲染、字节码支持和对话框,您需要在脚本中使用 dlloverride。 对于 Gecko
export WINEDLLOVERRIDES="mshtml="
对于 Mono
export WINEDLLOVERRIDES="mscoree="
对于两者
export WINEDLLOVERRIDES="mscoree,mshtml="
您也可以通过 winecfg
禁用它们:只需将 mscoree/mshtml 设置为禁用。