The cleanup in commit 4f2fcce4 (Check*: Allow result variables to contain regex special characters, 2014-07-31) broke old VXL code that abuses the old "if(MATCHES)" implementation by using SET( ${VARIABLE} ${VARIABLE} ) to reset a check result variable. Add a compatibility hack to the CheckFunctionExists, CheckIncludeFileCXX, and CheckSymbolExists modules to re-run their checks when the result variable is set to its own name. Use STREQUAL instead of MATCHES so that special characters still work.
86 lines
3.3 KiB
CMake
86 lines
3.3 KiB
CMake
#.rst:
|
|
# CheckFunctionExists
|
|
# -------------------
|
|
#
|
|
# Check if a C function can be linked
|
|
#
|
|
# CHECK_FUNCTION_EXISTS(<function> <variable>)
|
|
#
|
|
# Check that the <function> is provided by libraries on the system and
|
|
# store the result in a <variable>. This does not verify that any
|
|
# system header file declares the function, only that it can be found at
|
|
# link time (consider using CheckSymbolExists).
|
|
#
|
|
# The following variables may be set before calling this macro to modify
|
|
# the way the check is run:
|
|
#
|
|
# ::
|
|
#
|
|
# CMAKE_REQUIRED_FLAGS = string of compile command line flags
|
|
# CMAKE_REQUIRED_DEFINITIONS = list of macros to define (-DFOO=bar)
|
|
# CMAKE_REQUIRED_INCLUDES = list of include directories
|
|
# CMAKE_REQUIRED_LIBRARIES = list of libraries to link
|
|
# CMAKE_REQUIRED_QUIET = execute quietly without messages
|
|
|
|
#=============================================================================
|
|
# Copyright 2002-2011 Kitware, Inc.
|
|
#
|
|
# Distributed under the OSI-approved BSD License (the "License");
|
|
# see accompanying file Copyright.txt for details.
|
|
#
|
|
# This software is distributed WITHOUT ANY WARRANTY; without even the
|
|
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
# See the License for more information.
|
|
#=============================================================================
|
|
# (To distribute this file outside of CMake, substitute the full
|
|
# License text for the above reference.)
|
|
|
|
|
|
|
|
macro(CHECK_FUNCTION_EXISTS FUNCTION VARIABLE)
|
|
if(NOT DEFINED "${VARIABLE}" OR "x${${VARIABLE}}" STREQUAL "x${VARIABLE}")
|
|
set(MACRO_CHECK_FUNCTION_DEFINITIONS
|
|
"-DCHECK_FUNCTION_EXISTS=${FUNCTION} ${CMAKE_REQUIRED_FLAGS}")
|
|
if(NOT CMAKE_REQUIRED_QUIET)
|
|
message(STATUS "Looking for ${FUNCTION}")
|
|
endif()
|
|
if(CMAKE_REQUIRED_LIBRARIES)
|
|
set(CHECK_FUNCTION_EXISTS_ADD_LIBRARIES
|
|
LINK_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES})
|
|
else()
|
|
set(CHECK_FUNCTION_EXISTS_ADD_LIBRARIES)
|
|
endif()
|
|
if(CMAKE_REQUIRED_INCLUDES)
|
|
set(CHECK_FUNCTION_EXISTS_ADD_INCLUDES
|
|
"-DINCLUDE_DIRECTORIES:STRING=${CMAKE_REQUIRED_INCLUDES}")
|
|
else()
|
|
set(CHECK_FUNCTION_EXISTS_ADD_INCLUDES)
|
|
endif()
|
|
try_compile(${VARIABLE}
|
|
${CMAKE_BINARY_DIR}
|
|
${CMAKE_ROOT}/Modules/CheckFunctionExists.c
|
|
COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS}
|
|
${CHECK_FUNCTION_EXISTS_ADD_LIBRARIES}
|
|
CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=${MACRO_CHECK_FUNCTION_DEFINITIONS}
|
|
"${CHECK_FUNCTION_EXISTS_ADD_INCLUDES}"
|
|
OUTPUT_VARIABLE OUTPUT)
|
|
if(${VARIABLE})
|
|
set(${VARIABLE} 1 CACHE INTERNAL "Have function ${FUNCTION}")
|
|
if(NOT CMAKE_REQUIRED_QUIET)
|
|
message(STATUS "Looking for ${FUNCTION} - found")
|
|
endif()
|
|
file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
|
|
"Determining if the function ${FUNCTION} exists passed with the following output:\n"
|
|
"${OUTPUT}\n\n")
|
|
else()
|
|
if(NOT CMAKE_REQUIRED_QUIET)
|
|
message(STATUS "Looking for ${FUNCTION} - not found")
|
|
endif()
|
|
set(${VARIABLE} "" CACHE INTERNAL "Have function ${FUNCTION}")
|
|
file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
|
|
"Determining if the function ${FUNCTION} exists failed with the following output:\n"
|
|
"${OUTPUT}\n\n")
|
|
endif()
|
|
endif()
|
|
endmacro()
|