Преглед изворни кода

Merge topic 'project-include'

7d19b3091d Release note for CMAKE_PROJECT_INCLUDE variable
dda0190458 project: Add variable CMAKE_PROJECT_INCLUDE
390f14a244 Test ProjectInclude: Add NONE to avoid enabling languages

Acked-by: Kitware Robot <[email protected]>
Merge-request: !3155
Brad King пре 6 година
родитељ
комит
3e129d71bc

+ 3 - 3
Help/command/project.rst

@@ -31,9 +31,9 @@ Further variables are set by the optional arguments described in the following.
 If any of these arguments is not used, then the corresponding variables are
 set to the empty string.
 
-If the variable :variable:`CMAKE_PROJECT_<PROJECT-NAME>_INCLUDE` exists,
-the file pointed to by that variable will be included as the last step of the
-project command.
+If the variable :variable:`CMAKE_PROJECT_<PROJECT-NAME>_INCLUDE`
+or :variable:`CMAKE_PROJECT_INCLUDE` exists, the file pointed to by that
+variable will be included as the last step of the project command.
 
 Options
 ^^^^^^^

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

@@ -195,6 +195,7 @@ Variables that Change Behavior
    /variable/CMAKE_POLICY_WARNING_CMPNNNN
    /variable/CMAKE_PREFIX_PATH
    /variable/CMAKE_PROGRAM_PATH
+   /variable/CMAKE_PROJECT_INCLUDE
    /variable/CMAKE_PROJECT_PROJECT-NAME_INCLUDE
    /variable/CMAKE_SKIP_INSTALL_ALL_DEPENDENCY
    /variable/CMAKE_STAGING_PREFIX

+ 5 - 0
Help/release/dev/project-include.rst

@@ -0,0 +1,5 @@
+cmake_project_include
+---------------------
+
+* A variable :variable:`CMAKE_PROJECT_INCLUDE` was added to allow injection
+  of custom code into the project without knowing the project name a priori.

+ 6 - 0
Help/variable/CMAKE_PROJECT_INCLUDE.rst

@@ -0,0 +1,6 @@
+CMAKE_PROJECT_INCLUDE
+---------------------
+
+A CMake language file or module to be included by the :command:`project`
+command.  This is intended for injecting custom code into project
+builds without modifying their source.

+ 31 - 11
Source/cmProjectCommand.cxx

@@ -319,21 +319,41 @@ bool cmProjectCommand::InitialPass(std::vector<std::string> const& args,
     languages.emplace_back("CXX");
   }
   this->Makefile->EnableLanguage(languages, false);
-  std::string extraInclude = "CMAKE_PROJECT_" + projectName + "_INCLUDE";
-  const char* include = this->Makefile->GetDefinition(extraInclude);
-  if (include) {
-    bool readit = this->Makefile->ReadDependentFile(include);
-    if (!readit && !cmSystemTools::GetFatalErrorOccured()) {
-      std::string m = "could not find file:\n"
-                      "  ";
-      m += include;
-      this->SetError(m);
-      return false;
-    }
+
+  if (!this->IncludeByVariable("CMAKE_PROJECT_INCLUDE")) {
+    return false;
+  }
+
+  if (!this->IncludeByVariable("CMAKE_PROJECT_" + projectName + "_INCLUDE")) {
+    return false;
   }
+
   return true;
 }
 
+bool cmProjectCommand::IncludeByVariable(const std::string& variable)
+{
+  const char* include = this->Makefile->GetDefinition(variable);
+  if (!include) {
+    return true;
+  }
+
+  const bool readit = this->Makefile->ReadDependentFile(include);
+  if (readit) {
+    return true;
+  }
+
+  if (cmSystemTools::GetFatalErrorOccured()) {
+    return true;
+  }
+
+  std::string m = "could not find file:\n"
+                  "  ";
+  m += include;
+  this->SetError(m);
+  return false;
+}
+
 void cmProjectCommand::TopLevelCMakeVarCondSet(const char* const name,
                                                const char* const value)
 {

+ 1 - 0
Source/cmProjectCommand.h

@@ -36,6 +36,7 @@ public:
                    cmExecutionStatus& status) override;
 
 private:
+  bool IncludeByVariable(const std::string& variable);
   void TopLevelCMakeVarCondSet(const char* name, const char* value);
 };
 

+ 6 - 0
Tests/CMakeOnly/CMakeLists.txt

@@ -56,6 +56,12 @@ add_test(CMakeOnly.ProjectInclude ${CMAKE_CMAKE_COMMAND}
   -P ${CMAKE_CURRENT_BINARY_DIR}/Test.cmake
   )
 
+add_test(CMakeOnly.ProjectIncludeAny ${CMAKE_CMAKE_COMMAND}
+  -DTEST=ProjectIncludeAny
+  -DCMAKE_ARGS=-DCMAKE_PROJECT_INCLUDE=${CMAKE_CURRENT_SOURCE_DIR}/ProjectInclude/include.cmake
+  -P ${CMAKE_CURRENT_BINARY_DIR}/Test.cmake
+  )
+
 include(CMakeParseArguments)
 
 function(add_major_test module)

+ 1 - 1
Tests/CMakeOnly/ProjectInclude/CMakeLists.txt

@@ -1,4 +1,4 @@
-project(ProjectInclude)
+project(ProjectInclude LANGUAGES NONE)
 if(NOT AUTO_INCLUDE)
   message(FATAL_ERROR "include file not found")
 endif()

+ 4 - 0
Tests/CMakeOnly/ProjectIncludeAny/CMakeLists.txt

@@ -0,0 +1,4 @@
+project(ProjectInclude LANGUAGES NONE)
+if(NOT AUTO_INCLUDE)
+  message(FATAL_ERROR "include file not found")
+endif()