configure: support rustc-demangle installations in the sysroot

Currently, `./configure` supports
`--with-rustc-demangle=${path_to_crate_root}` as the only mechanism to
enable rustc-demangle support. This CL adds support for cases where
keeping or synthesizing a full `cargo` build tree is hacky in comparison
to simply installing `rustc_demangle.h` in e.g., /usr/include, and
putting `librustc_demangle.a` in e.g., `/usr/lib64`.

Bug: b:235999011
Change-Id: Id5fe2a24c4b6e33c4df0e10c86ba99c7cf890ab2
Reviewed-on: https://chromium-review.googlesource.com/c/breakpad/breakpad/+/3733672
Reviewed-by: Mike Frysinger <vapier@chromium.org>
This commit is contained in:
George Burgess IV 2022-06-30 14:30:14 -07:00 committed by Mike Frysinger
parent 3e2a341168
commit 90a0d9a9ff
2 changed files with 126 additions and 4 deletions

95
configure vendored
View file

@ -785,6 +785,7 @@ enable_tools
enable_system_test_libs enable_system_test_libs
enable_selftest enable_selftest
with_rustc_demangle with_rustc_demangle
enable_system_rustc_demangle
with_tests_as_root with_tests_as_root
' '
ac_precious_vars='build_alias ac_precious_vars='build_alias
@ -1454,6 +1455,12 @@ Optional Features:
the local copies (default is local) the local copies (default is local)
--enable-selftest Run extra tests with "make check" (may conflict with --enable-selftest Run extra tests with "make check" (may conflict with
optimizations) (default is no) optimizations) (default is no)
--enable-system-rustc-demangle
Link against the rustc-demangle library to demangle
Rust language symbols during symbol dumping (default
is no). This assumes that rustc-demangle is
installed in your sysroot, and all headers from it
are available in your standard include path
Optional Packages: Optional Packages:
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
@ -7661,14 +7668,98 @@ else
with_rustc_demangle=no with_rustc_demangle=no
fi fi
RUSTC_DEMANGLE_BASE_CFLAGS="-DHAVE_RUSTC_DEMANGLE"
RUSTC_DEMANGLE_BASE_LIBS="-lrustc_demangle -lpthread -ldl"
if test "x${with_rustc_demangle}" != xno; then if test "x${with_rustc_demangle}" != xno; then
if ! test -f "${with_rustc_demangle}/Cargo.toml"; then if ! test -f "${with_rustc_demangle}/Cargo.toml"; then
as_fn_error $? "You must pass the path to the rustc-demangle crate for --with-rustc-demangle" "$LINENO" 5 as_fn_error $? "You must pass the path to the rustc-demangle crate for --with-rustc-demangle" "$LINENO" 5
fi fi
RUSTC_DEMANGLE_CFLAGS="-DHAVE_RUSTC_DEMANGLE -I${with_rustc_demangle}/crates/capi/include" RUSTC_DEMANGLE_CFLAGS="-I${with_rustc_demangle}/crates/capi/include ${RUSTC_DEMANGLE_BASE_CFLAGS}"
RUSTC_DEMANGLE_LIBS="-L${with_rustc_demangle}/target/release -lrustc_demangle -lpthread -ldl" RUSTC_DEMANGLE_LIBS="-L${with_rustc_demangle}/target/release ${RUSTC_DEMANGLE_BASE_LIBS}"
fi fi
# Check whether --enable-system-rustc-demangle was given.
if test "${enable_system_rustc_demangle+set}" = set; then :
enableval=$enable_system_rustc_demangle;
else
enable_system_rustc_demangle=no
fi
if test "x${enable_system_rustc_demangle}" != xno; then
if test "x${with_rustc_demangle}" != xno; then
as_fn_error $? "--enable-system-rustc-demangle and --with-rustc-demangle are mutually exclusive." "$LINENO" 5
fi
RUSTC_DEMANGLE_CFLAGS="${RUSTC_DEMANGLE_BASE_CFLAGS}"
RUSTC_DEMANGLE_LIBS="${RUSTC_DEMANGLE_BASE_LIBS}"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for rustc_demangle in -lrustc_demangle" >&5
$as_echo_n "checking for rustc_demangle in -lrustc_demangle... " >&6; }
if ${ac_cv_lib_rustc_demangle_rustc_demangle+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lrustc_demangle $RUSTC_DEMANGLE_LIBS $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
#ifdef __cplusplus
extern "C"
#endif
char rustc_demangle ();
int
main ()
{
return rustc_demangle ();
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
ac_cv_lib_rustc_demangle_rustc_demangle=yes
else
ac_cv_lib_rustc_demangle_rustc_demangle=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rustc_demangle_rustc_demangle" >&5
$as_echo "$ac_cv_lib_rustc_demangle_rustc_demangle" >&6; }
if test "x$ac_cv_lib_rustc_demangle_rustc_demangle" = xyes; then :
cat >>confdefs.h <<_ACEOF
#define HAVE_LIBRUSTC_DEMANGLE 1
_ACEOF
LIBS="-lrustc_demangle $LIBS"
else
as_fn_error $? "librustc_demangle.a must be present when --enable-system-rustc-demangle is specified" "$LINENO" 5
fi
for ac_header in rustc_demangle.h
do :
ac_fn_c_check_header_mongrel "$LINENO" "rustc_demangle.h" "ac_cv_header_rustc_demangle_h" "$ac_includes_default"
if test "x$ac_cv_header_rustc_demangle_h" = xyes; then :
cat >>confdefs.h <<_ACEOF
#define HAVE_RUSTC_DEMANGLE_H 1
_ACEOF
else
as_fn_error $? "rustc_demangle.h must be present when --enable-system-rustc-demangle is specified" "$LINENO" 5
fi
done
fi

View file

@ -173,13 +173,44 @@ AC_ARG_WITH(rustc-demangle,
[symbol dumping (default is no)] [symbol dumping (default is no)]
[Pass the path to the crate root.]),, [Pass the path to the crate root.]),,
[with_rustc_demangle=no]) [with_rustc_demangle=no])
RUSTC_DEMANGLE_BASE_CFLAGS="-DHAVE_RUSTC_DEMANGLE"
RUSTC_DEMANGLE_BASE_LIBS="-lrustc_demangle -lpthread -ldl"
if test "x${with_rustc_demangle}" != xno; then if test "x${with_rustc_demangle}" != xno; then
if ! test -f "${with_rustc_demangle}/Cargo.toml"; then if ! test -f "${with_rustc_demangle}/Cargo.toml"; then
AC_MSG_ERROR(You must pass the path to the rustc-demangle crate for --with-rustc-demangle) AC_MSG_ERROR(You must pass the path to the rustc-demangle crate for --with-rustc-demangle)
fi fi
RUSTC_DEMANGLE_CFLAGS="-DHAVE_RUSTC_DEMANGLE -I${with_rustc_demangle}/crates/capi/include" RUSTC_DEMANGLE_CFLAGS="-I${with_rustc_demangle}/crates/capi/include ${RUSTC_DEMANGLE_BASE_CFLAGS}"
RUSTC_DEMANGLE_LIBS="-L${with_rustc_demangle}/target/release -lrustc_demangle -lpthread -ldl" RUSTC_DEMANGLE_LIBS="-L${with_rustc_demangle}/target/release ${RUSTC_DEMANGLE_BASE_LIBS}"
fi fi
AC_ARG_ENABLE(system-rustc-demangle,
AS_HELP_STRING([--enable-system-rustc-demangle],
[Link against the rustc-demangle library]
[to demangle Rust language symbols during]
[symbol dumping (default is no). This assumes]
[that rustc-demangle is installed in your sysroot,]
[and all headers from it are available in your]
[standard include path]
),,
[enable_system_rustc_demangle=no])
if test "x${enable_system_rustc_demangle}" != xno; then
if test "x${with_rustc_demangle}" != xno; then
AC_MSG_ERROR([--enable-system-rustc-demangle and --with-rustc-demangle are mutually exclusive.])
fi
RUSTC_DEMANGLE_CFLAGS="${RUSTC_DEMANGLE_BASE_CFLAGS}"
RUSTC_DEMANGLE_LIBS="${RUSTC_DEMANGLE_BASE_LIBS}"
AC_CHECK_LIB([rustc_demangle], [rustc_demangle], [],
[AC_MSG_ERROR(librustc_demangle.a must be present when --enable-system-rustc-demangle is specified)],
[$RUSTC_DEMANGLE_LIBS])
AC_CHECK_HEADERS(rustc_demangle.h, [],
[AC_MSG_ERROR(rustc_demangle.h must be present when --enable-system-rustc-demangle is specified)])
fi
AC_ARG_VAR([RUSTC_DEMANGLE_CFLAGS], [Compiler flags for rustc-demangle]) AC_ARG_VAR([RUSTC_DEMANGLE_CFLAGS], [Compiler flags for rustc-demangle])
AC_ARG_VAR([RUSTC_DEMANGLE_LIBS], [Linker flags for rustc-demangle]) AC_ARG_VAR([RUSTC_DEMANGLE_LIBS], [Linker flags for rustc-demangle])