From 1fce7ff4f5244dfb98a5b0a333c52ecaba7e59c4 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Fri, 4 May 2018 12:42:48 +0200 Subject: [PATCH 1/4] Fix code signature on macOS We build packages with extra debug info, but sign the application before removing the debug info for the release package. We have to codesign (potentially again) between copying and packaging. Task-number: QTCREATORBUG-20370 Change-Id: I5549ca5045eb995e5a61794473c2d0180b778711 Reviewed-by: Tim Jenssen --- scripts/common.py | 10 ++++++++++ scripts/createDistPackage.py | 7 ++++++- scripts/makedmg.py | 6 +++++- 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/scripts/common.py b/scripts/common.py index b8f640377ec..91ff78ad4ef 100644 --- a/scripts/common.py +++ b/scripts/common.py @@ -177,3 +177,13 @@ def is_debug(path, filenames): def is_not_debug(path, filenames): files = [fn for fn in filenames if os.path.isfile(os.path.join(path, fn))] return [fn for fn in files if not is_debug_file(os.path.join(path, fn))] + +def codesign(app_path): + signing_identity = os.environ.get('SIGNING_IDENTITY') + if is_mac_platform() and signing_identity: + codesign_call = ['codesign', '--force', '--deep', '-s', signing_identity, '-v'] + signing_flags = os.environ.get('SIGNING_FLAGS') + if signing_flags: + codesign_call.extend(signing_flags.split()) + codesign_call.append(app_path) + subprocess.check_call(codesign_call) diff --git a/scripts/createDistPackage.py b/scripts/createDistPackage.py index 2b0c38ea5f4..a2bdf1bd193 100755 --- a/scripts/createDistPackage.py +++ b/scripts/createDistPackage.py @@ -33,7 +33,8 @@ import tempfile import common def parse_arguments(): - parser = argparse.ArgumentParser(description="Create Qt Creator package, filtering out debug information files.") + parser = argparse.ArgumentParser(description="Create Qt Creator package, filtering out debug information files.", + epilog="To sign the contents before packaging on macOS, set the SIGNING_IDENTITY and optionally the SIGNING_FLAGS environment variables.") parser.add_argument('--7z', help='path to 7z binary', default='7z.exe' if common.is_windows_platform() else '7z', metavar='<7z_binary>', dest='sevenzip') @@ -52,6 +53,10 @@ def main(): try: common.copytree(arguments.source_directory, tempdir, symlinks=True, ignore=(common.is_not_debug if arguments.debug else common.is_debug)) + # on macOS we might have to codesign (again) to account for removed debug info + if not arguments.debug: + common.codesign(tempdir) + # package zip_source = os.path.join(tempdir, '*') if arguments.exclude_toplevel else tempdir subprocess.check_call([arguments.sevenzip, 'a', '-mx9', arguments.target_archive, zip_source]) diff --git a/scripts/makedmg.py b/scripts/makedmg.py index 33721f90a72..7911a1be000 100755 --- a/scripts/makedmg.py +++ b/scripts/makedmg.py @@ -34,7 +34,8 @@ import time import common def parse_arguments(): - parser = argparse.ArgumentParser(description='Create Qt Creator disk image, filtering out debug information files.') + parser = argparse.ArgumentParser(description='Create Qt Creator disk image, filtering out debug information files.', + epilog="To sign the contents before packaging on macOS, set the SIGNING_IDENTITY and optionally the SIGNING_FLAGS environment variables.") parser.add_argument('target_diskimage', help='output .dmg file to create') parser.add_argument('dmg_volumename', help='volume name to use for the disk image') parser.add_argument('source_directory', help='directory with the Qt Creator sources') @@ -47,6 +48,9 @@ def main(): tempdir = os.path.join(tempdir_base, os.path.basename(arguments.binary_directory)) try: common.copytree(arguments.binary_directory, tempdir, symlinks=True, ignore=common.is_debug) + if common.is_mac_platform(): + app_path = [app for app in os.listdir(tempdir) if app.endswith('.app')][0] + common.codesign(os.path.join(tempdir, app_path)) os.symlink('/Applications', os.path.join(tempdir, 'Applications')) shutil.copy(os.path.join(arguments.source_directory, 'LICENSE.GPL3-EXCEPT'), tempdir) dmg_cmd = ['hdiutil', 'create', '-srcfolder', tempdir, '-volname', arguments.dmg_volumename, From a86eda329e7b47b75222434884e40e925b599b82 Mon Sep 17 00:00:00 2001 From: hjk Date: Mon, 14 May 2018 15:30:35 +0200 Subject: [PATCH 2/4] Qnx: Fix persisting of deploy steps While the deploy steps re-used from RemoteLinux were created ok when creating a new QnxDeployConfiguration, they did not survive a restart (or rather a toMap/fromMap cycle, as the restoring insisted on having a RemoteLinuxDeployConfiguration). Since sharing DeployConfiguration*Factory*s is not yet possible, this patch here creates additional DeployConfigurationFactories creating the same steps, but insisting on a QnxDeployConfiguration parent. Task-number: QTCREATORBUG-20248 Change-Id: I70666f79993a1332cd1959ab5e3665797d2401ca Reviewed-by: Christian Kandeler Reviewed-by: Alessandro Portale Reviewed-by: Eike Ziller --- .../devicesupport/devicecheckbuildstep.cpp | 4 ++-- .../devicesupport/devicecheckbuildstep.h | 2 +- src/plugins/qnx/qnxplugin.cpp | 24 +++++++++++++++++++ 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/plugins/projectexplorer/devicesupport/devicecheckbuildstep.cpp b/src/plugins/projectexplorer/devicesupport/devicecheckbuildstep.cpp index 2d6164c9ae1..f90f9843c2c 100644 --- a/src/plugins/projectexplorer/devicesupport/devicecheckbuildstep.cpp +++ b/src/plugins/projectexplorer/devicesupport/devicecheckbuildstep.cpp @@ -38,7 +38,7 @@ using namespace ProjectExplorer; DeviceCheckBuildStep::DeviceCheckBuildStep(BuildStepList *bsl) : BuildStep(bsl, stepId()) { - setDefaultDisplayName(stepDisplayName()); + setDefaultDisplayName(displayName()); } bool DeviceCheckBuildStep::init(QList &earlierSteps) @@ -92,7 +92,7 @@ Core::Id DeviceCheckBuildStep::stepId() return "ProjectExplorer.DeviceCheckBuildStep"; } -QString DeviceCheckBuildStep::stepDisplayName() +QString DeviceCheckBuildStep::displayName() { return tr("Check for a configured device"); } diff --git a/src/plugins/projectexplorer/devicesupport/devicecheckbuildstep.h b/src/plugins/projectexplorer/devicesupport/devicecheckbuildstep.h index 7886a9e8abc..8a114e1e6c4 100644 --- a/src/plugins/projectexplorer/devicesupport/devicecheckbuildstep.h +++ b/src/plugins/projectexplorer/devicesupport/devicecheckbuildstep.h @@ -45,7 +45,7 @@ public: BuildStepConfigWidget *createConfigWidget() override; static Core::Id stepId(); - static QString stepDisplayName(); + static QString displayName(); }; } // namespace ProjectExplorer diff --git a/src/plugins/qnx/qnxplugin.cpp b/src/plugins/qnx/qnxplugin.cpp index c5fb91e2bdf..408f96b338f 100644 --- a/src/plugins/qnx/qnxplugin.cpp +++ b/src/plugins/qnx/qnxplugin.cpp @@ -46,6 +46,7 @@ #include #include +#include #include #include #include @@ -57,6 +58,9 @@ #include #include +#include +#include + #include #include @@ -67,6 +71,19 @@ using namespace ProjectExplorer; namespace Qnx { namespace Internal { +template +class GenericQnxDeployStepFactory : public BuildStepFactory +{ +public: + GenericQnxDeployStepFactory() + { + registerStep(Step::stepId()); + setDisplayName(Step::displayName()); + setSupportedConfiguration(Constants::QNX_QNX_DEPLOYCONFIGURATION_ID); + setSupportedStepList(ProjectExplorer::Constants::BUILDSTEPS_DEPLOY); + } +}; + bool QnxPlugin::initialize(const QStringList &arguments, QString *errorString) { Q_UNUSED(arguments) @@ -80,6 +97,13 @@ bool QnxPlugin::initialize(const QStringList &arguments, QString *errorString) addAutoReleasedObject(new QnxRunConfigurationFactory); addAutoReleasedObject(new QnxSettingsPage); + addAutoReleasedObject(new GenericQnxDeployStepFactory + ); + addAutoReleasedObject(new GenericQnxDeployStepFactory + ); + addAutoReleasedObject(new GenericQnxDeployStepFactory + ); + auto constraint = [](RunConfiguration *runConfig) { if (!runConfig->isEnabled() || !runConfig->id().name().startsWith(Constants::QNX_QNX_RUNCONFIGURATION_PREFIX)) { From f7895e272b4555ce1963790b9db1eea91bf359fb Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Fri, 11 May 2018 14:09:41 +0200 Subject: [PATCH 3/4] QML Debugger: Don't hang if there are no scopes to be retrieved Qt 5.11.0 contains an optimization that does away with call contexts for simple inline bindings. Also, it doesn't report QML contexts as scopes in the "frame" and "backtrace" commands. Therefore, in those cases "this" is the only thing to be retrieved. Check if we are done when "this" has been retrieved and no scopes have been found. Change-Id: I9e0f545777bc38333938b65a934d42701ec4f807 Task-number: QTBUG-68218 Reviewed-by: Eike Ziller Reviewed-by: hjk --- src/plugins/debugger/qml/qmlengine.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/plugins/debugger/qml/qmlengine.cpp b/src/plugins/debugger/qml/qmlengine.cpp index 96007d1bcb6..214313773f8 100644 --- a/src/plugins/debugger/qml/qmlengine.cpp +++ b/src/plugins/debugger/qml/qmlengine.cpp @@ -2167,6 +2167,10 @@ void QmlEnginePrivate::handleFrame(const QVariantMap &response) watchHandler->insertItem(item); evaluate(exp, -1, [this, iname, exp](const QVariantMap &response) { handleEvaluateExpression(response, iname, exp); + + // If there are no scopes, "this" may be the only thing to look up. + if (currentFrameScopes.isEmpty()) + checkForFinishedUpdate(); }); } From 23ac1d18e1be8d898adf44dde745ba7c259beb3c Mon Sep 17 00:00:00 2001 From: Vikas Pachdha Date: Tue, 15 May 2018 12:39:41 +0200 Subject: [PATCH 4/4] Android: Fix the android include path Task-number: QTCREATORBUG-20340 Change-Id: Ie1d7c15bf8b38b5141868149684e026ba9666630 Reviewed-by: Alex Blasche Reviewed-by: Ivan Donchevskii --- src/plugins/android/androidtoolchain.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/plugins/android/androidtoolchain.cpp b/src/plugins/android/androidtoolchain.cpp index 9d3b8db27bf..da75a80deef 100644 --- a/src/plugins/android/androidtoolchain.cpp +++ b/src/plugins/android/androidtoolchain.cpp @@ -116,7 +116,9 @@ static void addSystemHeaderPaths(QList &paths, const Utils::FileName ndkPath = AndroidConfigurations::currentConfig().ndkLocation(); // Get short version (for example 4.9) - const QString clangVersion = version.left(version.lastIndexOf('.')); + auto versionNumber = QVersionNumber::fromString(version); + const QString clangVersion = QString("%1.%2") + .arg(versionNumber.majorVersion()).arg(versionNumber.minorVersion()); Utils::FileName stdcppPath = ndkPath; stdcppPath.appendPath("sources/cxx-stl/gnu-libstdc++/" + clangVersion); Utils::FileName includePath = stdcppPath;