1dnl Process this file with autoconf to produce a configure script.
2AC_INIT()
3{
4AC_CONFIG_AUX_DIR(tool)
5AC_CONFIG_MACRO_DIRS(tool/m4)
6
7AC_PREREQ(2.67)
8
9dnl   override AC_CHECKING
10dnl   placed here due to aclocal(1)'s
11dnl   ignoring this definition in separate files
12AC_DEFUN([AC_CHECKING],[dnl
13AC_REQUIRE([_COLORIZE_RESULT_PREPARE])dnl
14AS_MESSAGE([checking ${msg_checking}$1${msg_reset}...])])dnl
15
16AC_DISABLE_OPTION_CHECKING
17
18AC_ARG_VAR([cflags], [additional CFLAGS (ignored when CFLAGS is given)])
19AC_ARG_VAR([cppflags], [additional CPPFLAGS (ignored when CPPFLAGS is given)])
20AC_ARG_VAR([cxxflags], [additional CXXFLAGS (ignored when CXXFLAGS is given)])
21
22: "environment section" && {
23HAVE_BASERUBY=yes
24AC_ARG_WITH(baseruby,
25	AS_HELP_STRING([--with-baseruby=RUBY], [use RUBY as baseruby; RUBY is the pathname of ruby]),
26	[AS_CASE(["$withval"],
27	    [*ruby*],[BASERUBY=$withval],
28	    [no],[HAVE_BASERUBY=no],
29	    [AC_MSG_ERROR(need ruby)])
30	],
31	[
32		AC_PATH_PROG([BASERUBY], [ruby], [false])
33	])
34AS_IF([test "$HAVE_BASERUBY" = yes -a "`RUBYOPT=- $BASERUBY -e 'print 42' 2>/dev/null`" = 42], [
35    AS_IF([test "`RUBYOPT=- $BASERUBY --disable=gems -e 'print 42' 2>/dev/null`" = 42], [
36	BASERUBY="$BASERUBY --disable=gems"
37    ])
38    $BASERUBY -C "$srcdir" tool/downloader.rb -d tool -e gnu config.guess config.sub >&AS_MESSAGE_FD
39], [
40    BASERUBY="echo executable host ruby is required.  use --with-baseruby option.; false"
41    HAVE_BASERUBY=no
42])
43AC_SUBST(BASERUBY)
44AC_SUBST(HAVE_BASERUBY)
45
46: ${GIT=git}
47HAVE_GIT=yes
48AC_ARG_WITH(git,
49	AS_HELP_STRING([--without-git], [never use git]),
50	[AS_CASE([$withval],
51	    [no],  [GIT=never-use HAVE_GIT=no],
52	    [yes], [],
53	    [GIT=$withval])])
54AS_IF([test x"$HAVE_GIT" = xyes], [command -v "$GIT" > /dev/null || HAVE_GIT=no])
55AC_SUBST(GIT)
56AC_SUBST(HAVE_GIT)
57
58eval `sed -n ['s/^@%:@define RUBY_API_VERSION_\([A-Z][A-Z_0-9]*\) \([0-9][0-9]*\)/API_\1=\2/p'] $srcdir/include/ruby/version.h`
59RUBY_PROGRAM_VERSION=`sed -n 's/^@%:@define RUBY_VERSION "\(.*\)"/\1/p' $srcdir/version.h`
60MAJOR=`echo $RUBY_PROGRAM_VERSION | cut -d. -f1`
61MINOR=`echo $RUBY_PROGRAM_VERSION | cut -d. -f2`
62TEENY=`echo $RUBY_PROGRAM_VERSION | cut -d. -f3`
63for v in MAJOR MINOR TEENY; do
64    AS_IF([eval "test \"\$$v\" = ''"], [
65	AC_MSG_ERROR(could not determine $v number from version.h)
66    ])
67done
68AS_IF([test "$MAJOR.$MINOR" != "$API_MAJOR.$API_MINOR"], [
69    AC_MSG_ERROR([API version $API_MAJOR.$API_MINOR differs from program version $MAJOR.$MINOR])
70])
71AC_SUBST(MAJOR)
72AC_SUBST(MINOR)
73AC_SUBST(TEENY)
74AC_SUBST(RUBY_PROGRAM_VERSION)
75AC_SUBST(RUBY_API_VERSION, '$(MAJOR).$(MINOR)')
76RUBY_PATCHLEVEL=`sed -n 's/^#define RUBY_PATCHLEVEL //p' $srcdir/version.h`
77dnl checks for alternative programs
78AC_CANONICAL_BUILD
79RUBY_RM_RECURSIVE
80AC_ARG_WITH(gcc,
81	AS_HELP_STRING([--without-gcc], [never use gcc]),
82	[
83	AS_CASE([$withval],
84	    [no],  [: ${CC=cc}],
85	    [yes], [: ${CC=gcc}],
86	           [CC=$withval])])
87dnl If the user switches compilers, we can't believe the cache
88AS_IF([test ! -z "$ac_cv_prog_CC" -a ! -z "$CC" -a "$CC" != "$ac_cv_prog_CC"], [
89  AC_MSG_ERROR(cached CC is different -- throw away $cache_file
90(it is also a good idea to do 'make clean' before compiling))
91])
92test -z "$CC" || ac_cv_prog_CC="$CC"
93
94AS_IF([test "$program_prefix" = NONE], [
95  program_prefix=
96])
97AS_IF([test "$prefix" -ef .], [
98  AC_MSG_ERROR(--prefix cannot be the current working directory.)
99])
100RUBY_BASE_NAME=`echo ruby | sed "$program_transform_name"`
101RUBYW_BASE_NAME=`echo rubyw | sed "$program_transform_name"`
102AC_SUBST(RUBY_BASE_NAME)
103AC_SUBST(RUBYW_BASE_NAME)
104AC_SUBST(RUBY_VERSION_NAME, '${RUBY_BASE_NAME}-${ruby_version}')
105
106AC_CANONICAL_TARGET
107test x"$target_alias" = x &&
108target_os=`echo $target_os | sed 's/linux-gnu$/linux/;s/linux-gnu/linux-/'`
109ac_install_sh='' # unusable for extension libraries.
110
111AC_ARG_WITH(os-version-style,
112	AS_HELP_STRING([--with-os-version-style=TYPE],
113		       [OS version number for target and target_os [[full]]]
114		       [(full|teeny|minor+0|minor|major+0|major|none)]),
115	[os_version_style=$withval],
116	[os_version_style=full
117	    AS_CASE($target_os, [[*[0-9].*]],
118		[AS_CASE([`/usr/bin/ruby -e 'puts RUBY_PLATFORM' 2>/dev/null`],
119		    [[*-*[0-9].*.0]], [os_version_style=minor+0],
120		    [[*-*[0-9].*.*]], [os_version_style=full],
121		    [[*-*[0-9].0]  ], [os_version_style=major+0],
122		    [[*-*[0-9].*]  ], [os_version_style=minor],
123		    [[*-*[0-9]]    ], [os_version_style=major],
124		)])
125	])
126os_version_style_transform=
127AS_CASE("${os_version_style}",
128	[full|teeny], [],
129	[minor+0], [os_version_style_transform=['s/\([0-9]\.[0-9][0-9]*\)\.[0-9][.0-9]*$/\1.0/']],
130	[minor],   [os_version_style_transform=['s/\([0-9]\.[0-9][0-9]*\)\.[0-9][.0-9]*$/\1/']],
131	[major+0], [os_version_style_transform=['s/\([0-9]\)\.[0-9][.0-9]*$/\1.0/']],
132	[major],   [os_version_style_transform=['s/\([0-9]\)\.[0-9][.0-9]*$/\1/']],
133	[none],    [os_version_style_transform=['s/[0-9]\.[0-9][.0-9]*$//']],
134	[AC_MSG_ERROR(unknown --with-os-version-style: $withval)])
135AS_IF([test -z "$target_alias" -a -n "$os_version_style_transform"],
136	[
137	target=`echo ${target} | sed "$os_version_style_transform"`
138	target_os=`echo ${target_os} | sed "$os_version_style_transform"`
139	])
140
141AC_ARG_WITH(arch,
142	AS_HELP_STRING([--with-arch=ARCHS],
143		       [build an Apple/NeXT Multi Architecture Binary (MAB);
144                          ARCHS is a comma-delimited list of architectures for
145                          which to build; if this option is disabled or omitted
146			  entirely, then the package will be built only for the
147			  target platform]),
148       [target_archs="$withval"], [unset target_archs])
149
150AC_ARG_ENABLE(load-relative,
151       AS_HELP_STRING([--enable-load-relative], [resolve load paths at run time]),
152       [load_relative=$enableval])
153
154AC_ARG_PROGRAM
155
156dnl Checks for programs.
157
158cflagspat=
159test -z "$optflags" ||
160    cflagspat="$cflagspat;s|"`eval echo '"'"${optflags}"'"' | sed 's/[[][|.*]]/\\&/g;s/^ */ /;s/ *$/ /'`'| |g'
161test -z "$debugflags" ||
162    cflagspat="$cflagspat;s|"`eval echo '"'"${debugflags}"'"' | sed 's/[[][|.*]]/\\&/g;s/^ */ /;s/ *$/ /'`'| |g'
163test -z "warnflags" ||
164    cflagspat="$cflagspat;s|"`eval echo '"'"${warnflags}"'"' | sed 's/[[][|.*]]/\\&/g;s/^ */ /;s/ *$/ /'`'| |g'
165AS_IF([test -z "${CFLAGS+set}"], [
166    cflags=`echo " $cflags " | sed "$cflagspat;s/^ *//;s/ *$//"`
167    orig_cflags="$cflags"
168    cflags="$cflags "'${optflags} ${debugflags} ${warnflags}'
169])
170AS_IF([test -z "${CXXFLAGS+set}"], [
171    cxxflags=`echo " $cxxflags " | sed "$cflagspat;s/^ *//;s/ *$//"`
172    orig_cxxflags="$cxxflags"
173    cxxflags="$cxxflags "'${optflags} ${debugflags} ${warnflags}'
174])
175
176AS_CASE(["$host_os:$build_os"],
177[darwin*:darwin*], [
178    AC_CHECK_TOOLS(CC, [clang gcc cc])
179    # Following Apple deployed clang are broken
180    # clang version 1.0 (http://llvm.org/svn/llvm-project/cfe/tags/Apple/clang-23 exported)
181    # Apple clang version 2.0 (tags/Apple/clang-137) (based on LLVM 2.9svn)
182    # Apple clang version 2.1 (tags/Apple/clang-163.7.1) (based on LLVM 3.0svn)
183    AS_IF([! $CC -E -xc - <<SRC >/dev/null], [
184	@%:@if defined __APPLE_CC__ && defined __clang_major__ && __clang_major__ < 3
185	@%:@error premature clang
186	@%:@endif
187SRC
188	AC_MSG_ERROR([clang version 3.0 or later is required])
189    ])
190])
191AS_IF([test x"${build}" != x"${host}"], [
192  AC_CHECK_TOOL(CC, gcc)
193])
194
195AC_PROG_CC
196AS_CASE([$CC],
197[gcc-*], [
198    gcc_prefix=gcc- gcc_suffix=`echo "$CC" | sed 's/^gcc//'`
199    AC_PROG_CXX(g++${gcc_suffix})],
200[clang-*], [
201    gcc_prefix=clang- gcc_suffix=`echo "$CC" | sed 's/^clang//'`
202    AC_PROG_CXX(clang++${gcc_suffix})],
203[gcc_prefix= gcc_suffix=])
204
205dnl Select the appropriate C++ compiler in OS X
206AS_CASE(["$build_os"],
207  [darwin1*.*], [
208    AS_CASE(["x$CC"],
209      [xgcc-4.2|x/usr/bin/gcc-4.2], [: ${CXX=g++-4.2}],
210      [xgcc|x/usr/bin/gcc],         [: ${CXX=g++}],
211      [xcc|x/usr/bin/cc],           [: ${CXX=c++}],
212      [xicc],                       [: ${CXX=icpc}],
213      [xclang|x/usr/bin/clang],     [: ${CXX=clang++}])
214  ])
215test -z "$CXX" || ac_cv_prog_CXX="$CXX"
216
217AC_PROG_CXX
218RUBY_MINGW32
219AC_PROG_GCC_TRADITIONAL
220AC_SUBST(GCC)
221AS_CASE(["$target_os"],
222[solaris*], [AC_PATH_TOOL([LD], [ld], [/usr/ccs/bin/ld], [/usr/ccs/bin:$PATH])],
223[AC_CHECK_TOOL([LD], [ld], [ld])])
224AC_SUBST(LD)
225AS_IF([test "$GCC" = yes], [
226    linker_flag=-Wl,
227    : ${optflags=-O3}
228    gcc_major=`echo =__GNUC__ | $CC -E -xc - | sed '/^=/!d;s///'`
229    gcc_minor=`echo =__GNUC_MINOR__ | $CC -E -xc - | sed '/^=/!d;s///'`
230    test -n "$gcc_major" || gcc_major=0
231    test -n "$gcc_minor" || gcc_minor=0
232    AS_CASE(["x$CC"], [xicc], [
233      icc_version=`echo =__ICC | $CC -E -xc - | sed '/^=/!d;s///'`
234    ])
235    test -n "$icc_version" || icc_version=0
236    # RUBY_APPEND_OPTIONS(XCFLAGS, ["-include ruby/config.h" "-include ruby/missing.h"])
237], [
238    linker_flag=
239])
240
241AS_IF([test "$GCC" = yes -a "$gcc_major" -lt 3 ], [
242    AC_MSG_ERROR([too old GCC])
243])
244
245RUBY_PROG_GNU_LD
246RUBY_CPPOUTFILE
247
248: ${OUTFLAG='-o '}
249: ${COUTFLAG=${OUTFLAG}}
250: ${CSRCFLAG=''}
251AC_SUBST(OUTFLAG)
252AC_SUBST(COUTFLAG)
253AC_SUBST(CSRCFLAG)
254
255: ${MJIT_CC=$CC}
256AS_IF([test "x$cross_compiling" = xno], [
257    AC_PATH_PROG([MJIT_CC], ${MJIT_CC})
258    AS_CASE([$target_os],
259	[*mingw*], [command -v cygpath > /dev/null && MJIT_CC=`cygpath -ma $MJIT_CC`])
260    shift 2
261    MJIT_CC="$MJIT_CC${1+ }$*"
262])
263
264AS_CASE(["$build_os"],
265  [darwin1*.*], [
266    # Xcode linker warns for deprecated architecture and wrongly
267    # installed TBD files.
268    CC_WRAPPER=""
269    echo 'int main(void) {return 0;}' > conftest.c
270    AS_IF([$CC -framework Foundation -o conftest conftest.c 2>&1 |
271	   grep '^ld: warning: text-based stub file' >/dev/null], [
272	CC_WRAPPER=`cd -P "$srcdir/tool" && pwd`/darwin-cc
273	CC="$CC_WRAPPER $CC"
274    ])
275    rm -fr conftest*
276  ])
277
278cc_version=
279for option in --version -v -V -qversion; do
280    cc_version_message=`$CC $option 2>&1`
281    cc_version_status=$?
282    AS_CASE($cc_version_status, [0], [:], [continue])
283    AS_CASE($cc_version_message, [*Warning*], [continue])
284    cc_version='$(CC) '$option
285    break
286done
287AC_SUBST(CC_VERSION, $cc_version)
288AC_SUBST(CC_VERSION_MESSAGE, $cc_version_message)
289
290: ${DLDFLAGS="$LDFLAGS"}
291
292RUBY_UNIVERSAL_ARCH
293AS_IF([test "$target_cpu" != "$host_cpu" -a "$GCC" = yes -a "$cross_compiling" = no -a "$universal_binary" = no], [
294    RUBY_DEFAULT_ARCH("$target_cpu")
295])
296
297AS_CASE(["$target_os"], [darwin*], [
298if libtool 2>&1 | grep no_warning_for_no_symbols > /dev/null; then
299  ac_cv_prog_ac_ct_RANLIB=:
300  ac_cv_prog_ac_ct_AR='libtool -static'
301  rb_cv_arflags='-no_warning_for_no_symbols -o'
302fi
303])
304AC_CHECK_TOOLS(RANLIB, [${gcc_prefix}ranlib${gcc_suffix} ranlib], :)
305AC_CHECK_TOOLS(AR, [${gcc_prefix}ar${gcc_suffix} ar])
306AS_IF([test -z "$AR"], [
307  AC_CHECK_PROGS(AR, aal, ar)
308])
309AC_CACHE_CHECK([for $AR flags], [rb_cv_arflags], [
310    AS_IF([$AR rcD conftest.a > /dev/null 2>&1 && rm conftest.a],
311	[rb_cv_arflags=rcD], [rb_cv_arflags=rcu])
312])
313AC_SUBST(ARFLAGS, ["$rb_cv_arflags "])
314
315AC_CHECK_TOOL(AS, as)
316ASFLAGS=$ASFLAGS
317AC_SUBST(ASFLAGS)
318
319AS_CASE(["$target_os"],[cygwin*|mingw*], [ac_cv_prog_ac_ct_OBJCOPY=":"])
320
321# BSD's ports and MacPorts prefix GNU binutils with 'g'
322AC_CHECK_TOOLS(OBJDUMP, [objdump gobjdump])
323AC_CHECK_TOOLS(OBJCOPY, [objcopy gobjcopy])
324
325AS_CASE(["$target_os"],
326[cygwin*|mingw*], [
327    AC_CHECK_TOOL(WINDRES, windres)
328    AC_CHECK_TOOL(DLLWRAP, dllwrap)
329    target=`echo $target | sed "s/^$target_cpu-/-/"`
330    target_alias=`echo $target_alias | sed "s/^$target_cpu-/-/"`
331    target_cpu=`echo $target_cpu | sed s/i.86/i386/`
332    AS_CASE(["$target"], [-*], [ target="$target_cpu${target}"])
333    AS_CASE(["$target_alias"], [-*], [ target_alias="$target_cpu${target_alias}"])
334    AS_CASE(["$target_os"],
335    [mingw*], [
336	test "$rb_cv_msvcrt" = "" && unset rb_cv_msvcrt
337	AC_CACHE_CHECK(for mingw32 runtime DLL, rb_cv_msvcrt, [
338	AC_TRY_LINK([@%:@include <stdio.h>],
339		    [FILE* volatile f = stdin; return 0;],
340		    [rb_cv_msvcrt=`$OBJDUMP -p conftest$ac_exeext |
341				   tr A-Z a-z |
342				   sed -n '/^[[ 	]]*dll name: \(msvc.*\)\.dll$/{s//\1/p;q;}'`],
343		    [rb_cv_msvcrt=msvcrt])
344	test "$rb_cv_msvcrt" = "" && rb_cv_msvcrt=msvcrt])
345	RT_VER=`echo "$rb_cv_msvcrt" | tr -cd [0-9]`
346	test "$RT_VER" = "" && RT_VER=60
347	AC_DEFINE_UNQUOTED(RUBY_MSVCRT_VERSION, $RT_VER)
348	sysconfdir=
349    ])
350    : ${enable_shared=yes}
351    ],
352[aix*],     [AC_CHECK_TOOL(NM, nm, /usr/ccs/bin/nm, /usr/ccs/bin:$PATH)],
353[hiuxmpp*], [AC_DEFINE(__HIUX_MPP__)])    # by TOYODA Eizi <toyoda@npd.kishou.go.jp>
354AC_CHECK_TOOLS(NM, [${gcc_prefix}nm${gcc_suffix} nm])
355
356AC_PROG_LN_S
357AC_PROG_MAKE_SET
358AC_PROG_INSTALL
359AC_PROG_MKDIR_P
360AS_IF([test "x$MKDIR_P" = "x -d"], [
361  AS_IF([test x"$as_mkdir_p" != xfalse], [
362    MKDIR_P='mkdir -p'
363    echo "use 'mkdir -p' as MKDIR_P"
364  ], [
365    AC_MSG_ERROR([mkdir -p is required])
366  ])
367])
368MAKEDIRS="$MKDIR_P"
369AC_SUBST(MAKEDIRS)
370
371AC_CHECK_PROG([DTRACE], [${ac_tool_prefix}dtrace], [${ac_tool_prefix}dtrace])
372AS_IF([test "$cross_compiling:$ac_cv_prog_DTRACE" = no: -a -n "$ac_tool_prefix"], [
373    AC_CHECK_PROG([DTRACE], [dtrace], [dtrace])
374])
375
376AC_CHECK_PROGS(DOT, dot)
377AC_CHECK_PROGS(DOXYGEN, doxygen)
378
379AC_CHECK_PROG(PKG_CONFIG, pkg-config, [pkg-config], [], [],
380    [`"$as_dir/$ac_word$ac_exec_ext" --print-errors --version > /dev/null 2>&1 || echo "$as_dir/$ac_word$ac_exec_ext"`])
381
382# checks for UNIX variants that set C preprocessor variables
383AC_USE_SYSTEM_EXTENSIONS
384
385AC_SUBST(RM, ['rm -f'])
386AC_SUBST(CP, ['cp'])
387RMDIRS='$(top_srcdir)/tool/rmdirs'
388RMDIR=rmdir
389mkdir "rmdirs_$$_test" "rmdirs_$$_test/a"
390rmdir --ignore-fail-on-non-empty "rmdirs_$$_test" 2>/dev/null &&
391RMDIR='rmdir --ignore-fail-on-non-empty'
392$RMDIR -p "rmdirs_$$_test/a" 2>/dev/null &&
393{ test -d "rmdirs_$$_test" || RMDIRS="$RMDIR -p"; }
394rmdir "rmdirs_$$_test/a" "rmdirs_$$_test" 2>/dev/null
395AC_SUBST(RMDIR)
396AC_SUBST(RMDIRS)
397AC_SUBST(RMALL, ['rm -fr'])
398
399AC_MSG_CHECKING([for cd using physical directory])
400rm -fr conf$$.dir
401mkdir conf$$.dir &&
402(cd conf$$.dir && mkdir src build && cd src &&
403$as_ln_s ../build . > /dev/null 2>&1 && cd build &&
404for chdir in 'cd -P' 'PWD= cd'; do
405    /bin/sh -c "$chdir ../src && echo '$chdir' > cdcmd" 2> /dev/null && break
406done)
407AS_IF([test -f conf$$.dir/src/cdcmd], [
408    read CHDIR < conf$$.dir/src/cdcmd 2> /dev/null
409], [
410    CHDIR=cd
411])
412rm -fr conf$$.dir
413AC_MSG_RESULT([$CHDIR])
414AC_SUBST(CHDIR)
415}
416
417: "compiler section" && {
418RUBY_WERROR_FLAG([
419    AC_MSG_CHECKING([whether CFLAGS is valid])
420    AC_TRY_COMPILE([], [],
421	[AC_MSG_RESULT(yes)],
422	[
423	AC_MSG_RESULT(no)
424	AC_MSG_ERROR([something wrong with CFLAGS="$CFLAGS"])
425	]
426    )
427
428    AC_MSG_CHECKING([whether LDFLAGS is valid])
429    {
430	mkdir tmp.$$.try_link &&
431	cd tmp.$$.try_link &&
432	cp ../confdefs.h . &&
433	echo '<?xml?><plist><dict><key>CFBundleIdentifier</key><string></string></dict></plist>' > Info.plist &&
434	:
435    } || AC_MSG_ERROR([failed to make temporary directory])
436    AC_TRY_LINK([], [],
437	[AC_MSG_RESULT(yes)],
438	[
439	cd .. && rm -fr tmp.$$.try_link
440	AC_MSG_RESULT(no)
441	AC_MSG_ERROR([something wrong with LDFLAGS="$LDFLAGS"])
442	]
443    )
444    cd .. && rm -fr tmp.$$.try_link
445])
446
447: ${RPATHFLAG=''}
448rpathflag=''
449AS_IF([test x"${RPATHFLAG}" = x], [
450    AS_CASE(["$target_os"],
451	[hpux*], [AS_IF([test "$rb_cv_prog_gnu_ld" = no], [rpathflag='+b '])],
452	[aix*], [rpathflag='-blibpath:'],
453	[for rpathflag in -R "-rpath "; do
454	    AS_CASE("$rpathflag",
455		    [*" "], [AS_CASE(["${linker_flag}"],
456				     [*,], [rpathflag=`echo "$rpathflag" | tr ' ' ,`])])
457	    rpathflag="${linker_flag}${rpathflag}"
458	    RUBY_TRY_LDFLAGS([${rpathflag}.], [], [rpathflag=])
459	    AS_IF([test "x${rpathflag}" != x], [])
460        done])
461], [
462    rpathflag=`echo "$RPATHFLAG" | sed 's/%.*//'`
463])
464
465AS_CASE([$RUBY_PATCHLEVEL], [-*],
466	[RUBY_DEVEL=yes], [RUBY_DEVEL=no])
467particular_werror_flags=$RUBY_DEVEL
468AC_ARG_ENABLE(werror,
469	AS_HELP_STRING([--disable-werror],
470		       [don't make warnings into errors
471		       even if a compiler support -Werror feature
472		       [[disabled by default unless development version]]]),
473	[particular_werror_flags=$enableval])
474
475rb_cv_warnflags="$warnflags"
476AS_CASE(["$GCC:${warnflags+set}:${extra_warnflags:+set}:"],
477[yes::*|yes:*:set:], [# GCC && (!warnflags || extra_warnflags)
478    AS_IF([test $gcc_major -ge 4], [
479	extra_warnflags="$extra_warnflags -Werror=extra-tokens"
480    ])
481    AS_IF([test $gcc_major -ge 5 -a $gcc_major -le 6], [
482	extra_warnflags="$extra_warnflags -Wno-maybe-uninitialized"
483    ])
484    # ICC doesn't support -Werror=
485    AS_IF([test $icc_version -gt 0], [
486	particular_werror_flags=no
487    ])
488    for wflag in \
489		 -Werror=declaration-after-statement \
490		 -Werror=deprecated-declarations \
491		 -Werror=division-by-zero \
492		 -Werror=duplicated-cond \
493		 -Werror=implicit-function-declaration \
494		 -Werror=implicit-int \
495		 -Werror=misleading-indentation \
496		 -Werror=pointer-arith \
497		 -Werror=restrict \
498		 -Werror=shorten-64-to-32 \
499		 -Werror=write-strings \
500		 -Wimplicit-fallthrough=0 \
501		 -Wmissing-noreturn \
502		 -Wno-cast-function-type \
503		 -Wno-constant-logical-operand \
504		 -Wno-long-long \
505		 -Wno-missing-field-initializers \
506		 -Wno-overlength-strings \
507		 -Wno-packed-bitfield-compat \
508		 -Wno-parentheses-equality \
509		 -Wno-self-assign \
510		 -Wno-tautological-compare \
511		 -Wno-unused-parameter \
512		 -Wno-unused-value \
513		 -Wsuggest-attribute=format \
514		 -Wsuggest-attribute=noreturn \
515		 -Wunused-variable \
516		 -diag-disable=175,188,2259 \
517		 $extra_warnflags \
518		 ; do
519	AS_IF([test "$particular_werror_flags" != yes], [
520	    wflag=`echo x$wflag | sed 's/^x-Werror=/-W/;s/^x//'`
521	])
522	ok=no
523	RUBY_TRY_CFLAGS($wflag, [
524	    RUBY_APPEND_OPTIONS(warnflags, $wflag)
525	    ok=yes
526	])
527	AS_CASE([$ok:$wflag], [no:-Werror=*], [
528	    wflag=`echo x$wflag | sed 's/^x-Werror=/-W/'`
529	    RUBY_TRY_CFLAGS($wflag, [
530		RUBY_APPEND_OPTIONS(warnflags, $wflag)
531		particular_werror_flags=no
532	    ])
533	])
534    done
535    AS_CASE([" $warnflags "],[*" -Wno-missing-field-initializers "*], [wflag="-Wall -Wextra"],
536                             [wflag=-Wall])
537    RUBY_TRY_CFLAGS($wflag, [warnflags="$wflag${warnflags+ $warnflags}"])
538    # Disable warnflags while conftest. -Werror=* flags might make bad OS capability guess.
539    rb_cv_warnflags="$warnflags"
540    warnflags=
541])
542RUBY_TRY_CFLAGS(-Qunused-arguments, [RUBY_APPEND_OPTIONS(rb_cv_wsuppress_flags, -Qunused-arguments)])
543
544AC_ARG_WITH(compress-debug-sections,
545	AS_HELP_STRING([--with-compress-debug-sections=type],
546	    [enable debug section compression]),
547	[compress_debug_sections=$withval], [compress_debug_sections=])
548
549AS_IF([test "$GCC" = yes], [
550    # -D_FORTIFY_SOURCE
551    # When defined _FORTIFY_SOURCE, glibc enables some additional sanity
552    # argument check. The performance drop is very little and Ubuntu enables
553    # _FORTIFY_SOURCE=2 by default. So, let's support it for protecting us from
554    # a mistake of silly C extensions.
555
556    # TODO: check if link succeeds with _FORTIFY_SOURCE=2.
557    AS_CASE(["$target_os"],
558    [mingw*], [
559	fortify_source=no
560    ])
561    AC_ARG_ENABLE(fortify_source,
562		  AS_HELP_STRING([--disable-fortify-source],
563				 [disable -D_FORTIFY_SOURCE=2 option, which causes link error on mingw]),
564		  [fortify_source=$enableval])
565    AS_IF([test "x$fortify_source" != xno], [
566        RUBY_TRY_CFLAGS(-D_FORTIFY_SOURCE=2, [RUBY_APPEND_OPTION(XCFLAGS, -D_FORTIFY_SOURCE=2)])
567    ])
568
569    : ${MJIT_HEADER_FLAGS='-P -dD'}
570
571    # -fstack-protector
572    AS_CASE(["$target_os"],
573    [mingw*], [
574	stack_protector=no
575    ])
576    AS_IF([test -z "${stack_protector+set}"], [
577	AS_FOR(option, opt, [-fstack-protector-strong -fstack-protector], [
578	    RUBY_TRY_CFLAGS(option, [stack_protector=yes])
579	    AS_IF([test "x$stack_protector" = xyes], [
580		RUBY_TRY_LDFLAGS(option, [], [stack_protector=])
581	    ])
582	    AS_IF([test "x$stack_protector" = xyes], [stack_protector=option; break])
583	])
584    ])
585    AS_CASE(["$stack_protector"], [-*], [
586	RUBY_APPEND_OPTION(XCFLAGS, $stack_protector)
587	RUBY_APPEND_OPTION(XLDFLAGS, $stack_protector)
588	RUBY_APPEND_OPTION(LDFLAGS, $stack_protector)
589    ])
590
591    AS_CASE("${compress_debug_sections:-zlib}",
592    [none|no], [], [
593    RUBY_TRY_LDFLAGS(${linker_flag}--compress-debug-sections=${compress_debug_sections:-zlib},
594		     [compress_debug_sections=${compress_debug_sections:-zlib}],
595		     [compress_debug_sections=no])
596    ])
597    AS_IF([test "x$compress_debug_sections" != xno], [
598	RUBY_APPEND_OPTION(DLDFLAGS, ${linker_flag}--compress-debug-sections=$compress_debug_sections)
599    ])
600
601    AS_CASE(["$target_os"],[mingw*], [
602      # On  Windows  platforms,   system  provided  headers  are  VC++
603      # optimized.  That  is, C++  habits are often  contaminated into
604      # various  headers.  Most frequent  situation is  the use  of //
605      # comments.   We  bypass  ANSI   C  mode  for  them.   Otherwise
606      # extension libs cannot include those headers.
607
608      # Since math.h in some mingw64 wrongly declares frexp and modf
609      # to be pure, the variables pointed by the second arguments are
610      # considered uninitialized unexpectedly.
611      AC_CACHE_CHECK([whether frexp and modf are broken],
612	rb_cv_mingw64_broken_frexp_modf,
613	[
614	  save_CFLAGS="$CFLAGS"
615	  AS_IF([test "$particular_werror_flags" = "yes"], [
616	    CFLAGS="$CFLAGS -Werror=uninitialized"
617	  ], [
618	    CFLAGS="$CFLAGS -Werror -Wuninitialized"
619	  ])
620	  AC_TRY_COMPILE([@%:@include <math.h>
621	    int foo(double x)
622	    {
623	      int exp;
624	      frexp(x, &exp);
625	      return exp;
626	    }], [if (foo(0.0)) return 1;],
627	    [rb_cv_mingw64_broken_frexp_modf=no],
628	    [rb_cv_mingw64_broken_frexp_modf=yes])
629	  CFLAGS="$save_CFLAGS"
630	])
631      AS_IF([test "$rb_cv_mingw64_broken_frexp_modf" = yes], [
632	AC_DEFINE(RUBY_MINGW64_BROKEN_FREXP_MODF)
633      ])
634    ],
635    [cygwin*|darwin*|netbsd*], [
636      # need lgamma_r(), finite()
637    ],
638    [solaris*], [
639      # ANSI (no XCFLAGS because this is C only)
640      # Because "-std=gnu99" affects existance of functions on Solaris,
641      # "-std=gnu99" will be appended to CPPFLAGS.
642	for ansi_options in -std=gnu99; do
643	    RUBY_TRY_CFLAGS(${ansi_options}, [
644		RUBY_APPEND_OPTIONS(CPPFLAGS, ${ansi_options})
645	    ], [ansi_options=])
646	    test "x${ansi_options}" = x || break
647	done
648    ],
649    [
650      # ANSI (no XCFLAGS because this is C only)
651      rb_tmp_std_check=`echo $CC $CFLAGS $optflags $warnflags $debugflags | fgrep std= | tr -d  '\015'`
652      AS_IF([test "x$rb_tmp_std_check" = "x"],
653      [
654	for ansi_options in -std=gnu99; do
655	    RUBY_TRY_CFLAGS(${ansi_options}, [
656		RUBY_APPEND_OPTIONS(warnflags, ${ansi_options})
657		RUBY_APPEND_OPTIONS(strict_warnflags, ${ansi_options})
658	    ], [ansi_options=])
659	    test "x${ansi_options}" = x || break
660	done
661      ])
662    ])
663
664    # suppress annoying -Wstrict-overflow warnings
665    RUBY_TRY_CFLAGS(-fno-strict-overflow, [RUBY_APPEND_OPTION(XCFLAGS, -fno-strict-overflow)])
666
667    test "${debugflags+set}" || {RUBY_TRY_CFLAGS(-ggdb3, [debugflags=-ggdb3])}
668    test "${debugflags+set}" || {RUBY_TRY_CFLAGS(-ggdb, [debugflags=-ggdb])}
669    test "${debugflags+set}" || {RUBY_TRY_CFLAGS(-g3, [debugflags=-g3])}
670])
671test $ac_cv_prog_cc_g = yes && : ${debugflags=-g}
672AS_IF([test "x$RUBY_DEVEL" = xyes], [RUBY_APPEND_OPTION(XCFLAGS, -DRUBY_DEVEL=1)])
673
674AS_IF([test "$GCC" = ""], [
675    AS_CASE(["$target_os"],[aix*],[warnflags="$warnflags -qinfo=por" rb_cv_warnflags="$rb_cv_warnflags -qinfo=por"])
676])
677AS_IF([test "$GCC" = yes], [
678    AS_IF([test "$gcc_major" -ge 4], [
679	RUBY_TRY_CFLAGS(-fvisibility=hidden, [visibility_option=yes], [visibility_option=no])
680    ])
681    AC_SUBST(WERRORFLAG, "-Werror")
682    AS_IF([test "$visibility_option" = yes], [
683	RUBY_APPEND_OPTION(XCFLAGS, -fvisibility=hidden)
684	AC_DEFINE(RUBY_SYMBOL_EXPORT_BEGIN, [_Pragma("GCC visibility push(default)")])
685	AC_DEFINE(RUBY_SYMBOL_EXPORT_END,   [_Pragma("GCC visibility pop")])
686    ], [
687	RUBY_TRY_LDFLAGS([-Wl,-unexported_symbol,_Init_*], [visibility_option=ld], [visibility_option=no])
688    ])
689    test "$visibility_option" = no || OBJCOPY=:
690])
691
692AS_IF([test "$GCC" = yes], [
693    # optflags
694
695    AS_CASE(["$target_os"], [mingw*], [
696	RUBY_TRY_CFLAGS(-fno-omit-frame-pointer, [optflags="${optflags+$optflags }-fno-omit-frame-pointer"])
697	RUBY_TRY_CFLAGS(-static-libgcc, [static_libgcc=yes], [static_libgcc=no])
698	AS_IF([test "$static_libgcc" = yes], [
699	    RUBY_APPEND_OPTION(EXTLDFLAGS, -static-libgcc)
700	])
701    ])
702
703    # disable fast-math
704    for oflag in -fno-fast-math; do
705	RUBY_TRY_CFLAGS($oflag, [RUBY_APPEND_OPTION(CFLAGS, $oflag)])
706    done
707    for oflag in -fexcess-precision=standard -fp-model\ precise; do
708	RUBY_TRY_CFLAGS($oflag, [RUBY_APPEND_OPTION(XCFLAGS, $oflag)])
709    done
710])
711
712AS_CASE(["$target_cpu"], [[i[3-6]86*]], [
713    AC_CACHE_CHECK([for __sync_val_compare_and_swap], [rb_cv_gcc_compiler_cas], [
714	AC_TRY_LINK([unsigned long atomic_var;],
715	    [__sync_val_compare_and_swap(&atomic_var, 0, 1);],
716	    [rb_cv_gcc_compiler_cas=yes],
717	    [
718	    save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -march=i486"
719	    AC_TRY_LINK([unsigned long atomic_var;],
720		[__sync_val_compare_and_swap(&atomic_var, 0, 1);],
721		[rb_cv_gcc_compiler_cas=i486],
722		[rb_cv_gcc_compiler_cas=no])
723	    CFLAGS="$save_CFLAGS"
724	    ])
725    ])
726    AS_IF([test "$rb_cv_gcc_compiler_cas" = i486], [ARCH_FLAG="-march=i486"])
727])
728
729AC_ARG_WITH(opt-dir,
730	AS_HELP_STRING([--with-opt-dir=DIR-LIST],
731		       [add optional headers and libraries directories separated by $PATH_SEPARATOR]),
732	[
733		val=`echo "$PATH_SEPARATOR$withval" | sed "s|$PATH_SEPARATOR\([[^$PATH_SEPARATOR]*]\)| -I\1/include|g;s/^ //"`
734		CPPFLAGS="$CPPFLAGS $val"
735		val=`echo "$PATH_SEPARATOR$withval" | sed "s|$PATH_SEPARATOR\([[^$PATH_SEPARATOR]*]\)| -L\1/lib${rpathflag:+ $rpathflag\\\\1/lib}|g;s/^ //"`
736		LDFLAGS="$LDFLAGS $val"
737		LDFLAGS_OPTDIR="$val"
738		OPT_DIR="$withval"
739	], [OPT_DIR=])
740
741test -z "${ac_env_CFLAGS_set}" -a -n "${cflags+set}" && eval CFLAGS="\"$cflags $ARCH_FLAG\""
742test -z "${ac_env_CXXFLAGS_set}" -a -n "${cxxflags+set}" && eval CXXFLAGS="\"$cxxflags $ARCH_FLAG\""
743}
744
745AC_CACHE_CHECK([whether compiler has statement and declarations in expressions],
746  rb_cv_have_stmt_and_decl_in_expr,
747  [AC_TRY_COMPILE([],[ __extension__ ({ int a = 0; a; }); ],
748  [rb_cv_have_stmt_and_decl_in_expr=yes],
749  [rb_cv_have_stmt_and_decl_in_expr=no])])
750AS_IF([test "$rb_cv_have_stmt_and_decl_in_expr" = yes], [
751  AC_DEFINE(HAVE_STMT_AND_DECL_IN_EXPR)
752])
753
754: "header and library section" && {
755AC_ARG_WITH(winnt-ver,
756  AS_HELP_STRING([--with-winnt-ver=0xXXXX], [target Windows NT version (default to 0x0600)]),
757  [with_winnt_ver="$withval"], [with_winnt_ver="0x0600"])
758AS_CASE(["$target_os"],
759[mingw*], [
760  RUBY_APPEND_OPTION(CPPFLAGS, -D_WIN32_WINNT=$with_winnt_ver)
761  RUBY_APPEND_OPTION(CPPFLAGS, -D__MINGW_USE_VC2005_COMPAT)
762])
763
764AS_CASE(["$target_os"],
765[freebsd*], [
766  AC_CACHE_CHECK([whether pthread should be enabled by default],
767    rb_cv_enable_pthread_default,
768    [AC_TRY_CPP([
769#include <osreldate.h>
770#if __FreeBSD_version < 502102
771#error pthread should be disabled on this platform
772#endif
773      ],
774      rb_cv_enable_pthread_default=yes,
775      rb_cv_enable_pthread_default=no)])
776  enable_pthread=$rb_cv_enable_pthread_default
777  ],
778[mingw*], [
779  enable_pthread=no
780  ],
781[
782  enable_pthread=yes
783  ])
784
785dnl Checks for libraries.
786AS_CASE(["$target_os"],[*bsd*|dragonfly*],[],[ac_cv_func_daemon=no])
787
788AS_UNSET(ORIG_LIBS)
789POSTLINK=:
790AC_SUBST(POSTLINK)
791AS_CASE(["$target_os"],
792[nextstep*], [	],
793[openstep*], [	],
794[rhapsody*], [	],
795[darwin*], [
796		ORIG_LIBS="$LIBS"
797		RUBY_PREPEND_OPTION(LIBS, -lobjc)
798		RUBY_APPEND_OPTIONS(CPPFLAGS, -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT)
799		AC_MSG_CHECKING(whether Mac OS X 10.5 or later)
800		AC_TRY_CPP([#include <AvailabilityMacros.h>
801		    #if MAC_OS_X_VERSION_MAX_ALLOWED <= 1040
802		    #error pre OS X 10.4
803		    [!<===== pre OS X 10.4 =====>]
804		    #endif
805		    ],
806		    [macosx_10_5=yes], [macosx_10_5=no])
807		AC_MSG_RESULT($macosx_10_5)
808		AS_IF([test "${target_os@%:@darwin}" -ge 16], [
809		    ac_cv_func___syscall=no
810		    ac_cv_func_syscall=no
811		    ac_cv_header_sys_syscall_h=no
812		    ac_cv_header_syscall_h=no
813		])
814		AS_IF([test $macosx_10_5 = yes], [
815		    ac_cv_func_getcontext=no
816		    ac_cv_func_setcontext=no
817		], [
818		    AC_DEFINE(BROKEN_SETREUID, 1)
819		    AC_DEFINE(BROKEN_SETREGID, 1)
820		])
821		incs=`$CC -v -E -xc - < /dev/null 2>&1 | sed ['1,/^@%:@include </d;s/^ *//;s|[^./][^/]*/\.\./||g;/\/include$/!d;s||/lib|;/\/usr\/lib/d']`
822		for d in `$CC -print-search-dirs | sed -e '/^libraries: */!d;s///' | tr : '\012' | fgrep -v /../ | sed -n 's|^\(/.*/lib\)/$|\1|p'`; do
823		    incs=`echo "$incs" | fgrep -v "$d"`
824		done
825		for d in $incs; do
826		    test -d "$d" && RUBY_APPEND_OPTIONS(LDFLAGS, "-L$d")
827		done
828		ac_cv_type_getgroups=gid_t # getgroups() on Rosetta fills garbage
829		ac_cv_lib_crypt_crypt=no
830		ac_cv_func_fdatasync=no # Mac OS X wrongly reports it has fdatasync()
831		ac_cv_func_vfork=no
832		AS_IF([test $gcc_major -lt 4 -o \( $gcc_major -eq 4 -a $gcc_minor -lt 3 \)], [
833		    ac_cv_func___builtin_setjmp=no
834		])
835		with_setjmp_type=sigsetjmp # to hijack SIGCHLD handler
836		AC_CACHE_CHECK(for broken crypt with 8bit chars, rb_cv_broken_crypt,
837		    [AC_TRY_RUN([
838#include <stdio.h>
839#include <unistd.h>
840#include <string.h>
841
842void
843broken_crypt(const char *salt, const char *buf1, const char *buf2)
844{
845#if 0
846    printf("%.2x%.2x: %s -> %s\n", (unsigned char)salt[0], (unsigned char)salt[1],
847	   buf1+2, buf2+2);
848#endif
849}
850
851int
852main()
853{
854    int i;
855    char salt[2], buf[256], *s;
856    for (i = 0; i < 128*128; i++) {
857	salt[0] = 0x80 | (i & 0x7f);
858	salt[1] = 0x80 | (i >> 7);
859	strcpy(buf, crypt("", salt));
860	if (strcmp(buf, s = crypt("", salt))) {
861	    broken_crypt(salt, buf, s);
862	    return 1;
863	}
864    }
865    salt[0] = salt[1] = ' ';
866    strcpy(buf, crypt("", salt));
867    salt[0] = salt[1] = 0x80 | ' ';
868    if (strcmp(buf, s = crypt("", salt))) {
869	broken_crypt(salt, buf, s);
870	return 1;
871    }
872    return 0;
873}
874],
875		    rb_cv_broken_crypt=no,
876		    rb_cv_broken_crypt=yes,
877		    rb_cv_broken_crypt=yes)])
878		AS_IF([test "$rb_cv_broken_crypt" = yes], [
879		   AC_DEFINE(BROKEN_CRYPT, 1)
880		])
881		POSTLINK=""
882		AC_CHECK_PROGS(codesign, codesign)
883		AC_CHECK_PROGS(dsymutil, dsymutil)
884		AS_IF([test -n "$codesign"], [
885		    POSTLINK="{ test -z '\$(RUBY_CODESIGN)' || $codesign -s '\$(RUBY_CODESIGN)' -f \$@; }${POSTLINK:+; $POSTLINK}"
886		])
887		AS_IF([test -n "$dsymutil"], [
888		    POSTLINK="$dsymutil \$@${POSTLINK:+; $POSTLINK}"
889		])
890		AS_IF([test -n "${POSTLINK}"], [
891		    LINK_SO="$LINK_SO
892\$(POSTLINK)"
893		])
894		AC_CHECK_HEADERS(crt_externs.h, [], [], [
895		    #include <crt_externs.h>
896		])
897		],
898[hpux*], [	LIBS="-lm $LIBS"
899		ac_cv_c_inline=no],
900[solaris*], [	LIBS="-lm $LIBS"
901		ac_cv_func_vfork=no
902		AC_MSG_CHECKING(whether _XOPEN_SOURCE is already given)
903		AC_TRY_COMPILE([#include <unistd.h>
904			#ifndef _XOPEN_SOURCE
905			#error _XOPEN_SOURCE is not defined
906			#endif
907			], [],
908		        [given_xopen_source=yes], [given_xopen_source=no])
909		AC_MSG_RESULT($given_xopen_source)
910		AS_IF([test $given_xopen_source = no], [
911		  AC_MSG_CHECKING(appropriate _XOPEN_SOURCE value to define)
912		  define_xopen_source=""
913		  for tmp_xpg in 7 6 5; do
914		    AS_IF([test x"$define_xopen_source" != x], [
915		      break
916		    ])
917		    RUBY_WERROR_FLAG([AC_TRY_COMPILE([
918			#define _XOPEN_SOURCE ${tmp_xpg}00
919			#include <unistd.h>
920			#ifndef _XPG${tmp_xpg}
921			#error _XPG${tmp_xpg} should be defined by _XOPEN_SOURCE=${tmp_xpg}00
922			#endif
923			], [],
924			[define_xopen_source=${tmp_xpg}00], [])
925			])
926		  done
927		  AS_IF([test x"$define_xopen_source" = x], [
928		    define_xopen_source=no
929		  ])
930		  AC_MSG_RESULT($define_xopen_source)
931		  AS_IF([test x"$define_xopen_source" != xno], [
932		    RUBY_APPEND_OPTIONS(CPPFLAGS, -D_XOPEN_SOURCE=$define_xopen_source)
933		  ])
934		])
935		],
936[haiku*], [
937		LIBS="$LIBS" # m lib is include in root
938		],
939[cygwin*], [	ac_cv_header_langinfo_h=yes
940		RUBY_APPEND_OPTIONS(CPPFLAGS, -D_XOPEN_SOURCE -D_GNU_SOURCE)
941		AC_CHECK_FUNCS(cygwin_conv_path)
942		AC_LIBOBJ([langinfo])
943		],
944[mingw*], [	LIBS="-lshell32 -lws2_32 -liphlpapi -limagehlp -lshlwapi $LIBS"
945		ac_cv_header_a_out_h=no
946		ac_cv_header_pwd_h=no
947		ac_cv_header_utime_h=no
948		ac_cv_header_sys_ioctl_h=no
949		ac_cv_header_sys_param_h=no
950		ac_cv_header_sys_resource_h=no
951		ac_cv_header_sys_select_h=no
952		ac_cv_header_sys_time_h=no
953		ac_cv_header_sys_times_h=no
954		ac_cv_header_sys_socket_h=no
955		ac_cv_func_lstat=yes
956		ac_cv_func_times=yes
957		ac_cv_func_waitpid=yes
958		ac_cv_func_fsync=yes
959		ac_cv_func_seekdir=yes
960		ac_cv_func_telldir=yes
961		ac_cv_func_isinf=yes
962		ac_cv_func_isnan=yes
963		ac_cv_func_finite=yes
964		ac_cv_func_lchown=yes
965		ac_cv_func_link=yes
966		ac_cv_func_readlink=yes
967		ac_cv_func_symlink=yes
968		ac_cv_lib_crypt_crypt=no
969		ac_cv_func_getpgrp_void=no
970		ac_cv_func_memcmp_working=yes
971		ac_cv_lib_dl_dlopen=no
972		rb_cv_binary_elf=no
973		rb_cv_negative_time_t=no
974		ac_cv_func_fcntl=yes
975		ac_cv_func_flock=yes
976		ac_cv_func_gmtime_r=yes
977		rb_cv_large_fd_select=yes
978		ac_cv_type_struct_timeval=yes
979                ac_cv_func_clock_gettime=yes
980                ac_cv_func_clock_getres=yes
981		ac_cv_func_malloc_usable_size=no
982		ac_cv_type_off_t=yes
983		ac_cv_sizeof_off_t=8
984		AS_IF([test "$target_cpu" = x64], [
985		    ac_cv_func___builtin_setjmp=yes
986		    ac_cv_func_round=no
987		    rb_cv_fiber_coroutine=yes
988		])
989		ac_cv_func_tgamma=no
990		rb_cv_negative_time_t=yes
991		AC_CHECK_TYPE([NET_LUID], [], [],
992			      [@%:@include <winsock2.h>
993			      @%:@include <iphlpapi.h>])
994		AS_IF([test x"$ac_cv_type_NET_LUID" = xyes], [
995		    AC_DEFINE(HAVE_TYPE_NET_LUID, 1)
996		])
997		AC_CHECK_FUNCS(_gmtime64_s)
998		AC_CHECK_FUNCS(_wfreopen_s)
999		AC_LIBOBJ([langinfo])
1000		],
1001[bsdi*], [	LIBS="-lm $LIBS"
1002		AC_DEFINE(BROKEN_SETREUID, 1)
1003		AC_DEFINE(BROKEN_SETREGID, 1)
1004                ac_cv_sizeof_rlim_t=8],
1005[freebsd*], [	LIBS="-lm $LIBS"
1006		ac_cv_func_getpeername=no
1007		ac_cv_func_getsockname=no
1008		ac_cv_func_shutdown=no
1009		ac_cv_func_close=no
1010		],
1011[netbsd*], [	LIBS="-lm $LIBS"
1012		],
1013[dragonfly*], [	LIBS="-lm $LIBS"
1014		# isinf() and isnan() are macros on DragonFly.
1015		ac_cv_func_isinf=yes
1016		ac_cv_func_isnan=yes
1017		],
1018[aix*],[	LIBS="-lm $LIBS"
1019		ac_cv_func_round=no
1020		ac_cv_func___builtin_setjmp=no
1021		],
1022[linux*],[	LIBS="-lm $LIBS"
1023		# __builtin_longjmp in ppc64* Linux does not restore
1024		# the TOC register (r2), which is problematic
1025		# when a global exit happens from JITted .so code.
1026		AS_CASE(["$target_cpu"], [powerpc64*], [
1027			ac_cv_func___builtin_setjmp=no
1028		])
1029		# With gcc-8's -fcf-protection, MJIT's __builtin_longjmp fails.
1030		AS_CASE(["$CC $CFLAGS "], [*" -fcf-protection "*], [cf_protection=yes], [cf_protection=no])
1031		AS_IF([test "$cf_protection" = yes], [
1032			ac_cv_func___builtin_setjmp=no
1033		])
1034		],
1035[	LIBS="-lm $LIBS"])
1036: ${ORIG_LIBS=$LIBS}
1037
1038AC_CHECK_LIB(crypt, crypt)      # glibc (GNU/Linux, GNU/Hurd, GNU/kFreeBSD)
1039AC_CHECK_LIB(dl, dlopen)	# Dynamic linking for SunOS/Solaris and SYSV
1040AC_CHECK_LIB(dld, shl_load)	# Dynamic linking for HP-UX
1041AC_CHECK_LIB(socket, shutdown)  # SunOS/Solaris
1042
1043dnl Checks for header files.
1044AC_HEADER_DIRENT
1045dnl AC_HEADER_STDC has been checked in AC_USE_SYSTEM_EXTENSIONS
1046AC_HEADER_STDBOOL
1047AC_HEADER_SYS_WAIT
1048
1049AC_CHECK_HEADERS(a.out.h)
1050AC_CHECK_HEADERS(atomic.h)
1051AC_CHECK_HEADERS(direct.h)
1052AC_CHECK_HEADERS(grp.h)
1053AC_CHECK_HEADERS(fcntl.h)
1054AC_CHECK_HEADERS(float.h)
1055AC_CHECK_HEADERS(ieeefp.h)
1056AC_CHECK_HEADERS(intrinsics.h)
1057AC_CHECK_HEADERS(langinfo.h)
1058AC_CHECK_HEADERS(limits.h)
1059AC_CHECK_HEADERS(locale.h)
1060AC_CHECK_HEADERS(malloc.h)
1061AC_CHECK_HEADERS(malloc/malloc.h)
1062AC_CHECK_HEADERS(malloc_np.h)
1063AC_CHECK_HEADERS(net/socket.h)
1064AC_CHECK_HEADERS(process.h)
1065AC_CHECK_HEADERS(pwd.h)
1066AC_CHECK_HEADERS(sanitizer/asan_interface.h)
1067AC_CHECK_HEADERS(sanitizer/msan_interface.h)
1068AC_CHECK_HEADERS(setjmpex.h)
1069AC_CHECK_HEADERS(stdalign.h)
1070AC_CHECK_HEADERS(sys/attr.h)
1071AC_CHECK_HEADERS(sys/eventfd.h)
1072AC_CHECK_HEADERS(sys/fcntl.h)
1073AC_CHECK_HEADERS(sys/file.h)
1074AC_CHECK_HEADERS(sys/id.h)
1075AC_CHECK_HEADERS(sys/ioctl.h)
1076AC_CHECK_HEADERS(sys/mkdev.h)
1077AC_CHECK_HEADERS(sys/param.h)
1078AC_CHECK_HEADERS(sys/prctl.h)
1079AC_CHECK_HEADERS(sys/resource.h)
1080AC_CHECK_HEADERS(sys/select.h)
1081AC_CHECK_HEADERS(sys/sendfile.h)
1082AC_CHECK_HEADERS(sys/socket.h)
1083AC_CHECK_HEADERS(sys/syscall.h)
1084AC_CHECK_HEADERS(sys/sysmacros.h)
1085AC_CHECK_HEADERS(sys/time.h)
1086AC_CHECK_HEADERS(sys/times.h)
1087AC_CHECK_HEADERS(sys/uio.h)
1088AC_CHECK_HEADERS(sys/utime.h)
1089AC_CHECK_HEADERS(syscall.h)
1090AC_CHECK_HEADERS(time.h)
1091AC_CHECK_HEADERS(ucontext.h)
1092AC_CHECK_HEADERS(utime.h)
1093
1094AC_ARG_WITH([gmp],
1095  [AS_HELP_STRING([--without-gmp],
1096    [disable GNU GMP to accelerate Bignum operations])],
1097  [],
1098  [with_gmp=yes])
1099AS_IF([test "x$with_gmp" != xno],
1100  [AC_CHECK_HEADERS(gmp.h)
1101   AS_IF([test "x$ac_cv_header_gmp_h" != xno],
1102     AC_SEARCH_LIBS([__gmpz_init], [gmp],
1103       [AC_DEFINE(HAVE_LIBGMP, 1)]))])
1104
1105AC_ARG_WITH([jemalloc],
1106  [AS_HELP_STRING([--with-jemalloc],[use jemalloc allocator])],
1107  [with_jemalloc=$withval], [with_jemalloc=no])
1108AS_IF([test "x$with_jemalloc" != xno],[
1109  AC_SEARCH_LIBS([malloc_conf], [jemalloc],
1110    [
1111      AC_DEFINE(HAVE_LIBJEMALLOC, 1)
1112      with_jemalloc=yes
1113    ],
1114    [test x$with_jemalloc = xyes && with_jemalloc=no])
1115  AC_CHECK_HEADER(jemalloc/jemalloc.h, [
1116    AC_DEFINE(RUBY_ALTERNATIVE_MALLOC_HEADER, [<jemalloc/jemalloc.h>])
1117  ],
1118  [test x$with_jemalloc = xyes && with_jemalloc=no])
1119  AS_IF([test "x$with_jemalloc" != xyes], [
1120    AC_CACHE_CHECK([for jemalloc with JEMALLOC_MANGLE], rb_cv_jemalloc_demangle,
1121      [AC_LINK_IFELSE([AC_LANG_PROGRAM([@%:@define JEMALLOC_MANGLE 1
1122      @%:@ifdef RUBY_ALTERNATIVE_MALLOC_HEADER
1123      @%:@include RUBY_ALTERNATIVE_MALLOC_HEADER
1124      @%:@else
1125      @%:@include <jemalloc.h>
1126      @%:@endif], [return !&malloc_conf])],
1127      [rb_cv_jemalloc_demangle=yes],
1128      [rb_cv_jemalloc_demangle=no])
1129    ])
1130  ])
1131  AS_IF([test "x$rb_cv_jemalloc_demangle" = xyes], [
1132    AC_DEFINE(JEMALLOC_MANGLE)
1133    with_jemalloc=yes
1134  ])
1135  AS_CASE(["$with_jemalloc"],
1136    [yes],
1137    [
1138      AC_DEFINE(HAVE_MALLOC_CONF)
1139      ac_cv_func_malloc_usable_size=yes
1140    ],
1141    [no],
1142    [AC_MSG_ERROR([jemalloc requested but not found])
1143  ])
1144])
1145
1146dnl check for large file stuff
1147mv confdefs.h confdefs1.h
1148: > confdefs.h
1149AC_SYS_LARGEFILE
1150# On 32-bit Solaris, it is safe to define _LARGEFILE_SOURCE
1151# which is not added by AC_SYS_LARGEFILE.
1152AS_IF([test x"$enable_largefile" != xno], [
1153  AS_CASE(["$target_os"], [solaris*], [
1154    AC_MSG_CHECKING([wheather _LARGEFILE_SOURCE should be defined])
1155    AS_CASE(["${ac_cv_sys_file_offset_bits}:${ac_cv_sys_large_files}"],
1156      ["64:"|"64:no"|"64:unknown"], [
1157	# insert _LARGEFILE_SOURCE before _FILE_OFFSET_BITS line
1158	# that is the same order as "getconf LFS_CFLAGS" output
1159	mv confdefs.h largefile0.h
1160	: > confdefs.h
1161	AC_DEFINE(_LARGEFILE_SOURCE)
1162	cat largefile0.h >> confdefs.h
1163	rm largefile0.h
1164	AC_MSG_RESULT([yes])
1165      ], [AC_MSG_RESULT([no])])
1166  ])
1167])
1168mv confdefs.h largefile.h
1169mv confdefs1.h confdefs.h
1170cat largefile.h >> confdefs.h
1171
1172AS_CASE(["$target_os"],
1173    [aix*], [
1174    AS_CASE(["$target_cpu:$ac_cv_sys_large_files"],
1175	[ppc64:*|powerpc64:*], [],
1176	[*:no|*:unknown], [],
1177	[
1178	    # AIX currently does not support a 32-bit call to posix_fadvise()
1179	    # if _LARGE_FILES is defined.
1180	    ac_cv_func_posix_fadvise=no
1181	])
1182    ])
1183
1184AC_C_BIGENDIAN
1185AC_C_CONST
1186AC_C_CHAR_UNSIGNED
1187AC_C_INLINE
1188AC_C_VOLATILE
1189AC_C_TYPEOF
1190
1191AS_CASE(":$ac_cv_c_const:$ac_cv_c_volatile:",
1192    [*:no:*], [AC_MSG_ERROR(ANSI C-conforming const and volatile are mandatory)])
1193
1194AC_CHECK_TYPES([long long, off_t])
1195
1196AC_CACHE_CHECK([char bit], [rb_cv_char_bit],
1197    [test "$universal_binary" = yes && cross_compiling=yes
1198    AC_COMPUTE_INT([rb_cv_char_bit], [CHAR_BIT],
1199	[AC_INCLUDES_DEFAULT([@%:@include <limits.h>])], [rb_cv_char_bit=8])
1200    test "$universal_binary" = yes && cross_compiling=$real_cross_compiling])
1201
1202RUBY_CHECK_SIZEOF(int, [], [ILP])
1203RUBY_CHECK_SIZEOF(short)
1204RUBY_CHECK_SIZEOF(long, [int], [ILP LP])
1205RUBY_CHECK_SIZEOF(long long)
1206RUBY_CHECK_SIZEOF(__int64, [8], [ILP LP])
1207RUBY_CHECK_SIZEOF(__int128, [16], [ILP LP])
1208RUBY_CHECK_SIZEOF(off_t)
1209RUBY_CHECK_SIZEOF(void*, [int long "long long"], [ILP LP LLP])
1210RUBY_CHECK_SIZEOF(float)
1211RUBY_CHECK_SIZEOF(double)
1212RUBY_CHECK_SIZEOF(time_t, [long "long long"], [], [@%:@include <time.h>])
1213RUBY_CHECK_SIZEOF(clock_t, [], [], [@%:@include <time.h>])
1214
1215AC_CACHE_CHECK(packed struct attribute, rb_cv_packed_struct,
1216    [rb_cv_packed_struct=no
1217    for mac in \
1218	"__pragma(pack(push, 1)) x __pragma(pack(pop))" \
1219	"x __attribute__((packed))" \
1220	; do
1221	AC_TRY_COMPILE([@%:@define PACKED_STRUCT(x) $mac
1222			PACKED_STRUCT(struct { int a; });], [],
1223		[rb_cv_packed_struct=$mac; break])
1224    done])
1225AS_IF([test "$rb_cv_packed_struct" != no], [
1226    AC_DEFINE_UNQUOTED([PACKED_STRUCT(x)], [$rb_cv_packed_struct])
1227    RUBY_TRY_CFLAGS(-Wno-address-of-packed-member, [AC_DEFINE(USE_UNALIGNED_MEMBER_ACCESS)])
1228], [
1229    AC_DEFINE_UNQUOTED([PACKED_STRUCT(x)], x)
1230])
1231
1232AS_IF([test "x$ac_cv_type_long_long" = xyes], [
1233    RUBY_CHECK_PRINTF_PREFIX(long long, ll I64, LL)
1234], [test "x$ac_cv_type___int64" = xyes], [
1235    RUBY_CHECK_PRINTF_PREFIX(__int64, ll I64, LL)
1236])
1237
1238RUBY_REPLACE_TYPE(pid_t, int, PIDT)
1239RUBY_REPLACE_TYPE(uid_t, int, UIDT)
1240RUBY_REPLACE_TYPE(gid_t, int, GIDT)
1241RUBY_REPLACE_TYPE(time_t, [], TIMET, [@%:@include <time.h>])
1242RUBY_REPLACE_TYPE(dev_t, [int long "long long"], DEVT)
1243RUBY_REPLACE_TYPE(mode_t, ["unsigned short" "unsigned int" long], MODET, [@%:@include <sys/stat.h>])
1244RUBY_REPLACE_TYPE(rlim_t, [int long "long long"], RLIM, [
1245@%:@ifdef HAVE_SYS_TYPES_H
1246@%:@include <sys/types.h>
1247@%:@endif
1248@%:@ifdef HAVE_SYS_TYPES_H
1249@%:@include <sys/time.h>
1250@%:@endif
1251@%:@include <sys/resource.h>
1252])
1253RUBY_REPLACE_TYPE(off_t, [], OFFT)
1254RUBY_REPLACE_TYPE(clockid_t, [], CLOCKID, [@%:@ifdef HAVE_TIME_H
1255@%:@ include <time.h>
1256@%:@endif
1257@%:@ifdef HAVE_SYS_TIME_H
1258@%:@ include <sys/time.h>
1259@%:@endif])
1260
1261AC_CACHE_CHECK(for prototypes, rb_cv_have_prototypes,
1262  [AC_TRY_COMPILE([int foo(int x) { return 0; }], [return foo(10);],
1263	rb_cv_have_prototypes=yes,
1264	rb_cv_have_prototypes=no)])
1265AS_IF([test "$rb_cv_have_prototypes" = yes], [
1266  AC_DEFINE(HAVE_PROTOTYPES)
1267])
1268
1269AC_CACHE_CHECK(token paste string, rb_cv_tokenpaste,
1270  [AC_TRY_COMPILE([@%:@define paste(a,b) a@%:@@%:@b],
1271		  [int xy = 1; return paste(x,y);],
1272		  rb_cv_tokenpaste=ansi,
1273		  rb_cv_tokenpaste=knr)])
1274AS_IF([test "$rb_cv_tokenpaste" = ansi], [
1275  AC_DEFINE(TOKEN_PASTE(x,y),[x@%:@@%:@y])
1276], [
1277  AC_DEFINE(TOKEN_PASTE(x,y),[x/**/y])
1278])
1279
1280AC_CACHE_CHECK(stringization, rb_cv_stringization, [
1281  rb_cv_stringization=no
1282  for string in "#expr" '"expr"'; do
1283    AC_COMPILE_IFELSE([
1284      AC_LANG_BOOL_COMPILE_TRY([
1285#define STRINGIZE0(expr) $string
1286#define STRINGIZE(expr) STRINGIZE0(expr)
1287#undef real_test_for_stringization
1288#define test_for_stringization -.real_test_for_stringization.-
1289const char stringized[[]] = STRINGIZE(test_for_stringization);
1290], [sizeof(stringized) == 32])],
1291      [rb_cv_stringization="$string"; break],
1292      [rb_cv_stringization=no])
1293  done]
1294)
1295AC_DEFINE(STRINGIZE(expr),STRINGIZE0(expr))
1296AS_IF([test x"$rb_cv_stringization" != xno -a "$rb_cv_stringization" != "#expr"], [
1297  AC_DEFINE_UNQUOTED(STRINGIZE0(expr),$rb_cv_stringization)
1298  AC_DEFINE(OLD_FASHIONED_STRINGIZATION,1)
1299])
1300
1301AC_CACHE_CHECK([string literal concatenation],
1302  rb_cv_string_literal_concatenation, [
1303  AC_COMPILE_IFELSE([
1304    AC_LANG_BOOL_COMPILE_TRY([
1305const char concatenated_literal[[]] = "literals" "to"
1306  "be" "concatenated.";
1307], [sizeof(concatenated_literal) == 26])],
1308    [rb_cv_string_literal_concatenation=yes],
1309    [rb_cv_string_literal_concatenation=no])]
1310)
1311AS_IF([test "$rb_cv_string_literal_concatenation" = no], [
1312  AC_MSG_ERROR([No string literal concatenation])
1313])
1314
1315AC_CACHE_CHECK(for variable length prototypes and stdarg.h, rb_cv_stdarg,
1316  [AC_TRY_COMPILE([
1317#include <stdarg.h>
1318int foo(int x, ...) {
1319	va_list va;
1320	va_start(va, x);
1321	va_arg(va, int);
1322	va_arg(va, char *);
1323	va_arg(va, double);
1324	return 0;
1325}
1326], [return foo(10, "", 3.14);],
1327	rb_cv_stdarg=yes,
1328	rb_cv_stdarg=no)])
1329AS_IF([test "$rb_cv_stdarg" = yes], [
1330  AC_DEFINE(HAVE_STDARG_PROTOTYPES)
1331])
1332
1333AC_CACHE_CHECK(for variable length macro, rb_cv_va_args_macro,
1334  [AC_TRY_COMPILE([
1335int foo(int x, ...);
1336@%:@define FOO(a, ...) foo(a, @%:@@%:@__VA_ARGS__)
1337], [FOO(1);FOO(1,2);FOO(1,2,3);],
1338  rb_cv_va_args_macro=yes,
1339  rb_cv_va_args_macro=no)])
1340AS_IF([test "$rb_cv_va_args_macro" = yes], [
1341  AC_DEFINE(HAVE_VA_ARGS_MACRO)
1342])
1343
1344AC_CACHE_CHECK([for alignas() syntax], rb_cv_have_alignas, [
1345rb_cv_have_alignas=no
1346RUBY_WERROR_FLAG([
1347for attr in \
1348    "_Alignas(x)" \
1349    "alignas(x)" \
1350    "@<:@@<:@alignas(x)@:>@@:>@" \
1351    "__declspec(aligned(x))" \
1352    "__attribute__((__aligned__(x)))" \
1353;
1354do
1355    # C11 _Alignas and GCC __attribute__((__aligned__)) behave
1356    # slightly differently.  What we want is GCC's.  Check that
1357    # here by something C11 does not allow (`struct ALIGNAS ...`)
1358    AC_TRY_COMPILE(
1359	[@%:@define ALIGNAS(x) $attr
1360	struct ALIGNAS(128) conftest_tag { int foo; } foo; ], [],
1361        [rb_cv_have_alignas="$attr"; break], [])
1362done
1363])])
1364AS_IF([test "$rb_cv_have_alignas" != no], [
1365    AC_DEFINE_UNQUOTED([RUBY_ALIGNAS(x)], $rb_cv_have_alignas)
1366])
1367
1368AC_CACHE_CHECK([for alignof() syntax], rb_cv_have_alignof,[
1369rb_cv_have_alignof=no
1370RUBY_WERROR_FLAG([
1371for expr in \
1372    "alignof" \
1373    "_Alignof" \
1374    "__alignof" \
1375    "__alignof__" \
1376;
1377do
1378    AC_TRY_COMPILE([
1379    @%:@ifdef HAVE_STDALIGN_H
1380    @%:@include <stdalign.h>
1381    @%:@endif],[return (int)$expr(int);],
1382        [rb_cv_have_alignof="$expr"; break], [])
1383done
1384])])
1385AS_IF([test "$rb_cv_have_alignof" != no], [
1386    AC_DEFINE_UNQUOTED(RUBY_ALIGNOF, $rb_cv_have_alignof)
1387])
1388
1389RUBY_FUNC_ATTRIBUTE(__const__, CONSTFUNC)
1390RUBY_FUNC_ATTRIBUTE(__pure__, PUREFUNC)
1391RUBY_FUNC_ATTRIBUTE(__noreturn__, NORETURN)
1392RUBY_FUNC_ATTRIBUTE(__deprecated__, DEPRECATED)
1393RUBY_FUNC_ATTRIBUTE(__deprecated__("by "@%:@n), DEPRECATED_BY(n,x), rb_cv_func_deprecated_by)
1394RUBY_TYPE_ATTRIBUTE(__deprecated__ mesg, DEPRECATED_TYPE(mesg,x), rb_cv_type_deprecated)
1395RUBY_FUNC_ATTRIBUTE(__noinline__, NOINLINE)
1396RUBY_FUNC_ATTRIBUTE(__always_inline__, ALWAYS_INLINE)
1397RUBY_FUNC_ATTRIBUTE(__no_sanitize__(san), NO_SANITIZE(san, x), rb_cv_func_no_sanitize)
1398RUBY_FUNC_ATTRIBUTE(__no_sanitize_address__, NO_SANITIZE_ADDRESS)
1399RUBY_FUNC_ATTRIBUTE(__no_address_safety_analysis__, NO_ADDRESS_SAFETY_ANALYSIS)
1400RUBY_FUNC_ATTRIBUTE(__warn_unused_result__, WARN_UNUSED_RESULT)
1401RUBY_FUNC_ATTRIBUTE(__unused__, MAYBE_UNUSED)
1402RUBY_FUNC_ATTRIBUTE(__error__ mesg, ERRORFUNC(mesg,x), rb_cv_func___error__)
1403RUBY_FUNC_ATTRIBUTE(__warning__ mesg, WARNINGFUNC(mesg,x), rb_cv_func___warning__)
1404RUBY_FUNC_ATTRIBUTE(__weak__, WEAK, rb_cv_func_weak)
1405AS_IF([test "$rb_cv_func_weak" != x], [
1406   AC_DEFINE(HAVE_FUNC_WEAK)
1407])
1408
1409if_i386=${universal_binary+[defined __i386__]}
1410RUBY_FUNC_ATTRIBUTE(__stdcall__,  FUNC_STDCALL,  rb_cv_func_stdcall,  ${if_i386})
1411RUBY_FUNC_ATTRIBUTE(__cdecl__,    FUNC_CDECL,    rb_cv_func_cdecl,    ${if_i386})
1412RUBY_FUNC_ATTRIBUTE(__fastcall__, FUNC_FASTCALL, rb_cv_func_fastcall, ${if_i386})
1413RUBY_FUNC_ATTRIBUTE(__optimize__("O0"), FUNC_UNOPTIMIZED, rb_cv_func_unoptimized)
1414RUBY_FUNC_ATTRIBUTE(__optimize__("-Os","-fomit-frame-pointer"), FUNC_MINIMIZED, rb_cv_func_minimized)
1415
1416AS_IF([test "$GCC" = yes], [
1417    AC_CACHE_CHECK([for function alias], [rb_cv_gcc_function_alias],
1418	[rb_cv_gcc_function_alias=no
1419	for a in alias weak,alias; do
1420	    AC_TRY_LINK([void foo(void) {}
1421		void bar(void) __attribute__(($a("foo")));], [bar()],
1422		[rb_cv_gcc_function_alias=$a; break])
1423	done])
1424    AS_IF([test "$rb_cv_gcc_function_alias" != no], [
1425	AC_DEFINE(HAVE_ATTRIBUTE_FUNCTION_ALIAS)
1426	AC_DEFINE_UNQUOTED([RUBY_ALIAS_FUNCTION_TYPE(type, prot, name, args)],
1427			   [type prot __attribute__(($rb_cv_gcc_function_alias(@%:@name)));])
1428	AC_DEFINE_UNQUOTED([RUBY_ALIAS_FUNCTION_VOID(prot, name, args)],
1429			   [RUBY_ALIAS_FUNCTION_TYPE(void, prot, name, args)])
1430    ])
1431
1432    AC_CACHE_CHECK([for __atomic builtins], [rb_cv_gcc_atomic_builtins], [
1433	AC_TRY_LINK([unsigned int atomic_var;],
1434		    [
1435			__atomic_exchange_n(&atomic_var, 0, __ATOMIC_SEQ_CST);
1436			__atomic_exchange_n(&atomic_var, 1, __ATOMIC_SEQ_CST);
1437			__atomic_fetch_add(&atomic_var, 1, __ATOMIC_SEQ_CST);
1438			__atomic_fetch_sub(&atomic_var, 1, __ATOMIC_SEQ_CST);
1439			__atomic_or_fetch(&atomic_var, 1, __ATOMIC_SEQ_CST);
1440		    ],
1441		    [rb_cv_gcc_atomic_builtins=yes],
1442		    [rb_cv_gcc_atomic_builtins=no])])
1443    AS_IF([test "$rb_cv_gcc_atomic_builtins" = yes], [
1444	AC_DEFINE(HAVE_GCC_ATOMIC_BUILTINS)
1445    ])
1446
1447    AC_CACHE_CHECK([for __sync builtins], [rb_cv_gcc_sync_builtins], [
1448	AC_TRY_LINK([unsigned int atomic_var;],
1449		    [
1450			__sync_lock_test_and_set(&atomic_var, 0);
1451			__sync_lock_test_and_set(&atomic_var, 1);
1452			__sync_fetch_and_add(&atomic_var, 1);
1453			__sync_fetch_and_sub(&atomic_var, 1);
1454			__sync_or_and_fetch(&atomic_var, 1);
1455			__sync_val_compare_and_swap(&atomic_var, 0, 1);
1456		    ],
1457		    [rb_cv_gcc_sync_builtins=yes],
1458		    [rb_cv_gcc_sync_builtins=no])])
1459    AS_IF([test "$rb_cv_gcc_sync_builtins" = yes], [
1460	AC_DEFINE(HAVE_GCC_SYNC_BUILTINS)
1461    ])
1462
1463    AC_CACHE_CHECK(for __builtin_unreachable, rb_cv_func___builtin_unreachable,
1464    [RUBY_WERROR_FLAG(
1465    [AC_TRY_LINK([volatile int zero;],
1466	[if (zero) __builtin_unreachable();],
1467	[rb_cv_func___builtin_unreachable=yes],
1468	[rb_cv_func___builtin_unreachable=no])
1469    ])
1470    ])
1471    AS_IF([test "$rb_cv_func___builtin_unreachable" = yes], [
1472	AC_DEFINE_UNQUOTED(UNREACHABLE, [__builtin_unreachable()])
1473    ])
1474])
1475
1476AC_CACHE_CHECK(for exported function attribute, rb_cv_func_exported, [
1477rb_cv_func_exported=no
1478RUBY_WERROR_FLAG([
1479for mac in '__attribute__ ((__visibility__("default")))' '__declspec(dllexport)'; do
1480  AC_TRY_COMPILE([@%:@define RUBY_FUNC_EXPORTED $mac extern
1481    RUBY_FUNC_EXPORTED void conftest_attribute_check(void);], [],
1482    [rb_cv_func_exported="$mac"; break])
1483done
1484])])
1485AS_IF([test "$rb_cv_func_exported" != no], [
1486    AC_DEFINE_UNQUOTED(RUBY_FUNC_EXPORTED, [$rb_cv_func_exported extern])
1487])
1488
1489RUBY_APPEND_OPTION(XCFLAGS, -DRUBY_EXPORT)
1490
1491AC_ARG_ENABLE(mathn,
1492    AS_HELP_STRING([--disable-mathn], [disable canonicalization for mathn]),
1493    [mathn=$enableval], [mathn=yes])
1494test "x$mathn" = xyes || mathn=
1495AC_SUBST(MATHN, $mathn)
1496
1497AC_CACHE_CHECK(for function name string predefined identifier,
1498    rb_cv_function_name_string,
1499    [rb_cv_function_name_string=no
1500    RUBY_WERROR_FLAG([
1501	for func in __func__ __FUNCTION__; do
1502	    AC_TRY_LINK([@%:@include <stdio.h>],
1503			[puts($func);],
1504			[rb_cv_function_name_string=$func
1505			break])
1506	done
1507    ])]
1508)
1509AS_IF([test "$rb_cv_function_name_string" != no], [
1510    AC_DEFINE_UNQUOTED(RUBY_FUNCTION_NAME_STRING, [$rb_cv_function_name_string])
1511])
1512
1513AC_CACHE_CHECK(if enum over int is allowed, rb_cv_enum_over_int, [
1514    rb_cv_enum_over_int=no
1515    AS_IF([test "x$ac_cv_type_long_long" = xyes], [
1516	type="unsigned long long" max="ULLONG_MAX"
1517    ], [
1518	type="unsigned long" max="ULONG_MAX"
1519    ])
1520    RUBY_WERROR_FLAG([
1521        AC_COMPILE_IFELSE([
1522            AC_LANG_BOOL_COMPILE_TRY([
1523                    @%:@include <limits.h>
1524                    enum {conftest_max = $max};
1525                ], [
1526                    (conftest_max == $max) &&
1527                    (sizeof(conftest_max) == sizeof($type))
1528                ]
1529	    )],
1530	    [rb_cv_enum_over_int=yes],
1531	    [rb_cv_enum_over_int=no]
1532	)
1533    ])
1534])
1535AS_IF([test $rb_cv_enum_over_int = yes], [
1536    AC_DEFINE(ENUM_OVER_INT, 1)
1537])
1538
1539dnl Check whether we need to define sys_nerr locally
1540AC_CHECK_DECLS([sys_nerr], [], [], [$ac_includes_default
1541@%:@include <errno.h>])
1542
1543AC_CHECK_DECLS([getenv])
1544
1545AS_CASE(["$target_cpu"],
1546[alpha*|sh4|sh4el|sh4eb], [AS_CASE(["$target_os"::"$GCC"],
1547		[*::yes],  # gcc
1548			[CFLAGS="-mieee $CFLAGS"],
1549		[osf*],    # ccc
1550			[CFLAGS="-ieee $CFLAGS"],
1551		)],
1552[sparc*], [AC_LIBOBJ([sparc])])
1553
1554ac_cv_header_net_socket_h=${ac_cv_header_net_socket_h=no}
1555AS_IF([test "$ac_cv_header_net_socket_h" = yes], [
1556    ac_cv_header_sys_socket_h=${ac_cv_header_sys_socket_h=no}
1557], [
1558    ac_cv_header_sys_socket_h=${ac_cv_header_sys_socket_h=yes}
1559])
1560
1561
1562AC_TYPE_SIZE_T
1563RUBY_CHECK_SIGNEDNESS(size_t, [AC_MSG_ERROR(size_t is signed)], [],
1564		      [@%:@include <sys/types.h>])
1565RUBY_CHECK_SIZEOF(size_t, [int long void*], [], [@%:@include <sys/types.h>])
1566RUBY_CHECK_SIZEOF(ptrdiff_t, size_t, [], [@%:@include <stddef.h>])
1567RUBY_CHECK_PRINTF_PREFIX(size_t, z)
1568RUBY_CHECK_PRINTF_PREFIX(ptrdiff_t, t)
1569AC_STRUCT_ST_BLKSIZE
1570AC_STRUCT_ST_BLOCKS
1571AC_STRUCT_ST_RDEV
1572RUBY_CHECK_SIZEOF([struct stat.st_size], [off_t int long "long long"], [], [@%:@include <sys/stat.h>])
1573AS_IF([test "$ac_cv_member_struct_stat_st_blocks" = yes], [
1574    RUBY_CHECK_SIZEOF([struct stat.st_blocks], [off_t int long "long long"], [], [@%:@include <sys/stat.h>])
1575])
1576RUBY_CHECK_SIZEOF([struct stat.st_ino], [long "long long"], [], [@%:@include <sys/stat.h>])
1577AC_CHECK_MEMBERS([struct stat.st_atim])
1578AC_CHECK_MEMBERS([struct stat.st_atimespec])
1579AC_CHECK_MEMBERS([struct stat.st_atimensec])
1580AC_CHECK_MEMBERS([struct stat.st_mtim])
1581AC_CHECK_MEMBERS([struct stat.st_mtimespec])
1582AC_CHECK_MEMBERS([struct stat.st_mtimensec])
1583AC_CHECK_MEMBERS([struct stat.st_ctim])
1584AC_CHECK_MEMBERS([struct stat.st_ctimespec])
1585AC_CHECK_MEMBERS([struct stat.st_ctimensec])
1586AC_CHECK_MEMBERS([struct stat.st_birthtimespec])
1587
1588AC_CHECK_TYPES([struct timeval], [], [], [@%:@ifdef HAVE_TIME_H
1589@%:@include <time.h>
1590@%:@endif
1591@%:@ifdef HAVE_SYS_TIME_H
1592@%:@include <sys/time.h>
1593@%:@endif])
1594
1595AS_IF([test "${ac_cv_type_struct_timeval}" = yes], [
1596    RUBY_CHECK_SIZEOF([struct timeval.tv_sec], [time_t long "long long"], [],
1597		      [@%:@ifdef HAVE_TIME_H
1598@%:@include <time.h>
1599@%:@endif
1600@%:@ifdef HAVE_SYS_TIME_H
1601@%:@include <sys/time.h>
1602@%:@endif])
1603    AS_CASE(${ac_cv_sizeof_struct_timeval_tv_sec},
1604	    [SIZEOF_INT], [t=int],
1605	    [SIZEOF_LONG], [t=long],
1606	    [SIZEOF_LONG_LONG], [t=LONG_LONG],
1607	    [t=])
1608    AS_IF([test "${t}" != ""], [
1609	AC_DEFINE_UNQUOTED(TYPEOF_TIMEVAL_TV_SEC, [$t])
1610    ])
1611])
1612
1613AC_CHECK_TYPES([struct timespec], [], [], [@%:@ifdef HAVE_TIME_H
1614@%:@include <time.h>
1615@%:@endif
1616@%:@ifdef HAVE_SYS_TIME_H
1617@%:@include <sys/time.h>
1618@%:@endif])
1619
1620AC_CHECK_TYPES([struct timezone], [], [], [@%:@ifdef HAVE_TIME_H
1621@%:@ include <time.h>
1622@%:@endif
1623@%:@ifdef HAVE_SYS_TIME_H
1624@%:@ include <sys/time.h>
1625@%:@endif])
1626
1627AC_CACHE_VAL([rb_cv_large_fd_select],
1628    [AC_CHECK_TYPE(fd_mask, [rb_cv_large_fd_select=yes], [rb_cv_large_fd_select=no], [AC_INCLUDES_DEFAULT([])
1629@%:@ifdef HAVE_SYS_SELECT_H
1630@%:@ include <sys/select.h>
1631@%:@endif])])
1632AS_IF([test "$rb_cv_large_fd_select" = yes], [
1633    AC_DEFINE(HAVE_RB_FD_INIT, 1)
1634])
1635
1636RUBY_DEFINT(int8_t, 1)
1637RUBY_DEFINT(uint8_t, 1, unsigned)
1638RUBY_DEFINT(int16_t, 2)
1639RUBY_DEFINT(uint16_t, 2, unsigned)
1640RUBY_DEFINT(int32_t, 4)
1641RUBY_DEFINT(uint32_t, 4, unsigned)
1642RUBY_DEFINT(int64_t, 8)
1643RUBY_DEFINT(uint64_t, 8, unsigned)
1644RUBY_DEFINT(int128_t, 16)
1645RUBY_DEFINT(uint128_t, 16, unsigned)
1646RUBY_DEFINT(intptr_t, void*)
1647RUBY_DEFINT(uintptr_t, void*, unsigned)
1648AS_IF([test "x$rb_cv_type_intptr_t" != xno], [
1649    RUBY_CHECK_PRINTF_PREFIX(intptr_t, '' ll I64 l, PTR)
1650])
1651RUBY_DEFINT(ssize_t, size_t, [], [@%:@include <sys/types.h>])	dnl may differ from int, so not use AC_TYPE_SSIZE_T.
1652AS_IF([test "x$rb_cv_type_int64_t" != xno], [
1653    RUBY_CHECK_PRINTF_PREFIX(int64_t, ll I64 l, 64)
1654])
1655
1656AC_CACHE_CHECK(for stack end address, rb_cv_stack_end_address,
1657[rb_cv_stack_end_address=no
1658  AC_TRY_LINK(
1659    [extern void *__libc_stack_end;],
1660    [if (!__libc_stack_end) return 1;],
1661    [rb_cv_stack_end_address="__libc_stack_end"])
1662])
1663AS_IF([test $rb_cv_stack_end_address != no], [
1664  AC_DEFINE_UNQUOTED(STACK_END_ADDRESS, $rb_cv_stack_end_address)
1665])
1666
1667dnl Checks for library functions.
1668AC_TYPE_GETGROUPS
1669AC_TYPE_SIGNAL
1670AS_CASE(["${target_cpu}-${target_os}:${target_archs}"],
1671[powerpc-darwin*], [
1672  AC_LIBSOURCES(alloca.c)
1673  AC_SUBST([ALLOCA], [\${LIBOBJDIR}alloca.${ac_objext}])
1674  AC_DEFINE(C_ALLOCA)
1675  AC_DEFINE_UNQUOTED(alloca, alloca)
1676  ],
1677[universal-darwin*:*ppc*], [
1678  AC_LIBSOURCES(alloca.c)
1679  AC_SUBST([ALLOCA], [\${LIBOBJDIR}alloca.${ac_objext}])
1680  RUBY_DEFINE_IF([defined __powerpc__], C_ALLOCA, 1)
1681  RUBY_DEFINE_IF([defined __powerpc__], alloca, alloca)
1682  ],
1683[
1684  AC_FUNC_ALLOCA
1685  ])
1686AS_IF([test "x$ALLOCA" = "x"], [
1687    AC_CACHE_CHECK([for dynamic size alloca], rb_cv_dynamic_alloca, [
1688    for chk in ok __chkstk; do
1689	AC_TRY_LINK([
1690	    @%:@ifdef HAVE_ALLOCA_H
1691	    @%:@include <alloca.h>
1692	    @%:@endif
1693	    void $chk() {}
1694	    int dynamic_alloca_test;
1695	    int dynamic_alloca_result;],
1696	    [dynamic_alloca_result = alloca(dynamic_alloca_test) != 0;],
1697	    [rb_cv_dynamic_alloca=$chk; break])
1698    done])
1699    AS_IF([test "x$rb_cv_dynamic_alloca" = "x__chkstk"], [
1700	AC_DEFINE_UNQUOTED(RUBY_ALLOCA_CHKSTK, _$rb_cv_dynamic_alloca)
1701	AS_CASE("$target_cpu",
1702	[x64|x86_64], [
1703	    AC_SUBST([ALLOCA], [\${LIBOBJDIR}x86_64-chkstk.${ac_objext}])
1704	],)
1705    ])
1706])
1707AC_FUNC_MEMCMP
1708
1709# http://sources.redhat.com/ml/libc-hacker/2005-08/msg00008.html
1710# Debian GNU/Linux Etch's libc6.1 2.3.6.ds1-13etch5 has this problem.
1711# Debian GNU/Linux Lenny's libc6.1 2.7-10 has no problem.
1712AC_CACHE_CHECK(for broken erfc of glibc-2.3.6 on IA64, rb_cv_broken_glibc_ia64_erfc,
1713  [AC_TRY_RUN([
1714#include <math.h>
1715int
1716main()
1717{
1718   erfc(10000.0);
1719   return 0;
1720}
1721],
1722	rb_cv_broken_glibc_ia64_erfc=no,
1723	rb_cv_broken_glibc_ia64_erfc=yes,
1724	rb_cv_broken_glibc_ia64_erfc=no)])
1725AS_CASE([$rb_cv_broken_glibc_ia64_erfc],[yes],[ac_cv_func_erf=no])
1726
1727AS_CASE(["$target_os"],[freebsd*],[
1728	 AC_DEFINE(BROKEN_CLOSE)
1729	 AC_REPLACE_FUNCS(close)
1730	 ])
1731
1732AC_REPLACE_FUNCS(acosh)
1733AC_REPLACE_FUNCS(cbrt)
1734AC_REPLACE_FUNCS(crypt)
1735AC_REPLACE_FUNCS(dup2)
1736AC_REPLACE_FUNCS(erf)
1737AC_REPLACE_FUNCS(explicit_bzero)
1738AC_REPLACE_FUNCS(ffs)
1739AC_REPLACE_FUNCS(finite)
1740AC_REPLACE_FUNCS(flock)
1741AC_REPLACE_FUNCS(hypot)
1742AC_REPLACE_FUNCS(isinf)
1743AC_REPLACE_FUNCS(isnan)
1744AC_REPLACE_FUNCS(lgamma_r)
1745AC_REPLACE_FUNCS(memmove)
1746AC_REPLACE_FUNCS(nan)
1747AC_REPLACE_FUNCS(nextafter)
1748AC_REPLACE_FUNCS(setproctitle)
1749AC_REPLACE_FUNCS(strchr)
1750AC_REPLACE_FUNCS(strerror)
1751AC_REPLACE_FUNCS(strlcat)
1752AC_REPLACE_FUNCS(strlcpy)
1753AC_REPLACE_FUNCS(strstr)
1754AC_REPLACE_FUNCS(tgamma)
1755
1756# for missing/setproctitle.c
1757AS_CASE(["$target_os"],
1758[aix* | k*bsd*-gnu | kopensolaris*-gnu | linux* | darwin*], [AC_DEFINE(SPT_TYPE,SPT_REUSEARGV)],
1759[hpux*], [AC_DEFINE(SPT_TYPE,SPT_PSTAT) ],
1760[])
1761AC_CHECK_HEADERS(sys/pstat.h)
1762
1763
1764AC_CACHE_CHECK(for signbit, rb_cv_have_signbit,
1765  [AC_TRY_LINK([
1766#include <math.h>
1767], [int v = signbit(-0.0);],
1768	rb_cv_have_signbit=yes,
1769	rb_cv_have_signbit=no)])
1770AS_IF([test "$rb_cv_have_signbit" = yes], [
1771  AC_DEFINE(HAVE_SIGNBIT)
1772], [
1773  AC_LIBOBJ([signbit])
1774])
1775
1776AC_CACHE_CHECK(for broken memmem, rb_cv_broken_memmem, [
1777    AC_TRY_RUN([
1778@%:@include <string.h>
1779
1780int
1781main(int argc, char **argv)
1782{
1783    const char *str = "hogefugafoobar";
1784    const char *rs = "foo";
1785    const char *empty = "";
1786    char *p;
1787
1788    p = memmem(str, strlen(str), rs, strlen(rs));
1789    if (p == str+8) {
1790	p = memmem(str, strlen(str), empty, strlen(empty));
1791	if (p == str)
1792	    return 0;
1793    }
1794    return 1;
1795}
1796    ],
1797    rb_cv_broken_memmem=no,
1798    rb_cv_broken_memmem=yes,
1799    rb_cv_broken_memmem=yes)
1800])
1801test x"$rb_cv_broken_memmem" = xyes && ac_cv_func_memmem=no
1802
1803AC_FUNC_FORK
1804
1805AC_CHECK_FUNCS(__syscall)
1806AC_CHECK_FUNCS(_longjmp)		# used for AC_ARG_WITH(setjmp-type)
1807# we don't use _setjmp if _longjmp doesn't exist.
1808test x$ac_cv_func__longjmp = xno && ac_cv_func__setjmp=no
1809AC_CHECK_FUNCS(arc4random_buf)
1810AC_CHECK_FUNCS(atan2l atan2f)
1811AC_CHECK_FUNCS(chroot)
1812AC_CHECK_FUNCS(chsize)
1813AC_CHECK_FUNCS(clock_gettime)
1814AC_CHECK_FUNCS(cosh)
1815AC_CHECK_FUNCS(crypt_r)
1816AC_CHECK_FUNCS(daemon)
1817AC_CHECK_FUNCS(dirfd)
1818AC_CHECK_FUNCS(dl_iterate_phdr)
1819AC_CHECK_FUNCS(dlopen)
1820AC_CHECK_FUNCS(dladdr)
1821AC_CHECK_FUNCS(dup)
1822AC_CHECK_FUNCS(dup3)
1823AC_CHECK_FUNCS(eaccess)
1824AC_CHECK_FUNCS(endgrent)
1825AC_CHECK_FUNCS(eventfd)
1826AC_CHECK_FUNCS(fchmod)
1827AC_CHECK_FUNCS(fchown)
1828AC_CHECK_FUNCS(fcntl)
1829AC_CHECK_FUNCS(fdatasync)
1830AC_CHECK_FUNCS(fdopendir)
1831AC_CHECK_FUNCS(fgetattrlist)
1832AC_CHECK_FUNCS(fmod)
1833AC_CHECK_FUNCS(fstatat)
1834AC_CHECK_FUNCS(fsync)
1835AC_CHECK_FUNCS(ftruncate)
1836AC_CHECK_FUNCS(ftruncate64)		# used for Win32 platform
1837AC_CHECK_FUNCS(getattrlist)
1838AC_CHECK_FUNCS(getcwd)
1839AC_CHECK_FUNCS(getgidx)
1840AC_CHECK_FUNCS(getgrnam)
1841AC_CHECK_FUNCS(getgrnam_r)
1842AC_CHECK_FUNCS(getgroups)
1843AC_CHECK_FUNCS(getlogin)
1844AC_CHECK_FUNCS(getlogin_r)
1845AC_CHECK_FUNCS(getpgid)
1846AC_CHECK_FUNCS(getpgrp)
1847AC_CHECK_FUNCS(getpriority)
1848AC_CHECK_FUNCS(getpwnam)
1849AC_CHECK_FUNCS(getpwnam_r)
1850AC_CHECK_FUNCS(getpwuid)
1851AC_CHECK_FUNCS(getpwuid_r)
1852AC_CHECK_FUNCS(getresgid)
1853AC_CHECK_FUNCS(getresuid)
1854AC_CHECK_FUNCS(getrlimit)
1855AC_CHECK_FUNCS(getsid)
1856AC_CHECK_FUNCS(gettimeofday)		# for making ac_cv_func_gettimeofday
1857AC_CHECK_FUNCS(getuidx)
1858AC_CHECK_FUNCS(gmtime_r)
1859AC_CHECK_FUNCS(grantpt)
1860AC_CHECK_FUNCS(initgroups)
1861AC_CHECK_FUNCS(ioctl)
1862AC_CHECK_FUNCS(isfinite)
1863AC_CHECK_FUNCS(issetugid)
1864AC_CHECK_FUNCS(killpg)
1865AC_CHECK_FUNCS(lchmod)
1866AC_CHECK_FUNCS(lchown)
1867AC_CHECK_FUNCS(link)
1868AC_CHECK_FUNCS(llabs)
1869AC_CHECK_FUNCS(lockf)
1870AC_CHECK_FUNCS(log2)
1871AC_CHECK_FUNCS(lstat)
1872AC_CHECK_FUNCS(lutimes)
1873AC_CHECK_FUNCS(malloc_usable_size)
1874AC_CHECK_FUNCS(malloc_size)
1875AC_CHECK_FUNCS(mblen)
1876AC_CHECK_FUNCS(memalign)
1877AC_CHECK_FUNCS(memset_s)
1878AC_CHECK_FUNCS(writev)
1879AC_CHECK_FUNCS(memrchr)
1880AC_CHECK_FUNCS(memmem)
1881AC_CHECK_FUNCS(mkfifo)
1882AC_CHECK_FUNCS(mknod)
1883AC_CHECK_FUNCS(mktime)
1884AC_CHECK_FUNCS(openat)
1885AC_CHECK_FUNCS(pipe2)
1886AC_CHECK_FUNCS(poll)
1887AC_CHECK_FUNCS(posix_fadvise)
1888AC_CHECK_FUNCS(posix_memalign)
1889AC_CHECK_FUNCS(ppoll)
1890AC_CHECK_FUNCS(pread)
1891AC_CHECK_FUNCS(pwrite)
1892AC_CHECK_FUNCS(qsort_r)
1893AC_CHECK_FUNCS(qsort_s)
1894AC_CHECK_FUNCS(readlink)
1895AC_CHECK_FUNCS(round)
1896AC_CHECK_FUNCS(sched_getaffinity)
1897AC_CHECK_FUNCS(seekdir)
1898AC_CHECK_FUNCS(select_large_fdset)
1899AC_CHECK_FUNCS(sendfile)
1900AC_CHECK_FUNCS(setegid)
1901AC_CHECK_FUNCS(setenv)
1902AC_CHECK_FUNCS(seteuid)
1903AC_CHECK_FUNCS(setgid)
1904AC_CHECK_FUNCS(setgroups)
1905AC_CHECK_FUNCS(setpgid)
1906AC_CHECK_FUNCS(setpgrp)
1907AC_CHECK_FUNCS(setregid)
1908AC_CHECK_FUNCS(setresgid)
1909AC_CHECK_FUNCS(setresuid)
1910AC_CHECK_FUNCS(setreuid)
1911AC_CHECK_FUNCS(setrgid)
1912AC_CHECK_FUNCS(setrlimit)
1913AC_CHECK_FUNCS(setruid)
1914AC_CHECK_FUNCS(setsid)
1915AC_CHECK_FUNCS(setuid)
1916AC_CHECK_FUNCS(shutdown)
1917AC_CHECK_FUNCS(sigaction)
1918AC_CHECK_FUNCS(sigaltstack)
1919AC_CHECK_FUNCS(sigprocmask)
1920AC_CHECK_FUNCS(sinh)
1921AC_CHECK_FUNCS(spawnv)
1922AC_CHECK_FUNCS(symlink)
1923AC_CHECK_FUNCS(syscall)
1924AC_CHECK_FUNCS(sysconf)
1925AC_CHECK_FUNCS(tanh)
1926AC_CHECK_FUNCS(telldir)
1927AC_CHECK_FUNCS(timegm)
1928AC_CHECK_FUNCS(times)
1929AC_CHECK_FUNCS(truncate)
1930AC_CHECK_FUNCS(truncate64)		# used for Win32
1931AC_CHECK_FUNCS(unsetenv)
1932AC_CHECK_FUNCS(utimensat)
1933AC_CHECK_FUNCS(utimes)
1934AC_CHECK_FUNCS(wait4)
1935AC_CHECK_FUNCS(waitpid)
1936
1937AS_CASE(["$ac_cv_func_memset_s:$ac_cv_func_qsort_s"], [*yes*],
1938    [RUBY_DEFINE_IF([!defined __STDC_WANT_LIB_EXT1__], [__STDC_WANT_LIB_EXT1__], 1)])
1939
1940AS_IF([test "$ac_cv_func_getcwd" = yes], [
1941    AC_CACHE_CHECK(if getcwd allocates buffer if NULL is given, [rb_cv_getcwd_malloc],
1942	[AC_TRY_RUN([
1943@%:@include <stddef.h>
1944@%:@include <stdio.h>
1945@%:@ifdef HAVE_UNISTD_H
1946@%:@include <unistd.h>
1947@%:@endif
1948@%:@ifndef EXIT_SUCCESS
1949@%:@define EXIT_SUCCESS 0
1950@%:@endif
1951@%:@ifndef EXIT_FAILURE
1952@%:@define EXIT_FAILURE 1
1953@%:@endif
1954
1955int
1956main(int argc, char **argv)
1957{
1958    if (!getcwd(NULL, 0)) return EXIT_FAILURE;
1959    return EXIT_SUCCESS;
1960}
1961],
1962	    rb_cv_getcwd_malloc=yes,
1963	    rb_cv_getcwd_malloc=no,
1964	    AS_CASE($target_os,
1965		[linux*|darwin*|*bsd|cygwin*|mingw*|mswin*],
1966		[rb_cv_getcwd_malloc=yes],
1967		[rb_cv_getcwd_malloc=no]))])
1968    AS_IF([test "$rb_cv_getcwd_malloc" = no], [AC_DEFINE(NO_GETCWD_MALLOC, 1)])
1969])
1970
1971AS_IF([test "$ac_cv_func_crypt_r" = yes],
1972    [AC_CHECK_HEADERS(crypt.h)])
1973AS_IF([test "$ac_cv_func_crypt_r:$ac_cv_header_crypt_h" = yes:yes],
1974    [AC_CHECK_MEMBERS([struct crypt_data.initialized], [], [],
1975		      [AC_INCLUDES_DEFAULT([@%:@include <crypt.h>])])])
1976
1977RUBY_CHECK_BUILTIN_FUNC(__builtin_alloca_with_align, [__builtin_alloca_with_align(1, 4096)])
1978RUBY_CHECK_BUILTIN_FUNC(__builtin_assume_aligned, [__builtin_assume_aligned((void*)32, 32)])
1979RUBY_CHECK_BUILTIN_FUNC(__builtin_bswap16, [__builtin_bswap16(0)])
1980RUBY_CHECK_BUILTIN_FUNC(__builtin_bswap32, [__builtin_bswap32(0)])
1981RUBY_CHECK_BUILTIN_FUNC(__builtin_bswap64, [__builtin_bswap64(0)])
1982RUBY_CHECK_BUILTIN_FUNC(__builtin_popcount, [__builtin_popcount(0)])
1983RUBY_CHECK_BUILTIN_FUNC(__builtin_popcountll, [__builtin_popcountll(0)])
1984RUBY_CHECK_BUILTIN_FUNC(__builtin_clz, [__builtin_clz(0)])
1985RUBY_CHECK_BUILTIN_FUNC(__builtin_clzl, [__builtin_clzl(0)])
1986RUBY_CHECK_BUILTIN_FUNC(__builtin_clzll, [__builtin_clzll(0)])
1987RUBY_CHECK_BUILTIN_FUNC(__builtin_ctz, [__builtin_ctz(0)])
1988RUBY_CHECK_BUILTIN_FUNC(__builtin_ctzll, [__builtin_ctzll(0)])
1989RUBY_CHECK_BUILTIN_FUNC(__builtin_add_overflow, [int x;__builtin_add_overflow(0,0,&x)])
1990RUBY_CHECK_BUILTIN_FUNC(__builtin_sub_overflow, [int x;__builtin_sub_overflow(0,0,&x)])
1991RUBY_CHECK_BUILTIN_FUNC(__builtin_mul_overflow, [int x;__builtin_mul_overflow(0,0,&x)])
1992RUBY_CHECK_BUILTIN_FUNC(__builtin_mul_overflow_p, [__builtin_mul_overflow_p(0,0,(int)0)])
1993RUBY_CHECK_BUILTIN_FUNC(__builtin_constant_p, [__builtin_constant_p(0)])
1994RUBY_CHECK_BUILTIN_FUNC(__builtin_choose_expr, [
1995    [int x[__extension__(__builtin_choose_expr(1, 1, -1))]];
1996    [int y[__extension__(__builtin_choose_expr(0, -1, 1))]];
1997    ])
1998AS_IF([test x$rb_cv_builtin___builtin_choose_expr = xyes], [
1999    RUBY_CHECK_BUILTIN_FUNC(__builtin_choose_expr_constant_p, [
2000    [int x[__extension__(__builtin_choose_expr(__builtin_constant_p(1), 1, -1))]];
2001    [int y[__extension__(__builtin_choose_expr(__builtin_constant_p(foo), -1, 1))]];
2002    ])
2003])
2004RUBY_CHECK_BUILTIN_FUNC(__builtin_types_compatible_p, [__builtin_types_compatible_p(int, int)])
2005RUBY_CHECK_BUILTIN_FUNC(__builtin_trap, [__builtin_trap()])
2006
2007AS_IF([test "$ac_cv_func_qsort_r" != no], [
2008  AC_CACHE_CHECK(whether qsort_r is GNU version, rb_cv_gnu_qsort_r,
2009    [AC_TRY_COMPILE([
2010@%:@include <stdlib.h>
2011void (qsort_r)(void *base, size_t nmemb, size_t size,
2012	    int (*compar)(const void *, const void *, void *),
2013	    void *arg);
2014],[ ],
2015      [rb_cv_gnu_qsort_r=yes],
2016      [rb_cv_gnu_qsort_r=no])
2017  ])
2018  AC_CACHE_CHECK(whether qsort_r is BSD version, rb_cv_bsd_qsort_r,
2019    [AC_TRY_COMPILE([
2020@%:@include <stdlib.h>
2021void (qsort_r)(void *base, size_t nmemb, size_t size,
2022	     void *arg, int (*compar)(void *, const void *, const void *));
2023],[ ],
2024      [rb_cv_bsd_qsort_r=yes],
2025      [rb_cv_bsd_qsort_r=no])
2026  ])
2027  AS_CASE("$rb_cv_gnu_qsort_r:$rb_cv_bsd_qsort_r",
2028  [yes:no], [
2029    AC_DEFINE(HAVE_GNU_QSORT_R, 1)
2030  ],
2031  [no:yes], [
2032    AC_DEFINE(HAVE_BSD_QSORT_R, 1)
2033  ])
2034])
2035
2036AC_CACHE_CHECK(whether atan2 handles Inf as C99, rb_cv_atan2_inf_c99, [
2037    AS_IF([test $ac_cv_func_atan2f:$ac_cv_func_atan2l = yes:yes], [
2038	AC_TRY_RUN([
2039@%:@include <math.h>
2040@%:@ifdef HAVE_UNISTD_H
2041@%:@include <unistd.h>
2042@%:@endif
2043@%:@ifndef EXIT_SUCCESS
2044@%:@define EXIT_SUCCESS 0
2045@%:@endif
2046@%:@ifndef EXIT_FAILURE
2047@%:@define EXIT_FAILURE 1
2048@%:@endif
2049
2050int
2051main(int argc, char **argv)
2052{
2053    if (fabs(atan2(INFINITY, INFINITY) - M_PI_4) <= 0.01) return EXIT_SUCCESS;
2054    return EXIT_FAILURE;
2055}
2056],
2057	[rb_cv_atan2_inf_c99=yes],
2058	[rb_cv_atan2_inf_c99=no],
2059	[AS_CASE($target_os, [mingw*|mswin*], [rb_cv_atan2_inf_c99=no], [rb_cv_atan2_inf_c99=yes])]
2060	)
2061    ], [rb_cv_atan2_inf_c99=no])
2062])
2063AS_IF([test "x$rb_cv_atan2_inf_c99" = xyes], [AC_DEFINE(ATAN2_INF_C99)])
2064
2065# Some platform need -lrt for clock_gettime, but the other don't.
2066AS_IF([test x"$ac_cv_func_clock_gettime" != xyes], [
2067    # glibc 2.17 moves clock_* functions from librt to the main C library.
2068    # http://sourceware.org/ml/libc-announce/2012/msg00001.html
2069    AC_CHECK_LIB(rt, clock_gettime)
2070    AS_IF([test x"$ac_cv_lib_rt_clock_gettime" = xyes], [
2071	AC_DEFINE(HAVE_CLOCK_GETTIME, 1)
2072    ])
2073])
2074AC_CHECK_FUNCS(clock_getres) # clock_getres should be tested after clock_gettime test including librt test.
2075AC_CHECK_LIB([rt], [timer_create])
2076AC_CHECK_LIB([rt], [timer_settime])
2077AS_IF([test x"$ac_cv_lib_rt_timer_create" = xyes], [
2078    AC_DEFINE(HAVE_TIMER_CREATE, 1)
2079])
2080AS_IF([test x"$ac_cv_lib_rt_timer_settime" = xyes], [
2081    AC_DEFINE(HAVE_TIMER_SETTIME, 1)
2082])
2083
2084AC_CACHE_CHECK(for unsetenv returns a value, rb_cv_unsetenv_return_value,
2085  [AC_TRY_COMPILE([
2086#include <stdlib.h>
2087], [int v = unsetenv("foo");],
2088	rb_cv_unsetenv_return_value=yes,
2089	rb_cv_unsetenv_return_value=no)])
2090AS_IF([test "$rb_cv_unsetenv_return_value" = no], [
2091  AC_DEFINE(VOID_UNSETENV)
2092])
2093
2094# End of setjmp check.
2095
2096AC_ARG_ENABLE(setreuid,
2097       AS_HELP_STRING([--enable-setreuid], [use setreuid()/setregid() according to need even if obsolete]),
2098       [use_setreuid=$enableval])
2099AS_IF([test "$use_setreuid" = yes], [
2100    AC_DEFINE(USE_SETREUID)
2101    AC_DEFINE(USE_SETREGID)
2102])
2103AC_STRUCT_TIMEZONE
2104AC_CACHE_CHECK(for struct tm.tm_gmtoff, rb_cv_member_struct_tm_tm_gmtoff,
2105  [AC_TRY_COMPILE([
2106@%:@define _BSD_SOURCE
2107@%:@define _DEFAULT_SOURCE
2108@%:@include <time.h>
2109   ],
2110    [struct tm t; t.tm_gmtoff = 3600;],
2111  [rb_cv_member_struct_tm_tm_gmtoff=yes],
2112  [rb_cv_member_struct_tm_tm_gmtoff=no])])
2113AS_IF([test "$rb_cv_member_struct_tm_tm_gmtoff" = yes], [
2114  AC_DEFINE(HAVE_STRUCT_TM_TM_GMTOFF)
2115])
2116AC_CACHE_CHECK(for external int daylight, rb_cv_have_daylight,
2117  [AC_TRY_LINK([#include <time.h>
2118  int i;],
2119	[i = daylight;],
2120	rb_cv_have_daylight=yes,
2121	rb_cv_have_daylight=no)])
2122AS_IF([test "$rb_cv_have_daylight" = yes], [
2123  AC_DEFINE(HAVE_DAYLIGHT)
2124])
2125
2126AC_CACHE_CHECK(for negative time_t for gmtime(3), rb_cv_negative_time_t,
2127  [AC_TRY_RUN([
2128#include <stdlib.h>
2129#include <time.h>
2130
2131void
2132check(tm, y, m, d, h, s)
2133    struct tm *tm;
2134    int y, m, d, h, s;
2135{
2136    if (!tm ||
2137	tm->tm_year != y ||
2138	tm->tm_mon  != m-1 ||
2139	tm->tm_mday != d ||
2140	tm->tm_hour != h ||
2141	tm->tm_sec  != s) {
2142	exit(1);
2143    }
2144}
2145
2146int
2147main()
2148{
2149   time_t t = -1;
2150   struct tm *tm;
2151
2152   check(gmtime(&t), 69, 12, 31, 23, 59);
2153   t = ~(time_t)0 << 31;
2154   check(gmtime(&t), 1, 12, 13, 20, 52);
2155   return 0;
2156}
2157],
2158	rb_cv_negative_time_t=yes,
2159	rb_cv_negative_time_t=no,
2160	rb_cv_negative_time_t=yes)])
2161AS_IF([test "$rb_cv_negative_time_t" = yes], [
2162  AC_DEFINE(NEGATIVE_TIME_T)
2163])
2164
2165# [ruby-dev:40910] overflow of time on FreeBSD
2166# http://www.freebsd.org/cgi/query-pr.cgi?pr=145341
2167AC_CACHE_CHECK(for localtime(3) overflow correctly, rb_cv_localtime_overflow,
2168  [AC_TRY_RUN([
2169#include <stdlib.h>
2170#include <time.h>
2171
2172void
2173check(time_t t1)
2174{
2175    struct tm *tm;
2176    time_t t2;
2177    tm = localtime(&t1);
2178    if (!tm)
2179	return; /* overflow detected.  ok. */
2180    t2 = mktime(tm);
2181    if (t1 == t2)
2182        return; /* round-trip.  ok. */
2183    exit(1);
2184}
2185
2186int
2187main()
2188{
2189    time_t t;
2190    if (~(time_t)0 <= 0) {
2191        t = (((time_t)1) << (sizeof(time_t) * 8 - 2));
2192        t |= t - 1;
2193    }
2194    else {
2195        t = ~(time_t)0;
2196    }
2197    check(t);
2198    return 0;
2199}
2200],
2201	rb_cv_localtime_overflow=yes,
2202	rb_cv_localtime_overflow=no,
2203	rb_cv_localtime_overflow=no)])
2204AS_IF([test "$rb_cv_localtime_overflow" = no], [
2205  AC_DEFINE(LOCALTIME_OVERFLOW_PROBLEM)
2206])
2207
2208AS_IF([test "$ac_cv_func_sigprocmask" = yes && test "$ac_cv_func_sigaction" = yes], [
2209   AC_DEFINE(POSIX_SIGNAL)
2210], [
2211  AC_CHECK_FUNCS(sigsetmask)
2212  AC_CACHE_CHECK(for BSD signal semantics, rb_cv_bsd_signal,
2213    [AC_TRY_RUN([
2214#include <stdio.h>
2215#include <signal.h>
2216
2217void
2218sig_handler(dummy)
2219     int dummy;
2220{
2221}
2222
2223int
2224main()
2225{
2226  signal(SIGINT, sig_handler);
2227  kill(getpid(), SIGINT);
2228  kill(getpid(), SIGINT);
2229  return 0;
2230}
2231],
2232	rb_cv_bsd_signal=yes,
2233	rb_cv_bsd_signal=no,
2234	rb_cv_bsd_signal=$ac_cv_func_sigsetmask)])
2235  AS_IF([test "$rb_cv_bsd_signal" = yes], [
2236    AC_DEFINE(BSD_SIGNAL)
2237  ])
2238])
2239
2240AC_CHECK_TYPES([sig_t],[],[],[@%:@include <signal.h>])
2241
2242AS_IF([test "$ac_cv_func_getpgid" = no], [
2243  # AC_FUNC_GETPGRP fails when cross-compiling with old autoconf.
2244  # autoconf is changed between 2.52d and 2.52f?
2245  # http://lists.gnu.org/archive/html/bug-gnu-utils/2001-09/msg00181.html
2246  # "autoconf cleanup for AC_FUNC_GETPGRP and GETPGRP_VOID"
2247AC_FUNC_GETPGRP
2248])
2249AS_IF([test "$ac_cv_func_setpgid:$ac_cv_func_setpgrp" = no:yes], [
2250  # AC_FUNC_SETPGRP fails when cross-compiling.  (until autoconf 2.69?)
2251  # https://lists.gnu.org/archive/html/bug-autoconf/2013-02/msg00002.html
2252  # "AC_FUNC_SETPGRP fails to work properly when cross-compiling"
2253AC_FUNC_SETPGRP
2254])
2255
2256AS_IF([test x"$ac_cv_func_dirfd" = xno], [
2257  AS_CASE(["$target_os"],[solaris*],
2258          [AC_CHECK_MEMBERS([DIR.d_fd, DIR.dd_fd],,,[
2259#include <sys/types.h>
2260#include <dirent.h>
2261])])
2262])
2263
2264AS_IF([test x"$target_cpu" = xia64], [
2265    AC_LIBOBJ([ia64])
2266    AC_CACHE_CHECK(for __libc_ia64_register_backing_store_base,
2267                   rb_cv___libc_ia64_register_backing_store_base,
2268    [rb_cv___libc_ia64_register_backing_store_base=no
2269    AC_TRY_LINK(
2270      [extern unsigned long __libc_ia64_register_backing_store_base;],
2271      [unsigned long p = __libc_ia64_register_backing_store_base;
2272       printf("%ld\n", p);],
2273      [rb_cv___libc_ia64_register_backing_store_base=yes])])
2274    AS_IF([test $rb_cv___libc_ia64_register_backing_store_base = yes], [
2275      AC_DEFINE(HAVE___LIBC_IA64_REGISTER_BACKING_STORE_BASE)
2276    ])
2277])
2278
2279AC_CACHE_CHECK(whether right shift preserve sign bit, rb_cv_rshift_sign,
2280    [AC_COMPILE_IFELSE([AC_LANG_BOOL_COMPILE_TRY([], [(-1==(-1>>1))])],
2281	rb_cv_rshift_sign=yes,
2282	rb_cv_rshift_sign=no)])
2283AS_IF([test "$rb_cv_rshift_sign" = yes], [
2284  AC_DEFINE(RSHIFT(x,y), ((x)>>(int)(y)))
2285], [
2286  AC_DEFINE(RSHIFT(x,y), (((x)<0) ? ~((~(x))>>(int)(y)) : (x)>>(int)(y)))
2287])
2288
2289AS_CASE(["$ac_cv_func_gettimeofday:$ac_cv_func_clock_gettime"],
2290[*yes*], [],
2291[
2292    AC_MSG_ERROR(clock_gettime() or gettimeofday() must exist)
2293])
2294
2295AS_IF([test "$ac_cv_func_sysconf" = yes], [
2296  RUBY_CHECK_SYSCONF(CLK_TCK)
2297])
2298
2299AS_IF([test "${universal_binary-no}" = yes ], [
2300    archflagpat=`eval echo '"'"${ARCH_FLAG}"'"' | sed 's/[[][|.*]]/\\&/g'`
2301    save_CFLAGS="$CFLAGS" new_cflags=`echo "$CFLAGS" | sed "s|$archflagpat"'||'`
2302    save_LDFLAGS="$LDFLAGS" new_ldflags=`echo "$LDFLAGS" | sed "s|$archflagpat"'||'`
2303    stack_dir=
2304    for archs in ${universal_archnames}; do
2305	archs=`echo $archs | sed 's/=.*//'`
2306	CFLAGS="$new_cflags -arch $archs"
2307	LDFLAGS="$new_ldflags -arch $archs"
2308	RUBY_STACK_GROW_DIRECTION($archs, dir)
2309	AS_IF([test x$stack_dir = x], [
2310	    stack_dir=$dir
2311	], [test x$stack_dir != x$dir], [
2312	    stack_dir=no
2313	])
2314    done
2315    CFLAGS="$save_CFLAGS" LDFLAGS="$save_LDFLAGS"
2316    AS_IF([test x$stack_dir = xno], [
2317	for archs in ${universal_archnames}; do
2318	    archs=`echo $archs | sed 's/=.*//'`
2319	    eval dir=\$[rb_cv_stack_grow_dir_]AS_TR_SH([$archs])
2320	    RUBY_DEFINE_IF([defined __${archs}__], STACK_GROW_DIRECTION, $dir)
2321	done
2322    ], [
2323	AC_DEFINE_UNQUOTED(STACK_GROW_DIRECTION, $stack_dir)
2324    ])
2325], [
2326    RUBY_STACK_GROW_DIRECTION($target_cpu, dir)
2327    AC_DEFINE_UNQUOTED(STACK_GROW_DIRECTION, $dir)
2328])
2329
2330AC_ARG_ENABLE(fiber-coroutine,
2331    AS_HELP_STRING([--disable-fiber-coroutine], [disable native coroutine implementation for fiber]),
2332    [rb_cv_fiber_coroutine=$enableval])
2333AS_CASE(["$rb_cv_fiber_coroutine"], [yes|''], [
2334    AC_MSG_CHECKING(native coroutine implementation for ${target_cpu}-${target_os})
2335    AS_CASE(["$target_cpu-$target_os"],
2336	[x*64-darwin*], [
2337	    rb_cv_fiber_coroutine=amd64
2338	],
2339	[x*64-linux], [
2340	    AS_CASE(["$ac_cv_sizeof_voidp"],
2341	        [8], [ rb_cv_fiber_coroutine=amd64 ],
2342	        [4], [ rb_cv_fiber_coroutine=x86 ],
2343		[*], [ rb_cv_fiber_coroutine= ]
2344	    )
2345	],
2346	[*86-linux], [
2347	    rb_cv_fiber_coroutine=x86
2348	],
2349	[x64-mingw32], [
2350	    rb_cv_fiber_coroutine=win64
2351	],
2352	[powerpc64le-linux], [
2353	    rb_cv_fiber_coroutine=ppc64le
2354	],
2355	[*], [
2356	    rb_cv_fiber_coroutine=
2357	]
2358    )
2359    AC_MSG_RESULT(${rb_cv_fiber_coroutine:-no})
2360])
2361AS_IF([test "${rb_cv_fiber_coroutine:-no}" != no], [
2362    COROUTINE_H=coroutine/$rb_cv_fiber_coroutine/Context.h
2363    AC_DEFINE_UNQUOTED(FIBER_USE_COROUTINE, ["$COROUTINE_H"])
2364    AC_SUBST(X_FIBER_COROUTINE_H, [$COROUTINE_H])
2365])
2366
2367AS_IF([test x"$enable_pthread" = xyes], [
2368    for pthread_lib in thr pthread pthreads c c_r root; do
2369	AC_CHECK_LIB($pthread_lib, pthread_create,
2370		     rb_with_pthread=yes, rb_with_pthread=no)
2371	AS_IF([test "$rb_with_pthread" = "yes"], [break])
2372    done
2373    AS_IF([test x"$rb_with_pthread" = xyes], [
2374	AC_DEFINE(_REENTRANT)
2375	AC_DEFINE(_THREAD_SAFE)
2376	AC_DEFINE(HAVE_LIBPTHREAD)
2377	AC_CHECK_HEADERS(pthread_np.h, [], [], [@%:@include <pthread.h>])
2378	AS_CASE(["$pthread_lib:$target_os"],
2379		[c:*], [],
2380		[root:*], [],
2381		[c_r:*|*:openbsd*|*:mirbsd*],  [LIBS="-pthread $LIBS"],
2382		[LIBS="-l$pthread_lib $LIBS"])
2383    ], [
2384	AC_MSG_WARN("Don't know how to find pthread library on your system -- thread support disabled")
2385    ])
2386    AC_CACHE_CHECK([whether pthread_t is scalar type], [rb_cv_scalar_pthread_t], [
2387	AC_TRY_COMPILE([
2388	    @%:@include <pthread.h>
2389	    ], [
2390	    pthread_t thread_id;
2391	    thread_id = 0;
2392	    if (!thread_id) return 0;
2393	    ], [rb_cv_scalar_pthread_t=yes], [rb_cv_scalar_pthread_t=no])
2394    ])
2395    AS_IF([test x"$rb_cv_scalar_pthread_t" = xyes], [
2396	: # RUBY_CHECK_SIZEOF(pthread_t, [void* int long], [], [@%:@include <pthread.h>])
2397    ], [
2398	AC_DEFINE(NON_SCALAR_THREAD_ID)
2399    ])
2400    AC_CHECK_FUNCS(sched_yield pthread_attr_setinheritsched \
2401	pthread_attr_get_np pthread_attr_getstack pthread_attr_getguardsize \
2402	pthread_get_stackaddr_np pthread_get_stacksize_np \
2403	thr_stksegment pthread_stackseg_np pthread_getthrds_np \
2404	pthread_condattr_setclock \
2405	pthread_sigmask pthread_setname_np pthread_set_name_np)
2406    AS_CASE(["$target_os"],[aix*],[ac_cv_func_pthread_getattr_np=no],[AC_CHECK_FUNCS(pthread_getattr_np)])
2407    set_current_thread_name=
2408    AS_IF([test "$ac_cv_func_pthread_setname_np" = yes], [
2409	AC_CACHE_CHECK([arguments of pthread_setname_np], [rb_cv_func_pthread_setname_np_arguments],
2410	    [rb_cv_func_pthread_setname_np_arguments=
2411	    # Linux,AIX,  (pthread_self(), name)
2412	    # NetBSD (pthread_self(), \"%s\", name)
2413	    # Darwin (name)
2414	    for mac in \
2415		"(pthread_self(), name)" \
2416		"(pthread_self(), \"%s\", name)" \
2417		"(name)" \
2418		; do
2419		AC_TRY_COMPILE([
2420		    @%:@include <pthread.h>
2421		    @%:@ifdef HAVE_PTHREAD_NP_H
2422		    @%:@include <pthread_np.h>
2423		    @%:@endif
2424		    @%:@define SET_THREAD_NAME(name) pthread_setname_np${mac}
2425		    ],
2426		    [if (SET_THREAD_NAME("conftest")) return 1;],
2427		    [rb_cv_func_pthread_setname_np_arguments="${mac}"
2428		    break])
2429	    done
2430	    ]
2431	)
2432	AS_IF([test -n "${rb_cv_func_pthread_setname_np_arguments}"], [
2433	    set_current_thread_name="pthread_setname_np${rb_cv_func_pthread_setname_np_arguments}"
2434	])
2435    ], [test "$ac_cv_func_pthread_set_name_np" = yes], [
2436	set_current_thread_name="pthread_set_name_np(pthread_self(), name)"
2437    ])
2438    AS_IF([test -n "$set_current_thread_name"], [
2439	AC_DEFINE_UNQUOTED(SET_CURRENT_THREAD_NAME(name), $set_current_thread_name)
2440	AS_CASE([$set_current_thread_name],
2441	    [*'pthread_self()'*], [
2442		set_another_thread_name=`echo "$set_current_thread_name" | sed 's/pthread_self()/thid/'`
2443		AC_DEFINE_UNQUOTED(SET_ANOTHER_THREAD_NAME(thid,name), $set_another_thread_name)
2444	    ])
2445    ])
2446])
2447
2448AS_IF([test x"$ac_cv_header_ucontext_h" = xno], [
2449    AC_CACHE_CHECK([if signal.h defines ucontext_t], [rb_cv_ucontext_in_signal_h],
2450	[AC_TRY_COMPILE([@%:@include <signal.h>],
2451	[size_t size = sizeof(ucontext_t);],
2452	[rb_cv_ucontext_in_signal_h=yes], [rb_cv_ucontext_in_signal_h=no])])
2453    AS_IF([test x"$rb_cv_ucontext_in_signal_h" = xyes], [
2454	    AC_DEFINE_UNQUOTED(UCONTEXT_IN_SIGNAL_H, 1)
2455    ])
2456])
2457AS_IF([test x"$ac_cv_header_ucontext_h" = xyes -o x"$rb_cv_ucontext_in_signal_h" = xyes], [
2458    AC_CACHE_CHECK([if mcontext_t is a pointer], [rb_cv_mcontext_t_ptr],
2459	[AC_TRY_COMPILE([
2460	    @%:@include <signal.h>
2461	    @%:@ifdef HAVE_UCONTEXT_H
2462	    @%:@include <ucontext.h>
2463	    @%:@endif
2464        mcontext_t test(mcontext_t mc) {return mc+1;}
2465	],
2466	[test(0);],
2467	[rb_cv_mcontext_t_ptr=yes], [rb_cv_mcontext_t_ptr=no])])
2468    AS_IF([test x"$rb_cv_mcontext_t_ptr" = xyes], [
2469	AC_DEFINE_UNQUOTED(DEFINE_MCONTEXT_PTR(mc, uc), mcontext_t mc = (uc)->uc_mcontext)
2470    ], [
2471	AC_DEFINE_UNQUOTED(DEFINE_MCONTEXT_PTR(mc, uc), mcontext_t *mc = &(uc)->uc_mcontext)
2472    ])
2473    AS_IF([test x"$rb_with_pthread" = xyes], [
2474	AC_CHECK_FUNCS(getcontext setcontext)
2475    ])
2476])
2477
2478AS_IF([test "$ac_cv_func_fork_works" = "yes" -a "$rb_with_pthread" = "yes"], [
2479    AC_CACHE_CHECK([if fork works with pthread], rb_cv_fork_with_pthread,
2480	[AC_TRY_RUN([
2481#include <stdlib.h>
2482#include <unistd.h>
2483#include <pthread.h>
2484#include <stdio.h>
2485#include <sys/types.h>
2486#include <sys/wait.h>
2487#include <signal.h>
2488#ifndef EXIT_SUCCESS
2489#define EXIT_SUCCESS 0
2490#endif
2491#ifndef EXIT_FAILURE
2492#define EXIT_FAILURE 1
2493#endif
2494
2495void *
2496thread_func(void *dmy)
2497{
2498    return dmy;
2499}
2500
2501int
2502use_threads(void)
2503{
2504    pthread_t tid;
2505    if (pthread_create(&tid, 0, thread_func, 0) != 0) {
2506	return -1;
2507    }
2508    if (pthread_join(tid, 0) != 0) {
2509	return -1;
2510    }
2511    return 0;
2512}
2513
2514int
2515main(int argc, char *argv[])
2516{
2517    pid_t pid;
2518    if (use_threads()) return EXIT_FAILURE;
2519    pid = fork();
2520
2521    if (pid) {
2522	int loc;
2523	sleep(1);
2524	if (waitpid(pid, &loc, WNOHANG) == 0) {
2525	    kill(pid, SIGKILL);
2526	    return EXIT_FAILURE;
2527	}
2528        if (!WIFEXITED(loc) || WEXITSTATUS(loc) != EXIT_SUCCESS)
2529           return EXIT_FAILURE;
2530    }
2531    else {
2532	if (use_threads()) return EXIT_FAILURE;
2533    }
2534
2535    return EXIT_SUCCESS;
2536}],
2537	rb_cv_fork_with_pthread=yes,
2538	rb_cv_fork_with_pthread=no,
2539	rb_cv_fork_with_pthread=yes)])
2540    test x$rb_cv_fork_with_pthread = xyes || AC_DEFINE(CANNOT_FORK_WITH_PTHREAD)
2541])
2542}
2543
2544: "runtime section" && {
2545dnl wheather use dln_a_out or not
2546AC_ARG_WITH(dln-a-out,
2547	AS_HELP_STRING([--with-dln-a-out], [use dln_a_out if possible]),
2548	[
2549	AS_CASE([$withval],
2550	[yes], [
2551	    AS_IF([test "$enable_shared" = yes], [
2552		AC_MSG_ERROR(dln_a_out can not make shared library)
2553	    ])
2554	    with_dln_a_out=yes],
2555	[
2556	    with_dln_a_out=no])], [with_dln_a_out=no])
2557
2558AC_CACHE_CHECK(whether ELF binaries are produced, rb_cv_binary_elf,
2559[AC_TRY_LINK([],[], [
2560AS_CASE(["`head -1 conftest$EXEEXT | tr -dc '\177ELF' | tr '\177' .`"],
2561[.ELF*], [rb_cv_binary_elf=yes], [rb_cv_binary_elf=no])],
2562rb_cv_binary_elf=no)])
2563
2564AS_IF([test "$rb_cv_binary_elf" = yes], [
2565  AC_DEFINE(USE_ELF)
2566  AS_IF([test "$with_dln_a_out" = yes], [
2567    AC_MSG_ERROR(dln_a_out does not work with ELF)
2568  ])
2569  AC_CHECK_HEADERS([elf.h elf_abi.h])
2570  AS_IF([test $ac_cv_header_elf_h = yes -o $ac_cv_header_elf_abi_h = yes], [
2571    AC_LIBOBJ([addr2line])
2572    AS_IF([test "x$compress_debug_sections" = xzlib], [
2573      AC_CHECK_LIB([z], [uncompress])
2574    ])
2575  ])
2576])
2577
2578AC_CHECK_HEADERS([mach-o/loader.h])
2579AS_IF([test "$ac_cv_header_mach_o_loader_h" = yes], [
2580  AC_LIBOBJ([addr2line])
2581])
2582
2583AS_CASE(["$target_os"],
2584[linux* | gnu* | k*bsd*-gnu | bsdi* | kopensolaris*-gnu], [
2585    AS_IF([test "$rb_cv_binary_elf" = no], [
2586	with_dln_a_out=yes
2587    ], [
2588	LDFLAGS="$LDFLAGS -rdynamic"
2589    ])])
2590LIBEXT=a
2591
2592AC_SUBST(DLDFLAGS)dnl
2593AC_SUBST(ARCH_FLAG)dnl
2594AC_SUBST(MJIT_HEADER_FLAGS)dnl
2595AC_SUBST(MJIT_HEADER_INSTALL_DIR)dnl
2596AC_SUBST(MJIT_CC)dnl
2597AS_IF([test "$GCC" = "yes"], [
2598    AS_CASE(["$target_os"],[aix*],[mjit_std_cflag="-std=gnu99"])
2599])
2600AC_SUBST(MJIT_CFLAGS, [${MJIT_CFLAGS-"-w ${mjit_std_cflag} ${orig_cflags}"}])dnl
2601AC_SUBST(MJIT_OPTFLAGS, [${MJIT_OPTFLAGS-'$(optflags)'}])dnl
2602AC_SUBST(MJIT_DEBUGFLAGS, [${MJIT_DEBUGFLAGS-'$(debugflags)'}])dnl
2603AC_SUBST(MJIT_LDSHARED)dnl
2604
2605AC_SUBST(STATIC)dnl
2606AC_SUBST(CCDLFLAGS)dnl
2607AC_SUBST(LDSHARED)dnl
2608AC_SUBST(LDSHAREDXX)dnl
2609AC_SUBST(DLEXT)dnl
2610AC_SUBST(DLEXT2)dnl
2611AC_SUBST(LIBEXT)dnl
2612AC_SUBST(ASMEXT, S)dnl
2613
2614STATIC=
2615
2616AS_IF([test "$with_dln_a_out" != yes], [
2617  rb_cv_dlopen=unknown
2618  AC_MSG_CHECKING(whether OS depend dynamic link works)
2619  AS_IF([test "$GCC" = yes], [
2620    AS_CASE(["$target_os"],
2621    [darwin*], [
2622      # The -fno-common is needed if we wish to embed the Ruby interpreter
2623      # into a plugin module of some project (as opposed to embedding it
2624      # within the project's application).  The -I/usr/local/include is
2625      # needed because CPP as discovered by configure (cc -E -traditional)
2626      # fails to consult /usr/local/include by default.  This causes
2627      # mkmf.rb's have_header() to fail if the desired resource happens to be
2628      # installed in the /usr/local tree.
2629      RUBY_APPEND_OPTION(CCDLFLAGS, -fno-common)],
2630    [bsdi*|cygwin*|mingw*|aix*|interix*], [ ],
2631    [
2632      RUBY_APPEND_OPTION(CCDLFLAGS, -fPIC)])
2633  ], [
2634    AS_CASE(["$target_os"],
2635	[hpux*],          [CCDLFLAGS="$CCDLFLAGS +Z"],
2636	[solaris*|irix*], [CCDLFLAGS="$CCDLFLAGS -KPIC"],
2637	[sunos*],         [CCDLFLAGS="$CCDLFLAGS -PIC"],
2638	[esix*|uxpds*],   [CCDLFLAGS="$CCDLFLAGS -KPIC"],
2639	                  [: ${CCDLFLAGS=""}])
2640  ])
2641
2642
2643  AC_ARG_ENABLE(rpath,
2644       AS_HELP_STRING([--enable-rpath], [embed run path into extension libraries.
2645       enabled by default on ELF platforms]),
2646       [enable_rpath=$enableval], [enable_rpath="$rb_cv_binary_elf"])
2647
2648  AS_CASE(["$target_os"],
2649	[hpux*], [	DLDFLAGS="$DLDFLAGS -E"
2650			: ${LDSHARED='$(LD) -b'}
2651			XLDFLAGS="$XLDFLAGS -Wl,-E"
2652			: ${LIBPATHENV=SHLIB_PATH}
2653			rb_cv_dlopen=yes],
2654	[solaris*], [	AS_IF([test "$GCC" = yes], [
2655			    : ${LDSHARED='$(CC) -shared'}
2656			    AS_IF([test "$rb_cv_prog_gnu_ld" = yes], [
2657				LDFLAGS="$LDFLAGS -Wl,-E"
2658			    ])
2659			], [
2660			    : ${LDSHARED='$(CC) -G'}
2661			])
2662			AS_IF([test "$ac_cv_sizeof_voidp" = 8], [
2663			    : ${LIBPATHENV=LD_LIBRARY_PATH_64}
2664			    : ${PRELOADENV=LD_PRELOAD_64}
2665			], [
2666			    : ${LIBPATHENV=LD_LIBRARY_PATH_32}
2667			    : ${PRELOADENV=LD_PRELOAD_32}
2668			])
2669			rb_cv_dlopen=yes],
2670	[sunos*], [	: ${LDSHARED='$(LD) -assert nodefinitions'}
2671			rb_cv_dlopen=yes],
2672	[irix*], [	: ${LDSHARED='$(LD) -shared'}
2673			rb_cv_dlopen=yes],
2674	[sysv4*], [	: ${LDSHARED='$(LD) -G'}
2675			rb_cv_dlopen=yes],
2676	[nto-qnx*], [	: ${LDSHARED='$(CC) -shared'}
2677			rb_cv_dlopen=yes],
2678	[esix*|uxpds*], [ : ${LDSHARED='$(LD) -G'}
2679			rb_cv_dlopen=yes],
2680	[osf*], [	: ${LDSHARED='$(LD) -shared -expect_unresolved "*"'}
2681			rb_cv_dlopen=yes],
2682	[bsdi3*], [	AS_CASE(["$CC"],
2683			[*shlicc*], [	: ${LDSHARED='$(CC) -r'}
2684					rb_cv_dlopen=yes])],
2685	[linux* | gnu* | k*bsd*-gnu | netbsd* | bsdi* | kopensolaris*-gnu | haiku*], [
2686			: ${LDSHARED='$(CC) -shared'}
2687			AS_IF([test "$rb_cv_binary_elf" = yes], [
2688			    LDFLAGS="$LDFLAGS -Wl,-export-dynamic"
2689			])
2690			rb_cv_dlopen=yes],
2691	[interix*], [	: ${LDSHARED='$(CC) -shared'}
2692			XLDFLAGS="$XLDFLAGS -Wl,-E"
2693			LIBPATHFLAG=" -L%1\$-s"
2694			rb_cv_dlopen=yes],
2695	[freebsd*|dragonfly*], [
2696			: ${LDSHARED='$(CC) -shared'}
2697			AS_IF([test "$rb_cv_binary_elf" = yes], [
2698			    LDFLAGS="$LDFLAGS -rdynamic"
2699			    DLDFLAGS="$DLDFLAGS "'-Wl,-E'
2700			], [
2701			  test "$GCC" = yes && test "$rb_cv_prog_gnu_ld" = yes || LDSHARED='$(LD) -Bshareable'
2702			])
2703			rb_cv_dlopen=yes],
2704	[openbsd*|mirbsd*], [	: ${LDSHARED='$(CC) -shared ${CCDLFLAGS}'}
2705			AS_IF([test "$rb_cv_binary_elf" = yes], [
2706			    LDFLAGS="$LDFLAGS -Wl,-E"
2707			])
2708			rb_cv_dlopen=yes],
2709	[darwin*], [	: ${LDSHARED='$(CC) -dynamic -bundle'}
2710			: ${DLDSHARED='$(CC) -dynamiclib'}
2711			: ${LDFLAGS=""}
2712			: ${LIBPATHENV=DYLD_FALLBACK_LIBRARY_PATH}
2713			: ${PRELOADENV=DYLD_INSERT_LIBRARIES}
2714			rb_cv_dlopen=yes],
2715        [aix*], [	: ${LDSHARED='$(CC)'}
2716			AS_IF([test "$GCC" = yes], [
2717			    LDSHARED="$LDSHARED ${linker_flag}-G -shared"
2718			], [
2719			    LDSHARED="$LDSHARED ${linker_flag}-G"
2720			])
2721			EXTDLDFLAGS='-e$(TARGET_ENTRY)'
2722			XLDFLAGS="${linker_flag}"'-bE:$(ARCHFILE)'" ${linker_flag}-brtl"
2723			XLDFLAGS="$XLDFLAGS ${linker_flag}-blibpath:${prefix}/lib:${LIBPATH:-/usr/lib:/lib}"
2724			: ${ARCHFILE="ruby.imp"}
2725                        TRY_LINK='$(CC) -oconftest $(INCFLAGS) -I$(hdrdir) $(CPPFLAGS)'
2726                        TRY_LINK="$TRY_LINK"' $(CFLAGS) $(src) $(LIBPATH) $(LDFLAGS) $(LOCAL_LIBS) $(LIBS)'
2727			: ${LIBPATHENV=LIBPATH}
2728			: ${PRELOADENV=LDR_PRELOAD}
2729			rb_cv_dlopen=yes],
2730	[nto-qnx*], [	DLDFLAGS="$DLDFLAGS -L/lib -L/usr/lib -L/usr/local/lib"
2731			: ${LDSHARED='$(LD) -Bshareable -x'}
2732			LDFLAGS="$LDFLAGS -L/lib -L/usr/lib -L/usr/local/lib"
2733			rb_cv_dlopen=yes],
2734	[cygwin*|mingw*], [
2735			: ${LDSHARED='$(CC) -shared'}
2736			XLDFLAGS="$XLDFLAGS -Wl,--stack,0x00200000,--enable-auto-import"
2737			DLDFLAGS="${DLDFLAGS} -Wl,--enable-auto-image-base,--enable-auto-import"
2738			: ${LIBPATHENV=PATH}
2739			: ${PRELOADENV=""}
2740			rb_cv_dlopen=yes],
2741	[hiuxmpp], [	: ${LDSHARED='$(LD) -r'}],
2742	[atheos*], [	: ${LDSHARED='$(CC) -shared'}
2743			rb_cv_dlopen=yes],
2744	[	: ${LDSHARED='$(LD)'}])
2745  AC_MSG_RESULT($rb_cv_dlopen)
2746
2747  AS_IF([test "$rb_cv_dlopen" = yes], [
2748    AS_CASE(["$target_os"],
2749      [darwin*], [
2750	for flag in \
2751	  "-undefined dynamic_lookup" \
2752	  "-multiply_defined suppress" \
2753	  ; do
2754	  test "x${linker_flag}" = x || flag="${linker_flag}`echo ${flag} | tr ' ' ,`"
2755	  RUBY_TRY_LDFLAGS([$flag], [], [flag=])
2756	  AS_IF([test "x$flag" != x], [
2757	    RUBY_APPEND_OPTIONS(DLDFLAGS, [$flag])
2758	  ])
2759	done
2760      ])
2761  ])
2762
2763  AS_IF([test "$enable_rpath:${RPATHFLAG}" = yes:], [
2764      AS_IF([test "x$rpathflag" != x], [
2765	  RPATHFLAG=" ${rpathflag}%1\$-s"
2766      ])
2767  ])
2768])
2769AS_IF([test "${LDSHAREDXX}" = ""], [
2770    AS_CASE(["${LDSHARED}"],
2771	[*'$(CC)'*], [
2772	    LDSHAREDXX=`echo "${LDSHARED}" | sed 's/\$(CC)/$(CXX)/'`
2773	    ],
2774	[*'${CC}'*], [
2775	    LDSHAREDXX=`echo "${LDSHARED}" | sed 's/\${CC}/${CXX}/'`
2776	    ],
2777	[*$CC*], [
2778	    LDSHAREDXX=`echo "${LDSHARED}" | sed "s|$CC|$CXX|"`
2779	    ],
2780	[ld" "*], [
2781	    ])
2782])
2783AS_CASE([${RPATHFLAG}],[*'%1$'*],[: ${LIBPATHFLAG=' -L%1$-s'}],[: ${LIBPATHFLAG=' -L%s'}])
2784
2785AC_SUBST(LINK_SO)
2786AC_SUBST(LIBPATHFLAG)
2787AC_SUBST(RPATHFLAG)
2788AC_SUBST(LIBPATHENV, "${LIBPATHENV-LD_LIBRARY_PATH}")
2789AC_SUBST(PRELOADENV, "${PRELOADENV-LD_PRELOAD}")
2790AC_SUBST(TRY_LINK)
2791
2792AS_IF([test "x$OPT_DIR" != x], [
2793    pat=`echo "${LDFLAGS_OPTDIR}" | sed ['s/[][\\.*|]/\\\\&/']`
2794    LDFLAGS=`echo "${LDFLAGS}" | sed "s| ${pat}||"`
2795    val=`IFS="$PATH_SEPARATOR"
2796        for dir in $OPT_DIR; do
2797            echo x ${LIBPATHFLAG} ${RPATHFLAG} |
2798            sed "s/^x *//;s${IFS}"'%1\\$-s'"${IFS}${dir}/lib${IFS}g;s${IFS}%s${IFS}${dir}/lib${IFS}g"
2799        done | tr '\012' ' ' | sed 's/ *$//'`
2800    AS_IF([test x"$val" != x], [
2801	test x"${LDFLAGS}" = x || LDFLAGS="$LDFLAGS "
2802	LDFLAGS="$LDFLAGS$val"
2803	test x"${DLDFLAGS}" = x || DLDFLAGS="$DLDFLAGS "
2804	DLDFLAGS="$DLDFLAGS$val"
2805    ])
2806    LDFLAGS_OPTDIR="$val"
2807])
2808
2809AS_CASE(["$target_os"],
2810[freebsd*], [
2811    AC_CHECK_LIB([procstat], [procstat_open_sysctl])
2812    AS_IF([test "x$ac_cv_lib_procstat_procstat_open_sysctl" = xyes], [
2813	AC_CHECK_FUNCS(procstat_getvmmap)
2814    ])
2815    ])
2816AS_CASE(["$target_cpu-$target_os"],
2817[*-darwin*], [
2818    AC_CHECK_HEADERS([execinfo.h])
2819    AS_IF([test "x$ac_cv_header_execinfo_h" = xyes], [
2820	AC_CHECK_LIB([execinfo], [backtrace])
2821	AC_CHECK_HEADERS([libunwind.h])
2822    ])],
2823[*-freebsd*|x86_64-netbsd*], [
2824    AC_CHECK_HEADERS([execinfo.h])
2825    AS_IF([test "x$ac_cv_header_execinfo_h" = xyes], [
2826	AC_CHECK_LIB([execinfo], [backtrace])
2827	AC_CHECK_LIB([unwind], [unw_backtrace])
2828    ])])
2829AC_CHECK_FUNCS(backtrace)
2830
2831AS_IF([test "x$ac_cv_func_backtrace" = xyes], [
2832  AC_CACHE_CHECK(for broken backtrace, rb_cv_broken_backtrace,
2833    [AC_TRY_RUN([
2834#include <unistd.h>
2835#include <stdio.h>
2836#include <stdlib.h>
2837#include <stdint.h>
2838#include <string.h>
2839#include <signal.h>
2840#include <execinfo.h>
2841
2842#define TRACE_SIZE 256
2843
2844void sigsegv(int signum, siginfo_t *info, void *ctx){
2845    void *trace[TRACE_SIZE];
2846    int n = backtrace(trace, TRACE_SIZE);
2847    if (n > 0) {
2848	/*fprintf(stdout, "backtrace:%d\n",n);*/
2849    } else {
2850	_exit(EXIT_FAILURE);
2851    }
2852    _exit(EXIT_SUCCESS);
2853}
2854int
2855main(void)
2856{
2857    volatile int *a = NULL;
2858    stack_t ss;
2859    struct sigaction sa;
2860
2861    ss.ss_sp = malloc(16*1024);
2862    if (ss.ss_sp == NULL) {
2863	fprintf(stderr, "cannot allocate memory for sigaltstack\n");
2864	return EXIT_FAILURE;
2865    }
2866    ss.ss_size = 16*1024;
2867    ss.ss_flags = 0;
2868    if (sigaltstack(&ss, NULL) == -1) {
2869	fprintf(stderr, "sigaltstack failed\n");
2870	return EXIT_FAILURE;
2871    }
2872    memset(&sa, 0, sizeof(struct sigaction));
2873    sigemptyset(&sa.sa_mask);
2874    sa.sa_sigaction = sigsegv;
2875    sa.sa_flags |= SA_SIGINFO;
2876    sa.sa_flags |= SA_ONSTACK;
2877    sigaction(SIGSEGV, &sa, NULL);
2878    a[0] = 1;
2879    return EXIT_SUCCESS;
2880}
2881],
2882	rb_cv_broken_backtrace=no,
2883	rb_cv_broken_backtrace=yes,
2884	rb_cv_broken_backtrace=no)])
2885  AS_IF([test "$rb_cv_broken_backtrace" = yes], [
2886    AC_DEFINE(BROKEN_BACKTRACE, 1)
2887  ])
2888])
2889
2890AC_ARG_WITH(valgrind,
2891        AS_HELP_STRING([--without-valgrind],[disable valgrind memcheck support]),
2892        [], with_valgrind=yes)
2893AS_IF([test x$with_valgrind != xno],
2894        [AC_CHECK_HEADERS(valgrind/memcheck.h)])
2895
2896dln_a_out_works=no
2897AS_IF([test "$ac_cv_header_a_out_h" = yes], [
2898  AS_IF([test "$with_dln_a_out" = yes || test "$rb_cv_dlopen" = unknown], [
2899    cat confdefs.h > config.h
2900    AC_CACHE_CHECK(whether matz's dln works, rb_cv_dln_a_out,
2901    [AC_TRY_COMPILE([
2902#define USE_DLN_A_OUT
2903#include "dln.c"
2904],
2905	[],
2906	rb_cv_dln_a_out=yes,
2907	rb_cv_dln_a_out=no)])
2908    AS_IF([test "$rb_cv_dln_a_out" = yes], [
2909      dln_a_out_works=yes
2910      AC_DEFINE(USE_DLN_A_OUT)
2911    ])
2912  ])
2913])
2914
2915AS_IF([test "$dln_a_out_works" = yes], [
2916  AS_IF([test "$GCC" = yes], [
2917    STATIC=-static
2918  ], [
2919    STATIC=-Bstatic
2920  ])
2921  DLEXT=so
2922  CCDLFLAGS=
2923], [
2924  AS_CASE(["$target_os"],
2925    [hpux*], [
2926	DLEXT=sl],
2927    [darwin*], [
2928	SOEXT=dylib
2929	DLEXT=bundle],
2930    [cygwin*|mingw*|*djgpp*], [
2931	LOAD_RELATIVE=1
2932	SOEXT=dll
2933	DLEXT=so],
2934    [
2935	DLEXT=so])
2936])
2937: ${SOEXT="${DLEXT}"}
2938AC_SUBST(SOEXT)
2939AS_IF([test "$rb_cv_dlopen:$load_relative" = yes:yes], [
2940    AS_IF([test "$ac_cv_func_dladdr" = yes], [
2941	LOAD_RELATIVE=1
2942    ])
2943])
2944AS_IF([test x"$LOAD_RELATIVE" = x1], [
2945    load_relative=yes
2946], [
2947    unset load_relative
2948])
2949
2950len=2 # .rb
2951n=`expr "$DLEXT"  : '.*'`; test "$n" -gt "$len" && len=$n
2952n=`expr "$DLEXT2" : '.*'`; test "$n" -gt "$len" && len=$n
2953AC_DEFINE_UNQUOTED(DLEXT_MAXLEN, `expr $len + 1`)
2954test ".$DLEXT"  = "." || AC_DEFINE_UNQUOTED(DLEXT,  ".$DLEXT")
2955test ".$DLEXT2" = "." || AC_DEFINE_UNQUOTED(DLEXT2, ".$DLEXT2")
2956AC_SUBST(DLEXT)
2957
2958AS_IF([test "$with_dln_a_out" = yes], [
2959  STRIP=true
2960], [
2961  AC_CHECK_TOOL(STRIP, strip, :)dnl
2962])
2963
2964AS_CASE(["$target_os"],
2965  [linux* | gnu* | k*bsd*-gnu | kopensolaris*-gnu], [
2966	STRIP="$STRIP -S -x"],
2967  [darwin*], [
2968	STRIP="$STRIP -A -n"])
2969
2970AC_ARG_WITH(ext,
2971            AC_HELP_STRING([--with-ext=EXTS],
2972                           [pass to --with-ext option of extmk.rb]))
2973AC_ARG_WITH(out-ext,
2974            AC_HELP_STRING([--with-out-ext=EXTS],
2975                           [pass to --without-ext option of extmk.rb]))
2976EXTSTATIC=
2977AC_SUBST(EXTSTATIC)dnl
2978AC_ARG_WITH(static-linked-ext,
2979	    AS_HELP_STRING([--with-static-linked-ext], [link external modules statically]),
2980            [AS_CASE([$withval],[yes],[STATIC=;EXTSTATIC=static],[no],[],[EXTSTATIC="$withval"])])
2981AS_CASE([",$EXTSTATIC,"], [,static,|*,enc,*], [
2982  ENCOBJS='enc/encinit.$(OBJEXT) enc/libenc.$(LIBEXT) enc/libtrans.$(LIBEXT)'
2983  EXTOBJS='ext/extinit.$(OBJEXT)'
2984  AC_DEFINE_UNQUOTED(EXTSTATIC, 1)
2985  AC_SUBST(ENCSTATIC, static)
2986], [
2987  ENCOBJS='dmyenc.$(OBJEXT)'
2988  EXTOBJS='dmyext.$(OBJEXT)'
2989])
2990AC_SUBST(ENCOBJS)
2991AC_SUBST(EXTOBJS)
2992
2993AC_ARG_WITH(setup,
2994	    AS_HELP_STRING([--with-setup=SETUP], [use extension libraries setup]),
2995	    [setup=$withval])
2996AS_IF([test -n "$setup"], [
2997    AS_IF([! test -f "ext/$setup" -o -f "$srcdir/ext/$setup"], [
2998	AC_MSG_ERROR(Setup file $setup not found under ext or $srcdir/ext)
2999    ])
3000], [test -f "$srcdir/ext/Setup.$target_os"], [
3001    setup="Setup.$target_os"
3002], [
3003    setup=
3004    for file in "$srcdir"/ext/Setup.*; do
3005	AS_CASE(["$file"], [*~|*.bak|*.orig|*.rej|*.tmp], [continue])
3006	setup=`basename "$file"`
3007	AS_CASE(["$target_os"], [`expr "$setup" : 'Setup.\(.*\)'`*], [break])
3008	platform=`sed '/^option  *platform  */!d;s///;s/|/*|/g;q' "$file"`
3009	AS_IF([test "x$platform" != x], [
3010	    eval "AS_CASE([\"\$target_os\"], [$platform*], [break])"
3011	])
3012	setup=
3013    done
3014    : ${setup:=Setup}
3015])
3016AC_SUBST(setup)
3017
3018rubylibprefix='${libdir}/${RUBY_BASE_NAME}'
3019AC_ARG_WITH(rubylibprefix,
3020	    AS_HELP_STRING([--with-rubylibprefix=DIR], [prefix for ruby libraries [[LIBDIR/RUBY_BASE_NAME]]]),
3021	    [AS_IF([test "x$withval" = xno], [
3022		AC_MSG_ERROR([No ruby, No libprefix])
3023	    ])
3024	    rubylibprefix="$withval"])
3025AC_SUBST(rubylibprefix)
3026
3027AS_IF([test x"${exec_prefix}" != xNONE], [
3028    RUBY_EXEC_PREFIX="$exec_prefix"
3029], [test x"$prefix" != xNONE], [
3030    RUBY_EXEC_PREFIX="$prefix"
3031], [
3032    RUBY_EXEC_PREFIX=$ac_default_prefix
3033])
3034pat=`echo "${RUBY_EXEC_PREFIX}" | tr -c '\012' .`'\(.*\)'
3035for var in bindir libdir rubylibprefix; do
3036    eval val='"$'$var'"'
3037    AS_CASE(["$val"], ["${RUBY_EXEC_PREFIX}"*], [val='${exec_prefix}'"`expr \"$val\" : \"$pat\"`"])
3038    eval $var='"$val"'
3039done
3040
3041BTESTRUBY='$(MINIRUBY)'
3042AS_IF([test x"$cross_compiling" = xyes], [
3043  test x"$MINIRUBY" = x && MINIRUBY="${RUBY-$BASERUBY} -I`$CHDIR .; pwd` "-r'$(arch)-fake'
3044  XRUBY_LIBDIR=`${RUBY-$BASERUBY} -rrbconfig -e ['puts RbConfig::CONFIG["libdir"]']`
3045  XRUBY_RUBYLIBDIR=`${RUBY-$BASERUBY} -rrbconfig -e ['puts RbConfig::CONFIG["rubylibdir"]']`
3046  XRUBY_RUBYHDRDIR=`${RUBY-$BASERUBY} -rrbconfig -e ['puts RbConfig::CONFIG["rubyhdrdir"]']`
3047  AC_SUBST(XRUBY_LIBDIR)
3048  AC_SUBST(XRUBY_RUBYLIBDIR)
3049  AC_SUBST(XRUBY_RUBYHDRDIR)
3050  PREP='$(arch)-fake.rb'
3051  RUNRUBY_COMMAND='$(MINIRUBY) -I`cd $(srcdir)/lib; pwd`'
3052  RUNRUBY='$(RUNRUBY_COMMAND)'
3053  XRUBY='$(MINIRUBY)'
3054  BOOTSTRAPRUBY='$(BASERUBY)'
3055  TEST_RUNNABLE=no
3056  CROSS_COMPILING=yes
3057], [
3058  MINIRUBY='./miniruby$(EXEEXT) -I$(srcdir)/lib -I.'
3059  MINIRUBY="$MINIRUBY"' -I$(EXTOUT)/common'
3060  PREP='miniruby$(EXEEXT)'
3061  RUNRUBY_COMMAND='$(MINIRUBY) $(srcdir)/tool/runruby.rb --extout=$(EXTOUT) $(RUNRUBYOPT)'
3062  RUNRUBY='$(RUNRUBY_COMMAND) --'
3063  XRUBY='$(RUNRUBY)'
3064  BOOTSTRAPRUBY='$(MINIRUBY)'
3065  TEST_RUNNABLE=yes
3066  CROSS_COMPILING=no
3067])
3068AC_SUBST(TEST_RUNNABLE)
3069AC_SUBST(CROSS_COMPILING)
3070AC_SUBST(MINIRUBY)
3071AC_SUBST(BTESTRUBY)
3072AC_SUBST(PREP)
3073AC_SUBST(RUNRUBY_COMMAND)
3074AC_SUBST(RUNRUBY)
3075AC_SUBST(XRUBY)
3076AC_SUBST(BOOTSTRAPRUBY)
3077AC_SUBST(EXTOUT, [${EXTOUT=.ext}])
3078
3079FIRSTMAKEFILE=""
3080LIBRUBY_A='lib$(RUBY_SO_NAME)-static.a'
3081LIBRUBY='$(LIBRUBY_A)'
3082LIBRUBYARG_STATIC='-l$(RUBY_SO_NAME)-static'
3083LIBRUBYARG='$(LIBRUBYARG_STATIC)'
3084SOLIBS='$(MAINLIBS)'
3085
3086AS_CASE(["$target_os"],
3087  [cygwin*|mingw*|haiku*|darwin*], [
3088    : ${DLDLIBS=""}
3089    ],
3090  [
3091    DLDLIBS="$DLDLIBS -lc"
3092    ])
3093
3094AC_ARG_ENABLE(multiarch,
3095	      AS_HELP_STRING([--enable-multiarch], [enable multiarch compatible directories]),
3096	      [multiarch=], [unset multiarch])
3097AS_IF([test ${multiarch+set}], [
3098   AC_DEFINE(ENABLE_MULTIARCH)
3099   MJIT_HEADER_INSTALL_DIR=include/'${arch}/${RUBY_VERSION_NAME}'
3100], [
3101   MJIT_HEADER_INSTALL_DIR=include/'${RUBY_VERSION_NAME}/${arch}'
3102])
3103
3104archlibdir='${libdir}/${arch}'
3105sitearchlibdir='${libdir}/${sitearch}'
3106archincludedir='${includedir}/${arch}'
3107sitearchincludedir='${includedir}/${sitearch}'
3108
3109AC_ARG_WITH(soname,
3110	AS_HELP_STRING([--with-soname=SONAME], [base name of shared library]),
3111	[RUBY_SO_NAME=$withval],
3112	[
3113	    AS_CASE(["$target_os"],
3114	    [darwin*], [
3115	        RUBY_SO_NAME='$(RUBY_BASE_NAME).$(RUBY_API_VERSION)'
3116	    ],
3117	    [cygwin*], [
3118	        RUBY_SO_NAME='$(RUBY_BASE_NAME)$(MAJOR)$(MINOR)0'
3119	    ],
3120	    [mingw*], [
3121		RUBY_SO_NAME="${rb_cv_msvcrt}"'-$(RUBY_BASE_NAME)$(MAJOR)$(MINOR)0'
3122		AS_IF([test x"${target_cpu}" != xi386], [
3123		    RUBY_SO_NAME="${target_cpu}-${RUBY_SO_NAME}"
3124		])
3125	    ],
3126	    [RUBY_SO_NAME='$(RUBY_BASE_NAME)'])
3127	])
3128
3129LIBRUBY_LDSHARED=${DLDSHARED=${LDSHARED}}
3130LIBRUBY_DLDFLAGS=$DLDFLAGS
3131LIBRUBY_SO='lib$(RUBY_SO_NAME).$(SOEXT).$(RUBY_PROGRAM_VERSION)'
3132LIBRUBY_SONAME='lib$(RUBY_SO_NAME).$(SOEXT).$(RUBY_API_VERSION)'
3133LIBRUBY_ALIASES='lib$(RUBY_SO_NAME).$(SOEXT)'
3134ENABLE_SHARED=no
3135
3136AC_ARG_ENABLE(shared,
3137       AS_HELP_STRING([--enable-shared], [build a shared library for Ruby]),
3138       [enable_shared=$enableval])
3139libprefix=${multiarch+'$(archlibdir)'}${multiarch-'$(libdir)'}
3140LIBRUBY_RELATIVE=${load_relative-no}
3141AS_CASE("$enable_shared", [yes], [
3142  LIBRUBY='$(LIBRUBY_SO)'
3143  LIBRUBYARG_SHARED='-l$(RUBY_SO_NAME)'
3144  LIBRUBYARG='$(LIBRUBYARG_SHARED)'
3145  LIBRUBY_RELATIVE=no
3146  test -z "$CCDLFLAGS" || CFLAGS="$CFLAGS $CCDLFLAGS"
3147  ENABLE_SHARED=yes
3148
3149  # libdir can be overridden in config.site file (on OpenSUSE at least).
3150  libdir_basename=lib
3151  AS_IF([test "$bindir" = '${exec_prefix}/bin'], [
3152    AS_CASE(["$libdir"], ['${exec_prefix}/'*], [libdir_basename=`basename "$libdir"`])
3153  ])
3154  AC_DEFINE_UNQUOTED(LIBDIR_BASENAME, ["${libdir_basename}"])
3155  libdir_basename="${libdir_basename}"${multiarch+'/${arch}'}
3156
3157  AS_CASE(["$target_os"],
3158    [freebsd*|dragonfly*], [],
3159    [
3160     AS_IF([test "$GCC" = yes], [
3161       RUBY_TRY_LDFLAGS([${linker_flag}--no-undefined], [no_undefined=yes], [no_undefined=no])
3162       AS_IF([test "no_undefined" = yes], [
3163	  RUBY_APPEND_OPTION(EXTLDFLAGS, [${linker_flag}--no-undefined])
3164       ])
3165     ])
3166    ])
3167
3168  AS_CASE(["$target_os"],
3169    [sunos4*], [
3170	LIBRUBY_ALIASES='$(LIBRUBY_SONAME) lib$(RUBY_SO_NAME).$(SOEXT)'
3171	],
3172    [linux* | gnu* | k*bsd*-gnu | atheos* | kopensolaris*-gnu | haiku*], [
3173	RUBY_APPEND_OPTIONS(LIBRUBY_DLDFLAGS, ['-Wl,-soname,$(LIBRUBY_SONAME)' "$LDFLAGS_OPTDIR"])
3174	LIBRUBY_ALIASES='$(LIBRUBY_SONAME) lib$(RUBY_SO_NAME).$(SOEXT)'
3175	AS_IF([test "$load_relative" = yes], [
3176	    libprefix="'\$\${ORIGIN}/../${libdir_basename}'"
3177	    LIBRUBY_RPATHFLAGS="-Wl,-rpath,${libprefix}"
3178	    LIBRUBY_RELATIVE=yes
3179	])
3180	],
3181    [freebsd*|dragonfly*], [
3182	LIBRUBY_SO='lib$(RUBY_SO_NAME).$(SOEXT).$(MAJOR)$(MINOR)'
3183	LIBRUBY_SONAME='$(LIBRUBY_SO)'
3184	RUBY_APPEND_OPTIONS(LIBRUBY_DLDFLAGS, ['-Wl,-soname,${LIBRUBY_SO}'])
3185	AS_IF([test "$rb_cv_binary_elf" != "yes" ], [
3186	    LIBRUBY_SO="$LIBRUBY_SO.\$(TEENY)"
3187	    LIBRUBY_ALIASES=''
3188	])
3189	],
3190    [netbsd*], [
3191	LIBRUBY_SONAME='lib$(RUBY_SO_NAME).$(SOEXT).$(MAJOR)$(MINOR)'
3192	LIBRUBY_SO="${LIBRUBY_SONAME}"'.$(TEENY)'
3193	RUBY_APPEND_OPTIONS(LIBRUBY_DLDFLAGS, ['-Wl,-soname,$(LIBRUBY_SONAME)' "$LDFLAGS_OPTDIR"])
3194	AS_IF([test "$rb_cv_binary_elf" = yes], [ # ELF platforms
3195	   LIBRUBY_ALIASES='$(LIBRUBY_SONAME) lib$(RUBY_SO_NAME).$(SOEXT)'
3196	], [	# a.out platforms
3197	   LIBRUBY_ALIASES=""
3198	])
3199	],
3200    [openbsd*|mirbsd*], [
3201	LIBRUBY_SO='lib$(RUBY_SO_NAME).$(SOEXT).$(MAJOR).'`expr ${MINOR} \* 10 + ${TEENY}`
3202	],
3203    [solaris*], [
3204	LIBRUBY_SO='lib$(RUBY_SO_NAME).$(SOEXT).$(MAJOR)'
3205	LIBRUBY_SONAME='lib$(RUBY_SO_NAME).$(SOEXT).$(RUBY_PROGRAM_VERSION)'
3206	LIBRUBY_ALIASES='$(LIBRUBY_SONAME) lib$(RUBY_SO_NAME).$(SOEXT)'
3207	RUBY_APPEND_OPTIONS(LIBRUBY_DLDFLAGS, ["${linker_flag}-h${linker_flag:+,}"'$(@F)'])
3208	XLDFLAGS="$XLDFLAGS "'-R${libdir}'
3209	],
3210    [hpux*], [
3211	XLDFLAGS="$XLDFLAGS "'-Wl,+s,+b,$(libdir)'
3212	LIBRUBY_ALIASES='$(LIBRUBY_SONAME) lib$(RUBY_SO_NAME).$(SOEXT)'
3213	],
3214    [aix*], [
3215	RUBY_APPEND_OPTIONS(LIBRUBY_DLDFLAGS, ["${linker_flag}-bnoentry" "$XLDFLAGS" "$LDFLAGS_OPTDIR"])
3216	LIBRUBYARG_SHARED='-L${libdir} -l${RUBY_SO_NAME}'
3217	LIBS="$LIBS -lm -lc"
3218	],
3219    [darwin*], [
3220	LIBRUBY_SO='lib$(RUBY_SO_NAME).$(SOEXT)'
3221	LIBRUBY_SONAME='$(LIBRUBY_SO)'
3222	LIBRUBY_ALIASES='lib$(RUBY_INSTALL_NAME).$(SOEXT)'
3223	AS_IF([test "$load_relative" = yes], [
3224	    libprefix="@executable_path/../${libdir_basename}"
3225	    LIBRUBY_RELATIVE=yes
3226	])
3227	LIBRUBY_DLDFLAGS="$LIBRUBY_DLDFLAGS -install_name ${libprefix}"'/$(LIBRUBY_SONAME)'
3228	LIBRUBY_DLDFLAGS="$LIBRUBY_DLDFLAGS "'-compatibility_version $(RUBY_API_VERSION)'
3229	LIBRUBY_DLDFLAGS="$LIBRUBY_DLDFLAGS "'-current_version $(RUBY_PROGRAM_VERSION)'
3230	AS_IF([test "$visibility_option" = ld], [
3231	    LIBRUBY_DLDFLAGS="$LIBRUBY_DLDFLAGS "'-Wl,-unexported_symbol,_Init_*'
3232	    LIBRUBY_DLDFLAGS="$LIBRUBY_DLDFLAGS "'-Wl,-unexported_symbol,_ruby_static_id_*'
3233	    LIBRUBY_DLDFLAGS="$LIBRUBY_DLDFLAGS "'-Wl,-unexported_symbol,*_threadptr_*'
3234	])
3235	LIBRUBY_DLDFLAGS="$LIBRUBY_DLDFLAGS "' $(XLDFLAGS)'
3236	],
3237    [interix*], [
3238	LIBRUBYARG_SHARED='-L. -L${libdir} -l$(RUBY_SO_NAME)'
3239	],
3240    [mingw*|cygwin*|mswin*], [
3241	LIBRUBY_RELATIVE=yes
3242	])
3243], [
3244  LIBRUBYARG_SHARED=
3245
3246  # enable PIE if possible
3247  AC_ARG_ENABLE(pie,
3248          AS_HELP_STRING([--disable-pie], [disable PIE feature]),
3249          [pie=$enableval], [pie=])
3250  AS_IF([test "$GCC" = yes -a -z "$EXTSTATIC" -a "x$pie" != xno], [
3251    RUBY_TRY_CFLAGS(-fPIE, [pie=yes], [pie=no])
3252    AS_IF([test "$pie" = yes], [
3253      # Use -fPIE when testing -pie.  RUBY_TRY_LDFLAGS sets
3254      # $save_CFLAGS internally, so set other name here.
3255      save_CFLAGS_before_pie="$CFLAGS"
3256      CFLAGS="$CFLAGS -fPIE"
3257
3258      # gcc need -pie but clang need -Wl,-pie.
3259      for pie in -pie -Wl,-pie; do
3260	RUBY_TRY_LDFLAGS([$pie], [], [pie=])
3261	AS_IF([test "x$pie" != x], [
3262	  RUBY_APPEND_OPTION(XCFLAGS, -fPIE)
3263	  RUBY_APPEND_OPTION(XLDFLAGS, $pie)
3264	  break
3265	])
3266      done
3267      CFLAGS="$save_CFLAGS_before_pie"
3268    ])
3269  ])
3270])
3271AS_IF([test "$enable_rpath" = yes], [
3272    test -z "$LIBRUBY_RPATHFLAGS" || LIBRUBY_RPATHFLAGS="$LIBRUBY_RPATHFLAGS "
3273    rpathflag="${RPATHFLAG}"
3274    AS_CASE(["${cross_compiling}${load_relative}"], [*yes*], [], [rpathflag="$RPATHFLAG$LIBPATHFLAG"])
3275    rpathflag=`IFS="$PATH_SEPARATOR"
3276        echo x "$rpathflag" |
3277        sed "s/^x *//;s${IFS}"'%1\\$-s'"${IFS}${libprefix}${IFS}g;s${IFS}%s${IFS}${libprefix}${IFS}g"
3278    `
3279    LIBRUBY_RPATHFLAGS="$LIBRUBY_RPATHFLAGS${rpathflag}"
3280    LIBRUBYARG_SHARED="$LIBRUBY_RPATHFLAGS $LIBRUBYARG_SHARED"
3281    LIBRUBYARG_STATIC="$LIBRUBY_RPATHFLAGS $LIBRUBYARG_STATIC"
3282])
3283AC_SUBST(LIBRUBY_RELATIVE)
3284
3285LDFLAGS="-L. $LDFLAGS"
3286AC_SUBST(ARCHFILE)
3287
3288AS_IF([test "$EXEEXT" = .exe], [
3289    EXECUTABLE_EXTS='".exe",".com",".cmd",".bat"'
3290    AC_DEFINE_UNQUOTED(EXECUTABLE_EXTS, $EXECUTABLE_EXTS)
3291    EXECUTABLE_EXTS=`echo $EXECUTABLE_EXTS | tr -d '"' | tr , ' '`
3292    AC_SUBST(EXECUTABLE_EXTS)
3293])
3294
3295AS_CASE("$cross_compiling:${LIBPATHENV}", [yes:* | no:], [], [
3296    AC_MSG_CHECKING(whether wrapper for $LIBPATHENV is needed)
3297    AS_IF([env ${LIBPATHENV}=/lib /bin/sh -c ': ${'${LIBPATHENV}'?}' 2>/dev/null],
3298	[AC_MSG_RESULT(no)],
3299	[PREP="$PREP"' exe/$(PROGRAM)'
3300	AC_MSG_RESULT(yes)]
3301    )
3302])
3303
3304AC_ARG_ENABLE(dtrace,
3305        AS_HELP_STRING([--enable-dtrace],
3306        [enable DTrace for tracing inside ruby. enabled by default on systems having dtrace]),
3307        [enable_dtrace=$enableval], [enable_dtrace=auto])
3308
3309LIBRUBY_A_OBJS='$(OBJS)'
3310DTRACE_REBUILD=
3311AS_CASE(["${enable_dtrace}"],
3312[yes|auto], [
3313    RUBY_DTRACE_AVAILABLE()
3314], [
3315    rb_cv_dtrace_available=no
3316])
3317AS_IF([test "${enable_dtrace}" = yes], [dnl
3318    AS_IF([test -z "$DTRACE"], [dnl
3319	AC_MSG_ERROR([dtrace(1) is missing])
3320    ], [test "$cross_compiling" = yes], [dnl
3321	AC_MSG_ERROR([--enable-dtrace, however, cross compiling])
3322    ], [test "${rb_cv_dtrace_available}" = "no"], [dnl
3323       AC_MSG_ERROR([--enable-dtrace, however, USDT is not available])
3324    ])
3325])
3326AS_CASE([$rb_cv_dtrace_available],
3327[yes*], [dnl
3328    RUBY_DTRACE_POSTPROCESS()
3329    AS_IF([test "$rb_cv_prog_dtrace_g" != no], [dnl
3330	DTRACE_OBJ='probes.$(OBJEXT)'
3331    ])
3332    AS_IF([test "$rb_cv_prog_dtrace_g" = rebuild], [dnl
3333	DTRACE_REBUILD=yes
3334	LIBRUBY_A_OBJS='$(DTRACE_GLOMMED_OBJ)'
3335    ])
3336    AS_CASE("${target_os}", [freebsd*], [dnl
3337        # FreeBSD's dtrace requires libelf
3338        LIBS="-lelf $LIBS"
3339    ])
3340    DTRACE_EXT=d
3341], [dnl
3342    enable_dtrace=no
3343    DTRACE_EXT=dmyh
3344])
3345AC_SUBST(DTRACE_EXT)
3346AC_SUBST(DTRACE_OBJ)
3347AC_SUBST(DTRACE_REBUILD)
3348AC_SUBST(DTRACE_OPT)
3349AC_SUBST(LIBRUBY_A_OBJS)
3350
3351AC_ARG_ENABLE(gcov,
3352       AS_HELP_STRING([--enable-gcov], [enable coverage measurement by gcov]),
3353       [gcov=yes])
3354AS_IF([test x"$gcov" = xyes], [
3355    CFLAGS="$CFLAGS -coverage"
3356    LDFLAGS="$LDFLAGS -coverage"
3357])
3358
3359RUBY_SETJMP_TYPE
3360}
3361
3362: "build section" && {
3363dnl build rdoc index if requested
3364RDOCTARGET=""
3365CAPITARGET=""
3366AC_ARG_ENABLE(install-doc,
3367       AS_HELP_STRING([--disable-install-doc], [do not install either rdoc indexes or C API documents during install]),
3368       [install_doc=$enableval], [install_doc=yes])
3369AC_ARG_ENABLE(install-rdoc,
3370      AS_HELP_STRING([--disable-install-rdoc], [do not install rdoc indexes during install]),
3371      [install_rdoc=$enableval], [install_rdoc=yes])
3372AC_ARG_ENABLE(install-capi,
3373      AS_HELP_STRING([--disable-install-capi], [do not install C API documents during install]),
3374      [install_capi=$enableval], [install_capi=no])
3375
3376AS_IF([test "$install_doc" != no], [
3377    AS_IF([test "$install_rdoc" != no], [
3378	RDOCTARGET="rdoc"
3379    ], [
3380	RDOCTARGET="nodoc"
3381    ])
3382    AS_IF([test "$install_capi" != no -a -n "$DOXYGEN"], [
3383	CAPITARGET="capi"
3384    ], [
3385	CAPITARGET="nodoc"
3386    ])
3387], [
3388    RDOCTARGET="nodoc"
3389    CAPITARGET="nodoc"
3390])
3391
3392AC_SUBST(RDOCTARGET)
3393AC_SUBST(CAPITARGET)
3394
3395AS_CASE(["$RDOCTARGET:$CAPITARGET"],[nodoc:nodoc],[INSTALLDOC=nodoc],[INSTALLDOC=all])
3396AC_SUBST(INSTALLDOC)
3397
3398AC_ARG_ENABLE(jit-support,
3399        AS_HELP_STRING([--disable-jit-support], [disable JIT features]),
3400        [MJIT_SUPPORT=$enableval
3401         AS_IF([test x"$enable_jit_support" = "xyes"],
3402                 [AC_DEFINE(USE_MJIT, 1)],
3403                 [AC_DEFINE(USE_MJIT, 0)])],
3404        [MJIT_SUPPORT=yes
3405         AC_DEFINE(USE_MJIT, 1)])
3406
3407AC_SUBST(MJIT_SUPPORT)
3408
3409AC_ARG_ENABLE(install-static-library,
3410	AS_HELP_STRING([--disable-install-static-library], [do not install static ruby library]),
3411	[INSTALL_STATIC_LIBRARY=$enableval],
3412	AS_IF([test x"$enable_shared" = xyes],
3413	    [INSTALL_STATIC_LIBRARY=no],
3414	    [INSTALL_STATIC_LIBRARY=yes]))
3415AC_SUBST(INSTALL_STATIC_LIBRARY)
3416
3417AS_IF([test "$rb_with_pthread" = "yes"], [
3418    THREAD_MODEL=pthread
3419])
3420AC_CACHE_CHECK([for prefix of external symbols], rb_cv_symbol_prefix, [
3421    AC_TRY_COMPILE([extern void conftest_external(void) {}], [], [
3422	rb_cv_symbol_prefix=`$NM conftest.$ac_objext |
3423			     sed -n ['/.*T[ 	]\([^ 	]*\)conftest_external.*/!d;s//\1/p;q']`
3424	],
3425	[rb_cv_symbol_prefix=''])
3426    test -n "$rb_cv_symbol_prefix" || rb_cv_symbol_prefix=NONE
3427])
3428SYMBOL_PREFIX="$rb_cv_symbol_prefix"
3429test "x$SYMBOL_PREFIX" = xNONE && SYMBOL_PREFIX=''
3430DLNOBJ=dln.o
3431AC_ARG_ENABLE(dln,
3432	      AC_HELP_STRING([--disable-dln], [disable dynamic link feature]),
3433	      [test "$enableval" = yes || DLNOBJ=dmydln.o])
3434AC_SUBST(DLNOBJ)
3435MINIDLNOBJ=dmydln.o
3436
3437AS_CASE(["$target_os"],
3438    [linux*], [
3439	],
3440    [netbsd*], [
3441	RUBY_APPEND_OPTION(CFLAGS, -pipe)
3442	],
3443    [darwin*], [
3444	RUBY_APPEND_OPTION(CFLAGS, -pipe)
3445	AC_COMPILE_IFELSE([
3446	    AC_LANG_BOOL_COMPILE_TRY([@%:@include <AvailabilityMacros.h>],
3447		[MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_7])],
3448	    [dnl
3449		RUBY_APPEND_OPTION(XLDFLAGS, [-framework Security])
3450		RUBY_APPEND_OPTION(LIBRUBYARG_STATIC, [-framework Security])
3451	    ]dnl
3452	)
3453	RUBY_APPEND_OPTION(XLDFLAGS, [-framework Foundation])
3454	RUBY_APPEND_OPTION(LIBRUBYARG_STATIC, [-framework Foundation])
3455	],
3456    [osf*], [
3457	AS_IF([test "$GCC" != "yes" ], [
3458	  # compile something small: taint.c is fine for this.
3459	  # the main point is the '-v' flag of 'cc'.
3460	  AS_CASE(["`cc -v -I. -c main.c -o /tmp/main.o 2>&1`"],
3461	  [*/gemc_cc*], [   # we have the new DEC GEM CC
3462                        CFLAGS="$CFLAGS -oldc"
3463                        ],
3464          [            # we have the old MIPS CC
3465                        ])
3466	  # cleanup
3467	  rm -f /tmp/main.o
3468	  CFLAGS="$CFLAGS -std"
3469	])
3470	],
3471    [cygwin*|mingw*], [
3472	LIBRUBY_DLDFLAGS="${LIBRUBY_DLDFLAGS}"' -Wl,--out-implib=$(LIBRUBY)'
3473	AS_CASE(["$target_os"],
3474	[cygwin*], [
3475	    AS_IF([test x"$enable_shared" = xyes], [
3476		LIBRUBY_SO='cyg$(RUBY_SO_NAME)'.dll
3477		LIBRUBY_DLDFLAGS="${LIBRUBY_DLDFLAGS}"' $(RUBYDEF)'
3478	    ])
3479	    ],
3480	[mingw*], [
3481	    AS_IF([test x"$enable_shared" = xyes], [
3482		LIBRUBY_SO='$(RUBY_SO_NAME)'.dll
3483		LIBRUBY_DLDFLAGS="${LIBRUBY_DLDFLAGS}"' $(RUBYDEF)'
3484	    ])
3485	    EXPORT_PREFIX=' '
3486	    DLDFLAGS="${DLDFLAGS}"' $(DEFFILE)'
3487	    AC_LIBOBJ([win32/win32])
3488	    AC_LIBOBJ([win32/file])
3489	    COMMON_LIBS=m
3490#	    COMMON_MACROS="WIN32_LEAN_AND_MEAN="
3491	    COMMON_HEADERS="winsock2.h windows.h"
3492	    THREAD_MODEL=win32
3493	    PLATFORM_DIR=win32
3494	    ])
3495	LIBRUBY_ALIASES=''
3496	FIRSTMAKEFILE=GNUmakefile:cygwin/GNUmakefile.in
3497	AS_IF([test x"$enable_shared" = xyes], [
3498	    LIBRUBY='lib$(RUBY_SO_NAME).dll.a'
3499	], [
3500	    LIBRUBY_SO=dummy
3501	    LIBRUBY='lib$(RUBY_SO_NAME).a'
3502	    LIBRUBYARG='-l$(RUBY_SO_NAME)'
3503	])
3504	],
3505    [hpux*], [
3506	AS_CASE(["$YACC"],[*yacc*], [
3507	    XCFLAGS="$XCFLAGS -DYYMAXDEPTH=300"
3508	    YACC="$YACC -Nl40000 -Nm40000"
3509	])
3510])
3511
3512MINIOBJS="$MINIDLNOBJ"
3513
3514AS_CASE(["$THREAD_MODEL"],
3515[pthread], [AC_CHECK_HEADERS(pthread.h)],
3516[win32],   [],
3517[""],      [AC_MSG_ERROR(thread model is missing)],
3518           [AC_MSG_ERROR(unknown thread model $THREAD_MODEL)])
3519
3520AC_ARG_ENABLE(debug-env,
3521       AS_HELP_STRING([--enable-debug-env], [enable RUBY_DEBUG environment variable]),
3522       [AC_SUBST(ENABLE_DEBUG_ENV, yes)])
3523
3524AS_CASE(["$FIRSTMAKEFILE"], [*GNUmakefile:*], [gnumake=yes], [
3525    AC_MSG_CHECKING([if ${MAKE-make} is GNU make])
3526    mkdir conftest.dir
3527    echo "all:; @echo yes" > conftest.dir/GNUmakefile
3528    echo "all:; @echo no" > conftest.dir/Makefile
3529    gnumake=`(cd conftest.dir; ${MAKE-make})`
3530    rm -fr conftest.dir
3531    AS_CASE(["$gnumake"],
3532    [*yes*], [
3533	FIRSTMAKEFILE=GNUmakefile:template/GNUmakefile.in
3534	gnumake=yes],
3535    [
3536	gnumake=no])
3537    AC_MSG_RESULT($gnumake)
3538])
3539AS_IF([test "$gnumake" = yes], [ NULLCMD=: ], [
3540    AC_MSG_CHECKING([for safe null command for ${MAKE-make}])
3541    mkdir conftest.dir
3542    NULLCMD=
3543    for cmd in : true; do
3544	echo 'A=1' > conftest.dir/Makefile
3545	echo 'B=$(A:1=@'$cmd')' >> conftest.dir/Makefile
3546	echo 'all:; $B 1 2 3 4 5 6 7 8 9' >> conftest.dir/Makefile
3547	AS_IF([(cd conftest.dir; ${MAKE-make} >/dev/null 2>/dev/null)], [
3548	    NULLCMD=$cmd
3549	    break
3550	])
3551    done
3552    rm -fr conftest.dir
3553    AS_IF([test -z "$NULLCMD"], [
3554	AC_MSG_ERROR(no candidate for safe null command)
3555    ])
3556    AC_MSG_RESULT($NULLCMD)
3557])
3558AC_SUBST(NULLCMD)
3559
3560AS_IF([test "${universal_binary-no}" = yes ], [
3561    AC_CACHE_CHECK([for architecture macros], rb_cv_architecture_macros, [
3562    mv confdefs.h confdefs1.h
3563    : > confdefs.h
3564    AC_TRY_COMPILE([@%:@if defined __`echo ${universal_archnames} |
3565    sed 's/=[^ ]*//g;s/ /__ || defined __/g'`__
3566@%:@else
3567@%:@error
3568>>>>>><<<<<<
3569@%:@endif], [],
3570[
3571    rb_cv_architecture_macros=yes
3572    mv -f confdefs1.h confdefs.h
3573], [
3574    rb_cv_architecture_macros=no
3575    archflagpat=`eval echo '"'"${ARCH_FLAG}"'"' | sed 's/[[][|.*]]/\\&/g'`
3576    new_cflags=`echo "$CFLAGS" | sed "s|$archflagpat"'||'`
3577    for archs in ${universal_archnames}; do
3578	cpu=${archs@%:@*=}
3579	archs=${archs%=*}
3580	CFLAGS="$new_cflags -arch $archs"
3581	archs="__${archs}__"
3582	AC_MSG_CHECKING([for macro ${archs} on ${cpu}])
3583	AC_TRY_COMPILE([@%:@ifndef ${archs}
3584@%:@error
3585@%:@endif], [], [AC_MSG_RESULT([yes])], [AC_MSG_RESULT([no])])
3586    done
3587    mv -f confdefs1.h confdefs.h
3588    AC_MSG_ERROR([failed])
3589    ])])
3590    AC_CACHE_CHECK(whether __ARCHITECTURE__ is available, rb_cv_architecture_available,
3591	AC_TRY_COMPILE([@%:@include <stdio.h>
3592		const char arch[[]] = __ARCHITECTURE__;], [puts(arch);],
3593		[rb_cv_architecture_available=yes], [rb_cv_architecture_available=no]))
3594])
3595
3596: ${MJIT_LDSHARED=`echo "$LDSHARED" | sed ['s|\$(LD)|'"${LD}"'|g;s|\$(CC)|$(MJIT_CC)|g']`}
3597
3598MAINLIBS="$LIBS"
3599LIBS=$ORIG_LIBS
3600AS_IF([test -n "${LIBS}"], [
3601    libspat=`echo "${LIBS}" | sed 's/[[][|.*$^]]/\\&/g;s/^  */ /;s/^  *$/ /'`
3602    MAINFLAGS=`echo " $MAINLIBS " | sed "s|$libspat"'||;s/^ *//;s/ *$//'`
3603])
3604LIBRUBYARG_STATIC="${LIBRUBYARG_STATIC} \$(MAINLIBS)"
3605CPPFLAGS="$CPPFLAGS "'$(DEFS)'
3606test -z "$CPPFLAGS" || CPPFLAGS="$CPPFLAGS "; CPPFLAGS="$CPPFLAGS"'${cppflags}'
3607AS_IF([test -n "${cflags+set}"], [
3608    cflagspat=`eval echo '"'"${cflags}"'"' | sed 's/[[][|.*]]/\\&/g;s/^  */ /;s/^  *$/ /'`
3609    CFLAGS=`echo " $CFLAGS " | sed "s|$cflagspat"'|${cflags}|;s/^ *//;s/ *$//'`
3610])
3611AS_IF([test -n "${cxxflags+set}"], [
3612    cxxflagspat=`eval echo '"'"${cxxflags}"'"' | sed 's/[[][|.*]]/\\&/g;s/^  */ /;s/^  *$/ /'`
3613    CXXFLAGS=`echo " $CXXFLAGS " | sed "s|$cxxflagspat"'|${cxxflags}|;s/^ *//;s/ *$//'`
3614])
3615AS_IF([test "${ARCH_FLAG}"], [
3616    archflagpat=`eval echo '"'"${ARCH_FLAG}"'"' | sed 's/[[][|.*]]/\\&/g'`
3617    CFLAGS=`echo "$CFLAGS" | sed "s| *$archflagpat"'||'`
3618    CXXFLAGS=`echo "$CXXFLAGS" | sed "s| *$archflagpat"'||'`
3619    LDFLAGS=`echo "$LDFLAGS" | sed "s| *$archflagpat"'||'`
3620])
3621warnflags="$rb_cv_warnflags"
3622AC_SUBST(cppflags)dnl
3623AC_SUBST(cflags, ["${orig_cflags:+$orig_cflags }"'${optflags} ${debugflags} ${warnflags}'])dnl
3624AC_SUBST(cxxflags, ["${orig_cxxflags:+$orig_cxxflags }"'${optflags} ${debugflags} ${warnflags}'])dnl
3625AC_SUBST(optflags)dnl
3626AC_SUBST(debugflags)dnl
3627AC_SUBST(warnflags)dnl
3628AC_SUBST(strict_warnflags)dnl
3629AC_SUBST(XCFLAGS)dnl
3630AC_SUBST(XLDFLAGS)dnl
3631AC_SUBST(EXTLDFLAGS)dnl
3632AC_SUBST(EXTDLDFLAGS)dnl
3633AC_SUBST(LIBRUBY_LDSHARED)
3634AC_SUBST(LIBRUBY_DLDFLAGS)
3635AC_SUBST(RUBY_INSTALL_NAME)
3636AC_SUBST(rubyw_install_name)
3637AC_SUBST(RUBYW_INSTALL_NAME)
3638AC_SUBST(RUBY_SO_NAME)
3639AC_SUBST(LIBRUBY_A)
3640AC_SUBST(LIBRUBY_SO)
3641AC_SUBST(LIBRUBY_SONAME)
3642AC_SUBST(LIBRUBY_ALIASES)
3643AC_SUBST(LIBRUBY)
3644AC_SUBST(LIBRUBYARG)
3645AC_SUBST(LIBRUBYARG_STATIC)
3646AC_SUBST(LIBRUBYARG_SHARED)
3647AC_SUBST(SOLIBS)
3648AC_SUBST(DLDLIBS)
3649AC_SUBST(DLDSHARED)
3650AC_SUBST(ENABLE_SHARED)
3651AC_SUBST(MAINLIBS)
3652AC_SUBST(COMMON_LIBS)
3653AC_SUBST(COMMON_MACROS)
3654AC_SUBST(COMMON_HEADERS)
3655AC_SUBST(EXPORT_PREFIX)
3656AC_SUBST(SYMBOL_PREFIX)
3657AC_SUBST(MINIOBJS)
3658AC_SUBST(THREAD_MODEL)
3659AC_SUBST(PLATFORM_DIR)
3660
3661firstmf=`echo $FIRSTMAKEFILE | sed 's/:.*//'`
3662firsttmpl=`echo $FIRSTMAKEFILE | sed 's/.*://'`
3663MAKEFILES="Makefile $firstmf"
3664MAKEFILES="`echo $MAKEFILES`"
3665AC_SUBST(MAKEFILES)
3666
3667ri_prefix=
3668test "$program_prefix" != NONE &&
3669  ri_prefix=$program_prefix
3670
3671ri_suffix=
3672test "$program_suffix" != NONE &&
3673  ri_suffix=$program_suffix
3674
3675RUBY_INSTALL_NAME="${ri_prefix}"'$(RUBY_BASE_NAME)'"${ri_suffix}"
3676AS_CASE(["$target_os"],
3677  [cygwin*|mingw*], [
3678    RUBYW_INSTALL_NAME="${ri_prefix}"'$(RUBYW_BASE_NAME)'"${ri_suffix}"
3679    rubyw_install_name='$(RUBYW_INSTALL_NAME)'
3680    ])
3681
3682rubylibdir='${rubylibprefix}/${ruby_version}'
3683rubyarchdir=${multiarch+'${rubyarchprefix}/${ruby_version}'}${multiarch-'${rubylibdir}/${arch}'}
3684
3685rubyarchprefix=${multiarch+'${archlibdir}/${RUBY_BASE_NAME}'}${multiarch-'${rubylibprefix}/${arch}'}
3686AC_ARG_WITH(rubyarchprefix,
3687	    AS_HELP_STRING([--with-rubyarchprefix=DIR],
3688			   [prefix for architecture dependent ruby libraries [[RUBYLIBPREFIX/ARCH]]]),
3689	    [rubyarchprefix="$withval"])
3690AC_SUBST(rubyarchprefix)
3691
3692rubysitearchprefix=${multiarch+'${sitearchlibdir}/${RUBY_BASE_NAME}'}${multiarch-'${rubylibprefix}/${sitearch}'}
3693AC_ARG_WITH(rubysitearchprefix,
3694	    AS_HELP_STRING([--with-rubysitearchprefix=DIR],
3695			   [prefix for architecture dependent site libraries [[RUBYLIBPREFIX/SITEARCH]]]),
3696	    [rubysitearchprefix="$withval"])
3697AC_SUBST(rubysitearchprefix)
3698
3699RI_BASE_NAME=`echo ${RUBY_BASE_NAME} | sed 's/ruby/ri/'`
3700ridir='${datarootdir}/${RI_BASE_NAME}'
3701AC_ARG_WITH(ridir,
3702	    AS_HELP_STRING([--with-ridir=DIR], [ri documentation [[DATAROOTDIR/ri]]]),
3703	    [ridir=$withval])
3704AC_SUBST(ridir)
3705AC_SUBST(RI_BASE_NAME)
3706
3707AC_ARG_WITH(ruby-version,
3708	    AS_HELP_STRING([--with-ruby-version=STR], [ruby version string for version specific directories [[full]] (full|minor|STR)]),
3709            [ruby_version=$withval],
3710            [ruby_version=full])
3711unset RUBY_LIB_VERSION
3712unset RUBY_LIB_VERSION_STYLE
3713AS_CASE(["$ruby_version"],
3714  [full],  [RUBY_LIB_VERSION_STYLE='3	/* full */'],
3715  [minor], [RUBY_LIB_VERSION_STYLE='2	/* minor */'])
3716AS_IF([test ${RUBY_LIB_VERSION_STYLE+set}], [
3717    {
3718    echo "#define RUBY_LIB_VERSION_STYLE $RUBY_LIB_VERSION_STYLE"
3719    echo '#define STRINGIZE(x) x'
3720    test -f revision.h -o -f "${srcdir}/revision.h" || echo '#define RUBY_REVISION 0'
3721    echo '#include "version.h"'
3722    echo 'ruby_version=RUBY_LIB_VERSION'
3723    } > conftest.c
3724    ruby_version="`$CPP -I. -I"${srcdir}" -I"${srcdir}/include" conftest.c | sed '/^ruby_version=/!d;s/ //g'`"
3725    eval $ruby_version
3726], [test -z "${ruby_version}"], [
3727    AC_MSG_ERROR([No ruby version, No place for bundled libraries])
3728], [
3729    RUBY_LIB_VERSION="${ruby_version}"
3730])
3731AC_SUBST(RUBY_LIB_VERSION_STYLE)
3732AC_SUBST(RUBY_LIB_VERSION)
3733
3734AC_ARG_WITH(sitedir,
3735	    AS_HELP_STRING([--with-sitedir=DIR], [site libraries in DIR [[RUBY_LIB_PREFIX/site_ruby]], "no" to disable site directory]),
3736            [sitedir=$withval],
3737            [sitedir='${rubylibprefix}/site_ruby'])
3738sitelibdir='${sitedir}/${ruby_version}'
3739
3740AC_ARG_WITH(sitearchdir,
3741	    AS_HELP_STRING([--with-sitearchdir=DIR],
3742			   [architecture dependent site libraries in DIR [[SITEDIR/SITEARCH]], "no" to disable site directory]),
3743            [sitearchdir=$withval],
3744            [sitearchdir=${multiarch+'${rubysitearchprefix}/site_ruby/${ruby_version}'}${multiarch-'${sitelibdir}/${sitearch}'}])
3745
3746AC_ARG_WITH(vendordir,
3747	    AS_HELP_STRING([--with-vendordir=DIR], [vendor libraries in DIR [[RUBY_LIB_PREFIX/vendor_ruby]], "no" to disable vendor directory]),
3748            [vendordir=$withval],
3749            [vendordir='${rubylibprefix}/vendor_ruby'])
3750vendorlibdir='${vendordir}/${ruby_version}'
3751
3752AC_ARG_WITH(vendorarchdir,
3753	    AS_HELP_STRING([--with-vendorarchdir=DIR],
3754			   [architecture dependent vendor libraries in DIR [[VENDORDIR/SITEARCH]], "no" to disable vendor directory]),
3755            [vendorarchdir=$withval],
3756            [vendorarchdir=${multiarch+'${rubysitearchprefix}/vendor_ruby/${ruby_version}'}${multiarch-'${vendorlibdir}/${sitearch}'}])
3757
3758AS_IF([test "${LOAD_RELATIVE+set}"], [
3759    AC_DEFINE_UNQUOTED(LOAD_RELATIVE, $LOAD_RELATIVE)
3760    RUBY_EXEC_PREFIX=''
3761])
3762
3763AC_SUBST(RUBY_EXEC_PREFIX)
3764
3765AC_SUBST(libdirname, ${multiarch+arch}libdir)
3766AC_SUBST(archlibdir)dnl
3767AC_SUBST(sitearchlibdir)dnl
3768AC_SUBST(archincludedir)dnl
3769AC_SUBST(sitearchincludedir)dnl
3770AC_SUBST(arch)dnl
3771AC_SUBST(sitearch)dnl
3772AC_SUBST(ruby_version)dnl
3773AC_SUBST(rubylibdir)dnl
3774AC_SUBST(rubyarchdir)dnl
3775AC_SUBST(sitedir)dnl
3776AC_SUBST(sitelibdir)dnl
3777AC_SUBST(sitearchdir)dnl
3778AC_SUBST(vendordir)dnl
3779AC_SUBST(vendorlibdir)dnl
3780AC_SUBST(vendorarchdir)dnl
3781
3782AC_SUBST(CONFIGURE, "`echo $0 | sed 's|.*/||'`")dnl
3783AC_SUBST(configure_args, "`echo "${ac_configure_args}" | sed 's/\\$/$$/g'`")dnl
3784
3785AS_IF([test "${universal_binary-no}" = yes ], [
3786    arch="universal-${target_os}"
3787    AS_IF([test "${rb_cv_architecture_available}" = yes], [
3788	AC_DEFINE_UNQUOTED(RUBY_PLATFORM_CPU, __ARCHITECTURE__)
3789    ], [
3790	for archs in ${universal_archnames}; do
3791	    cpu=`echo $archs | sed 's/.*=//'`
3792	    archs=`echo $archs | sed 's/=.*//'`
3793	    RUBY_DEFINE_IF([defined __${archs}__ &&! defined RUBY_PLATFORM_CPU], RUBY_PLATFORM_CPU, ["${cpu}"])
3794	done
3795    ])
3796    ints='long int short'
3797    test "$ac_cv_type_long_long" = yes && ints="'long long' $ints"
3798    AC_SUBST(UNIVERSAL_ARCHNAMES, "${universal_archnames}")
3799    AC_SUBST(UNIVERSAL_INTS, "${ints}")
3800    AC_DEFINE_UNQUOTED(RUBY_PLATFORM_OS, "${target_os}")
3801    AC_DEFINE_UNQUOTED(RUBY_ARCH, "universal-"RUBY_PLATFORM_OS)
3802    AC_DEFINE_UNQUOTED(RUBY_PLATFORM, "universal."RUBY_PLATFORM_CPU"-"RUBY_PLATFORM_OS)
3803], [
3804    arch="${target_cpu}-${target_os}"
3805    AC_DEFINE_UNQUOTED(RUBY_PLATFORM, "$arch")
3806])
3807
3808unset sitearch
3809AS_CASE(["$target_os"],[mingw*],[sitearch="$target_cpu-$rb_cv_msvcrt"])
3810: ${sitearch='${arch}'}
3811
3812AC_ARG_WITH(search-path,
3813		AS_HELP_STRING([--with-search-path=DIR], [specify the additional search path]),
3814		[search_path=$withval])
3815AS_IF([test "$search_path" != ""], [
3816    AC_SUBST(RUBY_SEARCH_PATH, $search_path)
3817])
3818
3819AC_ARG_WITH(rubyhdrdir,
3820	    AS_HELP_STRING([--with-rubyhdrdir=DIR], [core headers in DIR [[INCLUDEDIR/RUBY_BASE_NAME-RUBY_VERSION]]]),
3821	    [rubyhdrdir=$withval],
3822	    [rubyhdrdir='${includedir}/${RUBY_VERSION_NAME}'])
3823
3824AC_ARG_WITH(rubyarchhdrdir,
3825	    AS_HELP_STRING([--with-rubyarchhdrdir=DIR],
3826			   [architecture dependent core headers in DIR [[$(rubyhdrdir)/$(arch)]]]),
3827	    [rubyarchhdrdir=$withval],
3828	    [rubyarchhdrdir=${multiarch+'${archincludedir}/${RUBY_VERSION_NAME}'}${multiarch-'${rubyhdrdir}/${arch}'}])
3829
3830AC_ARG_WITH(sitehdrdir,
3831	    AS_HELP_STRING([--with-sitehdrdir=DIR], [core site headers in DIR [[RUBYHDRDIR/site_ruby]]]),
3832	    [sitehdrdir=$withval],
3833	    [sitehdrdir='${rubyhdrdir}/site_ruby'])
3834
3835AC_ARG_WITH(sitearchhdrdir,
3836	    AS_HELP_STRING([--with-sitearchhdrdir=DIR],
3837			   [architecture dependent core site headers in DIR [[RUBYHDRDIR/site_ruby]]]),
3838	    [sitearchhdrdir=$withval],
3839	    [sitearchhdrdir=${multiarch+'${sitearchincludedir}/${RUBY_VERSION_NAME}/site_ruby'}${multiarch-'${sitehdrdir}/${sitearch}'}])
3840
3841AC_ARG_WITH(vendorhdrdir,
3842	    AS_HELP_STRING([--with-vendorhdrdir=DIR], [core vendor headers in DIR [[RUBYHDRDIR/vendor_ruby]]]),
3843	    [vendorhdrdir=$withval],
3844	    [vendorhdrdir='${rubyhdrdir}/vendor_ruby'])
3845
3846AC_ARG_WITH(vendorarchhdrdir,
3847	    AS_HELP_STRING([--with-vendorarchhdrdir=DIR],
3848			   [architecture dependent core vendor headers in DIR [[RUBYHDRDIR/vendor_ruby]]]),
3849	    [vendorarchhdrdir=$withval],
3850	    [vendorarchhdrdir=${multiarch+'${sitearchincludedir}/${RUBY_VERSION_NAME}/vendor_ruby'}${multiarch-'${vendorhdrdir}/${sitearch}'}])
3851
3852AC_SUBST(rubyhdrdir)dnl
3853AC_SUBST(sitehdrdir)dnl
3854AC_SUBST(vendorhdrdir)dnl
3855AC_SUBST(rubyarchhdrdir)dnl
3856AC_SUBST(sitearchhdrdir)dnl
3857AC_SUBST(vendorarchhdrdir)dnl
3858
3859AC_ARG_WITH(mantype,
3860	AS_HELP_STRING([--with-mantype=TYPE], [specify man page type; TYPE is one of man and doc]),
3861		[
3862			AS_CASE(["$withval"],
3863			[man|man.gz|man.bz2|doc|doc.gz|doc.bz2], [MANTYPE=$withval],
3864			[AC_MSG_ERROR(invalid man type: $withval)])
3865		])
3866AS_IF([test -z "$MANTYPE"], [
3867	dnl Looks for nroff with -mdoc support.
3868	AC_CACHE_VAL([ac_cv_path_NROFF], [
3869		AC_PATH_PROGS_FEATURE_CHECK([NROFF],
3870			[nroff awf mandoc],
3871			[$ac_path_NROFF -mdoc ${srcdir}/man/ruby.1 \
3872				>/dev/null 2>&1 &&
3873				ac_cv_path_NROFF=$ac_path_NROFF \
3874				ac_path_NROFF_found=:],
3875			[], ["/usr/bin:/usr/ucb"]
3876		)
3877	])
3878	AS_IF([test -n "$ac_cv_path_NROFF"], [
3879		MANTYPE=doc
3880	], [
3881		MANTYPE=man
3882	])
3883])
3884AC_SUBST(MANTYPE)
3885
3886AC_ARG_ENABLE(rubygems,
3887	AS_HELP_STRING([--disable-rubygems], [disable rubygems by default]),
3888	[enable_rubygems="$enableval"], [enable_rubygems=yes])
3889AS_IF([test x"$enable_rubygems" = xno], [
3890    USE_RUBYGEMS=no
3891], [
3892    USE_RUBYGEMS=yes
3893])
3894AC_SUBST(USE_RUBYGEMS)
3895
3896arch_hdrdir="${EXTOUT}/include/${arch}/ruby"
3897AS_MKDIR_P("${arch_hdrdir}")
3898config_h="${arch_hdrdir}/config.h"
3899guard=INCLUDE_RUBY_CONFIG_H
3900{
3901  echo "#ifndef $guard"
3902  echo "#define $guard 1"
3903  grep -v "^#define PACKAGE_" confdefs.h
3904  echo "#endif /* $guard */"
3905} | tr -d '\015' |
3906(
3907  AS_IF([test "x$CONFIGURE_TTY" = xyes], [color=--color], [color=])
3908  exec ${srcdir}/tool/ifchange $color "${config_h}" -
3909) >&AS_MESSAGE_FD || AC_MSG_ERROR([failed to create ${config_h}])
3910tr -d '\015' < largefile.h > confdefs.h
3911rm largefile.h
3912
3913BUILTIN_ENCS=["`sed -n -e '/^BUILTIN_ENCS[ 	]*=/{' \
3914	-e s/// -e :l -e '/\\\\$/N' -e 's/\\\\\\n/ /' -e 't l' -e p \
3915	-e '}' "${srcdir}/enc/Makefile.in"`"]
3916BUILTIN_ENCOBJS=
3917for e in $BUILTIN_ENCS; do BUILTIN_ENCOBJS="$BUILTIN_ENCOBJS "`echo $e | sed 's/\.c$/.$(OBJEXT)/'`; done
3918AC_SUBST(BUILTIN_ENCOBJS)
3919
3920BUILTIN_TRANSES=["`sed -n -e '/^BUILTIN_TRANSES[ 	]*=/{' \
3921	-e s/// -e :l -e '/\\\\$/N' -e 's/\\\\\\n/ /' -e 't l' -e p \
3922	-e '}' "${srcdir}/enc/Makefile.in"`"]
3923BUILTIN_TRANSSRCS=
3924BUILTIN_TRANSOBJS=
3925for e in $BUILTIN_TRANSES; do
3926  BUILTIN_TRANSSRCS="$BUILTIN_TRANSSRCS "`echo $e | sed 's/\.trans$/.c/'`
3927  BUILTIN_TRANSOBJS="$BUILTIN_TRANSOBJS "`echo $e | sed 's/\.trans$/.$(OBJEXT)/'`
3928done
3929AC_SUBST(BUILTIN_TRANSSRCS)
3930AC_SUBST(BUILTIN_TRANSOBJS)
3931
3932PACKAGE=$RUBY_BASE_NAME
3933AC_SUBST(PACKAGE)
3934AS_MESSAGE([$PACKAGE library version = $ruby_version])
3935
3936AS_IF([test x"$CC_WRAPPER" != x], [
3937    CC='$(CC_WRAPPER) '"${CC@%:@$CC_WRAPPER }"
3938    CPP='$(CC_WRAPPER) '"${CPP@%:@$CC_WRAPPER }"
3939    CC_WRAPPER='$(rubyarchdir)/darwin-cc'
3940    XCC_WRAPPER='$(top_srcdir)/tool/darwin-cc'
3941])
3942AC_SUBST(CC_WRAPPER, '')
3943AC_SUBST(XCC_WRAPPER)
3944
3945AS_CASE([" $CPP "], [*" $CC "*], [CPP=`echo " $CPP " | sed "s| $CC |"' $(CC) |;s/^ *//;s/  *$//'`])
3946
3947AS_IF([test x"$firstmf" != x], [
3948    AC_CONFIG_FILES($firstmf:$firsttmpl, [], [firstmf="$firstmf" firsttmpl="$firsttmpl"])
3949])
3950AC_CONFIG_FILES(Makefile, [
3951    tmpmk=confmk$$.tmp
3952    {
3953	AS_IF([test ${VCS+set}], [
3954	    :
3955	], [svn info "$srcdir" > /dev/null 2>&1], [
3956	    VCS='svn'
3957	], [git_dir=`$GIT --work-tree="$srcdir" --git-dir="$srcdir/.git" rev-parse --git-dir 2>/dev/null`], [
3958	    AS_IF([test -d "$git_dir/svn"], [
3959		VCS='$(GIT) svn'
3960	    ], [
3961		VCS='$(GIT)'
3962	    ])
3963	], [
3964	    VCS='echo cannot'
3965	])
3966	AS_CASE("$VCS",
3967		[svn],          [VCSUP='$(VCS) up $(SVNUPOPTIONS)'],
3968		['$(GIT) svn'], [VCSUP='$(VCS) rebase $(GITSVNREBASEOPTIONS)'],
3969		['$(GIT)'|git], [VCSUP='$(VCS) pull $(GITPULLOPTIONS)'],
3970		[VCSUP='$(VCS)'])
3971	sed -n \
3972	    -e '[/^@%:@define \(RUBY_RELEASE_[A-Z]*\) \([0-9][0-9]*\)/]{' \
3973	    -e   's//\1 = \2/' \
3974	    -e   '[s/ \([0-9]\)$/ 0\1/]' \
3975	    -e   p \
3976	    -e '}' "$srcdir/version.h"
3977	sed '/^MISSING/s/\$U\././g;/^VCS *=/s#@VCS@#'"$VCS"'#;/^VCSUP *=/s#@VCSUP@#'"$VCSUP"'#' Makefile
3978	echo; test x"$EXEEXT" = x || echo 'miniruby: miniruby$(EXEEXT)'
3979	AS_IF([test "$gnumake" != yes], [
3980	    echo ['$(MKFILES): $(srcdir)/common.mk']
3981	    sed ['s/{\$([^(){}]*)[^{}]*}//g'] ${srcdir}/common.mk
3982	], [
3983	    echo 'distclean-local::; @$(RM) GNUmakefile uncommon.mk'
3984	])
3985    } > $tmpmk && AS_IF([! grep '^ruby:' $tmpmk > /dev/null], [
3986	AS_IF([test "${gnumake}" = yes], [
3987	    tmpgmk=confgmk$$.tmp
3988	    {
3989		echo "include $tmpmk"
3990		echo "-include uncommon.mk"
3991	    } > $tmpgmk
3992	], [
3993	    tmpgmk=$tmpmk
3994	]) &&
3995	test -z "`${MAKE-make} -f $tmpgmk info-program | grep '^PROGRAM=ruby$'`" &&
3996	echo 'ruby: $(PROGRAM);' >> $tmpmk
3997	test "$tmpmk" = "$tmpgmk" || rm -f "$tmpgmk"
3998    ]) && mv -f $tmpmk Makefile],
3999[EXEEXT='$EXEEXT' gnumake='$gnumake' GIT='$GIT'])
4000
4001AC_ARG_WITH([ruby-pc],
4002	    AC_HELP_STRING([--with-ruby-pc=FILENAME], [pc file basename]),
4003	    [ruby_pc="$withval"],
4004	    [ruby_pc="${RUBY_BASE_NAME}-${MAJOR}.${MINOR}.pc"])
4005AC_SUBST(ruby_pc)
4006AC_SUBST(exec, [exec])
4007
4008AC_ARG_WITH(destdir,
4009	    AS_HELP_STRING([--with-destdir=DESTDIR], [specify default directory to install]),
4010	    [DESTDIR="$withval"])
4011AC_SUBST(DESTDIR)
4012
4013AC_CONFIG_FILES($ruby_pc:template/ruby.pc.in,
4014    [
4015    AS_IF([sed ['s/\$(\([A-Za-z_][A-Za-z0-9_]*\))/${\1}/g;s/@[A-Za-z_][A-Za-z0-9_]*@//'] $ruby_pc > ruby.tmp.pc &&
4016	{
4017	    test -z "$PKG_CONFIG" ||
4018	    PKG_CONFIG_PATH=. $PKG_CONFIG --print-errors ruby.tmp
4019	}],
4020    [
4021	mv -f ruby.tmp.pc $ruby_pc
4022    ], [
4023	exit 1
4024    ])
4025    ],
4026    [ruby_pc='$ruby_pc' PKG_CONFIG='$PKG_CONFIG'])
4027
4028AC_OUTPUT
4029}
4030}
4031
4032AS_IF([test "$silent" = yes], [], [
4033AS_IF([${FOLD+:} false], [], [
4034AS_IF([test "`echo abcdefg hijklmno | fold -s -w10 | sed 1d`" = hijklmno], [FOLD="fold"], [FOLD=])
4035])
4036AS_REQUIRE_SHELL_FN([config_summary],
4037    [AS_FUNCTION_DESCRIBE([config_summary], [NAME, VAL], [configuration summary])],
4038    [AS_IF([test -z "$2"], [], [
4039	AS_ECHO_N(["   * $1:                     "]) | dd bs=1 count=26 2>/dev/null
4040	AS_IF([test "$FOLD"], [
4041	    echo "$2" | fold -s -w50 |
4042	    sed '1!s/^/                          /;$!s/$/\\/'
4043	], [echo "$2"])
4044    ])]
4045)
4046
4047echo "---"
4048echo "Configuration summary for $RUBY_BASE_NAME version $RUBY_PROGRAM_VERSION"
4049echo ""
4050config_summary "Installation prefix" "$prefix"
4051config_summary "exec prefix"         "$exec_prefix"
4052config_summary "arch"                "$arch"
4053config_summary "site arch"           "$sitearch"
4054config_summary "RUBY_BASE_NAME"      "$RUBY_BASE_NAME"
4055config_summary "enable shared"       "$enable_shared"
4056config_summary "ruby lib prefix"     "$rubylibprefix"
4057config_summary "site libraries path" "$rubysitearchprefix"
4058config_summary "vendor path"         "$vendordir"
4059config_summary "target OS"           "$target_os"
4060config_summary "compiler"            "$CC"
4061config_summary "with pthread"        "$enable_pthread"
4062config_summary "enable shared libs"  "$ENABLE_SHARED"
4063config_summary "dynamic library ext" "$DLEXT"
4064config_summary "CFLAGS"              "$cflags"
4065config_summary "CPPFLAGS"            "$cppflags"
4066config_summary "LDFLAGS"             "$LDFLAGS"
4067config_summary "DLDFLAGS"            "$DLDFLAGS"
4068config_summary "optflags"            "$optflags"
4069config_summary "debugflags"          "$debugflags"
4070config_summary "warnflags"           "$warnflags"
4071config_summary "strip command"       "$STRIP"
4072config_summary "install doc"         "$install_doc"
4073config_summary "JIT support"         "$MJIT_SUPPORT"
4074config_summary "man page type"       "$MANTYPE"
4075config_summary "search path"         "$search_path"
4076config_summary "static-linked-ext"   ${EXTSTATIC:+"yes"}
4077echo ""
4078echo "---"
4079])
4080