| |
| |
| # DESTDIR will be empty if not set in the app .pro file; make sure it has a value |
| isEmpty(DESTDIR): DESTDIR = $$OUT_PWD |
| |
| exists($$QMAKE_QT_CONFIG) { |
| ## this may be subject to change |
| |
| qtConfig(thread) { |
| |
| EMCC_THREAD_LFLAGS += -s USE_PTHREADS=1 |
| |
| # Create worker threads at startup. This is supposed to be an optimization, |
| # however exceeding the pool size has been obesverved to hang the application. |
| POOL_SIZE = 4 |
| !isEmpty(QMAKE_WASM_PTHREAD_POOL_SIZE) { |
| POOL_SIZE = $$QMAKE_WASM_PTHREAD_POOL_SIZE |
| } |
| |
| message("Setting PTHREAD_POOL_SIZE to" $$POOL_SIZE) |
| EMCC_THREAD_LFLAGS += -s PTHREAD_POOL_SIZE=$$POOL_SIZE |
| } else { |
| EMCC_THREAD_LFLAGS += -s ALLOW_MEMORY_GROWTH=1 |
| } |
| |
| qtConfig(thread) | !isEmpty(QMAKE_WASM_TOTAL_MEMORY) { |
| |
| # Hardcode wasm memory size. Emscripten does not currently support memory growth |
| # (ALLOW_MEMORY_GROWTH) in pthreads mode, and requires specifying the memory size |
| # at build time. Further, browsers limit the maximum initial memory size to 1GB. |
| # QMAKE_WASM_TOTAL_MEMORY must be a multiple of 64KB |
| TOTAL_MEMORY = 1GB |
| !isEmpty(QMAKE_WASM_TOTAL_MEMORY) { |
| TOTAL_MEMORY = $$QMAKE_WASM_TOTAL_MEMORY |
| } |
| message("Setting TOTAL_MEMORY to" $$TOTAL_MEMORY) |
| EMCC_THREAD_LFLAGS += -s TOTAL_MEMORY=$$TOTAL_MEMORY |
| } |
| QMAKE_LFLAGS += $$EMCC_THREAD_LFLAGS |
| QMAKE_LFLAGS_DEBUG += $$EMCC_THREAD_LFLAGS |
| QMAKE_CFLAGS += $$EMCC_THREAD_LFLAGS |
| QMAKE_CXXFLAGS += $$EMCC_THREAD_LFLAGS |
| } |
| |
| # Create js and wasm files for applications |
| contains(TEMPLATE, .*app) { |
| TARGET_BASE = $${TARGET} |
| TARGET_HTML = $${TARGET}.html |
| TARGET_JS = $${TARGET}.js |
| |
| # Make the emscripten compiler generate a js file |
| TARGET = $$TARGET_JS |
| |
| QMAKE_INCDIR += $$(HOME)/.emscripten_ports/openssl/include |
| |
| CONFIG += static |
| js_file.files = $$TARGET_JS |
| js_file.path = $$target.path |
| isEmpty(js_file.path): \ |
| js_file.path += ./ |
| INSTALLS += js_file |
| |
| # Copy hosting html and javascript to the application build directory. |
| exists($$[QT_INSTALL_PLUGINS]/platforms/wasm_shell.html) { |
| # don't pass this until it's installed somewhere |
| # otherwise makespec test fails during qt configure |
| WASM_PLUGIN_PATH = $$[QT_INSTALL_PLUGINS]/platforms |
| } else { |
| ## internal build. not installed |
| WASM_PLUGIN_PATH = $$PWD/../../../src/plugins/platforms/wasm |
| } |
| |
| # Copy/Generate main .html file (e.g. myapp.html) from the webassembly_shell.html by |
| # replacing the app name placeholder with the actual app name. |
| apphtml.name = application main html file |
| apphtml.output = $$DESTDIR/$$TARGET_HTML |
| apphtml.commands = $$QMAKE_STREAM_EDITOR -e s/@APPNAME@/$$TARGET_BASE/g $$WASM_PLUGIN_PATH/wasm_shell.html > $$DESTDIR/$$TARGET_HTML |
| apphtml.input = $$WASM_PLUGIN_PATH/wasm_shell.html |
| apphtml.depends = $$apphtml.input |
| QMAKE_EXTRA_COMPILERS += apphtml |
| |
| appjs.name = application qtloader.js |
| appjs.output = $$DESTDIR/qtloader.js |
| appjs.commands = $$QMAKE_COPY $$shell_path($$WASM_PLUGIN_PATH/qtloader.js) $$shell_path($$DESTDIR) |
| appjs.input = $$WASM_PLUGIN_PATH/qtloader.js |
| appjs.depends = $$appjs.input |
| QMAKE_EXTRA_COMPILERS += appjs |
| |
| appsvg.name = application qtlogo.svg |
| appsvg.output = $$DESTDIR/qtlogo.svg |
| appsvg.commands = $$QMAKE_COPY $$shell_path($$WASM_PLUGIN_PATH/qtlogo.svg) $$shell_path($$DESTDIR) |
| appsvg.input = $$WASM_PLUGIN_PATH/qtlogo.svg |
| appsvg.depends = $$appsvg.input |
| QMAKE_EXTRA_COMPILERS += appsvg |
| |
| QMAKE_EXTRA_TARGETS += apphtml appjs appsvg |
| POST_TARGETDEPS += apphtml appjs appsvg |
| |
| # Add manual target to make "make -B shellfiles" work. |
| shellfiles.target = shellfiles |
| shellfiles.depends = apphtml appjs appsvg |
| QMAKE_EXTRA_TARGETS += shellfiles |
| |
| # emscripten ports are linked into the main module (this app), not the Qt |
| # libs which reference them |
| qt { |
| qt_depends = $$resolve_depends(QT, "QT.") |
| contains(qt_depends, core(-private)?): QMAKE_LFLAGS += \ |
| $$QMAKE_LIBS_THREAD $$QMAKE_LIBS_ZLIB |
| contains(qt_depends, gui(-private)?): QMAKE_LFLAGS += \ |
| $$QMAKE_LIBS_FREETYPE $$QMAKE_LIBS_LIBPNG |
| } |
| } |
| |
| qtConfTest_emccVersion() |
| |
| # Pass --source-map-base on the linker line. This informs the |
| # browser where to find the source files when debugging. |
| WASM_SOURCE_MAP_BASE = http://localhost:8000/ |
| !isEmpty(QMAKE_WASM_SOURCE_MAP_BASE):\ |
| WASM_SOURCE_MAP_BASE = $$QMAKE_WASM_SOURCE_MAP_BASE |
| CONFIG(debug): QMAKE_LFLAGS += --source-map-base $$WASM_SOURCE_MAP_BASE |
| |
| # Creates the stand-alone version of the library from bitcode |
| !static:contains(TEMPLATE, .*lib): { |
| load(resolve_target) |
| QMAKE_POST_LINK += $$QMAKE_LINK_SHLIB $$QMAKE_RESOLVED_TARGET -o $${QMAKE_RESOLVED_TARGET}.js |
| |
| QMAKE_INCDIR += $$(HOME)/.emscripten_ports/openssl/include |
| } |