blob: 5a247b085a0d3621d0c0aefde6f034226e5cb8cd [file] [log] [blame] [view]
Hosseind19299f2021-10-10 19:59:20 +02001# Support for Emscripten Cross Build
Jan-Marek Glogowski3dd7e772021-04-23 14:04:06 +02002
Andrea Gelminib926ba62023-02-13 12:23:32 +01003This subdirectory provides support for building LibreOffice as WASM, with the Emscripten toolchain.
Jan-Marek Glogowski3dd7e772021-04-23 14:04:06 +02004
Tor Lillqvist187d3b62023-02-06 11:57:15 +02005You can build LibreOffice for WASM for two separate purposes: 1)
6Either to produce a WASM binary of LibreOffice as such, using Qt5 for
7its GUI, or 2) just compiling LibreOffice core ("LibreOffice
8Technology") to WASM without any UI for use in other software that
9provides the UI, like Collabora Online built as WASM.
Tor Lillqvist6f6b8792023-02-02 13:38:02 +020010
11The first purpose was the original reason for the WASM port and this
12document was originally written with that in mind. For the second
13purpose, look towards the end of the document for the section
14"Building headless LibreOffice as WASM for use in another product".
15
16## Status of LibreOffice as WASM with Qt
Hosseind19299f2021-10-10 19:59:20 +020017
Jan-Marek Glogowski12a6b57c2022-01-10 04:50:03 +010018The build generates a Writer-only LO build. You should be able to run either
Jan-Marek Glogowski3dd7e772021-04-23 14:04:06 +020019
Jan-Marek Glogowski12a6b57c2022-01-10 04:50:03 +010020 $ emrun --serve_after_close instdir/program/qt_soffice.html
21 $ emrun --serve_after_close workdir/LinkTarget/Executable/qt_vcldemo.html
22 $ emrun --serve_after_close workdir/LinkTarget/Executable/qt_wasm-qt5-mandelbrot.html
Jan-Marek Glogowski3dd7e772021-04-23 14:04:06 +020023
Hosseind19299f2021-10-10 19:59:20 +020024REMINDER: Always start new tabs in the browser, reload might fail / cache!
Jan-Marek Glogowski12a6b57c2022-01-10 04:50:03 +010025INFO: latest browser won't work anymore with 0.0.0.0 and need 127.0.0.1.
Jan-Marek Glogowski3dd7e772021-04-23 14:04:06 +020026
Hosseind19299f2021-10-10 19:59:20 +020027## Setup for the LO WASM build (with Qt)
Jan-Marek Glogowski3dd7e772021-04-23 14:04:06 +020028
Stephan Bergmann31729452024-03-06 12:49:43 +010029We're using Qt 5.15.2 with Emscripten 3.1.46. There are a bunch of Qt patches
Moritz Duge43070432024-04-03 12:04:04 +020030to fix the most grave bugs. Also there's rapid development in Emscripten, so
Andrea Gelmini38ed8102024-04-05 14:19:25 +020031using another version often causes arbitrary problems.
Jan-Marek Glogowski3dd7e772021-04-23 14:04:06 +020032
Hosseind19299f2021-10-10 19:59:20 +020033- See below under Docker build for another build option
Jan-Marek Glogowski3dd7e772021-04-23 14:04:06 +020034
Hosseind19299f2021-10-10 19:59:20 +020035### Setup emscripten
Jan-Marek Glogowski3dd7e772021-04-23 14:04:06 +020036
Hosseind19299f2021-10-10 19:59:20 +020037<https://emscripten.org/docs/getting_started/index.html>
Jan-Marek Glogowski3dd7e772021-04-23 14:04:06 +020038
Hosseind19299f2021-10-10 19:59:20 +020039 git clone https://github.com/emscripten-core/emsdk.git
Stephan Bergmann31729452024-03-06 12:49:43 +010040 ./emsdk install 3.1.46
41 ./emsdk activate 3.1.46
Jan-Marek Glogowski3dd7e772021-04-23 14:04:06 +020042
Hosseind19299f2021-10-10 19:59:20 +020043Example `bashrc` scriptlet:
Jan-Marek Glogowski3dd7e772021-04-23 14:04:06 +020044
Hosseind19299f2021-10-10 19:59:20 +020045 EMSDK_ENV=$HOME/Development/libreoffice/git_emsdk/emsdk_env.sh
46 [ -f "$EMSDK_ENV" ] && \. "$EMSDK_ENV" 1>/dev/null 2>&1
Jan-Marek Glogowski3dd7e772021-04-23 14:04:06 +020047
Hosseind19299f2021-10-10 19:59:20 +020048### Setup Qt
Jan-Marek Glogowski3dd7e772021-04-23 14:04:06 +020049
Hosseind19299f2021-10-10 19:59:20 +020050<https://doc.qt.io/qt-5/wasm.html>
Jan-Marek Glogowski3dd7e772021-04-23 14:04:06 +020051
Jan-Marek Glogowski12a6b57c2022-01-10 04:50:03 +010052Most of the information from <https://doc.qt.io/qt-6/wasm.html> is still valid for Qt5;
53generally the Qt6 WASM documentation is much better, because it incorporated many
54information from the Qt Wiki.
Jan-Marek Glogowski3dd7e772021-04-23 14:04:06 +020055
Andrea Gelmini5ef2a7d2022-01-21 12:30:42 +010056FWIW: Qt 5.15 LTS is not maintained publicly and Qt WASM has quite a few bugs. Most
Tor Lillqvist52c37442022-12-14 21:38:08 +020057WASM fixes from Qt 6 are needed for Qt 5.15 too. Allotropia offers a Qt repository
58with the necessary patches cherry-picked.
Jan-Marek Glogowski12a6b57c2022-01-10 04:50:03 +010059
Moritz Duge43070432024-04-03 12:04:04 +020060With "-opensource -confirm-license" you agree to the open source license.
61
Tor Lillqvist52c37442022-12-14 21:38:08 +020062 git clone https://github.com/allotropia/qt5.git
Hosseind19299f2021-10-10 19:59:20 +020063 cd qt5
Tor Lillqvist52c37442022-12-14 21:38:08 +020064 git checkout v5.15.2+wasm
Jan-Marek Glogowski12a6b57c2022-01-10 04:50:03 +010065 ./init-repository --module-subset=qtbase
Stephan Bergmann22ce8ed2024-05-28 15:16:32 +020066 ./configure -opensource -confirm-license -xplatform wasm-emscripten -feature-thread -prefix <whatever> QMAKE_CFLAGS+=-sSUPPORT_LONGJMP=wasm QMAKE_CXXFLAGS+=-sSUPPORT_LONGJMP=wasm
Jan-Marek Glogowski12a6b57c2022-01-10 04:50:03 +010067 make -j<CORES> module-qtbase
Jan-Marek Glogowski3dd7e772021-04-23 14:04:06 +020068
Jan-Marek Glogowski12a6b57c2022-01-10 04:50:03 +010069Optionally you can add the configure flag "-compile-examples". But then you also have to
70patch at least mkspecs/wasm-emscripten/qmake.conf with EXIT_RUNTIME=0, otherwise they will
71fail to run. In addition, building with examples will break with some of them, but at that
Moritz Duge43070432024-04-03 12:04:04 +020072point Qt already works and also most examples. Or just skip them. Other interesting flags
73might be "-nomake tests -no-pch -ccache".
Jan-Marek Glogowski3dd7e772021-04-23 14:04:06 +020074
Moritz Duge43070432024-04-03 12:04:04 +020075Linking takes quite a long time, because emscripten-finalize rewrites the whole WASM files with
76some options. This way the LO WASM possibly needs 64GB RAM. For faster link times add
77"-s WASM_BIGINT=1", change to ASSERTIONS=1 and use -g3 to prevent rewriting the WASM file and
78generating source maps (see emscripten.py, finalize_wasm, and avoid modify_wasm = True). This is
79just needed for Qt examples, as LO already uses the correct flags!
Hosseind19299f2021-10-10 19:59:20 +020080
Moritz Duge43070432024-04-03 12:04:04 +020081It's needed to install Qt5 to the chosen prefix. Else LO won't find all needed files in the
82right place. For installation you can do
Jan-Marek Glogowski3dd7e772021-04-23 14:04:06 +020083
Jan-Marek Glogowski12a6b57c2022-01-10 04:50:03 +010084 make -j<CORES> install
85or
86 make -j8 -C qtbase/src install_subtargets
Jan-Marek Glogowski3dd7e772021-04-23 14:04:06 +020087
Hosseind19299f2021-10-10 19:59:20 +020088Current Qt fails to start the demo webserver: <https://bugreports.qt.io/browse/QTCREATORBUG-24072>
89
Jan-Marek Glogowski12a6b57c2022-01-10 04:50:03 +010090Use `emrun --serve_after_close` to run Qt WASM demos.
Jan-Marek Glogowski3dd7e772021-04-23 14:04:06 +020091
Hosseind19299f2021-10-10 19:59:20 +020092### Setup LO
Jan-Marek Glogowski3dd7e772021-04-23 14:04:06 +020093
Jan-Marek Glogowski12a6b57c2022-01-10 04:50:03 +010094`autogen.sh` is patched to use emconfigure. That basically sets various
95environment vars, especially `EMMAKEN_JUST_CONFIGURE`, which will create the
96correct output file names, checked by `configure` (`a.out`).
Jan-Marek Glogowski3dd7e772021-04-23 14:04:06 +020097
Jan-Marek Glogowski79365d62022-03-26 20:46:56 +010098There's a distro config for WASM, but it just provides --host=wasm32-local-emscripten, which
99should be enough setup. The build itself is a cross build and the cross-toolset just depends
100on a minimal toolset (gcc, libc-dev, flex, bison); all else is build from source, because the
101final result is not depending on the build system at all.
Thorsten Behrensd7e5d192021-04-25 16:02:10 +0200102
103Recommended configure setup is thusly:
104
Hosseind19299f2021-10-10 19:59:20 +0200105* grab defaults
106 `--with-distro=LibreOfficeWASM32`
Thorsten Behrensd7e5d192021-04-25 16:02:10 +0200107
Hosseind19299f2021-10-10 19:59:20 +0200108* local config
Moritz Duge43070432024-04-03 12:04:04 +0200109 `QT5DIR=/dir/of/qt5/install/prefix`
Jan-Marek Glogowski3dd7e772021-04-23 14:04:06 +0200110
Hosseind19299f2021-10-10 19:59:20 +0200111* if you want to use ccache on both sides of the build
112 `--with-build-platform-configure-options=--enable-ccache`
113 `--enable-ccache`
Jan-Marek Glogowski3dd7e772021-04-23 14:04:06 +0200114
Jan-Marek Glogowski12a6b57c2022-01-10 04:50:03 +0100115FWIW: it's also possible to build an almost static Linux LibreOffice by just using
116--disable-dynloading --enable-customtarget-components. System externals are still
117linked dynamically, but everything else is static.
118
119### "Deploying" soffice.wasm
120
121 tar -chf wasm.tar --xform 's/.*program/lo-wasm/' instdir/program/soffice.* \
122 instdir/program/qt*
123
Andrea Gelmini5ef2a7d2022-01-21 12:30:42 +0100124Your HTTP server needs to provide additional headers:
Jan-Marek Glogowski12a6b57c2022-01-10 04:50:03 +0100125* add_header Cross-Origin-Opener-Policy same-origin
126* add_header Cross-Origin-Embedder-Policy require-corp
127
128The default html to use should be qt_soffice.html
129
130### Debugging setup
131
132Since a few months you can use DWARF information embedded by LLVM into the WASM
133to debug WASM in Chrome. You need to enable an experimental feature and install
134an additional extension. The whole setup is described in:
135
136https://developer.chrome.com/blog/wasm-debugging-2020/
137
138This way you don't need source maps (much faster linking!) and can resolve local
139WASM variables to C++ names!
140
141Per default, the WASM debug build splits the DWARF information into an additional
142WASM file, postfixed '.debug.wasm'.
143
Hosseind19299f2021-10-10 19:59:20 +0200144### Using Docker to cross-build with emscripten
Jan-Marek Glogowski3dd7e772021-04-23 14:04:06 +0200145
146If you prefer a controlled environment (sadly emsdk install/activate
147is _not_ stable over time, as e.g. nodejs versions evolve), that is
148easy to replicate across different machines - consider the docker
149images we're providing.
150
151Config/setup file see
Hosseind19299f2021-10-10 19:59:20 +0200152<https://git.libreoffice.org/lode/+/ccb36979563635b51215477455953252c99ec013>
Jan-Marek Glogowski3dd7e772021-04-23 14:04:06 +0200153
154Run
155
Hosseind19299f2021-10-10 19:59:20 +0200156 docker-compose build
Jan-Marek Glogowski3dd7e772021-04-23 14:04:06 +0200157
158in the lode/docker dir to get the container prepared. Run
159
Jan-Marek Glogowski12a6b57c2022-01-10 04:50:03 +0100160 PARALLELISM=4 BUILD_OPTIONS= BUILD_TARGET=build docker-compose run --rm \
161 -e PARALLELISM -e BUILD_TARGET -e BUILD_OPTIONS builder
Jan-Marek Glogowski3dd7e772021-04-23 14:04:06 +0200162
Hosseind19299f2021-10-10 19:59:20 +0200163to perform an actual `srcdir != builddir` build; the container mounts
164checked-out git repo and output dir via `docker-compose.yml` (so make
Jan-Marek Glogowski3dd7e772021-04-23 14:04:06 +0200165sure the path names there match your setup):
166
167The lode setup expects, inside the lode/docker subdir, the following directories:
168
Hosseind19299f2021-10-10 19:59:20 +0200169- core (`git checkout`)
Jan-Marek Glogowski3dd7e772021-04-23 14:04:06 +0200170- workdir (the output dir - gets written into)
Hosseind19299f2021-10-10 19:59:20 +0200171- cache (`ccache tree`)
Jan-Marek Glogowski3dd7e772021-04-23 14:04:06 +0200172- tarballs (external project tarballs gets written and cached there)
173
174
Hosseind19299f2021-10-10 19:59:20 +0200175## Ideas for an UNO bridge implementation
Jan-Marek Glogowski3dd7e772021-04-23 14:04:06 +0200176
Hosseind19299f2021-10-10 19:59:20 +0200177My post to Discord #emscripten:
178
179"I'm looking for a way to do an abstract call
Andrea Gelmini5f102422021-05-05 23:38:21 +0200180from one WASM C++ object to another WASM C++ object, so like FFI / WebIDL,
Jan-Marek Glogowski3dd7e772021-04-23 14:04:06 +0200181just within WASM. All my code is C++ and normally I have bridge code, with
182assembler to implement the function call /RTTI and exception semantics of the
183specified platform. Code is at
Hosseind19299f2021-10-10 19:59:20 +0200184<https://cgit.freedesktop.org/libreoffice/core/tree/bridges/source/cpp_uno>.
185I've read a bit about `call_indirect` and stuff, but I don't have yet a good
Jan-Marek Glogowski3dd7e772021-04-23 14:04:06 +0200186idea, how I could implement this (and there is an initial feature/wasm branch
187for the interested). I probably need some fixed lookup table, like on iOS,
188because AFAIK you can't dynamically generate code in WASM. So any pointers or
189ideas for an implementation? I can disassemble some minimalistic WASM example
Hosseind19299f2021-10-10 19:59:20 +0200190and read clang code for `WASM_EmscriptenInvoke`, but if there were some
Jan-Marek Glogowski3dd7e772021-04-23 14:04:06 +0200191standalone code or documentation I'm missing, that would be nice to know."
192
193We basically would go the same way then the other backends. Write the bridge in
194C++, which is probably largely boilerplate code, but the function call in WAT
Hosseind19299f2021-10-10 19:59:20 +0200195(<https://github.com/WebAssembly/wabt>) based on the LLVM WASM calling
196conventions in `WASM_EmscriptenInvoke`. I didn't get a reply to that question for
Jan-Marek Glogowski3dd7e772021-04-23 14:04:06 +0200197hours. Maybe I'll open an Emscripten issue, if we really have to implement
198this.
199
Hosseind19299f2021-10-10 19:59:20 +0200200WASM dynamic dispatch:
201
202- <https://fitzgeraldnick.com/2018/04/26/how-does-dynamic-dispatch-work-in-wasm.html>
Jan-Marek Glogowski3dd7e772021-04-23 14:04:06 +0200203
Sarper Akdemir841f8982023-08-07 14:41:32 +0300204### UNO bindings with Embind
205
206Right now there's a very rough implementation in place. With lots of different
207bits unimplemented. And it _might_ be leaking memory. i.e. Lots of room for
208improvement! ;)
209
210Some usage examples through javascript of the current implementation:
211```js
212// inserts a string at the start of the Writer document.
Stephan Bergmann621322b2024-02-27 21:59:37 +0100213let uno = init_unoembind_uno(Module);
214let css = uno.com.sun.star;
Sarper Akdemir841f8982023-08-07 14:41:32 +0300215xModel = Module.getCurrentModelFromViewSh();
Stephan Bergmann1c81f632024-04-18 16:05:48 +0200216xTextDocument = css.text.XTextDocument.query(xModel);
Sarper Akdemir841f8982023-08-07 14:41:32 +0300217xText = xTextDocument.getText();
Stephan Bergmann1c81f632024-04-18 16:05:48 +0200218xSimpleText = css.text.XSimpleText.query(xText);
Sarper Akdemir841f8982023-08-07 14:41:32 +0300219xTextCursor = xSimpleText.createTextCursor();
Stephan Bergmann1c81f632024-04-18 16:05:48 +0200220xTextRange = css.text.XTextRange.query(xTextCursor);
Stephan Bergmann453049b2024-02-03 16:01:28 +0100221xTextRange.setString("string here!");
Sarper Akdemir841f8982023-08-07 14:41:32 +0300222xModel.delete(); xTextDocument.delete(); xText.delete(); xSimpleText.delete(); xTextCursor.delete(); xTextRange.delete();
223```
224
225```js
226// changes each paragraph of the Writer document to a random color.
Stephan Bergmann621322b2024-02-27 21:59:37 +0100227let uno = init_unoembind_uno(Module);
228let css = uno.com.sun.star;
Sarper Akdemir841f8982023-08-07 14:41:32 +0300229xModel = Module.getCurrentModelFromViewSh();
Stephan Bergmann1c81f632024-04-18 16:05:48 +0200230xEnumAccess = css.container.XEnumerationAccess.query(xText);
Sarper Akdemir841f8982023-08-07 14:41:32 +0300231xParaEnumeration = xEnumAccess.createEnumeration();
232
233while (xParaEnumeration.hasMoreElements()) {
Stephan Bergmann1c81f632024-04-18 16:05:48 +0200234 xParagraph = css.text.XTextRange.query(xParaEnumeration.nextElement().get());
235 if (xParagraph !== null) {
236 xParaProps = css.beans.XPropertySet.query(xParagraph);
Stephan Bergmann80bb8c62024-03-08 17:50:57 +0100237 let color = new Module.uno_Any(
238 Module.uno_Type.Long(), Math.floor(Math.random() * 0xFFFFFF));
Stephan Bergmannf1a47d42024-02-29 11:35:46 +0100239 xParaProps.setPropertyValue("CharColor", color);
240 color.delete();
Sarper Akdemir841f8982023-08-07 14:41:32 +0300241 }
242}
243```
244
245
246
Hosseind19299f2021-10-10 19:59:20 +0200247## Tools for problem diagnosis
Jan-Marek Glogowski3dd7e772021-04-23 14:04:06 +0200248
Hosseind19299f2021-10-10 19:59:20 +0200249* `nm -s` should list the symbols in the archive, based on the index generated by ranlib.
Jan-Marek Glogowski3dd7e772021-04-23 14:04:06 +0200250 If you get linking errors that archive has no index.
251
252
Hosseind19299f2021-10-10 19:59:20 +0200253## Emscripten filesystem access with threads
Jan-Marek Glogowski3dd7e772021-04-23 14:04:06 +0200254
Hosseind19299f2021-10-10 19:59:20 +0200255This is closed, but not really fixed IMHO:
256
257- <https://github.com/emscripten-core/emscripten/issues/3922>
Jan-Marek Glogowski3dd7e772021-04-23 14:04:06 +0200258
Hosseind19299f2021-10-10 19:59:20 +0200259## Dynamic libraries `/` modules in emscripten
Jan-Marek Glogowski3dd7e772021-04-23 14:04:06 +0200260
Hosseind19299f2021-10-10 19:59:20 +0200261There is a good summary in:
262
263- <https://bugreports.qt.io/browse/QTBUG-63925>
Jan-Marek Glogowski3dd7e772021-04-23 14:04:06 +0200264
265Summary: you can't use modules and threads.
266
Hosseind19299f2021-10-10 19:59:20 +0200267This is mentioned at the end of:
268
269- <https://github.com/emscripten-core/emscripten/wiki/Linking>
270
271The usage of `MAIN_MODULE` and `SIDE_MODULE` has other problems, a major one IMHO is symbol resolution at runtime only.
272So this works really more like plugins in the sense of symbol resolution without dependencies `/` rpath.
Jan-Marek Glogowski3dd7e772021-04-23 14:04:06 +0200273
Andrea Gelmini5f102422021-05-05 23:38:21 +0200274There is some clang-level dynamic-linking in progress (WASM dlload). The following link is already a bit old,
Jan-Marek Glogowski3dd7e772021-04-23 14:04:06 +0200275but I found it a god summary of problems to expect:
Hosseind19299f2021-10-10 19:59:20 +0200276
277- <https://iandouglasscott.com/2019/07/18/experimenting-with-webassembly-dynamic-linking-with-clang/>
Jan-Marek Glogowski3dd7e772021-04-23 14:04:06 +0200278
279
Hosseind19299f2021-10-10 19:59:20 +0200280## Mixed information, links, problems, TODO
Jan-Marek Glogowski3dd7e772021-04-23 14:04:06 +0200281
Hosseind19299f2021-10-10 19:59:20 +0200282More info on Qt WASM emscripten pthreads:
Jan-Marek Glogowski3dd7e772021-04-23 14:04:06 +0200283
Hosseind19299f2021-10-10 19:59:20 +0200284- <https://wiki.qt.io/Qt_for_WebAssembly#Multithreading_Support>
285
286WASM needs `-pthread` at compile, not just link time for atomics support. Alternatively you can provide
287`-s USE_PTHREADS=1`, but both don't seem to work reliable, so best provide both.
288<https://github.com/emscripten-core/emscripten/issues/10370>
Jan-Marek Glogowski3dd7e772021-04-23 14:04:06 +0200289
290The output file must have the prefix .o, otherwise the WASM files will get a
Hosseind19299f2021-10-10 19:59:20 +0200291`node.js` shebang (!) and ranlib won't be able to index the library (link errors).
Jan-Marek Glogowski3dd7e772021-04-23 14:04:06 +0200292
293Qt with threads has further memory limit. From Qt configure:
Hosseind19299f2021-10-10 19:59:20 +0200294````
Jan-Marek Glogowski3dd7e772021-04-23 14:04:06 +0200295Project MESSAGE: Setting PTHREAD_POOL_SIZE to 4
296Project MESSAGE: Setting TOTAL_MEMORY to 1GB
Hosseind19299f2021-10-10 19:59:20 +0200297````
Jan-Marek Glogowski3dd7e772021-04-23 14:04:06 +0200298
Hosseind19299f2021-10-10 19:59:20 +0200299You can actually allocate 4GB:
300
301- <https://bugzilla.mozilla.org/show_bug.cgi?id=1392234>
Jan-Marek Glogowski3dd7e772021-04-23 14:04:06 +0200302
303LO uses a nested event loop to run dialogs in general, but that won't work, because you can't drive
304the browser event loop. like VCL does with the system event loop in the various VCL backends.
305Changing this will need some major work (basically dropping Application::Execute).
306
307But with the know problems with exceptions and threads, this might change:
Hosseind19299f2021-10-10 19:59:20 +0200308
309- <https://github.com/emscripten-core/emscripten/pull/11518>
310- <https://github.com/emscripten-core/emscripten/issues/11503>
311- <https://github.com/emscripten-core/emscripten/issues/11233>
312- <https://github.com/emscripten-core/emscripten/issues/12035>
Jan-Marek Glogowski3dd7e772021-04-23 14:04:06 +0200313
314We're also using emconfigure at the moment. Originally I patched emscripten, because it
Andrea Gelmini5f102422021-05-05 23:38:21 +0200315wouldn't create the correct a.out file for C++ configure tests. Later I found that
Hosseind19299f2021-10-10 19:59:20 +0200316the `emconfigure` sets `EMMAKEN_JUST_CONFIGURE` to work around the problem.
Jan-Marek Glogowski3dd7e772021-04-23 14:04:06 +0200317
Hosseind19299f2021-10-10 19:59:20 +0200318ICU bug:
319
320- <https://github.com/emscripten-core/emscripten/issues/10129>
321
322Alternative, probably:
323
324- <https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Intl>
Jan-Marek Glogowski3dd7e772021-04-23 14:04:06 +0200325
326There is a wasm64, but that still uses 32bit pointers!
327
Hosseind19299f2021-10-10 19:59:20 +0200328Old outdated docs:
Jan-Marek Glogowski3dd7e772021-04-23 14:04:06 +0200329
Hosseind19299f2021-10-10 19:59:20 +0200330- <https://wiki.documentfoundation.org/Development/Emscripten>
Jan-Marek Glogowski3dd7e772021-04-23 14:04:06 +0200331
Hosseind19299f2021-10-10 19:59:20 +0200332Reverted patch:
Jan-Marek Glogowski3dd7e772021-04-23 14:04:06 +0200333
Hosseind19299f2021-10-10 19:59:20 +0200334- <https://cgit.freedesktop.org/libreoffice/core/commit/?id=0e21f6619c72f1e17a7b0a52b6317810973d8a3e>
Jan-Marek Glogowski3dd7e772021-04-23 14:04:06 +0200335
Hosseind19299f2021-10-10 19:59:20 +0200336Generally <https://emscripten.org/docs/porting>:
Jan-Marek Glogowski3dd7e772021-04-23 14:04:06 +0200337
Hosseind19299f2021-10-10 19:59:20 +0200338- <https://emscripten.org/docs/porting/guidelines/api_limitations.html#api-limitations>
339- <https://emscripten.org/docs/porting/files/file_systems_overview.html#file-system-overview>
340- <https://emscripten.org/docs/porting/pthreads.html>
341- <https://emscripten.org/docs/porting/emscripten-runtime-environment.html>
342
343This will be interesting:
344
345- <https://emscripten.org/docs/getting_started/FAQ.html#how-do-i-run-an-event-loop>
346
347This didn't help much yet:
348
349- <https://github.com/emscripten-ports>
350
351Emscripten supports standalone WASI binaries:
352
353- <https://github.com/emscripten-core/emscripten/wiki/WebAssembly-Standalone>
354- <https://www.qt.io/qt-examples-for-webassembly>
355- <http://qtandeverything.blogspot.com/2017/06/qt-for-web-assembly.html>
356- <http://qtandeverything.blogspot.com/2020/>
357- <https://emscripten.org/docs/api_reference/Filesystem-API.html>
358- <https://discuss.python.org/t/add-a-webassembly-wasm-runtime/3957/12>
359- <http://git.savannah.gnu.org/cgit/config.git>
360- <https://webassembly.org/specs/>
361- <https://developer.chrome.com/docs/native-client/>
362- <https://emscripten.org/docs/getting_started/downloads.html>
363- <https://github.com/openpgpjs/openpgpjs/blob/master/README.md#getting-started>
364- <https://developer.mozilla.org/en-US/docs/WebAssembly/Using_the_JavaScript_API>
365- <https://github.com/bytecodealliance/wasmtime/blob/main/docs/WASI-intro.md>
366- <https://www.ip6.li/de/security/x.509_kochbuch/openssl-fuer-webassembly-compilieren>
367- <https://emscripten.org/docs/introducing_emscripten/about_emscripten.html#about-emscripten-porting-code>
368- <https://emscripten.org/docs/compiling/Building-Projects.html>
Jan-Marek Glogowski3dd7e772021-04-23 14:04:06 +0200369
Tor Lillqvist6f6b8792023-02-02 13:38:02 +0200370## Building headless LibreOffice as WASM for use in another product
371
372### Set up Emscripten
373
374Follow the instructions in the first part of this document.
375
376### No Qt needed.
377
Tor Lillqvist187d3b62023-02-06 11:57:15 +0200378You don't need any dependencies other than those that normally are
379downloaded and compiled when building LibreOffice.
Tor Lillqvist6f6b8792023-02-02 13:38:02 +0200380
381### Set up LO
382
383For instance, this autogen.input works for me:
384
385`--disable-debug`
386`--enable-sal-log`
387`--disable-crashdump`
388`--host=wasm32-local-emscripten`
389`--disable-gui`
390`--with-main-module=writer`
391
Tor Lillqvist297c71c2023-02-13 11:04:30 +0200392For building LO core for use in COWASM, it is known to work to use
393Emscripten 3.1.30 (and not just 2.0.31 which is what the LO+Qt5 work
Stephan Bergmann31729452024-03-06 12:49:43 +0100394has been using in the past).
Tor Lillqvist297c71c2023-02-13 11:04:30 +0200395
Tor Lillqvist6f6b8792023-02-02 13:38:02 +0200396### That's all
397
398After all, in this case you are building LO core headless for it to be used by other software.
Tor Lillqvist187d3b62023-02-06 11:57:15 +0200399
400Note that a soffice.wasm will be built, but that is just because of
401how the makefilery has been set up. We do need the soffice.data file
402that contains the in-memory file system needed by the LibreOffice
403Technology core code during run-time, though. That is at the moment
404built as a side-effect when building soffice.wasm.