summaryrefslogtreecommitdiff
path: root/libguile/whippet/whippet.m4
blob: f364d197318f12607eabdca6a5c03c80425e6deb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
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_BDW],
 [AC_MSG_CHECKING(for which bdw-gc pkg-config file to use)
  AC_ARG_WITH(bdw-gc,
    AS_HELP_STRING([--with-bdw-gc], [Name of BDW-GC pkg-config file]),
    [bdw_gc="$withval"], [bdw_gc=bdw-gc])
  AC_MSG_RESULT($bdw_gc)
  WHIPPET_BDW_GC=$bdw_gc])

AC_DEFUN([WHIPPET_PKG_COLLECTOR],
 [AC_REQUIRE([WHIPPET_PKG_BDW])
  PKG_CHECK_MODULES(WHIPPET_BDW, $WHIPPET_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])])