mirror of
https://github.com/Kitware/CMake.git
synced 2026-01-07 06:09:52 -06:00
Merge topic 'fphsa-name-mismatch'
be4d1bdf9aFPHSA: acknowledge the name mismatches in CMake-owned modulesee4673c1aeFPHSA: detect package name mismatches Acked-by: Kitware Robot <kwrobot@kitware.com> Acked-by: Eric Noulard <eric.noulard@gmail.com> Merge-request: !4123
This commit is contained in:
5
Help/release/dev/fphsa-detect-name-mismatch.rst
Normal file
5
Help/release/dev/fphsa-detect-name-mismatch.rst
Normal file
@@ -0,0 +1,5 @@
|
||||
fphsa-name-mismatch
|
||||
-------------------
|
||||
|
||||
* The :module:`FindPackageHandleStandardArgs` module learned to check the
|
||||
package name passed in for typo mistakes.
|
||||
@@ -881,6 +881,7 @@ foreach(_GTK2_component ${GTK2_FIND_COMPONENTS})
|
||||
|
||||
set(GTK2_${_COMPONENT_UPPER}_FIND_QUIETLY ${GTK2_FIND_QUIETLY})
|
||||
|
||||
set(FPHSA_NAME_MISMATCHED 1)
|
||||
if(_GTK2_component STREQUAL "gtk")
|
||||
FIND_PACKAGE_HANDLE_STANDARD_ARGS(GTK2_${_COMPONENT_UPPER} "Some or all of the gtk libraries were not found."
|
||||
GTK2_GTK_LIBRARY
|
||||
@@ -923,6 +924,7 @@ foreach(_GTK2_component ${GTK2_FIND_COMPONENTS})
|
||||
GTK2_GLADEMMCONFIG_INCLUDE_DIR
|
||||
)
|
||||
endif()
|
||||
unset(FPHSA_NAME_MISMATCHED)
|
||||
|
||||
if(NOT GTK2_${_COMPONENT_UPPER}_FOUND)
|
||||
set(_GTK2_did_we_find_everything false)
|
||||
|
||||
@@ -1644,7 +1644,8 @@ foreach(LANG IN ITEMS C CXX Fortran)
|
||||
list(APPEND MPI_${LANG}_REQUIRED_VARS "MPI_${LANG}_WORKS")
|
||||
endif()
|
||||
endif()
|
||||
find_package_handle_standard_args(MPI_${LANG} REQUIRED_VARS ${MPI_${LANG}_REQUIRED_VARS}
|
||||
find_package_handle_standard_args(MPI_${LANG} NAME_MISMATCHED
|
||||
REQUIRED_VARS ${MPI_${LANG}_REQUIRED_VARS}
|
||||
VERSION_VAR MPI_${LANG}_VERSION)
|
||||
|
||||
if(DEFINED MPI_${LANG}_VERSION)
|
||||
|
||||
@@ -254,6 +254,7 @@ foreach (LANG IN ITEMS C CXX Fortran)
|
||||
_OPENACC_SET_VERSION_BY_SPEC_DATE("${LANG}")
|
||||
|
||||
find_package_handle_standard_args(OpenACC_${LANG}
|
||||
NAME_MISMATCHED
|
||||
REQUIRED_VARS OpenACC_${LANG}_FLAGS
|
||||
VERSION_VAR OpenACC_${LANG}_VERSION
|
||||
)
|
||||
|
||||
@@ -509,6 +509,7 @@ foreach(LANG IN LISTS OpenMP_FINDLIST)
|
||||
endif()
|
||||
|
||||
find_package_handle_standard_args(OpenMP_${LANG}
|
||||
NAME_MISMATCHED
|
||||
REQUIRED_VARS OpenMP_${LANG}_FLAGS ${_OPENMP_${LANG}_REQUIRED_LIB_VARS}
|
||||
VERSION_VAR OpenMP_${LANG}_VERSION
|
||||
)
|
||||
|
||||
@@ -27,6 +27,7 @@ valid filepaths.
|
||||
[VERSION_VAR <version-var>]
|
||||
[HANDLE_COMPONENTS]
|
||||
[CONFIG_MODE]
|
||||
[NAME_MISMATCHED]
|
||||
[REASON_FAILURE_MESSAGE <reason-failure-message>]
|
||||
[FAIL_MESSAGE <custom-failure-message>]
|
||||
)
|
||||
@@ -90,6 +91,12 @@ valid filepaths.
|
||||
Specify a custom failure message instead of using the default
|
||||
generated message. Not recommended.
|
||||
|
||||
``NAME_MISMATCHED``
|
||||
Indicate that the ``<PackageName>`` does not match
|
||||
``${CMAKE_FIND_PACKAGE_NAME}``. This is usually a mistake and raises a
|
||||
warning, but it may be intentional for usage of the command for components
|
||||
of a larger package.
|
||||
|
||||
Example for the simple signature:
|
||||
|
||||
.. code-block:: cmake
|
||||
@@ -106,6 +113,17 @@ used or not. If it is found, success will be reported, including
|
||||
the content of the first ``<required-var>``. On repeated CMake runs,
|
||||
the same message will not be printed again.
|
||||
|
||||
.. note::
|
||||
|
||||
If ``<PackageName>`` does not match ``CMAKE_FIND_PACKAGE_NAME`` for the
|
||||
calling module, a warning that there is a mismatch is given. The
|
||||
``FPHSA_NAME_MISMATCHED`` variable may be set to bypass the warning if using
|
||||
the old signature and the ``NAME_MISMATCHED`` argument using the new
|
||||
signature. To avoid forcing the caller to require newer versions of CMake for
|
||||
usage, the variable's value will be used if defined when the
|
||||
``NAME_MISMATCHED`` argument is not passed for the new signature (but using
|
||||
both is an error)..
|
||||
|
||||
Example for the full signature:
|
||||
|
||||
.. code-block:: cmake
|
||||
@@ -190,15 +208,32 @@ endmacro()
|
||||
|
||||
function(FIND_PACKAGE_HANDLE_STANDARD_ARGS _NAME _FIRST_ARG)
|
||||
|
||||
# Set up the arguments for `cmake_parse_arguments`.
|
||||
set(options CONFIG_MODE HANDLE_COMPONENTS)
|
||||
# Set up the arguments for `cmake_parse_arguments`.
|
||||
set(options CONFIG_MODE HANDLE_COMPONENTS NAME_MISMATCHED)
|
||||
set(oneValueArgs FAIL_MESSAGE REASON_FAILURE_MESSAGE VERSION_VAR FOUND_VAR)
|
||||
set(multiValueArgs REQUIRED_VARS)
|
||||
|
||||
# Check whether we are in 'simple' or 'extended' mode:
|
||||
# Check whether we are in 'simple' or 'extended' mode:
|
||||
set(_KEYWORDS_FOR_EXTENDED_MODE ${options} ${oneValueArgs} ${multiValueArgs} )
|
||||
list(FIND _KEYWORDS_FOR_EXTENDED_MODE "${_FIRST_ARG}" INDEX)
|
||||
|
||||
unset(FPHSA_NAME_MISMATCHED_override)
|
||||
if (DEFINED FPHSA_NAME_MISMATCHED)
|
||||
# If the variable NAME_MISMATCHED variable is set, error if it is passed as
|
||||
# an argument. The former is for old signatures, the latter is for new
|
||||
# signatures.
|
||||
list(FIND ARGN "NAME_MISMATCHED" name_mismatched_idx)
|
||||
if (NOT name_mismatched_idx EQUAL "-1")
|
||||
message(FATAL_ERROR
|
||||
"The `NAME_MISMATCHED` argument may only be specified by the argument or "
|
||||
"the variable, not both.")
|
||||
endif ()
|
||||
|
||||
# But use the variable if it is not an argument to avoid forcing minimum
|
||||
# CMake version bumps for calling modules.
|
||||
set(FPHSA_NAME_MISMATCHED_override "${FPHSA_NAME_MISMATCHED}")
|
||||
endif ()
|
||||
|
||||
if(${INDEX} EQUAL -1)
|
||||
set(FPHSA_FAIL_MESSAGE ${_FIRST_ARG})
|
||||
set(FPHSA_REQUIRED_VARS ${ARGN})
|
||||
@@ -227,6 +262,21 @@ function(FIND_PACKAGE_HANDLE_STANDARD_ARGS _NAME _FIRST_ARG)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if (DEFINED FPHSA_NAME_MISMATCHED_override)
|
||||
set(FPHSA_NAME_MISMATCHED "${FPHSA_NAME_MISMATCHED_override}")
|
||||
endif ()
|
||||
|
||||
if (DEFINED CMAKE_FIND_PACKAGE_NAME
|
||||
AND NOT FPHSA_NAME_MISMATCHED
|
||||
AND NOT _NAME STREQUAL CMAKE_FIND_PACKAGE_NAME)
|
||||
message(AUTHOR_WARNING
|
||||
"The package name passed to `find_package_handle_standard_args` "
|
||||
"(${_NAME}) does not match the name of the calling package "
|
||||
"(${CMAKE_FIND_PACKAGE_NAME}). This can lead to problems in calling "
|
||||
"code that expects `find_package` result variables (e.g., `_FOUND`) "
|
||||
"to follow a certain pattern.")
|
||||
endif ()
|
||||
|
||||
# now that we collected all arguments, process them
|
||||
|
||||
if("x${FPHSA_FAIL_MESSAGE}" STREQUAL "xDEFAULT_MSG")
|
||||
|
||||
@@ -224,12 +224,14 @@ find_path(TK_INCLUDE_PATH
|
||||
include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
|
||||
|
||||
FIND_PACKAGE_HANDLE_STANDARD_ARGS(TCL DEFAULT_MSG TCL_LIBRARY TCL_INCLUDE_PATH)
|
||||
set(FPHSA_NAME_MISMATCHED 1)
|
||||
set(TCLTK_FIND_REQUIRED ${TCL_FIND_REQUIRED})
|
||||
set(TCLTK_FIND_QUIETLY ${TCL_FIND_QUIETLY})
|
||||
FIND_PACKAGE_HANDLE_STANDARD_ARGS(TCLTK DEFAULT_MSG TCL_LIBRARY TCL_INCLUDE_PATH TK_LIBRARY TK_INCLUDE_PATH)
|
||||
set(TK_FIND_REQUIRED ${TCL_FIND_REQUIRED})
|
||||
set(TK_FIND_QUIETLY ${TCL_FIND_QUIETLY})
|
||||
FIND_PACKAGE_HANDLE_STANDARD_ARGS(TK DEFAULT_MSG TK_LIBRARY TK_INCLUDE_PATH)
|
||||
unset(FPHSA_NAME_MISMATCHED)
|
||||
|
||||
mark_as_advanced(
|
||||
TCL_INCLUDE_PATH
|
||||
|
||||
4
Tests/RunCMake/FPHSA/FindNameMismatch.cmake
Normal file
4
Tests/RunCMake/FPHSA/FindNameMismatch.cmake
Normal file
@@ -0,0 +1,4 @@
|
||||
set("${CMAKE_FIND_PACKAGE_NAME}_MODULE" "${CMAKE_CURRENT_LIST_FILE}")
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(NAMEMISMATCH REQUIRED_VARS "${CMAKE_FIND_PACKAGE_NAME}_MODULE")
|
||||
set("${CMAKE_FIND_PACKAGE_NAME}_FOUND" 1)
|
||||
4
Tests/RunCMake/FPHSA/FindNameMismatchOld.cmake
Normal file
4
Tests/RunCMake/FPHSA/FindNameMismatchOld.cmake
Normal file
@@ -0,0 +1,4 @@
|
||||
set("${CMAKE_FIND_PACKAGE_NAME}_MODULE" "${CMAKE_CURRENT_LIST_FILE}")
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(NAMEMISMATCH "old signature" "${CMAKE_FIND_PACKAGE_NAME}_MODULE")
|
||||
set("${CMAKE_FIND_PACKAGE_NAME}_FOUND" 1)
|
||||
6
Tests/RunCMake/FPHSA/FindNameMismatchSuppressed.cmake
Normal file
6
Tests/RunCMake/FPHSA/FindNameMismatchSuppressed.cmake
Normal file
@@ -0,0 +1,6 @@
|
||||
set("${CMAKE_FIND_PACKAGE_NAME}_MODULE" "${CMAKE_CURRENT_LIST_FILE}")
|
||||
include(FindPackageHandleStandardArgs)
|
||||
set(FPHSA_NAME_MISMATCHED 1)
|
||||
find_package_handle_standard_args(NAMEMISMATCH "old signature" "${CMAKE_FIND_PACKAGE_NAME}_MODULE")
|
||||
unset(FPHSA_NAME_MISMATCHED)
|
||||
set("${CMAKE_FIND_PACKAGE_NAME}_FOUND" 1)
|
||||
4
Tests/RunCMake/FPHSA/FindNameMismatchSuppressedArg.cmake
Normal file
4
Tests/RunCMake/FPHSA/FindNameMismatchSuppressedArg.cmake
Normal file
@@ -0,0 +1,4 @@
|
||||
set("${CMAKE_FIND_PACKAGE_NAME}_MODULE" "${CMAKE_CURRENT_LIST_FILE}")
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(NAMEMISMATCH NAME_MISMATCHED REQUIRED_VARS "${CMAKE_FIND_PACKAGE_NAME}_MODULE")
|
||||
set("${CMAKE_FIND_PACKAGE_NAME}_FOUND" 1)
|
||||
@@ -0,0 +1,6 @@
|
||||
set("${CMAKE_FIND_PACKAGE_NAME}_MODULE" "${CMAKE_CURRENT_LIST_FILE}")
|
||||
include(FindPackageHandleStandardArgs)
|
||||
set(FPHSA_NAME_MISMATCHED 1)
|
||||
find_package_handle_standard_args(NAMEMISMATCH REQUIRED_VARS "${CMAKE_FIND_PACKAGE_NAME}_MODULE")
|
||||
unset(FPHSA_NAME_MISMATCHED)
|
||||
set("${CMAKE_FIND_PACKAGE_NAME}_FOUND" 1)
|
||||
23
Tests/RunCMake/FPHSA/NameMismatch-stderr.txt
Normal file
23
Tests/RunCMake/FPHSA/NameMismatch-stderr.txt
Normal file
@@ -0,0 +1,23 @@
|
||||
CMake Warning \(dev\) at .*/Modules/FindPackageHandleStandardArgs.cmake:[0-9]+ \(message\):
|
||||
The package name passed to `find_package_handle_standard_args`
|
||||
\(NAMEMISMATCH\) does not match the name of the calling package
|
||||
\(NameMismatch\). This can lead to problems in calling code that expects
|
||||
`find_package` result variables \(e.g., `_FOUND`\) to follow a certain
|
||||
pattern.
|
||||
Call Stack \(most recent call first\):
|
||||
FindNameMismatch.cmake:3 \(find_package_handle_standard_args\)
|
||||
NameMismatch.cmake:3 \(find_package\)
|
||||
CMakeLists.txt:3 \(include\)
|
||||
This warning is for project developers. Use -Wno-dev to suppress it.
|
||||
|
||||
CMake Warning \(dev\) at .*/Modules/FindPackageHandleStandardArgs.cmake:[0-9]+ \(message\):
|
||||
The package name passed to `find_package_handle_standard_args`
|
||||
\(NAMEMISMATCH\) does not match the name of the calling package
|
||||
\(NameMismatchOld\). This can lead to problems in calling code that expects
|
||||
`find_package` result variables \(e.g., `_FOUND`\) to follow a certain
|
||||
pattern.
|
||||
Call Stack \(most recent call first\):
|
||||
FindNameMismatchOld.cmake:3 \(find_package_handle_standard_args\)
|
||||
NameMismatch.cmake:4 \(find_package\)
|
||||
CMakeLists.txt:3 \(include\)
|
||||
This warning is for project developers. Use -Wno-dev to suppress it.
|
||||
7
Tests/RunCMake/FPHSA/NameMismatch.cmake
Normal file
7
Tests/RunCMake/FPHSA/NameMismatch.cmake
Normal file
@@ -0,0 +1,7 @@
|
||||
set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}")
|
||||
|
||||
find_package(NameMismatch REQUIRED)
|
||||
find_package(NameMismatchOld REQUIRED)
|
||||
find_package(NameMismatchSuppressed REQUIRED)
|
||||
find_package(NameMismatchSuppressedCompat REQUIRED)
|
||||
find_package(NameMismatchSuppressedArg REQUIRED)
|
||||
@@ -1,6 +1,7 @@
|
||||
include(RunCMake)
|
||||
|
||||
run_cmake(BadFoundVar)
|
||||
run_cmake(NameMismatch)
|
||||
|
||||
# The pseudo module will "find" a package with the given version. Check if the
|
||||
# version selection code in FPHSA works correctly.
|
||||
|
||||
Reference in New Issue
Block a user