Skip to content

Commit 8f3166f

Browse files
committed
backend selection
1 parent cd8983b commit 8f3166f

2 files changed

Lines changed: 149 additions & 30 deletions

File tree

‎CMakeLists.txt‎

Lines changed: 144 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,49 @@ else()
4545
set(ENABLE_INSTALL ${EGGS_STACKTRACE_ENABLE_INSTALL})
4646
endif()
4747

48+
set(EGGS_STACKTRACE_KNOWN_BACKENDS null execinfo libbacktrace win32)
49+
50+
set(EGGS_STACKTRACE_BACKENDS
51+
""
52+
CACHE STRING
53+
"List of backends to build: ${EGGS_STACKTRACE_KNOWN_BACKENDS}. \
54+
Empty (default) auto-detects available backends."
55+
)
56+
foreach(_backend IN LISTS EGGS_STACKTRACE_BACKENDS)
57+
if(NOT _backend IN_LIST EGGS_STACKTRACE_KNOWN_BACKENDS)
58+
message(
59+
FATAL_ERROR
60+
"Eggs.Stacktrace: unknown backend '${_backend}' in "
61+
"EGGS_STACKTRACE_BACKENDS (known backends: "
62+
"${EGGS_STACKTRACE_KNOWN_BACKENDS})"
63+
)
64+
endif()
65+
endforeach()
66+
unset(_backend)
67+
68+
set(EGGS_STACKTRACE_DEFAULT_BACKEND
69+
""
70+
CACHE STRING
71+
"Backend aliased as Eggs::Stacktrace: ${EGGS_STACKTRACE_KNOWN_BACKENDS}. \
72+
Empty (default) auto-select best available backend."
73+
)
74+
set_property(
75+
CACHE EGGS_STACKTRACE_DEFAULT_BACKEND
76+
PROPERTY STRINGS "" ${EGGS_STACKTRACE_KNOWN_BACKENDS}
77+
)
78+
if(
79+
EGGS_STACKTRACE_DEFAULT_BACKEND
80+
AND NOT EGGS_STACKTRACE_DEFAULT_BACKEND IN_LIST EGGS_STACKTRACE_KNOWN_BACKENDS
81+
)
82+
message(
83+
FATAL_ERROR
84+
"Eggs.Stacktrace: unknown backend "
85+
"'${EGGS_STACKTRACE_DEFAULT_BACKEND}' in "
86+
"EGGS_STACKTRACE_DEFAULT_BACKEND (known backends: "
87+
"${EGGS_STACKTRACE_KNOWN_BACKENDS})"
88+
)
89+
endif()
90+
4891
#
4992
# Library targets
5093
#
@@ -94,12 +137,26 @@ if(MSVC)
94137
)
95138
endif()
96139

97-
# -- Backend macro -------------------------------------------------------------
140+
# -- Backend selection -----------------------------------------------------
98141

99-
set(EGGS_STACKTRACE_BACKENDS)
142+
# eggs_stacktrace_want_backend(<name> <out-var>)
143+
#
144+
# Sets <out-var> ON if <name> should be attempted: always, unless
145+
# EGGS_STACKTRACE_BACKENDS is non-empty and doesn't list it.
146+
macro(eggs_stacktrace_want_backend name out_var)
147+
if(
148+
EGGS_STACKTRACE_BACKENDS
149+
AND NOT "${name}" IN_LIST EGGS_STACKTRACE_BACKENDS
150+
)
151+
set(${out_var} OFF)
152+
else()
153+
set(${out_var} ON)
154+
endif()
155+
endmacro()
156+
157+
# -- Backend macro -------------------------------------------------------------
100158

101159
macro(eggs_stacktrace_add_backend name)
102-
list(APPEND EGGS_STACKTRACE_BACKENDS ${name})
103160
set(_export "${EGGS_STACKTRACE_BACKEND_EXPORT_${name}}")
104161
add_library(
105162
_eggs_stacktrace_${name}
@@ -141,43 +198,101 @@ endmacro()
141198

142199
eggs_stacktrace_add_backend(null)
143200

144-
include(CheckExecinfoBackend)
145-
eggs_stacktrace_check_execinfo_backend(EGGS_STACKTRACE_HAVE_EXECINFO)
146-
if(EGGS_STACKTRACE_HAVE_EXECINFO)
147-
eggs_stacktrace_add_backend(execinfo _eggs_stacktrace_execinfo_support)
201+
eggs_stacktrace_want_backend(execinfo _want_execinfo)
202+
if(_want_execinfo)
203+
include(CheckExecinfoBackend)
204+
eggs_stacktrace_check_execinfo_backend(EGGS_STACKTRACE_HAVE_EXECINFO)
205+
if(EGGS_STACKTRACE_HAVE_EXECINFO)
206+
eggs_stacktrace_add_backend(execinfo _eggs_stacktrace_execinfo_support)
207+
elseif("execinfo" IN_LIST EGGS_STACKTRACE_BACKENDS)
208+
message(
209+
FATAL_ERROR
210+
"Eggs.Stacktrace: backend 'execinfo' was requested in "
211+
"EGGS_STACKTRACE_BACKENDS but is not available on this platform."
212+
)
213+
endif()
214+
else()
215+
set(EGGS_STACKTRACE_HAVE_EXECINFO OFF)
148216
endif()
149217

150-
include(CheckLibbacktraceBackend)
151-
eggs_stacktrace_check_libbacktrace_backend(EGGS_STACKTRACE_HAVE_LIBBACKTRACE)
152-
if(EGGS_STACKTRACE_HAVE_LIBBACKTRACE)
153-
eggs_stacktrace_add_backend(
154-
libbacktrace
155-
_eggs_stacktrace_libbacktrace_support
156-
)
157-
target_compile_definitions(
158-
_eggs_stacktrace_libbacktrace
159-
PRIVATE
160-
EGGS_STACKTRACE_BACKTRACE_INCLUDE_FILE="${EGGS_STACKTRACE_LIBBACKTRACE_HEADER}"
218+
eggs_stacktrace_want_backend(libbacktrace _want_libbacktrace)
219+
if(_want_libbacktrace)
220+
include(CheckLibbacktraceBackend)
221+
eggs_stacktrace_check_libbacktrace_backend(
222+
EGGS_STACKTRACE_HAVE_LIBBACKTRACE
161223
)
224+
if(EGGS_STACKTRACE_HAVE_LIBBACKTRACE)
225+
eggs_stacktrace_add_backend(
226+
libbacktrace
227+
_eggs_stacktrace_libbacktrace_support
228+
)
229+
target_compile_definitions(
230+
_eggs_stacktrace_libbacktrace
231+
PRIVATE
232+
EGGS_STACKTRACE_BACKTRACE_INCLUDE_FILE="${EGGS_STACKTRACE_LIBBACKTRACE_HEADER}"
233+
)
234+
elseif("libbacktrace" IN_LIST EGGS_STACKTRACE_BACKENDS)
235+
message(
236+
FATAL_ERROR
237+
"Eggs.Stacktrace: backend 'libbacktrace' was requested in "
238+
"EGGS_STACKTRACE_BACKENDS but is not available on this platform."
239+
)
240+
endif()
241+
else()
242+
set(EGGS_STACKTRACE_HAVE_LIBBACKTRACE OFF)
162243
endif()
163244

164-
set(EGGS_STACKTRACE_HAVE_WIN32 OFF)
165-
if(WIN32)
166-
set(EGGS_STACKTRACE_HAVE_WIN32 ON)
167-
eggs_stacktrace_add_backend(win32 DbgHelp)
245+
eggs_stacktrace_want_backend(win32 _want_win32)
246+
if(_want_win32)
247+
if(WIN32)
248+
set(EGGS_STACKTRACE_HAVE_WIN32 ON)
249+
eggs_stacktrace_add_backend(win32 DbgHelp)
250+
elseif("win32" IN_LIST EGGS_STACKTRACE_BACKENDS)
251+
message(
252+
FATAL_ERROR
253+
"Eggs.Stacktrace: backend 'win32' was requested in "
254+
"EGGS_STACKTRACE_BACKENDS but is not available on this platform."
255+
)
256+
endif()
257+
else()
258+
set(EGGS_STACKTRACE_HAVE_WIN32 OFF)
259+
endif()
260+
261+
# An empty EGGS_STACKTRACE_BACKENDS means auto-detect.
262+
if(NOT EGGS_STACKTRACE_BACKENDS)
263+
set(_detected)
264+
foreach(_backend IN LISTS EGGS_STACKTRACE_KNOWN_BACKENDS)
265+
if(TARGET _eggs_stacktrace_${_backend})
266+
list(APPEND _detected ${_backend})
267+
endif()
268+
endforeach()
269+
set_property(CACHE EGGS_STACKTRACE_BACKENDS PROPERTY VALUE "${_detected}")
270+
unset(_backend)
271+
unset(_detected)
168272
endif()
169273

170274
# -- Main alias ----------------------------------------------------------------
171275
# Note: ALIAS cannot alias another ALIAS, so we alias the internal target name.
172276

173-
if(TARGET _eggs_stacktrace_libbacktrace)
174-
set(EGGS_STACKTRACE_DEFAULT_BACKEND libbacktrace)
175-
elseif(TARGET _eggs_stacktrace_execinfo)
176-
set(EGGS_STACKTRACE_DEFAULT_BACKEND execinfo)
177-
elseif(TARGET _eggs_stacktrace_win32)
178-
set(EGGS_STACKTRACE_DEFAULT_BACKEND win32)
277+
if(EGGS_STACKTRACE_DEFAULT_BACKEND)
278+
if(NOT TARGET _eggs_stacktrace_${EGGS_STACKTRACE_DEFAULT_BACKEND})
279+
message(
280+
FATAL_ERROR
281+
"Eggs.Stacktrace: EGGS_STACKTRACE_DEFAULT_BACKEND requested "
282+
"'${EGGS_STACKTRACE_DEFAULT_BACKEND}', but that backend was not "
283+
"built (see EGGS_STACKTRACE_BACKENDS)."
284+
)
285+
endif()
179286
else()
180-
set(EGGS_STACKTRACE_DEFAULT_BACKEND null)
287+
if(TARGET _eggs_stacktrace_libbacktrace)
288+
set(EGGS_STACKTRACE_DEFAULT_BACKEND libbacktrace)
289+
elseif(TARGET _eggs_stacktrace_execinfo)
290+
set(EGGS_STACKTRACE_DEFAULT_BACKEND execinfo)
291+
elseif(TARGET _eggs_stacktrace_win32)
292+
set(EGGS_STACKTRACE_DEFAULT_BACKEND win32)
293+
else()
294+
set(EGGS_STACKTRACE_DEFAULT_BACKEND null)
295+
endif()
181296
endif()
182297

183298
add_library(

‎test/CMakeLists.txt‎

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,11 @@ set_tests_properties(
2323

2424
include(AddMultipleDefinitionsTest)
2525

26-
foreach(_backend IN LISTS EGGS_STACKTRACE_BACKENDS)
26+
foreach(_backend IN LISTS EGGS_STACKTRACE_KNOWN_BACKENDS)
27+
if(NOT TARGET _eggs_stacktrace_${_backend})
28+
continue()
29+
endif()
30+
2731
add_multiple_definitions_test(
2832
eggs.stacktrace.verify_definitions.${_backend}
2933
_eggs_stacktrace_common

0 commit comments

Comments
 (0)