Browse Source

Xcode: Pass compile definitions to Swift

correct Xcode generator Swift definitions
original code was defining GCC_PREPROCESSOR_DEFINITIONS which is valid only for C languages
add definitions to SWIFT_ACTIVE_COMPILATION_CONDITIONS when Swift language is used in the target
add test in SwiftOnly
for old Xcode (<8.0), append defines to cflags so it ends up in OTHER_SWIFT_FLAGS

Fixes: #23637
David Geldreich 3 years ago
parent
commit
5cb625eb2f
3 changed files with 19 additions and 0 deletions
  1. 12 0
      Source/cmGlobalXCodeGenerator.cxx
  2. 1 0
      Tests/SwiftOnly/CMakeLists.txt
  3. 6 0
      Tests/SwiftOnly/main.swift

+ 12 - 0
Source/cmGlobalXCodeGenerator.cxx

@@ -2423,6 +2423,18 @@ void cmGlobalXCodeGenerator::CreateBuildSettings(cmGeneratorTarget* gtgt,
   this->AppendDefines(ppDefs, targetDefines);
   buildSettings->AddAttribute("GCC_PREPROCESSOR_DEFINITIONS",
                               ppDefs.CreateList());
+  if (languages.count("Swift")) {
+    if (this->XcodeVersion < 80) {
+      std::string defineString;
+      std::set<std::string> defines(targetDefines.begin(),
+                                    targetDefines.end());
+      this->CurrentLocalGenerator->JoinDefines(defines, defineString, "Swift");
+      cflags["Swift"] += " " + defineString;
+    } else {
+      buildSettings->AddAttribute("SWIFT_ACTIVE_COMPILATION_CONDITIONS",
+                                  ppDefs.CreateList());
+    }
+  }
 
   std::string extraLinkOptionsVar;
   std::string extraLinkOptions;

+ 1 - 0
Tests/SwiftOnly/CMakeLists.txt

@@ -25,6 +25,7 @@ endif()
 set(CMAKE_Swift_MODULE_DIRECTORY ${CMAKE_BINARY_DIR}/swift)
 
 add_executable(SwiftOnly main.swift)
+target_compile_definitions(SwiftOnly PRIVATE SWIFTONLY)
 
 add_library(L L.swift)
 

+ 6 - 0
Tests/SwiftOnly/main.swift

@@ -1 +1,7 @@
 dump("SwiftOnly")
+
+#if SWIFTONLY
+dump("SWIFTONLY defined")
+#else
+fatalError("SWIFTONLY NOT defined")
+#endif