在macOS 10.15.4之后的系统上编译Qt 5.14.2 WebEngine时遇到的问题

背景

公司目前还在维护一个基于Qt WebEngine开发的V2客户端。在这个客户端上,依赖浏览器内核来实现对音视频文件的预览。为了避免许可问题,Qt官方给出的二进制文件中,没有启用对特定格式音视频解码器的支持,导致部分音视频文件无法被解码。因此每次升级Qt版本时,都需要重新编译Qt WebEngine,启用对这些音视频解码器的支持。
几个月前,公司选择接入WPS预览方案作为新的在线文档预览方案。因为方案用到了浏览器的Service Worker API,而当时V2客户端使用的Qt 5.9.3内置的WebEngine,对Service Worker API的支持存在问题。导致在V2客户端中打开预览界面时,会出现页面完全空白等问题。这些bug同时影响了Windows和macOS两个平台上的V2客户端。因为公司的下一代产品,暂时没有macOS平台的开发计划,只能将macOS平台上V2客户端使用的Qt升级到当时最新的5.14.2版本,并重新发布。因此,需要在macOS上重新编译Qt 5.14.2的WebEngine。

编译

编译本身还是很简单的。下载源代码并解压源代码,再在源代码的上级目录下新建build目录,在build目录下执行

script
1
2
3
4
5
6
7
8
9
../qt-everywhere-src-5.14.2/configure -opensource \
-confirm-license \
-verbose \
-release \
-nomake tests \
-nomake examples \
-webengine-proprietary-codecs
make
make install

这样执行,编译结果和中间文件都在build目录中生成。如果需要修改配置重新编译,直接清空build目录再重新配置生成就可以了。
因为编译过之前之前的版本,都是一次通过,以为这次也会一样顺利。周五下班前开始编译,周一上班时直接就可以用了。结果周末远程回公司电脑看编译结果,看到了一堆错误。根源是src/qtwebengine/src/3rdparty/chromium/build/mac/find_sdk.py抛了Exception: No 10.15.4+ SDK found的异常。
一顿搜索后,在Qt BugReports系统里找到了别人提的bug(QTBUG-83318)。报告人和我一样,在编译Qt 5.14.2版本的时候遇到了这个问题。开发给出的解释是10.15.4开始,xcrun命令输出的SDK版本信息格式为Major.Minor.Patch,而不是原来的Major.Minor,而原有的编译脚本没有适配这个改动。5.12.9以及5.15的正式版上会修复这个问题。而5.14版本不是LTS版本,5.14.2之后不会再有新的小版本更新,需要我们自行修复。
研究了一下5.15上修复bug的commit,基本就是修改一下src/buildtools/config/mac_osx.pri里获取mac_sdk_min的方式,适配一下新的格式。在5.14.2源代码的对应位置中修改一下,就可以修复这个报错,让编译继续。
之后又遇到了一个异常:src/qtwebengine/src/3rdparty/chromium/build/toolchain/mac/filter_libtool.py在执行IsBlacklistedLine时抛了TypeError: cannot use a string pattern on a bytes-like object异常。这个是因为我系统中的python默认为python3。filter_libtool.py中执行libtoolout.communicate()得到的_err类型为bytes,但IsBlacklistedLine期待的入参类型为str。这个需要在得到err后,执行

1
err = err.decode()

将err解码为utf8编码的字符串,再执行后面的操作。

完成上述修改后,即可正常编译。

替换

上述命令执行完成后,会在/usr/local/Qt-5.14.2/目录下生成最终编译产物。这套SDK的Qt WebEngine已经启用对上述音视频解码器的支持。使用这套SDK重新编译客户端即可。
如果你的项目和我们的V2客户端一样,使用了PyQt5,则需要复制/usr/local/Qt-5.14.2/lib下的QtWebEngineCore.framework目录,替换掉site-packages/PyQt5/Qt/lib下的同名目录。