diff options
| author | Tobias Hieta <tobias@plex.tv> | 2020-01-09 12:10:55 +0100 | 
|---|---|---|
| committer | Daniel Stenberg <daniel@haxx.se> | 2020-01-13 23:14:49 +0100 | 
| commit | 4ccf7622db04af58442c460b8091b952585de5c7 (patch) | |
| tree | 7451edcf604d1703661c28eea1238ef73402ef72 | |
| parent | f128c00a99ffb7482740f3579f42f5e026a1ee74 (diff) | |
CMake: Add support for CMAKE_LTO option.
This enables Link Time Optimization. LTO is a proven technique for
optimizing across compilation units.
Closes #4799
| -rw-r--r-- | CMakeLists.txt | 18 | ||||
| -rw-r--r-- | lib/CMakeLists.txt | 6 | ||||
| -rw-r--r-- | src/CMakeLists.txt | 6 | 
3 files changed, 30 insertions, 0 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 3ef8d0e48..a8be8a332 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -80,6 +80,7 @@ if(WIN32)    option(CURL_STATIC_CRT "Set to ON to build libcurl with static CRT on Windows (/MT)." OFF)    option(ENABLE_INET_PTON "Set to OFF to prevent usage of inet_pton when building against modern SDKs while still requiring compatibility with older Windows versions, such as Windows XP, Windows Server 2003 etc." ON)  endif() +option(CURL_LTO "Turn on compiler Link Time Optimizations" OFF)  cmake_dependent_option(ENABLE_THREADED_RESOLVER "Set to ON to enable threaded DNS lookup"          ON "NOT ENABLE_ARES" @@ -1165,6 +1166,23 @@ if(CURL_WERROR)    endif()  endif() +if(CURL_LTO) +  if(CMAKE_VERSION VERSION_LESS 3.9) +    message(FATAL_ERROR "Requested LTO but your cmake version ${CMAKE_VERSION} is to old. You need at least 3.9") +  endif() + +  cmake_policy(SET CMP0069 NEW) + +  include(CheckIPOSupported) +  check_ipo_supported(RESULT CURL_HAS_LTO OUTPUT CURL_LTO_ERROR LANGUAGES C) +  if(CURL_HAS_LTO) +    message(STATUS "LTO supported and enabled") +  else() +    message(FATAL_ERROR "LTO was requested - but compiler doesn't support it\n${CURL_LTO_ERROR}") +  endif() +endif() + +  # Ugly (but functional) way to include "Makefile.inc" by transforming it (= regenerate it).  function(transform_makefile_inc INPUT_FILE OUTPUT_FILE)    file(READ ${INPUT_FILE} MAKEFILE_INC_TEXT) diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index a9c90b665..e73efb90a 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -96,6 +96,12 @@ endif()  set_target_properties(${LIB_NAME} PROPERTIES PREFIX "")  set_target_properties(${LIB_NAME} PROPERTIES IMPORT_PREFIX "") +if(CURL_HAS_LTO) +  set_target_properties(${LIB_NAME} PROPERTIES +    INTERPROCEDURAL_OPTIMIZATION_RELEASE TRUE +    INTERPROCEDURAL_OPTIMIZATION_RELWITHDEBINFO TRUE) +endif() +  if(WIN32)    if(BUILD_SHARED_LIBS)      # Add "_imp" as a suffix before the extension to avoid conflicting with the statically linked "libcurl.lib" diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 63e2b943d..054541e40 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -46,6 +46,12 @@ add_executable(    ${CURL_FILES}    ) +if(CURL_HAS_LTO) +  set_target_properties(${EXE_NAME} PROPERTIES +    INTERPROCEDURAL_OPTIMIZATION_RELEASE TRUE +    INTERPROCEDURAL_OPTIMIZATION_RELWITHDEBINFO TRUE) +endif() +  source_group("curlX source files" FILES ${CURLX_CFILES})  source_group("curl source files" FILES ${CURL_CFILES})  source_group("curl header files" FILES ${CURL_HFILES})  | 
