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/wasm-emscripten/qmake.conf | 85 +------------------ mkspecs/wasm-emscripten/qplatformdefs.h | 140 +------------------------------- 2 files changed, 3 insertions(+), 222 deletions(-) (limited to 'mkspecs/wasm-emscripten') 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