@@ -1292,6 +1292,137 @@ case $enable_backtrace in
12921292esac
12931293AM_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+
12951426AC_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