POV-Ray 3.8 -> WebAssembly build recipe (nerdymark.com POV-Ray Studio) ====================================================================== AGPL-3.0 corresponding source = upstream POV-Ray master (commit c3ce13e) plus this recipe. Nothing else was modified. Toolchain: emscripten 6.x (brew install emscripten) 1) git clone --depth 1 https://github.com/POV-Ray/povray.git 2) One 3-line patch to unix/povconfig/syspovconfig.h - add before the __linux__ branch of the platform detection chain: #elif defined(__EMSCRIPTEN__) // Emscripten/WebAssembly detected. Use plain POSIX settings (musl libc). #include "syspovconfig_posix.h" 3) Hand-written config.h (replaces autoconf output): - PACKAGE_* / VERSION strings, BUILD_ARCH "wasm32-unknown-emscripten" - banner strings: BUILT_FOR, COMPILER_VENDOR, CXXFLAGS, BUILTIN_IO_RESTRICTIONS, BUILTIN_XWIN_DISPLAY, BUILTIN_IMG_FORMATS, MISSING_IMG_FORMATS - IO_RESTRICTIONS_DISABLED 1, HAVE_CLOCKID_T 1, HAVE_USECONDS_T 1 - HAVE_UNISTD_H/TIME_H/SYS_TIME_H/SYS_RESOURCE_H/SYS_WAIT_H 1 - HAVE_GETTIMEOFDAY/CLOCK_GETTIME/NANOSLEEP/USLEEP/GETCWD/READLINK 1 - HAVE_DECL_CLOCK_REALTIME/MONOTONIC 1, HAVE_STD_ISINF/ISNAN 1, HAVE_BOOST_HASH 1 - deliberately NOT defined: HAVE_SIGTIMEDWAIT, HAVE_GETRUSAGE, HAVE_LIBSDL 4) Compile every .cpp under source/ (except source/povmain.cpp) plus vfe/*.cpp, vfe/unix/*.cpp, platform/unix/*.cpp, unix/disp_text.cpp with: em++ -O2 -std=gnu++14 -pthread \ -DHAVE_CONFIG_H -DOPENEXR_MISSING -DLIBTIFF_MISSING \ -DBUILT_BY='"Mark (nerdymark.com), unofficial wasm build"' \ -sUSE_BOOST_HEADERS=1 -sUSE_LIBPNG=1 -sUSE_ZLIB=1 -sUSE_LIBJPEG=1 \ -I -Ipovray/unix/povconfig -Ipovray/unix -Ipovray/vfe \ -Ipovray/vfe/unix -Ipovray/source -Ipovray/platform/unix -c 5) Link (browser build): em++ -o povray-web.js -O2 -pthread \ -sUSE_BOOST_HEADERS=1 -sUSE_LIBPNG=1 -sUSE_ZLIB=1 -sUSE_LIBJPEG=1 \ -sPTHREAD_POOL_SIZE=8 -sALLOW_MEMORY_GROWTH=1 -sINITIAL_MEMORY=256MB \ -sSTACK_SIZE=8MB -sEXIT_RUNTIME=1 -sENVIRONMENT=web,worker \ -sMODULARIZE=1 -sEXPORT_NAME=createPovray -sPROXY_TO_PTHREAD \ -sEXPORTED_RUNTIME_METHODS=FS,callMain 6) Serve with COOP/COEP headers (required for SharedArrayBuffer/pthreads): Cross-Origin-Opener-Policy: same-origin Cross-Origin-Embedder-Policy: require-corp