find_package: Don't reroot prefix that is equal to a root path
When both CMAKE_FIND_ROOT_PATH and CMAKE_PREFIX_PATH are set to /opt/my_device_sysroot, cmFindCommon::RerootPaths would only look for packages in /opt/my_device_sysroot/opt/my_device_sysroot but would not try to look in /opt/my_device_sysroot. Make sure to not reroot the prefix path in such a case. Fixes: #21937
This commit is contained in:
parent
9be4c7f0c4
commit
91ec6eee58
@ -240,14 +240,20 @@ void cmFindCommon::RerootPaths(std::vector<std::string>& paths)
|
|||||||
std::vector<std::string> unrootedPaths = paths;
|
std::vector<std::string> unrootedPaths = paths;
|
||||||
paths.clear();
|
paths.clear();
|
||||||
|
|
||||||
|
auto isSameDirectoryOrSubDirectory = [](std::string const& l,
|
||||||
|
std::string const& r) {
|
||||||
|
return (cmSystemTools::GetRealPath(l) == cmSystemTools::GetRealPath(r)) ||
|
||||||
|
cmSystemTools::IsSubDirectory(l, r);
|
||||||
|
};
|
||||||
|
|
||||||
for (std::string const& r : roots) {
|
for (std::string const& r : roots) {
|
||||||
for (std::string const& up : unrootedPaths) {
|
for (std::string const& up : unrootedPaths) {
|
||||||
// Place the unrooted path under the current root if it is not
|
// Place the unrooted path under the current root if it is not
|
||||||
// already inside. Skip the unrooted path if it is relative to
|
// already inside. Skip the unrooted path if it is relative to
|
||||||
// a user home directory or is empty.
|
// a user home directory or is empty.
|
||||||
std::string rootedDir;
|
std::string rootedDir;
|
||||||
if (cmSystemTools::IsSubDirectory(up, r) ||
|
if (isSameDirectoryOrSubDirectory(up, r) ||
|
||||||
(stagePrefix && cmSystemTools::IsSubDirectory(up, *stagePrefix))) {
|
(stagePrefix && isSameDirectoryOrSubDirectory(up, *stagePrefix))) {
|
||||||
rootedDir = up;
|
rootedDir = up;
|
||||||
} else if (!up.empty() && up[0] != '~') {
|
} else if (!up.empty() && up[0] != '~') {
|
||||||
// Start with the new root.
|
// Start with the new root.
|
||||||
|
@ -0,0 +1,16 @@
|
|||||||
|
set(root "${CMAKE_CURRENT_SOURCE_DIR}/FindRootPathAndPrefixPathAreEqual")
|
||||||
|
set(CMAKE_FIND_ROOT_PATH "${root}")
|
||||||
|
set(CMAKE_PREFIX_PATH "${root}")
|
||||||
|
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE "ONLY")
|
||||||
|
|
||||||
|
find_package(Foo
|
||||||
|
REQUIRED
|
||||||
|
CONFIG
|
||||||
|
NO_CMAKE_ENVIRONMENT_PATH
|
||||||
|
NO_SYSTEM_ENVIRONMENT_PATH
|
||||||
|
# Important because CMAKE_SYSTEM_PREFIX_PATH might contain "/" as a prefix
|
||||||
|
# And when "/" is rerooted onto the root above, the package is found even if
|
||||||
|
# CMAKE_PREFIX_PATH is empty. We want to ensure that we hit
|
||||||
|
# the CMAKE_FIND_ROOT_PATH == CMAKE_PREFIX_PATH code path.
|
||||||
|
NO_CMAKE_SYSTEM_PATH
|
||||||
|
)
|
@ -25,6 +25,7 @@ run_cmake(PackageRootNestedModule)
|
|||||||
run_cmake(PolicyPush)
|
run_cmake(PolicyPush)
|
||||||
run_cmake(PolicyPop)
|
run_cmake(PolicyPop)
|
||||||
run_cmake(RequiredOptionValuesClash)
|
run_cmake(RequiredOptionValuesClash)
|
||||||
|
run_cmake(FindRootPathAndPrefixPathAreEqual)
|
||||||
run_cmake(SetFoundFALSE)
|
run_cmake(SetFoundFALSE)
|
||||||
run_cmake(WrongVersion)
|
run_cmake(WrongVersion)
|
||||||
run_cmake(WrongVersionConfig)
|
run_cmake(WrongVersionConfig)
|
||||||
|
Loading…
Reference in New Issue
Block a user