summaryrefslogtreecommitdiffstats
path: root/mkspecs/features/wasm/wasm.prf
blob: 2e886fc4a5ff097be14870fb77015e4c0fe61258 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130


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