diff --git a/dist/changes-3.5.1.md b/dist/changes-3.5.1.md new file mode 100644 index 00000000000..247249743e9 --- /dev/null +++ b/dist/changes-3.5.1.md @@ -0,0 +1,59 @@ +Qt Creator version 3.5.1 contains bug fixes. + +The most important changes are listed in this document. For a complete +list of changes, see the Git log for the Qt Creator sources that +you can check out from the public Git repository. For example: + + git clone git://code.qt.io/qt-creator/qt-creator.git + git log --cherry-pick --pretty=oneline v3.5.0..v3.5.1 + +General + +* Fixed dark theme for wizards (QTCREATORBUG-13395) +* Fixed that cancel button was ignored when wizards ask about overwriting files + (QTCREATORBUG-15022) +* Added support for MSYS2 compilers and debuggers + +Editing + +* Fixed crashes with code completion (QTCREATORBUG-14991, QTCREATORBUG-15020) + +Project Management + +* Fixed that some context actions were wrongly enabled + (QTCREATORBUG-14768, QTCREATORBUG-14728) + +C++ Support + +* Improved performance for Boost (QTCREATORBUG-14889, QTCREATORBUG-14741) +* Fixed that adding defines with compiler flag did not work with space after `-D` + (QTCREATORBUG-14792) + +QML Support + +* Fixed that `.ui.qml` warnings accumulated when splitting (QTCREATORBUG-14923) + +QML Profier + +* Fixed that notes were saved but not loaded (QTCREATORBUG-15077) + +Version Control Systems + +* Git + * Fixed encoding of log output +* Mercurial + * Fixed crash when annotating (QTCREATORBUG-14975) + +Diff Editor + +* Fixed handling of mode changes (QTCREATORBUG-14963) + +Platform Specific + +Remote Linux + +* Fixed wrong SSH key compatibility check + +BareMetal + +* Fixed that GDB server provider list did not update on host change diff --git a/doc/src/editors/creator-beautifier.qdoc b/doc/src/editors/creator-beautifier.qdoc index c5257f46a4e..fbbb79937af 100644 --- a/doc/src/editors/creator-beautifier.qdoc +++ b/doc/src/editors/creator-beautifier.qdoc @@ -90,7 +90,7 @@ DISTFILES variable as the configuration file for the selected tool. - \li Select the \uicontrol {Use $HOME} option to use the + \li Select the \uicontrol {Use file in $HOME} option to use the specified file in the user's home directory as the configuration file for the selected tool. @@ -117,8 +117,9 @@ \endlist In addition to the \uicontrol {Format Current File} command, ClangFormat - provides the \uicontrol {Format Selected Text} command. If you select it - when no text is selected, nothing happens. To format the entire file in this - case, select the \uicontrol {Format entire file if no text was selected} - check box in the \uicontrol {Clang Format} options. + and Uncrustify provide the \uicontrol {Format Selected Text} command. If you + select it when no text is selected, nothing happens. To format the entire + file in this case when using Clang, select the + \uicontrol {Format entire file if no text was selected} check box in the + \uicontrol {Clang Format} options. */ diff --git a/share/qtcreator/debugger/gdbbridge.py b/share/qtcreator/debugger/gdbbridge.py index 123d2f59574..47a1656fc20 100644 --- a/share/qtcreator/debugger/gdbbridge.py +++ b/share/qtcreator/debugger/gdbbridge.py @@ -1785,11 +1785,11 @@ class CliDumper(Dumper): return self.output # Global instance. -if gdb.parameter('height') is None: - theDumper = Dumper() -else: - import codecs - theDumper = CliDumper() +#if gdb.parameter('height') is None: +theDumper = Dumper() +#else: +# import codecs +# theDumper = CliDumper() ###################################################################### # diff --git a/share/qtcreator/qml-type-descriptions/qt5QtQuick2-bundle.json b/share/qtcreator/qml-type-descriptions/qt5QtQuick2-bundle.json index ad4524214e2..44374a954c8 100644 --- a/share/qtcreator/qml-type-descriptions/qt5QtQuick2-bundle.json +++ b/share/qtcreator/qml-type-descriptions/qt5QtQuick2-bundle.json @@ -18,6 +18,10 @@ "QtDataVisualization 1.0", "QtGraphicalEffects 1.0", "QtMultimedia 5.0", + "QtMultimedia 5.2", + "QtMultimedia 5.3", + "QtMultimedia 5.4", + "QtMultimedia 5.5", "QtNfc 5.0", "QtNfc 5.2", "QtNfc 5.3", diff --git a/src/libs/qmljs/qmljsinterpreter.cpp b/src/libs/qmljs/qmljsinterpreter.cpp index 5b9c3d2fd9e..b7f2a915c25 100644 --- a/src/libs/qmljs/qmljsinterpreter.cpp +++ b/src/libs/qmljs/qmljsinterpreter.cpp @@ -1487,6 +1487,7 @@ QList CppQmlTypes::createObjectsForImport(const QStri if (m_objectsByQualifiedName.contains(key)) continue; + ComponentVersion cppVersion; foreach (const FakeMetaObject::Export &bestExport, bestExports) { QString name = bestExport.type; bool exported = true; @@ -1501,7 +1502,10 @@ QList CppQmlTypes::createObjectsForImport(const QStri fmoo.originId); // use package.cppname importversion as key - m_objectsByQualifiedName.insert(key, newComponent); + if (cppVersion <= bestExport.version) { + cppVersion = bestExport.version; + m_objectsByQualifiedName.insert(key, newComponent); + } if (exported) { if (!exportedObjects.contains(name) // we might have the same type in different versions || (newComponent->componentVersion() > exportedObjects.value(name)->componentVersion())) diff --git a/src/plugins/analyzerbase/analyzermanager.cpp b/src/plugins/analyzerbase/analyzermanager.cpp index 32434c23562..47d01234f5b 100644 --- a/src/plugins/analyzerbase/analyzermanager.cpp +++ b/src/plugins/analyzerbase/analyzermanager.cpp @@ -432,7 +432,7 @@ void AnalyzerManagerPrivate::modeChanged(IMode *mode) { if (mode && mode == m_mode) { m_mainWindow->setDockActionsVisible(true); - static bool firstTime = true; + static bool firstTime = !m_currentAction; if (firstTime) selectSavedTool(); firstTime = false; diff --git a/src/plugins/android/androidrunner.cpp b/src/plugins/android/androidrunner.cpp index 4edb4df9ad2..6747bd89a23 100644 --- a/src/plugins/android/androidrunner.cpp +++ b/src/plugins/android/androidrunner.cpp @@ -180,7 +180,6 @@ AndroidRunner::AndroidRunner(QObject *parent, m_gdbserverPath = packageDir + _("/lib/gdbserver"); - m_gdbserverCommand = m_gdbserverPath + _(" --multi +") + m_gdbserverSocket; // Detect busybox, as we need to pass -w to ps to get wide output. QProcess psProc; psProc.start(m_adb, selector() << _("shell") << _("readlink") << _("$(which ps)")); @@ -375,7 +374,10 @@ void AndroidRunner::asyncStart() args << _("-e") << _("ping_file") << m_pingFile; args << _("-e") << _("pong_file") << m_pongFile; } - args << _("-e") << _("gdbserver_command") << m_gdbserverCommand; + + QString gdbserverCommand = QString::fromLatin1(adbShellAmNeedsQuotes() ? "\"%1 --multi +%2\"" : "%1 --multi +%2") + .arg(m_gdbserverPath).arg(m_gdbserverSocket); + args << _("-e") << _("gdbserver_command") << gdbserverCommand; args << _("-e") << _("gdbserver_socket") << m_gdbserverSocket; if (m_handShakeMethod == SocketHandShake) { @@ -501,6 +503,28 @@ void AndroidRunner::asyncStart() QMetaObject::invokeMethod(&m_checkPIDTimer, "start"); } +bool AndroidRunner::adbShellAmNeedsQuotes() +{ + // Between Android SDK Tools version 24.3.1 and 24.3.4 the quoting + // needs for the 'adb shell am start ...' parameters changed. + // Run a test to find out on what side of the fence we live. + // The command will fail with a complaint about the "--dummy" + // option on newer SDKs, and with "No intent supplied" on older ones. + // In case the test itself fails assume a new SDK. + QProcess adb; + adb.start(m_adb, selector() << _("shell") << _("am") << _("start") + << _("-e") << _("dummy") <<_("dummy --dummy")); + if (!adb.waitForStarted()) + return true; + + if (!adb.waitForFinished(10000)) + return true; + + QByteArray output = adb.readAllStandardError() + adb.readAllStandardOutput(); + bool oldSdk = output.contains("Error: No intent supplied"); + return !oldSdk; +} + void AndroidRunner::handleRemoteDebuggerRunning() { if (m_useCppDebugger) { diff --git a/src/plugins/android/androidrunner.h b/src/plugins/android/androidrunner.h index a87e99dca33..9a79b925d10 100644 --- a/src/plugins/android/androidrunner.h +++ b/src/plugins/android/androidrunner.h @@ -90,6 +90,7 @@ private: QByteArray runPs(); void findPs(); void logcatProcess(const QByteArray &text, QByteArray &buffer, bool onlyError); + bool adbShellAmNeedsQuotes(); private: QProcess m_adbLogcatProcess; @@ -111,7 +112,6 @@ private: QString m_pingFile; QString m_pongFile; QString m_gdbserverPath; - QString m_gdbserverCommand; QString m_gdbserverSocket; QString m_localLibs; QString m_localJars; diff --git a/src/plugins/cpptools/cppcompletion_test.cpp b/src/plugins/cpptools/cppcompletion_test.cpp index 8dbb838c999..7a6dce2a3a6 100644 --- a/src/plugins/cpptools/cppcompletion_test.cpp +++ b/src/plugins/cpptools/cppcompletion_test.cpp @@ -63,7 +63,8 @@ typedef QByteArray _; class CompletionTestCase : public Tests::TestCase { public: - CompletionTestCase(const QByteArray &sourceText, const QByteArray &textToInsert = QByteArray()) + CompletionTestCase(const QByteArray &sourceText, const QByteArray &textToInsert = QByteArray(), + bool isObjC = false) : m_position(-1), m_editorWidget(0), m_textDocument(0), m_editor(0) { QVERIFY(succeededSoFar()); @@ -77,7 +78,8 @@ public: // Write source to file m_temporaryDir.reset(new Tests::TemporaryDir()); QVERIFY(m_temporaryDir->isValid()); - const QString fileName = m_temporaryDir->createFile("file.h", m_source); + const QByteArray fileExt = isObjC ? ".mm" : ".h"; + const QString fileName = m_temporaryDir->createFile("file." + fileExt, m_source); QVERIFY(!fileName.isEmpty()); // Open in editor @@ -3361,9 +3363,10 @@ void CppToolsPlugin::test_completion_member_access_operator() QFETCH(QByteArray, code); QFETCH(QByteArray, prefix); QFETCH(QStringList, expectedCompletions); + QFETCH(bool, isObjC); QFETCH(bool, expectedReplaceAccessOperator); - CompletionTestCase test(code, prefix); + CompletionTestCase test(code, prefix, isObjC); QVERIFY(test.succeededSoFar()); bool replaceAccessOperator = false; @@ -3381,6 +3384,7 @@ void CppToolsPlugin::test_completion_member_access_operator_data() QTest::addColumn("code"); QTest::addColumn("prefix"); QTest::addColumn("expectedCompletions"); + QTest::addColumn("isObjC"); QTest::addColumn("expectedReplaceAccessOperator"); QTest::newRow("member_access_operator") << _( @@ -3391,8 +3395,19 @@ void CppToolsPlugin::test_completion_member_access_operator_data() ) << _("s.") << (QStringList() << QLatin1String("S") << QLatin1String("t")) + << false << true; + QTest::newRow("objc_not_replacing") << _( + "typedef struct objc_object Bar;" + "class Foo {\n" + " Bar *bar;\n" + " void func() { @ }" + "};\n" + ) << _("bar.") << (QStringList()) + << true + << false; + QTest::newRow("typedef_of_type_and_decl_of_type_no_replace_access_operator") << _( "struct S { int m; };\n" "typedef S SType;\n" @@ -3401,6 +3416,7 @@ void CppToolsPlugin::test_completion_member_access_operator_data() ) << _("p.") << (QStringList() << QLatin1String("S") << QLatin1String("m")) + << false << false; QTest::newRow("typedef_of_pointer_and_decl_of_pointer_no_replace_access_operator") << _( @@ -3409,6 +3425,7 @@ void CppToolsPlugin::test_completion_member_access_operator_data() "SType *p;\n" "@\n" ) << _("p.") << (QStringList()) + << false << false; QTest::newRow("typedef_of_type_and_decl_of_pointer_replace_access_operator") << _( @@ -3419,6 +3436,7 @@ void CppToolsPlugin::test_completion_member_access_operator_data() ) << _("p.") << (QStringList() << QLatin1String("S") << QLatin1String("m")) + << false << true; QTest::newRow("typedef_of_pointer_and_decl_of_type_replace_access_operator") << _( @@ -3429,6 +3447,7 @@ void CppToolsPlugin::test_completion_member_access_operator_data() ) << _("p.") << (QStringList() << QLatin1String("S") << QLatin1String("m")) + << false << true; QTest::newRow("predecl_typedef_of_type_and_decl_of_pointer_replace_access_operator") << _( @@ -3439,6 +3458,7 @@ void CppToolsPlugin::test_completion_member_access_operator_data() ) << _("p.") << (QStringList() << QLatin1String("S") << QLatin1String("m")) + << false << true; QTest::newRow("predecl_typedef_of_type_and_decl_type_no_replace_access_operator") << _( @@ -3449,6 +3469,7 @@ void CppToolsPlugin::test_completion_member_access_operator_data() ) << _("p.") << (QStringList() << QLatin1String("S") << QLatin1String("m")) + << false << false; QTest::newRow("predecl_typedef_of_pointer_and_decl_of_pointer_no_replace_access_operator") << _( @@ -3457,6 +3478,7 @@ void CppToolsPlugin::test_completion_member_access_operator_data() "SType *p;\n" "@\n" ) << _("p.") << (QStringList()) + << false << false; QTest::newRow("predecl_typedef_of_pointer_and_decl_of_type_replace_access_operator") << _( @@ -3467,6 +3489,7 @@ void CppToolsPlugin::test_completion_member_access_operator_data() ) << _("p.") << (QStringList() << QLatin1String("S") << QLatin1String("m")) + << false << true; QTest::newRow("typedef_of_pointer_of_type_replace_access_operator") << _( @@ -3478,6 +3501,7 @@ void CppToolsPlugin::test_completion_member_access_operator_data() ) << _("p.") << (QStringList() << QLatin1String("S") << QLatin1String("m")) + << false << true; QTest::newRow("typedef_of_pointer_of_type_no_replace_access_operator") << _( @@ -3489,5 +3513,6 @@ void CppToolsPlugin::test_completion_member_access_operator_data() ) << _("p->") << (QStringList() << QLatin1String("S") << QLatin1String("m")) + << false << false; } diff --git a/src/plugins/cpptools/cppcompletionassist.cpp b/src/plugins/cpptools/cppcompletionassist.cpp index bdb729b189e..fa7790a9153 100644 --- a/src/plugins/cpptools/cppcompletionassist.cpp +++ b/src/plugins/cpptools/cppcompletionassist.cpp @@ -2191,9 +2191,5 @@ void CppCompletionAssistInterface::getCppSpecifics() const m_parser->update(BuiltinEditorDocumentParser::InMemoryInfo(false)); m_snapshot = m_parser->snapshot(); m_headerPaths = m_parser->headerPaths(); - if (Document::Ptr document = m_parser->document()) - m_languageFeatures = document->languageFeatures(); - else - m_languageFeatures = LanguageFeatures::defaultFeatures(); } } diff --git a/src/plugins/projectexplorer/journaldwatcher.cpp b/src/plugins/projectexplorer/journaldwatcher.cpp index 1ea4587addc..33aef0e19d4 100644 --- a/src/plugins/projectexplorer/journaldwatcher.cpp +++ b/src/plugins/projectexplorer/journaldwatcher.cpp @@ -227,7 +227,10 @@ void JournaldWatcher::handleEntry() continue; const QByteArray pid = logEntry.value(QByteArrayLiteral("_PID")); - quint64 pidNum = pid.isEmpty() ? 0 : QString::fromLatin1(pid).toInt(); + if (pid.isEmpty()) + continue; + + quint64 pidNum = QString::fromLatin1(pid).toInt(); QString message = QString::fromUtf8(logEntry.value(QByteArrayLiteral("MESSAGE"))); message.append(QLatin1Char('\n')); // Add newline. diff --git a/src/plugins/qmlprofiler/qmlprofilermodelmanager.cpp b/src/plugins/qmlprofiler/qmlprofilermodelmanager.cpp index 726648970ca..0d1c6510df3 100644 --- a/src/plugins/qmlprofiler/qmlprofilermodelmanager.cpp +++ b/src/plugins/qmlprofiler/qmlprofilermodelmanager.cpp @@ -303,8 +303,10 @@ void QmlProfilerModelManager::acquiringDone() void QmlProfilerModelManager::processingDone() { QTC_ASSERT(state() == ProcessingData, /**/); - d->notesModel->loadData(); + // Load notes after the timeline models have been initialized ... + // which happens on stateChanged(Done). setState(Done); + d->notesModel->loadData(); emit loadFinished(); } diff --git a/src/plugins/resourceeditor/resourcenode.cpp b/src/plugins/resourceeditor/resourcenode.cpp index b081b4f8ced..367f8930df2 100644 --- a/src/plugins/resourceeditor/resourcenode.cpp +++ b/src/plugins/resourceeditor/resourcenode.cpp @@ -398,7 +398,7 @@ bool ResourceFolderNode::renameFile(const QString &filePath, const QString &newF bool ResourceFolderNode::renamePrefix(const QString &prefix, const QString &lang) { ResourceFile file(m_topLevelNode->path().toString()); - if (file.load() == Core::IDocument::OpenResult::Success) + if (file.load() != Core::IDocument::OpenResult::Success) return false; int index = file.indexOfPrefix(m_prefix, m_lang); if (index == -1) diff --git a/src/plugins/vcsbase/vcsbaseclient.cpp b/src/plugins/vcsbase/vcsbaseclient.cpp index 3a0256e5f3f..e1409025663 100644 --- a/src/plugins/vcsbase/vcsbaseclient.cpp +++ b/src/plugins/vcsbase/vcsbaseclient.cpp @@ -224,6 +224,8 @@ VcsCommand *VcsBaseClientImpl::vcsExec(const QString &workingDirectory, const QS useOutputToWindow ? VcsWindowOutputBind : NoOutputBind); command->setCookie(cookie); command->addFlags(additionalFlags); + if (editor) + command->setCodec(editor->codec()); enqueueJob(command, arguments); return command; } diff --git a/tests/system/suite_debugger/tst_cli_output_console/test.py b/tests/system/suite_debugger/tst_cli_output_console/test.py index 4a1386d089b..7fc062637b9 100644 --- a/tests/system/suite_debugger/tst_cli_output_console/test.py +++ b/tests/system/suite_debugger/tst_cli_output_console/test.py @@ -78,7 +78,13 @@ def main(): appOutput = str(waitForObject(":Qt Creator_Core::OutputWindow").plainText) verifyOutput(appOutput, outputStdOut, "std::cout", "Application Output") verifyOutput(appOutput, outputStdErr, "std::cerr", "Application Output") - verifyOutput(appOutput, outputQDebug, "qDebug()", "Application Output") + if (checkedTargets[kit] == Targets.DESKTOP_541_GCC + and platform.system() in ('Windows', 'Microsoft')): + test.log("Skipping qDebug() from %s (unstable, QTCREATORBUG-15067)" + % Targets.getStringForTarget(Targets.DESKTOP_541_GCC)) + else: + verifyOutput(appOutput, outputQDebug, + "qDebug()", "Application Output") clickButton(waitForObject(":Qt Creator_CloseButton")) except: test.fatal("Could not find Application Output Window", diff --git a/tests/system/suite_general/tst_default_settings/test.py b/tests/system/suite_general/tst_default_settings/test.py index 965152901de..2e5d5d9f82c 100644 --- a/tests/system/suite_general/tst_default_settings/test.py +++ b/tests/system/suite_general/tst_default_settings/test.py @@ -186,9 +186,10 @@ def __getExpectedCompilers__(): def __getWinCompilers__(): result = [] - winEnvVars = __getWinEnvVars__() for record in testData.dataset("win_compiler_paths.tsv"): - envvar = winEnvVars.get(testData.field(record, "envvar"), "") + envvar = os.getenv(testData.field(record, "envvar")) + if not envvar: + continue compiler = os.path.abspath(os.path.join(envvar, testData.field(record, "path"), testData.field(record, "file"))) if os.path.exists(compiler): @@ -206,27 +207,14 @@ def __getWinCompilers__(): :"%s %s" % (compiler, used)}) return result -# using os.getenv() or getOutputFromCmdline() do not work - they would return C:\Program Files (x86) -# for %ProgramFiles% as well as for %ProgramFiles(x86)% when using Python 32bit on 64bit machines -def __getWinEnvVars__(): - result = {} - tmpF, tmpFPath = tempfile.mkstemp() - envvars = subprocess.call('set', stdout=tmpF, shell=True) - os.close(tmpF) - tmpF = open(tmpFPath, "r") - for line in tmpF: - tmp = line.split("=") - result[tmp[0]] = tmp[1] - tmpF.close() - os.remove(tmpFPath) - return result - def __getExpectedDebuggers__(): + exeSuffix = "" result = [] if platform.system() in ('Microsoft', 'Windows'): result.extend(__getCDB__()) + exeSuffix = ".exe" for debugger in ["gdb", "lldb"]: - result.extend(findAllFilesInPATH(debugger)) + result.extend(findAllFilesInPATH(debugger + exeSuffix)) if platform.system() == 'Linux': result.extend(filter(lambda s: not ("lldb-platform" in s or "lldb-gdbserver" in s), findAllFilesInPATH("lldb-*"))) @@ -255,6 +243,7 @@ def __getCDB__(): return result def __compareCompilers__(foundCompilers, expectedCompilers): + # TODO: Check if all expected compilers were found equal = True flags = 0 isWin = platform.system() in ('Microsoft', 'Windows') @@ -276,7 +265,7 @@ def __compareCompilers__(foundCompilers, expectedCompilers): or currentFound.values() == currentExp.values()): foundExp = True break - equal = foundExp + equal = foundExp else: if isWin: equal = currentFound.lower() in __lowerStrs__(expectedCompilers) diff --git a/tests/system/suite_general/tst_default_settings/testdata/win_compiler_paths.tsv b/tests/system/suite_general/tst_default_settings/testdata/win_compiler_paths.tsv index 0438a4698bf..a9a8e548e3f 100644 --- a/tests/system/suite_general/tst_default_settings/testdata/win_compiler_paths.tsv +++ b/tests/system/suite_general/tst_default_settings/testdata/win_compiler_paths.tsv @@ -1,8 +1,10 @@ "envvar" "path" "file" "displayName" "displayedParameters" "usedParameters" "isSDK" "ProgramFiles" "Microsoft SDKs\Windows\v7.0\Bin" "SetEnv.cmd" "Microsoft Windows SDK for Windows 7" "x86,amd64,x86_amd64,ia64,x86_ia64" "/x86,/x64,/x64,/ia64,/ia64" "true" "ProgramFiles(x86)" "Microsoft SDKs\Windows\v7.0\Bin" "SetEnv.cmd" "Microsoft Windows SDK for Windows 7" "x86,amd64,x86_amd64,ia64,x86_ia64" "/x86,/x64,/x64,/ia64,/ia64" "true" +"ProgramW6432" "Microsoft SDKs\Windows\v7.0\Bin" "SetEnv.cmd" "Microsoft Windows SDK for Windows 7" "x86,amd64,x86_amd64,ia64,x86_ia64" "/x86,/x64,/x64,/ia64,/ia64" "true" "ProgramFiles" "Microsoft SDKs\Windows\v7.1\Bin" "SetEnv.cmd" "Microsoft Windows SDK for Windows 7" "x86,amd64,x86_amd64,ia64,x86_ia64" "/x86,/x64,/x64,/ia64,/ia64" "true" "ProgramFiles(x86)" "Microsoft SDKs\Windows\v7.1\Bin" "SetEnv.cmd" "Microsoft Windows SDK for Windows 7" "x86,amd64,x86_amd64,ia64,x86_ia64" "/x86,/x64,/x64,/ia64,/ia64" "true" +"ProgramW6432" "Microsoft SDKs\Windows\v7.1\Bin" "SetEnv.cmd" "Microsoft Windows SDK for Windows 7" "x86,amd64,x86_amd64,ia64,x86_ia64" "/x86,/x64,/x64,/ia64,/ia64" "true" "VS80COMNTOOLS" "..\..\VC\Bin" "vcvars32.bat" "Microsoft Visual C++ Compiler 8.0" "x86" "" "false" "VS80COMNTOOLS" "..\..\VC\Bin\amd64" "vcvarsamd64.bat" "Microsoft Visual C++ Compiler 8.0" "amd64" "amd64" "false" "VS80COMNTOOLS" "..\..\VC\Bin" "vcvarsx86_amd64.bat" "Microsoft Visual C++ Compiler 8.0" "x86_amd64" "x86_amd64" "false" @@ -17,3 +19,5 @@ "VS100COMNTOOLS" "..\..\VC" "vcvarsall.bat" "Microsoft Visual C++ Compiler 10.0" "x86,amd64,x86_amd64,ia64,x86_ia64" "x86,amd64,x86_amd64,ia64,x86_ia64" "false" "VS110COMNTOOLS" "..\..\VC\Bin" "vcvars32.bat" "Microsoft Visual C++ Compiler 11.0" "x86" "" "false" "VS110COMNTOOLS" "..\..\VC" "vcvarsall.bat" "Microsoft Visual C++ Compiler 11.0" "x86,amd64,x86_amd64,ia64,x86_ia64" "x86,amd64,x86_amd64,ia64,x86_ia64" "false" +"VS120COMNTOOLS" "..\..\VC\Bin" "vcvars32.bat" "Microsoft Visual C++ Compiler 12.0" "x86" "" "false" +"VS120COMNTOOLS" "..\..\VC" "vcvarsall.bat" "Microsoft Visual C++ Compiler 12.0" "x86,amd64,x86_amd64,ia64,x86_ia64" "x86,amd64,x86_amd64,ia64,x86_ia64" "false"