Skip to content

Commit 014e063

Browse files
committed
cmake: Add ProcessConfigurations.cmake module
1 parent 0fa84f8 commit 014e063

File tree

2 files changed

+95
-40
lines changed

2 files changed

+95
-40
lines changed

CMakeLists.txt

Lines changed: 9 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -161,18 +161,17 @@ option(SECP256K1_BUILD_EXHAUSTIVE_TESTS "Build exhaustive tests." ON)
161161
option(SECP256K1_BUILD_CTIME_TESTS "Build constant-time tests." ${SECP256K1_VALGRIND})
162162
option(SECP256K1_BUILD_EXAMPLES "Build examples." OFF)
163163

164+
include(ProcessConfigurations)
165+
set_default_config(RelWithDebInfo)
166+
164167
# Redefine configuration flags.
165168
# We leave assertions on, because they are only used in the examples, and we want them always on there.
166169
if(MSVC)
167-
string(REGEX REPLACE "/DNDEBUG[ \t\r\n]*" "" CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO}")
168-
string(REGEX REPLACE "/DNDEBUG[ \t\r\n]*" "" CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}")
169-
string(REGEX REPLACE "/DNDEBUG[ \t\r\n]*" "" CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL}")
170+
remove_flag_from_all_configs(/DNDEBUG)
170171
else()
171-
string(REGEX REPLACE "-DNDEBUG[ \t\r\n]*" "" CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO}")
172-
string(REGEX REPLACE "-DNDEBUG[ \t\r\n]*" "" CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}")
173-
string(REGEX REPLACE "-DNDEBUG[ \t\r\n]*" "" CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL}")
172+
remove_flag_from_all_configs(-DNDEBUG)
174173
# Prefer -O2 optimization level. (-O3 is CMake's default for Release for many compilers.)
175-
string(REGEX REPLACE "-O3[ \t\r\n]*" "-O2" CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}")
174+
replace_flag_in_config(Release -O3 -O2)
176175
endif()
177176

178177
# Define custom "Coverage" build type.
@@ -195,23 +194,10 @@ mark_as_advanced(
195194
)
196195

197196
get_property(is_multi_config GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
198-
set(default_build_type "RelWithDebInfo")
199197
if(is_multi_config)
200-
set(CMAKE_CONFIGURATION_TYPES "${default_build_type}" "Release" "Debug" "MinSizeRel" "Coverage" CACHE STRING
201-
"Supported configuration types."
202-
FORCE
203-
)
198+
list(APPEND CMAKE_CONFIGURATION_TYPES Coverage)
204199
else()
205-
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY
206-
STRINGS "${default_build_type}" "Release" "Debug" "MinSizeRel" "Coverage"
207-
)
208-
if(NOT CMAKE_BUILD_TYPE)
209-
message(STATUS "Setting build type to \"${default_build_type}\" as none was specified")
210-
set(CMAKE_BUILD_TYPE "${default_build_type}" CACHE STRING
211-
"Choose the type of build."
212-
FORCE
213-
)
214-
endif()
200+
set_property(CACHE CMAKE_BUILD_TYPE APPEND PROPERTY STRINGS Coverage)
215201
endif()
216202

217203
include(TryAppendCFlags)
@@ -312,24 +298,7 @@ message("CFLAGS ................................ ${CMAKE_C_FLAGS}")
312298
get_directory_property(compile_options COMPILE_OPTIONS)
313299
string(REPLACE ";" " " compile_options "${compile_options}")
314300
message("Compile options ....................... " ${compile_options})
315-
if(NOT is_multi_config)
316-
message("Build type:")
317-
message(" - CMAKE_BUILD_TYPE ................... ${CMAKE_BUILD_TYPE}")
318-
string(TOUPPER "${CMAKE_BUILD_TYPE}" build_type)
319-
message(" - CFLAGS ............................. ${CMAKE_C_FLAGS_${build_type}}")
320-
message(" - LDFLAGS for executables ............ ${CMAKE_EXE_LINKER_FLAGS_${build_type}}")
321-
message(" - LDFLAGS for shared libraries ....... ${CMAKE_SHARED_LINKER_FLAGS_${build_type}}")
322-
else()
323-
message("Supported configurations .............. ${CMAKE_CONFIGURATION_TYPES}")
324-
message("RelWithDebInfo configuration:")
325-
message(" - CFLAGS ............................. ${CMAKE_C_FLAGS_RELWITHDEBINFO}")
326-
message(" - LDFLAGS for executables ............ ${CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO}")
327-
message(" - LDFLAGS for shared libraries ....... ${CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO}")
328-
message("Debug configuration:")
329-
message(" - CFLAGS ............................. ${CMAKE_C_FLAGS_DEBUG}")
330-
message(" - LDFLAGS for executables ............ ${CMAKE_EXE_LINKER_FLAGS_DEBUG}")
331-
message(" - LDFLAGS for shared libraries ....... ${CMAKE_SHARED_LINKER_FLAGS_DEBUG}")
332-
endif()
301+
print_config_flags()
333302
message("\n")
334303
if(SECP256K1_EXPERIMENTAL)
335304
message(

cmake/ProcessConfigurations.cmake

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
function(get_all_configs output)
2+
get_property(is_multi_config GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
3+
if(is_multi_config)
4+
set(all_configs ${CMAKE_CONFIGURATION_TYPES})
5+
else()
6+
get_property(all_configs CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS)
7+
if(NOT all_configs)
8+
# See https://cmake.org/cmake/help/latest/manual/cmake-buildsystem.7.html#default-and-custom-configurations
9+
set(all_configs Debug Release RelWithDebInfo MinSizeRel)
10+
endif()
11+
endif()
12+
set(${output} "${all_configs}" PARENT_SCOPE)
13+
endfunction()
14+
15+
# When used with multi-configuration generators, this function rearranges
16+
# the CMAKE_CONFIGURATION_TYPES list, ensuring that the default configuration type
17+
# appears first while maintaining the order of the remaining configuration types.
18+
function(set_default_config config)
19+
get_all_configs(all_configs)
20+
if(NOT ${config} IN_LIST all_configs)
21+
message(FATAL_ERROR "The default config is \"${config}\", but must be one of ${all_configs}.")
22+
endif()
23+
24+
list(REMOVE_ITEM all_configs ${config})
25+
if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.15)
26+
list(PREPEND all_configs ${config})
27+
else()
28+
set(all_configs ${config} ${all_configs})
29+
endif()
30+
31+
get_property(is_multi_config GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
32+
if(is_multi_config)
33+
get_property(help_string CACHE CMAKE_CONFIGURATION_TYPES PROPERTY HELPSTRING)
34+
set(CMAKE_CONFIGURATION_TYPES "${all_configs}" CACHE STRING "${help_string}" FORCE)
35+
else()
36+
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY
37+
STRINGS "${all_configs}"
38+
)
39+
if(NOT CMAKE_BUILD_TYPE)
40+
message(STATUS "Setting build type to \"${config}\" as none was specified")
41+
get_property(help_string CACHE CMAKE_BUILD_TYPE PROPERTY HELPSTRING)
42+
set(CMAKE_BUILD_TYPE "${config}" CACHE STRING "${help_string}" FORCE)
43+
endif()
44+
endif()
45+
endfunction()
46+
47+
function(remove_flag_from_all_configs flag)
48+
get_all_configs(all_configs)
49+
foreach(config IN LISTS all_configs)
50+
string(TOUPPER "${config}" config_uppercase)
51+
set(flags "${CMAKE_C_FLAGS_${config_uppercase}}")
52+
separate_arguments(flags)
53+
list(FILTER flags EXCLUDE REGEX "${flag}")
54+
list(JOIN flags " " new_flags)
55+
set(CMAKE_C_FLAGS_${config_uppercase} "${new_flags}" PARENT_SCOPE)
56+
endforeach()
57+
endfunction()
58+
59+
function(replace_flag_in_config config old_flag new_flag)
60+
string(TOUPPER "${config}" config_uppercase)
61+
string(REGEX REPLACE "(^| )${old_flag}( |$)" "\\1${new_flag}\\2" new_flags "${CMAKE_C_FLAGS_${config_uppercase}}")
62+
set(CMAKE_C_FLAGS_${config_uppercase} "${new_flags}" PARENT_SCOPE)
63+
endfunction()
64+
65+
function(print_config_flags)
66+
macro(print_flags config)
67+
string(TOUPPER "${config}" config_uppercase)
68+
message(" - CFLAGS ............................. ${CMAKE_C_FLAGS_${config_uppercase}}")
69+
message(" - LDFLAGS for executables ............ ${CMAKE_EXE_LINKER_FLAGS_${config_uppercase}}")
70+
message(" - LDFLAGS for shared libraries ....... ${CMAKE_SHARED_LINKER_FLAGS_${config_uppercase}}")
71+
endmacro()
72+
73+
get_property(is_multi_config GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
74+
if(is_multi_config)
75+
list(JOIN CMAKE_CONFIGURATION_TYPES " " configs)
76+
message("Supported configuration types ......... ${configs}")
77+
foreach(config IN LISTS CMAKE_CONFIGURATION_TYPES)
78+
message("'${config}' configuration type:")
79+
print_flags(${config})
80+
endforeach()
81+
else()
82+
message("Build type:")
83+
message(" - CMAKE_BUILD_TYPE ................... ${CMAKE_BUILD_TYPE}")
84+
print_flags(${CMAKE_BUILD_TYPE})
85+
endif()
86+
endfunction()

0 commit comments

Comments
 (0)