Open9

WebKitをEmscriptenでコンパイルしてみる(trunkでやりなおし)

okuokuokuoku

ちょっと前回試したのは古すぎたので、公式ミラーを使ってやりなおし。

https://github.com/WebKit/WebKit/

けっか

JSC(JavaScriptCore)まではビルドが通った(ただしバカみてぇにデカい)。というわけで次の一手はJSCを動かすことかな。。

ただJSCは非同期シグナル( pthread_kill で他のスレッドを止めるのと、WASMの実行時にシグナルを拾って例外にするの)に依存しているので、そこだけ拡張した専用のWebAssemblyランタイムを用意する必要がある。。どうやるのが良いのかは考え中だが、専用のOSを定義してWTFのレイヤで吸収するのかな。

okuokuokuoku

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。

okuokuokuoku

ローカルのライブラリを見るように改造

https://github.com/okuoku/WebKit/commit/55b6e5fa749da708eaf77b8649cc616740170054

前回と比べると、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に有るが、

okuokuokuoku

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"

https://github.com/okuoku/WebKit/commit/c2cab3a37eb165a34c08b928f5e11705ba1a6c0d

ここは Windows 、 COCOA (iOSやMac) 、 Linux 、 FreeBSD にしか対応していないようだ。たぶん無くても大丈夫なので適当に処理。

okuokuokuoku

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)

https://github.com/okuoku/WebKit/commit/e84e482132b80e1e70f2a59f53d5eefc56596006

... 結局JSCって32bit環境の扱いはどうなったんだ。。

これは要するに

https://github.com/WebKit/WebKit/commit/81040fc308a9d385c5315936c1e0608ed5e21ddc

のrevertだけど、元のBugzilla https://bugs.webkit.org/show_bug.cgi?id=194330 でも同様のビルド失敗がOpenBSDのi386やs390 ( ! ) に寄せられている。

okuokuokuoku

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 は今年に入って廃止されてしまった。

https://github.com/unicode-org/icu/commit/048e46674aec9a0f90f40064011abadb9ac8ee04

ちょっと修正面倒なので、ICUを廃止の1つ前のリビジョンに戻した。

okuokuokuoku

ビルドは通るがなんかすごいでかい

/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  219 20:12 .
drwxrwxr-x 7 oku oku 4.0K  219 15:45 ..
-rw-rw-r-- 1 oku oku 690M  219 19:12 libJavaScriptCore.a
-rw-rw-r-- 1 oku oku 4.7M  219 19:11 libLLIntOffsetsExtractor.a
-rw-rw-r-- 1 oku oku 491K  219 19:11 libLLIntSettingsExtractor.a
-rw-rw-r-- 1 oku oku 7.4M  219 19:12 libTestJavaScriptCore.a
-rw-rw-r-- 1 oku oku  32M  219 19:10 libWTF.a
-rw-rw-r-- 1 oku oku 3.3M  219 19:10 libgtest.a
-rw-rw-r-- 1 oku oku 9.0M  219 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_killsigsuspend が依存とわかる。

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のシンボルが続く)