set(IMPORT_LIB_SUFFIX "_imp")
endif()
+# On supported platforms, do a single compilation pass for libcurl sources
+# and reuse these objects to generate both static and shared target.
+# This is possible where PIC is the default for both shared and static and
+# there is a way to tell the linker which libcurl symbols it should export
+# (vs. marking these symbols exportable at compile-time).
+if(WIN32 AND NOT DEFINED SHARE_LIB_OBJECT)
+ set(SHARE_LIB_OBJECT ON)
+endif()
+
+if(SHARE_LIB_OBJECT)
+ set(LIB_OBJECT "libcurl_object")
+ add_library(${LIB_OBJECT} OBJECT ${HHEADERS} ${CSOURCES})
+ target_link_libraries(${LIB_OBJECT} PRIVATE ${CURL_LIBS})
+ set_target_properties(${LIB_OBJECT} PROPERTIES
+ COMPILE_DEFINITIONS "BUILDING_LIBCURL"
+ INTERFACE_COMPILE_DEFINITIONS "CURL_STATICLIB")
+ if(HIDES_CURL_PRIVATE_SYMBOLS)
+ set_target_properties(${LIB_OBJECT} PROPERTIES
+ COMPILE_DEFINITIONS "CURL_HIDDEN_SYMBOLS"
+ COMPILE_FLAGS "${CURL_CFLAG_SYMBOLS_HIDE}")
+ endif()
+ if(CURL_HAS_LTO)
+ set_target_properties(${LIB_OBJECT} PROPERTIES
+ INTERPROCEDURAL_OPTIMIZATION_RELEASE TRUE
+ INTERPROCEDURAL_OPTIMIZATION_RELWITHDEBINFO TRUE)
+ endif()
+
+ target_include_directories(${LIB_OBJECT} INTERFACE
+ $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
+ $<BUILD_INTERFACE:${CURL_SOURCE_DIR}/include>)
+
+ set(LIB_SOURCE $<TARGET_OBJECTS:${LIB_OBJECT}>)
+else()
+ set(LIB_SOURCE ${HHEADERS} ${CSOURCES})
+endif()
+
# we want it to be called libcurl on all platforms
if(BUILD_STATIC_LIBS)
list(APPEND libcurl_export ${LIB_STATIC})
- add_library(${LIB_STATIC} STATIC ${HHEADERS} ${CSOURCES})
+ add_library(${LIB_STATIC} STATIC ${LIB_SOURCE})
add_library(${PROJECT_NAME}::${LIB_STATIC} ALIAS ${LIB_STATIC})
target_link_libraries(${LIB_STATIC} PRIVATE ${CURL_LIBS})
# Remove the "lib" prefix since the library is already named "libcurl".
if(BUILD_SHARED_LIBS)
list(APPEND libcurl_export ${LIB_SHARED})
- add_library(${LIB_SHARED} SHARED ${HHEADERS} ${CSOURCES})
+ add_library(${LIB_SHARED} SHARED ${LIB_SOURCE})
add_library(${PROJECT_NAME}::${LIB_SHARED} ALIAS ${LIB_SHARED})
if(WIN32)
- set_property(TARGET ${LIB_SHARED} APPEND PROPERTY SOURCES libcurl.rc)
+ set_property(TARGET ${LIB_SHARED} APPEND PROPERTY SOURCES libcurl.rc ${CURL_SOURCE_DIR}/libcurl.def)
endif()
target_link_libraries(${LIB_SHARED} PRIVATE ${CURL_LIBS})
# Remove the "lib" prefix since the library is already named "libcurl".