Commit 3e129d71 authored by Brad King's avatar Brad King Committed by Kitware Robot
Browse files

Merge topic 'project-include'

7d19b309 Release note for CMAKE_PROJECT_INCLUDE variable
dda01904 project: Add variable CMAKE_PROJECT_INCLUDE
390f14a2

 Test ProjectInclude: Add NONE to avoid enabling languages
Acked-by: Kitware Robot's avatarKitware Robot <kwrobot@kitware.com>
Merge-request: !3155
parents 29802ed2 7d19b309
Pipeline #133637 failed with stage
in 0 seconds
......@@ -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
^^^^^^^
......
......@@ -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
......
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.
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.
......@@ -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)
{
......
......@@ -36,6 +36,7 @@ public:
cmExecutionStatus& status) override;
private:
bool IncludeByVariable(const std::string& variable);
void TopLevelCMakeVarCondSet(const char* name, const char* value);
};
......
......@@ -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)
......
project(ProjectInclude)
project(ProjectInclude LANGUAGES NONE)
if(NOT AUTO_INCLUDE)
message(FATAL_ERROR "include file not found")
endif()
project(ProjectInclude LANGUAGES NONE)
if(NOT AUTO_INCLUDE)
message(FATAL_ERROR "include file not found")
endif()
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment