145
|
1 #
|
|
2 # Contains macros to detect OS features.
|
|
3 #
|
|
4
|
|
5
|
|
6 # DRUNTIME_OS_THREAD_MODEL
|
|
7 # ------------------------
|
|
8 # Detect thread model and substitute DCFG_THREAD_MODEL
|
|
9 AC_DEFUN([DRUNTIME_OS_THREAD_MODEL],
|
|
10 [
|
|
11 AC_REQUIRE([AC_PROG_GDC])
|
|
12 AC_MSG_CHECKING([for thread model used by GDC])
|
|
13 d_thread_model=`$GDC -v 2>&1 | sed -n 's/^Thread model: //p'`
|
|
14 AC_MSG_RESULT([$d_thread_model])
|
|
15
|
|
16 # Map from thread model to thread interface.
|
|
17 DRUNTIME_CONFIGURE_THREADS([$d_thread_model])
|
|
18 ])
|
|
19
|
|
20
|
|
21 # DRUNTIME_CONFIGURE_THREADS(thread_model)
|
|
22 # ----------------------------------------
|
|
23 # Map target os to D version identifier
|
|
24 AC_DEFUN([DRUNTIME_CONFIGURE_THREADS],
|
|
25 [
|
|
26 case $1 in
|
|
27 aix) DCFG_THREAD_MODEL="Posix" ;;
|
|
28 lynx) DCFG_THREAD_MODEL="Posix" ;;
|
|
29 posix) DCFG_THREAD_MODEL="Posix" ;;
|
|
30 single) DCFG_THREAD_MODEL="Single" ;;
|
|
31 win32) DCFG_THREAD_MODEL="Win32" ;;
|
|
32 # TODO: These targets need porting.
|
|
33 dce|mipssde|rtems|tpf|vxworks)
|
|
34 DCFG_THREAD_MODEL="Single" ;;
|
|
35 *) as_fn_error "Thread implementation '$1' not recognised" "$LINENO" 5 ;;
|
|
36 esac
|
|
37 AC_SUBST(DCFG_THREAD_MODEL)
|
|
38 ])
|
|
39
|
|
40
|
|
41 # DRUNTIME_OS_DETECT
|
|
42 # ------------------
|
|
43 # Set the druntime_cv_target_os variable
|
|
44 AC_DEFUN([DRUNTIME_OS_DETECT],
|
|
45 [
|
|
46 AC_CACHE_CHECK([[for target OS]],
|
|
47 [[druntime_cv_target_os]],
|
|
48 [[druntime_cv_target_os=`echo $target_os | sed 's/^\([A-Za-z_]+\)/\1/'`]])
|
|
49 AS_IF([[test -z "$druntime_cv_target_os"]],
|
|
50 [AC_MSG_ERROR([[can't detect target OS]])],
|
|
51 [])
|
|
52 ])
|
|
53
|
|
54
|
|
55 # DRUNTIME_OS_UNIX
|
|
56 # ----------------
|
|
57 # Add --enable-unix option or autodetects if system is unix
|
|
58 # and create the DRUNTIME_OS_UNIX conditional.
|
|
59 AC_DEFUN([DRUNTIME_OS_UNIX],
|
|
60 [
|
|
61 AC_REQUIRE([DRUNTIME_OS_DETECT])
|
|
62 AC_ARG_ENABLE(unix,
|
|
63 AC_HELP_STRING([--enable-unix],
|
|
64 [enables Unix runtime (default: yes, for Unix targets)]),
|
|
65 :,[enable_unix=auto])
|
|
66
|
|
67 case "$druntime_cv_target_os" in
|
|
68 aix*|*bsd*|cygwin*|darwin*|gnu*|linux*|skyos*|*solaris*|sysv*) d_have_unix=1 ;;
|
|
69 esac
|
|
70 if test -n "$d_have_unix" && test "$enable_unix" = auto ; then
|
|
71 enable_unix=yes
|
|
72 fi
|
|
73 AM_CONDITIONAL([DRUNTIME_OS_UNIX], [test "$enable_unix" = "yes"])
|
|
74 ])
|
|
75
|
|
76
|
|
77 # DRUNTIME_OS_SOURCES
|
|
78 # -------------------
|
|
79 # Detect target OS and add DRUNTIME_OS_AIX DRUNTIME_OS_DARWIN
|
|
80 # DRUNTIME_OS_FREEBSD DRUNTIME_OS_LINUX DRUNTIME_OS_MINGW
|
|
81 # DRUNTIME_OS_SOLARIS DRUNTIME_OS_OPENBSD conditionals.
|
|
82 AC_DEFUN([DRUNTIME_OS_SOURCES],
|
|
83 [
|
|
84 AC_REQUIRE([DRUNTIME_OS_DETECT])
|
|
85
|
|
86 druntime_target_os_parsed=""
|
|
87 case "$druntime_cv_target_os" in
|
|
88 aix*) druntime_target_os_parsed="aix"
|
|
89 ;;
|
|
90 *android*)
|
|
91 druntime_target_os_parsed="android"
|
|
92 ;;
|
|
93 darwin*) druntime_target_os_parsed="darwin"
|
|
94 ;;
|
|
95 dragonfly*)
|
|
96 druntime_target_os_parsed="dragonflybsd"
|
|
97 ;;
|
|
98 freebsd*|k*bsd*-gnu)
|
|
99 druntime_target_os_parsed="freebsd"
|
|
100 ;;
|
|
101 openbsd*)
|
|
102 druntime_target_os_parsed="openbsd"
|
|
103 ;;
|
|
104 netbsd*)
|
|
105 druntime_target_os_parsed="netbsd"
|
|
106 ;;
|
|
107 linux*) druntime_target_os_parsed="linux"
|
|
108 ;;
|
|
109 mingw*) druntime_target_os_parsed="mingw"
|
|
110 ;;
|
|
111 *solaris*) druntime_target_os_parsed="solaris"
|
|
112 esac
|
|
113 AM_CONDITIONAL([DRUNTIME_OS_AIX],
|
|
114 [test "$druntime_target_os_parsed" = "aix"])
|
|
115 AM_CONDITIONAL([DRUNTIME_OS_ANDROID],
|
|
116 [test "$druntime_target_os_parsed" = "android"])
|
|
117 AM_CONDITIONAL([DRUNTIME_OS_DARWIN],
|
|
118 [test "$druntime_target_os_parsed" = "darwin"])
|
|
119 AM_CONDITIONAL([DRUNTIME_OS_DRAGONFLYBSD],
|
|
120 [test "$druntime_target_os_parsed" = "dragonflybsd"])
|
|
121 AM_CONDITIONAL([DRUNTIME_OS_FREEBSD],
|
|
122 [test "$druntime_target_os_parsed" = "freebsd"])
|
|
123 AM_CONDITIONAL([DRUNTIME_OS_NETBSD],
|
|
124 [test "$druntime_target_os_parsed" = "netbsd"])
|
|
125 AM_CONDITIONAL([DRUNTIME_OS_OPENBSD],
|
|
126 [test "$druntime_target_os_parsed" = "openbsd"])
|
|
127 AM_CONDITIONAL([DRUNTIME_OS_LINUX],
|
|
128 [test "$druntime_target_os_parsed" = "linux"])
|
|
129 AM_CONDITIONAL([DRUNTIME_OS_MINGW],
|
|
130 [test "$druntime_target_os_parsed" = "mingw"])
|
|
131 AM_CONDITIONAL([DRUNTIME_OS_SOLARIS],
|
|
132 [test "$druntime_target_os_parsed" = "solaris"])
|
|
133 ])
|
|
134
|
|
135
|
|
136 # DRUNTIME_OS_ARM_EABI_UNWINDER
|
|
137 # ------------------------
|
|
138 # Check if using ARM unwinder and substitute DCFG_ARM_EABI_UNWINDER
|
|
139 # and set DRUNTIME_OS_ARM_EABI_UNWINDER conditional.
|
|
140 AC_DEFUN([DRUNTIME_OS_ARM_EABI_UNWINDER],
|
|
141 [
|
|
142 AC_LANG_PUSH([C])
|
|
143 AC_MSG_CHECKING([for ARM unwinder])
|
|
144 AC_TRY_COMPILE([#include <unwind.h>],[
|
|
145 #if __ARM_EABI_UNWINDER__
|
|
146 #error Yes, it is.
|
|
147 #endif
|
|
148 ],
|
|
149 [AC_MSG_RESULT([no])
|
|
150 DCFG_ARM_EABI_UNWINDER=false],
|
|
151 [AC_MSG_RESULT([yes])
|
|
152 DCFG_ARM_EABI_UNWINDER=true])
|
|
153 AC_SUBST(DCFG_ARM_EABI_UNWINDER)
|
|
154 AM_CONDITIONAL([DRUNTIME_OS_ARM_EABI_UNWINDER], [test "$DCFG_ARM_EABI_UNWINDER" = "true"])
|
|
155 AC_LANG_POP([C])
|
|
156 ])
|
|
157
|
|
158
|
|
159 # DRUNTIME_OS_MINFO_BRACKETING
|
|
160 # ----------------------------
|
|
161 # Check if the linker provides __start_minfo and __stop_minfo symbols and
|
|
162 # substitute DCFG_MINFO_BRACKETING.
|
|
163 AC_DEFUN([DRUNTIME_OS_MINFO_BRACKETING],
|
|
164 [
|
|
165 AC_LANG_PUSH([C])
|
|
166 AC_MSG_CHECKING([for minfo section bracketing])
|
|
167 AC_LINK_IFELSE([AC_LANG_SOURCE([
|
|
168 void* module_info_ptr __attribute__((section ("minfo")));
|
|
169 extern void* __start_minfo __attribute__((visibility ("hidden")));
|
|
170 extern void* __stop_minfo __attribute__((visibility ("hidden")));
|
|
171
|
|
172 int main()
|
|
173 {
|
|
174 // Never run, just to prevent compiler from optimizing access
|
|
175 return &__start_minfo == &__stop_minfo;
|
|
176 }
|
|
177 ])],
|
|
178 [AC_MSG_RESULT([yes])
|
|
179 DCFG_MINFO_BRACKETING=true],
|
|
180 [AC_MSG_RESULT([no])
|
|
181 DCFG_MINFO_BRACKETING=false])
|
|
182 AC_SUBST(DCFG_MINFO_BRACKETING)
|
|
183 AM_CONDITIONAL([DRUNTIME_OS_MINFO_BRACKETING], [test "$DCFG_MINFO_BRACKETING" = "true"])
|
|
184 AC_LANG_POP([C])
|
|
185 ])
|
|
186
|
|
187 # DRUNTIME_OS_DLPI_TLS_MODID
|
|
188 # ----------------------------
|
|
189 # Check if struct dl_phdr_info includes the dlpi_tls_modid member and
|
|
190 # substitute DCFG_DLPI_TLS_MODID.
|
|
191 AC_DEFUN([DRUNTIME_OS_DLPI_TLS_MODID],
|
|
192 [
|
|
193 AC_LANG_PUSH([C])
|
|
194 AC_CHECK_MEMBER([struct dl_phdr_info.dlpi_tls_modid],
|
|
195 [DCFG_DLPI_TLS_MODID=true], [DCFG_DLPI_TLS_MODID=false],
|
|
196 [[#include <link.h>]])
|
|
197 AC_SUBST(DCFG_DLPI_TLS_MODID)
|
|
198 AC_LANG_POP([C])
|
|
199 ])
|
|
200
|
|
201 # DRUNTIME_OS_LINK_SPEC
|
|
202 # ---------------------
|
|
203 # Add target-specific link options to link_spec.
|
|
204 AC_DEFUN([DRUNTIME_OS_LINK_SPEC],
|
|
205 [
|
|
206 case $target in
|
|
207 i?86-*-solaris2.* | x86_64-*-solaris2.*)
|
|
208 # 64-bit Solaris/x86 ld breaks calls to __tls_get_addr with non-TLS
|
|
209 # relocs. Work around by disabling TLS transitions. Not necessary
|
|
210 # on 32-bit x86, but cannot be distinguished reliably in specs.
|
|
211 druntime_ld_prog=`$CC -print-prog-name=ld`
|
|
212 druntime_ld_gld=no
|
|
213 druntime_ld_relax_transtls=no
|
|
214 if test -n "$druntime_ld_prog" \
|
|
215 && $druntime_ld_prog -v 2>&1 | grep GNU > /dev/null 2>&1; then
|
|
216 druntime_ld_gld=yes
|
|
217 else
|
|
218 echo 'int main (void) { return 0; }' > conftest.c
|
|
219 save_LDFLAGS="$LDFLAGS"
|
|
220 LDFLAGS="$LDFLAGS -Wl,-z,relax=transtls"
|
|
221 if $CC $CFLAGS $LDFLAGS -o conftest conftest.c > /dev/null 2>&1; then
|
|
222 druntime_ld_relax_transtls=yes
|
|
223 fi
|
|
224 LDFLAGS="$save_LDFLAGS"
|
|
225 rm -f conftest.c conftest
|
|
226 fi
|
|
227 if test "$druntime_ld_relax_transtls" = "yes"; then
|
|
228 OS_LINK_SPEC='-z relax=transtls'
|
|
229 fi
|
|
230 ;;
|
|
231 esac
|
|
232 AC_SUBST(OS_LINK_SPEC)
|
|
233 ])
|