有关 Wine 的一切 —— 构建、调试、改进与社区参与

WineBibber 4月前 217

本文译自 CodeWeavers 员工 Andrew 发布于 CodeWeavers 官方博客的系列文章—— Working On Wine

如果您是多年的 GNU/Linux 或者 BSD 用户,我打赌您一定知道用于在类 POSIX 系统运行 Windows 程序的 Wine 项目。您是否和我一样有过这样的经历:尝试过使用 Wine 运行某个 Windows 软件或者游戏,效果不尽人意但您却无从下手?翻遍了网络上几乎所有的用户交流,但依然没有帮助?如果您也有这样的经历,也许通过阅读本文您可以找到一些解决问题的新启发。

抑或您已经使用 Wine 多年,大多数情况下它能帮到您,但是时不时您还是会碰到一些让人纠结的小问题。那么也许通过阅读本文,您能亲自动手解决这些问题,甚至回馈到 Wine 社区去。

或者您刚用 GNU/Linux 没多久,您有一些 Windows 软件需要迁移,那么本文或许可以为您打开一个新世界的大门。;-)


第一部分:Wine 的生态环境——什么是 Wine 及其衍生版


什么是 Wine


Wine 是一个适用于各种 Unix 操作系统之上的 Windows 操作系统的开源实现。尽管它的主要对象是 Linux 和 macOS,但它也可以运行于 FreeBSD、NetBSD 和 Solaris。对于用户来说,Wine 提供了一种在其他操作系统运行 Windows 软件的方法。

Wine 不包含任何微软所有的代码,所以使用 Wine 无需拥有 Windows 许可。Wine 开发者通过重新编写 Windows 组件,使得软件运行在 Wine 上时以为它运行在 Windows 系统上,即使实际上它是运行在 Linux 上。

这里以 Windows 的 CreateFile API 为例。在 Windows 上,应用程序会调用:

    CreateFileA(
        "C:\\some_file.txt",   //lpFileName
        GENERIC_WRITE,         //dwDesiredAccess
        0,                     //dwShareMode
        NULL,                  //lpSecurityAttributes
        CREATE_ALWAYS,         //dwCreationDisposition
        FILE_ATTRIBUTE_NORMAL, //dwFlagsAndAttributes
        NULL                   //hTemplateFile
    );

Wine 会响应该 CreateFileA 调用,并将其转发到 Unix 的 open 函数:

    open(
        "/home/aeikum/.wine/drive_c/some_file.txt", //path
        O_WRONLY | O_CREAT,                         //oflag
        0644                                        //creation mode
    );

并把文件的 handle 返回给应用程序,接着应用程序就通过调用 WriteFile 来写入文件,当然该 WriteFile 调用也是 Wine 使用类似的方法映射到 Unix 的 write 函数来实现的。

实际上,Wine 中真正的 CreateFileA 实现会比上述过程复杂些(例如,进行路径的转换),但我想上述例子已经足够让您搞明白 Wine 的原理。


Wine 的衍生版

因为 Wine 是开源项目,所以任何人都可以依他们的需要修改和分发 Wine,这就成就了成百上前的 Wine 衍生版,其中有几个特别值得一提。


“上游的”Wine

网站:https://www.winehq.org/

这是“官方”版本的 Wine,也是一切 Wine 衍生版的基础。如果有人提到“上游的”Wine,那么他指的就是该项目。Wine 特别注重“正确性”,Wine 包含了大量的单元测试用于论证 Windows 的行为,并且要求大部分补丁提交的时候都要附带上测试。所有补丁必须通过现有的测试才会被合并。除此之外,Wine 也十分关注代码质量。因为 Wine 是一个十分庞大的项目(毫不夸张地说它包含了一个操作系统,包括图形界面),所以需要特别地避免“技术债务”来让项目可以长期地维护下去。


Wine Staging

网站:https://wiki.winehq.org/Wine-Staging

不管怎么样,由于 Wine 对补丁严格要求的态度,有许多未经验证的、错误、甚至有时候是危险的补丁散落在私人的 fork 或者 bug 追踪系统中,但这些补丁对用户是有帮助的。所以 Wine Staging 项目(也称为 wine-staging)试图收集并维护这些有用的补丁,让用户可以更容易地用上他们。Wine Staging 社区也致力于合并这些补丁到上游,以让所有 Wine 和 Wine 的衍生版用户都可以从中受益,同时降低 Wine Staging 的维护难度。有时它也是一个“测试平台”,为那些很难通过单元测试验证的补丁在合并到上游前可以得到充分的测试。


CrossOve

网站:https://www.codeweavers.com/
CrossOver 是由 CodeWeavers 公司销售的商业衍生版。它包含了大量针对特定应用程序的补丁,这些补丁通常不具通用性,因此不能提交到上游。CodeWeavers 同时还维护了一个应用程序兼容性数据库,该数据库可以通过预装一些软件组件或者修改 Wine 环境配置来帮助应用程序更好运行。当然,CodeWeavers 会首选正确实现新特性并提交到 Wine 上游,Wine 中很大分量的工作都是由 CodeWeavers 的员工完成的。


Proton

网站:https://github.com/ValveSoftware/Proton/
Proton 是由 Valve 软件公司创建的一个 Wine 衍生版,被集成到他们的 Steam 软件中——Steam 是一个游戏和软件分发平台。Proton 旨在为 Steam 用户提供在 Linux 运行 Windows 游戏的最佳体验。和 CrossOver 一样,大部分 Proton 的代码都提交给了 Wine 上游。


其他衍生版

除此之外,还有许许多多 Wine 衍生版。有一些被用于打包商业软件用于面向 macOS 和 Linux 平台销售。还有一些是用户为某个软件创建的“一次性”衍生版。


Wine 开发

Wine 不是完美的,您可以在日常使用 Wine 的时候发现一些瑕疵或者 bug。如果您对修复 Wine 以让它可以运行的您的应用程序或软件感兴趣,或者您的客户想要使用 Wine 并给您报酬让您修复 Wine 相关的问题。该教程将会进一步指引您构建、调试,为 Wine 写代码,并把代码提交到上游。

最后于 4月前 被WineBibber编辑 ,原因:
最新回复 (6)
全部楼主
  • WineBibber 4月前
    引用 2
    https://www.codeweavers.com/about/blogs/aeikum/2019/1/8/working-on-wine-part-2-wines-build-process
  • WineBibber 4月前
    引用 3
    https://www.codeweavers.com/about/blogs/aeikum/2019/1/10/working-on-wine-part-3-using-wine-as-a-developer
  • WineBibber 4月前
    引用 4
    https://www.codeweavers.com/about/blogs/aeikum/2019/1/15/working-on-wine-part-4-debugging-wine
  • WineBibber 4月前
    引用 5
    https://www.codeweavers.com/about/blogs/aeikum/2019/1/17/working-on-wine-part-5-fixing-wine
  • WineBibber 4月前
    引用 6
    Part  6  describes  how  you  can  send  your  work  upstream.
  • WineBibber 4月前
    引用 7
    预定楼层。:-)
    • Crossover爱好者
      8
        登录 注册
返回
发新帖