mirror of
https://github.com/Kitware/CMake.git
synced 2026-08-09 09:12:00 +00:00
Commit 5abaf65154 (Check*: Restore toleration of `;-W...` in
CMAKE_REQUIRED_FLAGS, 2026-06-24, v4.4.0-rc3~2^2) introduced logic to
prevent `-W*` arguments in `CMAKE_REQUIRED_FLAGS` from being passed as
CMake arguments in the `check[_<lang>]_source_{compiles,runs}` family of
utilities. However, several other related modules are also affected.
Update those to also use the new logic, and to have more uniform
implementations, making use of the refactoring from the previous commit.
Fixes: #27961
146 lines
4.4 KiB
CMake
146 lines
4.4 KiB
CMake
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
|
# file LICENSE.rst or https://cmake.org/licensing for details.
|
|
|
|
#[=======================================================================[.rst:
|
|
CheckPrototypeDefinition
|
|
------------------------
|
|
|
|
This module provides a command to check if a C function has the expected
|
|
prototype.
|
|
|
|
Load this module in a CMake project with:
|
|
|
|
.. code-block:: cmake
|
|
|
|
include(CheckPrototypeDefinition)
|
|
|
|
Commands
|
|
^^^^^^^^
|
|
|
|
This module provides the following command:
|
|
|
|
.. command:: check_prototype_definition
|
|
|
|
Checks if a C function has the expected prototype:
|
|
|
|
.. code-block:: cmake
|
|
|
|
check_prototype_definition(<function> <prototype> <return> <headers> <variable>)
|
|
|
|
``<function>``
|
|
The name of the function whose prototype is being checked.
|
|
``<prototype>``
|
|
The expected prototype of the function, provided as a string.
|
|
``<return>``
|
|
The return value of the function. This will be used as a return value in
|
|
the function definition body of the generated test program to verify that
|
|
the function's return type matches the expected type.
|
|
``<headers>``
|
|
A :ref:`semicolon-separated list <CMake Language Lists>` of header file
|
|
names required for checking the function prototype.
|
|
``<variable>``
|
|
The name of the variable to store the check result. This variable will be
|
|
created as an internal cache variable.
|
|
|
|
This command generates a test program and verifies that it builds without
|
|
errors. The generated test program includes specified ``<headers>``, defines
|
|
a function with given literal ``<prototype>`` and ``<return>`` value and
|
|
then uses the specified ``<function>``. The simplified test program can be
|
|
illustrated as:
|
|
|
|
.. code-block:: c
|
|
|
|
#include <headers>
|
|
// ...
|
|
<prototype> { return <return>; }
|
|
int main(...) { ...<function>()... }
|
|
|
|
.. rubric:: Variables Affecting the Check
|
|
|
|
The following variables may be set before calling this command to modify
|
|
the way the check is run:
|
|
|
|
.. include:: /module/include/CMAKE_REQUIRED_FLAGS.rst
|
|
|
|
.. include:: /module/include/CMAKE_REQUIRED_DEFINITIONS.rst
|
|
|
|
.. include:: /module/include/CMAKE_REQUIRED_INCLUDES.rst
|
|
|
|
.. include:: /module/include/CMAKE_REQUIRED_LINK_OPTIONS.rst
|
|
|
|
.. include:: /module/include/CMAKE_REQUIRED_LIBRARIES.rst
|
|
|
|
.. include:: /module/include/CMAKE_REQUIRED_LINK_DIRECTORIES.rst
|
|
|
|
.. include:: /module/include/CMAKE_REQUIRED_QUIET.rst
|
|
|
|
Examples
|
|
^^^^^^^^
|
|
|
|
Checking if the ``getpwent_r()`` function on Solaris/illumos systems has the
|
|
expected prototype:
|
|
|
|
.. code-block:: cmake
|
|
|
|
include(CheckPrototypeDefinition)
|
|
|
|
check_prototype_definition(
|
|
getpwent_r
|
|
"struct passwd *getpwent_r(struct passwd *src, char *buf, int buflen)"
|
|
"NULL"
|
|
"unistd.h;pwd.h"
|
|
HAVE_SOLARIS_GETPWENT_R
|
|
)
|
|
#]=======================================================================]
|
|
|
|
include_guard(GLOBAL)
|
|
include(Internal/CheckCommon)
|
|
|
|
function(check_prototype_definition _FUNCTION _PROTOTYPE _RETURN _HEADER _VARIABLE)
|
|
|
|
if (NOT DEFINED ${_VARIABLE})
|
|
if(NOT CMAKE_REQUIRED_QUIET)
|
|
message(CHECK_START "Checking prototype ${_FUNCTION} for ${_VARIABLE}")
|
|
endif()
|
|
set(CHECK_PROTOTYPE_DEFINITION_CONTENT "/* */\n")
|
|
|
|
foreach(_FILE ${_HEADER})
|
|
string(APPEND CHECK_PROTOTYPE_DEFINITION_HEADER
|
|
"#include <${_FILE}>\n")
|
|
endforeach()
|
|
|
|
set(CHECK_PROTOTYPE_DEFINITION_SYMBOL ${_FUNCTION})
|
|
set(CHECK_PROTOTYPE_DEFINITION_PROTO ${_PROTOTYPE})
|
|
set(CHECK_PROTOTYPE_DEFINITION_RETURN ${_RETURN})
|
|
|
|
file(READ ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/CheckPrototypeDefinition.c.in _SOURCE)
|
|
string(CONFIGURE "${_SOURCE}" _SOURCE @ONLY)
|
|
|
|
cmake_check_common_init_args(_CPD)
|
|
|
|
try_compile(${_VARIABLE}
|
|
SOURCE_FROM_VAR CheckPrototypeDefinition.c _SOURCE
|
|
COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS}
|
|
${_CPD_ADD_LINK_OPTIONS}
|
|
${_CPD_ADD_LINK_LIBRARIES}
|
|
CMAKE_FLAGS
|
|
-DCOMPILE_DEFINITIONS:STRING=${CMAKE_REQUIRED_FLAGS}
|
|
${_CPD_EXTRA_CMAKE_ARGUMENTS}
|
|
"${_CPD_INCLUDE_DIRECTORIES}"
|
|
"${_CPD_LINK_DIRECTORIES}"
|
|
)
|
|
|
|
if (${_VARIABLE})
|
|
set(${_VARIABLE} 1 CACHE INTERNAL "Have correct prototype for ${_FUNCTION}")
|
|
if(NOT CMAKE_REQUIRED_QUIET)
|
|
message(CHECK_PASS "True")
|
|
endif()
|
|
else ()
|
|
if(NOT CMAKE_REQUIRED_QUIET)
|
|
message(CHECK_FAIL "False")
|
|
endif()
|
|
set(${_VARIABLE} 0 CACHE INTERNAL "Have correct prototype for ${_FUNCTION}")
|
|
endif ()
|
|
endif()
|
|
endfunction()
|