project: Add variable CMAKE_PROJECT_INCLUDE

This commit is contained in:
Ruslan Baratov 2019-03-27 22:36:51 +03:00
parent 390f14a244
commit dda0190458
7 changed files with 52 additions and 14 deletions

View File

@ -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
^^^^^^^

View File

@ -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

View File

@ -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.

View File

@ -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)
{

View File

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

View File

@ -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)

View File

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