1#*************************************************************************** 2# _ _ ____ _ 3# Project ___| | | | _ \| | 4# / __| | | | |_) | | 5# | (__| |_| | _ <| |___ 6# \___|\___/|_| \_\_____| 7# 8# Copyright (C) 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# SPDX-License-Identifier: curl 22# 23########################################################################### 24set(LIB_NAME libcurl) 25set(LIBCURL_OUTPUT_NAME libcurl CACHE STRING "Basename of the curl library") 26add_definitions(-DBUILDING_LIBCURL) 27 28configure_file(curl_config.h.cmake 29 ${CMAKE_CURRENT_BINARY_DIR}/curl_config.h) 30 31transform_makefile_inc("Makefile.inc" "${CMAKE_CURRENT_BINARY_DIR}/Makefile.inc.cmake") 32include(${CMAKE_CURRENT_BINARY_DIR}/Makefile.inc.cmake) 33 34list(APPEND HHEADERS 35 ${CMAKE_CURRENT_BINARY_DIR}/curl_config.h 36 ) 37 38# The rest of the build 39 40include_directories(${CMAKE_CURRENT_BINARY_DIR}/../include) 41include_directories(${CMAKE_CURRENT_SOURCE_DIR}/..) 42include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../include) 43include_directories(${CMAKE_CURRENT_BINARY_DIR}/..) 44include_directories(${CMAKE_CURRENT_SOURCE_DIR}) 45include_directories(${CMAKE_CURRENT_BINARY_DIR}) 46if(USE_ARES) 47 include_directories(${CARES_INCLUDE_DIR}) 48endif() 49 50if(BUILD_TESTING) 51 add_library( 52 curlu # special libcurlu library just for unittests 53 STATIC 54 EXCLUDE_FROM_ALL 55 ${HHEADERS} ${CSOURCES} 56 ) 57 target_compile_definitions(curlu PUBLIC UNITTESTS CURL_STATICLIB) 58endif() 59 60if(ENABLE_CURLDEBUG) 61 # We must compile these sources separately to avoid memdebug.h redefinitions 62 # applying to them. 63 set_source_files_properties(memdebug.c curl_multibyte.c PROPERTIES SKIP_UNITY_BUILD_INCLUSION ON) 64endif() 65 66if(BUILD_TESTING) 67 target_link_libraries(curlu PRIVATE ${CURL_LIBS}) 68endif() 69 70transform_makefile_inc("Makefile.soname" "${CMAKE_CURRENT_BINARY_DIR}/Makefile.soname.cmake") 71include(${CMAKE_CURRENT_BINARY_DIR}/Makefile.soname.cmake) 72 73if(CMAKE_SYSTEM_NAME STREQUAL "AIX" OR 74 CMAKE_SYSTEM_NAME STREQUAL "Linux" OR 75 CMAKE_SYSTEM_NAME STREQUAL "Darwin" OR 76 CMAKE_SYSTEM_NAME STREQUAL "SunOS" OR 77 CMAKE_SYSTEM_NAME STREQUAL "GNU/kFreeBSD" OR 78 79 # FreeBSD comes with the a.out and elf flavours 80 # but a.out was supported up to version 3.x and 81 # elf from 3.x. I cannot imagine someone running 82 # CMake on those ancient systems 83 CMAKE_SYSTEM_NAME STREQUAL "FreeBSD" OR 84 85 CMAKE_SYSTEM_NAME STREQUAL "Haiku") 86 87 math(EXPR CMAKESONAME "${VERSIONCHANGE} - ${VERSIONDEL}") 88 set(CMAKEVERSION "${CMAKESONAME}.${VERSIONDEL}.${VERSIONADD}") 89else() 90 unset(CMAKESONAME) 91endif() 92 93## Library definition 94 95# Add "_imp" as a suffix before the extension to avoid conflicting with 96# the statically linked "libcurl.lib" (typically with MSVC) 97if(WIN32 AND 98 NOT IMPORT_LIB_SUFFIX AND 99 CMAKE_STATIC_LIBRARY_SUFFIX STREQUAL CMAKE_IMPORT_LIBRARY_SUFFIX) 100 set(IMPORT_LIB_SUFFIX "_imp") 101endif() 102 103# Whether to do a single compilation pass for libcurl sources and reuse these 104# objects to generate both static and shared target. 105if(NOT DEFINED SHARE_LIB_OBJECT) 106 # Enable it by default on platforms where PIC is the default for both shared 107 # and static and there is a way to tell the linker which libcurl symbols it 108 # should export (vs. marking these symbols exportable at compile-time). 109 if(WIN32) 110 set(SHARE_LIB_OBJECT ON) 111 else() 112 # On other platforms, make it an option disabled by default 113 set(SHARE_LIB_OBJECT OFF) 114 endif() 115endif() 116 117if(WIN32) 118 # Define CURL_STATICLIB always, to disable __declspec(dllexport) for exported 119 # libcurl symbols. We handle exports via libcurl.def instead. Except with 120 # symbol hiding disabled or debug mode enabled, when we export _all_ symbols 121 # from libcurl DLL, without using libcurl.def. 122 add_definitions("-DCURL_STATICLIB") 123endif() 124 125if(SHARE_LIB_OBJECT) 126 set(LIB_OBJECT "libcurl_object") 127 add_library(${LIB_OBJECT} OBJECT ${HHEADERS} ${CSOURCES}) 128 target_link_libraries(${LIB_OBJECT} PRIVATE ${CURL_LIBS}) 129 set_target_properties(${LIB_OBJECT} PROPERTIES 130 POSITION_INDEPENDENT_CODE ON) 131 if(HIDES_CURL_PRIVATE_SYMBOLS) 132 set_property(TARGET ${LIB_OBJECT} APPEND PROPERTY COMPILE_FLAGS "${CURL_CFLAG_SYMBOLS_HIDE}") 133 set_property(TARGET ${LIB_OBJECT} APPEND PROPERTY COMPILE_DEFINITIONS "CURL_HIDDEN_SYMBOLS") 134 endif() 135 if(CURL_HAS_LTO) 136 set_target_properties(${LIB_OBJECT} PROPERTIES 137 INTERPROCEDURAL_OPTIMIZATION_RELEASE TRUE 138 INTERPROCEDURAL_OPTIMIZATION_RELWITHDEBINFO TRUE) 139 endif() 140 141 target_include_directories(${LIB_OBJECT} INTERFACE 142 $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}> 143 $<BUILD_INTERFACE:${CURL_SOURCE_DIR}/include>) 144 145 set(LIB_SOURCE $<TARGET_OBJECTS:${LIB_OBJECT}>) 146else() 147 set(LIB_SOURCE ${HHEADERS} ${CSOURCES}) 148endif() 149 150# we want it to be called libcurl on all platforms 151if(BUILD_STATIC_LIBS) 152 list(APPEND libcurl_export ${LIB_STATIC}) 153 add_library(${LIB_STATIC} STATIC ${LIB_SOURCE}) 154 add_library(${PROJECT_NAME}::${LIB_STATIC} ALIAS ${LIB_STATIC}) 155 target_link_libraries(${LIB_STATIC} PRIVATE ${CURL_LIBS}) 156 # Remove the "lib" prefix since the library is already named "libcurl". 157 set_target_properties(${LIB_STATIC} PROPERTIES 158 PREFIX "" OUTPUT_NAME "${LIBCURL_OUTPUT_NAME}" 159 SUFFIX "${STATIC_LIB_SUFFIX}${CMAKE_STATIC_LIBRARY_SUFFIX}" 160 INTERFACE_COMPILE_DEFINITIONS "CURL_STATICLIB") 161 if(HIDES_CURL_PRIVATE_SYMBOLS) 162 set_property(TARGET ${LIB_STATIC} APPEND PROPERTY COMPILE_FLAGS "${CURL_CFLAG_SYMBOLS_HIDE}") 163 set_property(TARGET ${LIB_STATIC} APPEND PROPERTY COMPILE_DEFINITIONS "CURL_HIDDEN_SYMBOLS") 164 endif() 165 if(CURL_HAS_LTO) 166 set_target_properties(${LIB_STATIC} PROPERTIES 167 INTERPROCEDURAL_OPTIMIZATION_RELEASE TRUE 168 INTERPROCEDURAL_OPTIMIZATION_RELWITHDEBINFO TRUE) 169 endif() 170 if(CMAKEVERSION AND CMAKESONAME) 171 set_target_properties(${LIB_STATIC} PROPERTIES 172 VERSION ${CMAKEVERSION} SOVERSION ${CMAKESONAME}) 173 endif() 174 175 target_include_directories(${LIB_STATIC} INTERFACE 176 $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}> 177 $<BUILD_INTERFACE:${CURL_SOURCE_DIR}/include>) 178endif() 179 180if(BUILD_SHARED_LIBS) 181 list(APPEND libcurl_export ${LIB_SHARED}) 182 add_library(${LIB_SHARED} SHARED ${LIB_SOURCE}) 183 add_library(${PROJECT_NAME}::${LIB_SHARED} ALIAS ${LIB_SHARED}) 184 if(WIN32) 185 set_property(TARGET ${LIB_SHARED} APPEND PROPERTY SOURCES libcurl.rc) 186 if(HIDES_CURL_PRIVATE_SYMBOLS) 187 set_property(TARGET ${LIB_SHARED} APPEND PROPERTY SOURCES "${CURL_SOURCE_DIR}/libcurl.def") 188 endif() 189 endif() 190 target_link_libraries(${LIB_SHARED} PRIVATE ${CURL_LIBS}) 191 # Remove the "lib" prefix since the library is already named "libcurl". 192 set_target_properties(${LIB_SHARED} PROPERTIES 193 PREFIX "" OUTPUT_NAME "${LIBCURL_OUTPUT_NAME}" 194 IMPORT_PREFIX "" IMPORT_SUFFIX "${IMPORT_LIB_SUFFIX}${CMAKE_IMPORT_LIBRARY_SUFFIX}" 195 POSITION_INDEPENDENT_CODE ON) 196 if(HIDES_CURL_PRIVATE_SYMBOLS) 197 set_property(TARGET ${LIB_SHARED} APPEND PROPERTY COMPILE_FLAGS "${CURL_CFLAG_SYMBOLS_HIDE}") 198 set_property(TARGET ${LIB_SHARED} APPEND PROPERTY COMPILE_DEFINITIONS "CURL_HIDDEN_SYMBOLS") 199 endif() 200 if(CURL_HAS_LTO) 201 set_target_properties(${LIB_SHARED} PROPERTIES 202 INTERPROCEDURAL_OPTIMIZATION_RELEASE TRUE 203 INTERPROCEDURAL_OPTIMIZATION_RELWITHDEBINFO TRUE) 204 endif() 205 if(CMAKEVERSION AND CMAKESONAME) 206 set_target_properties(${LIB_SHARED} PROPERTIES 207 VERSION ${CMAKEVERSION} SOVERSION ${CMAKESONAME}) 208 endif() 209 210 target_include_directories(${LIB_SHARED} INTERFACE 211 $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}> 212 $<BUILD_INTERFACE:${CURL_SOURCE_DIR}/include>) 213endif() 214 215add_library(${LIB_NAME} ALIAS ${LIB_SELECTED}) 216add_library(${PROJECT_NAME}::${LIB_NAME} ALIAS ${LIB_SELECTED}) 217 218if(CURL_ENABLE_EXPORT_TARGET) 219 if(BUILD_STATIC_LIBS) 220 install(TARGETS ${LIB_STATIC} 221 EXPORT ${TARGETS_EXPORT_NAME} 222 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} 223 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} 224 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} 225 ) 226 endif() 227 if(BUILD_SHARED_LIBS) 228 install(TARGETS ${LIB_SHARED} 229 EXPORT ${TARGETS_EXPORT_NAME} 230 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} 231 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} 232 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} 233 ) 234 endif() 235 236 export(TARGETS ${libcurl_export} 237 FILE ${PROJECT_BINARY_DIR}/libcurl-target.cmake 238 NAMESPACE ${PROJECT_NAME}:: 239 ) 240endif() 241