diff options
author | Brad King <brad.king@kitware.com> | 2022-02-01 17:04:21 (GMT) |
---|---|---|
committer | Kitware Robot <kwrobot@kitware.com> | 2022-02-01 17:04:33 (GMT) |
commit | c138ddb94319832972466cf6e7a7984bde54abe0 (patch) | |
tree | 0866918ad96330cbe4841103014e53036cfd89dc | |
parent | 012ea11ea4ace409fb1086da55652d87e852403c (diff) | |
parent | 11f97d196880e78717211ab68138e9ff922ec826 (diff) | |
download | CMake-c138ddb94319832972466cf6e7a7984bde54abe0.zip CMake-c138ddb94319832972466cf6e7a7984bde54abe0.tar.gz CMake-c138ddb94319832972466cf6e7a7984bde54abe0.tar.bz2 |
Merge topic 'refactor-find-package-cmake-ignore-path'
11f97d1968 find_package(): Refactor CMAKE_[SYSTEM_]IGNORE_PATH
30e5c1d92b find_package(): Add tests for CMAKE_IGNORE_PATH
Acked-by: Kitware Robot <kwrobot@kitware.com>
Tested-by: buildbot <buildbot@kitware.com>
Merge-request: !6918
-rw-r--r-- | Source/cmFindBase.cxx | 2 | ||||
-rw-r--r-- | Source/cmFindCommon.cxx | 17 | ||||
-rw-r--r-- | Source/cmFindCommon.h | 9 | ||||
-rw-r--r-- | Source/cmFindPackageCommand.cxx | 11 | ||||
-rw-r--r-- | Tests/RunCMake/find_package/IgnorePath.cmake | 12 | ||||
-rw-r--r-- | Tests/RunCMake/find_package/RunCMakeTest.cmake | 1 |
6 files changed, 41 insertions, 11 deletions
diff --git a/Source/cmFindBase.cxx b/Source/cmFindBase.cxx index a123e44..efc4e3a 100644 --- a/Source/cmFindBase.cxx +++ b/Source/cmFindBase.cxx @@ -168,7 +168,7 @@ bool cmFindBase::ParseArguments(std::vector<std::string> const& argsIn) } this->ExpandPaths(); - this->ComputeFinalPaths(); + this->ComputeFinalPaths(IgnorePaths::Yes); return true; } diff --git a/Source/cmFindCommon.cxx b/Source/cmFindCommon.cxx index 7631583..c58db1e 100644 --- a/Source/cmFindCommon.cxx +++ b/Source/cmFindCommon.cxx @@ -283,14 +283,15 @@ void cmFindCommon::RerootPaths(std::vector<std::string>& paths) void cmFindCommon::GetIgnoredPaths(std::vector<std::string>& ignore) { - // null-terminated list of paths. - static const char* paths[] = { "CMAKE_SYSTEM_IGNORE_PATH", - "CMAKE_IGNORE_PATH", nullptr }; + static constexpr const char* paths[] = { + "CMAKE_SYSTEM_IGNORE_PATH", + "CMAKE_IGNORE_PATH", + }; // Construct the list of path roots with no trailing slashes. - for (const char** pathName = paths; *pathName; ++pathName) { + for (const char* pathName : paths) { // Get the list of paths to ignore from the variable. - this->Makefile->GetDefExpandList(*pathName, ignore); + this->Makefile->GetDefExpandList(pathName, ignore); } for (std::string& i : ignore) { @@ -365,11 +366,13 @@ static void AddTrailingSlash(std::string& s) s += '/'; } } -void cmFindCommon::ComputeFinalPaths() +void cmFindCommon::ComputeFinalPaths(IgnorePaths ignorePaths) { // Filter out ignored paths from the prefix list std::set<std::string> ignored; - this->GetIgnoredPaths(ignored); + if (ignorePaths == IgnorePaths::Yes) { + this->GetIgnoredPaths(ignored); + } // Combine the separate path types, filtering out ignores this->SearchPaths.clear(); diff --git a/Source/cmFindCommon.h b/Source/cmFindCommon.h index 1a49aff..49d64e4 100644 --- a/Source/cmFindCommon.h +++ b/Source/cmFindCommon.h @@ -82,12 +82,17 @@ protected: /** Place a set of search paths under the search roots. */ void RerootPaths(std::vector<std::string>& paths); - /** Get ignored paths from CMAKE_[SYSTEM_]IGNORE_path variables. */ + /** Get ignored paths from CMAKE_[SYSTEM_]IGNORE_PATH variables. */ void GetIgnoredPaths(std::vector<std::string>& ignore); void GetIgnoredPaths(std::set<std::string>& ignore); /** Compute final search path list (reroot + trailing slash). */ - void ComputeFinalPaths(); + enum class IgnorePaths + { + No, + Yes, + }; + void ComputeFinalPaths(IgnorePaths ignorePaths); /** Compute the current default root path mode. */ void SelectDefaultRootPathMode(); diff --git a/Source/cmFindPackageCommand.cxx b/Source/cmFindPackageCommand.cxx index 6d788e4..c468a3c 100644 --- a/Source/cmFindPackageCommand.cxx +++ b/Source/cmFindPackageCommand.cxx @@ -1346,7 +1346,7 @@ void cmFindPackageCommand::ComputePrefixes() } this->FillPrefixesUserGuess(); - this->ComputeFinalPaths(); + this->ComputeFinalPaths(IgnorePaths::No); } void cmFindPackageCommand::FillPrefixesPackageRoot() @@ -2286,6 +2286,15 @@ bool cmFindPackageCommand::SearchPrefix(std::string const& prefix_in) return false; } + // Skip this if it's in ignored paths. + std::string prefixWithoutSlash = prefix_in; + if (prefixWithoutSlash != "/" && prefixWithoutSlash.back() == '/') { + prefixWithoutSlash.erase(prefixWithoutSlash.length() - 1); + } + if (this->IgnoredPaths.count(prefixWithoutSlash)) { + return false; + } + // PREFIX/ (useful on windows or in build trees) if (this->SearchDirectory(prefix_in)) { return true; diff --git a/Tests/RunCMake/find_package/IgnorePath.cmake b/Tests/RunCMake/find_package/IgnorePath.cmake new file mode 100644 index 0000000..f40549b --- /dev/null +++ b/Tests/RunCMake/find_package/IgnorePath.cmake @@ -0,0 +1,12 @@ +set(CMAKE_PREFIX_PATH + ${CMAKE_SOURCE_DIR}/PackageRoot/foo/cmake_root + ${CMAKE_SOURCE_DIR}/PackageRoot/foo/env_root + ) +set(CMAKE_IGNORE_PATH + ${CMAKE_SOURCE_DIR}/PackageRoot//foo/cmake_root// # Test double slashes + ${CMAKE_SOURCE_DIR}/PackageRoot/foo/env_root/cmake + ) +find_package(Bar QUIET CONFIG) +if(Bar_FOUND) + message(FATAL_ERROR "Bar should not be found, was found in ${Bar_DIR}") +endif() diff --git a/Tests/RunCMake/find_package/RunCMakeTest.cmake b/Tests/RunCMake/find_package/RunCMakeTest.cmake index 2bace98..12701dc 100644 --- a/Tests/RunCMake/find_package/RunCMakeTest.cmake +++ b/Tests/RunCMake/find_package/RunCMakeTest.cmake @@ -44,6 +44,7 @@ run_cmake(VersionRangeConfig2) run_cmake(VersionRangeConfig02) run_cmake(VersionRangeConfigStd) run_cmake(VersionRangeConfigStd2) +run_cmake(IgnorePath) if(UNIX AND NOT MSYS # FIXME: This works on CYGWIN but not on MSYS ) |