浏览代码

Merge topic 'xcode-swift-defs'

c0dd3dd2c1 Xcode: Evaluate Swift compile definitions separately

Acked-by: Kitware Robot <[email protected]>
Merge-request: !7826
Brad King 3 年之前
父节点
当前提交
ca80e8bdf6
共有 4 个文件被更改,包括 66 次插入11 次删除
  1. 32 11
      Source/cmGlobalXCodeGenerator.cxx
  2. 13 0
      Tests/SwiftMix/CMain.c
  3. 1 0
      Tests/SwiftMix/CMakeLists.txt
  4. 20 0
      Tests/SwiftMix/SwiftMain.swift

+ 32 - 11
Source/cmGlobalXCodeGenerator.cxx

@@ -2387,7 +2387,20 @@ void cmGlobalXCodeGenerator::CreateBuildSettings(cmGeneratorTarget* gtgt,
       gtgt->GetName());
     return;
   }
-  std::string const& langForPreprocessor = llang;
+
+  // Choose a language to use for target-wide preprocessor definitions.
+  static const char* ppLangs[] = { "CXX", "C", "OBJCXX", "OBJC" };
+  std::string langForPreprocessor;
+  if (cm::contains(ppLangs, llang)) {
+    langForPreprocessor = llang;
+  } else {
+    for (const char* l : ppLangs) {
+      if (languages.count(l)) {
+        langForPreprocessor = l;
+        break;
+      }
+    }
+  }
 
   if (gtgt->IsIPOEnabled(llang, configName)) {
     const char* ltoValue =
@@ -2404,13 +2417,8 @@ void cmGlobalXCodeGenerator::CreateBuildSettings(cmGeneratorTarget* gtgt,
 
   // Add preprocessor definitions for this target and configuration.
   BuildObjectListOrString ppDefs(this, true);
-  if (languages.count("Swift")) {
-    // FIXME: Xcode warns that Swift does not support definition values.
-    // C/CXX sources mixed in Swift targets will not see CMAKE_INTDIR.
-  } else {
-    this->AppendDefines(
-      ppDefs, "CMAKE_INTDIR=\"$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\"");
-  }
+  this->AppendDefines(
+    ppDefs, "CMAKE_INTDIR=\"$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\"");
   if (const std::string* exportMacro = gtgt->GetExportMacro()) {
     // Add the export symbol definition for shared library objects.
     this->AppendDefines(ppDefs, exportMacro->c_str());
@@ -2424,15 +2432,28 @@ void cmGlobalXCodeGenerator::CreateBuildSettings(cmGeneratorTarget* gtgt,
   buildSettings->AddAttribute("GCC_PREPROCESSOR_DEFINITIONS",
                               ppDefs.CreateList());
   if (languages.count("Swift")) {
+    // Swift uses a separate attribute for definitions.
+    std::vector<std::string> targetSwiftDefines;
+    gtgt->GetCompileDefinitions(targetSwiftDefines, configName, "Swift");
+    // Remove the '=value' parts, as Swift does not support them.
+    std::for_each(targetSwiftDefines.begin(), targetSwiftDefines.end(),
+                  [](std::string& def) {
+                    std::string::size_type pos = def.find('=');
+                    if (pos != std::string::npos) {
+                      def.erase(pos);
+                    }
+                  });
     if (this->XcodeVersion < 80) {
       std::string defineString;
-      std::set<std::string> defines(targetDefines.begin(),
-                                    targetDefines.end());
+      std::set<std::string> defines(targetSwiftDefines.begin(),
+                                    targetSwiftDefines.end());
       this->CurrentLocalGenerator->JoinDefines(defines, defineString, "Swift");
       cflags["Swift"] += " " + defineString;
     } else {
+      BuildObjectListOrString swiftDefs(this, true);
+      this->AppendDefines(swiftDefs, targetSwiftDefines);
       buildSettings->AddAttribute("SWIFT_ACTIVE_COMPILATION_CONDITIONS",
-                                  ppDefs.CreateList());
+                                  swiftDefs.CreateList());
     }
   }
 

+ 13 - 0
Tests/SwiftMix/CMain.c

@@ -1,3 +1,16 @@
+#if !defined(FOO)
+#  error "FOO not defined"
+#endif
+#if BAR != 3
+#  error "FOO not defined to 3"
+#endif
+#if CCOND != 2
+#  error "CCOND not defined to 2"
+#endif
+#if defined(SWIFTCOND)
+#  error "SWIFTCOND defined"
+#endif
+
 extern int ObjCMain(void);
 int main(void)
 {

+ 1 - 0
Tests/SwiftMix/CMakeLists.txt

@@ -4,3 +4,4 @@ project(SwiftMix C Swift)
 add_executable(SwiftMix CMain.c ObjCMain.m SwiftMain.swift ObjC-Swift.h)
 set_property(TARGET SwiftMix PROPERTY XCODE_ATTRIBUTE_SWIFT_OBJC_BRIDGING_HEADER "ObjC-Swift.h")
 target_compile_options(SwiftMix PRIVATE "$<$<COMPILE_LANGUAGE:C>:-Werror=objc-method-access>")
+target_compile_definitions(SwiftMix PRIVATE "$<IF:$<COMPILE_LANGUAGE:Swift>,SWIFTCOND,CCOND=2>" FOO BAR=3)

+ 20 - 0
Tests/SwiftMix/SwiftMain.swift

@@ -3,6 +3,26 @@ import Foundation
 @objc class SwiftMainClass : NSObject {
   @objc class func SwiftMain() -> Int32 {
     dump("Hello World!");
+#if FOO
+    dump("FOO defined");
+#else
+    fatalError("FOO not defined");
+#endif
+#if BAR
+    dump("BAR defined");
+#else
+    fatalError("BAR not defined");
+#endif
+#if CCOND
+    fatalError("CCOND defined");
+#else
+    dump("CCOND not defined");
+#endif
+#if SWIFTCOND
+    dump("SWIFTCOND defined");
+#else
+    fatalError("SWIFTCOND not defined");
+#endif
     return 0;
   }
 }