# qmake configuration for building with emscripten
MAKEFILE_GENERATOR      = UNIX
QMAKE_PLATFORM          = wasm unix

include(../common/gcc-base.conf)
include(../common/clang.conf)

load(device_config)
load(emcc_ver)

# Support enabling asyncify by configuring with "-device-option EMSCRIPTEN_ASYNCIFY=1"
!isEmpty(EMSCRIPTEN_ASYNCIFY): {
    !equals(EMSCRIPTEN_ASYNCIFY, 1):!equals(EMSCRIPTEN_ASYNCIFY, 0): \
        message(Error: The value for EMSCRIPTEN_ASYNCIFY must be 0 or 1)
    equals(EMSCRIPTEN_ASYNCIFY, 1): {
        QMAKE_CFLAGS += -DQT_HAVE_EMSCRIPTEN_ASYNCIFY
        QMAKE_CXXFLAGS += -DQT_HAVE_EMSCRIPTEN_ASYNCIFY
        QMAKE_LFLAGS += -s ASYNCIFY

        # Emscripten recommends building with optimizations when using asyncify
        # in order to reduce wasm file size, and may also generate broken wasm
        # (with "wasm validation error: too many locals" type errors) if optimizations
        # are omitted. Enable optimizations also for debug builds.
        QMAKE_LFLAGS_DEBUG  += -Os
    }
}

EMTERP_FLAGS = \
    -s EMTERPRETIFY=1  \
    -s EMTERPRETIFY_ASYNC=1 \
    -s \"EMTERPRETIFY_FILE=\'data.binary\'\" \
    -s ASSERTIONS=1 \
    --profiling-funcs

EMCC_COMMON_LFLAGS += \
    -s WASM=1 \
    -s FULL_ES2=1 \
    -s FULL_ES3=1 \
    -s USE_WEBGL2=1 \
    -s EXIT_RUNTIME=1 \
    -s ERROR_ON_UNDEFINED_SYMBOLS=1 \
    -s EXTRA_EXPORTED_RUNTIME_METHODS=[\"UTF16ToString\",\"stringToUTF16\"] \
    --bind \
    -s FETCH=1

# The -s arguments can also be used with release builds,
# but are here in debug for clarity.
EMCC_COMMON_LFLAGS_DEBUG = \
    $$EMCC_COMMON_LFLAGS \
    -s ASSERTIONS=2 \
    -s DEMANGLE_SUPPORT=1 \
    # -s LIBRARY_DEBUG=1 \ #print out library calls, verbose
    # -s SYSCALL_DEBUG=1 \ #print out sys calls, verbose
    # -s FS_LOG=1 \ #print out filesystem ops, verbose
    # -s SOCKET_DEBUG \ #print out socket,network data transfer
    -s GL_DEBUG=1 \
    --profiling-funcs

QMAKE_LFLAGS_DEBUG  += -g4
QMAKE_LFLAGS_RELEASE  += -O2

QMAKE_COMPILER         += emscripten

QMAKE_CC                = emcc
QMAKE_CXX               = em++

QMAKE_LINK              = $$QMAKE_CXX
QMAKE_LINK_SHLIB        = $$QMAKE_CXX
QMAKE_LINK_C            = $$QMAKE_CC
QMAKE_LINK_C_SHLIB      = $$QMAKE_CC

QMAKE_LIBS_THREAD       = $$QMAKE_CFLAGS_THREAD

QMAKE_LFLAGS           += $$EMCC_COMMON_LFLAGS
QMAKE_LFLAGS_DEBUG     += $$EMCC_COMMON_LFLAGS_DEBUG

QMAKE_PREFIX_SHLIB      = lib
QMAKE_EXTENSION_SHLIB   = so       # llvm bitcode, linked to js in post_link
QMAKE_PREFIX_STATICLIB  = lib
QMAKE_EXTENSION_STATICLIB = a      # llvm bitcode

QMAKE_AR                = emar cqs
equals(QMAKE_HOST.os, Windows) {
    QMAKE_AR_CMD = \
        "$(file >$(OBJECTS_DIR)/$(TARGET).rsp, $(subst \\,/,$(OBJECTS)))$$escape_expand(\\n\\t)" \
        "$(AR) $(DESTDIR)$(TARGET) @$(OBJECTS_DIR)/$(TARGET).rsp"
}

QMAKE_DISTCLEAN            += *.html *.js *.wasm

load(qt_config)
