aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKristian Evers <kristianevers@gmail.com>2019-05-01 18:37:26 +0200
committerGitHub <noreply@github.com>2019-05-01 18:37:26 +0200
commita26fe9d131a23f261af47de8a05eeea49256cf1f (patch)
tree00f52a47ea4eef8f1db6dd3b5d5d506b2e3cfc5a
parentf6a9bbbc584c6a3633bde04f151be930957c384f (diff)
parentf54f4556234dda885777343ae9b4594aba36c428 (diff)
downloadPROJ-a26fe9d131a23f261af47de8a05eeea49256cf1f.tar.gz
PROJ-a26fe9d131a23f261af47de8a05eeea49256cf1f.zip
Merge pull request #1437 from mwtoews/cmake
CMake: enable LTO/IPO using a manual flag or property method
-rw-r--r--src/lib_proj.cmake51
1 files changed, 31 insertions, 20 deletions
diff --git a/src/lib_proj.cmake b/src/lib_proj.cmake
index f52f5327..5a0a8070 100644
--- a/src/lib_proj.cmake
+++ b/src/lib_proj.cmake
@@ -35,23 +35,36 @@ elseif(USE_THREAD AND NOT Threads_FOUND)
"required by USE_THREAD option")
endif()
-option(ENABLE_LTO "Build library with LTO optimization (if available)." OFF)
+option(ENABLE_LTO
+ "Build library with LTO/IPO optimization (if available)." OFF)
if(ENABLE_LTO)
- # TODO: CMake v3.9 use CheckIPOSupported and set property; see
- # https://cmake.org/cmake/help/v3.9/module/CheckIPOSupported.html
- if("${CMAKE_C_COMPILER_ID}" STREQUAL "Clang")
- include(CheckCXXSourceCompiles)
- set(CMAKE_REQUIRED_FLAGS "-Wl,-flto")
- check_cxx_source_compiles("int main(){ return 0; }"
- COMPILER_SUPPORTS_FLTO_FLAG)
- elseif("${CMAKE_C_COMPILER_ID}" STREQUAL "Intel")
- # Set INTERPROCEDURAL_OPTIMIZATION property later
- set(COMPILER_SUPPORTS_FLTO_FLAG TRUE)
- else()
- include(CheckCXXCompilerFlag)
- check_cxx_compiler_flag("-flto" COMPILER_SUPPORTS_FLTO_FLAG)
+ # Determine ENABLE_LTO_METHOD to either "flag" or "property"
+ if(CMAKE_C_COMPILER_ID STREQUAL "Intel"
+ AND CMAKE_SYSTEM_NAME STREQUAL "Linux")
+ set(ENABLE_LTO_METHOD "property")
+ elseif(CMAKE_VERSION VERSION_LESS 3.9)
+ # Maual checks required
+ if(CMAKE_C_COMPILER_ID STREQUAL "Clang")
+ include(CheckCXXSourceCompiles)
+ set(CMAKE_REQUIRED_FLAGS "-Wl,-flto")
+ check_cxx_source_compiles("int main(){ return 0; }"
+ COMPILER_SUPPORTS_FLTO_FLAG)
+ else()
+ include(CheckCXXCompilerFlag)
+ check_cxx_compiler_flag("-flto" COMPILER_SUPPORTS_FLTO_FLAG)
+ endif()
+ set(ENABLE_LTO_METHOD "flag")
+ if(NOT COMPILER_SUPPORTS_FLTO_FLAG)
+ set(ENABLE_LTO OFF)
+ endif()
+ else() # CMake v3.9
+ cmake_policy(SET CMP0069 NEW)
+ include(CheckIPOSupported)
+ check_ipo_supported(RESULT ENABLE_LTO)
+ set(ENABLE_LTO_METHOD "property")
endif()
endif()
+boost_report_value(ENABLE_LTO)
##############################################
@@ -370,14 +383,12 @@ if("${CMAKE_C_COMPILER_ID}" STREQUAL "Intel")
PROPERTIES COMPILE_FLAGS ${FP_PRECISE})
endif()
-if(COMPILER_SUPPORTS_FLTO_FLAG)
- if("${CMAKE_C_COMPILER_ID}" STREQUAL "Intel")
- # Intel supported only, before v3.9
+if(ENABLE_LTO)
+ if(ENABLE_LTO_METHOD STREQUAL "property")
set_property(TARGET ${PROJ_CORE_TARGET}
PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE)
- else()
- # Pre CMake v3.9 needs to set flag for other compilers
- # see https://gitlab.kitware.com/cmake/cmake/issues/15245
+ elseif(ENABLE_LTO_METHOD STREQUAL "flag")
+ # pre-CMake 3.9 workaround
target_compile_options(${PROJ_CORE_TARGET} PRIVATE -flto)
endif()
endif()