WebKitをEmscriptenでコンパイルしてみる(trunkでやりなおし)
ちょっと前回試したのは古すぎたので、公式ミラーを使ってやりなおし。
けっか
JSC(JavaScriptCore)まではビルドが通った(ただしバカみてぇにデカい)。というわけで次の一手はJSCを動かすことかな。。
ただJSCは非同期シグナル( pthread_kill
で他のスレッドを止めるのと、WASMの実行時にシグナルを拾って例外にするの)に依存しているので、そこだけ拡張した専用のWebAssemblyランタイムを用意する必要がある。。どうやるのが良いのかは考え中だが、専用のOSを定義してWTFのレイヤで吸収するのかな。
Configure
emcmake cmake -DPORT=WPE -DENABLE_XSLT=OFF -DENABLE_VIDEO=OFF \
-DENABLE_WEB_AUDIO=OFF -DENABLE_JIT=OFF -DENABLE_NATIVE_VIDEO=OFF \
-DENABLE_WEBDRIVER=OFF -DENABLE_WEB_CRYPTO=OFF -DENABLE_TEXT_SINK=OFF \
-DCMAKE_BUILD_TYPE=Debug -DENABLE_ACCESSIBILITY=OFF -DUSE_OPENJPEG=OFF \
-DUSE_WOFF2=OFF -DUSE_SYSTEMD=OFF -GNinja ~/yocto-work/webkit/test/WebKit
前回よりオプションがちょっと増えた。 ACCESSIBILITY、OPENJPEG、WOFF2が追加されたのでOFF。
ローカルのライブラリを見るように改造
前回と比べると、WebKitは最近(ここ数年くらい)のCMakeの機能であるinterface libraryを使うようになったため、それに対応するように修正している。例えば、
function(add_stublib nam)
add_library(${nam} INTERFACE IMPORTED)
set_target_properties(${nam} PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES "${ARGN}")
endfunction()
add_stublib(ICU::data ${ICU_INCLUDE_DIRS})
ICU::data
という仮想ライブラリをリンクすると、そのexecutableのビルドでは自動的に ${ICU_INCLUDE_DIRS}
で指定したincludeディレクトリが追加指定されるようになる。
WebKitは find_library
をオーバーライドしてCMakeのバージョン差を吸収しているが、今回の用途では余計なので _find_library
(オーバーライド前の find_library
コマンド)を呼ぶように変更している。
WebKitはupstreamに導入されたFind〜を積極的に使うように変更しているようだ。例えば、 https://bugs.webkit.org/show_bug.cgi?id=197934 では、前回は存在したFindICU.cmakeを削除している。
ライブラリの収集
だいたいはGitHubに有るが、
- https://github.com/freetype/freetype は公式っぽいのに何故か古いので https://gitlab.freedesktop.org/freetype/freetype を使った
- IJGのlibjpegはGitHubに見当らなかったので https://github.com/libjpeg-turbo/libjpeg-turbo
- https://github.com/glennrp/libpng 個人アカウント感があるが、こちらが公式ミラーのようだ (glennrpはPNGの作者の一人で、 2018年に亡くなっている 。)
Memory Pressure Handlerが無いのに対処
/home/oku/yocto-work/webkit/test/WebKit/Source/WTF/wtf/unix/MemoryPressureHandlerUnix.cpp:135:2: error: "Missing a platform specific way of determining the memory usage"
#error "Missing a platform specific way of determining the memory usage"
ここは Windows 、 COCOA (iOSやMac) 、 Linux 、 FreeBSD にしか対応していないようだ。たぶん無くても大丈夫なので適当に処理。
32bit環境でビルドに失敗するのに対処
/home/oku/yocto-work/webkit/test/WebKit/Source/JavaScriptCore/API/glib/JSCOptions.cpp:179:25: error: no matching function for call to 'valueFromGValue'
FOR_EACH_JSC_OPTION(SET_OPTION_VALUE)
... 結局JSCって32bit環境の扱いはどうなったんだ。。
これは要するに
のrevertだけど、元のBugzilla https://bugs.webkit.org/show_bug.cgi?id=194330 でも同様のビルド失敗がOpenBSDのi386やs390 ( ! ) に寄せられている。
ICUが新しすぎるとビルドできない
/home/oku/yocto-work/webkit/test/WebKit/Source/JavaScriptCore/runtime/IntlSegmenter.cpp:133:77: error: use of undeclared identifier 'ubrk_safeClone_69'; did you mean 'ucol_safeClone_69'?
auto segmenter = std::unique_ptr<UBreakIterator, UBreakIteratorDeleter>(ubrk_safeClone(m_segmenter.get(), nullptr, nullptr, &status));
^~~~~~~~~~~~~~
ucol_safeClone_69
ubrk_safeClone
は今年に入って廃止されてしまった。
ちょっと修正面倒なので、ICUを廃止の1つ前のリビジョンに戻した。
ビルドは通るがなんかすごいでかい
/WebKit/Source/JavaScriptCore/llint/LowLevelInterpreter.cpp
のコンパイルに10分とか掛かる。。
このインタプリタは、いわゆるcomputed gotoでバイトコードを実行するループになっているので、WebAssemblyにgotoが無い のが原因かと思ったけど、computed gotoを無効化しても特に改善しなかった。
oku@ubuntults:~/yocto-work/webkit/build/lib$ ls -alh
合計 746M
drwxrwxr-x 3 oku oku 4.0K 2月 19 20:12 .
drwxrwxr-x 7 oku oku 4.0K 2月 19 15:45 ..
-rw-rw-r-- 1 oku oku 690M 2月 19 19:12 libJavaScriptCore.a
-rw-rw-r-- 1 oku oku 4.7M 2月 19 19:11 libLLIntOffsetsExtractor.a
-rw-rw-r-- 1 oku oku 491K 2月 19 19:11 libLLIntSettingsExtractor.a
-rw-rw-r-- 1 oku oku 7.4M 2月 19 19:12 libTestJavaScriptCore.a
-rw-rw-r-- 1 oku oku 32M 2月 19 19:10 libWTF.a
-rw-rw-r-- 1 oku oku 3.3M 2月 19 19:10 libgtest.a
-rw-rw-r-- 1 oku oku 9.0M 2月 19 19:12 libjsc.a
690MiBて
arを解いてみても、特にインタプリタ部分だけが大きいというわけでもないようだ。
oku@ubuntults:~/yocto-work/webkit/build/lib/temp$ ls --sort=size -alh
合計 673M
-rw-r--r-- 1 oku oku 18M 2月 19 20:13 UnifiedSource-3bec6ef2-1.cpp.o
-rw-r--r-- 1 oku oku 14M 2月 19 20:13 UnifiedSource-f2e18ffc-5.cpp.o
-rw-r--r-- 1 oku oku 14M 2月 19 20:13 UnifiedSource-95324de6-1.cpp.o
-rw-r--r-- 1 oku oku 14M 2月 19 20:13 UnifiedSource-84c9f43f-2.cpp.o
-rw-r--r-- 1 oku oku 12M 2月 19 20:13 UnifiedSource-f2e18ffc-21.cpp.o
-rw-r--r-- 1 oku oku 11M 2月 19 20:13 UnifiedSource-f2e18ffc-38.cpp.o
-rw-r--r-- 1 oku oku 10M 2月 19 20:13 UnifiedSource-f0a787a9-2.cpp.o
-rw-r--r-- 1 oku oku 9.7M 2月 19 20:13 UnifiedSource-84c9f43f-5.cpp.o
-rw-r--r-- 1 oku oku 9.6M 2月 19 20:13 UnifiedSource-6e4525b9-1.cpp.o
-rw-r--r-- 1 oku oku 9.6M 2月 19 20:13 UnifiedSource-f2e18ffc-6.cpp.o
-rw-r--r-- 1 oku oku 9.5M 2月 19 20:13 UnifiedSource-f2e18ffc-23.cpp.o
-rw-r--r-- 1 oku oku 9.3M 2月 19 20:13 UnifiedSource-f0a787a9-3.cpp.o
-rw-r--r-- 1 oku oku 9.2M 2月 19 20:13 LowLevelInterpreter.cpp.o
-rw-r--r-- 1 oku oku 9.0M 2月 19 20:13 UnifiedSource-5fbd0224-1.cpp.o
-rw-r--r-- 1 oku oku 8.9M 2月 19 20:13 UnifiedSource-f2e18ffc-26.cpp.o
試しにリンクしてみると、 ↓ のようにICUと pthread_kill
、 sigsuspend
が依存とわかる。
oku@ubuntults:~/yocto-work/webkit/build/lib$ emcc libjsc.a libWTF.a libJavaScriptCore.a
error: undefined symbol: _ZN3JSC5parseImEEN3WTF8OptionalIT_EEPKc (referenced by top-level compiled C/C++ code)
warning: Link with `-s LLD_REPORT_UNDEFINED` to get more information on undefined symbols
warning: To disable errors for undefined symbols use `-s ERROR_ON_UNDEFINED_SYMBOLS=0`
warning: __ZN3JSC5parseImEEN3WTF8OptionalIT_EEPKc may need to be added to EXPORTED_FUNCTIONS if it arrives from a system library
error: undefined symbol: _ZN6icu_6813UnicodeStringD1Ev (referenced by top-level compiled C/C++ code)
warning: __ZN6icu_6813UnicodeStringD1Ev may need to be added to EXPORTED_FUNCTIONS if it arrives from a system library
error: undefined symbol: _ZN6icu_6813UnicodeStringaSERKS0_ (referenced by top-level compiled C/C++ code)
warning: __ZN6icu_6813UnicodeStringaSERKS0_ may need to be added to EXPORTED_FUNCTIONS if it arrives from a system library
error: undefined symbol: _ZN6icu_688TimeZone14getCanonicalIDERKNS_13UnicodeStringERS1_RaR10UErrorCode (referenced by top-level compiled C/C++ code)
warning: __ZN6icu_688TimeZone14getCanonicalIDERKNS_13UnicodeStringERS1_RaR10UErrorCode may need to be added to EXPORTED_FUNCTIONS if it arrives from a system library
error: undefined symbol: _ZN6icu_688TimeZone18detectHostTimeZoneEv (referenced by top-level compiled C/C++ code)
warning: __ZN6icu_688TimeZone18detectHostTimeZoneEv may need to be added to EXPORTED_FUNCTIONS if it arrives from a system library
error: undefined symbol: pthread_kill (referenced by top-level compiled C/C++ code)
warning: _pthread_kill may need to be added to EXPORTED_FUNCTIONS if it arrives from a system library
error: undefined symbol: sigsuspend (referenced by top-level compiled C/C++ code)
warning: _sigsuspend may need to be added to EXPORTED_FUNCTIONS if it arrives from a system library
error: undefined symbol: u_charDirection_68 (referenced by top-level compiled C/C++ code)
warning: _u_charDirection_68 may need to be added to EXPORTED_FUNCTIONS if it arrives from a system library
error: undefined symbol: u_charType_68 (referenced by top-level compiled C/C++ code)
(★ 以下ICUのシンボルが続く)