

# 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
}
