Merge topic 'NO_CMAKE_INSTALL_PREFIX'

42f7e39789 Find: Support per call disabling of CMAKE_INSTALL_PREFIX

Acked-by: Kitware Robot <kwrobot@kitware.com>
Acked-by: buildbot <buildbot@kitware.com>
Merge-request: !7163
This commit is contained in:
Brad King
2022-04-22 12:58:59 +00:00
committed by Kitware Robot
38 changed files with 328 additions and 13 deletions
+57 -2
View File
@@ -267,8 +267,61 @@ void cmFindBase::FillCMakeSystemVariablePath()
{
cmSearchPath& paths = this->LabeledPaths[PathLabel::CMakeSystem];
const bool install_prefix_in_list =
!this->Makefile->IsOn("CMAKE_FIND_NO_INSTALL_PREFIX");
const bool remove_install_prefix = this->NoCMakeInstallPath;
const bool add_install_prefix = !this->NoCMakeInstallPath &&
this->Makefile->IsDefinitionSet("CMAKE_FIND_USE_INSTALL_PREFIX");
// We have 3 possible states for `CMAKE_SYSTEM_PREFIX_PATH` and
// `CMAKE_INSTALL_PREFIX`.
// Either we need to remove `CMAKE_INSTALL_PREFIX`, add
// `CMAKE_INSTALL_PREFIX`, or do nothing.
//
// When we need to remove `CMAKE_INSTALL_PREFIX` we remove the Nth occurrence
// of `CMAKE_INSTALL_PREFIX` from `CMAKE_SYSTEM_PREFIX_PATH`, where `N` is
// computed by `CMakeSystemSpecificInformation.cmake` while constructing
// `CMAKE_SYSTEM_PREFIX_PATH`. This ensures that if projects / toolchains
// have removed `CMAKE_INSTALL_PREFIX` from the list, we don't remove
// some other entry by mistake
long install_prefix_count = -1;
std::string install_path_to_remove;
if (cmValue to_skip = this->Makefile->GetDefinition(
"_CMAKE_SYSTEM_PREFIX_PATH_INSTALL_PREFIX_COUNT")) {
cmStrToLong(to_skip, &install_prefix_count);
}
if (cmValue install_value = this->Makefile->GetDefinition(
"_CMAKE_SYSTEM_PREFIX_PATH_INSTALL_PREFIX_VALUE")) {
install_path_to_remove = *install_value;
}
if (remove_install_prefix && install_prefix_in_list &&
install_prefix_count > 0 && !install_path_to_remove.empty()) {
cmValue prefix_paths =
this->Makefile->GetDefinition("CMAKE_SYSTEM_PREFIX_PATH");
// remove entry from CMAKE_SYSTEM_PREFIX_PATH
std::vector<std::string> expanded = cmExpandedList(*prefix_paths);
long index_to_remove = 0;
for (const auto& path : expanded) {
if (path == install_path_to_remove && --install_prefix_count == 0) {
break;
}
++index_to_remove;
}
expanded.erase(expanded.begin() + index_to_remove);
paths.AddPrefixPaths(expanded,
this->Makefile->GetCurrentSourceDirectory().c_str());
} else if (add_install_prefix && !install_prefix_in_list) {
paths.AddCMakePrefixPath("CMAKE_INSTALL_PREFIX");
paths.AddCMakePrefixPath("CMAKE_SYSTEM_PREFIX_PATH");
} else {
// Otherwise the current setup of `CMAKE_SYSTEM_PREFIX_PATH` is correct
paths.AddCMakePrefixPath("CMAKE_SYSTEM_PREFIX_PATH");
}
std::string var = cmStrCat("CMAKE_SYSTEM_", this->CMakePathName, "_PATH");
paths.AddCMakePrefixPath("CMAKE_SYSTEM_PREFIX_PATH");
paths.AddCMakePath(var);
if (this->CMakePathName == "PROGRAM") {
@@ -496,7 +549,9 @@ cmFindBaseDebugState::~cmFindBaseDebugState()
" CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: ",
!this->FindCommand->NoSystemEnvironmentPath, "\n",
" CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: ",
!this->FindCommand->NoCMakeSystemPath, "\n");
!this->FindCommand->NoCMakeSystemPath, "\n",
" CMAKE_FIND_USE_INSTALL_PREFIX: ",
!this->FindCommand->NoCMakeInstallPath, "\n");
}
buffer +=
+6 -2
View File
@@ -39,6 +39,7 @@ cmFindCommon::cmFindCommon(cmExecutionStatus& status)
this->NoCMakeEnvironmentPath = false;
this->NoSystemEnvironmentPath = false;
this->NoCMakeSystemPath = false;
this->NoCMakeInstallPath = false;
// OS X Bundle and Framework search policy. The default is to
// search frameworks first on apple.
@@ -179,14 +180,15 @@ void cmFindCommon::SelectDefaultMacMode()
void cmFindCommon::SelectDefaultSearchModes()
{
const std::array<std::pair<bool&, std::string>, 5> search_paths = {
const std::array<std::pair<bool&, std::string>, 6> search_paths = {
{ { this->NoPackageRootPath, "CMAKE_FIND_USE_PACKAGE_ROOT_PATH" },
{ this->NoCMakePath, "CMAKE_FIND_USE_CMAKE_PATH" },
{ this->NoCMakeEnvironmentPath,
"CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH" },
{ this->NoSystemEnvironmentPath,
"CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH" },
{ this->NoCMakeSystemPath, "CMAKE_FIND_USE_CMAKE_SYSTEM_PATH" } }
{ this->NoCMakeSystemPath, "CMAKE_FIND_USE_CMAKE_SYSTEM_PATH" },
{ this->NoCMakeInstallPath, "CMAKE_FIND_USE_INSTALL_PREFIX" } }
};
for (auto const& path : search_paths) {
@@ -348,6 +350,8 @@ bool cmFindCommon::CheckCommonArgument(std::string const& arg)
this->NoSystemEnvironmentPath = true;
} else if (arg == "NO_CMAKE_SYSTEM_PATH") {
this->NoCMakeSystemPath = true;
} else if (arg == "NO_CMAKE_INSTALL_PREFIX") {
this->NoCMakeInstallPath = true;
} else if (arg == "NO_CMAKE_FIND_ROOT_PATH") {
this->FindRootPathMode = RootPathModeNever;
} else if (arg == "ONLY_CMAKE_FIND_ROOT_PATH") {
+1
View File
@@ -130,6 +130,7 @@ protected:
bool NoCMakeEnvironmentPath;
bool NoSystemEnvironmentPath;
bool NoCMakeSystemPath;
bool NoCMakeInstallPath;
std::vector<std::string> SearchPathSuffixes;
+51 -1
View File
@@ -1682,7 +1682,57 @@ void cmFindPackageCommand::FillPrefixesCMakeSystemVariable()
{
cmSearchPath& paths = this->LabeledPaths[PathLabel::CMakeSystem];
paths.AddCMakePath("CMAKE_SYSTEM_PREFIX_PATH");
const bool install_prefix_in_list =
!this->Makefile->IsOn("CMAKE_FIND_NO_INSTALL_PREFIX");
const bool remove_install_prefix = this->NoCMakeInstallPath;
const bool add_install_prefix = !this->NoCMakeInstallPath &&
this->Makefile->IsDefinitionSet("CMAKE_FIND_USE_INSTALL_PREFIX");
// We have 3 possible states for `CMAKE_SYSTEM_PREFIX_PATH` and
// `CMAKE_INSTALL_PREFIX`.
// Either we need to remove `CMAKE_INSTALL_PREFIX`, add
// `CMAKE_INSTALL_PREFIX`, or do nothing.
//
// When we need to remove `CMAKE_INSTALL_PREFIX` we remove the Nth occurrence
// of `CMAKE_INSTALL_PREFIX` from `CMAKE_SYSTEM_PREFIX_PATH`, where `N` is
// computed by `CMakeSystemSpecificInformation.cmake` while constructing
// `CMAKE_SYSTEM_PREFIX_PATH`. This ensures that if projects / toolchains
// have removed `CMAKE_INSTALL_PREFIX` from the list, we don't remove
// some other entry by mistake
long install_prefix_count = -1;
std::string install_path_to_remove;
if (cmValue to_skip = this->Makefile->GetDefinition(
"_CMAKE_SYSTEM_PREFIX_PATH_INSTALL_PREFIX_COUNT")) {
cmStrToLong(to_skip, &install_prefix_count);
}
if (cmValue install_value = this->Makefile->GetDefinition(
"_CMAKE_SYSTEM_PREFIX_PATH_INSTALL_PREFIX_VALUE")) {
install_path_to_remove = *install_value;
}
if (remove_install_prefix && install_prefix_in_list &&
install_prefix_count > 0 && !install_path_to_remove.empty()) {
cmValue prefix_paths =
this->Makefile->GetDefinition("CMAKE_SYSTEM_PREFIX_PATH");
// remove entry from CMAKE_SYSTEM_PREFIX_PATH
std::vector<std::string> expanded = cmExpandedList(*prefix_paths);
long count = 0;
for (const auto& path : expanded) {
bool to_add =
!(path == install_path_to_remove && ++count == install_prefix_count);
if (to_add) {
paths.AddPath(path);
}
}
} else if (add_install_prefix && !install_prefix_in_list) {
paths.AddCMakePath("CMAKE_INSTALL_PREFIX");
paths.AddCMakePath("CMAKE_SYSTEM_PREFIX_PATH");
} else {
// Otherwise the current setup of `CMAKE_SYSTEM_PREFIX_PATH` is correct
paths.AddCMakePath("CMAKE_SYSTEM_PREFIX_PATH");
}
paths.AddCMakePath("CMAKE_SYSTEM_FRAMEWORK_PATH");
paths.AddCMakePath("CMAKE_SYSTEM_APPBUNDLE_PATH");