1#
2# Contains macros to handle library dependencies.
3#
4
5
6# DRUNTIME_LIBRARIES_DLOPEN
7# -----------------------
8# Autodetect and add dl library to LIBS if necessary.
9AC_DEFUN([DRUNTIME_LIBRARIES_DLOPEN],
10[
11  # Libtool has already checked this, so re-use the inferred dlopen lib.
12  AS_IF([test "x$enable_dlopen" = "xyes" && test -n "$lt_cv_dlopen_libs"], [
13    LIBS="$LIBS $lt_cv_dlopen_libs"
14  ], [
15  ])
16])
17
18
19# DRUNTIME_LIBRARIES_NET
20# -----------------------
21# Autodetect and add networking library to LIBS if necessary.
22AC_DEFUN([DRUNTIME_LIBRARIES_NET],
23[
24  dnl Check for the existence of the -lsocket and -lnsl libraries.
25  dnl The order here is important, so that they end up in the right
26  dnl order in the command line generated by make.  Here are some
27  dnl special considerations:
28  dnl 1. Use "connect" and "accept" to check for -lsocket, and
29  dnl    "gethostbyname" to check for -lnsl.
30  dnl 2. Use each function name only once:  can't redo a check because
31  dnl    autoconf caches the results of the last check and won't redo it.
32  dnl 3. Use -lnsl and -lsocket only if they supply procedures that
33  dnl    aren't already present in the normal libraries.
34  dnl 4. On some systems, can't use -lsocket without -lnsl too.
35  dnl    To get around this problem, check for both libraries together
36  dnl    if -lsocket doesn't work by itself.
37  druntime_check_both=no
38  AC_CHECK_FUNC(connect, ,
39	[AC_CHECK_LIB(socket, connect,
40	 LIBS="$LIBS -lsocket", druntime_check_both=yes)])
41  if test "$druntime_check_both" = "yes"; then
42    druntime_old_libs=$LIBS
43    LIBS="$LIBS -lsocket -lnsl"
44    AC_CHECK_FUNC(accept, , LIBS=$druntime_old_libs)
45  fi
46  AC_CHECK_FUNC(gethostbyname, ,
47	[AC_CHECK_LIB(nsl, gethostbyname, LIBS="$LIBS -lnsl")])
48])
49
50# DRUNTIME_LIBRARIES_ZLIB
51# -----------------------
52# Allow specifying whether to use the system zlib or
53# compiling the zlib included in GCC.  Adds substitute
54# for LIBZ or adds zlib to LIBS if necessary.
55AC_DEFUN([DRUNTIME_LIBRARIES_ZLIB],
56[
57  AC_LANG_PUSH([C])
58  LIBZ=""
59
60  AC_ARG_WITH(target-system-zlib,
61    AS_HELP_STRING([--with-target-system-zlib={yes,no,auto}],
62                   [use installed libz (default: no)]),,
63              [with_target_system_zlib=no])
64
65  case "$with_target_system_zlib" in
66    yes|no|auto) ;;
67    *) AC_MSG_ERROR([Invalid argument for --with-target-system-zlib]) ;;
68  esac
69
70  AC_MSG_CHECKING([for system zlib])
71  save_LIBS=$LIBS
72  LIBS="$LIBS -lz"
73  dnl the link test is not good enough for ARM32 multilib detection,
74  dnl first check to link, then to run
75  AC_LINK_IFELSE(
76    [AC_LANG_PROGRAM([#include <zlib.h>],[gzopen("none", "rb")])],
77    [
78      AC_RUN_IFELSE([AC_LANG_SOURCE([[
79        #include <zlib.h>
80        int main() {
81          gzFile file = gzopen("none", "rb");
82          return 0;
83        }
84        ]])],
85        [system_zlib_found=yes],
86        [system_zlib_found=no],
87        dnl no system zlib for cross builds ...
88        [system_zlib_found=no]
89      )
90    ],
91    [system_zlib_found=no])
92  LIBS=$save_LIBS
93
94  if test x$system_zlib_found = xyes && test x$with_target_system_zlib != xno; then
95    AC_MSG_RESULT([found])
96    LIBS="$LIBS -lz"
97  elif test x$system_zlib_found = xno && test x$with_target_system_zlib = xyes; then
98    AC_MSG_ERROR([system zlib required but not found])
99  else
100    AC_MSG_RESULT([just compiled])
101    LIBZ=../../zlib/libz_convenience.la
102  fi
103
104  AC_SUBST(LIBZ)
105  AC_LANG_POP([C])
106])
107
108# DRUNTIME_LIBRARIES_ATOMIC
109# -------------------------
110# Allow specifying whether to use libatomic for atomic support.
111AC_DEFUN([DRUNTIME_LIBRARIES_ATOMIC],
112[
113  AC_ARG_WITH(libatomic,
114    AS_HELP_STRING([--without-libatomic],
115                   [Do not use libatomic in core.atomic (default: auto)]))
116
117  DCFG_HAVE_LIBATOMIC=false
118  LIBATOMIC=
119  AS_IF([test "x$enable_libatomic" != "xno" && test "x$with_libatomic" != "xno"], [
120    DCFG_HAVE_LIBATOMIC=true
121    LIBATOMIC=../../libatomic/libatomic_convenience.la
122  ], [
123    AC_MSG_CHECKING([for libatomic])
124    AC_MSG_RESULT([disabled])
125  ])
126
127  AC_SUBST(DCFG_HAVE_LIBATOMIC)
128  AC_SUBST(LIBATOMIC)
129])
130
131# DRUNTIME_LIBRARIES_BACKTRACE
132# ---------------------------
133# Allow specifying whether to use libbacktrace for backtrace support.
134# Adds subsitute for BACKTRACE_SUPPORTED, BACKTRACE_USES_MALLOC,
135# and BACKTRACE_SUPPORTS_THREADS.
136AC_DEFUN([DRUNTIME_LIBRARIES_BACKTRACE],
137[
138  AC_LANG_PUSH([C])
139  BACKTRACE_SUPPORTED=false
140  BACKTRACE_USES_MALLOC=false
141  BACKTRACE_SUPPORTS_THREADS=false
142  LIBBACKTRACE=""
143
144  AC_ARG_WITH(libbacktrace,
145    AS_HELP_STRING([--without-libbacktrace],
146                   [Do not use libbacktrace in core.runtime (default: auto)]))
147
148  AS_IF([test "x$enable_libbacktrace" != "xno" && test "x$with_libbacktrace" != "xno"], [
149    LIBBACKTRACE=../../libbacktrace/libbacktrace.la
150
151    gdc_save_CPPFLAGS=$CPPFLAGS
152    CPPFLAGS="$CPPFLAGS -I../libbacktrace "
153
154    AC_CHECK_HEADER(backtrace-supported.h, have_libbacktrace_h=true,
155      have_libbacktrace_h=false)
156
157    if $have_libbacktrace_h; then
158      AC_MSG_CHECKING([libbacktrace: BACKTRACE_SUPPORTED])
159      AC_EGREP_CPP(FOUND_LIBBACKTRACE_RESULT_GDC,
160      [
161      #include <backtrace-supported.h>
162      #if BACKTRACE_SUPPORTED
163        FOUND_LIBBACKTRACE_RESULT_GDC
164      #endif
165      ], BACKTRACE_SUPPORTED=true, BACKTRACE_SUPPORTED=false)
166      AC_MSG_RESULT($BACKTRACE_SUPPORTED)
167
168      AC_MSG_CHECKING([libbacktrace: BACKTRACE_USES_MALLOC])
169      AC_EGREP_CPP(FOUND_LIBBACKTRACE_RESULT_GDC,
170      [
171      #include <backtrace-supported.h>
172      #if BACKTRACE_USES_MALLOC
173        FOUND_LIBBACKTRACE_RESULT_GDC
174      #endif
175      ], BACKTRACE_USES_MALLOC=true, BACKTRACE_USES_MALLOC=false)
176      AC_MSG_RESULT($BACKTRACE_USES_MALLOC)
177
178      AC_MSG_CHECKING([libbacktrace: BACKTRACE_SUPPORTS_THREADS])
179      AC_EGREP_CPP(FOUND_LIBBACKTRACE_RESULT_GDC,
180      [
181      #include <backtrace-supported.h>
182      #if BACKTRACE_SUPPORTS_THREADS
183        FOUND_LIBBACKTRACE_RESULT_GDC
184      #endif
185      ], BACKTRACE_SUPPORTS_THREADS=true, BACKTRACE_SUPPORTS_THREADS=false)
186      AC_MSG_RESULT($BACKTRACE_SUPPORTS_THREADS)
187    fi
188    CPPFLAGS=$gdc_save_CPPFLAGS
189  ], [
190    AC_MSG_CHECKING([for libbacktrace])
191    AC_MSG_RESULT([disabled])
192  ])
193
194  AC_SUBST(LIBBACKTRACE)
195  AC_SUBST(BACKTRACE_SUPPORTED)
196  AC_SUBST(BACKTRACE_USES_MALLOC)
197  AC_SUBST(BACKTRACE_SUPPORTS_THREADS)
198  AC_LANG_POP([C])
199])
200
201# DRUNTIME_LIBRARIES_CLIB
202# -----------------------
203# Perform various feature checks on the C library.
204AC_DEFUN([DRUNTIME_LIBRARIES_CLIB],
205[
206  AC_LANG_PUSH([C])
207  DCFG_HAVE_QSORT_R=false
208  AC_CHECK_FUNC(qsort_r, [DCFG_HAVE_QSORT_R=true])
209  AC_SUBST(DCFG_HAVE_QSORT_R)
210  AC_LANG_POP([C])
211])
212
213# DRUNTIME_LIBRARIES_UCONTEXT
214# ------------------------------
215# Autodetect and add ucontext library to LIBS if necessary.
216# This is only required if fiber_switchContext does not have
217# its own internal asm implementation.
218AC_DEFUN([DRUNTIME_LIBRARIES_UCONTEXT],
219[
220  # Keep this in sync with core/thread.d, set druntime_fiber_asm_external to
221  # "yes" for targets that have 'version = AsmExternal'.
222  druntime_fiber_asm_external=no
223  case "$target_cpu" in
224    aarch64* | \
225    arm* | \
226    i[[34567]]86|x86_64 | \
227    powerpc)
228      druntime_fiber_asm_external=yes
229      ;;
230  esac
231  if test "$druntime_fiber_asm_external" = no; then
232    AC_SEARCH_LIBS([swapcontext], [c ucontext], [],
233      AC_MSG_ERROR([swapcontext required but not found]))
234  fi
235])
236