1
0
mirror of https://github.com/Kitware/CMake.git synced 2025-10-14 19:08:07 +08:00

find_*: ensure consistent behavior for cache variables

Fixes: #22121
This commit is contained in:
Marc Chevrier
2021-05-03 14:16:07 +02:00
parent f5fa6d53b0
commit 08db1341a6
29 changed files with 485 additions and 10 deletions

View File

@@ -57,6 +57,7 @@ Policies Introduced by CMake 3.21
.. toctree::
:maxdepth: 1
CMP0125: find_(path|file|library|program) have consistent behavior for cache variables. </policy/CMP0125>
CMP0124: foreach() loop variables are only available in the loop scope. </policy/CMP0124>
CMP0123: ARMClang cpu/arch compile and link flags must be set explicitly. </policy/CMP0123>
CMP0122: UseSWIG use standard library name conventions for csharp language. </policy/CMP0122>

25
Help/policy/CMP0125.rst Normal file
View File

@@ -0,0 +1,25 @@
CMP0125
-------
.. versionadded:: 3.21
The :command:`find_file`, :command:`find_path`, :command:`find_library` and
:command:`find_program` commands handle cache variables in the same way
regardless of whether they are defined on the command line, with or without a
type, or using the :command:`set` command.
Starting with CMake 3.21, the :command:`find_file`, :command:`find_path`,
:command:`find_library`, and :command:`find_program` commands ensure that the
cache variables will be used in the same way regardless how they were defined
and the result will be always successful if the searched artifact exists.
The ``OLD`` behavior for this policy is to have the find commands' behaviors
differ depending on how the cache variable is defined. The ``NEW`` behavior for
this policy is to have consistent behavior.
This policy was introduced in CMake version 3.21. Use the
:command:`cmake_policy` command to set it to ``OLD`` or ``NEW`` explicitly.
Unlike many policies, CMake version |release| does *not* warn when the policy
is not set and simply uses ``OLD`` behavior.
.. include:: DEPRECATED.txt

View File

@@ -0,0 +1,6 @@
find_item-consistent-behavior
-----------------------------
* The :command:`find_file`, :command:`find_path`, :command:`find_program`,
and :command:`find_library` commands handle cache variables in the same way
regardless how they are defined. See policy :policy:`CMP0125` for details.

View File

@@ -9,8 +9,10 @@
#include <cmext/algorithm>
#include "cmCMakePath.h"
#include "cmMakefile.h"
#include "cmMessageType.h"
#include "cmPolicies.h"
#include "cmProperty.h"
#include "cmRange.h"
#include "cmSearchPath.h"
@@ -18,6 +20,7 @@
#include "cmStateTypes.h"
#include "cmStringAlgorithms.h"
#include "cmSystemTools.h"
#include "cmake.h"
class cmExecutionStatus;
@@ -328,28 +331,65 @@ bool cmFindBase::CheckForVariableInCache()
void cmFindBase::NormalizeFindResult()
{
// If the user specifies the entry on the command line without a
// type we should add the type and docstring but keep the original
// value.
if (this->AlreadyInCacheWithoutMetaInfo) {
this->Makefile->AddCacheDefinition(this->VariableName, "",
this->VariableDocumentation.c_str(),
this->VariableType);
if (this->Makefile->GetPolicyStatus(cmPolicies::CMP0125) ==
cmPolicies::NEW) {
// ensure the path returned by find_* command is absolute
const auto* existingValue =
this->Makefile->GetDefinition(this->VariableName);
std::string value;
if (!existingValue->empty()) {
value =
cmCMakePath(*existingValue, cmCMakePath::auto_format)
.Absolute(cmCMakePath(
this->Makefile->GetCMakeInstance()->GetCMakeWorkingDirectory()))
.Normal()
.GenericString();
// value = cmSystemTools::CollapseFullPath(*existingValue);
if (!cmSystemTools::FileExists(value, false)) {
value = *existingValue;
}
}
// If the user specifies the entry on the command line without a
// type we should add the type and docstring but keep the original
// value.
if (value != *existingValue || this->AlreadyInCacheWithoutMetaInfo) {
this->Makefile->GetCMakeInstance()->AddCacheEntry(
this->VariableName, value.c_str(), this->VariableDocumentation.c_str(),
this->VariableType);
// if there was a definition then remove it
// This is required to ensure same behavior as
// cmMakefile::AddCacheDefinition.
// See #22038 for problems raised by this behavior.
this->Makefile->RemoveDefinition(this->VariableName);
}
} else {
// If the user specifies the entry on the command line without a
// type we should add the type and docstring but keep the original
// value.
if (this->AlreadyInCacheWithoutMetaInfo) {
this->Makefile->AddCacheDefinition(this->VariableName, "",
this->VariableDocumentation.c_str(),
this->VariableType);
}
}
}
void cmFindBase::StoreFindResult(const std::string& value)
{
bool force =
this->Makefile->GetPolicyStatus(cmPolicies::CMP0125) == cmPolicies::NEW;
if (!value.empty()) {
this->Makefile->AddCacheDefinition(this->VariableName, value,
this->VariableDocumentation.c_str(),
this->VariableType);
this->VariableType, force);
return;
}
this->Makefile->AddCacheDefinition(
this->VariableName, cmStrCat(this->VariableName, "-NOTFOUND"),
this->VariableDocumentation.c_str(), this->VariableType);
this->VariableDocumentation.c_str(), this->VariableType, force);
if (this->Required) {
this->Makefile->IssueMessage(

View File

@@ -1963,6 +1963,8 @@ void cmMakefile::AddCacheDefinition(const std::string& name, const char* value,
}
this->GetCMakeInstance()->AddCacheEntry(name, value, doc, type);
// if there was a definition then remove it
// The method cmFindBase::NormalizeFindResult also apply same workflow.
// See #22038 for problems raised by this behavior.
this->StateSnapshot.RemoveDefinition(name);
}

View File

@@ -372,7 +372,11 @@ class cmMakefile;
3, 21, 0, cmPolicies::WARN) \
SELECT(POLICY, CMP0124, \
"foreach() loop variables are only available in the loop scope.", 3, \
21, 0, cmPolicies::WARN)
21, 0, cmPolicies::WARN) \
SELECT(POLICY, CMP0125, \
"find_(path|file|library|program) have consistent behavior for " \
"cache variables.", \
3, 21, 0, cmPolicies::WARN)
#define CM_SELECT_ID(F, A1, A2, A3, A4, A5, A6) F(A1)
#define CM_FOR_EACH_POLICY_ID(POLICY) \

View File

@@ -0,0 +1,51 @@
find_file(RELATIVE_PATH NAMES ${SEARCH_NAME} PATHS ${SEARCH_PATH})
find_file(RELATIVE_PATH_WITH_TYPE NAMES ${SEARCH_NAME} PATHS ${SEARCH_PATH})
find_file(ABSOLUTE_PATH NAMES ${SEARCH_NAME} PATHS ${SEARCH_PATH})
find_file(ABSOLUTE_PATH_WITH_TYPE NAMES ${SEARCH_NAME} PATHS ${SEARCH_PATH})
find_file(NOTFOUND_PATH NAMES ${SEARCH_NAME} PATHS ${SEARCH_PATH})
find_file(NOTFOUND_PATH_WITH_TYPE NAMES ${SEARCH_NAME} PATHS ${SEARCH_PATH})
file(WRITE "${CMAKE_BINARY_DIR}/${FILE_NAME}" "")
find_file(FILE_NAME NAMES ${SEARCH_NAME} PATHS ${SEARCH_PATH})
find_file(FILE_NAME_WITH_TYPE NAMES ${SEARCH_NAME} PATHS ${SEARCH_PATH})
message("RELATIVE_PATH=${RELATIVE_PATH}")
message("RELATIVE_PATH_WITH_TYPE=${RELATIVE_PATH_WITH_TYPE}")
message("ABSOLUTE_PATH=${ABSOLUTE_PATH}")
message("ABSOLUTE_PATH_WITH_TYPE=${ABSOLUTE_PATH_WITH_TYPE}")
message("NOTFOUND_PATH=${NOTFOUND_PATH}")
message("NOTFOUND_PATH_WITH_TYPE=${NOTFOUND_PATH_WITH_TYPE}")
message("FILE_NAME=${FILE_NAME}")
message("FILE_NAME_WITH_TYPE=${FILE_NAME_WITH_TYPE}")
set(RELATIVE_PATH_AND_LOCAL relative_local)
set(RELATIVE_PATH_WITH_TYPE_AND_LOCAL relative_local)
set(ABSOLUTE_PATH_AND_LOCAL /absolute_local)
set(ABSOLUTE_PATH_WITH_TYPE_AND_LOCAL /absolute_local)
set(NOTFOUND_AND_LOCAL "${FILE_NAME}")
set(NOTFOUND_WITH_TYPE_AND_LOCAL "${FILE_NAME}")
find_file(RELATIVE_PATH_AND_LOCAL NAMES ${SEARCH_NAME} PATHS ${SEARCH_PATH})
find_file(RELATIVE_PATH_WITH_TYPE_AND_LOCAL NAMES ${SEARCH_NAME} PATHS ${SEARCH_PATH})
find_file(ABSOLUTE_PATH_AND_LOCAL NAMES ${SEARCH_NAME} PATHS ${SEARCH_PATH})
find_file(ABSOLUTE_PATH_WITH_TYPE_AND_LOCAL NAMES ${SEARCH_NAME} PATHS ${SEARCH_PATH})
find_file(NOTFOUND_PATH_AND_LOCAL NAMES ${SEARCH_NAME} PATHS ${SEARCH_PATH})
find_file(NOTFOUND_PATH_WITH_TYPE_AND_LOCAL NAMES ${SEARCH_NAME} PATHS ${SEARCH_PATH})
message("RELATIVE_PATH_AND_LOCAL=${RELATIVE_PATH_AND_LOCAL}")
message("RELATIVE_PATH_WITH_TYPE_AND_LOCAL=${RELATIVE_PATH_WITH_TYPE_AND_LOCAL}")
message("ABSOLUTE_PATH_AND_LOCAL=${ABSOLUTE_PATH_AND_LOCAL}")
message("ABSOLUTE_PATH_WITH_TYPE_AND_LOCAL=${ABSOLUTE_PATH_WITH_TYPE_AND_LOCAL}")
message("NOTFOUND_PATH_AND_LOCAL=${NOTFOUND_PATH_AND_LOCAL}")
message("NOTFOUND_PATH_WITH_TYPE_AND_LOCAL=${NOTFOUND_PATH_WITH_TYPE_AND_LOCAL}")

View File

@@ -0,0 +1,14 @@
RELATIVE_PATH=relative
RELATIVE_PATH_WITH_TYPE=relative
ABSOLUTE_PATH=/absolute
ABSOLUTE_PATH_WITH_TYPE=/absolute
NOTFOUND_PATH=/.+/CMP0125/file\.txt
NOTFOUND_PATH_WITH_TYPE=/.+/CMP0125/file\.txt
FILE_NAME=/.+/CMP0125/CMP0125-find_file-NEW-build/file2\.txt
FILE_NAME_WITH_TYPE=/.+/CMP0125/CMP0125-find_file-NEW-build/file2\.txt
RELATIVE_PATH_AND_LOCAL=relative_local
RELATIVE_PATH_WITH_TYPE_AND_LOCAL=relative_local
ABSOLUTE_PATH_AND_LOCAL=/absolute_local
ABSOLUTE_PATH_WITH_TYPE_AND_LOCAL=/absolute_local
NOTFOUND_PATH_AND_LOCAL=/.+/CMP0125/file.txt
NOTFOUND_PATH_WITH_TYPE_AND_LOCAL=/.+/CMP0125/file.txt

View File

@@ -0,0 +1,4 @@
cmake_policy(SET CMP0125 NEW)
include(CMP0125-find_file-Common.cmake)

View File

@@ -0,0 +1,14 @@
RELATIVE_PATH=/.+/CMP0125/CMP0125-find_file-OLD-build/relative
RELATIVE_PATH_WITH_TYPE=relative
ABSOLUTE_PATH=/absolute
ABSOLUTE_PATH_WITH_TYPE=/absolute
NOTFOUND_PATH=NOTFOUND
NOTFOUND_PATH_WITH_TYPE=/.+/CMP0125/file\.txt
FILE_NAME=/.+/CMP0125/CMP0125-find_file-OLD-build/file2\.txt
FILE_NAME_WITH_TYPE=file2\.txt
RELATIVE_PATH_AND_LOCAL=/.+/CMP0125/CMP0125-find_file-OLD-build/relative
RELATIVE_PATH_WITH_TYPE_AND_LOCAL=relative_local
ABSOLUTE_PATH_AND_LOCAL=/absolute
ABSOLUTE_PATH_WITH_TYPE_AND_LOCAL=/absolute_local
NOTFOUND_PATH_AND_LOCAL=NOTFOUND
NOTFOUND_PATH_WITH_TYPE_AND_LOCAL=/.+/CMP0125/file\.txt

View File

@@ -0,0 +1,4 @@
cmake_policy(SET CMP0125 OLD)
include(CMP0125-find_file-Common.cmake)

View File

@@ -0,0 +1,52 @@
find_library(RELATIVE_PATH NAMES ${SEARCH_NAME} PATHS ${SEARCH_PATH})
find_library(RELATIVE_PATH_WITH_TYPE NAMES ${SEARCH_NAME} PATHS ${SEARCH_PATH})
find_library(ABSOLUTE_PATH NAMES ${SEARCH_NAME} PATHS ${SEARCH_PATH})
find_library(ABSOLUTE_PATH_WITH_TYPE NAMES ${SEARCH_NAME} PATHS ${SEARCH_PATH})
find_library(NOTFOUND_PATH NAMES ${SEARCH_NAME} PATHS ${SEARCH_PATH})
find_library(NOTFOUND_PATH_WITH_TYPE NAMES ${SEARCH_NAME} PATHS ${SEARCH_PATH})
file(WRITE "${CMAKE_BINARY_DIR}/${FILE_NAME}" "")
file(CHMOD "${CMAKE_BINARY_DIR}/${FILE_NAME}" PERMISSIONS OWNER_EXECUTE OWNER_READ OWNER_WRITE)
find_library(FILE_NAME NAMES ${SEARCH_NAME} PATHS ${SEARCH_PATH})
find_library(FILE_NAME_WITH_TYPE NAMES ${SEARCH_NAME} PATHS ${SEARCH_PATH})
message("RELATIVE_PATH=${RELATIVE_PATH}")
message("RELATIVE_PATH_WITH_TYPE=${RELATIVE_PATH_WITH_TYPE}")
message("ABSOLUTE_PATH=${ABSOLUTE_PATH}")
message("ABSOLUTE_PATH_WITH_TYPE=${ABSOLUTE_PATH_WITH_TYPE}")
message("NOTFOUND_PATH=${NOTFOUND_PATH}")
message("NOTFOUND_PATH_WITH_TYPE=${NOTFOUND_PATH_WITH_TYPE}")
message("FILE_NAME=${FILE_NAME}")
message("FILE_NAME_WITH_TYPE=${FILE_NAME_WITH_TYPE}")
set(RELATIVE_PATH_AND_LOCAL relative_local)
set(RELATIVE_PATH_WITH_TYPE_AND_LOCAL relative_local)
set(ABSOLUTE_PATH_AND_LOCAL /absolute_local)
set(ABSOLUTE_PATH_WITH_TYPE_AND_LOCAL /absolute_local)
set(NOTFOUND_AND_LOCAL "${FILE_NAME}")
set(NOTFOUND_WITH_TYPE_AND_LOCAL "${FILE_NAME}")
find_library(RELATIVE_PATH_AND_LOCAL NAMES ${SEARCH_NAME} PATHS ${SEARCH_PATH})
find_library(RELATIVE_PATH_WITH_TYPE_AND_LOCAL NAMES ${SEARCH_NAME} PATHS ${SEARCH_PATH})
find_library(ABSOLUTE_PATH_AND_LOCAL NAMES ${SEARCH_NAME} PATHS ${SEARCH_PATH})
find_library(ABSOLUTE_PATH_WITH_TYPE_AND_LOCAL NAMES ${SEARCH_NAME} PATHS ${SEARCH_PATH})
find_library(NOTFOUND_PATH_AND_LOCAL NAMES ${SEARCH_NAME} PATHS ${SEARCH_PATH})
find_library(NOTFOUND_PATH_WITH_TYPE_AND_LOCAL NAMES ${SEARCH_NAME} PATHS ${SEARCH_PATH})
message("RELATIVE_PATH_AND_LOCAL=${RELATIVE_PATH_AND_LOCAL}")
message("RELATIVE_PATH_WITH_TYPE_AND_LOCAL=${RELATIVE_PATH_WITH_TYPE_AND_LOCAL}")
message("ABSOLUTE_PATH_AND_LOCAL=${ABSOLUTE_PATH_AND_LOCAL}")
message("ABSOLUTE_PATH_WITH_TYPE_AND_LOCAL=${ABSOLUTE_PATH_WITH_TYPE_AND_LOCAL}")
message("NOTFOUND_PATH_AND_LOCAL=${NOTFOUND_PATH_AND_LOCAL}")
message("NOTFOUND_PATH_WITH_TYPE_AND_LOCAL=${NOTFOUND_PATH_WITH_TYPE_AND_LOCAL}")

View File

@@ -0,0 +1,14 @@
RELATIVE_PATH=relative
RELATIVE_PATH_WITH_TYPE=relative
ABSOLUTE_PATH=/absolute
ABSOLUTE_PATH_WITH_TYPE=/absolute
NOTFOUND_PATH=/.+/CMP0125/libfile\.(so|dylib)
NOTFOUND_PATH_WITH_TYPE=/.+/CMP0125/libfile\.(so|dylib)
FILE_NAME=/.+/CMP0125/CMP0125-find_library-NEW-build/libfile2\.(so|dylib)
FILE_NAME_WITH_TYPE=/.+/CMP0125/CMP0125-find_library-NEW-build/libfile2\.(so|dylib)
RELATIVE_PATH_AND_LOCAL=relative_local
RELATIVE_PATH_WITH_TYPE_AND_LOCAL=relative_local
ABSOLUTE_PATH_AND_LOCAL=/absolute_local
ABSOLUTE_PATH_WITH_TYPE_AND_LOCAL=/absolute_local
NOTFOUND_PATH_AND_LOCAL=/.+/CMP0125/libfile.(so|dylib)
NOTFOUND_PATH_WITH_TYPE_AND_LOCAL=/.+/CMP0125/libfile.(so|dylib)

View File

@@ -0,0 +1,6 @@
cmake_policy(SET CMP0125 NEW)
enable_language(C)
include(CMP0125-find_library-Common.cmake)

View File

@@ -0,0 +1,14 @@
RELATIVE_PATH=/.+/CMP0125/CMP0125-find_library-OLD-build/relative
RELATIVE_PATH_WITH_TYPE=relative
ABSOLUTE_PATH=/absolute
ABSOLUTE_PATH_WITH_TYPE=/absolute
NOTFOUND_PATH=NOTFOUND
NOTFOUND_PATH_WITH_TYPE=/.+/CMP0125/libfile\.(so|dylib)
FILE_NAME=/.+/CMP0125/CMP0125-find_library-OLD-build/libfile2\.(so|dylib)
FILE_NAME_WITH_TYPE=libfile2\.(so|dylib)
RELATIVE_PATH_AND_LOCAL=relative_local
RELATIVE_PATH_WITH_TYPE_AND_LOCAL=relative_local
ABSOLUTE_PATH_AND_LOCAL=/absolute_local
ABSOLUTE_PATH_WITH_TYPE_AND_LOCAL=/absolute_local
NOTFOUND_PATH_AND_LOCAL=/.+/CMP0125/libfile\.(so|dylib)
NOTFOUND_PATH_WITH_TYPE_AND_LOCAL=/.+/CMP0125/libfile\.(so|dylib)

View File

@@ -0,0 +1,6 @@
cmake_policy(SET CMP0125 OLD)
enable_language(C)
include(CMP0125-find_library-Common.cmake)

View File

@@ -0,0 +1,51 @@
find_path(RELATIVE_PATH NAMES ${SEARCH_NAME} PATHS ${SEARCH_PATH})
find_path(RELATIVE_PATH_WITH_TYPE NAMES ${SEARCH_NAME} PATHS ${SEARCH_PATH})
find_path(ABSOLUTE_PATH NAMES ${SEARCH_NAME} PATHS ${SEARCH_PATH})
find_path(ABSOLUTE_PATH_WITH_TYPE NAMES ${SEARCH_NAME} PATHS ${SEARCH_PATH})
find_path(NOTFOUND_PATH NAMES ${SEARCH_NAME} PATHS ${SEARCH_PATH})
find_path(NOTFOUND_PATH_WITH_TYPE NAMES ${SEARCH_NAME} PATHS ${SEARCH_PATH})
file(WRITE "${CMAKE_BINARY_DIR}/${FILE_NAME}" "")
find_path(FILE_NAME NAMES ${SEARCH_NAME} PATHS ${SEARCH_PATH})
find_path(FILE_NAME_WITH_TYPE NAMES ${SEARCH_NAME} PATHS ${SEARCH_PATH})
message("RELATIVE_PATH=${RELATIVE_PATH}")
message("RELATIVE_PATH_WITH_TYPE=${RELATIVE_PATH_WITH_TYPE}")
message("ABSOLUTE_PATH=${ABSOLUTE_PATH}")
message("ABSOLUTE_PATH_WITH_TYPE=${ABSOLUTE_PATH_WITH_TYPE}")
message("NOTFOUND_PATH=${NOTFOUND_PATH}")
message("NOTFOUND_PATH_WITH_TYPE=${NOTFOUND_PATH_WITH_TYPE}")
message("FILE_NAME=${FILE_NAME}")
message("FILE_NAME_WITH_TYPE=${FILE_NAME_WITH_TYPE}")
set(RELATIVE_PATH_AND_LOCAL relative_local)
set(RELATIVE_PATH_WITH_TYPE_AND_LOCAL relative_local)
set(ABSOLUTE_PATH_AND_LOCAL /absolute_local)
set(ABSOLUTE_PATH_WITH_TYPE_AND_LOCAL /absolute_local)
set(NOTFOUND_AND_LOCAL "${FILE_NAME}")
set(NOTFOUND_WITH_TYPE_AND_LOCAL "${FILE_NAME}")
find_path(RELATIVE_PATH_AND_LOCAL NAMES ${SEARCH_NAME} PATHS ${SEARCH_PATH})
find_path(RELATIVE_PATH_WITH_TYPE_AND_LOCAL NAMES ${SEARCH_NAME} PATHS ${SEARCH_PATH})
find_path(ABSOLUTE_PATH_AND_LOCAL NAMES ${SEARCH_NAME} PATHS ${SEARCH_PATH})
find_path(ABSOLUTE_PATH_WITH_TYPE_AND_LOCAL NAMES ${SEARCH_NAME} PATHS ${SEARCH_PATH})
find_path(NOTFOUND_PATH_AND_LOCAL NAMES ${SEARCH_NAME} PATHS ${SEARCH_PATH})
find_path(NOTFOUND_PATH_WITH_TYPE_AND_LOCAL NAMES ${SEARCH_NAME} PATHS ${SEARCH_PATH})
message("RELATIVE_PATH_AND_LOCAL=${RELATIVE_PATH_AND_LOCAL}")
message("RELATIVE_PATH_WITH_TYPE_AND_LOCAL=${RELATIVE_PATH_WITH_TYPE_AND_LOCAL}")
message("ABSOLUTE_PATH_AND_LOCAL=${ABSOLUTE_PATH_AND_LOCAL}")
message("ABSOLUTE_PATH_WITH_TYPE_AND_LOCAL=${ABSOLUTE_PATH_WITH_TYPE_AND_LOCAL}")
message("NOTFOUND_PATH_AND_LOCAL=${NOTFOUND_PATH_AND_LOCAL}")
message("NOTFOUND_PATH_WITH_TYPE_AND_LOCAL=${NOTFOUND_PATH_WITH_TYPE_AND_LOCAL}")

View File

@@ -0,0 +1,14 @@
RELATIVE_PATH=relative
RELATIVE_PATH_WITH_TYPE=relative
ABSOLUTE_PATH=/absolute
ABSOLUTE_PATH_WITH_TYPE=/absolute
NOTFOUND_PATH=/.+/CMP0125
NOTFOUND_PATH_WITH_TYPE=/.+/CMP0125
FILE_NAME=/.+/CMP0125/CMP0125-find_path-NEW-build/file2\.txt
FILE_NAME_WITH_TYPE=/.+/CMP0125/CMP0125-find_path-NEW-build/file2\.txt
RELATIVE_PATH_AND_LOCAL=relative_local
RELATIVE_PATH_WITH_TYPE_AND_LOCAL=relative_local
ABSOLUTE_PATH_AND_LOCAL=/absolute_local
ABSOLUTE_PATH_WITH_TYPE_AND_LOCAL=/absolute_local
NOTFOUND_PATH_AND_LOCAL=/.+/CMP0125
NOTFOUND_PATH_WITH_TYPE_AND_LOCAL=/.+/CMP0125

View File

@@ -0,0 +1,4 @@
cmake_policy(SET CMP0125 NEW)
include(CMP0125-find_path-Common.cmake)

View File

@@ -0,0 +1,14 @@
RELATIVE_PATH=/.+/CMP0125/CMP0125-find_path-OLD-build/relative
RELATIVE_PATH_WITH_TYPE=relative
ABSOLUTE_PATH=/absolute
ABSOLUTE_PATH_WITH_TYPE=/absolute
NOTFOUND_PATH=NOTFOUND
NOTFOUND_PATH_WITH_TYPE=/.+/CMP0125
FILE_NAME=/.+/CMP0125/CMP0125-find_path-OLD-build/file2\.txt
FILE_NAME_WITH_TYPE=file2\.txt
RELATIVE_PATH_AND_LOCAL=/.+/CMP0125/CMP0125-find_path-OLD-build/relative
RELATIVE_PATH_WITH_TYPE_AND_LOCAL=relative_local
ABSOLUTE_PATH_AND_LOCAL=/absolute
ABSOLUTE_PATH_WITH_TYPE_AND_LOCAL=/absolute_local
NOTFOUND_PATH_AND_LOCAL=NOTFOUND
NOTFOUND_PATH_WITH_TYPE_AND_LOCAL=/.+/CMP0125

View File

@@ -0,0 +1,4 @@
cmake_policy(SET CMP0125 OLD)
include(CMP0125-find_path-Common.cmake)

View File

@@ -0,0 +1,52 @@
find_program(RELATIVE_PATH NAMES ${SEARCH_NAME} PATHS ${SEARCH_PATH})
find_program(RELATIVE_PATH_WITH_TYPE NAMES ${SEARCH_NAME} PATHS ${SEARCH_PATH})
find_program(ABSOLUTE_PATH NAMES ${SEARCH_NAME} PATHS ${SEARCH_PATH})
find_program(ABSOLUTE_PATH_WITH_TYPE NAMES ${SEARCH_NAME} PATHS ${SEARCH_PATH})
find_program(NOTFOUND_PATH NAMES ${SEARCH_NAME} PATHS ${SEARCH_PATH})
find_program(NOTFOUND_PATH_WITH_TYPE NAMES ${SEARCH_NAME} PATHS ${SEARCH_PATH})
file(WRITE "${CMAKE_BINARY_DIR}/${FILE_NAME}" "")
file(CHMOD "${CMAKE_BINARY_DIR}/${FILE_NAME}" PERMISSIONS OWNER_EXECUTE OWNER_READ OWNER_WRITE)
find_program(FILE_NAME NAMES ${SEARCH_NAME} PATHS ${SEARCH_PATH})
find_program(FILE_NAME_WITH_TYPE NAMES ${SEARCH_NAME} PATHS ${SEARCH_PATH})
message("RELATIVE_PATH=${RELATIVE_PATH}")
message("RELATIVE_PATH_WITH_TYPE=${RELATIVE_PATH_WITH_TYPE}")
message("ABSOLUTE_PATH=${ABSOLUTE_PATH}")
message("ABSOLUTE_PATH_WITH_TYPE=${ABSOLUTE_PATH_WITH_TYPE}")
message("NOTFOUND_PATH=${NOTFOUND_PATH}")
message("NOTFOUND_PATH_WITH_TYPE=${NOTFOUND_PATH_WITH_TYPE}")
message("FILE_NAME=${FILE_NAME}")
message("FILE_NAME_WITH_TYPE=${FILE_NAME_WITH_TYPE}")
set(RELATIVE_PATH_AND_LOCAL relative_local)
set(RELATIVE_PATH_WITH_TYPE_AND_LOCAL relative_local)
set(ABSOLUTE_PATH_AND_LOCAL /absolute_local)
set(ABSOLUTE_PATH_WITH_TYPE_AND_LOCAL /absolute_local)
set(NOTFOUND_AND_LOCAL "${FILE_NAME}")
set(NOTFOUND_WITH_TYPE_AND_LOCAL "${FILE_NAME}")
find_program(RELATIVE_PATH_AND_LOCAL NAMES ${SEARCH_NAME} PATHS ${SEARCH_PATH})
find_program(RELATIVE_PATH_WITH_TYPE_AND_LOCAL NAMES ${SEARCH_NAME} PATHS ${SEARCH_PATH})
find_program(ABSOLUTE_PATH_AND_LOCAL NAMES ${SEARCH_NAME} PATHS ${SEARCH_PATH})
find_program(ABSOLUTE_PATH_WITH_TYPE_AND_LOCAL NAMES ${SEARCH_NAME} PATHS ${SEARCH_PATH})
find_program(NOTFOUND_PATH_AND_LOCAL NAMES ${SEARCH_NAME} PATHS ${SEARCH_PATH})
find_program(NOTFOUND_PATH_WITH_TYPE_AND_LOCAL NAMES ${SEARCH_NAME} PATHS ${SEARCH_PATH})
message("RELATIVE_PATH_AND_LOCAL=${RELATIVE_PATH_AND_LOCAL}")
message("RELATIVE_PATH_WITH_TYPE_AND_LOCAL=${RELATIVE_PATH_WITH_TYPE_AND_LOCAL}")
message("ABSOLUTE_PATH_AND_LOCAL=${ABSOLUTE_PATH_AND_LOCAL}")
message("ABSOLUTE_PATH_WITH_TYPE_AND_LOCAL=${ABSOLUTE_PATH_WITH_TYPE_AND_LOCAL}")
message("NOTFOUND_PATH_AND_LOCAL=${NOTFOUND_PATH_AND_LOCAL}")
message("NOTFOUND_PATH_WITH_TYPE_AND_LOCAL=${NOTFOUND_PATH_WITH_TYPE_AND_LOCAL}")

View File

@@ -0,0 +1,14 @@
RELATIVE_PATH=relative
RELATIVE_PATH_WITH_TYPE=relative
ABSOLUTE_PATH=/absolute
ABSOLUTE_PATH_WITH_TYPE=/absolute
NOTFOUND_PATH=/.+/CMP0125/file\.txt
NOTFOUND_PATH_WITH_TYPE=/.+/CMP0125/file\.txt
FILE_NAME=/.+/CMP0125/CMP0125-find_program-NEW-build/file2\.txt
FILE_NAME_WITH_TYPE=/.+/CMP0125/CMP0125-find_program-NEW-build/file2\.txt
RELATIVE_PATH_AND_LOCAL=relative_local
RELATIVE_PATH_WITH_TYPE_AND_LOCAL=relative_local
ABSOLUTE_PATH_AND_LOCAL=/absolute_local
ABSOLUTE_PATH_WITH_TYPE_AND_LOCAL=/absolute_local
NOTFOUND_PATH_AND_LOCAL=/.+/CMP0125/file.txt
NOTFOUND_PATH_WITH_TYPE_AND_LOCAL=/.+/CMP0125/file.txt

View File

@@ -0,0 +1,4 @@
cmake_policy(SET CMP0125 NEW)
include(CMP0125-find_program-Common.cmake)

View File

@@ -0,0 +1,14 @@
RELATIVE_PATH=/.+/CMP0125/CMP0125-find_program-OLD-build/relative
RELATIVE_PATH_WITH_TYPE=relative
ABSOLUTE_PATH=/absolute
ABSOLUTE_PATH_WITH_TYPE=/absolute
NOTFOUND_PATH=NOTFOUND
NOTFOUND_PATH_WITH_TYPE=/.+/CMP0125/file\.txt
FILE_NAME=/.+/CMP0125/CMP0125-find_program-OLD-build/file2\.txt
FILE_NAME_WITH_TYPE=file2\.txt
RELATIVE_PATH_AND_LOCAL=/.+/CMP0125/CMP0125-find_program-OLD-build/relative
RELATIVE_PATH_WITH_TYPE_AND_LOCAL=relative_local
ABSOLUTE_PATH_AND_LOCAL=/absolute
ABSOLUTE_PATH_WITH_TYPE_AND_LOCAL=/absolute_local
NOTFOUND_PATH_AND_LOCAL=NOTFOUND
NOTFOUND_PATH_WITH_TYPE_AND_LOCAL=/.+/CMP0125/file.txt

View File

@@ -0,0 +1,4 @@
cmake_policy(SET CMP0125 OLD)
include(CMP0125-find_program-Common.cmake)

View File

@@ -0,0 +1,3 @@
cmake_minimum_required(VERSION 3.20)
project(${RunCMake_TEST} NONE)
include(${RunCMake_TEST}.cmake)

View File

@@ -0,0 +1,36 @@
include(RunCMake)
file(WRITE "${RunCMake_BINARY_DIR}/file.txt" "")
file(CHMOD "${RunCMake_BINARY_DIR}/file.txt" PERMISSIONS OWNER_EXECUTE OWNER_READ OWNER_WRITE)
set(options -DRELATIVE_PATH=relative -DABSOLUTE_PATH=/absolute
-DRELATIVE_PATH_WITH_TYPE:PATH=relative -DABSOLUTE_PATH_WITH_TYPE:PATH=/absolute
-DNOTFOUND_PATH=NOTFOUND -DNOTFOUND_PATH_WITH_TYPE:PATH=NOTFOUND
-DFILE_NAME=file2.txt -DFILE_NAME_WITH_TYPE:PATH=file2.txt
-DSEARCH_NAME=file.txt "-DSEARCH_PATH=${RunCMake_BINARY_DIR}"
-DRELATIVE_PATH_AND_LOCAL=relative -DABSOLUTE_PATH_AND_LOCAL=/absolute
-DRELATIVE_PATH_WITH_TYPE_AND_LOCAL:PATH=relative -DABSOLUTE_PATH_WITH_TYPE_AND_LOCAL:PATH=/absolute
-DNOTFOUND_PATH_AND_LOCAL=NOTFOUND -DNOTFOUND_PATH_WITH_TYPE_AND_LOCAL:PATH=NOTFOUND
-DFILE_NAME=file2.txt -DFILE_NAME_WITH_TYPE:PATH=file2.txt
-DSEARCH_NAME=file.txt "-DSEARCH_PATH=${RunCMake_BINARY_DIR}")
run_cmake_with_options(CMP0125-find_file-OLD ${options})
run_cmake_with_options(CMP0125-find_file-NEW ${options})
run_cmake_with_options(CMP0125-find_path-OLD ${options})
run_cmake_with_options(CMP0125-find_path-NEW ${options})
run_cmake_with_options(CMP0125-find_program-OLD ${options})
run_cmake_with_options(CMP0125-find_program-NEW ${options})
file(WRITE "${RunCMake_BINARY_DIR}/${CMAKE_SHARED_LIBRARY_PREFIX}file${CMAKE_SHARED_LIBRARY_SUFFIX}" "")
file(CHMOD "${RunCMake_BINARY_DIR}/${CMAKE_SHARED_LIBRARY_PREFIX}file${CMAKE_SHARED_LIBRARY_SUFFIX}" PERMISSIONS OWNER_EXECUTE OWNER_READ OWNER_WRITE)
set(options -DRELATIVE_PATH=relative -DABSOLUTE_PATH=/absolute
-DRELATIVE_PATH_WITH_TYPE:PATH=relative -DABSOLUTE_PATH_WITH_TYPE:PATH=/absolute
-DNOTFOUND_PATH=NOTFOUND -DNOTFOUND_PATH_WITH_TYPE:PATH=NOTFOUND
-DFILE_NAME=${CMAKE_SHARED_LIBRARY_PREFIX}file2${CMAKE_SHARED_LIBRARY_SUFFIX}
-DFILE_NAME_WITH_TYPE:PATH=${CMAKE_SHARED_LIBRARY_PREFIX}file2${CMAKE_SHARED_LIBRARY_SUFFIX}
-DSEARCH_NAME=file "-DSEARCH_PATH=${RunCMake_BINARY_DIR}")
run_cmake_with_options(CMP0125-find_library-OLD ${options})
run_cmake_with_options(CMP0125-find_library-NEW ${options})

View File

@@ -136,6 +136,10 @@ endif()
add_RunCMake_test(CMP0118)
add_RunCMake_test(CMP0119 -DCMAKE_C_COMPILER_ID=${CMAKE_C_COMPILER_ID})
add_RunCMake_test(CMP0121)
if (CMAKE_SYSTEM_NAME MATCHES "(Linux|Darwin)")
add_RunCMake_test(CMP0125 -DCMAKE_SHARED_LIBRARY_PREFIX=${CMAKE_SHARED_LIBRARY_PREFIX}
-DCMAKE_SHARED_LIBRARY_SUFFIX=${CMAKE_SHARED_LIBRARY_SUFFIX})
endif()
# The test for Policy 65 requires the use of the
# CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS variable, which both the VS and Xcode