1#*************************************************************************** 2# _ _ ____ _ 3# Project ___| | | | _ \| | 4# / __| | | | |_) | | 5# | (__| |_| | _ <| |___ 6# \___|\___/|_| \_\_____| 7# 8# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al. 9# 10# This software is licensed as described in the file COPYING, which 11# you should have received as part of this distribution. The terms 12# are also available at https://curl.se/docs/copyright.html. 13# 14# You may opt to use, copy, modify, merge, publish, distribute and/or sell 15# copies of the Software, and permit persons to whom the Software is 16# furnished to do so, under the terms of the COPYING file. 17# 18# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 19# KIND, either express or implied. 20# 21########################################################################### 22#File defines convenience macros for available feature testing 23 24# This macro checks if the symbol exists in the library and if it 25# does, it prepends library to the list. It is intended to be called 26# multiple times with a sequence of possibly dependent libraries in 27# order of least-to-most-dependent. Some libraries depend on others 28# to link correctly. 29macro(check_library_exists_concat LIBRARY SYMBOL VARIABLE) 30 check_library_exists("${LIBRARY};${CURL_LIBS}" ${SYMBOL} "${CMAKE_LIBRARY_PATH}" 31 ${VARIABLE}) 32 if(${VARIABLE}) 33 set(CURL_LIBS ${LIBRARY} ${CURL_LIBS}) 34 endif() 35endmacro() 36 37# Check if header file exists and add it to the list. 38# This macro is intended to be called multiple times with a sequence of 39# possibly dependent header files. Some headers depend on others to be 40# compiled correctly. 41macro(check_include_file_concat FILE VARIABLE) 42 check_include_files("${CURL_INCLUDES};${FILE}" ${VARIABLE}) 43 if(${VARIABLE}) 44 set(CURL_INCLUDES ${CURL_INCLUDES} ${FILE}) 45 set(CURL_TEST_DEFINES "${CURL_TEST_DEFINES} -D${VARIABLE}") 46 endif() 47endmacro() 48 49# For other curl specific tests, use this macro. 50macro(curl_internal_test CURL_TEST) 51 if(NOT DEFINED "${CURL_TEST}") 52 set(MACRO_CHECK_FUNCTION_DEFINITIONS 53 "-D${CURL_TEST} ${CURL_TEST_DEFINES} ${CMAKE_REQUIRED_FLAGS}") 54 if(CMAKE_REQUIRED_LIBRARIES) 55 set(CURL_TEST_ADD_LIBRARIES 56 "-DLINK_LIBRARIES:STRING=${CMAKE_REQUIRED_LIBRARIES}") 57 endif() 58 59 message(STATUS "Performing Curl Test ${CURL_TEST}") 60 try_compile(${CURL_TEST} 61 ${CMAKE_BINARY_DIR} 62 ${CMAKE_CURRENT_SOURCE_DIR}/CMake/CurlTests.c 63 CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=${MACRO_CHECK_FUNCTION_DEFINITIONS} 64 "${CURL_TEST_ADD_LIBRARIES}" 65 OUTPUT_VARIABLE OUTPUT) 66 if(${CURL_TEST}) 67 set(${CURL_TEST} 1 CACHE INTERNAL "Curl test ${FUNCTION}") 68 message(STATUS "Performing Curl Test ${CURL_TEST} - Success") 69 file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log 70 "Performing Curl Test ${CURL_TEST} passed with the following output:\n" 71 "${OUTPUT}\n") 72 else() 73 message(STATUS "Performing Curl Test ${CURL_TEST} - Failed") 74 set(${CURL_TEST} "" CACHE INTERNAL "Curl test ${FUNCTION}") 75 file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log 76 "Performing Curl Test ${CURL_TEST} failed with the following output:\n" 77 "${OUTPUT}\n") 78 endif() 79 endif() 80endmacro() 81 82macro(curl_nroff_check) 83 find_program(NROFF NAMES gnroff nroff) 84 if(NROFF) 85 # Need a way to write to stdin, this will do 86 file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/nroff-input.txt" "test") 87 # Tests for a valid nroff option to generate a manpage 88 foreach(_MANOPT "-man" "-mandoc") 89 execute_process(COMMAND "${NROFF}" ${_MANOPT} 90 OUTPUT_VARIABLE NROFF_MANOPT_OUTPUT 91 INPUT_FILE "${CMAKE_CURRENT_BINARY_DIR}/nroff-input.txt" 92 ERROR_QUIET) 93 # Save the option if it was valid 94 if(NROFF_MANOPT_OUTPUT) 95 message("Found *nroff option: -- ${_MANOPT}") 96 set(NROFF_MANOPT ${_MANOPT}) 97 set(NROFF_USEFUL ON) 98 break() 99 endif() 100 endforeach() 101 # No need for the temporary file 102 file(REMOVE "${CMAKE_CURRENT_BINARY_DIR}/nroff-input.txt") 103 if(NOT NROFF_USEFUL) 104 message(WARNING "Found no *nroff option to get plaintext from man pages") 105 endif() 106 else() 107 message(WARNING "Found no *nroff program") 108 endif() 109endmacro() 110 111macro(optional_dependency DEPENDENCY) 112 set(CURL_${DEPENDENCY} AUTO CACHE STRING "Build curl with ${DEPENDENCY} support (AUTO, ON or OFF)") 113 set_property(CACHE CURL_${DEPENDENCY} PROPERTY STRINGS AUTO ON OFF) 114 115 if(CURL_${DEPENDENCY} STREQUAL AUTO) 116 find_package(${DEPENDENCY}) 117 elseif(CURL_${DEPENDENCY}) 118 find_package(${DEPENDENCY} REQUIRED) 119 endif() 120endmacro() 121