autotools: improve libunwind detection

Libuwind may not be shipped with a pkg-config file.
It can be distributed on the system, but the autotools
would fail to detect it because it relied only on pkg-config.

We now first check with pkg-config, and then try to compile and
link a program using libuwind to see if it is supported anyway.

This is a first step towards a working eina_log_backtrace on
Mac OS X.
This commit is contained in:
Jean Guyomarc'h 2016-05-28 13:07:22 +02:00
parent 01c7fd7cda
commit 0193600e48
2 changed files with 62 additions and 5 deletions

View File

@ -865,11 +865,7 @@ case "${build_profile}" in
;;
esac
PKG_CHECK_MODULES(UNWIND, [libunwind libunwind-generic],
[have_unwind=yes], [have_unwind=no])
AS_IF([test "x$have_unwind" = "xyes"],
[AC_DEFINE([HAVE_UNWIND], [1], [Have libunwind])])
AM_CONDITIONAL(HAVE_UNWIND, test "x$have_unwind" = "xyes")
EFL_CHECK_LIBUNWIND
EINA_CONFIG([HAVE_ALLOCA_H], [test "x${ac_cv_working_alloca_h}" = "xyes"])
EINA_CONFIG([SAFETY_CHECKS], [test "x${have_safety_checks}" = "xyes"])

61
m4/efl_libunwind.m4 Normal file
View File

@ -0,0 +1,61 @@
dnl This code is public domain and can be freely used or copied.
dnl File to auto-detect libunwind
dnl Macro that checks for libunwind, first by using
dnl pkg-config, then by trying to compile and link a simple
dnl program, to see if libunwind is distributed on the system
dnl but has no pkg-config support
dnl
dnl The biggest usecase is on Mac OS X, where there are no
dnl pkg-config files, and the libunwind headers are lost
dnl in an obscure place on the system (but whom the compilers
dnl distributed by Apple are aware of).
dnl
dnl Usage: EFL_CHECK_LIBUNWIND
dnl will inconditionaly set UNWIND_CFLAGS and UNWIND_LIBS
dnl to follow pkg-config fashion.
dnl
AC_DEFUN([EFL_CHECK_LIBUNWIND],
[dnl
dnl First, check with pkg-config
PKG_CHECK_MODULES([UNWIND], [libunwind libunwind-generic],
[have_unwind=yes], [have_unwind=no])
dnl No pkg-config file... maybe system built-in?
if test "x${have_unwind}" = "xno"; then
AC_LANG_PUSH([C])
AC_LINK_IFELSE(
[AC_LANG_PROGRAM(
[[
#include <libunwind.h>
]],
[[
unw_context_t ctx;
unw_getcontext(&ctx);
]]
)],
[
have_unwind="yes"
],
[
have_unwind="no"
]
)
AC_MSG_CHECKING([for native libunwind])
AC_MSG_RESULT([${have_unwind}])
AC_LANG_POP([C])
dnl Provide dummy variables to automake.
dnl In case pkg-config succeeded, these will be set and
dnl used in other automake files. To avoid, problems,
dnl we define empty variables.
UNWIND_CFLAGS=""
UNWIND_LIBS=""
AC_SUBST([UNWIND_CFLAGS])
AC_SUBST([UNWIND_LIBS])
fi
AS_IF([test "x$have_unwind" = "xyes"],
[AC_DEFINE([HAVE_UNWIND], [1], [Have libunwind])])
AM_CONDITIONAL(HAVE_UNWIND, test "x$have_unwind" = "xyes")
])