11include (cmake/utils.cmake )
2+ include (CheckCXXCompilerFlag )
23
34if (NOT CMAKE_BUILD_TYPE STREQUAL "Debug" )
45# Remove VALGRIND code and assertions in *any* type of release build.
56 add_definitions ("-DNDEBUG" "-DNVALGRIND" )
67endif ()
78
9+ option (ENABLE_MARCH_NATIVE
10+ "Enable -march=native for release-like builds"
11+ ON )
12+ option (ENABLE_LTO
13+ "Enable link-time optimization for release-like builds"
14+ ON )
15+ option (ENABLE_FNO_PLT
16+ "Enable -fno-plt for release-like builds"
17+ ON )
18+ option (ENABLE_OFAST
19+ "Enable -Ofast for release-like builds"
20+ ON )
21+
22+ set (PGO_MODE "OFF" CACHE STRING
23+ "PGO mode for release-like builds: OFF, GENERATE, USE" )
24+ set_property (CACHE PGO_MODE PROPERTY STRINGS OFF GENERATE USE)
25+ set (PGO_PROFILE_DIR "${CMAKE_BINARY_DIR } /pgo-data" CACHE PATH
26+ "Directory used to store/read PGO profile data" )
27+
28+ string (TOUPPER "${PGO_MODE} " PGO_MODE)
29+ if (NOT PGO_MODE STREQUAL "OFF" AND
30+ NOT PGO_MODE STREQUAL "GENERATE" AND
31+ NOT PGO_MODE STREQUAL "USE" )
32+ message (FATAL_ERROR
33+ "Unsupported PGO_MODE='${PGO_MODE} '. Expected OFF, GENERATE, or USE." )
34+ endif ()
35+
836#
937# Perform build type specific configuration.
1038#
@@ -22,4 +50,121 @@ set (CMAKE_CXX_FLAGS_DEBUG
2250set (CMAKE_CXX_FLAGS_RELWITHDEBINFO
2351 "${CMAKE_CXX_FLAGS_RELWITHDEBINFO } ${CC_DEBUG_OPT} -O3" )
2452
53+ macro (append_release_compile_flags langs )
54+ foreach (_lang ${langs} )
55+ string (REPLACE ";" " " _flags "${ARGN} " )
56+ foreach (_config RELEASE RELWITHDEBINFO)
57+ set (CMAKE_${_lang} _FLAGS_${_config}
58+ "${CMAKE_${_lang} _FLAGS_${_config} } ${_flags} " )
59+ endforeach ()
60+ unset (_config)
61+ unset (_flags)
62+ endforeach ()
63+ unset (_lang)
64+ endmacro ()
65+
66+ macro (append_release_linker_flags )
67+ string (REPLACE ";" " " _flags "${ARGN} " )
68+ foreach (_kind EXE SHARED MODULE)
69+ foreach (_config RELEASE RELWITHDEBINFO)
70+ set (CMAKE_${_kind} _LINKER_FLAGS_${_config}
71+ "${CMAKE_${_kind} _LINKER_FLAGS_${_config} } ${_flags} " )
72+ endforeach ()
73+ unset (_config)
74+ endforeach ()
75+ unset (_kind)
76+ unset (_flags)
77+ endmacro ()
78+
79+ set (RELEASE_TUNING_FLAGS "" )
80+ set (RELEASE_LINK_FLAGS "" )
81+
82+ if (ENABLE_MARCH_NATIVE)
83+ check_c_compiler_flag ("-march=native" CC_HAS_MARCH_NATIVE )
84+ check_cxx_compiler_flag ("-march=native" CXX_HAS_MARCH_NATIVE )
85+ if (CC_HAS_MARCH_NATIVE AND CXX_HAS_MARCH_NATIVE)
86+ list (APPEND RELEASE_TUNING_FLAGS "-march=native" )
87+ else ()
88+ message (WARNING "ENABLE_MARCH_NATIVE=ON, but compiler does not support -march=native" )
89+ endif ()
90+ endif ()
91+
92+ if (ENABLE_FNO_PLT)
93+ check_c_compiler_flag ("-fno-plt" CC_HAS_FNO_PLT )
94+ check_cxx_compiler_flag ("-fno-plt" CXX_HAS_FNO_PLT )
95+ if (CC_HAS_FNO_PLT AND CXX_HAS_FNO_PLT)
96+ list (APPEND RELEASE_TUNING_FLAGS "-fno-plt" )
97+ else ()
98+ message (WARNING "ENABLE_FNO_PLT=ON, but compiler does not support -fno-plt" )
99+ endif ()
100+ endif ()
101+
102+ if (ENABLE_OFAST)
103+ check_c_compiler_flag ("-Ofast" CC_HAS_OFAST )
104+ check_cxx_compiler_flag ("-Ofast" CXX_HAS_OFAST )
105+ if (CC_HAS_OFAST AND CXX_HAS_OFAST)
106+ list (APPEND RELEASE_TUNING_FLAGS "-Ofast" )
107+ else ()
108+ message (WARNING "ENABLE_OFAST=ON, but compiler does not support -Ofast" )
109+ endif ()
110+ endif ()
111+
112+ if (ENABLE_LTO)
113+ check_c_compiler_flag ("-flto" CC_HAS_FLTO )
114+ check_cxx_compiler_flag ("-flto" CXX_HAS_FLTO )
115+ if (CC_HAS_FLTO AND CXX_HAS_FLTO)
116+ list (APPEND RELEASE_TUNING_FLAGS "-flto" )
117+ list (APPEND RELEASE_LINK_FLAGS "-flto" )
118+ else ()
119+ message (WARNING "ENABLE_LTO=ON, but compiler does not support -flto" )
120+ endif ()
121+ endif ()
122+
123+ if (NOT PGO_MODE STREQUAL "OFF" )
124+ if (CMAKE_C_COMPILER_ID MATCHES "GNU" AND CMAKE_CXX_COMPILER_ID MATCHES "GNU" )
125+ file (MAKE_DIRECTORY "${PGO_PROFILE_DIR} " )
126+ set (PGO_PREFIX_FLAG "-fprofile-prefix-path=${CMAKE_BINARY_DIR } " )
127+ if (PGO_MODE STREQUAL "GENERATE" )
128+ list (APPEND RELEASE_TUNING_FLAGS
129+ "-fprofile-generate=${PGO_PROFILE_DIR} "
130+ "${PGO_PREFIX_FLAG} " )
131+ list (APPEND RELEASE_LINK_FLAGS "-fprofile-generate=${PGO_PROFILE_DIR} " )
132+ elseif (PGO_MODE STREQUAL "USE" )
133+ list (APPEND RELEASE_TUNING_FLAGS
134+ "-fprofile-use=${PGO_PROFILE_DIR} "
135+ "-fprofile-correction"
136+ "${PGO_PREFIX_FLAG} " )
137+ list (APPEND RELEASE_LINK_FLAGS
138+ "-fprofile-use=${PGO_PROFILE_DIR} "
139+ "-fprofile-correction" )
140+ endif ()
141+ else ()
142+ message (FATAL_ERROR
143+ "PGO_MODE currently supports only GNU C/C++ compilers in this project." )
144+ endif ()
145+ endif ()
146+
147+ if (RELEASE_TUNING_FLAGS)
148+ append_release_compile_flags ("C;CXX" ${RELEASE_TUNING_FLAGS} )
149+ endif ()
150+
151+ if (RELEASE_LINK_FLAGS)
152+ append_release_linker_flags (${RELEASE_LINK_FLAGS} )
153+ endif ()
154+
155+ if (NOT CMAKE_BUILD_TYPE STREQUAL "Debug" )
156+ string_join (" " RELEASE_TUNING_FLAGS_STR ${RELEASE_TUNING_FLAGS} )
157+ string_join (" " RELEASE_LINK_FLAGS_STR ${RELEASE_LINK_FLAGS} )
158+ if (RELEASE_TUNING_FLAGS_STR)
159+ message (STATUS "Release compile tuning flags: ${RELEASE_TUNING_FLAGS_STR} " )
160+ endif ()
161+ if (RELEASE_LINK_FLAGS_STR)
162+ message (STATUS "Release link tuning flags: ${RELEASE_LINK_FLAGS_STR} " )
163+ endif ()
164+ if (NOT PGO_MODE STREQUAL "OFF" )
165+ message (STATUS "PGO mode: ${PGO_MODE} " )
166+ message (STATUS "PGO profile dir: ${PGO_PROFILE_DIR} " )
167+ endif ()
168+ endif ()
169+
25170unset (CC_DEBUG_OPT)
0 commit comments