From 924eec1daa5ed62d47e98538766a12f4762632bc Mon Sep 17 00:00:00 2001 From: Lorn Potter Date: Wed, 24 Aug 2022 10:47:25 +1000 Subject: wasm: add support for wasm64 build MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This adds a new platform named wasm-emscripten-64 which sets the build and link argument -MEMORY64 You may see this warning, please ignore at your own discretion: em++: warning: -sMEMORY64 is still experimental. Many features may not work. [-Wexperimental] Fixes: QTBUG-104891 Change-Id: I8d3150d239ba72dbef5c2352e0171d6cfbe51b59 Reviewed-by: Morten Johan Sørvig --- mkspecs/common/wasm/qplatformdefs.h | 145 +++++++++++++++++++++++++++++ mkspecs/common/wasm/wasm.conf | 86 +++++++++++++++++ mkspecs/wasm-emscripten-64/qmake.conf | 7 ++ mkspecs/wasm-emscripten-64/qplatformdefs.h | 9 ++ mkspecs/wasm-emscripten/qmake.conf | 85 +---------------- mkspecs/wasm-emscripten/qplatformdefs.h | 140 +--------------------------- 6 files changed, 250 insertions(+), 222 deletions(-) create mode 100644 mkspecs/common/wasm/qplatformdefs.h create mode 100644 mkspecs/common/wasm/wasm.conf create mode 100644 mkspecs/wasm-emscripten-64/qmake.conf create mode 100644 mkspecs/wasm-emscripten-64/qplatformdefs.h (limited to 'mkspecs') diff --git a/mkspecs/common/wasm/qplatformdefs.h b/mkspecs/common/wasm/qplatformdefs.h new file mode 100644 index 0000000000..45545713df --- /dev/null +++ b/mkspecs/common/wasm/qplatformdefs.h @@ -0,0 +1,145 @@ +// Copyright (C) 2018 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef Q_WASM_PLATFORMDEFS_H +#define Q_WASM_PLATFORMDEFS_H + +// Get Qt defines/settings + +#include "qglobal.h" + +// Set any POSIX/XOPEN defines at the top of this file to turn on specific APIs + +// 1) need to reset default environment if _BSD_SOURCE is defined +// 2) need to specify POSIX thread interfaces explicitly in glibc 2.0 +// 3) it seems older glibc need this to include the X/Open stuff + +#include + +// We are hot - unistd.h should have turned on the specific APIs we requested + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#ifndef QT_NO_IPV6IFNAME +#include +#endif + +#ifndef _GNU_SOURCE +# define _GNU_SOURCE +#endif + +#ifdef QT_LARGEFILE_SUPPORT +#define QT_STATBUF struct stat64 +#define QT_STATBUF4TSTAT struct stat64 +#define QT_STAT ::stat64 +#define QT_FSTAT ::fstat64 +#define QT_LSTAT ::lstat64 +#define QT_OPEN ::open64 +#define QT_TRUNCATE ::truncate64 +#define QT_FTRUNCATE ::ftruncate64 +#define QT_LSEEK ::lseek64 +#else +#define QT_STATBUF struct stat +#define QT_STATBUF4TSTAT struct stat +#define QT_STAT ::stat +#define QT_FSTAT ::fstat +#define QT_LSTAT ::lstat +#define QT_OPEN ::open +#define QT_TRUNCATE ::truncate +#define QT_FTRUNCATE ::ftruncate +#define QT_LSEEK ::lseek +#endif + +#ifdef QT_LARGEFILE_SUPPORT +#define QT_FOPEN ::fopen64 +#define QT_FSEEK ::fseeko64 +#define QT_FTELL ::ftello64 +#define QT_FGETPOS ::fgetpos64 +#define QT_FSETPOS ::fsetpos64 +#define QT_MMAP ::mmap64 +#define QT_FPOS_T fpos64_t +#define QT_OFF_T off64_t +#else +#define QT_FOPEN ::fopen +#define QT_FSEEK ::fseek +#define QT_FTELL ::ftell +#define QT_FGETPOS ::fgetpos +#define QT_FSETPOS ::fsetpos +#define QT_MMAP ::mmap +#define QT_FPOS_T fpos_t +#define QT_OFF_T long +#endif + +#define QT_STAT_REG S_IFREG +#define QT_STAT_DIR S_IFDIR +#define QT_STAT_MASK S_IFMT +#define QT_STAT_LNK S_IFLNK +#define QT_SOCKET_CONNECT ::connect +#define QT_SOCKET_BIND ::bind +#define QT_FILENO fileno +#define QT_CLOSE ::close +#define QT_READ ::read +#define QT_WRITE ::write +#define QT_ACCESS ::access +#define QT_GETCWD ::getcwd +#define QT_CHDIR ::chdir +#define QT_MKDIR ::mkdir +#define QT_RMDIR ::rmdir +#define QT_OPEN_LARGEFILE O_LARGEFILE +#define QT_OPEN_RDONLY O_RDONLY +#define QT_OPEN_WRONLY O_WRONLY +#define QT_OPEN_RDWR O_RDWR +#define QT_OPEN_CREAT O_CREAT +#define QT_OPEN_TRUNC O_TRUNC +#define QT_OPEN_APPEND O_APPEND +#define QT_OPEN_EXCL O_EXCL + +// Directory iteration +#define QT_DIR DIR + +#define QT_OPENDIR ::opendir +#define QT_CLOSEDIR ::closedir + +#if defined(QT_LARGEFILE_SUPPORT) \ + && defined(QT_USE_XOPEN_LFS_EXTENSIONS) \ + && !defined(QT_NO_READDIR64) +#define QT_DIRENT struct dirent64 +#define QT_READDIR ::readdir64 +#define QT_READDIR_R ::readdir64_r +#else +#define QT_DIRENT struct dirent +#define QT_READDIR ::readdir +#define QT_READDIR_R ::readdir_r +#endif + +#define QT_SOCKET_CONNECT ::connect +#define QT_SOCKET_BIND ::bind + + +#define QT_SIGNAL_RETTYPE void +#define QT_SIGNAL_ARGS int +#define QT_SIGNAL_IGNORE SIG_IGN + +#define QT_SOCKLEN_T socklen_t + +#if defined(_XOPEN_SOURCE) && (_XOPEN_SOURCE >= 500) +#define QT_SNPRINTF ::snprintf +#define QT_VSNPRINTF ::vsnprintf +#endif + +#endif // Q_WASM_PLATFORMDEFS_H diff --git a/mkspecs/common/wasm/wasm.conf b/mkspecs/common/wasm/wasm.conf new file mode 100644 index 0000000000..0ffcfb277c --- /dev/null +++ b/mkspecs/common/wasm/wasm.conf @@ -0,0 +1,86 @@ +# qmake configuration for building with emscripten +MAKEFILE_GENERATOR = UNIX +QMAKE_PLATFORM = wasm unix + +include(../gcc-base.conf) +include(../clang.conf) + +load(device_config) +load(emcc_ver) + +# Support enabling asyncify by configuring with "-device-option QT_EMSCRIPTEN_ASYNCIFY=1" +!isEmpty(QT_EMSCRIPTEN_ASYNCIFY): { + !equals(QT_EMSCRIPTEN_ASYNCIFY, 1):!equals(QT_EMSCRIPTEN_ASYNCIFY, 0): \ + message(Error: The value for QT_EMSCRIPTEN_ASYNCIFY must be 0 or 1) + equals(QT_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 + } +} + +# Declare async functions +QMAKE_LFLAGS += -s \'ASYNCIFY_IMPORTS=qt_asyncify_suspend_js,qt_asyncify_resume_js\' + +EMCC_COMMON_LFLAGS += \ + -s WASM=1 \ + -s MAX_WEBGL_VERSION=2 \ + -s ERROR_ON_UNDEFINED_SYMBOLS=1 \ + --bind \ + -s FETCH=1 \ + -s MODULARIZE=1 \ + -s EXPORT_NAME=createQtAppInstance + -s WASM_BIGINT=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 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 += -g2 +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_RESPONSEFILE_THRESHOLD = 1 + 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) diff --git a/mkspecs/wasm-emscripten-64/qmake.conf b/mkspecs/wasm-emscripten-64/qmake.conf new file mode 100644 index 0000000000..3e03cbc97a --- /dev/null +++ b/mkspecs/wasm-emscripten-64/qmake.conf @@ -0,0 +1,7 @@ +# qmake configuration for building with emscripten + +include(../common/wasm/wasm.conf) + +QMAKE_CFLAGS += -s MEMORY64=1 +QMAKE_CXXFLAGS += -s MEMORY64=1 +QMAKE_LFLAGS += -s MEMORY64=1 diff --git a/mkspecs/wasm-emscripten-64/qplatformdefs.h b/mkspecs/wasm-emscripten-64/qplatformdefs.h new file mode 100644 index 0000000000..5117d876f7 --- /dev/null +++ b/mkspecs/wasm-emscripten-64/qplatformdefs.h @@ -0,0 +1,9 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#ifndef QPLATFORMDEFS_H +#define QPLATFORMDEFS_H + +#include "../common/wasm/qplatformdefs.h" + +#endif // QPLATFORMDEFS_H diff --git a/mkspecs/wasm-emscripten/qmake.conf b/mkspecs/wasm-emscripten/qmake.conf index 1b23ef54a3..dcbd368695 100644 --- a/mkspecs/wasm-emscripten/qmake.conf +++ b/mkspecs/wasm-emscripten/qmake.conf @@ -1,86 +1,3 @@ # 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 QT_EMSCRIPTEN_ASYNCIFY=1" -!isEmpty(QT_EMSCRIPTEN_ASYNCIFY): { - !equals(QT_EMSCRIPTEN_ASYNCIFY, 1):!equals(QT_EMSCRIPTEN_ASYNCIFY, 0): \ - message(Error: The value for QT_EMSCRIPTEN_ASYNCIFY must be 0 or 1) - equals(QT_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 - } -} - -# Declare async functions -QMAKE_LFLAGS += -s \'ASYNCIFY_IMPORTS=qt_asyncify_suspend_js,qt_asyncify_resume_js\' - -EMCC_COMMON_LFLAGS += \ - -s WASM=1 \ - -s MAX_WEBGL_VERSION=2 \ - -s ERROR_ON_UNDEFINED_SYMBOLS=1 \ - --bind \ - -s FETCH=1 \ - -s MODULARIZE=1 \ - -s EXPORT_NAME=createQtAppInstance \ - -s WASM_BIGINT=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 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 += -g2 -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_RESPONSEFILE_THRESHOLD = 1 - 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) +include(../common/wasm/wasm.conf) diff --git a/mkspecs/wasm-emscripten/qplatformdefs.h b/mkspecs/wasm-emscripten/qplatformdefs.h index 31679b6c3f..5117d876f7 100644 --- a/mkspecs/wasm-emscripten/qplatformdefs.h +++ b/mkspecs/wasm-emscripten/qplatformdefs.h @@ -1,145 +1,9 @@ -// Copyright (C) 2018 The Qt Company Ltd. +// Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only #ifndef QPLATFORMDEFS_H #define QPLATFORMDEFS_H -// Get Qt defines/settings - -#include "qglobal.h" - -// Set any POSIX/XOPEN defines at the top of this file to turn on specific APIs - -// 1) need to reset default environment if _BSD_SOURCE is defined -// 2) need to specify POSIX thread interfaces explicitly in glibc 2.0 -// 3) it seems older glibc need this to include the X/Open stuff - -#include - -// We are hot - unistd.h should have turned on the specific APIs we requested - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#ifndef QT_NO_IPV6IFNAME -#include -#endif - -#ifndef _GNU_SOURCE -# define _GNU_SOURCE -#endif - -#ifdef QT_LARGEFILE_SUPPORT -#define QT_STATBUF struct stat64 -#define QT_STATBUF4TSTAT struct stat64 -#define QT_STAT ::stat64 -#define QT_FSTAT ::fstat64 -#define QT_LSTAT ::lstat64 -#define QT_OPEN ::open64 -#define QT_TRUNCATE ::truncate64 -#define QT_FTRUNCATE ::ftruncate64 -#define QT_LSEEK ::lseek64 -#else -#define QT_STATBUF struct stat -#define QT_STATBUF4TSTAT struct stat -#define QT_STAT ::stat -#define QT_FSTAT ::fstat -#define QT_LSTAT ::lstat -#define QT_OPEN ::open -#define QT_TRUNCATE ::truncate -#define QT_FTRUNCATE ::ftruncate -#define QT_LSEEK ::lseek -#endif - -#ifdef QT_LARGEFILE_SUPPORT -#define QT_FOPEN ::fopen64 -#define QT_FSEEK ::fseeko64 -#define QT_FTELL ::ftello64 -#define QT_FGETPOS ::fgetpos64 -#define QT_FSETPOS ::fsetpos64 -#define QT_MMAP ::mmap64 -#define QT_FPOS_T fpos64_t -#define QT_OFF_T off64_t -#else -#define QT_FOPEN ::fopen -#define QT_FSEEK ::fseek -#define QT_FTELL ::ftell -#define QT_FGETPOS ::fgetpos -#define QT_FSETPOS ::fsetpos -#define QT_MMAP ::mmap -#define QT_FPOS_T fpos_t -#define QT_OFF_T long -#endif - -#define QT_STAT_REG S_IFREG -#define QT_STAT_DIR S_IFDIR -#define QT_STAT_MASK S_IFMT -#define QT_STAT_LNK S_IFLNK -#define QT_SOCKET_CONNECT ::connect -#define QT_SOCKET_BIND ::bind -#define QT_FILENO fileno -#define QT_CLOSE ::close -#define QT_READ ::read -#define QT_WRITE ::write -#define QT_ACCESS ::access -#define QT_GETCWD ::getcwd -#define QT_CHDIR ::chdir -#define QT_MKDIR ::mkdir -#define QT_RMDIR ::rmdir -#define QT_OPEN_LARGEFILE O_LARGEFILE -#define QT_OPEN_RDONLY O_RDONLY -#define QT_OPEN_WRONLY O_WRONLY -#define QT_OPEN_RDWR O_RDWR -#define QT_OPEN_CREAT O_CREAT -#define QT_OPEN_TRUNC O_TRUNC -#define QT_OPEN_APPEND O_APPEND -#define QT_OPEN_EXCL O_EXCL - -// Directory iteration -#define QT_DIR DIR - -#define QT_OPENDIR ::opendir -#define QT_CLOSEDIR ::closedir - -#if defined(QT_LARGEFILE_SUPPORT) \ - && defined(QT_USE_XOPEN_LFS_EXTENSIONS) \ - && !defined(QT_NO_READDIR64) -#define QT_DIRENT struct dirent64 -#define QT_READDIR ::readdir64 -#define QT_READDIR_R ::readdir64_r -#else -#define QT_DIRENT struct dirent -#define QT_READDIR ::readdir -#define QT_READDIR_R ::readdir_r -#endif - -#define QT_SOCKET_CONNECT ::connect -#define QT_SOCKET_BIND ::bind - - -#define QT_SIGNAL_RETTYPE void -#define QT_SIGNAL_ARGS int -#define QT_SIGNAL_IGNORE SIG_IGN - -#define QT_SOCKLEN_T socklen_t - -#if defined(_XOPEN_SOURCE) && (_XOPEN_SOURCE >= 500) -#define QT_SNPRINTF ::snprintf -#define QT_VSNPRINTF ::vsnprintf -#endif +#include "../common/wasm/qplatformdefs.h" #endif // QPLATFORMDEFS_H -- cgit v1.2.3