forked from qt-creator/qt-creator
CMakePM: Detect C/C++ object extension for single source build
When using CMake package manager auto-setup the CMAKE_C| XX_OUTPUT_EXTENSION is stored in the CMake cache. This way CMake project manager can know about the correct extension when building a single source file. If CMAKE_C|XX_OUTPUT_EXTENSION is not found in cache it will only use ".obj" for Clang-Cl/MSVC/MinGW toolchains. Task-number: QTCREATORBUG-27471 Change-Id: Ib9b75608d5a6834014150c57f3098f79284d8276 Reviewed-by: Orgad Shaneh <orgads@gmail.com>
This commit is contained in:
@@ -26,6 +26,7 @@
|
|||||||
#include <debugger/analyzer/analyzermanager.h>
|
#include <debugger/analyzer/analyzermanager.h>
|
||||||
|
|
||||||
#include <projectexplorer/buildmanager.h>
|
#include <projectexplorer/buildmanager.h>
|
||||||
|
#include <projectexplorer/kitaspects.h>
|
||||||
#include <projectexplorer/projectexplorer.h>
|
#include <projectexplorer/projectexplorer.h>
|
||||||
#include <projectexplorer/projectexplorerconstants.h>
|
#include <projectexplorer/projectexplorerconstants.h>
|
||||||
#include <projectexplorer/projectexplorericons.h>
|
#include <projectexplorer/projectexplorericons.h>
|
||||||
@@ -42,6 +43,7 @@
|
|||||||
#include <QFileDialog>
|
#include <QFileDialog>
|
||||||
#include <QMessageBox>
|
#include <QMessageBox>
|
||||||
|
|
||||||
|
using namespace CppEditor;
|
||||||
using namespace ProjectExplorer;
|
using namespace ProjectExplorer;
|
||||||
using namespace Utils;
|
using namespace Utils;
|
||||||
|
|
||||||
@@ -402,7 +404,6 @@ void CMakeManager::buildFile(Node *node)
|
|||||||
QTC_ASSERT(target, return);
|
QTC_ASSERT(target, return);
|
||||||
const QString generator = CMakeGeneratorKitAspect::generator(target->kit());
|
const QString generator = CMakeGeneratorKitAspect::generator(target->kit());
|
||||||
const QString relativeSource = filePath.relativeChildPath(targetNode->filePath()).toString();
|
const QString relativeSource = filePath.relativeChildPath(targetNode->filePath()).toString();
|
||||||
const QString objExtension = Utils::HostOsInfo::isWindowsHost() ? QString(".obj") : QString(".o");
|
|
||||||
Utils::FilePath targetBase;
|
Utils::FilePath targetBase;
|
||||||
BuildConfiguration *bc = target->activeBuildConfiguration();
|
BuildConfiguration *bc = target->activeBuildConfiguration();
|
||||||
QTC_ASSERT(bc, return);
|
QTC_ASSERT(bc, return);
|
||||||
@@ -416,8 +417,32 @@ void CMakeManager::buildFile(Node *node)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
static_cast<CMakeBuildSystem *>(bc->buildSystem())
|
auto cbc = static_cast<CMakeBuildSystem *>(bc->buildSystem());
|
||||||
->buildCMakeTarget(targetBase.pathAppended(relativeSource).toString() + objExtension);
|
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<Id> 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()
|
void CMakeManager::buildFileContextMenu()
|
||||||
|
@@ -16,6 +16,12 @@ if (QT_CREATOR_SKIP_PACKAGE_MANAGER_SETUP)
|
|||||||
endif()
|
endif()
|
||||||
option(QT_CREATOR_SKIP_PACKAGE_MANAGER_SETUP "Skip Qt Creator's package manager auto-setup" OFF)
|
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)
|
macro(qtc_auto_setup_compiler_standard toolchainFile)
|
||||||
foreach(lang_var C CXX CUDA OBJC OBJCXX)
|
foreach(lang_var C CXX CUDA OBJC OBJCXX)
|
||||||
foreach(prop_var STANDARD STANDARD_REQUIRED EXTENSIONS)
|
foreach(prop_var STANDARD STANDARD_REQUIRED EXTENSIONS)
|
||||||
|
Reference in New Issue
Block a user