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