@@ -45,6 +45,49 @@ else()
4545 set (ENABLE_INSTALL ${EGGS_STACKTRACE_ENABLE_INSTALL} )
4646endif ()
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 )
95138endif ()
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
101159macro (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
142199eggs_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 )
148216endif ()
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 )
162243endif ()
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)
168272endif ()
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 ()
179286else ()
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 ()
181296endif ()
182297
183298add_library (
0 commit comments