diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.cpp b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.cpp index eb1c68eae36..1dfc03af62f 100644 --- a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.cpp @@ -26,6 +26,7 @@ #include #include +#include #include #include #include @@ -42,6 +43,7 @@ #include #include +using namespace CppEditor; using namespace ProjectExplorer; using namespace Utils; @@ -402,7 +404,6 @@ void CMakeManager::buildFile(Node *node) QTC_ASSERT(target, return); const QString generator = CMakeGeneratorKitAspect::generator(target->kit()); const QString relativeSource = filePath.relativeChildPath(targetNode->filePath()).toString(); - const QString objExtension = Utils::HostOsInfo::isWindowsHost() ? QString(".obj") : QString(".o"); Utils::FilePath targetBase; BuildConfiguration *bc = target->activeBuildConfiguration(); QTC_ASSERT(bc, return); @@ -416,8 +417,32 @@ void CMakeManager::buildFile(Node *node) return; } - static_cast(bc->buildSystem()) - ->buildCMakeTarget(targetBase.pathAppended(relativeSource).toString() + objExtension); + auto cbc = static_cast(bc->buildSystem()); + const QString sourceFile = targetBase.pathAppended(relativeSource).toString(); + const QString objExtension = [&]() -> QString { + const auto sourceKind = ProjectFile::classify(relativeSource); + const QByteArray cmakeLangExtension = ProjectFile::isCxx(sourceKind) + ? "CMAKE_CXX_OUTPUT_EXTENSION" + : "CMAKE_C_OUTPUT_EXTENSION"; + const QString extension = cbc->configurationFromCMake().stringValueOf(cmakeLangExtension); + if (!extension.isEmpty()) + return extension; + + const auto toolchain = ProjectFile::isCxx(sourceKind) + ? ToolChainKitAspect::cxxToolChain(target->kit()) + : ToolChainKitAspect::cToolChain(target->kit()); + using namespace ProjectExplorer::Constants; + static QSet objIds{ + CLANG_CL_TOOLCHAIN_TYPEID, + MSVC_TOOLCHAIN_TYPEID, + MINGW_TOOLCHAIN_TYPEID, + }; + if (objIds.contains(toolchain->typeId())) + return ".obj"; + return ".o"; + }(); + + cbc->buildCMakeTarget(sourceFile + objExtension); } void CMakeManager::buildFileContextMenu() diff --git a/src/share/3rdparty/package-manager/auto-setup.cmake b/src/share/3rdparty/package-manager/auto-setup.cmake index bae90ee6429..59a43692dfb 100644 --- a/src/share/3rdparty/package-manager/auto-setup.cmake +++ b/src/share/3rdparty/package-manager/auto-setup.cmake @@ -16,6 +16,12 @@ if (QT_CREATOR_SKIP_PACKAGE_MANAGER_SETUP) endif() option(QT_CREATOR_SKIP_PACKAGE_MANAGER_SETUP "Skip Qt Creator's package manager auto-setup" OFF) +# Store the C/C++ object output extension +if (CMAKE_VERSION GREATER_EQUAL "3.19") + cmake_language(DEFER CALL set CMAKE_C_OUTPUT_EXTENSION "${CMAKE_C_OUTPUT_EXTENSION}" CACHE STRING "" FORCE) + cmake_language(DEFER CALL set CMAKE_CXX_OUTPUT_EXTENSION "${CMAKE_CXX_OUTPUT_EXTENSION}" CACHE STRING "" FORCE) +endif() + macro(qtc_auto_setup_compiler_standard toolchainFile) foreach(lang_var C CXX CUDA OBJC OBJCXX) foreach(prop_var STANDARD STANDARD_REQUIRED EXTENSIONS)