@@ -137,27 +137,14 @@ if(MSVC)
137137 )
138138endif ()
139139
140- # -- Backend selection -----------------------------------------------------
140+ # -- Backend helpers -- -----------------------------------------------------
141141
142- # eggs_stacktrace_want_backend (<name> <out-var >)
142+ # eggs_stacktrace_add_backend (<name>)
143143#
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 -------------------------------------------------------------
158-
159- macro (eggs_stacktrace_add_backend name )
144+ # Defines the _eggs_stacktrace_<name> target.
145+ function (eggs_stacktrace_add_backend name )
160146 set (_export "${EGGS_STACKTRACE_BACKEND_EXPORT_${name} }" )
147+ string (TOUPPER "${name} " _upper)
161148 add_library (
162149 _eggs_stacktrace_${name}
163150 STATIC
@@ -171,6 +158,12 @@ macro(eggs_stacktrace_add_backend name)
171158 $<INSTALL_INTERFACE :${CMAKE_INSTALL_INCLUDEDIR} >
172159 )
173160 target_compile_features (_eggs_stacktrace_${name} PUBLIC cxx_std_11 )
161+ if (EGGS_STACKTRACE_${_upper} _DEFINITIONS)
162+ target_compile_definitions (
163+ _eggs_stacktrace_${name}
164+ PRIVATE ${EGGS_STACKTRACE_${_upper} _DEFINITIONS}
165+ )
166+ endif ()
174167 set_target_properties (
175168 _eggs_stacktrace_${name}
176169 PROPERTIES
@@ -187,76 +180,53 @@ macro(eggs_stacktrace_add_backend name)
187180 "${CMAKE_CURRENT_BINARY_DIR } /$<CONFIG >"
188181 )
189182 endif ()
190- if (NOT "${ARGN} " STREQUAL "" )
191- target_link_libraries (_eggs_stacktrace_${name} PUBLIC ${ARGN} )
192- endif ()
193- add_library (Eggs::Stacktrace::${_export} ALIAS _eggs_stacktrace_${name} )
194- unset (_export)
195- endmacro ()
196-
197- # -- Backend targets -----------------------------------------------------------
198-
199- eggs_stacktrace_add_backend (null )
200-
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."
183+ if (TARGET _eggs_stacktrace_${name} _support)
184+ target_link_libraries (
185+ _eggs_stacktrace_${name}
186+ PUBLIC _eggs_stacktrace_${name}_support
212187 )
213188 endif ()
214- else ()
215- set (EGGS_STACKTRACE_HAVE_EXECINFO OFF )
216- endif ()
189+ add_library (Eggs::Stacktrace::${_export} ALIAS _eggs_stacktrace_${name} )
190+ endfunction ()
217191
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
192+ # eggs_stacktrace_add_checked_backend(<name>)
193+ #
194+ # Adds backend <name> if it is wanted and its dependencies check out.
195+ macro (eggs_stacktrace_add_checked_backend name )
196+ string (TOUPPER "${name} " _upper)
197+ if (
198+ NOT EGGS_STACKTRACE_BACKENDS
199+ OR "${name} " IN_LIST EGGS_STACKTRACE_BACKENDS
223200 )
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."
201+ include (Check${EGGS_STACKTRACE_BACKEND_EXPORT_${name}}Backend )
202+ cmake_language (
203+ CALL eggs_stacktrace_check_${name}_backend
204+ EGGS_STACKTRACE_HAVE_${_upper}
239205 )
206+ if (EGGS_STACKTRACE_HAVE_${_upper} )
207+ eggs_stacktrace_add_backend (${name} )
208+ list (
209+ APPEND EGGS_STACKTRACE_CHECKED_BACKENDS
210+ ${EGGS_STACKTRACE_BACKEND_EXPORT_${name} }
211+ )
212+ elseif ("${name} " IN_LIST EGGS_STACKTRACE_BACKENDS)
213+ message (
214+ FATAL_ERROR
215+ "Eggs.Stacktrace: backend '${name} ' was requested in "
216+ "EGGS_STACKTRACE_BACKENDS but is not available on this platform."
217+ )
218+ endif ()
240219 endif ()
241- else ()
242- set (EGGS_STACKTRACE_HAVE_LIBBACKTRACE OFF )
243- endif ()
220+ unset (_upper)
221+ endmacro ()
244222
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 ()
223+ # -- Backend targets -----------------------------------------------------------
224+
225+ set (EGGS_STACKTRACE_CHECKED_BACKENDS)
226+ eggs_stacktrace_add_backend (null )
227+ eggs_stacktrace_add_checked_backend (execinfo )
228+ eggs_stacktrace_add_checked_backend (libbacktrace )
229+ eggs_stacktrace_add_checked_backend (win32 )
260230
261231# An empty EGGS_STACKTRACE_BACKENDS means auto-detect.
262232if (NOT EGGS_STACKTRACE_BACKENDS)
@@ -284,15 +254,14 @@ if(EGGS_STACKTRACE_DEFAULT_BACKEND)
284254 )
285255 endif ()
286256else ()
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 ()
257+ set (EGGS_STACKTRACE_DEFAULT_BACKEND null)
258+ foreach (_backend IN ITEMS libbacktrace execinfo win32 )
259+ if (TARGET _eggs_stacktrace_${_backend} )
260+ set (EGGS_STACKTRACE_DEFAULT_BACKEND ${_backend} )
261+ break ()
262+ endif ()
263+ endforeach ()
264+ unset (_backend)
296265endif ()
297266
298267add_library (
@@ -377,6 +346,7 @@ if(ENABLE_INSTALL)
377346 FILES
378347 cmake/CheckExecinfoBackend.cmake
379348 cmake/CheckLibbacktraceBackend.cmake
349+ cmake/CheckWin32Backend.cmake
380350 cmake/FindLibbacktrace.cmake
381351 DESTINATION ${CMAKE_INSTALL_LIBDIR} /cmake/eggs.stacktrace
382352 )
0 commit comments