Skip to content

Commit 4fc2efb

Browse files
Explorer09MrCirdoBenBE
committed
build: Add '--enable-demangling' configure option
Co-authored-by: Odric Roux-Paris <[email protected]> Co-authored-by: Benny Baumann <[email protected]> Signed-off-by: Kang-Che Sung <[email protected]>
1 parent 026ed69 commit 4fc2efb

File tree

1 file changed

+132
-0
lines changed

1 file changed

+132
-0
lines changed

configure.ac

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1292,6 +1292,137 @@ case $enable_backtrace in
12921292
esac
12931293
AM_CONDITIONAL([HAVE_BACKTRACE_SCREEN], [test "$enable_backtrace" != no])
12941294

1295+
AC_ARG_ENABLE(
1296+
[demangling],
1297+
[AS_HELP_STRING(
1298+
[--enable-demangling=BACKEND],
1299+
[enable demangling support for backtraces; available backends: libiberty libdemangle @<:@default=check@:>@]
1300+
)],
1301+
[],
1302+
[enable_demangling=check]
1303+
)
1304+
1305+
demangling_backend_found=no
1306+
have_libiberty=no
1307+
have_libdemangle=no
1308+
case $enable_demangling in
1309+
check|yes)
1310+
have_libiberty=check
1311+
have_libdemangle=check
1312+
;;
1313+
libiberty|iberty|liberty)
1314+
have_libiberty=check
1315+
enable_demangling=libiberty
1316+
;;
1317+
libdemangle)
1318+
have_libdemangle=check
1319+
;;
1320+
esac
1321+
1322+
demangle_header_paths=''
1323+
1324+
if test "$have_libiberty" != no; then
1325+
AC_CHECK_LIB(
1326+
[iberty],
1327+
[cplus_demangle],
1328+
[demangle_header_paths="/usr/local/include/libiberty /usr/include/libiberty"],
1329+
[have_libiberty=no]
1330+
)
1331+
fi
1332+
if test "$have_libdemangle" != no; then
1333+
AC_CHECK_LIB([demangle], [cplus_demangle], [:], [have_libdemangle=no])
1334+
fi
1335+
1336+
if test "$have_libiberty$have_libdemangle" != nono; then
1337+
if htop_search_header_dir demangle.h "$demangle_header_paths"; then
1338+
AC_DEFINE([HAVE_DEMANGLE_H], 1, [Define to 1 if you have the <demangle.h> header file.])
1339+
else
1340+
have_libiberty=no
1341+
have_libdemangle=no
1342+
fi
1343+
fi
1344+
1345+
htop_save_CPPFLAGS=$CPPFLAGS
1346+
htop_save_LIBS=$LIBS
1347+
CPPFLAGS="$AM_CPPFLAGS $CPPFLAGS"
1348+
1349+
if test "$demangling_backend_found" = no && test "$have_libiberty" != no; then
1350+
LIBS="-liberty $htop_save_LIBS"
1351+
1352+
AC_MSG_CHECKING([whether libiberty cplus_demangle works])
1353+
AC_LINK_IFELSE(
1354+
[AC_LANG_PROGRAM(
1355+
[[
1356+
#include <demangle.h>
1357+
#include <stdlib.h>
1358+
/* char* cplus_demangle(const char* mangled, int options); */
1359+
]], [[
1360+
char* demangled = cplus_demangle("", DMGL_AUTO);
1361+
free(demangled);
1362+
]]
1363+
)], [
1364+
AC_MSG_RESULT([yes])
1365+
have_libiberty=yes
1366+
demangling_backend_found=yes
1367+
enable_demangling=libiberty
1368+
AC_DEFINE([HAVE_LIBIBERTY_CPLUS_DEMANGLE], [1], [Define to 1 if libiberty supports cplus_demangle function.])
1369+
], [
1370+
AC_MSG_RESULT([no])
1371+
have_libiberty=no
1372+
LIBS=$htop_save_LIBS
1373+
]
1374+
)
1375+
fi
1376+
1377+
if test "$demangling_backend_found" = no && test "$have_libdemangle" != no; then
1378+
LIBS="-ldemangle $htop_save_LIBS"
1379+
1380+
AC_MSG_CHECKING([whether libdemangle cplus_demangle works])
1381+
AC_LINK_IFELSE(
1382+
[AC_LANG_PROGRAM(
1383+
[[
1384+
#include <demangle.h>
1385+
/* int cplus_demangle(const char* symbol, char* interpretation, size_t size); */
1386+
]], [[
1387+
static char demangled[1];
1388+
int ret = cplus_demangle("", demangled, sizeof(demangled));
1389+
if (ret == DEMANGLE_ENAME) {
1390+
ret = 0;
1391+
}
1392+
return (ret <= 0 && ret > -126 ? ret : 1);
1393+
]]
1394+
)], [
1395+
AC_MSG_RESULT([yes])
1396+
have_libdemangle=yes
1397+
demangling_backend_found=yes
1398+
enable_demangling=libdemangle
1399+
AC_DEFINE([HAVE_LIBDEMANGLE_CPLUS_DEMANGLE], [1], [Define to 1 if libdemangle supports cplus_demangle function.])
1400+
], [
1401+
AC_MSG_RESULT([no])
1402+
have_libdemangle=no
1403+
LIBS=$htop_save_LIBS
1404+
]
1405+
)
1406+
fi
1407+
1408+
CPPFLAGS=$htop_save_CPPFLAGS
1409+
1410+
case $enable_demangling in
1411+
no|check)
1412+
enable_demangling=no
1413+
;;
1414+
yes)
1415+
AC_MSG_ERROR([did not find any backend for --enable-demangling])
1416+
;;
1417+
*)
1418+
if test "$demangling_backend_found" = no; then
1419+
AC_MSG_ERROR([backend '$enable_demangling' for --enable-demangling is not supported or not found])
1420+
fi
1421+
AC_DEFINE([HAVE_DEMANGLING], [1], [Define to 1 if the demangling is supported.])
1422+
;;
1423+
esac
1424+
AM_CONDITIONAL([HAVE_DEMANGLING], [test "$have_demangling" != no])
1425+
12951426
AC_ARG_ENABLE(
12961427
[hwloc],
12971428
[AS_HELP_STRING(
@@ -1728,6 +1859,7 @@ AC_MSG_RESULT([
17281859
unicode: $enable_unicode
17291860
affinity: $enable_affinity
17301861
backtrace: $enable_backtrace
1862+
demangling: $enable_demangling
17311863
hwloc: $enable_hwloc
17321864
debug: $enable_debug
17331865
static: $enable_static

0 commit comments

Comments
 (0)