summaryrefslogtreecommitdiff
path: root/libphobos/m4/druntime/libraries.m4
blob: 957bf98b442f6df5325418da041ade762d7be027 (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
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
#
# Contains macros to handle library dependencies.
#


# DRUNTIME_LIBRARIES_DLOPEN
# -----------------------
# Autodetect and add dl library to LIBS if necessary.
AC_DEFUN([DRUNTIME_LIBRARIES_DLOPEN],
[
  # Libtool has already checked this, so re-use the inferred dlopen lib.
  AS_IF([test "x$enable_dlopen" = "xyes" && test -n "$lt_cv_dlopen_libs"], [
    LIBS="$LIBS $lt_cv_dlopen_libs"
  ], [
  ])
])


# DRUNTIME_LIBRARIES_NET
# -----------------------
# Autodetect and add networking library to LIBS if necessary.
AC_DEFUN([DRUNTIME_LIBRARIES_NET],
[
  dnl Test for -lsocket and -lnsl.  Copied from libjava/configure.ac.
  AC_CACHE_CHECK([for socket libraries], druntime_cv_lib_sockets,
    [druntime_cv_lib_sockets=
     druntime_check_both=no
     AC_CHECK_FUNC(connect, druntime_check_socket=no, druntime_check_socket=yes)
     if test "$druntime_check_socket" = "yes"; then
       unset ac_cv_func_connect
       AC_CHECK_LIB(socket, main, druntime_cv_lib_sockets="-lsocket",
		    druntime_check_both=yes)
     fi
     if test "$druntime_check_both" = "yes"; then
       druntime_old_libs=$LIBS
       LIBS="$LIBS -lsocket -lnsl"
       unset ac_cv_func_accept
       AC_CHECK_FUNC(accept,
		     [druntime_check_nsl=no
		      druntime_cv_lib_sockets="-lsocket -lnsl"])
       unset ac_cv_func_accept
       LIBS=$druntime_old_libs
     fi
     unset ac_cv_func_gethostbyname
     druntime_old_libs="$LIBS"
     AC_CHECK_FUNC(gethostbyname, ,
		   [AC_CHECK_LIB(nsl, main,
		    [druntime_cv_lib_sockets="$druntime_cv_lib_sockets -lnsl"])])
  ])
  LIBS="$LIBS $druntime_cv_lib_sockets"
])

# DRUNTIME_LIBRARIES_ZLIB
# -----------------------
# Allow specifying whether to use the system zlib or
# compiling the zlib included in GCC.  Adds substitute
# for LIBZ or adds zlib to LIBS if necessary.
AC_DEFUN([DRUNTIME_LIBRARIES_ZLIB],
[
  AC_LANG_PUSH([C])
  LIBZ=""

  AC_ARG_WITH(target-system-zlib,
    AS_HELP_STRING([--with-target-system-zlib={yes,no,auto}],
                   [use installed libz (default: no)]),,
              [with_target_system_zlib=no])

  case "$with_target_system_zlib" in
    yes|no|auto) ;;
    *) AC_MSG_ERROR([Invalid argument for --with-target-system-zlib]) ;;
  esac

  AC_MSG_CHECKING([for system zlib])
  save_LIBS=$LIBS
  LIBS="$LIBS -lz"
  dnl the link test is not good enough for ARM32 multilib detection,
  dnl first check to link, then to run
  AC_LINK_IFELSE(
    [AC_LANG_PROGRAM([#include <zlib.h>],[gzopen("none", "rb")])],
    [
      AC_RUN_IFELSE([AC_LANG_SOURCE([[
        #include <zlib.h>
        int main() {
          gzFile file = gzopen("none", "rb");
          return 0;
        }
        ]])],
        [system_zlib_found=yes],
        [system_zlib_found=no],
        dnl no system zlib for cross builds ...
        [system_zlib_found=no]
      )
    ],
    [system_zlib_found=no])
  LIBS=$save_LIBS

  if test x$system_zlib_found = xyes && test x$with_target_system_zlib != xno; then
    AC_MSG_RESULT([found])
    LIBS="$LIBS -lz"
  elif test x$system_zlib_found = xno && test x$with_target_system_zlib = xyes; then
    AC_MSG_ERROR([system zlib required but not found])
  else
    AC_MSG_RESULT([just compiled])
    LIBZ=../../zlib/libz_convenience.la
  fi

  AC_SUBST(LIBZ)
  AC_LANG_POP([C])
])

# DRUNTIME_LIBRARIES_ATOMIC
# -------------------------
# Allow specifying whether to use libatomic for atomic support.
AC_DEFUN([DRUNTIME_LIBRARIES_ATOMIC],
[
  AC_ARG_WITH(libatomic,
    AS_HELP_STRING([--without-libatomic],
                   [Do not use libatomic in core.atomic (default: auto)]))

  DCFG_HAVE_LIBATOMIC=false
  LIBATOMIC=
  AS_IF([test "x$with_libatomic" != "xno"], [
    DCFG_HAVE_LIBATOMIC=true
    LIBATOMIC=../../libatomic/libatomic_convenience.la
  ], [
    AC_MSG_CHECKING([for libatomic])
    AC_MSG_RESULT([disabled])
  ])

  AC_SUBST(DCFG_HAVE_LIBATOMIC)
  AC_SUBST(LIBATOMIC)
])

# DRUNTIME_LIBRARIES_BACKTRACE
# ---------------------------
# Allow specifying whether to use libbacktrace for backtrace support.
# Adds subsitute for BACKTRACE_SUPPORTED, BACKTRACE_USES_MALLOC,
# and BACKTRACE_SUPPORTS_THREADS.
AC_DEFUN([DRUNTIME_LIBRARIES_BACKTRACE],
[
  AC_LANG_PUSH([C])
  BACKTRACE_SUPPORTED=false
  BACKTRACE_USES_MALLOC=false
  BACKTRACE_SUPPORTS_THREADS=false
  LIBBACKTRACE=""

  AC_ARG_WITH(libbacktrace,
    AS_HELP_STRING([--without-libbacktrace],
                   [Do not use libbacktrace in core.runtime (default: auto)]))

  AS_IF([test "x$with_libbacktrace" != "xno"], [
    LIBBACKTRACE=../../libbacktrace/libbacktrace.la

    gdc_save_CPPFLAGS=$CPPFLAGS
    CPPFLAGS="$CPPFLAGS -I../libbacktrace "

    AC_CHECK_HEADER(backtrace-supported.h, have_libbacktrace_h=true,
      have_libbacktrace_h=false)

    if $have_libbacktrace_h; then
      AC_MSG_CHECKING([libbacktrace: BACKTRACE_SUPPORTED])
      AC_EGREP_CPP(FOUND_LIBBACKTRACE_RESULT_GDC,
      [
      #include <backtrace-supported.h>
      #if BACKTRACE_SUPPORTED
        FOUND_LIBBACKTRACE_RESULT_GDC
      #endif
      ], BACKTRACE_SUPPORTED=true, BACKTRACE_SUPPORTED=false)
      AC_MSG_RESULT($BACKTRACE_SUPPORTED)

      AC_MSG_CHECKING([libbacktrace: BACKTRACE_USES_MALLOC])
      AC_EGREP_CPP(FOUND_LIBBACKTRACE_RESULT_GDC,
      [
      #include <backtrace-supported.h>
      #if BACKTRACE_USES_MALLOC
        FOUND_LIBBACKTRACE_RESULT_GDC
      #endif
      ], BACKTRACE_USES_MALLOC=true, BACKTRACE_USES_MALLOC=false)
      AC_MSG_RESULT($BACKTRACE_USES_MALLOC)

      AC_MSG_CHECKING([libbacktrace: BACKTRACE_SUPPORTS_THREADS])
      AC_EGREP_CPP(FOUND_LIBBACKTRACE_RESULT_GDC,
      [
      #include <backtrace-supported.h>
      #if BACKTRACE_SUPPORTS_THREADS
        FOUND_LIBBACKTRACE_RESULT_GDC
      #endif
      ], BACKTRACE_SUPPORTS_THREADS=true, BACKTRACE_SUPPORTS_THREADS=false)
      AC_MSG_RESULT($BACKTRACE_SUPPORTS_THREADS)
    fi
    CPPFLAGS=$gdc_save_CPPFLAGS
  ], [
    AC_MSG_CHECKING([for libbacktrace])
    AC_MSG_RESULT([disabled])
  ])

  AC_SUBST(LIBBACKTRACE)
  AC_SUBST(BACKTRACE_SUPPORTED)
  AC_SUBST(BACKTRACE_USES_MALLOC)
  AC_SUBST(BACKTRACE_SUPPORTS_THREADS)
  AC_LANG_POP([C])
])

# DRUNTIME_LIBRARIES_CLIB
# -----------------------
# Perform various feature checks on the C library.
AC_DEFUN([DRUNTIME_LIBRARIES_CLIB],
[
  AC_LANG_PUSH([C])
  DCFG_HAVE_QSORT_R=false
  AC_CHECK_FUNC(qsort_r, [DCFG_HAVE_QSORT_R=true])
  AC_SUBST(DCFG_HAVE_QSORT_R)
  AC_LANG_POP([C])
])

# DRUNTIME_LIBRARIES_UCONTEXT
# ------------------------------
# Autodetect and add ucontext library to LIBS if necessary.
# This is only required if fiber_switchContext does not have
# its own internal asm implementation.
AC_DEFUN([DRUNTIME_LIBRARIES_UCONTEXT],
[
  # Keep this in sync with core/thread.d, set druntime_fiber_asm_external to
  # "yes" for targets that have 'version = AsmExternal'.
  druntime_fiber_asm_external=no
  case "$target_cpu" in
    aarch64* | \
    arm* | \
    i[[34567]]86|x86_64 | \
    powerpc)
      druntime_fiber_asm_external=yes
      ;;
  esac
  if test "$druntime_fiber_asm_external" = no; then
    AC_SEARCH_LIBS([swapcontext], [c ucontext], [],
      AC_MSG_ERROR([swapcontext required but not found]))
  fi
])