summaryrefslogtreecommitdiff
path: root/libguile/whippet/whippet.m4
diff options
context:
space:
mode:
Diffstat (limited to 'libguile/whippet/whippet.m4')
-rw-r--r--libguile/whippet/whippet.m4181
1 files changed, 181 insertions, 0 deletions
diff --git a/libguile/whippet/whippet.m4 b/libguile/whippet/whippet.m4
new file mode 100644
index 000000000..9cd5c3449
--- /dev/null
+++ b/libguile/whippet/whippet.m4
@@ -0,0 +1,181 @@
+AC_DEFUN([WHIPPET_ENABLE_LTO],
+ [AC_REQUIRE([AC_PROG_CC])
+ AC_MSG_CHECKING([whether the compiler supports -flto])
+ old_CFLAGS="$CFLAGS"
+ LTO_CFLAGS="-flto"
+ CFLAGS="$CFLAGS $LTO_CFLAGS"
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([int foo;], [])],, [LTO_CFLAGS=])
+ CFLAGS="$old_CFLAGS"
+ if test -n "$LTO_CFLAGS"; then
+ AC_MSG_RESULT([yes])
+ else
+ AC_MSG_RESULT([no])
+ fi
+
+ AC_ARG_ENABLE(lto,
+ [AS_HELP_STRING([--enable-lto]
+ [enable link-time optimization])],
+ [],
+ [if test -z "$LTO_CFLAGS"; then enable_lto=no; else enable_lto=yes; fi])
+ case "$enable_lto" in
+ yes | y)
+ if test -z "$LTO_CFLAGS"; then
+ AC_MSG_ERROR([--enable-lto=$enable_lto unsupported for $CC])
+ fi
+ CFLAGS="$CFLAGS $LTO_CFLAGS"
+ AC_MSG_CHECKING([for lto-specific prefix for ar, nm, objcopy, ranlib])
+ if test "$GCC" = yes; then
+ TOOLCHAIN_PREFIX=gcc
+ else
+ # Assuming LLVM if not GCC. Probably won't hurt.
+ TOOLCHAIN_PREFIX=llvm
+ fi
+ AC_MSG_RESULT([$TOOLCHAIN_PREFIX])
+ AC_CHECK_TOOLS([AR], [$TOOLCHAIN_PREFIX-ar ar])
+ AC_CHECK_TOOLS([NM], [$TOOLCHAIN_PREFIX-nm nm])
+ AC_CHECK_TOOLS([OBJCOPY], [$TOOLCHAIN_PREFIX-objcopy objcopy])
+ AC_CHECK_TOOLS([RANLIB], [$TOOLCHAIN_PREFIX-ranlib ranlib])
+ ;;
+ no | n)
+ ;;
+ *)
+ AC_MSG_ERROR([unexpected --enable-lto=$enable_lto])
+ ;;
+ esac])
+
+AC_DEFUN([WHIPPET_PKG_PLATFORM],
+ [# Detect the target system
+ AC_MSG_CHECKING([which platform support library the garbage collector should use])
+ case "$host_os" in
+ *linux-gnu*)
+ AC_MSG_RESULT(gnu-linux)
+ whippet_platform=gnu-linux
+ ;;
+ *)
+ AC_MSG_ERROR([unsupported host OS: $host_os])
+ ;;
+ esac
+ AM_CONDITIONAL(WHIPPET_PLATFORM_GNU_LINUX, [test "$whippet_platform" = gnu-linux])])
+
+AC_DEFUN([WHIPPET_PKG_TRACING],
+ [WHIPPET_TRACING_DEFAULT="m4_default([$1], [auto])"
+ AC_ARG_WITH(gc-lttng,
+ AS_HELP_STRING([--with-gc-lttng],
+ [Compile GC library with LTTng tracing support (default: $WHIPPET_TRACING_DEFAULT)]),
+ [whippet_with_lttng=$withval],
+ [whippet_with_lttng=auto])
+ PKG_CHECK_MODULES(WHIPPET_LTTNG, lttng-ust,
+ [whippet_have_lttng=yes], [whippet_have_lttng=no])
+ AC_MSG_CHECKING(whether to compile GC library with LTTng tracing support)
+ if test "$whippet_with_lttng" = auto; then
+ if test "$whippet_have_lttng" = no; then
+ whippet_use_lttng=no
+ else
+ whippet_use_lttng=yes
+ fi
+ else
+ whippet_use_lttng=$whippet_with_lttng
+ fi
+ AC_MSG_RESULT($whippet_use_lttng)
+
+ if test "$whippet_use_lttng" != no && test "$whippet_have_lttng" = no; then
+ AC_MSG_ERROR([LTTng support explicitly required, but lttng not found])
+ fi
+ AM_CONDITIONAL(WHIPPET_USE_LTTNG, [test "$whippet_use_lttng" != no])
+ AC_SUBST(WHIPPET_LTTNG_CFLAGS)
+ AC_SUBST(WHIPPET_LTTNG_LIBS)])
+
+AC_DEFUN([WHIPPET_PKG_COLLECTOR],
+ [PKG_CHECK_MODULES(WHIPPET_BDW, bdw-gc,
+ [whippet_have_bdw=yes], [whippet_have_bdw=no])
+ AC_SUBST(WHIPPET_BDW_CFLAGS)
+ AC_SUBST(WHIPPET_BDW_LIBS)
+
+ WHIPPET_COLLECTOR_DEFAULT="m4_default([$1], [pcc])"
+ AC_ARG_WITH(gc,
+ AS_HELP_STRING([--with-gc],
+ [Select garbage collector implementation (see --with-gc=help)]),
+ [whippet_collector=$withval],
+ [whippet_collector=$WHIPPET_COLLECTOR_DEFAULT])
+
+ WHIPPET_ALL_COLLECTORS=$(echo <<END
+Available garbage collection implementations (--with-gc=GC values):
+ semi serial copying
+ pcc parallel copying
+ generational-pcc generational parallel copying
+ bdw third-party BDW-GC parallel mark-sweep
+ mmc serial immix
+ generational-mmc mmc + in-place generations
+ parallel-mmc mmc + parallel tracing
+ stack-conservative-mmc mmc + conservative stack root finding
+ heap-conservative-mmc stack-conservative-mmc + conservative heap edges
+ stack-conservative-parallel-mmc
+ heap-conservative-parallel-mmc
+ stack-conservative-generational-mmc
+ heap-conservative-generational-mmc
+ parallel-generational-mmc
+ stack-conservative-parallel-generational-mmc
+ heap-conservative-parallel-generational-mmc
+ combinations of the above
+
+The default collector is $WHIPPET_COLLECTOR_DEFAULT.
+END
+)
+
+ if test "$whippet_collector" = help; then
+ echo "$WHIPPET_ALL_COLLECTORS"
+ exit 0
+ fi
+
+ WHIPPET_COLLECTOR_SEMI=false
+ WHIPPET_COLLECTOR_PCC=false
+ WHIPPET_COLLECTOR_BDW=false
+ WHIPPET_COLLECTOR_MMC=false
+ AC_MSG_CHECKING([for which garbage collector implementation to use])
+ case "$whippet_collector" in
+ semi)
+ WHIPPET_COLLECTOR_SEMI=true
+ ;;
+ pcc | generational-pcc)
+ WHIPPET_COLLECTOR_PCC=true
+ ;;
+ bdw)
+ WHIPPET_COLLECTOR_BDW=true
+ ;;
+ mmc | generational-mmc | parallel-mmc | parallel-generational-mmc | \
+ stack-conservative-mmc | stack-conservative-generational-mmc | \
+ stack-conservative-parallel-mmc | stack-conservative-parallel-generational-mmc | \
+ heap-conservative-mmc | heap-conservative-generational-mmc | \
+ heap-conservative-parallel-mmc | heap-conservative-parallel-generational-mmc)
+ WHIPPET_COLLECTOR_MMC=true
+ ;;
+ *)
+ AC_MSG_RESULT([unrecognized collector: $whippet_collector; try --with-gc=help])
+ exit 1
+ ;;
+ esac
+ WHIPPET_COLLECTOR=$whippet_collector
+ AC_MSG_RESULT($WHIPPET_COLLECTOR)
+ AC_SUBST(WHIPPET_COLLECTOR)
+ AM_CONDITIONAL(WHIPPET_COLLECTOR_SEMI, $WHIPPET_COLLECTOR_SEMI)
+ AM_CONDITIONAL(WHIPPET_COLLECTOR_PCC, $WHIPPET_COLLECTOR_PCC)
+ AM_CONDITIONAL(WHIPPET_COLLECTOR_BDW, $WHIPPET_COLLECTOR_BDW)
+ AM_CONDITIONAL(WHIPPET_COLLECTOR_MMC, $WHIPPET_COLLECTOR_MMC)
+
+ if $WHIPPET_COLLECTOR_BDW && test "$whippet_have_bdw" != yes; then
+ AC_MSG_ERROR(BDW-GC collector selected but BDW library not found)
+ fi])
+
+AC_DEFUN([WHIPPET_PKG_DEBUG],
+ [AC_ARG_WITH(whippet-debug,
+ AS_HELP_STRING([--with-gc-debug],
+ [Compile GC library with debugging support (default: no)]),
+ [whippet_with_debug=$withval],
+ [whippet_with_debug=no])
+ AM_CONDITIONAL(WHIPPET_ENABLE_DEBUG, [test "$whippet_with_debug" != no])])
+
+AC_DEFUN([WHIPPET_PKG],
+ [AC_REQUIRE([WHIPPET_PKG_PLATFORM])
+ AC_REQUIRE([WHIPPET_PKG_TRACING])
+ AC_REQUIRE([WHIPPET_PKG_COLLECTOR])
+ AC_REQUIRE([WHIPPET_PKG_DEBUG])])