From d21f63d327d3cef6753ffe34db13a9354813c861 Mon Sep 17 00:00:00 2001 From: Dennis Luxen Date: Tue, 1 Apr 2014 17:54:41 +0200 Subject: [PATCH] activate LTO on platforms that support it, ie. most recent compilers --- CMakeLists.txt | 15 +++++++++++++++ cmake/CheckCXXCompilerFlag.cmake | 29 +++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 cmake/CheckCXXCompilerFlag.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 8ddaf1219..471bfde7f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,7 @@ cmake_minimum_required(VERSION 2.6) project(OSRM) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) +include(CheckCXXCompilerFlag) include(FindPackageHandleStandardArgs) list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake") @@ -103,6 +104,20 @@ elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") # using Visual Studio C++ endif() +# Check if LTO is available +set(LTO_FLAGS "") +CHECK_CXX_COMPILER_FLAG("-flto" HAS_LTO_FLAG) +if (HAS_LTO_FLAG) + set(LTO_FLAGS "${LTO_FLAGS} -flto") +else (HAS_LTO_FLAG) + set(LTO_FLAGS "${LTO_FLAGS} -flto") +endif (HAS_LTO_FLAG) + +# Add Link-Time-Optimization flags, if supported (GCC >= 4.5) and enabled +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${LTO_FLAGS}") +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${LTO_FLAGS}") +set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${LTO_FLAGS}") + # Configuring other platform dependencies if(APPLE) set(CMAKE_OSX_ARCHITECTURES "x86_64") diff --git a/cmake/CheckCXXCompilerFlag.cmake b/cmake/CheckCXXCompilerFlag.cmake new file mode 100644 index 000000000..e396f75a9 --- /dev/null +++ b/cmake/CheckCXXCompilerFlag.cmake @@ -0,0 +1,29 @@ +# - Check whether the CXX compiler supports a given flag. +# CHECK_CXX_COMPILER_FLAG( ) +# - the compiler flag +# - variable to store the result +# This internally calls the check_cxx_source_compiles macro. See help +# for CheckCXXSourceCompiles for a listing of variables that can +# modify the build. + +# Copyright (c) 2006, Alexander Neundorf, +# +# Redistribution and use is allowed according to the terms of the BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. + + +INCLUDE(CheckCXXSourceCompiles) + +MACRO (CHECK_CXX_COMPILER_FLAG _FLAG _RESULT) + SET(SAFE_CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS}") + SET(CMAKE_REQUIRED_DEFINITIONS "${_FLAG}") + CHECK_CXX_SOURCE_COMPILES("int main() { return 0;}" ${_RESULT} + # Some compilers do not fail with a bad flag + FAIL_REGEX "unrecognized .*option" # GNU + FAIL_REGEX "ignoring unknown option" # MSVC + FAIL_REGEX "[Uu]nknown option" # HP + FAIL_REGEX "[Ww]arning: [Oo]ption" # SunPro + FAIL_REGEX "command option .* is not recognized" # XL + ) + SET (CMAKE_REQUIRED_DEFINITIONS "${SAFE_CMAKE_REQUIRED_DEFINITIONS}") +ENDMACRO (CHECK_CXX_COMPILER_FLAG)