From 7c243694549cc1d6776873c8a97c99fc5889b68d Mon Sep 17 00:00:00 2001 From: Kurtis Rader Date: Thu, 19 May 2016 19:27:22 -0700 Subject: [PATCH] fix building on Cygwin Cygwin still doesn't support any of the backtrace functions. Also, remove a spurious newline from a debug message. Fixes #2993 --- configure.ac | 4 +--- src/common.cpp | 11 ++++++++++- src/exec.cpp | 2 +- src/fallback.cpp | 8 -------- src/fallback.h | 8 -------- 5 files changed, 12 insertions(+), 21 deletions(-) diff --git a/configure.ac b/configure.ac index 3600ed96e..035ca4f69 100644 --- a/configure.ac +++ b/configure.ac @@ -217,7 +217,6 @@ CXXFLAGS="$CXXFLAGS -Wall -Wno-sign-compare" # # This is needed in order to get the really cool backtraces on Linux # - AC_MSG_CHECKING([for -rdynamic linker flag]) prev_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -rdynamic" @@ -268,7 +267,6 @@ AC_SEARCH_LIBS( shm_open, rt, , [AC_MSG_ERROR([Cannot find the rt library, neede AC_SEARCH_LIBS( pthread_create, pthread, , [AC_MSG_ERROR([Cannot find the pthread library, needed to build this package.] )] ) AC_SEARCH_LIBS( setupterm, [ncurses tinfo curses], , [AC_MSG_ERROR([Could not find a curses implementation, needed to build fish. If this is Linux, try running 'sudo apt-get install libncurses5-dev' or 'sudo yum install ncurses-devel'])] ) AC_SEARCH_LIBS( [nan], [m], [AC_DEFINE( [HAVE_NAN], [1], [Define to 1 if you have the nan function])] ) -AC_SEARCH_LIBS( [backtrace_symbols_fd], [execinfo] ) AC_SEARCH_LIBS( [dladdr], [dl] ) if test x$local_gettext != xno; then @@ -313,7 +311,7 @@ AC_STRUCT_DIRENT_D_TYPE AC_CHECK_FUNCS( wcsndup ) AC_CHECK_FUNCS( futimes ) AC_CHECK_FUNCS( wcslcat wcslcpy lrand48_r killpg ) -AC_CHECK_FUNCS( backtrace backtrace_symbols_fd getifaddrs ) +AC_CHECK_FUNCS( backtrace_symbols getifaddrs ) AC_CHECK_FUNCS( futimens clock_gettime ) AC_CHECK_DECL( [mkostemp], [ AC_CHECK_FUNCS([mkostemp]) ] ) diff --git a/src/common.cpp b/src/common.cpp index b8270ad1f..91b08824c 100644 --- a/src/common.cpp +++ b/src/common.cpp @@ -70,7 +70,9 @@ static volatile bool termsize_valid; static rwlock_t termsize_rwlock; static char *wcs2str_internal(const wchar_t *in, char *out); +static void debug_shared(const wchar_t msg_level, const wcstring &msg); +#ifdef HAVE_BACKTRACE_SYMBOLS // This function produces a stack backtrace with demangled function & method names. It is based on // https://gist.github.com/fmela/591333 but adapted to the style of the fish project. static const wcstring_list_t __attribute__((noinline)) @@ -104,7 +106,6 @@ demangled_backtrace(int max_frames, int skip_levels) { return backtrace_text; } -static void debug_shared(const wchar_t msg_level, const wcstring &msg); void __attribute__((noinline)) show_stackframe(const wchar_t msg_level, int frame_count, int skip_levels) { ASSERT_IS_NOT_FORKED_CHILD(); @@ -124,6 +125,14 @@ void __attribute__((noinline)) show_stackframe(const wchar_t msg_level, int fram } } +#else // HAVE_BACKTRACE_SYMBOLS + +void __attribute__((noinline)) show_stackframe(const wchar_t msg_level, int frame_count, + int skip_levels) { + debug_shared(msg_level, L"Sorry, but your system does not support backtraces"); +} +#endif // HAVE_BACKTRACE_SYMBOLS + int fgetws2(wcstring *s, FILE *f) { int i = 0; wint_t c; diff --git a/src/exec.cpp b/src/exec.cpp index afd09f6aa..aefdbc12d 100644 --- a/src/exec.cpp +++ b/src/exec.cpp @@ -1058,7 +1058,7 @@ void exec_job(parser_t &parser, job_t *j) { // A 0 pid means we failed to posix_spawn. Since we have no pid, we'll never get // told when it's exited, so we have to mark the process as failed. - debug(2, L"Fork #%d, pid %d: spawn external command '%s' from '%ls'\n", + debug(2, L"Fork #%d, pid %d: spawn external command '%s' from '%ls'", g_fork_count, pid, actual_cmd, file ? file : L""); if (pid == 0) { job_mark_process_as_failed(j, p); diff --git a/src/fallback.cpp b/src/fallback.cpp index 96fa417b0..dc5bcce2f 100644 --- a/src/fallback.cpp +++ b/src/fallback.cpp @@ -332,14 +332,6 @@ int killpg(int pgr, int sig) { } #endif -#ifndef HAVE_BACKTRACE -int backtrace(void **buffer, int size) { return 0; } -#endif - -#ifndef HAVE_BACKTRACE_SYMBOLS_FD -char **backtrace_symbols_fd(void *const *buffer, int size, int fd) { return 0; } -#endif - #ifndef HAVE_NAN double nan(char *tagp) { return 0.0 / 0.0; } #endif diff --git a/src/fallback.h b/src/fallback.h index a3143f097..f167ff69f 100644 --- a/src/fallback.h +++ b/src/fallback.h @@ -149,12 +149,4 @@ int killpg(int pgr, int sig); double nan(char *tagp); #endif -#ifndef HAVE_BACKTRACE -int backtrace(void **buffer, int size); -#endif - -#ifndef HAVE_BACKTRACE_SYMBOLS_FD -char **backtrace_symbols_fd(void *const *buffer, int size, int fd); -#endif - #endif