Files
qt-creator/src/plugins/webassembly/webassemblytoolchain.cpp

205 lines
7.0 KiB
C++
Raw Normal View History

/****************************************************************************
**
WebAssembly: Revamp Emscripten SDK registration and toolchain handling Qt Creator's ability to register Emscripten toolchains depended on an SDK being activated "globally", and on the presence of the ~/.emscripten file. Qt Creator would parse that file in order to determine the location of the compiler and the necessary environment variables that have to be set. As of recently, the Emscripten SDK does neither activate gobally anymore, nor is the ~/.emscripten generated. This change here addresses the new situation in a couple of ways: - Instead of trying to silently detect everything, add a UI (IOptionsPageWidget) that lets the user select the Emscripten SDK root. - Instead of parsing the ~/.emscripten file, parse the output of the emsdk_env tool to determine the toolchain environment (ToolChain::addToEnvironment). The parsing is cached. A test for the parsing is included. - Instead of registering the underlying clang as compiler, register the emcc/em++ wrapper scripts, which are (also as of recently) compatible with Qt Creator's way of determining gcc's predefined macros and built- in header paths. One Emscripten SDK is registered globally in Qt Creator. When changing that, the previous Emscripten toolchains are removed, the new ones are registered and the kit are "fixed" to use those. On startup, an InfoBar entry is shown if Qt for Webassembly kits exist and no Emscripten toolchains are present. That's the case for first-time use after installing Qt for Webassembly via Qt SDK installer. The InfoBar entry opens up the IOptionsPageWidget. Qt 5.15.0 for WebAssembly and Emscripten SDK 1.39.0 are the minimum supported versions. The new UI will show warnings accordingly. Task-number: QTCREATORBUG-24811 Fixes: QTCREATORBUG-24822 Fixes: QTCREATORBUG-24814 Fixes: QTCREATORBUG-23741 Fixes: QTCREATORBUG-23561 Fixes: QTCREATORBUG-23160 Fixes: QTCREATORBUG-23126 Change-Id: I017c61586b17e815bb20a90e3f305a6bf705da36 Reviewed-by: hjk <hjk@qt.io>
2020-11-03 00:20:43 +01:00
** Copyright (C) 2020 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of Qt Creator.
**
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
****************************************************************************/
#include "webassemblytoolchain.h"
#include "webassemblyconstants.h"
WebAssembly: Revamp Emscripten SDK registration and toolchain handling Qt Creator's ability to register Emscripten toolchains depended on an SDK being activated "globally", and on the presence of the ~/.emscripten file. Qt Creator would parse that file in order to determine the location of the compiler and the necessary environment variables that have to be set. As of recently, the Emscripten SDK does neither activate gobally anymore, nor is the ~/.emscripten generated. This change here addresses the new situation in a couple of ways: - Instead of trying to silently detect everything, add a UI (IOptionsPageWidget) that lets the user select the Emscripten SDK root. - Instead of parsing the ~/.emscripten file, parse the output of the emsdk_env tool to determine the toolchain environment (ToolChain::addToEnvironment). The parsing is cached. A test for the parsing is included. - Instead of registering the underlying clang as compiler, register the emcc/em++ wrapper scripts, which are (also as of recently) compatible with Qt Creator's way of determining gcc's predefined macros and built- in header paths. One Emscripten SDK is registered globally in Qt Creator. When changing that, the previous Emscripten toolchains are removed, the new ones are registered and the kit are "fixed" to use those. On startup, an InfoBar entry is shown if Qt for Webassembly kits exist and no Emscripten toolchains are present. That's the case for first-time use after installing Qt for Webassembly via Qt SDK installer. The InfoBar entry opens up the IOptionsPageWidget. Qt 5.15.0 for WebAssembly and Emscripten SDK 1.39.0 are the minimum supported versions. The new UI will show warnings accordingly. Task-number: QTCREATORBUG-24811 Fixes: QTCREATORBUG-24822 Fixes: QTCREATORBUG-24814 Fixes: QTCREATORBUG-23741 Fixes: QTCREATORBUG-23561 Fixes: QTCREATORBUG-23160 Fixes: QTCREATORBUG-23126 Change-Id: I017c61586b17e815bb20a90e3f305a6bf705da36 Reviewed-by: hjk <hjk@qt.io>
2020-11-03 00:20:43 +01:00
#include "webassemblyemsdk.h"
#include <projectexplorer/devicesupport/devicemanager.h>
WebAssembly: Revamp Emscripten SDK registration and toolchain handling Qt Creator's ability to register Emscripten toolchains depended on an SDK being activated "globally", and on the presence of the ~/.emscripten file. Qt Creator would parse that file in order to determine the location of the compiler and the necessary environment variables that have to be set. As of recently, the Emscripten SDK does neither activate gobally anymore, nor is the ~/.emscripten generated. This change here addresses the new situation in a couple of ways: - Instead of trying to silently detect everything, add a UI (IOptionsPageWidget) that lets the user select the Emscripten SDK root. - Instead of parsing the ~/.emscripten file, parse the output of the emsdk_env tool to determine the toolchain environment (ToolChain::addToEnvironment). The parsing is cached. A test for the parsing is included. - Instead of registering the underlying clang as compiler, register the emcc/em++ wrapper scripts, which are (also as of recently) compatible with Qt Creator's way of determining gcc's predefined macros and built- in header paths. One Emscripten SDK is registered globally in Qt Creator. When changing that, the previous Emscripten toolchains are removed, the new ones are registered and the kit are "fixed" to use those. On startup, an InfoBar entry is shown if Qt for Webassembly kits exist and no Emscripten toolchains are present. That's the case for first-time use after installing Qt for Webassembly via Qt SDK installer. The InfoBar entry opens up the IOptionsPageWidget. Qt 5.15.0 for WebAssembly and Emscripten SDK 1.39.0 are the minimum supported versions. The new UI will show warnings accordingly. Task-number: QTCREATORBUG-24811 Fixes: QTCREATORBUG-24822 Fixes: QTCREATORBUG-24814 Fixes: QTCREATORBUG-23741 Fixes: QTCREATORBUG-23561 Fixes: QTCREATORBUG-23160 Fixes: QTCREATORBUG-23126 Change-Id: I017c61586b17e815bb20a90e3f305a6bf705da36 Reviewed-by: hjk <hjk@qt.io>
2020-11-03 00:20:43 +01:00
#include <projectexplorer/kitmanager.h>
#include <projectexplorer/projectexplorerconstants.h>
#include <projectexplorer/projectmacro.h>
#include <projectexplorer/toolchainmanager.h>
WebAssembly: Revamp Emscripten SDK registration and toolchain handling Qt Creator's ability to register Emscripten toolchains depended on an SDK being activated "globally", and on the presence of the ~/.emscripten file. Qt Creator would parse that file in order to determine the location of the compiler and the necessary environment variables that have to be set. As of recently, the Emscripten SDK does neither activate gobally anymore, nor is the ~/.emscripten generated. This change here addresses the new situation in a couple of ways: - Instead of trying to silently detect everything, add a UI (IOptionsPageWidget) that lets the user select the Emscripten SDK root. - Instead of parsing the ~/.emscripten file, parse the output of the emsdk_env tool to determine the toolchain environment (ToolChain::addToEnvironment). The parsing is cached. A test for the parsing is included. - Instead of registering the underlying clang as compiler, register the emcc/em++ wrapper scripts, which are (also as of recently) compatible with Qt Creator's way of determining gcc's predefined macros and built- in header paths. One Emscripten SDK is registered globally in Qt Creator. When changing that, the previous Emscripten toolchains are removed, the new ones are registered and the kit are "fixed" to use those. On startup, an InfoBar entry is shown if Qt for Webassembly kits exist and no Emscripten toolchains are present. That's the case for first-time use after installing Qt for Webassembly via Qt SDK installer. The InfoBar entry opens up the IOptionsPageWidget. Qt 5.15.0 for WebAssembly and Emscripten SDK 1.39.0 are the minimum supported versions. The new UI will show warnings accordingly. Task-number: QTCREATORBUG-24811 Fixes: QTCREATORBUG-24822 Fixes: QTCREATORBUG-24814 Fixes: QTCREATORBUG-23741 Fixes: QTCREATORBUG-23561 Fixes: QTCREATORBUG-23160 Fixes: QTCREATORBUG-23126 Change-Id: I017c61586b17e815bb20a90e3f305a6bf705da36 Reviewed-by: hjk <hjk@qt.io>
2020-11-03 00:20:43 +01:00
#include <qtsupport/qtkitinformation.h>
WebAssembly: Revamp Emscripten SDK registration and toolchain handling Qt Creator's ability to register Emscripten toolchains depended on an SDK being activated "globally", and on the presence of the ~/.emscripten file. Qt Creator would parse that file in order to determine the location of the compiler and the necessary environment variables that have to be set. As of recently, the Emscripten SDK does neither activate gobally anymore, nor is the ~/.emscripten generated. This change here addresses the new situation in a couple of ways: - Instead of trying to silently detect everything, add a UI (IOptionsPageWidget) that lets the user select the Emscripten SDK root. - Instead of parsing the ~/.emscripten file, parse the output of the emsdk_env tool to determine the toolchain environment (ToolChain::addToEnvironment). The parsing is cached. A test for the parsing is included. - Instead of registering the underlying clang as compiler, register the emcc/em++ wrapper scripts, which are (also as of recently) compatible with Qt Creator's way of determining gcc's predefined macros and built- in header paths. One Emscripten SDK is registered globally in Qt Creator. When changing that, the previous Emscripten toolchains are removed, the new ones are registered and the kit are "fixed" to use those. On startup, an InfoBar entry is shown if Qt for Webassembly kits exist and no Emscripten toolchains are present. That's the case for first-time use after installing Qt for Webassembly via Qt SDK installer. The InfoBar entry opens up the IOptionsPageWidget. Qt 5.15.0 for WebAssembly and Emscripten SDK 1.39.0 are the minimum supported versions. The new UI will show warnings accordingly. Task-number: QTCREATORBUG-24811 Fixes: QTCREATORBUG-24822 Fixes: QTCREATORBUG-24814 Fixes: QTCREATORBUG-23741 Fixes: QTCREATORBUG-23561 Fixes: QTCREATORBUG-23160 Fixes: QTCREATORBUG-23126 Change-Id: I017c61586b17e815bb20a90e3f305a6bf705da36 Reviewed-by: hjk <hjk@qt.io>
2020-11-03 00:20:43 +01:00
#include <utils/algorithm.h>
#include <utils/environment.h>
#include <utils/fileutils.h>
#include <utils/hostosinfo.h>
#include <utils/qtcassert.h>
WebAssembly: Revamp Emscripten SDK registration and toolchain handling Qt Creator's ability to register Emscripten toolchains depended on an SDK being activated "globally", and on the presence of the ~/.emscripten file. Qt Creator would parse that file in order to determine the location of the compiler and the necessary environment variables that have to be set. As of recently, the Emscripten SDK does neither activate gobally anymore, nor is the ~/.emscripten generated. This change here addresses the new situation in a couple of ways: - Instead of trying to silently detect everything, add a UI (IOptionsPageWidget) that lets the user select the Emscripten SDK root. - Instead of parsing the ~/.emscripten file, parse the output of the emsdk_env tool to determine the toolchain environment (ToolChain::addToEnvironment). The parsing is cached. A test for the parsing is included. - Instead of registering the underlying clang as compiler, register the emcc/em++ wrapper scripts, which are (also as of recently) compatible with Qt Creator's way of determining gcc's predefined macros and built- in header paths. One Emscripten SDK is registered globally in Qt Creator. When changing that, the previous Emscripten toolchains are removed, the new ones are registered and the kit are "fixed" to use those. On startup, an InfoBar entry is shown if Qt for Webassembly kits exist and no Emscripten toolchains are present. That's the case for first-time use after installing Qt for Webassembly via Qt SDK installer. The InfoBar entry opens up the IOptionsPageWidget. Qt 5.15.0 for WebAssembly and Emscripten SDK 1.39.0 are the minimum supported versions. The new UI will show warnings accordingly. Task-number: QTCREATORBUG-24811 Fixes: QTCREATORBUG-24822 Fixes: QTCREATORBUG-24814 Fixes: QTCREATORBUG-23741 Fixes: QTCREATORBUG-23561 Fixes: QTCREATORBUG-23160 Fixes: QTCREATORBUG-23126 Change-Id: I017c61586b17e815bb20a90e3f305a6bf705da36 Reviewed-by: hjk <hjk@qt.io>
2020-11-03 00:20:43 +01:00
using namespace ProjectExplorer;
using namespace QtSupport;
using namespace Utils;
namespace WebAssembly {
namespace Internal {
WebAssembly: Revamp Emscripten SDK registration and toolchain handling Qt Creator's ability to register Emscripten toolchains depended on an SDK being activated "globally", and on the presence of the ~/.emscripten file. Qt Creator would parse that file in order to determine the location of the compiler and the necessary environment variables that have to be set. As of recently, the Emscripten SDK does neither activate gobally anymore, nor is the ~/.emscripten generated. This change here addresses the new situation in a couple of ways: - Instead of trying to silently detect everything, add a UI (IOptionsPageWidget) that lets the user select the Emscripten SDK root. - Instead of parsing the ~/.emscripten file, parse the output of the emsdk_env tool to determine the toolchain environment (ToolChain::addToEnvironment). The parsing is cached. A test for the parsing is included. - Instead of registering the underlying clang as compiler, register the emcc/em++ wrapper scripts, which are (also as of recently) compatible with Qt Creator's way of determining gcc's predefined macros and built- in header paths. One Emscripten SDK is registered globally in Qt Creator. When changing that, the previous Emscripten toolchains are removed, the new ones are registered and the kit are "fixed" to use those. On startup, an InfoBar entry is shown if Qt for Webassembly kits exist and no Emscripten toolchains are present. That's the case for first-time use after installing Qt for Webassembly via Qt SDK installer. The InfoBar entry opens up the IOptionsPageWidget. Qt 5.15.0 for WebAssembly and Emscripten SDK 1.39.0 are the minimum supported versions. The new UI will show warnings accordingly. Task-number: QTCREATORBUG-24811 Fixes: QTCREATORBUG-24822 Fixes: QTCREATORBUG-24814 Fixes: QTCREATORBUG-23741 Fixes: QTCREATORBUG-23561 Fixes: QTCREATORBUG-23160 Fixes: QTCREATORBUG-23126 Change-Id: I017c61586b17e815bb20a90e3f305a6bf705da36 Reviewed-by: hjk <hjk@qt.io>
2020-11-03 00:20:43 +01:00
static const Abi &toolChainAbi()
{
WebAssembly: Revamp Emscripten SDK registration and toolchain handling Qt Creator's ability to register Emscripten toolchains depended on an SDK being activated "globally", and on the presence of the ~/.emscripten file. Qt Creator would parse that file in order to determine the location of the compiler and the necessary environment variables that have to be set. As of recently, the Emscripten SDK does neither activate gobally anymore, nor is the ~/.emscripten generated. This change here addresses the new situation in a couple of ways: - Instead of trying to silently detect everything, add a UI (IOptionsPageWidget) that lets the user select the Emscripten SDK root. - Instead of parsing the ~/.emscripten file, parse the output of the emsdk_env tool to determine the toolchain environment (ToolChain::addToEnvironment). The parsing is cached. A test for the parsing is included. - Instead of registering the underlying clang as compiler, register the emcc/em++ wrapper scripts, which are (also as of recently) compatible with Qt Creator's way of determining gcc's predefined macros and built- in header paths. One Emscripten SDK is registered globally in Qt Creator. When changing that, the previous Emscripten toolchains are removed, the new ones are registered and the kit are "fixed" to use those. On startup, an InfoBar entry is shown if Qt for Webassembly kits exist and no Emscripten toolchains are present. That's the case for first-time use after installing Qt for Webassembly via Qt SDK installer. The InfoBar entry opens up the IOptionsPageWidget. Qt 5.15.0 for WebAssembly and Emscripten SDK 1.39.0 are the minimum supported versions. The new UI will show warnings accordingly. Task-number: QTCREATORBUG-24811 Fixes: QTCREATORBUG-24822 Fixes: QTCREATORBUG-24814 Fixes: QTCREATORBUG-23741 Fixes: QTCREATORBUG-23561 Fixes: QTCREATORBUG-23160 Fixes: QTCREATORBUG-23126 Change-Id: I017c61586b17e815bb20a90e3f305a6bf705da36 Reviewed-by: hjk <hjk@qt.io>
2020-11-03 00:20:43 +01:00
static const Abi abi(
Abi::AsmJsArchitecture,
Abi::UnknownOS,
Abi::UnknownFlavor,
Abi::EmscriptenFormat,
32);
return abi;
}
WebAssembly: Revamp Emscripten SDK registration and toolchain handling Qt Creator's ability to register Emscripten toolchains depended on an SDK being activated "globally", and on the presence of the ~/.emscripten file. Qt Creator would parse that file in order to determine the location of the compiler and the necessary environment variables that have to be set. As of recently, the Emscripten SDK does neither activate gobally anymore, nor is the ~/.emscripten generated. This change here addresses the new situation in a couple of ways: - Instead of trying to silently detect everything, add a UI (IOptionsPageWidget) that lets the user select the Emscripten SDK root. - Instead of parsing the ~/.emscripten file, parse the output of the emsdk_env tool to determine the toolchain environment (ToolChain::addToEnvironment). The parsing is cached. A test for the parsing is included. - Instead of registering the underlying clang as compiler, register the emcc/em++ wrapper scripts, which are (also as of recently) compatible with Qt Creator's way of determining gcc's predefined macros and built- in header paths. One Emscripten SDK is registered globally in Qt Creator. When changing that, the previous Emscripten toolchains are removed, the new ones are registered and the kit are "fixed" to use those. On startup, an InfoBar entry is shown if Qt for Webassembly kits exist and no Emscripten toolchains are present. That's the case for first-time use after installing Qt for Webassembly via Qt SDK installer. The InfoBar entry opens up the IOptionsPageWidget. Qt 5.15.0 for WebAssembly and Emscripten SDK 1.39.0 are the minimum supported versions. The new UI will show warnings accordingly. Task-number: QTCREATORBUG-24811 Fixes: QTCREATORBUG-24822 Fixes: QTCREATORBUG-24814 Fixes: QTCREATORBUG-23741 Fixes: QTCREATORBUG-23561 Fixes: QTCREATORBUG-23160 Fixes: QTCREATORBUG-23126 Change-Id: I017c61586b17e815bb20a90e3f305a6bf705da36 Reviewed-by: hjk <hjk@qt.io>
2020-11-03 00:20:43 +01:00
static void addRegisteredMinGWToEnvironment(Environment &env)
{
const ToolChain *toolChain = ToolChainManager::toolChain([](const ToolChain *t){
return t->typeId() == ProjectExplorer::Constants::MINGW_TOOLCHAIN_TYPEID;
});
if (toolChain) {
const QString mingwPath = toolChain->compilerCommand().parentDir().toUserOutput();
env.appendOrSetPath(mingwPath);
}
}
WebAssembly: Revamp Emscripten SDK registration and toolchain handling Qt Creator's ability to register Emscripten toolchains depended on an SDK being activated "globally", and on the presence of the ~/.emscripten file. Qt Creator would parse that file in order to determine the location of the compiler and the necessary environment variables that have to be set. As of recently, the Emscripten SDK does neither activate gobally anymore, nor is the ~/.emscripten generated. This change here addresses the new situation in a couple of ways: - Instead of trying to silently detect everything, add a UI (IOptionsPageWidget) that lets the user select the Emscripten SDK root. - Instead of parsing the ~/.emscripten file, parse the output of the emsdk_env tool to determine the toolchain environment (ToolChain::addToEnvironment). The parsing is cached. A test for the parsing is included. - Instead of registering the underlying clang as compiler, register the emcc/em++ wrapper scripts, which are (also as of recently) compatible with Qt Creator's way of determining gcc's predefined macros and built- in header paths. One Emscripten SDK is registered globally in Qt Creator. When changing that, the previous Emscripten toolchains are removed, the new ones are registered and the kit are "fixed" to use those. On startup, an InfoBar entry is shown if Qt for Webassembly kits exist and no Emscripten toolchains are present. That's the case for first-time use after installing Qt for Webassembly via Qt SDK installer. The InfoBar entry opens up the IOptionsPageWidget. Qt 5.15.0 for WebAssembly and Emscripten SDK 1.39.0 are the minimum supported versions. The new UI will show warnings accordingly. Task-number: QTCREATORBUG-24811 Fixes: QTCREATORBUG-24822 Fixes: QTCREATORBUG-24814 Fixes: QTCREATORBUG-23741 Fixes: QTCREATORBUG-23561 Fixes: QTCREATORBUG-23160 Fixes: QTCREATORBUG-23126 Change-Id: I017c61586b17e815bb20a90e3f305a6bf705da36 Reviewed-by: hjk <hjk@qt.io>
2020-11-03 00:20:43 +01:00
void WebAssemblyToolChain::addToEnvironment(Environment &env) const
{
WebAssembly: Revamp Emscripten SDK registration and toolchain handling Qt Creator's ability to register Emscripten toolchains depended on an SDK being activated "globally", and on the presence of the ~/.emscripten file. Qt Creator would parse that file in order to determine the location of the compiler and the necessary environment variables that have to be set. As of recently, the Emscripten SDK does neither activate gobally anymore, nor is the ~/.emscripten generated. This change here addresses the new situation in a couple of ways: - Instead of trying to silently detect everything, add a UI (IOptionsPageWidget) that lets the user select the Emscripten SDK root. - Instead of parsing the ~/.emscripten file, parse the output of the emsdk_env tool to determine the toolchain environment (ToolChain::addToEnvironment). The parsing is cached. A test for the parsing is included. - Instead of registering the underlying clang as compiler, register the emcc/em++ wrapper scripts, which are (also as of recently) compatible with Qt Creator's way of determining gcc's predefined macros and built- in header paths. One Emscripten SDK is registered globally in Qt Creator. When changing that, the previous Emscripten toolchains are removed, the new ones are registered and the kit are "fixed" to use those. On startup, an InfoBar entry is shown if Qt for Webassembly kits exist and no Emscripten toolchains are present. That's the case for first-time use after installing Qt for Webassembly via Qt SDK installer. The InfoBar entry opens up the IOptionsPageWidget. Qt 5.15.0 for WebAssembly and Emscripten SDK 1.39.0 are the minimum supported versions. The new UI will show warnings accordingly. Task-number: QTCREATORBUG-24811 Fixes: QTCREATORBUG-24822 Fixes: QTCREATORBUG-24814 Fixes: QTCREATORBUG-23741 Fixes: QTCREATORBUG-23561 Fixes: QTCREATORBUG-23160 Fixes: QTCREATORBUG-23126 Change-Id: I017c61586b17e815bb20a90e3f305a6bf705da36 Reviewed-by: hjk <hjk@qt.io>
2020-11-03 00:20:43 +01:00
WebAssemblyEmSdk::addToEnvironment(WebAssemblyEmSdk::registeredEmSdk(), env);
if (env.osType() == OsTypeWindows)
addRegisteredMinGWToEnvironment(env);
}
WebAssemblyToolChain::WebAssemblyToolChain() :
WebAssembly: Revamp Emscripten SDK registration and toolchain handling Qt Creator's ability to register Emscripten toolchains depended on an SDK being activated "globally", and on the presence of the ~/.emscripten file. Qt Creator would parse that file in order to determine the location of the compiler and the necessary environment variables that have to be set. As of recently, the Emscripten SDK does neither activate gobally anymore, nor is the ~/.emscripten generated. This change here addresses the new situation in a couple of ways: - Instead of trying to silently detect everything, add a UI (IOptionsPageWidget) that lets the user select the Emscripten SDK root. - Instead of parsing the ~/.emscripten file, parse the output of the emsdk_env tool to determine the toolchain environment (ToolChain::addToEnvironment). The parsing is cached. A test for the parsing is included. - Instead of registering the underlying clang as compiler, register the emcc/em++ wrapper scripts, which are (also as of recently) compatible with Qt Creator's way of determining gcc's predefined macros and built- in header paths. One Emscripten SDK is registered globally in Qt Creator. When changing that, the previous Emscripten toolchains are removed, the new ones are registered and the kit are "fixed" to use those. On startup, an InfoBar entry is shown if Qt for Webassembly kits exist and no Emscripten toolchains are present. That's the case for first-time use after installing Qt for Webassembly via Qt SDK installer. The InfoBar entry opens up the IOptionsPageWidget. Qt 5.15.0 for WebAssembly and Emscripten SDK 1.39.0 are the minimum supported versions. The new UI will show warnings accordingly. Task-number: QTCREATORBUG-24811 Fixes: QTCREATORBUG-24822 Fixes: QTCREATORBUG-24814 Fixes: QTCREATORBUG-23741 Fixes: QTCREATORBUG-23561 Fixes: QTCREATORBUG-23160 Fixes: QTCREATORBUG-23126 Change-Id: I017c61586b17e815bb20a90e3f305a6bf705da36 Reviewed-by: hjk <hjk@qt.io>
2020-11-03 00:20:43 +01:00
GccToolChain(Constants::WEBASSEMBLY_TOOLCHAIN_TYPEID)
{
setSupportedAbis({toolChainAbi()});
setTargetAbi(toolChainAbi());
WebAssembly: Revamp Emscripten SDK registration and toolchain handling Qt Creator's ability to register Emscripten toolchains depended on an SDK being activated "globally", and on the presence of the ~/.emscripten file. Qt Creator would parse that file in order to determine the location of the compiler and the necessary environment variables that have to be set. As of recently, the Emscripten SDK does neither activate gobally anymore, nor is the ~/.emscripten generated. This change here addresses the new situation in a couple of ways: - Instead of trying to silently detect everything, add a UI (IOptionsPageWidget) that lets the user select the Emscripten SDK root. - Instead of parsing the ~/.emscripten file, parse the output of the emsdk_env tool to determine the toolchain environment (ToolChain::addToEnvironment). The parsing is cached. A test for the parsing is included. - Instead of registering the underlying clang as compiler, register the emcc/em++ wrapper scripts, which are (also as of recently) compatible with Qt Creator's way of determining gcc's predefined macros and built- in header paths. One Emscripten SDK is registered globally in Qt Creator. When changing that, the previous Emscripten toolchains are removed, the new ones are registered and the kit are "fixed" to use those. On startup, an InfoBar entry is shown if Qt for Webassembly kits exist and no Emscripten toolchains are present. That's the case for first-time use after installing Qt for Webassembly via Qt SDK installer. The InfoBar entry opens up the IOptionsPageWidget. Qt 5.15.0 for WebAssembly and Emscripten SDK 1.39.0 are the minimum supported versions. The new UI will show warnings accordingly. Task-number: QTCREATORBUG-24811 Fixes: QTCREATORBUG-24822 Fixes: QTCREATORBUG-24814 Fixes: QTCREATORBUG-23741 Fixes: QTCREATORBUG-23561 Fixes: QTCREATORBUG-23160 Fixes: QTCREATORBUG-23126 Change-Id: I017c61586b17e815bb20a90e3f305a6bf705da36 Reviewed-by: hjk <hjk@qt.io>
2020-11-03 00:20:43 +01:00
setTypeDisplayName(tr("Emscripten Compiler"));
}
FilePath WebAssemblyToolChain::makeCommand(const Environment &environment) const
{
// Diverged duplicate of ClangToolChain::makeCommand and MingwToolChain::makeCommand
const QStringList makes = environment.osType() == OsTypeWindows
? QStringList({"mingw32-make.exe", "make.exe"})
: QStringList({"make"});
WebAssembly: Revamp Emscripten SDK registration and toolchain handling Qt Creator's ability to register Emscripten toolchains depended on an SDK being activated "globally", and on the presence of the ~/.emscripten file. Qt Creator would parse that file in order to determine the location of the compiler and the necessary environment variables that have to be set. As of recently, the Emscripten SDK does neither activate gobally anymore, nor is the ~/.emscripten generated. This change here addresses the new situation in a couple of ways: - Instead of trying to silently detect everything, add a UI (IOptionsPageWidget) that lets the user select the Emscripten SDK root. - Instead of parsing the ~/.emscripten file, parse the output of the emsdk_env tool to determine the toolchain environment (ToolChain::addToEnvironment). The parsing is cached. A test for the parsing is included. - Instead of registering the underlying clang as compiler, register the emcc/em++ wrapper scripts, which are (also as of recently) compatible with Qt Creator's way of determining gcc's predefined macros and built- in header paths. One Emscripten SDK is registered globally in Qt Creator. When changing that, the previous Emscripten toolchains are removed, the new ones are registered and the kit are "fixed" to use those. On startup, an InfoBar entry is shown if Qt for Webassembly kits exist and no Emscripten toolchains are present. That's the case for first-time use after installing Qt for Webassembly via Qt SDK installer. The InfoBar entry opens up the IOptionsPageWidget. Qt 5.15.0 for WebAssembly and Emscripten SDK 1.39.0 are the minimum supported versions. The new UI will show warnings accordingly. Task-number: QTCREATORBUG-24811 Fixes: QTCREATORBUG-24822 Fixes: QTCREATORBUG-24814 Fixes: QTCREATORBUG-23741 Fixes: QTCREATORBUG-23561 Fixes: QTCREATORBUG-23160 Fixes: QTCREATORBUG-23126 Change-Id: I017c61586b17e815bb20a90e3f305a6bf705da36 Reviewed-by: hjk <hjk@qt.io>
2020-11-03 00:20:43 +01:00
FilePath tmp;
for (const QString &make : makes) {
tmp = environment.searchInPath(make);
if (!tmp.isEmpty())
return tmp;
}
return FilePath::fromString(makes.first());
}
bool WebAssemblyToolChain::isValid() const
{
return GccToolChain::isValid()
&& QVersionNumber::fromString(version()) >= minimumSupportedEmSdkVersion();
}
const QVersionNumber &WebAssemblyToolChain::minimumSupportedEmSdkVersion()
{
static const QVersionNumber number(1, 39);
return number;
}
void WebAssemblyToolChain::registerToolChains()
{
// Remove old toolchains
for (ToolChain *tc : ToolChainManager::findToolChains(toolChainAbi())) {
if (tc->detection() != ToolChain::AutoDetection)
continue;
ToolChainManager::deregisterToolChain(tc);
};
// Create new toolchains and register them
ToolChainFactory *factory =
findOrDefault(ToolChainFactory::allToolChainFactories(), [](ToolChainFactory *f){
return f->supportedToolChainType() == Constants::WEBASSEMBLY_TOOLCHAIN_TYPEID;
});
QTC_ASSERT(factory, return);
for (auto toolChain : factory->autoDetect({}, {}))
WebAssembly: Revamp Emscripten SDK registration and toolchain handling Qt Creator's ability to register Emscripten toolchains depended on an SDK being activated "globally", and on the presence of the ~/.emscripten file. Qt Creator would parse that file in order to determine the location of the compiler and the necessary environment variables that have to be set. As of recently, the Emscripten SDK does neither activate gobally anymore, nor is the ~/.emscripten generated. This change here addresses the new situation in a couple of ways: - Instead of trying to silently detect everything, add a UI (IOptionsPageWidget) that lets the user select the Emscripten SDK root. - Instead of parsing the ~/.emscripten file, parse the output of the emsdk_env tool to determine the toolchain environment (ToolChain::addToEnvironment). The parsing is cached. A test for the parsing is included. - Instead of registering the underlying clang as compiler, register the emcc/em++ wrapper scripts, which are (also as of recently) compatible with Qt Creator's way of determining gcc's predefined macros and built- in header paths. One Emscripten SDK is registered globally in Qt Creator. When changing that, the previous Emscripten toolchains are removed, the new ones are registered and the kit are "fixed" to use those. On startup, an InfoBar entry is shown if Qt for Webassembly kits exist and no Emscripten toolchains are present. That's the case for first-time use after installing Qt for Webassembly via Qt SDK installer. The InfoBar entry opens up the IOptionsPageWidget. Qt 5.15.0 for WebAssembly and Emscripten SDK 1.39.0 are the minimum supported versions. The new UI will show warnings accordingly. Task-number: QTCREATORBUG-24811 Fixes: QTCREATORBUG-24822 Fixes: QTCREATORBUG-24814 Fixes: QTCREATORBUG-23741 Fixes: QTCREATORBUG-23561 Fixes: QTCREATORBUG-23160 Fixes: QTCREATORBUG-23126 Change-Id: I017c61586b17e815bb20a90e3f305a6bf705da36 Reviewed-by: hjk <hjk@qt.io>
2020-11-03 00:20:43 +01:00
ToolChainManager::registerToolChain(toolChain);
// Let kits pick up the new toolchains
for (Kit *kit : KitManager::kits()) {
if (!kit->isAutoDetected())
continue;
const BaseQtVersion *qtVersion = QtKitAspect::qtVersion(kit);
if (!qtVersion || qtVersion->type() != Constants::WEBASSEMBLY_QT_VERSION)
continue;
kit->fix();
}
}
bool WebAssemblyToolChain::areToolChainsRegistered()
{
return !ToolChainManager::findToolChains(toolChainAbi()).isEmpty();
}
WebAssemblyToolChainFactory::WebAssemblyToolChainFactory()
{
WebAssembly: Revamp Emscripten SDK registration and toolchain handling Qt Creator's ability to register Emscripten toolchains depended on an SDK being activated "globally", and on the presence of the ~/.emscripten file. Qt Creator would parse that file in order to determine the location of the compiler and the necessary environment variables that have to be set. As of recently, the Emscripten SDK does neither activate gobally anymore, nor is the ~/.emscripten generated. This change here addresses the new situation in a couple of ways: - Instead of trying to silently detect everything, add a UI (IOptionsPageWidget) that lets the user select the Emscripten SDK root. - Instead of parsing the ~/.emscripten file, parse the output of the emsdk_env tool to determine the toolchain environment (ToolChain::addToEnvironment). The parsing is cached. A test for the parsing is included. - Instead of registering the underlying clang as compiler, register the emcc/em++ wrapper scripts, which are (also as of recently) compatible with Qt Creator's way of determining gcc's predefined macros and built- in header paths. One Emscripten SDK is registered globally in Qt Creator. When changing that, the previous Emscripten toolchains are removed, the new ones are registered and the kit are "fixed" to use those. On startup, an InfoBar entry is shown if Qt for Webassembly kits exist and no Emscripten toolchains are present. That's the case for first-time use after installing Qt for Webassembly via Qt SDK installer. The InfoBar entry opens up the IOptionsPageWidget. Qt 5.15.0 for WebAssembly and Emscripten SDK 1.39.0 are the minimum supported versions. The new UI will show warnings accordingly. Task-number: QTCREATORBUG-24811 Fixes: QTCREATORBUG-24822 Fixes: QTCREATORBUG-24814 Fixes: QTCREATORBUG-23741 Fixes: QTCREATORBUG-23561 Fixes: QTCREATORBUG-23160 Fixes: QTCREATORBUG-23126 Change-Id: I017c61586b17e815bb20a90e3f305a6bf705da36 Reviewed-by: hjk <hjk@qt.io>
2020-11-03 00:20:43 +01:00
setDisplayName(WebAssemblyToolChain::tr("Emscripten"));
setSupportedToolChainType(Constants::WEBASSEMBLY_TOOLCHAIN_TYPEID);
setSupportedLanguages({ProjectExplorer::Constants::C_LANGUAGE_ID,
ProjectExplorer::Constants::CXX_LANGUAGE_ID});
setToolchainConstructor([] { return new WebAssemblyToolChain; });
setUserCreatable(true);
}
WebAssembly: Revamp Emscripten SDK registration and toolchain handling Qt Creator's ability to register Emscripten toolchains depended on an SDK being activated "globally", and on the presence of the ~/.emscripten file. Qt Creator would parse that file in order to determine the location of the compiler and the necessary environment variables that have to be set. As of recently, the Emscripten SDK does neither activate gobally anymore, nor is the ~/.emscripten generated. This change here addresses the new situation in a couple of ways: - Instead of trying to silently detect everything, add a UI (IOptionsPageWidget) that lets the user select the Emscripten SDK root. - Instead of parsing the ~/.emscripten file, parse the output of the emsdk_env tool to determine the toolchain environment (ToolChain::addToEnvironment). The parsing is cached. A test for the parsing is included. - Instead of registering the underlying clang as compiler, register the emcc/em++ wrapper scripts, which are (also as of recently) compatible with Qt Creator's way of determining gcc's predefined macros and built- in header paths. One Emscripten SDK is registered globally in Qt Creator. When changing that, the previous Emscripten toolchains are removed, the new ones are registered and the kit are "fixed" to use those. On startup, an InfoBar entry is shown if Qt for Webassembly kits exist and no Emscripten toolchains are present. That's the case for first-time use after installing Qt for Webassembly via Qt SDK installer. The InfoBar entry opens up the IOptionsPageWidget. Qt 5.15.0 for WebAssembly and Emscripten SDK 1.39.0 are the minimum supported versions. The new UI will show warnings accordingly. Task-number: QTCREATORBUG-24811 Fixes: QTCREATORBUG-24822 Fixes: QTCREATORBUG-24814 Fixes: QTCREATORBUG-23741 Fixes: QTCREATORBUG-23561 Fixes: QTCREATORBUG-23160 Fixes: QTCREATORBUG-23126 Change-Id: I017c61586b17e815bb20a90e3f305a6bf705da36 Reviewed-by: hjk <hjk@qt.io>
2020-11-03 00:20:43 +01:00
QList<ToolChain *> WebAssemblyToolChainFactory::autoDetect(
const QList<ToolChain *> &alreadyKnown,
const IDevice::Ptr &device)
{
Q_UNUSED(alreadyKnown)
Q_UNUSED(device)
WebAssembly: Revamp Emscripten SDK registration and toolchain handling Qt Creator's ability to register Emscripten toolchains depended on an SDK being activated "globally", and on the presence of the ~/.emscripten file. Qt Creator would parse that file in order to determine the location of the compiler and the necessary environment variables that have to be set. As of recently, the Emscripten SDK does neither activate gobally anymore, nor is the ~/.emscripten generated. This change here addresses the new situation in a couple of ways: - Instead of trying to silently detect everything, add a UI (IOptionsPageWidget) that lets the user select the Emscripten SDK root. - Instead of parsing the ~/.emscripten file, parse the output of the emsdk_env tool to determine the toolchain environment (ToolChain::addToEnvironment). The parsing is cached. A test for the parsing is included. - Instead of registering the underlying clang as compiler, register the emcc/em++ wrapper scripts, which are (also as of recently) compatible with Qt Creator's way of determining gcc's predefined macros and built- in header paths. One Emscripten SDK is registered globally in Qt Creator. When changing that, the previous Emscripten toolchains are removed, the new ones are registered and the kit are "fixed" to use those. On startup, an InfoBar entry is shown if Qt for Webassembly kits exist and no Emscripten toolchains are present. That's the case for first-time use after installing Qt for Webassembly via Qt SDK installer. The InfoBar entry opens up the IOptionsPageWidget. Qt 5.15.0 for WebAssembly and Emscripten SDK 1.39.0 are the minimum supported versions. The new UI will show warnings accordingly. Task-number: QTCREATORBUG-24811 Fixes: QTCREATORBUG-24822 Fixes: QTCREATORBUG-24814 Fixes: QTCREATORBUG-23741 Fixes: QTCREATORBUG-23561 Fixes: QTCREATORBUG-23160 Fixes: QTCREATORBUG-23126 Change-Id: I017c61586b17e815bb20a90e3f305a6bf705da36 Reviewed-by: hjk <hjk@qt.io>
2020-11-03 00:20:43 +01:00
const FilePath sdk = WebAssemblyEmSdk::registeredEmSdk();
if (!WebAssemblyEmSdk::isValid(sdk))
return {};
if (device) {
// Only detect toolchains from the emsdk installation device
const FilePath deviceRoot = device->mapToGlobalPath({});
if (deviceRoot.host() != sdk.host())
return {};
}
Environment env = sdk.deviceEnvironment();
WebAssembly: Revamp Emscripten SDK registration and toolchain handling Qt Creator's ability to register Emscripten toolchains depended on an SDK being activated "globally", and on the presence of the ~/.emscripten file. Qt Creator would parse that file in order to determine the location of the compiler and the necessary environment variables that have to be set. As of recently, the Emscripten SDK does neither activate gobally anymore, nor is the ~/.emscripten generated. This change here addresses the new situation in a couple of ways: - Instead of trying to silently detect everything, add a UI (IOptionsPageWidget) that lets the user select the Emscripten SDK root. - Instead of parsing the ~/.emscripten file, parse the output of the emsdk_env tool to determine the toolchain environment (ToolChain::addToEnvironment). The parsing is cached. A test for the parsing is included. - Instead of registering the underlying clang as compiler, register the emcc/em++ wrapper scripts, which are (also as of recently) compatible with Qt Creator's way of determining gcc's predefined macros and built- in header paths. One Emscripten SDK is registered globally in Qt Creator. When changing that, the previous Emscripten toolchains are removed, the new ones are registered and the kit are "fixed" to use those. On startup, an InfoBar entry is shown if Qt for Webassembly kits exist and no Emscripten toolchains are present. That's the case for first-time use after installing Qt for Webassembly via Qt SDK installer. The InfoBar entry opens up the IOptionsPageWidget. Qt 5.15.0 for WebAssembly and Emscripten SDK 1.39.0 are the minimum supported versions. The new UI will show warnings accordingly. Task-number: QTCREATORBUG-24811 Fixes: QTCREATORBUG-24822 Fixes: QTCREATORBUG-24814 Fixes: QTCREATORBUG-23741 Fixes: QTCREATORBUG-23561 Fixes: QTCREATORBUG-23160 Fixes: QTCREATORBUG-23126 Change-Id: I017c61586b17e815bb20a90e3f305a6bf705da36 Reviewed-by: hjk <hjk@qt.io>
2020-11-03 00:20:43 +01:00
WebAssemblyEmSdk::addToEnvironment(sdk, env);
QList<ToolChain *> result;
for (auto languageId : {ProjectExplorer::Constants::C_LANGUAGE_ID,
ProjectExplorer::Constants::CXX_LANGUAGE_ID}) {
auto toolChain = new WebAssemblyToolChain;
toolChain->setLanguage(languageId);
toolChain->setDetection(ToolChain::AutoDetection);
const bool cLanguage = languageId == ProjectExplorer::Constants::C_LANGUAGE_ID;
const QString script = QLatin1String(cLanguage ? "emcc" : "em++")
+ QLatin1String(sdk.osType() == OsTypeWindows ? ".bat" : "");
const FilePath scriptFile =
FilePath::fromString(script).onDevice(sdk).searchOnDevice(env.path());
toolChain->setCompilerCommand(scriptFile);
WebAssembly: Revamp Emscripten SDK registration and toolchain handling Qt Creator's ability to register Emscripten toolchains depended on an SDK being activated "globally", and on the presence of the ~/.emscripten file. Qt Creator would parse that file in order to determine the location of the compiler and the necessary environment variables that have to be set. As of recently, the Emscripten SDK does neither activate gobally anymore, nor is the ~/.emscripten generated. This change here addresses the new situation in a couple of ways: - Instead of trying to silently detect everything, add a UI (IOptionsPageWidget) that lets the user select the Emscripten SDK root. - Instead of parsing the ~/.emscripten file, parse the output of the emsdk_env tool to determine the toolchain environment (ToolChain::addToEnvironment). The parsing is cached. A test for the parsing is included. - Instead of registering the underlying clang as compiler, register the emcc/em++ wrapper scripts, which are (also as of recently) compatible with Qt Creator's way of determining gcc's predefined macros and built- in header paths. One Emscripten SDK is registered globally in Qt Creator. When changing that, the previous Emscripten toolchains are removed, the new ones are registered and the kit are "fixed" to use those. On startup, an InfoBar entry is shown if Qt for Webassembly kits exist and no Emscripten toolchains are present. That's the case for first-time use after installing Qt for Webassembly via Qt SDK installer. The InfoBar entry opens up the IOptionsPageWidget. Qt 5.15.0 for WebAssembly and Emscripten SDK 1.39.0 are the minimum supported versions. The new UI will show warnings accordingly. Task-number: QTCREATORBUG-24811 Fixes: QTCREATORBUG-24822 Fixes: QTCREATORBUG-24814 Fixes: QTCREATORBUG-23741 Fixes: QTCREATORBUG-23561 Fixes: QTCREATORBUG-23160 Fixes: QTCREATORBUG-23126 Change-Id: I017c61586b17e815bb20a90e3f305a6bf705da36 Reviewed-by: hjk <hjk@qt.io>
2020-11-03 00:20:43 +01:00
const QString displayName = WebAssemblyToolChain::tr("Emscripten Compiler %1 for %2")
.arg(toolChain->version(), QLatin1String(cLanguage ? "C" : "C++"));
toolChain->setDisplayName(displayName);
result.append(toolChain);
}
WebAssembly: Revamp Emscripten SDK registration and toolchain handling Qt Creator's ability to register Emscripten toolchains depended on an SDK being activated "globally", and on the presence of the ~/.emscripten file. Qt Creator would parse that file in order to determine the location of the compiler and the necessary environment variables that have to be set. As of recently, the Emscripten SDK does neither activate gobally anymore, nor is the ~/.emscripten generated. This change here addresses the new situation in a couple of ways: - Instead of trying to silently detect everything, add a UI (IOptionsPageWidget) that lets the user select the Emscripten SDK root. - Instead of parsing the ~/.emscripten file, parse the output of the emsdk_env tool to determine the toolchain environment (ToolChain::addToEnvironment). The parsing is cached. A test for the parsing is included. - Instead of registering the underlying clang as compiler, register the emcc/em++ wrapper scripts, which are (also as of recently) compatible with Qt Creator's way of determining gcc's predefined macros and built- in header paths. One Emscripten SDK is registered globally in Qt Creator. When changing that, the previous Emscripten toolchains are removed, the new ones are registered and the kit are "fixed" to use those. On startup, an InfoBar entry is shown if Qt for Webassembly kits exist and no Emscripten toolchains are present. That's the case for first-time use after installing Qt for Webassembly via Qt SDK installer. The InfoBar entry opens up the IOptionsPageWidget. Qt 5.15.0 for WebAssembly and Emscripten SDK 1.39.0 are the minimum supported versions. The new UI will show warnings accordingly. Task-number: QTCREATORBUG-24811 Fixes: QTCREATORBUG-24822 Fixes: QTCREATORBUG-24814 Fixes: QTCREATORBUG-23741 Fixes: QTCREATORBUG-23561 Fixes: QTCREATORBUG-23160 Fixes: QTCREATORBUG-23126 Change-Id: I017c61586b17e815bb20a90e3f305a6bf705da36 Reviewed-by: hjk <hjk@qt.io>
2020-11-03 00:20:43 +01:00
return result;
}
} // namespace Internal
} // namespace WebAssembly