diff --git a/awesomeConfig.cmake b/awesomeConfig.cmake index 08fc32853..25cf6cdbf 100644 --- a/awesomeConfig.cmake +++ b/awesomeConfig.cmake @@ -165,6 +165,17 @@ endmacro() # Check for libev a_find_library(LIB_EV ev) +# GNU libc has and backtrace() stuff. If this is not available, we +# need libexecinfo. +try_compile(HAS_EXECINFO + ${CMAKE_BINARY_DIR} + ${CMAKE_SOURCE_DIR}/build-tests/execinfo.c) +if(NOT HAS_EXECINFO) + a_find_library(LIB_EXECINFO execinfo) + set(AWESOME_REQUIRED_LIBRARIES + ${AWESOME_REQUIRED_LIBRARIES} + ${LIB_EXECINFO}) +endif() # Error check if(NOT LUA51_FOUND AND NOT LUA50_FOUND) # This is a workaround to a cmake bug diff --git a/build-tests/execinfo.c b/build-tests/execinfo.c new file mode 100644 index 000000000..280392308 --- /dev/null +++ b/build-tests/execinfo.c @@ -0,0 +1,42 @@ +/* + * build-tests/execinfo.c + * stolen from http://www.gnu.org/s/libc/manual/html_node/Backtraces.html + */ +#include +#include +#include + +/* Obtain a backtrace and print it to stdout. */ +void +print_trace (void) +{ + void *array[10]; + size_t size; + char **strings; + size_t i; + + size = backtrace (array, 10); + strings = backtrace_symbols (array, size); + + printf ("Obtained %zd stack frames.\n", size); + + for (i = 0; i < size; i++) + printf ("%s\n", strings[i]); + + free (strings); +} + +/* A dummy function to make the backtrace more interesting. */ +void +dummy_function (void) +{ + print_trace (); +} + +int +main (void) +{ + dummy_function (); + return 0; +} +