From e1ccab12d7530d4a1004f488cbb5c985f2d27215 Mon Sep 17 00:00:00 2001 From: Brad King Date: Wed, 2 Nov 2022 10:03:44 -0400 Subject: Xcode: Restore Swift framework search directories Previously we selected a single "language for preprocessor" with which to compute both target-wide `GCC_PREPROCESSOR_DEFINITIONS` and `{HEADER,FRAMEWORK}_SEARCH_PATHS`. Since commit c0dd3dd2c1 (Xcode: Evaluate Swift compile definitions separately, 2022-10-25, v3.25.0-rc3~16^2) we never compute `GCC_PREPROCESSOR_DEFINITIONS` for Swift. Therefore we need to select the language for target-wide include and framework directories separately. Fixes: #24116 --- Source/cmGlobalXCodeGenerator.cxx | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/Source/cmGlobalXCodeGenerator.cxx b/Source/cmGlobalXCodeGenerator.cxx index 67b6e92..e81ce22 100644 --- a/Source/cmGlobalXCodeGenerator.cxx +++ b/Source/cmGlobalXCodeGenerator.cxx @@ -2390,13 +2390,13 @@ void cmGlobalXCodeGenerator::CreateBuildSettings(cmGeneratorTarget* gtgt, // Choose a language to use for target-wide preprocessor definitions. static const char* ppLangs[] = { "CXX", "C", "OBJCXX", "OBJC" }; - std::string langForPreprocessor; + std::string langForPreprocessorDefinitions; if (cm::contains(ppLangs, llang)) { - langForPreprocessor = llang; + langForPreprocessorDefinitions = llang; } else { for (const char* l : ppLangs) { if (languages.count(l)) { - langForPreprocessor = l; + langForPreprocessorDefinitions = l; break; } } @@ -2424,9 +2424,9 @@ void cmGlobalXCodeGenerator::CreateBuildSettings(cmGeneratorTarget* gtgt, this->AppendDefines(ppDefs, exportMacro->c_str()); } std::vector targetDefines; - if (!langForPreprocessor.empty()) { + if (!langForPreprocessorDefinitions.empty()) { gtgt->GetCompileDefinitions(targetDefines, configName, - langForPreprocessor); + langForPreprocessorDefinitions); } this->AppendDefines(ppDefs, targetDefines); buildSettings->AddAttribute("GCC_PREPROCESSOR_DEFINITIONS", @@ -2725,10 +2725,12 @@ void cmGlobalXCodeGenerator::CreateBuildSettings(cmGeneratorTarget* gtgt, BuildObjectListOrString sysfdirs(this, true); const bool emitSystemIncludes = this->XcodeVersion >= 83; + // Choose a language to use for target-wide include directories. + std::string const& langForIncludes = llang; std::vector includes; - if (!langForPreprocessor.empty()) { + if (!langForIncludes.empty()) { this->CurrentLocalGenerator->GetIncludeDirectories( - includes, gtgt, langForPreprocessor, configName); + includes, gtgt, langForIncludes, configName); } std::set emitted; emitted.insert("/System/Library/Frameworks"); @@ -2741,7 +2743,7 @@ void cmGlobalXCodeGenerator::CreateBuildSettings(cmGeneratorTarget* gtgt, std::string incpath = this->XCodeEscapePath(frameworkDir); if (emitSystemIncludes && gtgt->IsSystemIncludeDirectory(include, configName, - langForPreprocessor)) { + langForIncludes)) { sysfdirs.Add(incpath); } else { fdirs.Add(incpath); @@ -2751,7 +2753,7 @@ void cmGlobalXCodeGenerator::CreateBuildSettings(cmGeneratorTarget* gtgt, std::string incpath = this->XCodeEscapePath(include); if (emitSystemIncludes && gtgt->IsSystemIncludeDirectory(include, configName, - langForPreprocessor)) { + langForIncludes)) { sysdirs.Add(incpath); } else { dirs.Add(incpath); @@ -2765,7 +2767,7 @@ void cmGlobalXCodeGenerator::CreateBuildSettings(cmGeneratorTarget* gtgt, std::string incpath = this->XCodeEscapePath(fwDir); if (emitSystemIncludes && gtgt->IsSystemIncludeDirectory(fwDir, configName, - langForPreprocessor)) { + langForIncludes)) { sysfdirs.Add(incpath); } else { fdirs.Add(incpath); -- cgit v0.12 From cb4e6702b26ce8fbe8b295b31c96841f2b32748a Mon Sep 17 00:00:00 2001 From: Brad King Date: Wed, 2 Nov 2022 16:58:21 -0400 Subject: Xcode: Implement Swift include directories Populate Xcode's `SWIFT_INCLUDE_PATHS` build setting with the target-wide include directories. Issue: #24116 --- Source/cmGlobalXCodeGenerator.cxx | 3 +++ Tests/SwiftOnly/CMakeLists.txt | 3 +++ Tests/SwiftOnly/SubA/CMakeLists.txt | 2 ++ Tests/SwiftOnly/SubA/SubA.swift | 0 Tests/SwiftOnly/SubB/CMakeLists.txt | 2 ++ Tests/SwiftOnly/SubB/SubB.swift | 1 + 6 files changed, 11 insertions(+) create mode 100644 Tests/SwiftOnly/SubA/CMakeLists.txt create mode 100644 Tests/SwiftOnly/SubA/SubA.swift create mode 100644 Tests/SwiftOnly/SubB/CMakeLists.txt create mode 100644 Tests/SwiftOnly/SubB/SubB.swift diff --git a/Source/cmGlobalXCodeGenerator.cxx b/Source/cmGlobalXCodeGenerator.cxx index e81ce22..0658021 100644 --- a/Source/cmGlobalXCodeGenerator.cxx +++ b/Source/cmGlobalXCodeGenerator.cxx @@ -2780,6 +2780,9 @@ void cmGlobalXCodeGenerator::CreateBuildSettings(cmGeneratorTarget* gtgt, } if (!dirs.IsEmpty()) { buildSettings->AddAttribute("HEADER_SEARCH_PATHS", dirs.CreateList()); + if (languages.count("Swift")) { + buildSettings->AddAttribute("SWIFT_INCLUDE_PATHS", dirs.CreateList()); + } } if (!sysfdirs.IsEmpty()) { buildSettings->AddAttribute("SYSTEM_FRAMEWORK_SEARCH_PATHS", diff --git a/Tests/SwiftOnly/CMakeLists.txt b/Tests/SwiftOnly/CMakeLists.txt index e92e544..fa8687d 100644 --- a/Tests/SwiftOnly/CMakeLists.txt +++ b/Tests/SwiftOnly/CMakeLists.txt @@ -22,6 +22,9 @@ elseif(NOT XCODE_VERSION VERSION_LESS 8.0) set(CMAKE_Swift_LANGUAGE_VERSION 3.0) endif() +add_subdirectory(SubA) +add_subdirectory(SubB) + set(CMAKE_Swift_MODULE_DIRECTORY ${CMAKE_BINARY_DIR}/swift) add_executable(SwiftOnly main.swift) diff --git a/Tests/SwiftOnly/SubA/CMakeLists.txt b/Tests/SwiftOnly/SubA/CMakeLists.txt new file mode 100644 index 0000000..edebc16 --- /dev/null +++ b/Tests/SwiftOnly/SubA/CMakeLists.txt @@ -0,0 +1,2 @@ +add_library(SubA SubA.swift) +target_include_directories(SubA INTERFACE "$") diff --git a/Tests/SwiftOnly/SubA/SubA.swift b/Tests/SwiftOnly/SubA/SubA.swift new file mode 100644 index 0000000..e69de29 diff --git a/Tests/SwiftOnly/SubB/CMakeLists.txt b/Tests/SwiftOnly/SubB/CMakeLists.txt new file mode 100644 index 0000000..6e92927 --- /dev/null +++ b/Tests/SwiftOnly/SubB/CMakeLists.txt @@ -0,0 +1,2 @@ +add_library(SubB SubB.swift) +target_link_libraries(SubB PRIVATE SubA) diff --git a/Tests/SwiftOnly/SubB/SubB.swift b/Tests/SwiftOnly/SubB/SubB.swift new file mode 100644 index 0000000..d593c4c --- /dev/null +++ b/Tests/SwiftOnly/SubB/SubB.swift @@ -0,0 +1 @@ +import SubA -- cgit v0.12