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