ソースを参照

Xcode: Add source file property to control file type (#14854)

Add source file properties to control Xcode file type attributes:

  XCODE_EXPLICIT_FILE_TYPE   => explicitFileType
  XCODE_LAST_KNOWN_FILE_TYPE => lastKnownFileType

Add a RunCMake.XcodeProject test to verify generated project content.
Brad King 11 年 前
コミット
a339ea6529

+ 2 - 0
Help/manual/cmake-properties.7.rst

@@ -289,6 +289,8 @@ Properties on Source Files
    /prop_sf/OBJECT_OUTPUTS
    /prop_sf/SYMBOLIC
    /prop_sf/WRAP_EXCLUDE
+   /prop_sf/XCODE_EXPLICIT_FILE_TYPE
+   /prop_sf/XCODE_LAST_KNOWN_FILE_TYPE
 
 Properties on Cache Entries
 ===========================

+ 8 - 0
Help/prop_sf/XCODE_EXPLICIT_FILE_TYPE.rst

@@ -0,0 +1,8 @@
+XCODE_EXPLICIT_FILE_TYPE
+------------------------
+
+Set the Xcode ``explicitFileType`` attribute on its reference to a
+source file.  CMake computes a default based on file extension but
+can be told explicitly with this property.
+
+See also :prop_sf:`XCODE_LAST_KNOWN_FILE_TYPE`.

+ 9 - 0
Help/prop_sf/XCODE_LAST_KNOWN_FILE_TYPE.rst

@@ -0,0 +1,9 @@
+XCODE_LAST_KNOWN_FILE_TYPE
+--------------------------
+
+Set the Xcode ``lastKnownFileType`` attribute on its reference to a
+source file.  CMake computes a default based on file extension but
+can be told explicitly with this property.
+
+See also :prop_sf:`XCODE_EXPLICIT_FILE_TYPE`, which is preferred
+over this property if set.

+ 7 - 0
Help/release/dev/xcode-file-type.rst

@@ -0,0 +1,7 @@
+xcode-file-type
+---------------
+
+* The :generator:`Xcode` generator learned to check source
+  file properties  :prop_sf:`XCODE_EXPLICIT_FILE_TYPE` and
+  :prop_sf:`XCODE_LAST_KNOWN_FILE_TYPE` for a custom Xcode
+  file reference type.

+ 21 - 6
Source/cmGlobalXCodeGenerator.cxx

@@ -647,13 +647,14 @@ cmXCodeObject*
 cmGlobalXCodeGenerator::CreateXCodeSourceFileFromPath(
   const std::string &fullpath,
   cmTarget& cmtarget,
-  const std::string &lang)
+  const std::string &lang,
+  cmSourceFile* sf)
 {
   // Using a map and the full path guarantees that we will always get the same
   // fileRef object for any given full path.
   //
   cmXCodeObject* fileRef =
-    this->CreateXCodeFileReferenceFromPath(fullpath, cmtarget, lang);
+    this->CreateXCodeFileReferenceFromPath(fullpath, cmtarget, lang, sf);
 
   cmXCodeObject* buildFile = this->CreateObject(cmXCodeObject::PBXBuildFile);
   buildFile->SetComment(fileRef->GetComment());
@@ -696,7 +697,7 @@ cmGlobalXCodeGenerator::CreateXCodeSourceFile(cmLocalGenerator* lg,
     this->CurrentLocalGenerator->GetSourceFileLanguage(*sf);
 
   cmXCodeObject* buildFile =
-    this->CreateXCodeSourceFileFromPath(sf->GetFullPath(), cmtarget, lang);
+    this->CreateXCodeSourceFileFromPath(sf->GetFullPath(), cmtarget, lang, sf);
   cmXCodeObject* fileRef = buildFile->GetObject("fileRef")->GetObject();
 
   cmXCodeObject* settings =
@@ -828,7 +829,8 @@ cmXCodeObject*
 cmGlobalXCodeGenerator::CreateXCodeFileReferenceFromPath(
   const std::string &fullpath,
   cmTarget& cmtarget,
-  const std::string &lang)
+  const std::string &lang,
+  cmSourceFile* sf)
 {
   std::string fname = fullpath;
   cmXCodeObject* fileRef = this->FileRefs[fname];
@@ -850,6 +852,19 @@ cmGlobalXCodeGenerator::CreateXCodeFileReferenceFromPath(
 
   bool useLastKnownFileType = false;
   std::string fileType;
+  if(sf)
+    {
+    if(const char* e = sf->GetProperty("XCODE_EXPLICIT_FILE_TYPE"))
+      {
+      fileType = e;
+      }
+    else if(const char* l = sf->GetProperty("XCODE_LAST_KNOWN_FILE_TYPE"))
+      {
+      useLastKnownFileType = true;
+      fileType = l;
+      }
+    }
+  if(fileType.empty())
     {
     // If fullpath references a directory, then we need to specify
     // lastKnownFileType as folder in order for Xcode to be able to
@@ -902,7 +917,7 @@ cmGlobalXCodeGenerator::CreateXCodeFileReference(cmSourceFile* sf,
     this->CurrentLocalGenerator->GetSourceFileLanguage(*sf);
 
   return this->CreateXCodeFileReferenceFromPath(
-    sf->GetFullPath(), cmtarget, lang);
+    sf->GetFullPath(), cmtarget, lang, sf);
 }
 
 //----------------------------------------------------------------------------
@@ -1052,7 +1067,7 @@ cmGlobalXCodeGenerator::CreateXCodeTargets(cmLocalGenerator* gen,
         {
         std::string obj = *oi;
         cmXCodeObject* xsf =
-          this->CreateXCodeSourceFileFromPath(obj, cmtarget, "");
+          this->CreateXCodeSourceFileFromPath(obj, cmtarget, "", 0);
         externalObjFiles.push_back(xsf);
         }
       }

+ 4 - 2
Source/cmGlobalXCodeGenerator.h

@@ -163,10 +163,12 @@ private:
                          std::vector<cmLocalGenerator*>& generators);
   cmXCodeObject* CreateXCodeFileReferenceFromPath(const std::string &fullpath,
                                                   cmTarget& cmtarget,
-                                                  const std::string &lang);
+                                                  const std::string &lang,
+                                                  cmSourceFile* sf);
   cmXCodeObject* CreateXCodeSourceFileFromPath(const std::string &fullpath,
                                                cmTarget& cmtarget,
-                                               const std::string &lang);
+                                               const std::string &lang,
+                                               cmSourceFile* sf);
   cmXCodeObject* CreateXCodeFileReference(cmSourceFile* sf,
                                           cmTarget& cmtarget);
   cmXCodeObject* CreateXCodeSourceFile(cmLocalGenerator* gen,

+ 4 - 0
Tests/RunCMake/CMakeLists.txt

@@ -123,6 +123,10 @@ if("${CMAKE_GENERATOR}" MATCHES "Visual Studio [^6]")
   add_RunCMake_test(SolutionGlobalSections)
 endif()
 
+if(XCODE_VERSION AND NOT "${XCODE_VERSION}" VERSION_LESS 3)
+  add_RunCMake_test(XcodeProject)
+endif()
+
 add_RunCMake_test(File_Generate)
 add_RunCMake_test(ExportWithoutLanguage)
 add_RunCMake_test(target_link_libraries)

+ 3 - 0
Tests/RunCMake/XcodeProject/CMakeLists.txt

@@ -0,0 +1,3 @@
+cmake_minimum_required(VERSION 2.8.4)
+project(${RunCMake_TEST} NONE)
+include(${RunCMake_TEST}.cmake)

+ 3 - 0
Tests/RunCMake/XcodeProject/RunCMakeTest.cmake

@@ -0,0 +1,3 @@
+include(RunCMake)
+
+run_cmake(XcodeFileType)

+ 10 - 0
Tests/RunCMake/XcodeProject/XcodeFileType-check.cmake

@@ -0,0 +1,10 @@
+set(expect-default "explicitFileType = sourcecode")
+set(expect-explicit "explicitFileType = \"sourcecode.c.h\"")
+set(expect-lastKnown "lastKnownFileType = \"sourcecode.c.h\"")
+foreach(src default explicit lastKnown)
+  file(STRINGS ${RunCMake_TEST_BINARY_DIR}/XcodeFileType.xcodeproj/project.pbxproj actual-${src}
+       REGEX "PBXFileReference.*src-${src}")
+  if(NOT actual-${src} MATCHES "${expect-${src}}")
+    message(SEND_ERROR "src-${src} does not match '${expect-${src}}':\n ${actual-${src}}")
+  endif()
+endforeach()

+ 4 - 0
Tests/RunCMake/XcodeProject/XcodeFileType.cmake

@@ -0,0 +1,4 @@
+enable_language(C)
+add_executable(main main.c src-default src-explicit src-lastKnown)
+set_property(SOURCE src-explicit PROPERTY XCODE_EXPLICIT_FILE_TYPE sourcecode.c.h)
+set_property(SOURCE src-lastKnown PROPERTY XCODE_LAST_KNOWN_FILE_TYPE sourcecode.c.h)

+ 0 - 0
Tests/RunCMake/XcodeProject/main.c


+ 0 - 0
Tests/RunCMake/XcodeProject/src-default


+ 0 - 0
Tests/RunCMake/XcodeProject/src-explicit


+ 0 - 0
Tests/RunCMake/XcodeProject/src-lastKnown