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