From 359127ec09e8ec42bba69a941c8c20a6db664e46 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Fri, 10 Jun 2016 12:53:56 +0200 Subject: [PATCH 1/9] Doc: Update info about creating JSON wizards Change-Id: Id45d3f9228ab35a57c0cc5a0d044bc510727c637 Reviewed-by: Tobias Hunger --- doc/images/qtcreator-custom-wizard.png | Bin 0 -> 14697 bytes .../creator-projects-custom-wizards-json.qdoc | 154 +++++++++++++----- .../creator-projects-custom-wizards.qdoc | 35 +++- 3 files changed, 143 insertions(+), 46 deletions(-) create mode 100644 doc/images/qtcreator-custom-wizard.png diff --git a/doc/images/qtcreator-custom-wizard.png b/doc/images/qtcreator-custom-wizard.png new file mode 100644 index 0000000000000000000000000000000000000000..9155866e41acb8a3b3800c18f8dcbd428e0cdf24 GIT binary patch literal 14697 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 E0B@Q;7XSbN literal 0 HcmV?d00001 diff --git a/doc/src/projects/creator-projects-custom-wizards-json.qdoc b/doc/src/projects/creator-projects-custom-wizards-json.qdoc index 64e9eaadd50..04c6631ffac 100644 --- a/doc/src/projects/creator-projects-custom-wizards-json.qdoc +++ b/doc/src/projects/creator-projects-custom-wizards-json.qdoc @@ -37,27 +37,72 @@ \title Adding JSON-Based Wizards - \image qtcreator-new-qt-gui-application.png - - The JSON-based wizards are displayed in the \uicontrol New dialog. To - customize them, copy a directory that contains a \c {wizard.json} file in - \c {share/qtcreator/templates/wizards/} and modify it to fit your needs. - After you run qmake and restart \QC, the wizard name appears in the - selected or added category. For each wizard, an icon, a display name, and - a description are displayed. + \QC searches for wizards in the shared directory and in the local user's + settings directory, as described in \l{Locating Wizards}. JSON-based wizard template directories contain a JSON configuration file called \c {wizard.json} and any template files needed. The configuration file contains sections that specify information about the wizard, variables that you can use, wizard pages, and generators for creating files. + To create a customized wizard, copy a template directory to the shared + directory or the settings directory under a new name. If you want to use + qmake to build the wizard and integrate it into \QC, use the shared + directory. Otherwise, you can create a subdirectory in the settings + directory. The standard wizards are organized into subdirectories by type, + but you can add your wizard directory to any directory you like. The folder + hierarchy does not affect the order in which the wizards are displayed. + + To share the wizard with other users, you can create an archive of the + wizard directory and instruct the recipients to extract it into one of the + directories \QC searches wizards from. + + For wizard development, we recommend that you start \QC with the + \c {-customwizard-verbose} argument to receive confirmation that \QC was + able to find and parse the \c {wizard.json} file. The verbose mode displays + information about syntax errors, which are the most typical errors you might + run into while editing wizards. For more information, see + \l {Verbose Output}. + + In addition, set keyboard shortcuts for the \uicontrol Inspect and + \uicontrol {Factory.Reset} functions to be able to inspect the fields and + variables in the wizard and to have the wizard listed in \uicontrol File > + \uicontrol {New File or Project} without restarting \QC. For more + information, see \l {Tips for Wizard Development}. + + \QC displays the wizards that it finds in the + \uicontrol {New File or Project} dialog. For each wizard, an icon (1), a + display name (2), and a description (3) are displayed. + + \image qtcreator-custom-wizard.png + + \section1 Integrating Wizards into Qt Creator Builds + + To integrate the wizard into \QC and to deliver it as part of the \QC build, + place the wizard files in the \QC sources. Then select \uicontrol Build > + \uicontrol {Run qmake}, so that the new files you added for your wizard are + actually copied from the \QC source directory into the \QC build directory + as part of the next \QC build. + + If you do not run qmake, your new wizard will not show up, because it does + not exist in the build directory you run your newly built \QC from. It never + got copied there, because make did not know that the files exist in the + source tree, because qmake did not inform make that the files were added + recently. + + Basically, qmake generates a fixed list of files to copy from the source + directory to the sudirectory of the build directory that is checked for + wizards at runtime. Therefore, you need to run qmake or execute the + \uicontrol {Factory.Reset} function each time the names or locations of the + files change. + \section1 Using Variables in Wizards You can use variables (\c {%\{\}}) in the configuration and template source files. A set of variables is predefined by the wizards and their pages. You can introduce new variables as shortcuts to be used later. Define the variable key names and values in the \c options section in the - \c {.json} file. + \c {wizard.json} file. The variables always return strings. In places where a boolean value is expected and a string is given, an empty string as well as the string @@ -87,34 +132,45 @@ use them as basis for adding your own wizards. We use the C++ wizard to explain the process and the sections and settings in the .json file. + In this example, we create the wizard directory in the shared directory + and integrate it in the \QC build system, so that it can deployed along with + the \QC binaries as part of the build. + \image qtcreator-cpp-class-wizard.png - For more information about the pages and widgets that you can add, see - \l {Available Pages} and \l{Available Widgets}. + For more information about the pages and widgets that you can add and their + supported properties, see \l {Available Pages} and \l{Available Widgets}. To create a JSON-based C++ class wizard: \list 1 - \li Make a copy of \c {share/qtcreator/templates/wizards/classes/cpp} - and rename it. + \li Start \QC with the \c {-customwizard-verbose} argument to receive + feedback during wizard development. For more information, see + \l {Verbose Output}. - \li Right-click the project name in \uicontrol Projects view and - select \uicontrol {Run qmake} from the context menu to register the - new wizard. Basically, qmake generates a fixed list of files to - copy. Therefore, you need to run qmake each time the names or - locations of the files change. + \li Set keyboard shortcuts for the \uicontrol Inspect and + \uicontrol {Factory.Reset} actions, as described in + \l {Tips for Wizard Development}. + + \li Make a copy of \c {share/qtcreator/templates/wizards/classes/cpp} + and rename it. For example, + \c {share/qtcreator/templates/wizards/classes/mycpp} + + \li Use the \uicontrol {Factory.Reset} action to make the wizard appear + in \uicontrol File > \uicontrol {New File or Project} without + restarting \QC. \li Open the wizard configuration file, \c {wizard.json} for editing: \list \li The following settings determine the type of the wizard and - its place in the \uicontrol New dialog: + its place in the \uicontrol {New File or Project} dialog: \code "version": 1, - "kind": "file", + "supportedProjectTypes": [ ], "id": "A.Class", "category": "O.C++", \endcode @@ -124,15 +180,26 @@ \li \c version is the version of the file contents. Do not modify this value. - \li \c kind specifies the type of the wizard: \c file or - \c project. + \li \c supportedProjectTypes is an optional setting that + can be used to filter wizards when adding a new build + target to an existing project. For example, only wizards + that produce qmake projects should be provided when + adding a new target to an existing qmake project. - This information is available in the wizard as - \c {%\{kind\}} with values \c file or \c project. + Possible values are the build systems supported by \QC + or \c UNKNOWN_PROJECT if the build system is not + specified: \c AutotoolsProjectManager.AutotoolsProject, + \c CMakeProjectManager.CMakeProject, + \c GenericProjectManager.GenericProject, + \c PythonProject, \c Qbs.QbsProject, + \c Qt4ProjectManager.Qt4Project (qmake project), + \c QmlProjectManager.QmlProject - \li \c id is the unique identifier for your wizard. You can - use a leading letter to specify the position of the - wizard within the \c category. + \li \c id is the unique identifier for your wizard. Wizards + are sorted by the ID in alphabetic order within the + \c category. You can use a leading letter to specify the + position of the wizard. You must always change + this value. For example, \c B.MyClass. This information is available in the wizard as \c {%\{id\}}. @@ -140,20 +207,21 @@ \li \c category is the category in which to place the wizard in the list. You can use a leading letter to specify the position of the category in the list in the - \uicontrol New dialog. + \uicontrol {New File or Project} dialog. This information is available in the wizard as \c {%\{category\}}. \endlist \li The following settings specify the icon and text that appear in - the \uicontrol New dialog: + the \uicontrol {New File or Project} dialog: \code "trDescription": "Creates a C++ header and a source file for a new class that you can add to a C++ project.", "trDisplayName": "C++ Class", "trDisplayCategory": "C++", "icon": "../../global/genericfilewizard.png", + "enabled": "%{JS: [ %{Plugins} ].indexOf('CppEditor') >= 0}", \endcode \list @@ -170,8 +238,9 @@ This information is available in the wizard as \c {%\{trDisplayName\}}. - \li \c trDisplayCategory appears in the \uicontrol New dialog, - under \uicontrol Projects. + \li \c trDisplayCategory appears in the + \uicontrol {New File or Project} dialog, under + \uicontrol Projects. This information is available in the wizard as \c {%\{trDisplayCategory\}}. @@ -250,16 +319,16 @@ "trDisplayName": "Define Class", "trShortTitle": "Details", "typeId": "Fields", - "data" : - [ - { - "name": "Class", - "trDisplayName": "Class name:", - "mandatory": true, - "type": "LineEdit", - "data": { "validator": "(?:(?:[a-zA-Z_][a-zA-Z_0-9]*::)+[a-zA-Z_][a-zA-Z_0-9]*|)" } - }, - ... + "data" : + [ + { + "name": "Class", + "trDisplayName": "Class name:", + "mandatory": true, + "type": "LineEdit", + "data": { "validator": "(?:(?:[a-zA-Z_][a-zA-Z_0-9]*::)+[a-zA-Z_][a-zA-Z_0-9]*|)" } + }, + ... ] \endcode @@ -580,6 +649,9 @@ \li Text Edit \endlist + \note Only the the settings documented in the following sections are + supported in wizards. + Specify the following settings for each widget: \list diff --git a/doc/src/projects/creator-projects-custom-wizards.qdoc b/doc/src/projects/creator-projects-custom-wizards.qdoc index a2b204eeaaf..1b56471db40 100644 --- a/doc/src/projects/creator-projects-custom-wizards.qdoc +++ b/doc/src/projects/creator-projects-custom-wizards.qdoc @@ -78,7 +78,7 @@ \li the local user's configuration folder, \c {$HOME/.config/QtProject/qtcreator/templates/wizards} on Linux and OS X or \c {%APPDATA%\QtProject\qtcreator\templates\wizards} on - windows + Windows \endlist @@ -114,9 +114,34 @@ a wizard definition to become visible. \endtable - \note When developing custom wizards (both JSON as well as XML based), it is - recommended to start \QC with the \c {-customwizard-verbose} argument. See - \l{Using Command Line Options} for more information about command line - arguments. + \section2 Verbose Output + When developing custom wizards (both JSON as well as XML based), it is + recommended to start \QC with the \c {-customwizard-verbose} argument. It + causes each correctly set up wizard to produce output along the following + lines: + + \code + Checking "/home/jsmith/.config/QtProject/qtcreator/templates/wizards/mywizard" + for wizard.json. + * Configuration found and parsed. + \endcode + + The output includes the name of the directory that was checked for a + \c wizard.json file. If the file is not found, the message is not displayed. + + If the file contains errors, such as an invalid icon path, the following + types of messages are displayed: + + \code + Checking "/home/jsmith/.config/QtProject/qtcreator/templates/wizards/mywizard" + for wizard.json. + * Configuration found and parsed. + * Failed to create: Icon file + "/home/jsmith/.config/QtProject/qtcreator/templates/wizards/mywizard/../.. + /global/genericfilewizard.png" not found. + \endcode + + See \l{Using Command Line Options} for more information about command line + arguments. */ From 68990f329f5f5250c6baf8736fe3e0ad7355c818 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Fri, 17 Jun 2016 14:54:21 +0200 Subject: [PATCH 2/9] Update qbs submodule. To HEAD of 1.5 branch. Change-Id: I846f5f97071ad3567409dcdf6dfa7fe66931ada1 Reviewed-by: Joerg Bornemann --- src/shared/qbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shared/qbs b/src/shared/qbs index d8d7beb866b..d40b92e506a 160000 --- a/src/shared/qbs +++ b/src/shared/qbs @@ -1 +1 @@ -Subproject commit d8d7beb866b24793d9c04b6996276a4a8959bfa2 +Subproject commit d40b92e506af0e97bebd13c7410553f6d74d3af2 From ff2ba0cef5f7db6633ae0565afd669a254db9b84 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Mon, 20 Jun 2016 09:22:23 +0200 Subject: [PATCH 3/9] Bump Version Change-Id: Ifc422cd795803d419a7aba20e37923fb9084cf43 Reviewed-by: Eike Ziller --- qtcreator.pri | 2 +- qtcreator.qbs | 2 +- src/shared/qbs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/qtcreator.pri b/qtcreator.pri index d7914ef7939..e693382f43d 100644 --- a/qtcreator.pri +++ b/qtcreator.pri @@ -1,7 +1,7 @@ !isEmpty(QTCREATOR_PRI_INCLUDED):error("qtcreator.pri already included") QTCREATOR_PRI_INCLUDED = 1 -QTCREATOR_VERSION = 4.0.2 +QTCREATOR_VERSION = 4.0.3 QTCREATOR_COMPAT_VERSION = 4.0.0 BINARY_ARTIFACTS_BRANCH = 4.0 diff --git a/qtcreator.qbs b/qtcreator.qbs index 7bcc6ce8eea..361b2586228 100644 --- a/qtcreator.qbs +++ b/qtcreator.qbs @@ -7,7 +7,7 @@ Project { property bool withAutotests: qbs.buildVariant === "debug" property string ide_version_major: '4' property string ide_version_minor: '0' - property string ide_version_release: '2' + property string ide_version_release: '3' property string qtcreator_version: ide_version_major + '.' + ide_version_minor + '.' + ide_version_release property string ide_compat_version_major: '4' property string ide_compat_version_minor: '0' diff --git a/src/shared/qbs b/src/shared/qbs index d40b92e506a..d8d7beb866b 160000 --- a/src/shared/qbs +++ b/src/shared/qbs @@ -1 +1 @@ -Subproject commit d40b92e506af0e97bebd13c7410553f6d74d3af2 +Subproject commit d8d7beb866b24793d9c04b6996276a4a8959bfa2 From 52ed3845492dd774d85c953606b62ae0068f419d Mon Sep 17 00:00:00 2001 From: David Faure Date: Sat, 18 Jun 2016 15:11:12 +0200 Subject: [PATCH 4/9] cmake: resolve symlinks when comparing source directories. Testcase: trying to use an existing build dir which was made for /d/foo where /d is a symlink to $HOME/d. To help understanding the problem, the error message now prints both source dirs, the one found in the builddir and the one we expected. Change-Id: I9a24fbd6ef3cf8108c5edba0d2a5b99ecdea0e89 Reviewed-by: Tobias Hunger --- src/libs/utils/fileutils.cpp | 20 ++++++++++++++++--- src/libs/utils/fileutils.h | 1 + .../cmakeprojectmanager/builddirmanager.cpp | 8 ++++++-- 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/src/libs/utils/fileutils.cpp b/src/libs/utils/fileutils.cpp index 4c406a363c9..9500035c5f0 100644 --- a/src/libs/utils/fileutils.cpp +++ b/src/libs/utils/fileutils.cpp @@ -207,9 +207,8 @@ bool FileUtils::isFileNewerThan(const FileName &filePath, const QDateTime &timeS } /*! - Recursively resolves possibly present symlinks in \a filePath. - Unlike QFileInfo::canonicalFilePath(), this function will still return the expected target file - even if the symlink is dangling. + Recursively resolves symlinks if \a filePath is a symlink. + To resolve symlinks anywhere in the path, see canonicalPath \note Maximum recursion depth == 16. @@ -226,6 +225,21 @@ FileName FileUtils::resolveSymlinks(const FileName &path) return FileName::fromString(f.filePath()); } +/*! + Recursively resolves possibly present symlinks in \a filePath. + Unlike QFileInfo::canonicalFilePath(), this function will not return an empty + string if path doesn't exist. + + Returns the canonical path. +*/ +FileName FileUtils::canonicalPath(const FileName &path) +{ + const QString result = QFileInfo(path.toString()).canonicalFilePath(); + if (result.isEmpty()) + return path; + return FileName::fromString(result); +} + /*! Like QDir::toNativeSeparators(), but use prefix '~' instead of $HOME on unix systems when an absolute path is given. diff --git a/src/libs/utils/fileutils.h b/src/libs/utils/fileutils.h index 286ffd02f79..5bd844a004d 100644 --- a/src/libs/utils/fileutils.h +++ b/src/libs/utils/fileutils.h @@ -109,6 +109,7 @@ public: QString *error = 0, const std::function ©Helper = std::function()); static bool isFileNewerThan(const FileName &filePath, const QDateTime &timeStamp); static FileName resolveSymlinks(const FileName &path); + static FileName canonicalPath(const FileName &path); static QString shortNativePath(const FileName &path); static QString fileSystemFriendlyName(const QString &name); static int indexOfQmakeUnfriendly(const QString &name, int startpos = 0); diff --git a/src/plugins/cmakeprojectmanager/builddirmanager.cpp b/src/plugins/cmakeprojectmanager/builddirmanager.cpp index 432e28cfba0..79156c784bf 100644 --- a/src/plugins/cmakeprojectmanager/builddirmanager.cpp +++ b/src/plugins/cmakeprojectmanager/builddirmanager.cpp @@ -286,8 +286,12 @@ CMakeConfig BuildDirManager::parsedConfiguration() const emit errorOccured(errorMessage); const Utils::FileName sourceOfBuildDir = Utils::FileName::fromUtf8(CMakeConfigItem::valueOf("CMAKE_HOME_DIRECTORY", m_cmakeCache)); - if (sourceOfBuildDir != sourceDirectory()) // Use case-insensitive compare where appropriate - emit errorOccured(tr("The build directory is not for %1").arg(sourceDirectory().toUserOutput())); + const Utils::FileName canonicalSourceOfBuildDir = Utils::FileUtils::canonicalPath(sourceOfBuildDir); + const Utils::FileName canonicalSourceDirectory = Utils::FileUtils::canonicalPath(sourceDirectory()); + if (canonicalSourceOfBuildDir != canonicalSourceDirectory) // Uses case-insensitive compare where appropriate + emit errorOccured(tr("The build directory is not for %1 but for %2") + .arg(canonicalSourceOfBuildDir.toUserOutput(), + canonicalSourceDirectory.toUserOutput())); } return m_cmakeCache; } From 083b1175c9a01e0fa895fa47ecff1edd7df16ae0 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Fri, 17 Jun 2016 16:04:44 +0200 Subject: [PATCH 5/9] Doc: Link to released Qt Quick Controls 2 docs Change-Id: I5ddb23ae1f78aae136869fd335030b530e1f266a Reviewed-by: Eike Ziller --- doc/src/projects/creator-projects-creating.qdoc | 2 +- doc/src/qtquick/qtquick-creating.qdoc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/src/projects/creator-projects-creating.qdoc b/doc/src/projects/creator-projects-creating.qdoc index f02ec75d528..a84f625858a 100644 --- a/doc/src/projects/creator-projects-creating.qdoc +++ b/doc/src/projects/creator-projects-creating.qdoc @@ -120,7 +120,7 @@ \li Qt Quick Controls Application Create a Qt Quick application using - \l{http://doc-snapshots.qt.io/qt5-5.7/qtquickcontrols2-index.html} + \l{http://doc.qt.io/qt-5/qtquickcontrols2-index.html} {Qt Quick Controls 2} (requires Qt 5.7 or later), \l{http://doc.qt.io/qt-5/qtquickcontrols-index.html} {Qt Quick Controls}, or diff --git a/doc/src/qtquick/qtquick-creating.qdoc b/doc/src/qtquick/qtquick-creating.qdoc index 2b4d8c85cce..19c61dbd0b1 100644 --- a/doc/src/qtquick/qtquick-creating.qdoc +++ b/doc/src/qtquick/qtquick-creating.qdoc @@ -54,7 +54,7 @@ \uicontrol {Qt Quick Controls 2 Application}, and \uicontrol {Qt Labs Controls Application} are like \uicontrol {Qt Quick Application}, but using - \l{http://doc-snapshots.qt.io/qt5-5.7/qtquickcontrols2-index.html} + \l{http://doc.qt.io/qt-5/qtquickcontrols2-index.html} {Qt Quick Controls 2} (requires Qt 5.7 or later), \l{http://doc.qt.io/qt-5/qtquickcontrols-index.html} {Qt Quick Controls}, or From ccda65bf838786b705a81d9dba602c2bc0d62242 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Mon, 20 Jun 2016 07:44:02 +0200 Subject: [PATCH 6/9] AutoTest: Avoid fetching WorkingCopy from multiple threads Instead fetch it once before starting asynchronous processing. Backported from 72e6dd2ab102ddb45ab3de12f61ab1d21c41e6eb on master. Change-Id: If159311d1ce244c39482acb2ed0d7e33907a2933 Reviewed-by: Nikolai Kosjar --- src/plugins/autotest/testcodeparser.cpp | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/plugins/autotest/testcodeparser.cpp b/src/plugins/autotest/testcodeparser.cpp index 31dd7473893..d2f4ba8d3f3 100644 --- a/src/plugins/autotest/testcodeparser.cpp +++ b/src/plugins/autotest/testcodeparser.cpp @@ -156,13 +156,13 @@ void TestCodeParser::updateTestTree() /****** scan for QTest related stuff helpers ******/ +static CppTools::WorkingCopy s_workingCopy; + static QByteArray getFileContent(QString filePath) { QByteArray fileContent; - CppTools::CppModelManager *cppMM = CppTools::CppModelManager::instance(); - CppTools::WorkingCopy wc = cppMM->workingCopy(); - if (wc.contains(filePath)) { - fileContent = wc.source(filePath); + if (s_workingCopy.contains(filePath)) { + fileContent = s_workingCopy.source(filePath); } else { QString error; const QTextCodec *codec = Core::EditorManager::defaultTextCodec(); @@ -751,6 +751,9 @@ void TestCodeParser::scanForTests(const QStringList &fileList) m_model->markForRemoval(filePath); } + // fetch working copy before starting asynchronously processing + s_workingCopy = CppTools::CppModelManager::instance()->workingCopy(); + QFuture future = Utils::runAsync(&performParse, list, testCaseNames); m_futureWatcher.setFuture(future); if (list.size() > 5) { @@ -793,12 +796,14 @@ void TestCodeParser::onFinished() } else { qCDebug(LOG) << "emitting parsingFinished" << "(onFinished, FullParse, nothing postponed, parsing succeeded)"; + s_workingCopy = CppTools::WorkingCopy(); emit parsingFinished(); } m_dirty = false; break; case Disabled: // can happen if all Test related widgets become hidden while parsing qCDebug(LOG) << "emitting parsingFinished (onFinished, Disabled)"; + s_workingCopy = CppTools::WorkingCopy(); emit parsingFinished(); break; default: @@ -827,6 +832,7 @@ void TestCodeParser::onPartialParsingFinished() } else if (!m_singleShotScheduled) { qCDebug(LOG) << "emitting parsingFinished" << "(onPartialParsingFinished, nothing postponed, not dirty)"; + s_workingCopy = CppTools::WorkingCopy(); emit parsingFinished(); } else { qCDebug(LOG) << "not emitting parsingFinished" From 069a4dc7dd61937e54c9d84b5b203239585b1769 Mon Sep 17 00:00:00 2001 From: Jake Petroules Date: Fri, 17 Jun 2016 15:17:37 -0700 Subject: [PATCH 7/9] Add macos value to qbs.targetOS. Change-Id: I38f810ae72ff1f7ef428835b2eeeed6d726d4727 Reviewed-by: Christian Kandeler --- src/plugins/qbsprojectmanager/defaultpropertyprovider.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/qbsprojectmanager/defaultpropertyprovider.cpp b/src/plugins/qbsprojectmanager/defaultpropertyprovider.cpp index 6ff49324ec5..88273086bfb 100644 --- a/src/plugins/qbsprojectmanager/defaultpropertyprovider.cpp +++ b/src/plugins/qbsprojectmanager/defaultpropertyprovider.cpp @@ -89,7 +89,7 @@ static QStringList targetOSList(const ProjectExplorer::Abi &abi, const ProjectEx break; case ProjectExplorer::Abi::MacOS: if (device == DESKTOP_DEVICE_TYPE) - os << QLatin1String("osx"); + os << QLatin1String("macos") << QLatin1String("osx"); else if (device == IOS_DEVICE_TYPE) os << QLatin1String("ios"); else if (device == IOS_SIMULATOR_TYPE) From 8c7913e0ba8525e55bfa0ef5247be7dd85cd4b31 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Tue, 21 Jun 2016 12:23:44 +0200 Subject: [PATCH 8/9] Clang: Fix compiling unittest on windows. Change-Id: Id48d494510ee53a9e888e22a752e8210f3d4ae2d Reviewed-by: Eike Ziller Reviewed-by: Marco Bubke --- tests/unit/unittest/clientserveroutsideprocess.cpp | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/tests/unit/unittest/clientserveroutsideprocess.cpp b/tests/unit/unittest/clientserveroutsideprocess.cpp index 40e7e9b35ab..bb242433de9 100644 --- a/tests/unit/unittest/clientserveroutsideprocess.cpp +++ b/tests/unit/unittest/clientserveroutsideprocess.cpp @@ -47,6 +47,8 @@ #include #include "gtest-qt-printing.h" +#include + #include #include #include @@ -55,12 +57,6 @@ #include -#ifdef Q_OS_WIN -#define QTC_HOST_EXE_SUFFIX L".exe" -#else -#define QTC_HOST_EXE_SUFFIX "" -#endif - using namespace ClangBackEnd; using ::testing::Eq; @@ -175,7 +171,7 @@ TEST_F(ClientServerOutsideProcess, SendUnregisterProjectPartsForEditorMessage) void ClientServerOutsideProcess::SetUpTestCase() { - client.setProcessPath(QStringLiteral(ECHOSERVER QTC_HOST_EXE_SUFFIX)); + client.setProcessPath(Utils::HostOsInfo::withExecutableSuffix(QStringLiteral(ECHOSERVER))); ASSERT_TRUE(client.connectToServer()); } From 3f11ef92167ba4622a5326eb7ef1fc67b61866eb Mon Sep 17 00:00:00 2001 From: hjk Date: Tue, 21 Jun 2016 14:06:24 +0200 Subject: [PATCH 9/9] Avoid using dynamic_cast<> dynamic_cast<> breaks in cross-library situations. In the past the issue was witnessed on Mac, this time on FreeBSD in various configurations. The workaround deployed here is to manually create unique type ids in form of (addresses of) global variables. Task-id: QTCREATORBUG-16462 Change-Id: Ie28fbb3d31d06c1a722a3d9ea808831191298e71 Reviewed-by: Tobias Hunger Reviewed-by: Ralf Nolden Reviewed-by: Eike Ziller --- src/plugins/android/android.pro | 3 +- src/plugins/android/android.qbs | 1 + src/plugins/android/androiddevice.cpp | 2 ++ src/plugins/android/androidrunnable.cpp | 32 +++++++++++++++++++ src/plugins/android/androidrunnable.h | 2 ++ .../analyzer/analyzerstartparameters.h | 2 ++ src/plugins/debugger/debuggerplugin.cpp | 3 ++ .../customwizard/customwizard.cpp | 3 +- .../devicesupport/desktopdevice.cpp | 1 + .../projectexplorer/devicesupport/idevice.cpp | 3 ++ .../projectexplorer/runconfiguration.h | 12 ++++--- src/plugins/projectexplorer/runnables.cpp | 2 ++ src/plugins/projectexplorer/runnables.h | 14 ++++++++ 13 files changed, 74 insertions(+), 6 deletions(-) create mode 100644 src/plugins/android/androidrunnable.cpp diff --git a/src/plugins/android/android.pro b/src/plugins/android/android.pro index 6fffdcc081a..00deb37e067 100644 --- a/src/plugins/android/android.pro +++ b/src/plugins/android/android.pro @@ -89,7 +89,8 @@ SOURCES += \ avddialog.cpp \ androidbuildapkstep.cpp \ androidbuildapkwidget.cpp \ - androidqtsupport.cpp + androidqtsupport.cpp \ + androidrunnable.cpp FORMS += \ androidsettingswidget.ui \ diff --git a/src/plugins/android/android.qbs b/src/plugins/android/android.qbs index 4251bd023b8..df9c12c5daa 100644 --- a/src/plugins/android/android.qbs +++ b/src/plugins/android/android.qbs @@ -76,6 +76,7 @@ QtcPlugin { "androidruncontrol.h", "androidrunfactories.cpp", "androidrunfactories.h", + "androidrunnable.cpp", "androidrunnable.h", "androidrunner.cpp", "androidrunner.h", diff --git a/src/plugins/android/androiddevice.cpp b/src/plugins/android/androiddevice.cpp index 6f9b11ba1d3..83ced224e8a 100644 --- a/src/plugins/android/androiddevice.cpp +++ b/src/plugins/android/androiddevice.cpp @@ -27,6 +27,8 @@ #include "androidconstants.h" #include "androidsignaloperation.h" +#include + #include using namespace ProjectExplorer; diff --git a/src/plugins/android/androidrunnable.cpp b/src/plugins/android/androidrunnable.cpp new file mode 100644 index 00000000000..f91d7cf63e1 --- /dev/null +++ b/src/plugins/android/androidrunnable.cpp @@ -0,0 +1,32 @@ +/**************************************************************************** +** +** Copyright (C) 2016 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 "androidrunnable.h" + +namespace Android { + +void *AndroidRunnable::staticTypeId = &AndroidRunnable::staticTypeId; + +} // namespace Android diff --git a/src/plugins/android/androidrunnable.h b/src/plugins/android/androidrunnable.h index 453807c359e..7ad339a45b2 100644 --- a/src/plugins/android/androidrunnable.h +++ b/src/plugins/android/androidrunnable.h @@ -40,6 +40,8 @@ struct ANDROID_EXPORT AndroidRunnable QVector beforeStartADBCommands; QVector afterFinishADBCommands; QString deviceSerialNumber; + + static void *staticTypeId; }; inline bool operator==(const AndroidRunnable &r1, const AndroidRunnable &r2) diff --git a/src/plugins/debugger/analyzer/analyzerstartparameters.h b/src/plugins/debugger/analyzer/analyzerstartparameters.h index 73226c0e33e..ad385965601 100644 --- a/src/plugins/debugger/analyzer/analyzerstartparameters.h +++ b/src/plugins/debugger/analyzer/analyzerstartparameters.h @@ -42,6 +42,8 @@ public: QString analyzerHost; QString analyzerSocket; quint16 analyzerPort = 0; + + static void *staticTypeId; }; DEBUGGER_EXPORT bool operator==(const AnalyzerConnection &c1, const AnalyzerConnection &c2); diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp index c44d53ba42e..63ce6b56ff2 100644 --- a/src/plugins/debugger/debuggerplugin.cpp +++ b/src/plugins/debugger/debuggerplugin.cpp @@ -3834,6 +3834,9 @@ QList DebuggerPlugin::createTestObjects() const #endif // if WITH_TESTS } // namespace Internal + +void *AnalyzerConnection::staticTypeId = &AnalyzerConnection::staticTypeId; + } // namespace Debugger #include "debuggerplugin.moc" diff --git a/src/plugins/projectexplorer/customwizard/customwizard.cpp b/src/plugins/projectexplorer/customwizard/customwizard.cpp index 0471a53cc4c..1156fdd82d2 100644 --- a/src/plugins/projectexplorer/customwizard/customwizard.cpp +++ b/src/plugins/projectexplorer/customwizard/customwizard.cpp @@ -28,8 +28,9 @@ #include "customwizardpage.h" #include "customwizardscriptgenerator.h" -#include #include +#include +#include #include #include diff --git a/src/plugins/projectexplorer/devicesupport/desktopdevice.cpp b/src/plugins/projectexplorer/devicesupport/desktopdevice.cpp index 71ecf037d54..19d89a17099 100644 --- a/src/plugins/projectexplorer/devicesupport/desktopdevice.cpp +++ b/src/plugins/projectexplorer/devicesupport/desktopdevice.cpp @@ -30,6 +30,7 @@ #include "desktopdeviceconfigurationwidget.h" #include "desktopprocesssignaloperation.h" #include +#include #include diff --git a/src/plugins/projectexplorer/devicesupport/idevice.cpp b/src/plugins/projectexplorer/devicesupport/idevice.cpp index b48a6b51eca..72d4df110a6 100644 --- a/src/plugins/projectexplorer/devicesupport/idevice.cpp +++ b/src/plugins/projectexplorer/devicesupport/idevice.cpp @@ -30,6 +30,7 @@ #include "../kit.h" #include "../kitinformation.h" +#include "../runnables.h" #include #include @@ -466,4 +467,6 @@ DeviceEnvironmentFetcher::DeviceEnvironmentFetcher() { } +void *HostName::staticTypeId = &HostName::staticTypeId; + } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/runconfiguration.h b/src/plugins/projectexplorer/runconfiguration.h index c5b6e2f82f2..01fe5b9af4b 100644 --- a/src/plugins/projectexplorer/runconfiguration.h +++ b/src/plugins/projectexplorer/runconfiguration.h @@ -159,6 +159,7 @@ public: virtual ~ClonableConcept() = default; virtual ClonableConcept *clone() const = 0; virtual bool equals(const std::unique_ptr &other) const = 0; + virtual void *typeId() const = 0; }; template @@ -168,11 +169,14 @@ public: ClonableModel(const T &data) : m_data(data) { } ~ClonableModel() Q_DECL_NOEXCEPT { } // gcc 4.7.3 ClonableConcept *clone() const override { return new ClonableModel(*this); } + void *typeId() const { return T::staticTypeId; } bool equals(const std::unique_ptr &other) const override { - auto that = dynamic_cast *>(other.get()); - return that && m_data == that->m_data; + if (other->typeId() != typeId()) + return false; + auto that = static_cast *>(other.get()); + return m_data == that->m_data; } T m_data; @@ -189,7 +193,7 @@ public: void operator=(Runnable other) { d = std::move(other.d); } template bool is() const { - return dynamic_cast *>(d.get()) != 0; + return d.get()->typeId() == T::staticTypeId; } template const T &as() const { @@ -213,7 +217,7 @@ public: void operator=(Connection other) { d = std::move(other.d); } template bool is() const { - return dynamic_cast *>(d.get()) != 0; + return d.get()->typeId() == T::staticTypeId; } template const T &as() const { diff --git a/src/plugins/projectexplorer/runnables.cpp b/src/plugins/projectexplorer/runnables.cpp index c05b0a4c12e..a8c9be4aad2 100644 --- a/src/plugins/projectexplorer/runnables.cpp +++ b/src/plugins/projectexplorer/runnables.cpp @@ -35,4 +35,6 @@ bool operator==(const StandardRunnable &r1, const StandardRunnable &r2) && r1.environment == r2.environment; } +void *StandardRunnable::staticTypeId = &StandardRunnable::staticTypeId; + } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/runnables.h b/src/plugins/projectexplorer/runnables.h index 3949b80a0b5..258b45ea797 100644 --- a/src/plugins/projectexplorer/runnables.h +++ b/src/plugins/projectexplorer/runnables.h @@ -43,8 +43,22 @@ public: Utils::Environment environment; ApplicationLauncher::Mode runMode = ApplicationLauncher::Gui; IDevice::ConstPtr device; // Override the kit's device. Keep unset by default. + + static void *staticTypeId; }; PROJECTEXPLORER_EXPORT bool operator==(const StandardRunnable &r1, const StandardRunnable &r2); +class PROJECTEXPLORER_EXPORT HostName +{ +public: + explicit HostName(const QString &host) : m_host(host) {} + QString host() const { return m_host; } + + static void *staticTypeId; + +private: + QString m_host; +}; + } // namespace ProjectExplorer