• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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