Browse Source

Merge topic '16780-write-single-xcodeproj'

e4e9ce7c Xcode: Add option to generate only topmost project file

Acked-by: Kitware Robot <[email protected]>
Merge-request: !1395
Brad King 8 years ago
parent
commit
cdc9c110a5

+ 1 - 0
Help/manual/cmake-variables.7.rst

@@ -188,6 +188,7 @@ Variables that Change Behavior
    /variable/CMAKE_USER_MAKE_RULES_OVERRIDE
    /variable/CMAKE_WARN_DEPRECATED
    /variable/CMAKE_WARN_ON_ABSOLUTE_INSTALL_DESTINATION
+   /variable/CMAKE_XCODE_GENERATE_TOP_LEVEL_PROJECT_ONLY
 
 Variables that Describe the System
 ==================================

+ 8 - 0
Help/release/dev/write-single-xcodeproj.rst

@@ -0,0 +1,8 @@
+write-single-xcodeproj
+----------------------
+
+* The :generator:`Xcode` generator behavior of generating one project
+  file per :command:`project()` command could now be controlled with the
+  :variable:`CMAKE_XCODE_GENERATE_TOP_LEVEL_PROJECT_ONLY` variable.
+  This could be useful to speed up the CMake generation step for
+  large projects and to work-around a bug in the ``ZERO_CHECK`` logic.

+ 9 - 0
Help/variable/CMAKE_XCODE_GENERATE_TOP_LEVEL_PROJECT_ONLY.rst

@@ -0,0 +1,9 @@
+CMAKE_XCODE_GENERATE_TOP_LEVEL_PROJECT_ONLY
+-------------------------------------------
+
+If enabled, the :generator:`Xcode` generator will generate only a
+single Xcode project file for the topmost :command:`project()` command
+instead of generating one for every ``project()`` command.
+
+This could be useful to speed up the CMake generation step for
+large projects and to work-around a bug in the ``ZERO_CHECK`` logic.

+ 11 - 0
Source/cmGlobalXCodeGenerator.cxx

@@ -388,6 +388,17 @@ void cmGlobalXCodeGenerator::Generate()
   std::map<std::string, std::vector<cmLocalGenerator*>>::iterator it;
   for (it = this->ProjectMap.begin(); it != this->ProjectMap.end(); ++it) {
     cmLocalGenerator* root = it->second[0];
+
+    bool generateTopLevelProjectOnly =
+      root->GetMakefile()->IsOn("CMAKE_XCODE_GENERATE_TOP_LEVEL_PROJECT_ONLY");
+
+    if (generateTopLevelProjectOnly) {
+      cmStateSnapshot snp = root->GetStateSnapshot();
+      if (snp.GetBuildsystemDirectoryParent().IsValid()) {
+        continue;
+      }
+    }
+
     this->SetGenerationRoot(root);
     // now create the project
     this->OutputXCodeProject(root, it->second);

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

@@ -8,6 +8,7 @@ run_cmake(XcodeFileType)
 run_cmake(XcodeAttributeLocation)
 run_cmake(XcodeAttributeGenex)
 run_cmake(XcodeAttributeGenexError)
+run_cmake(XcodeGenerateTopLevelProjectOnly)
 run_cmake(XcodeObjectNeedsEscape)
 run_cmake(XcodeObjectNeedsQuote)
 run_cmake(XcodeOptimizationFlags)

+ 3 - 0
Tests/RunCMake/XcodeProject/XcodeGenerateTopLevelProjectOnly-check.cmake

@@ -0,0 +1,3 @@
+if(EXISTS "${RunCMake_TEST_BINARY_DIR}/subproject/subproject.xcodeproj")
+  message(SEND_ERROR "Unexpected project file for subproject found.")
+endif()

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

@@ -0,0 +1,3 @@
+set(CMAKE_XCODE_GENERATE_TOP_LEVEL_PROJECT_ONLY TRUE)
+project(XcodeGenerateTopLevelProjectOnly NONE)
+add_subdirectory(subproject)

+ 1 - 0
Tests/RunCMake/XcodeProject/subproject/CMakeLists.txt

@@ -0,0 +1 @@
+project(subproject)