From 77c4d2f9a213f0c6bda0fb78238d621ecbb3676d Mon Sep 17 00:00:00 2001 From: Mikko Lehtonen Date: Fri, 26 Jan 2024 14:01:07 +0200 Subject: Xcode: Fix PCH support with Swift & C++ Previously, when a mixed language target ends up with `Swift` as the `LINKER_LANGUAGE`, the PCH file was not set for the target at all. Fixes: #21224 --- Source/cmGlobalXCodeGenerator.cxx | 3 ++- Tests/CMakeLists.txt | 1 + Tests/SwiftMixPCH/CMain.c | 9 +++++++++ Tests/SwiftMixPCH/CMakeLists.txt | 15 +++++++++++++++ Tests/SwiftMixPCH/SwiftFunc.swift | 4 ++++ Tests/SwiftMixPCH/pch.h | 1 + 6 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 Tests/SwiftMixPCH/CMain.c create mode 100644 Tests/SwiftMixPCH/CMakeLists.txt create mode 100644 Tests/SwiftMixPCH/SwiftFunc.swift create mode 100644 Tests/SwiftMixPCH/pch.h diff --git a/Source/cmGlobalXCodeGenerator.cxx b/Source/cmGlobalXCodeGenerator.cxx index c6bb3df..98d77c6 100644 --- a/Source/cmGlobalXCodeGenerator.cxx +++ b/Source/cmGlobalXCodeGenerator.cxx @@ -3067,7 +3067,8 @@ void cmGlobalXCodeGenerator::CreateBuildSettings(cmGeneratorTarget* gtgt, } // Precompile Headers - std::string pchHeader = gtgt->GetPchHeader(configName, llang); + std::string pchHeader = + gtgt->GetPchHeader(configName, langForPreprocessorDefinitions); if (!pchHeader.empty()) { buildSettings->AddAttribute("GCC_PREFIX_HEADER", this->CreateString(pchHeader)); diff --git a/Tests/CMakeLists.txt b/Tests/CMakeLists.txt index a1619ec..a7a456c 100644 --- a/Tests/CMakeLists.txt +++ b/Tests/CMakeLists.txt @@ -412,6 +412,7 @@ if(BUILD_TESTING) PASS_REGULAR_EXPRESSION "CMake Error at CMakeLists.txt:3 \\(add_executable\\):[ \r\n]*Cannot find source file:[ \r\n]*DoesNotExist/MissingSourceFile.c") if(CMake_TEST_Swift) ADD_TEST_MACRO(SwiftOnly SwiftOnly) + ADD_TEST_MACRO(SwiftMixPCH SwiftMixPCH) if(CMake_TEST_XCODE_SWIFT) ADD_TEST_MACRO(SwiftMix SwiftMix) endif() diff --git a/Tests/SwiftMixPCH/CMain.c b/Tests/SwiftMixPCH/CMain.c new file mode 100644 index 0000000..4cd78e6 --- /dev/null +++ b/Tests/SwiftMixPCH/CMain.c @@ -0,0 +1,9 @@ +#ifndef PCH_VALUE +# error "PCH_VALUE not defined" +#endif + +int main(void) +{ + const int value = PCH_VALUE; + return value == 42 ? 0 : 1; +} diff --git a/Tests/SwiftMixPCH/CMakeLists.txt b/Tests/SwiftMixPCH/CMakeLists.txt new file mode 100644 index 0000000..d5704f1 --- /dev/null +++ b/Tests/SwiftMixPCH/CMakeLists.txt @@ -0,0 +1,15 @@ +cmake_minimum_required(VERSION 3.15) +if(POLICY CMP0157) + cmake_policy(SET CMP0157 NEW) +endif() + +project(SwiftMixPCH C Swift) + +# Swift on Windows only provides a release runtime. +set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreadedDLL) + +add_executable(SwiftMixPCH CMain.c SwiftFunc.swift) +target_precompile_headers(SwiftMixPCH PRIVATE pch.h) + +# We don't want swift to emit main() +target_compile_options(SwiftMixPCH PRIVATE "$<$:-parse-as-library>") diff --git a/Tests/SwiftMixPCH/SwiftFunc.swift b/Tests/SwiftMixPCH/SwiftFunc.swift new file mode 100644 index 0000000..d49c36f --- /dev/null +++ b/Tests/SwiftMixPCH/SwiftFunc.swift @@ -0,0 +1,4 @@ + +func SwiftFunc() -> Int32 { + return 0; +} diff --git a/Tests/SwiftMixPCH/pch.h b/Tests/SwiftMixPCH/pch.h new file mode 100644 index 0000000..6de0669 --- /dev/null +++ b/Tests/SwiftMixPCH/pch.h @@ -0,0 +1 @@ +#define PCH_VALUE 42 -- cgit v0.12