diff --git a/src/lib_gui/qt/window/project_wizzard/QtProjectWizzard.cpp b/src/lib_gui/qt/window/project_wizzard/QtProjectWizzard.cpp index e16ad89f..ab8cd5b8 100644 --- a/src/lib_gui/qt/window/project_wizzard/QtProjectWizzard.cpp +++ b/src/lib_gui/qt/window/project_wizzard/QtProjectWizzard.cpp @@ -25,6 +25,7 @@ #include "utility/messaging/type/MessageRefresh.h" #include "utility/messaging/type/MessageScrollSpeedChange.h" #include "utility/messaging/type/MessageStatus.h" +#include "utility/utilityPathDetection.h" #include "utility/utilityString.h" #include "Application.h" @@ -246,6 +247,29 @@ void QtProjectWizzard::showPreferences() connect(window, SIGNAL(next()), this, SLOT(savePreferences())); } +bool QtProjectWizzard::applicationSettingsContainVisualStudioHeaderSearchPaths() +{ + std::vector usedExpandedGlobalHeaderSearchPaths = ApplicationSettings::getInstance()->getHeaderSearchPathsExpanded(); + + const std::shared_ptr headerPathDetector = utility::getCxxVsHeaderPathDetector(); + for (const std::string& detectorName: headerPathDetector->getWorkingDetectorNames()) + { + for (const FilePath& path: headerPathDetector->getPaths(detectorName)) + { + const FilePath expandedPath = path.expandEnvironmentVariables(); + for (const FilePath& usedExpandedPath: usedExpandedGlobalHeaderSearchPaths) + { + if (expandedPath == usedExpandedPath) + { + return true; + } + } + } + } + + return false; +} + template QtProjectWizzardWindow* QtProjectWizzard::createWindowWithContent() { @@ -335,6 +359,15 @@ void QtProjectWizzard::selectedProjectType(LanguageType languageType, QtProjectW else { m_settings = std::make_shared(); + + if (applicationSettingsContainVisualStudioHeaderSearchPaths()) + { + std::vector flags; + flags.push_back("-fms-extensions"); + flags.push_back("-fms-compatibility"); + flags.push_back("-fms-compatibility-version=19"); + std::dynamic_pointer_cast(m_settings)->setCompilerFlags(flags); + } } m_settings->setLanguage(languageType); emptyProject(); diff --git a/src/lib_gui/qt/window/project_wizzard/QtProjectWizzard.h b/src/lib_gui/qt/window/project_wizzard/QtProjectWizzard.h index cc63b857..db006e6d 100644 --- a/src/lib_gui/qt/window/project_wizzard/QtProjectWizzard.h +++ b/src/lib_gui/qt/window/project_wizzard/QtProjectWizzard.h @@ -42,6 +42,8 @@ public slots: void showPreferences(); private: + static bool applicationSettingsContainVisualStudioHeaderSearchPaths(); + template QtProjectWizzardWindow* createWindowWithContent(); diff --git a/src/lib_gui/utility/path_detector/cxx_header/CxxVsHeaderPathDetector.cpp b/src/lib_gui/utility/path_detector/cxx_header/CxxVsHeaderPathDetector.cpp index b0c2294b..9f5d41fe 100644 --- a/src/lib_gui/utility/path_detector/cxx_header/CxxVsHeaderPathDetector.cpp +++ b/src/lib_gui/utility/path_detector/cxx_header/CxxVsHeaderPathDetector.cpp @@ -8,10 +8,11 @@ #include "utility/file/FilePath.h" #include "utility/logging/logging.h" -CxxVsHeaderPathDetector::CxxVsHeaderPathDetector(int version, bool isExpress) - : PathDetector("Visual Studio " + std::to_string(version) + (isExpress ? " Express" : "")) +CxxVsHeaderPathDetector::CxxVsHeaderPathDetector(int version, bool isExpress, ApplicationArchitectureType architecture) + : PathDetector("Visual Studio " + std::to_string(version) + (isExpress ? " Express" : "") + (architecture == APPLICATION_ARCHITECTURE_X86_64 ? "64 Bit" : "")) , m_version(version) , m_isExpress(isExpress) + , m_architecture(architecture) { } @@ -89,7 +90,7 @@ std::vector CxxVsHeaderPathDetector::getPaths() const FilePath CxxVsHeaderPathDetector::getVsInstallPathUsingRegistry() const { QString key = "HKEY_LOCAL_MACHINE\\SOFTWARE\\"; - if (QSysInfo::currentCpuArchitecture() == "x86_64") + if (m_architecture == APPLICATION_ARCHITECTURE_X86_32) { key += "Wow6432Node\\"; } diff --git a/src/lib_gui/utility/path_detector/cxx_header/CxxVsHeaderPathDetector.h b/src/lib_gui/utility/path_detector/cxx_header/CxxVsHeaderPathDetector.h index a1a2637e..3eb2494a 100644 --- a/src/lib_gui/utility/path_detector/cxx_header/CxxVsHeaderPathDetector.h +++ b/src/lib_gui/utility/path_detector/cxx_header/CxxVsHeaderPathDetector.h @@ -2,11 +2,12 @@ #define CXX_VS_HEADER_PATH_DETECTOR_H #include "utility/path_detector/PathDetector.h" +#include "utility/ApplicationArchitectureType.h" class CxxVsHeaderPathDetector: public PathDetector { public: - CxxVsHeaderPathDetector(int version, bool isExpress); + CxxVsHeaderPathDetector(int version, bool isExpress, ApplicationArchitectureType architecture); virtual ~CxxVsHeaderPathDetector(); virtual std::vector getPaths() const; @@ -17,6 +18,7 @@ private: const int m_version; const bool m_isExpress; + const ApplicationArchitectureType m_architecture; }; #endif // CXX_VS_HEADER_PATH_DETECTOR_H diff --git a/src/lib_gui/utility/utilityPathDetection.cpp b/src/lib_gui/utility/utilityPathDetection.cpp index 89ab4757..f4eee105 100644 --- a/src/lib_gui/utility/utilityPathDetection.cpp +++ b/src/lib_gui/utility/utilityPathDetection.cpp @@ -29,19 +29,49 @@ std::shared_ptr utility::getJavaRuntimePathDetector() return combinedDetector; } +std::shared_ptr utility::getCxxVsHeaderPathDetector() +{ + std::shared_ptr combinedDetector = std::make_shared(); + combinedDetector->addDetector(std::make_shared(14, false, APPLICATION_ARCHITECTURE_X86_32)); + combinedDetector->addDetector(std::make_shared(14, false, APPLICATION_ARCHITECTURE_X86_64)); + combinedDetector->addDetector(std::make_shared(14, true, APPLICATION_ARCHITECTURE_X86_32)); + combinedDetector->addDetector(std::make_shared(14, true, APPLICATION_ARCHITECTURE_X86_64)); + combinedDetector->addDetector(std::make_shared(12, false, APPLICATION_ARCHITECTURE_X86_32)); + combinedDetector->addDetector(std::make_shared(12, false, APPLICATION_ARCHITECTURE_X86_64)); + combinedDetector->addDetector(std::make_shared(12, true, APPLICATION_ARCHITECTURE_X86_32)); + combinedDetector->addDetector(std::make_shared(12, true, APPLICATION_ARCHITECTURE_X86_64)); + combinedDetector->addDetector(std::make_shared(11, false, APPLICATION_ARCHITECTURE_X86_32)); + combinedDetector->addDetector(std::make_shared(11, false, APPLICATION_ARCHITECTURE_X86_64)); + combinedDetector->addDetector(std::make_shared(11, true, APPLICATION_ARCHITECTURE_X86_32)); + combinedDetector->addDetector(std::make_shared(11, true, APPLICATION_ARCHITECTURE_X86_64)); + combinedDetector->addDetector(std::make_shared(9, false, APPLICATION_ARCHITECTURE_X86_32)); + combinedDetector->addDetector(std::make_shared(9, false, APPLICATION_ARCHITECTURE_X86_64)); + combinedDetector->addDetector(std::make_shared(9, true, APPLICATION_ARCHITECTURE_X86_32)); + combinedDetector->addDetector(std::make_shared(9, true, APPLICATION_ARCHITECTURE_X86_64)); + return combinedDetector; +} + std::shared_ptr utility::getCxxHeaderPathDetector() { std::shared_ptr combinedDetector = std::make_shared(); combinedDetector->addDetector(std::make_shared("gcc")); combinedDetector->addDetector(std::make_shared("clang")); - combinedDetector->addDetector(std::make_shared(14, false)); - combinedDetector->addDetector(std::make_shared(14, true)); - combinedDetector->addDetector(std::make_shared(12, false)); - combinedDetector->addDetector(std::make_shared(12, true)); - combinedDetector->addDetector(std::make_shared(11, false)); - combinedDetector->addDetector(std::make_shared(11, true)); - combinedDetector->addDetector(std::make_shared(9, false)); - combinedDetector->addDetector(std::make_shared(9, true)); + combinedDetector->addDetector(std::make_shared(14, false, APPLICATION_ARCHITECTURE_X86_32)); + combinedDetector->addDetector(std::make_shared(14, false, APPLICATION_ARCHITECTURE_X86_64)); + combinedDetector->addDetector(std::make_shared(14, true, APPLICATION_ARCHITECTURE_X86_32)); + combinedDetector->addDetector(std::make_shared(14, true, APPLICATION_ARCHITECTURE_X86_64)); + combinedDetector->addDetector(std::make_shared(12, false, APPLICATION_ARCHITECTURE_X86_32)); + combinedDetector->addDetector(std::make_shared(12, false, APPLICATION_ARCHITECTURE_X86_64)); + combinedDetector->addDetector(std::make_shared(12, true, APPLICATION_ARCHITECTURE_X86_32)); + combinedDetector->addDetector(std::make_shared(12, true, APPLICATION_ARCHITECTURE_X86_64)); + combinedDetector->addDetector(std::make_shared(11, false, APPLICATION_ARCHITECTURE_X86_32)); + combinedDetector->addDetector(std::make_shared(11, false, APPLICATION_ARCHITECTURE_X86_64)); + combinedDetector->addDetector(std::make_shared(11, true, APPLICATION_ARCHITECTURE_X86_32)); + combinedDetector->addDetector(std::make_shared(11, true, APPLICATION_ARCHITECTURE_X86_64)); + combinedDetector->addDetector(std::make_shared(9, false, APPLICATION_ARCHITECTURE_X86_32)); + combinedDetector->addDetector(std::make_shared(9, false, APPLICATION_ARCHITECTURE_X86_64)); + combinedDetector->addDetector(std::make_shared(9, true, APPLICATION_ARCHITECTURE_X86_32)); + combinedDetector->addDetector(std::make_shared(9, true, APPLICATION_ARCHITECTURE_X86_64)); return combinedDetector; } diff --git a/src/lib_gui/utility/utilityPathDetection.h b/src/lib_gui/utility/utilityPathDetection.h index f117719e..30111368 100644 --- a/src/lib_gui/utility/utilityPathDetection.h +++ b/src/lib_gui/utility/utilityPathDetection.h @@ -6,6 +6,8 @@ namespace utility { std::shared_ptr getJavaRuntimePathDetector(); + + std::shared_ptr getCxxVsHeaderPathDetector(); std::shared_ptr getCxxHeaderPathDetector(); std::shared_ptr getCxxFrameworkPathDetector(); }