1dnl Process this file with autoconf to produce a configure script.
2AC_INIT()
3{
4AC_CONFIG_AUX_DIR(tool)
5
6AC_PREREQ(2.60)
7
8AC_DEFUN([RUBY_PREREQ_AC],
9	[m4_if(m4_version_compare(m4_defn([m4_PACKAGE_VERSION]), [$1]), [-1],
10		AC_MSG_ERROR([Autoconf version ]$1[ or higher is required]$2))])
11
12AC_DEFUN([RUBY_RM_RECURSIVE], [
13m4_if(m4_version_compare(m4_defn([m4_PACKAGE_VERSION]), [2.70]), [-1], [
14# suppress error messages, rm: cannot remove 'conftest.dSYM', from
15# AC_EGREP_CPP with CFLAGS=-g on Darwin.
16AS_CASE([$build_os], [darwin*], [
17rm() {
18    rm_recursive=''
19    for arg do
20	AS_CASE("$arg",
21		[--*], [],
22		[-*r*], [break],
23		[conftest.*], [if test -d "$arg"; then rm_recursive=-r; break; fi],
24		[])
25    done
26    command rm $rm_recursive "[$]@"
27}
28])])])
29
30{ # environment section
31
32AC_ARG_WITH(baseruby,
33	AS_HELP_STRING([--with-baseruby=RUBY], [use RUBY as baseruby; RUBY is the pathname of ruby]),
34	[
35		AS_CASE(["$withval"],[*ruby*],[BASERUBY=$withval],[AC_MSG_ERROR(need ruby)])
36	],
37	[
38		BASERUBY="ruby"
39	])
40if test "`RUBYOPT=- $BASERUBY -e 'p 42' 2>/dev/null`" = 42; then
41    if test "`RUBYOPT=- $BASERUBY --disable=gems -e 'p 42' 2>/dev/null`" = 42; then
42	BASERUBY="$BASERUBY --disable=gems"
43    fi
44else
45    BASERUBY="echo executable host ruby is required.  use --with-baseruby option.; false"
46fi
47AC_SUBST(BASERUBY)
48
49AC_DEFUN([RUBY_MINGW32],
50[AS_CASE(["$host_os"],
51[cygwin*], [
52AC_CACHE_CHECK(for mingw32 environment, rb_cv_mingw32,
53[AC_TRY_CPP([
54#ifndef __MINGW32__
55# error
56#endif
57], rb_cv_mingw32=yes,rb_cv_mingw32=no)
58rm -f conftest*])
59if test "$rb_cv_mingw32" = yes; then
60    target_os="mingw32"
61    : ${ac_tool_prefix:="`expr "$CC" : ['\(.*-\)g\?cc[^/]*$']`"}
62fi
63])
64AS_CASE(["$target_os"], [mingw*msvc], [
65target_os="`echo ${target_os} | sed 's/msvc$//'`"
66])
67AS_CASE(["$target_cpu-$target_os"], [x86_64-mingw*], [
68target_cpu=x64
69])
70])
71
72AC_DEFUN([RUBY_NACL],
73[
74 AS_CASE(["${host_os}"],
75[nacl], [
76  ac_cv_exeext=.nexe
77  host_vendor=chromium
78  ac_cv_host=chromium
79  AC_MSG_CHECKING([wheather \$NACL_SDK_ROOT is set])
80  if test x"${NACL_SDK_ROOT}" = x; then
81    AC_MSG_RESULT([no])
82    AC_MSG_ERROR([You need to set \$NACL_SDK_ROOT environment variable to build for NativeClient])
83  fi
84  AC_MSG_RESULT([yes])
85
86  nacl_cv_build_variant=glibc
87  AC_ARG_WITH(newlib,
88              AS_HELP_STRING([--with-newlib], [uses newlib version of NativeClient SDK]),
89              [AS_CASE([$withval],
90                       [no], [nacl_cv_build_variant=glibc],
91                       [yes], [nacl_cv_build_variant=newlib])])
92
93  AS_CASE(["$build_cpu"],
94          [x86_64|i?86], [nacl_cv_cpu_nick=x86], [nacl_cv_cpu_nick=$build_cpu])
95  AS_CASE(["$build_os"],
96          [linux*], [nacl_cv_os_nick=linux],
97          [darwin*], [nacl_cv_os_nick=mac],
98          [cygwin*|mingw*], [nacl_cv_os_nick=win],
99          [nacl_cv_os_nick=$build_os])
100
101  host="$host_cpu-chromium-$host_os-"
102  ac_tool_prefix="$host_cpu-nacl-"
103
104  AC_MSG_CHECKING([NativeClient toolchain])
105  if test -d \
106    "${NACL_SDK_ROOT}/toolchain/${nacl_cv_os_nick}_${nacl_cv_cpu_nick}_${nacl_cv_build_variant}"; then
107    NACL_TOOLCHAIN="${nacl_cv_os_nick}_${nacl_cv_cpu_nick}_${nacl_cv_build_variant}"
108  else
109    AS_CASE(
110      ["${nacl_cv_build_variant}"],
111      [glibc], [if test \
112        -d "${NACL_SDK_ROOT}/toolchain/${nacl_cv_os_nick}_${nacl_cv_cpu_nick}_newlib" \
113        -a -d "${NACL_SDK_ROOT}/toolchain/${nacl_cv_os_nick}_${nacl_cv_cpu_nick}"; then
114        NACL_TOOLCHAIN="${nacl_cv_os_nick}_${nacl_cv_cpu_nick}"
115      fi],
116      [newlib], [ NACL_TOOLCHAIN="${nacl_cv_os_nick}_${nacl_cv_cpu_nick}" ])
117  fi
118  if test ! -e "${NACL_SDK_ROOT}/toolchain/${NACL_TOOLCHAIN}/${ac_tool_prefix}gcc"; then
119    if test "${build_cpu}" = i686 -a -e "${NACL_SDK_ROOT}/toolchain/${NACL_TOOLCHAIN}/nacl-gcc"; then
120      ac_tool_prefix=nacl-
121    fi
122    if test "${build_cpu}" = x86_64 -a -e "${NACL_SDK_ROOT}/toolchain/${NACL_TOOLCHAIN}/nacl-gcc"; then
123      ac_tool_prefix=nacl64-
124    fi
125  fi
126  if test -z "${NACL_TOOLCHAIN}"; then
127    AC_MSG_ERROR([Unrecognized --host and --build combination or NaCl SDK is not installed])
128  fi
129  AC_MSG_RESULT(${NACL_TOOLCHAIN})
130
131  AC_MSG_CHECKING([path to SDK])
132  if ! echo -- "${PATH}" | grep -F "${NACL_SDK_ROOT}/toolchain/${NACL_TOOLCHAIN}/bin" > /dev/null; then
133    PATH="${PATH}:${NACL_SDK_ROOT}/toolchain/${NACL_TOOLCHAIN}/bin"
134  fi
135
136  AC_SUBST(NACL_TOOLCHAIN)
137  AC_SUBST(NACL_SDK_ROOT)
138  AC_SUBST(NACL_SDK_VARIANT, nacl_cv_build_variant)
139])])
140
141AC_DEFUN([RUBY_NACL_CHECK_PEPPER_TYPES],
142[AS_CASE(["${host_os}"],
143[nacl], [
144 AC_CHECK_TYPES([struct PPB_Core, struct PPB_Messaging, struct PPB_Var,
145              struct PPB_URLLoader, struct PPB_URLRequestInfo,
146              struct PPB_URLResponseInfo, struct PPB_FileRef,
147              struct PPP_Instance])
148])
149])
150
151AC_DEFUN([RUBY_CPPOUTFILE],
152[AC_CACHE_CHECK(whether ${CPP} accepts -o, rb_cv_cppoutfile,
153[save_CPPFLAGS="$CPPFLAGS"
154CPPFLAGS='-o conftest-1.i'
155rb_cv_cppoutfile=no
156AC_TRY_CPP([test-for-cppout],
157	   [grep test-for-cppout conftest-1.i > /dev/null && rb_cv_cppoutfile=yes])
158CPPFLAGS="$save_CPPFLAGS"
159rm -f conftest*])
160if test "$rb_cv_cppoutfile" = yes; then
161  CPPOUTFILE='-o conftest.i'
162elif test "$rb_cv_cppoutfile" = no; then
163  CPPOUTFILE='> conftest.i'
164elif test -n "$rb_cv_cppoutfile"; then
165  CPPOUTFILE="$rb_cv_cppoutfile"
166fi
167AC_SUBST(CPPOUTFILE)])
168
169AC_DEFUN([RUBY_PROG_GNU_LD],
170[AC_CACHE_CHECK(whether the linker is GNU ld, rb_cv_prog_gnu_ld,
171[if `$CC $CFLAGS $CPPFLAGS $LDFLAGS --print-prog-name=ld 2>&1` -v 2>&1 | grep "GNU ld" > /dev/null; then
172  rb_cv_prog_gnu_ld=yes
173else
174  rb_cv_prog_gnu_ld=no
175fi
176])
177GNU_LD=$rb_cv_prog_gnu_ld
178AC_SUBST(GNU_LD)])
179
180eval `sed -n 's/^#define RUBY_API_VERSION_\([A-Z][A-Z_0-9]*\) \([0-9][0-9]*\)/\1=\2/p' $srcdir/include/ruby/version.h`
181for v in MAJOR MINOR TEENY; do
182    if eval "test \"\$$v\" = ''"; then
183	AC_MSG_ERROR(could not determine $v number from version.h)
184    fi
185done
186AC_SUBST(MAJOR)
187AC_SUBST(MINOR)
188AC_SUBST(TEENY)
189RUBY_PROGRAM_VERSION=`sed -n 's/^#define RUBY_VERSION "\(.*\)"/\1/p' $srcdir/version.h`
190AC_SUBST(RUBY_PROGRAM_VERSION)
191RUBY_RELEASE_DATE=`sed -n 's/^#define RUBY_RELEASE_DATE "\(.*\)"/\1/p' $srcdir/version.h`
192AC_SUBST(RUBY_RELEASE_DATE)
193RUBY_PATCHLEVEL=`sed -n 's/^#define RUBY_PATCHLEVEL //p' $srcdir/version.h`
194AC_DEFINE(CANONICALIZATION_FOR_MATHN)
195dnl checks for alternative programs
196AC_CANONICAL_BUILD
197RUBY_RM_RECURSIVE
198AC_ARG_WITH(gcc,
199	AS_HELP_STRING([--without-gcc], [never use gcc]),
200	[
201	AS_CASE([$withval],
202	    [no],  [: ${CC=cc}],
203	    [yes], [: ${CC=gcc}],
204	           [CC=$withval])])
205dnl If the user switches compilers, we can't believe the cache
206if test ! -z "$ac_cv_prog_CC" -a ! -z "$CC" -a "$CC" != "$ac_cv_prog_CC"
207then
208  AC_MSG_ERROR(cached CC is different -- throw away $cache_file
209(it is also a good idea to do 'make clean' before compiling))
210fi
211AS_CASE(["$build_os"],
212  [darwin1*.*], [
213    AS_CASE(["x$CC"],
214      [xgcc-4.2|x/usr/bin/gcc-4.2], [: ${CXX=g++-4.2}],
215      [xgcc|x/usr/bin/gcc],         [: ${CXX=g++}],
216      [xcc|x/usr/bin/cc],           [: ${CXX=c++}],
217      [xclang|x/usr/bin/clang],     [: ${CXX=clang++}])
218  ])
219test -z "$CC" || ac_cv_prog_CC="$CC"
220test -z "$CXX" || ac_cv_prog_CXX="$CXX"
221
222if test "$program_prefix" = NONE; then
223  program_prefix=
224fi
225RUBY_BASE_NAME=`echo ruby | sed "$program_transform_name"`
226RUBYW_BASE_NAME=`echo rubyw | sed "$program_transform_name"`
227AC_SUBST(RUBY_BASE_NAME)
228AC_SUBST(RUBYW_BASE_NAME)
229AC_SUBST(RUBY_VERSION_NAME, '${RUBY_BASE_NAME}-${ruby_version}')
230AC_DEFINE_UNQUOTED(RUBY_BASE_NAME, "${RUBY_BASE_NAME}" !<verconf>!)
231AC_DEFINE_UNQUOTED(RUBY_VERSION_NAME, RUBY_BASE_NAME"-"RUBY_LIB_VERSION !<verconf>!)
232
233AC_CANONICAL_TARGET
234target_os=`echo $target_os | sed 's/linux-gnu$/linux/;s/linux-gnu/linux-/'`
235ac_install_sh='' # unusable for extension libraries.
236
237AC_DEFUN([RUBY_APPEND_OPTION],
238	[# RUBY_APPEND_OPTION($1, $2)
239	AS_CASE([" [$]{$1-} "],
240	[*' $2 '*], [], ['  '], [ $1="$2"], [ $1="[$]$1 $2"])])
241AC_DEFUN([RUBY_APPEND_OPTIONS],
242	[{ for rb_opt in $2; do # RUBY_APPEND_OPTIONS($1, $2)
243	AS_CASE([" [$]{$1-} "],
244	[*" [$]{rb_opt} "*], [], ['  '], [ $1="[$]{rb_opt}"], [ $1="[$]$1 [$]{rb_opt}"])
245	done; }])
246AC_DEFUN([RUBY_PREPEND_OPTION],
247	[# RUBY_PREPEND_OPTION($1, $2)
248	AS_CASE([" [$]{$1-} "],
249	[*' $2 '*], [], ['  '], [ $1="$2"], [ $1="$2 [$]$1"])])
250AC_DEFUN([RUBY_PREPEND_OPTIONS],
251	[{ unset rb_opts; for rb_opt in $2; do # RUBY_PREPEND_OPTIONS($1, $2)
252	AS_CASE([" [$]{rb_opts} [$]{$1-} "],
253	[*" [$]{rb_opt} "*], [], ['  '], [ $1="[$]{rb_opt}"], [ rb_opts="[$]{rb_opts}[$]{rb_opt} "])
254	done
255	$1="[$]{rb_opts}[$]$1"; }])
256
257AC_ARG_WITH(arch,
258	AS_HELP_STRING([--with-arch=ARCHS],
259		       [build an Apple/NeXT Multi Architecture Binary (MAB);
260                          ARCHS is a comma-delimited list of architectures for
261                          which to build; if this option is disabled or omitted
262			  entirely, then the package will be built only for the
263			  target platform]),
264       [target_archs="$withval"], [unset target_archs])
265
266AC_DEFUN([RUBY_DEFAULT_ARCH], [
267AC_MSG_CHECKING([arch option])
268AS_CASE([$1],
269	[*64],        [ARCH_FLAG=-m64],
270	[[i[3-6]86]], [ARCH_FLAG=-m32],
271	[AC_MSG_ERROR(unknown target architecture: $target_archs)]
272	)
273AC_MSG_RESULT([$ARCH_FLAG])
274])
275
276AC_DEFUN([RUBY_UNIVERSAL_ARCH], [
277# RUBY_UNIVERSAL_ARCH begin
278ARCH_FLAG=`expr " $CFLAGS " : ['.* \(-m[0-9][0-9]*\) ']`
279test ${CFLAGS+set} && CFLAGS=`echo "$CFLAGS" | sed -e 's/ *-arch  *[^ ]*//g' -e 's/ *-m32//g' -e 's/ *-m64//g'`
280test ${LDFLAGS+set} && LDFLAGS=`echo "$LDFLAGS" | sed -e 's/ *-arch  *[^ ]*//g' -e 's/ *-m32//g' -e 's/ *-m64//g'`
281unset universal_binary universal_archnames
282if test ${target_archs+set}; then
283    AC_MSG_CHECKING([target architectures])
284    target_archs=`echo $target_archs | tr , ' '`
285    # /usr/lib/arch_tool -archify_list $TARGET_ARCHS
286    for archs in $target_archs
287    do
288	AS_CASE([",$universal_binary,"],[*",$archs,"*], [],[
289	    cpu=`$SHELL "$ac_aux_dir/config.sub" "${archs}-${target_os}" 2>&1` || {
290	        AC_MSG_RESULT([failed])
291		AC_MSG_ERROR([$cpu])
292	    }
293	    cpu=`echo $cpu | sed 's/-.*-.*//'`
294	    universal_binary="${universal_binary+$universal_binary,}$cpu"
295	    universal_archnames="${universal_archnames} ${archs}=${cpu}"
296	    ARCH_FLAG="${ARCH_FLAG+$ARCH_FLAG }-arch $archs"
297	    ])
298    done
299    target_archs="$universal_binary"
300    unset universal_binary
301    AS_CASE(["$target_archs"],
302      [*,*], [universal_binary=yes],
303             [unset universal_archnames])
304    AC_MSG_RESULT([$target_archs])
305
306    target=`echo $target | sed "s/^$target_cpu-/-/"`
307    target_alias=`echo $target_alias | sed "s/^$target_cpu-/-/"`
308    if test "${universal_binary-no}" = yes; then
309	RUBY_PREREQ_AC(2.63, [ to compile universal binary])
310	AC_SUBST(try_header,try_compile)
311	target_cpu=universal
312	real_cross_compiling=$cross_compiling
313    else
314	if test x"$target_cpu" != x"${target_archs}"; then
315	    echo 'int main(){return 0;}' > conftest.c
316	    if $CC $CFLAGS $ARCH_FLAG -o conftest conftest.c > /dev/null 2>&1; then
317		rm -fr conftest.*
318	    else
319		RUBY_DEFAULT_ARCH("$target_archs")
320	    fi
321	fi
322	target_cpu=${target_archs}
323    fi
324    AS_CASE(["$target"], [-*], [ target="$target_cpu${target}"])
325    AS_CASE(["$target_alias"], [-*], [ target_alias="$target_cpu${target_alias}"])
326else
327    if test x"$target_alias" = x; then
328	AS_CASE(["$target_os"],
329	  [darwin*], [
330	    AC_MSG_CHECKING([for real target cpu])
331	    target=`echo $target | sed "s/^$target_cpu-/-/"`
332	    target_cpu=`$CC -E - 2>/dev/null <<EOF |
333#ifdef __x86_64__
334"processor-name=x86_64"
335#endif
336#ifdef __i386__
337"processor-name=i386"
338#endif
339#ifdef __ppc__
340"processor-name=powerpc"
341#endif
342#ifdef __ppc64__
343"processor-name=powerpc64"
344#endif
345EOF
346	    sed -n 's/^"processor-name=\(.*\)"/\1/p'`
347	    target="$target_cpu${target}"
348	    AC_MSG_RESULT([$target_cpu])
349	    ])
350    fi
351    target_archs="$target_cpu"
352fi
353if test "${target_archs}" != "${rb_cv_target_archs-${target_archs}}"; then
354    AC_MSG_ERROR([target arch(s) has changed from ${rb_cv_target_archs-nothing} to ${target_archs}])
355else
356    rb_cv_target_archs=${target_archs}
357fi
358if test "x${ARCH_FLAG}" != x; then
359    CFLAGS="$CFLAGS ${ARCH_FLAG}"
360    LDFLAGS="${LDFLAGS+$LDFLAGS }${ARCH_FLAG}"
361fi
362# RUBY_UNIVERSAL_ARCH end
363])
364
365AC_ARG_ENABLE(load-relative,
366       AS_HELP_STRING([--enable-load-relative], [resolve load paths at run time]),
367       [load_relative=$enableval])
368
369AC_ARG_PROGRAM
370
371dnl Checks for programs.
372
373cflagspat=
374test -z "$optflags" ||
375    cflagspat="$cflagspat;s|"`eval echo '"'"${optflags}"'"' | sed 's/[[][|.*]]/\\&/g;s/^ */ /;s/ *$/ /'`'| |g'
376test -z "$debugflags" ||
377    cflagspat="$cflagspat;s|"`eval echo '"'"${debugflags}"'"' | sed 's/[[][|.*]]/\\&/g;s/^ */ /;s/ *$/ /'`'| |g'
378test -z "warnflags" ||
379    cflagspat="$cflagspat;s|"`eval echo '"'"${warnflags}"'"' | sed 's/[[][|.*]]/\\&/g;s/^ */ /;s/ *$/ /'`'| |g'
380if test -z "${CFLAGS+set}"; then
381    cflags=`echo " $cflags " | sed "$cflagspat;s/^ *//;s/ *$//"`
382    orig_cflags="$cflags"
383    cflags="$cflags "'${optflags} ${debugflags} ${warnflags}'
384fi
385if test -z "${CXXFLAGS+set}"; then
386    cxxflags=`echo " $cxxflags " | sed "$cflagspat;s/^ *//;s/ *$//"`
387    orig_cxxflags="$cxxflags"
388    cxxflags="$cxxflags "'${optflags} ${debugflags} ${warnflags}'
389fi
390
391RUBY_NACL
392AS_CASE(["$host_os:$build_os"],
393[darwin*:darwin*], [
394    AC_CHECK_TOOLS(CC, [gcc-4.2 clang gcc cc])
395])
396if test x"${build}" != x"${host}"; then
397  AC_CHECK_TOOL(CC, gcc)
398fi
399
400AC_PROG_CC
401AC_PROG_CXX
402RUBY_MINGW32
403AC_PROG_GCC_TRADITIONAL
404AC_SUBST(GCC)
405AS_CASE(["$target_os"],
406[solaris*], [AC_PATH_TOOL([LD], [ld], [/usr/ccs/bin/ld], [/usr/ccs/bin:$PATH])],
407[AC_CHECK_TOOL([LD], [ld], [ld])])
408AC_SUBST(LD)
409if test "$GCC" = yes; then
410    linker_flag=-Wl,
411    : ${optflags=-O3}
412    RUBY_APPEND_OPTIONS(XCFLAGS, ["-include ruby/config.h" "-include ruby/missing.h"])
413else
414    linker_flag=
415fi
416
417RUBY_PROG_GNU_LD
418RUBY_CPPOUTFILE
419
420: ${OUTFLAG='-o '}
421: ${COUTFLAG=${OUTFLAG}}
422AC_SUBST(OUTFLAG)
423AC_SUBST(COUTFLAG)
424
425RUBY_UNIVERSAL_ARCH
426if test "$target_cpu" != "$host_cpu" -a "$GCC" = yes -a "$cross_compiling" = no -a "$universal_binary" = no; then
427    RUBY_DEFAULT_ARCH("$target_cpu")
428fi
429
430AS_CASE(["$target_cpu-$target_os"], [[i[3-6]86*]], [
431	 AC_CACHE_CHECK([for __sync_val_compare_and_swap], [rb_cv_gcc_compiler_cas], [
432			 AC_TRY_LINK([unsigned long atomic_var;],
433				     [
434				      __sync_val_compare_and_swap(&atomic_var, 0, 1);
435				      ],
436				      [rb_cv_gcc_compiler_cas=yes],
437				      [rb_cv_gcc_compiler_cas=no])])
438	 if test "$rb_cv_gcc_compiler_cas" = no; then
439		 unset rb_cv_gcc_compiler_cas
440		 save_CFLAGS="$CFLAGS"
441		 CFLAGS="$CFLAGS -march=i486"
442		 AC_CACHE_CHECK([for __sync_val_compare_and_swap with -march=i486], [rb_cv_gcc_compiler_cas], [
443				 AC_TRY_LINK([unsigned long atomic_var;],
444					     [
445					      __sync_val_compare_and_swap(&atomic_var, 0, 1);
446					      ],
447					      [rb_cv_gcc_compiler_cas=yes
448					       ARCH_FLAG="-march=i486"],
449					      [rb_cv_gcc_compiler_cas=no])])
450		 CFLAGS="$save_CFLAGS"
451	 fi])
452
453AC_CHECK_TOOL(RANLIB, ranlib, :)
454AC_CHECK_TOOL(AR, ar)
455if test -z "$AR"; then
456  AC_CHECK_PROGS(AR, aal, ar)
457fi
458
459AC_CHECK_TOOL(AS, as)
460ASFLAGS=$ASFLAGS
461AC_SUBST(ASFLAGS)
462
463AS_CASE(["$target_os"],[cygwin*|mingw*], [ac_cv_prog_ac_ct_OBJCOPY=":"])
464
465# BSD's ports and MacPorts prefix GNU binutils with 'g'
466AC_CHECK_TOOLS(OBJDUMP, [objdump gobjdump])
467AC_CHECK_TOOLS(OBJCOPY, [objcopy gobjcopy])
468
469AS_CASE(["$target_os"],
470[cygwin*|mingw*], [
471    AC_CHECK_TOOL(WINDRES, windres)
472    AC_CHECK_TOOL(DLLWRAP, dllwrap)
473    target=`echo $target | sed "s/^$target_cpu-/-/"`
474    target_alias=`echo $target_alias | sed "s/^$target_cpu-/-/"`
475    target_cpu=`echo $target_cpu | sed s/i.86/i386/`
476    AS_CASE(["$target"], [-*], [ target="$target_cpu${target}"])
477    AS_CASE(["$target_alias"], [-*], [ target_alias="$target_cpu${target_alias}"])
478    AS_CASE(["$target_os"],
479    [mingw*], [
480	test "$rb_cv_msvcrt" = "" && unset rb_cv_msvcrt
481	AC_CACHE_CHECK(for mingw32 runtime DLL, rb_cv_msvcrt, [
482	AC_TRY_LINK([@%:@include <stdio.h>],
483		    [FILE* volatile f = stdin; return 0;],
484		    [rb_cv_msvcrt=`$OBJDUMP -p conftest$ac_exeext |
485				   tr A-Z a-z |
486				   sed -n '/^[[ 	]]*dll name: \(msvc.*\)\.dll$/{s//\1/p;q;}'`],
487		    [rb_cv_msvcrt=msvcrt])
488	test "$rb_cv_msvcrt" = "" && rb_cv_msvcrt=msvcrt])
489	RT_VER=`echo "$rb_cv_msvcrt" | tr -cd [0-9]`
490	test "$RT_VER" = "" && RT_VER=60
491	AC_DEFINE_UNQUOTED(RUBY_MSVCRT_VERSION, $RT_VER)
492    ])
493    : ${enable_shared=yes}
494    ],
495[aix*],     [AC_CHECK_TOOL(NM, nm, /usr/ccs/bin/nm, /usr/ccs/bin:$PATH)],
496[hiuxmpp*], [AC_DEFINE(__HIUX_MPP__)])    # by TOYODA Eizi <toyoda@npd.kishou.go.jp>
497AC_CHECK_TOOL(NM, nm)
498
499AC_PROG_LN_S
500AC_PROG_MAKE_SET
501AC_PROG_INSTALL
502AC_PROG_MKDIR_P
503if test "x$MKDIR_P" = "x -d"; then
504  if test x"$as_mkdir_p" != xfalse; then
505    MKDIR_P='mkdir -p'
506    echo "use 'mkdir -p' as MKDIR_P"
507  else
508    AC_MSG_ERROR([mkdir -p is required])
509  fi
510fi
511MAKEDIRS="$MKDIR_P"
512AC_SUBST(MAKEDIRS)
513
514AC_DEFUN([RUBY_DTRACE_AVAILABLE],
515[AC_CACHE_CHECK(whether dtrace USDT is available, rb_cv_dtrace_available,
516[
517    echo "provider conftest{ probe fire(); };" > conftest_provider.d
518    if $DTRACE -h -o conftest_provider.h -s conftest_provider.d >/dev/null 2>/dev/null; then
519      # DTrace is available on the system
520      rb_cv_dtrace_available=yes
521    else
522      # DTrace is not available while dtrace command exists
523      # for example FreeBSD 8 or FreeBSD 9 without DTrace build option
524      rb_cv_dtrace_available=no
525    fi
526    rm -f conftest.[co] conftest_provider.[dho]
527])
528])
529
530AC_DEFUN([RUBY_DTRACE_POSTPROCESS],
531[AC_CACHE_CHECK(whether $DTRACE needs post processing, rb_cv_prog_dtrace_g,
532[
533  if {
534    echo "provider conftest{ probe fire(); };" > conftest_provider.d &&
535    dtrace -h -o conftest_provider.h -s conftest_provider.d >/dev/null 2>/dev/null &&
536    cat >conftest.c <<_CONF &&
537    @%:@include "conftest_provider.h"
538    int main(void){ CONFTEST_FIRE(); return 0; }
539_CONF
540    $CC $CFLAGS -c -o conftest.o conftest.c &&
541    $DTRACE -G -s conftest_provider.d conftest.o 2>/dev/null
542  }; then
543    rb_cv_prog_dtrace_g=yes
544  else
545    rb_cv_prog_dtrace_g=no
546  fi
547  rm -f conftest.[co] conftest_provider.[dho]
548])
549])
550
551AC_CHECK_PROG([DTRACE], [${ac_tool_prefix}dtrace], [${ac_tool_prefix}dtrace])
552if test "$cross_compiling:$ac_cv_prog_DTRACE" = no: -a -n "$ac_tool_prefix"; then
553    AC_CHECK_PROG([DTRACE], [dtrace], [dtrace])
554fi
555
556AC_CHECK_PROGS(DOT, dot)
557AC_CHECK_PROGS(DOXYGEN, doxygen)
558AS_CASE(["${host_os}"], [nacl], [AC_PATH_PROG(PYTHON, python)])
559
560AC_CHECK_PROG(PKG_CONFIG, pkg-config, [pkg-config], [], [],
561    [`"$as_dir/$ac_word$ac_exec_ext" --print-errors --version > /dev/null 2>&1 || echo "$as_dir/$ac_word$ac_exec_ext"`])
562
563# checks for UNIX variants that set C preprocessor variables
564AC_USE_SYSTEM_EXTENSIONS
565
566AC_SUBST(RM, ['rm -f'])
567AC_SUBST(CP, ['cp'])
568RMDIRS='$(top_srcdir)/tool/rmdirs'
569RMDIR=rmdir
570mkdir "rmdirs_$$_test" "rmdirs_$$_test/a"
571rmdir --ignore-fail-on-non-empty "rmdirs_$$_test" 2>/dev/null &&
572RMDIR='rmdir --ignore-fail-on-non-empty'
573$RMDIR -p "rmdirs_$$_test/a" 2>/dev/null &&
574{ test -d "rmdirs_$$_test" || RMDIRS="$RMDIR -p"; }
575rmdir "rmdirs_$$_test/a" "rmdirs_$$_test" 2>/dev/null
576AC_SUBST(RMDIR)
577AC_SUBST(RMDIRS)
578AC_SUBST(RMALL, ['rm -fr'])
579
580AC_MSG_CHECKING([for cd using physical directory])
581rm -fr conf$$.dir
582mkdir conf$$.dir &&
583(cd conf$$.dir && mkdir src build && cd src &&
584$as_ln_s ../build . > /dev/null 2>&1 && cd build &&
585for chdir in 'cd -P' 'PWD= cd'; do
586    /bin/sh -c "$chdir ../src && echo '$chdir' > cdcmd" 2> /dev/null && break
587done)
588if test -f conf$$.dir/src/cdcmd; then
589    read CHDIR < conf$$.dir/src/cdcmd 2> /dev/null
590else
591    CHDIR=cd
592fi
593rm -fr conf$$.dir
594AC_MSG_RESULT([$CHDIR])
595AC_SUBST(CHDIR)
596
597}
598{ # compiler section
599
600AC_DEFUN([RUBY_WERROR_FLAG], [dnl
601save_CFLAGS="$CFLAGS"
602CFLAGS="$CFLAGS $rb_cv_warnflags"
603if test "${ac_c_werror_flag+set}"; then
604  rb_c_werror_flag="$ac_c_werror_flag"
605else
606  unset rb_c_werror_flag
607fi
608ac_c_werror_flag=yes
609$1
610CFLAGS="$save_CFLAGS"
611save_CFLAGS=
612if test "${rb_c_werror_flag+set}"; then
613  ac_c_werror_flag="$rb_c_werror_flag"
614else
615  unset ac_c_werror_flag
616fi])
617
618AC_DEFUN(RUBY_TRY_CFLAGS, [
619    AC_MSG_CHECKING([whether ]$1[ is accepted as CFLAGS])
620    RUBY_WERROR_FLAG([
621    CFLAGS="[$]CFLAGS $1"
622    AC_TRY_COMPILE([$4], [$5],
623	[$2
624	AC_MSG_RESULT(yes)],
625	[$3
626	AC_MSG_RESULT(no)])
627    ])
628])
629
630AC_DEFUN(RUBY_TRY_LDFLAGS, [
631    save_LDFLAGS="$LDFLAGS"
632    LDFLAGS="[$]LDFLAGS $1"
633    AC_MSG_CHECKING([whether $1 is accepted as LDFLAGS])
634    RUBY_WERROR_FLAG([
635    AC_TRY_LINK([$4], [$5],
636	[$2
637	AC_MSG_RESULT(yes)],
638	[$3
639	AC_MSG_RESULT(no)])
640    ])
641    LDFLAGS="$save_LDFLAGS"
642    save_LDFLAGS=
643])
644
645AS_CASE([$RUBY_PATCHLEVEL], [-*],
646	[particular_werror_flags=yes], [particular_werror_flags=no])
647AC_ARG_ENABLE(werror,
648	AS_HELP_STRING([--disable-werror],
649		       [don't make warnings into errors
650		       even if a compiler support -Werror feature
651		       @<:@disabled by default unless development version@:>@]),
652	[particular_werror_flags=$enableval])
653
654rb_cv_warnflags="$warnflags"
655if test "$GCC:${warnflags+set}:no" = yes::no; then
656    for wflag in -Wno-unused-parameter -Wno-parentheses -Wno-long-long \
657		 -Wno-missing-field-initializers \
658		 -Wunused-variable \
659		 -Werror=pointer-arith \
660		 -Werror=write-strings \
661		 -Werror=declaration-after-statement \
662		 -Werror=shorten-64-to-32 \
663		 -Werror=implicit-function-declaration \
664		 ; do
665	if test "$particular_werror_flags" != yes; then
666	    wflag=`echo x$wflag | sed 's/^x-Werror=/-W/;s/^x//'`
667	fi
668	ok=no
669	RUBY_TRY_CFLAGS($wflag, [
670	    RUBY_APPEND_OPTIONS(warnflags, $wflag)
671	    ok=yes
672	])
673	AS_CASE([$ok:$wflag], [no:-Werror=*], [
674	    wflag=`echo x$wflag | sed 's/^x-Werror=/-W/'`
675	    RUBY_TRY_CFLAGS($wflag, [
676		RUBY_APPEND_OPTIONS(warnflags, $wflag)
677		particular_werror_flags=no
678	    ])
679	])
680    done
681    AS_CASE([" $warnflags "],[*" -Wno-missing-field-initializers "*], [wflag="-Wall -Wextra"],
682                             [wflag=-Wall])
683    RUBY_TRY_CFLAGS($wflag, [warnflags="$wflag${warnflags+ $warnflags}"])
684    # Disable warnflags while conftest. -Werror=* flags might make bad OS capability guess.
685    rb_cv_warnflags="$warnflags"
686    warnflags=
687fi
688if test "$GCC" = yes; then
689    test "${debugflags+set}" || {RUBY_TRY_CFLAGS(-ggdb3, [debugflags=-ggdb3])}
690    test "${debugflags+set}" || {RUBY_TRY_CFLAGS(-ggdb, [debugflags=-ggdb])}
691    test "${debugflags+set}" || {RUBY_TRY_CFLAGS(-g3, [debugflags=-g3])}
692
693    # -D_FORTIFY_SOURCE
694    RUBY_TRY_CFLAGS(-D_FORTIFY_SOURCE=2, [RUBY_APPEND_OPTION(XCFLAGS, -D_FORTIFY_SOURCE=2)])
695
696    # -fstack-protector
697    AS_CASE(["$target_os"],
698    [mingw*|nacl|haiku], [
699	stack_protector=no
700    ],
701    [
702	RUBY_TRY_CFLAGS(-fstack-protector, [stack_protector=yes], [stack_protector=no])
703	if test "x$stack_protector" = xyes; then
704	    RUBY_TRY_LDFLAGS(-fstack-protector, [], [stack_protector=broken])
705	fi
706    ])
707    if test "x$stack_protector" = xyes; then
708	RUBY_APPEND_OPTION(XCFLAGS, -fstack-protector)
709	RUBY_APPEND_OPTION(XLDFLAGS, -fstack-protector)
710	RUBY_APPEND_OPTION(LDFLAGS, -fstack-protector)
711    fi
712
713    AS_CASE(["$target_os"],[mingw*], [
714      # On  Windows  platforms,   system  provided  headers  are  VC++
715      # optimized.  That  is, C++  habits are often  contaminated into
716      # various  headers.  Most frequent  situation is  the use  of //
717      # comments.   We  bypass  ANSI   C  mode  for  them.   Otherwise
718      # extension libs cannot include those headers.
719    ],
720    [cygwin*|darwin*|netbsd*], [
721      # need lgamma_r(), finite()
722    ],
723    [haiku], [
724      # Haiku R1/alpha3 uses gcc-4.4.4 which can not handle anonymous union
725      # with ANSI standard flags. Anonumous union is required to compile
726      # socket extension where <net/if.h> uses anonymous union.
727    ],
728    [
729      # ANSI (no XCFLAGS because this is C only)
730      RUBY_TRY_CFLAGS(-ansi -std=iso9899:199409, [
731        RUBY_APPEND_OPTION(warnflags, -ansi -std=iso9899:199409)
732        RUBY_APPEND_OPTION(strict_warnflags, -ansi -std=iso9899:199409)
733      ])
734    ])
735
736    # suppress annoying -Wstrict-overflow warnings
737    RUBY_TRY_CFLAGS(-fno-strict-overflow, [RUBY_APPEND_OPTION(XCFLAGS, -fno-strict-overflow)])
738fi
739test $ac_cv_prog_cc_g = yes && : ${debugflags=-g}
740
741if test "$GCC" = ""; then
742    AS_CASE(["$target_os"],[aix*],[warnflags="$warnflags -qinfo=por" rb_cv_warnflags="$rb_cv_warnflags -qinfo=por"])
743fi
744if test "$GCC" = yes; then
745    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
746	@%:@if !(defined __GNUC__ && __GNUC__ >= 4)
747	@%:@error not GCC 4 or later
748	>>>not GCC 4 or later<<<
749	@%:@endif])],
750	[visibility_option=yes], [visibility_option=no])
751    if test "$visibility_option" = yes; then
752	RUBY_TRY_CFLAGS(-fvisibility=hidden, [visibility_option=yes], [visibility_option=no])
753    fi
754    AC_SUBST(WERRORFLAG, "-Werror")
755    if test "$visibility_option" = yes; then
756	RUBY_APPEND_OPTION(XCFLAGS, -fvisibility=hidden)
757    else
758	RUBY_TRY_LDFLAGS([-Wl,-unexported_symbol,_Init_*], [visibility_option=ld], [visibility_option=no])
759    fi
760    test "$visibility_option" = no -o "$host_os" = nacl || OBJCOPY=:
761fi
762
763if test "$GCC" = yes; then
764    # optflags
765
766    AS_CASE(["$target_os"], [mingw*], [
767	RUBY_TRY_CFLAGS(-fno-omit-frame-pointer, [optflags="${optflags+$optflags }-fno-omit-frame-pointer"])
768    ])
769
770    # disable fast-math
771    for oflag in -fno-fast-math; do
772	RUBY_TRY_CFLAGS($oflag, [RUBY_APPEND_OPTION(optflags, $oflag)])
773    done
774fi
775
776test -z "${ac_env_CFLAGS_set}" -a -n "${cflags+set}" && eval CFLAGS="\"$cflags $ARCH_FLAG\""
777test -z "${ac_env_CXXFLAGS_set}" -a -n "${cxxflags+set}" && eval CXXFLAGS="\"$cxxflags $ARCH_FLAG\""
778
779}
780{ # header and library section
781
782AC_ARG_WITH(winnt-ver,
783  AS_HELP_STRING([--with-winnt-ver=0xXXXX], [target Windows NT version (default to 0x0501)]),
784  [with_winnt_ver="$withval"], [with_winnt_ver="0x0501"])
785AS_CASE(["$target_os"],
786[mingw*], [
787  RUBY_APPEND_OPTION(CPPFLAGS, -D_WIN32_WINNT=$with_winnt_ver)
788])
789
790AS_CASE(["$target_os"],
791[freebsd*], [
792  AC_CACHE_CHECK([whether pthread should be enabled by default],
793    rb_cv_enable_pthread_default,
794    [AC_TRY_CPP([
795#include <osreldate.h>
796#if __FreeBSD_version < 502102
797#error pthread should be disabled on this platform
798#endif
799      ],
800      rb_cv_enable_pthread_default=yes,
801      rb_cv_enable_pthread_default=no)])
802  enable_pthread=$rb_cv_enable_pthread_default
803  ],
804[mingw*], [
805  enable_pthread=no
806  ],
807[
808  enable_pthread=yes
809  ])
810
811AC_ARG_ENABLE(pthread,
812       AS_HELP_STRING([--enable-pthread], [obsolete, and ignored]))
813
814dnl Checks for libraries.
815AS_CASE(["$target_os"],[*bsd*|dragonfly*],[],[ac_cv_func_daemon=no])
816
817POSTLINK=:
818AC_SUBST(POSTLINK)
819AS_CASE(["$target_os"],
820[nextstep*], [	],
821[openstep*], [	],
822[rhapsody*], [	],
823[darwin*], [	RUBY_PREPEND_OPTION(LIBS, -lobjc)
824		RUBY_APPEND_OPTIONS(CPPFLAGS, -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT)
825		AC_MSG_CHECKING(whether Mac OS X 10.5 or later)
826		AC_TRY_CPP([#include <AvailabilityMacros.h>
827		    #if MAC_OS_X_VERSION_MAX_ALLOWED <= 1040
828		    #error pre OS X 10.4
829		    [!<===== pre OS X 10.4 =====>]
830		    #endif
831		    ],
832		    [macosx_10_5=yes], [macosx_10_5=no])
833		AC_MSG_RESULT($macosx_10_5)
834		if test $macosx_10_5 = yes; then
835		    ac_cv_header_ucontext_h=no
836		else
837		    AC_DEFINE(BROKEN_SETREUID, 1)
838		    AC_DEFINE(BROKEN_SETREGID, 1)
839		fi
840		ac_cv_type_getgroups=gid_t # getgroups() on Rosetta fills garbage
841		ac_cv_lib_crypt_crypt=no
842		ac_cv_func_fdatasync=no # Mac OS X wrongly reports it has fdatasync()
843                AC_CACHE_CHECK(for broken crypt with 8bit chars, rb_cv_broken_crypt,
844                    [AC_TRY_RUN([
845#include <stdio.h>
846#include <unistd.h>
847#include <string.h>
848
849int
850main()
851{
852    int i;
853    for (i = 0; i < 128*128; i++) {
854	char salt[2], buf[256], *s;
855	salt[0] = 0x80 | (i & 0x7f);
856	salt[1] = 0x80 | (i >> 7);
857	strcpy(buf, crypt("", salt));
858	if (strcmp(buf, s = crypt("", salt))) {
859#if 0
860	    printf("%.2x%.2x: %s -> %s\n", (unsigned char)salt[0], (unsigned char)salt[1],
861		   buf+2, s+2);
862#endif
863	    return 1;
864	}
865    }
866    return 0;
867}
868],
869	            rb_cv_broken_crypt=no,
870	            rb_cv_broken_crypt=yes,
871	            rb_cv_broken_crypt=yes)])
872                if test "$rb_cv_broken_crypt" = yes; then
873                  AC_DEFINE(BROKEN_CRYPT, 1)
874                fi
875		AC_CHECK_PROGS(codesign, codesign)
876		if test -n "$codesign"; then
877		    POSTLINK="test -z '\$(RUBY_CODESIGN)' || $codesign -s '\$(RUBY_CODESIGN)' -f \$@"
878		    LINK_SO="$LINK_SO
879$POSTLINK"
880		fi
881		AC_CHECK_HEADERS(crt_externs.h, [], [], [
882		    #include <crt_externs.h>
883		])
884		],
885[hpux*], [	LIBS="-lm $LIBS"
886		ac_cv_c_inline=no],
887[beos*|haiku*], [
888		ac_cv_func_link=no
889		ac_cv_func_sched_yield=no
890		ac_cv_func_pthread_attr_setinheritsched=no
891		AS_CASE(["$target_os"],
892		[beos*], [ ac_cv_header_net_socket_h=yes],
893		[haiku*], [ ac_cv_func_shutdown=no])
894		LIBS="$LIBS" # m lib is include in root under BeOS/Haiku
895		],
896[cygwin*], [	ac_cv_header_langinfo_h=yes
897		AC_CHECK_FUNCS(cygwin_conv_path)
898		AC_LIBOBJ([langinfo])
899		],
900[mingw*], [	LIBS="-lshell32 -lws2_32 -limagehlp -lshlwapi $LIBS"
901		ac_cv_header_a_out_h=no
902		ac_cv_header_pwd_h=no
903		ac_cv_header_utime_h=no
904		ac_cv_header_sys_ioctl_h=no
905		ac_cv_header_sys_param_h=no
906		ac_cv_header_sys_resource_h=no
907		ac_cv_header_sys_select_h=no
908		ac_cv_header_sys_time_h=no
909		ac_cv_header_sys_times_h=no
910		ac_cv_header_sys_socket_h=no
911		ac_cv_func_times=yes
912		ac_cv_func_waitpid=yes
913		ac_cv_func_fsync=yes
914		ac_cv_func_seekdir=yes
915		ac_cv_func_telldir=yes
916		ac_cv_func_isinf=yes
917		ac_cv_func_isnan=yes
918		ac_cv_func_finite=yes
919		ac_cv_func_link=yes
920		ac_cv_func_fseeko=yes
921		ac_cv_lib_crypt_crypt=no
922		ac_cv_func_getpgrp_void=no
923		ac_cv_func_memcmp_working=yes
924		ac_cv_lib_dl_dlopen=no
925		rb_cv_binary_elf=no
926		rb_cv_negative_time_t=no
927		ac_cv_func_fcntl=yes
928		ac_cv_func_flock=yes
929		ac_cv_func_gmtime_r=yes
930		rb_cv_large_fd_select=yes
931		ac_cv_type_struct_timeval=yes
932		AC_LIBOBJ([langinfo])
933		],
934[os2-emx*], [	LIBS="-lm $LIBS"
935		ac_cv_lib_dir_opendir=no],
936[bsdi*], [	LIBS="-lm $LIBS"
937		AC_DEFINE(BROKEN_SETREUID, 1)
938		AC_DEFINE(BROKEN_SETREGID, 1)
939                ac_cv_sizeof_rlim_t=8],
940[freebsd*], [	LIBS="-lm $LIBS"
941		ac_cv_func_getpeername=no
942		ac_cv_func_getsockname=no
943		ac_cv_func_shutdown=no
944		ac_cv_func_close=no
945		],
946[dragonfly*], [	LIBS="-lm $LIBS"
947		# isinf() and isnan() are macros on DragonFly.
948		ac_cv_func_isinf=yes
949		ac_cv_func_isnan=yes
950		],
951[bow], [	ac_cv_func_setitimer=no
952		],
953[superux*], [	ac_cv_func_setitimer=no
954		],
955[nacl], [
956  LIBS="-lm $LIBS"
957  if test "${nacl_cv_build_variant}" = "newlib"; then
958    RUBY_APPEND_OPTION(CPPFLAGS, -DNACL_NEWLIB)
959    RUBY_APPEND_OPTION(LIBS, '-lnosys')
960  else
961    RUBY_APPEND_OPTION(XCFLAGS, -fPIC)
962  fi
963  ac_cv_func_shutdown=no
964  ac_cv_func_fcntl=no
965  ],
966[	LIBS="-lm $LIBS"])
967
968dnl Checks for header files.
969AC_HEADER_DIRENT
970dnl AC_HEADER_STDC has been checked in AC_USE_SYSTEM_EXTENSIONS
971AC_HEADER_STDBOOL
972AC_HEADER_SYS_WAIT
973AC_CHECK_HEADERS(limits.h sys/file.h sys/ioctl.h sys/syscall.h\
974		 fcntl.h sys/fcntl.h sys/select.h sys/time.h sys/times.h sys/param.h\
975		 syscall.h pwd.h grp.h a.out.h utime.h direct.h sys/resource.h \
976		 sys/mkdev.h sys/utime.h xti.h netinet/in_systm.h float.h ieeefp.h \
977		 ucontext.h intrinsics.h langinfo.h locale.h sys/sendfile.h time.h \
978		 net/socket.h sys/socket.h process.h sys/prctl.h atomic.h)
979
980dnl check for large file stuff
981mv confdefs.h confdefs1.h
982: > confdefs.h
983AC_SYS_LARGEFILE
984mv confdefs.h largefile.h
985mv confdefs1.h confdefs.h
986cat largefile.h >> confdefs.h
987
988AS_CASE(["$target_os"],[mingw*], [ac_cv_type_off_t=yes;ac_cv_sizeof_off_t=8])
989
990AC_C_BIGENDIAN
991AC_C_CONST
992AC_C_CHAR_UNSIGNED
993AC_C_INLINE
994AC_C_VOLATILE
995
996AS_CASE(":$ac_cv_c_const:$ac_cv_c_volatile:",
997    [*:no:*], [AC_MSG_ERROR(ANSI C-conforming const and volatile are mandatory)])
998
999AC_CHECK_TYPES([long long, off_t])
1000
1001AC_CACHE_CHECK([char bit], [rb_cv_char_bit],
1002    [test "$universal_binary" = yes && cross_compiling=yes
1003    AC_COMPUTE_INT([rb_cv_char_bit], [CHAR_BIT],
1004	[AC_INCLUDES_DEFAULT([@%:@include <limits.h>])], [rb_cv_char_bit=8])
1005    test "$universal_binary" = yes && cross_compiling=$real_cross_compiling])
1006
1007dnl RUBY_CHECK_SIZEOF [typename], [maybe same size types], [macros], [include]
1008AC_DEFUN([RUBY_CHECK_SIZEOF],
1009[m4_bmatch([$1], [\.], [], [if test "$universal_binary" = yes; then])
1010AC_CACHE_CHECK([size of $1], [AS_TR_SH([ac_cv_sizeof_$1])], [
1011    unset AS_TR_SH(ac_cv_sizeof_$1)
1012    rbcv_var="
1013typedef m4_bpatsubst([$1], [\..*]) ac__type_sizeof_;
1014static ac__type_sizeof_ *rbcv_ptr;
1015@%:@define AS_TR_CPP(SIZEOF_$1) sizeof((*rbcv_ptr)[]m4_bmatch([$1], [\.], .m4_bpatsubst([$1], [^[^.]*\.])))
1016"
1017    m4_ifval([$2], [test -z "${AS_TR_SH(ac_cv_sizeof_$1)+set}" && {
1018    for t in $2; do
1019	AC_COMPILE_IFELSE(
1020	    [AC_LANG_BOOL_COMPILE_TRY(AC_INCLUDES_DEFAULT([$4]
1021		[$rbcv_var]),
1022		[AS_TR_CPP(SIZEOF_$1) == sizeof($t)])], [
1023		AS_TR_SH(ac_cv_sizeof_$1)=AS_TR_CPP([SIZEOF_]$t)
1024		break])
1025    done
1026    }])
1027    unset cond
1028    m4_ifval([$3], [test -z "${AS_TR_SH(ac_cv_sizeof_$1)+set}" && {
1029    for s in 32 64 128; do
1030	for t in $3; do
1031	    cond="${cond}
1032@%:@${cond+el}if defined(__${t}${s}__) || defined(__${t}${s}) || defined(_${t}${s}) || defined(${t}${s})"
1033	    hdr="AC_INCLUDES_DEFAULT([$4
1034@%:@if defined(__${t}${s}__) || defined(__${t}${s}) || defined(_${t}${s}) || defined(${t}${s})
1035@%:@ define AS_TR_CPP(HAVE_$1) 1
1036@%:@else
1037@%:@ define AS_TR_CPP(HAVE_$1) 0
1038@%:@endif])"
1039	    AC_COMPILE_IFELSE([AC_LANG_BOOL_COMPILE_TRY([$hdr], [!AS_TR_CPP(HAVE_$1)])], [continue])
1040	    AC_COMPILE_IFELSE([AC_LANG_BOOL_COMPILE_TRY([$hdr]
1041				[$rbcv_var],
1042				[AS_TR_CPP(HAVE_$1) == (AS_TR_CPP(SIZEOF_$1) == ([$[s / rb_cv_char_bit]]))])],
1043		[AS_TR_SH(ac_cv_sizeof_$1)="${AS_TR_SH(ac_cv_sizeof_$1)+${AS_TR_SH(ac_cv_sizeof_$1)-} }${t}${s}"])
1044	done
1045    done
1046    }])
1047    m4_ifval([$2][$3],
1048	[test "${AS_TR_SH(ac_cv_sizeof_$1)@%:@SIZEOF_}" = "${AS_TR_SH(ac_cv_sizeof_$1)}" && ]){
1049    test "$universal_binary" = yes && cross_compiling=yes
1050    AC_COMPUTE_INT([t], AS_TR_CPP(SIZEOF_$1), [AC_INCLUDES_DEFAULT([$4])]
1051[${cond+$cond
1052@%:@else}
1053$rbcv_var
1054${cond+@%:@endif}
1055@%:@ifndef AS_TR_CPP(SIZEOF_$1)
1056@%:@define AS_TR_CPP(SIZEOF_$1) 0
1057@%:@endif], [t=0])
1058    test "$universal_binary" = yes && cross_compiling=$real_cross_compiling
1059    if test ${t-0} != 0; then
1060	AS_TR_SH(ac_cv_sizeof_$1)="${AS_TR_SH(ac_cv_sizeof_$1)+${AS_TR_SH(ac_cv_sizeof_$1)-} }${t}"
1061    fi
1062    }
1063    : ${AS_TR_SH(ac_cv_sizeof_$1)=0}
1064])
1065{
1066    unset cond
1067    for t in ${AS_TR_SH(ac_cv_sizeof_$1)-}; do
1068	AS_CASE(["$t"],
1069	[[[0-9]*|SIZEOF_*]], [
1070	    ${cond+echo "@%:@else"}
1071	    echo "[@%:@define ]AS_TR_CPP(SIZEOF_$1) [$t]"
1072	    break
1073	    ],
1074	[
1075	    s=`expr $t : ['.*[^0-9]\([0-9][0-9]*\)$']`
1076	    echo "@%:@${cond+el}if defined(__${t}__) || defined(__${t}) || defined(_${t}) || defined($t)"
1077	    echo "@%:@define AS_TR_CPP(SIZEOF_$1) [$[s / rb_cv_char_bit]]"
1078	    cond=1
1079	    ])
1080    done
1081    ${cond+echo "@%:@endif"}
1082} >> confdefs.h
1083m4_bmatch([$1], [\.], [], [else
1084AC_CHECK_SIZEOF([$1], 0, [$4])
1085fi])
1086])
1087
1088RUBY_CHECK_SIZEOF(int, [], [ILP])
1089RUBY_CHECK_SIZEOF(short)
1090RUBY_CHECK_SIZEOF(long, [int], [ILP LP])
1091RUBY_CHECK_SIZEOF(long long)
1092RUBY_CHECK_SIZEOF(__int64)
1093RUBY_CHECK_SIZEOF(off_t)
1094RUBY_CHECK_SIZEOF(void*, [int long "long long"], [ILP LP LLP])
1095RUBY_CHECK_SIZEOF(float)
1096RUBY_CHECK_SIZEOF(double)
1097RUBY_CHECK_SIZEOF(time_t, [long "long long"], [], [@%:@include <time.h>])
1098
1099AC_DEFUN([RUBY_CHECK_PRINTF_PREFIX], [
1100AC_CACHE_CHECK([for printf prefix for $1], [rb_cv_pri_prefix_]AS_TR_SH($1),[
1101    [rb_cv_pri_prefix_]AS_TR_SH($1)=[NONE]
1102    RUBY_WERROR_FLAG(for pri in $2; do
1103        AC_TRY_COMPILE(
1104            [@%:@include <stdio.h>
1105	    @%:@include <stddef.h>
1106            @%:@ifdef __GNUC__
1107            @%:@define PRINTF_ARGS(decl, string_index, first_to_check) \
1108              decl __attribute__((format(printf, string_index, first_to_check)))
1109            @%:@else
1110            @%:@define PRINTF_ARGS(decl, string_index, first_to_check) decl
1111            @%:@endif
1112	    PRINTF_ARGS(void test_sprintf(const char*, ...), 1, 2);],
1113            [printf("%]${pri}[d", (]$1[)42);
1114            test_sprintf("%]${pri}[d", (]$1[)42);],
1115            [rb_cv_pri_prefix_]AS_TR_SH($1)[=[$pri]; break])
1116    done)])
1117if test "[$rb_cv_pri_prefix_]AS_TR_SH($1)" != NONE; then
1118    AC_DEFINE_UNQUOTED([PRI_]m4_ifval($3,$3,AS_TR_CPP(m4_bpatsubst([$1],[_t$])))[_PREFIX],
1119        "[$rb_cv_pri_prefix_]AS_TR_SH($1)")
1120fi
1121])
1122
1123if test "x$ac_cv_type_long_long" = xyes; then
1124    RUBY_CHECK_PRINTF_PREFIX(long long, ll I64, LL)
1125elif test "x$ac_cv_type___int64" = xyes; then
1126    RUBY_CHECK_PRINTF_PREFIX(__int64, ll I64, LL)
1127fi
1128
1129dnl RUBY_REPLACE_TYPE [typename] [default type] [macro type] [included]
1130AC_DEFUN([RUBY_REPLACE_TYPE], [dnl
1131    AC_CHECK_TYPE([$1],
1132		  [n="patsubst([$1],["],[\\"])"],
1133		  [n="patsubst([$2],["],[\\"])"],
1134		  [$4])
1135    AC_CACHE_CHECK([for convertible type of [$1]], rb_cv_[$1]_convertible, [
1136	u= t=
1137	AS_CASE(["$n "],
1138	  [*" signed "*], [ ],
1139	  [*" unsigned "*], [
1140	    u=U],
1141	  [
1142	    AC_COMPILE_IFELSE(
1143		[AC_LANG_BOOL_COMPILE_TRY([AC_INCLUDES_DEFAULT([$4])], [($n)-1 > 0])],
1144		[u=U])])
1145	if test x"$t" = x; then
1146	    for t in "long long" long int short; do
1147		test -n "$u" && t="unsigned $t"
1148		AC_COMPILE_IFELSE(
1149		    [AC_LANG_BOOL_COMPILE_TRY([AC_INCLUDES_DEFAULT([$4])]
1150			[typedef $n rbcv_conftest_target_type;
1151			typedef $t rbcv_conftest_replace_type;
1152			extern rbcv_conftest_target_type rbcv_conftest_var;
1153			extern rbcv_conftest_replace_type rbcv_conftest_var;
1154			extern rbcv_conftest_target_type rbcv_conftest_func(void);
1155			extern rbcv_conftest_replace_type rbcv_conftest_func(void);
1156			], [sizeof(rbcv_conftest_target_type) == sizeof(rbcv_conftest_replace_type)])],
1157		    [n="$t"; break])
1158	    done
1159	fi
1160	AS_CASE([" $n "],
1161	  [*" long long "*], [
1162	    t=LL],
1163	  [*" long "*], [
1164	    t=LONG],
1165	  [
1166	    t=INT])
1167	rb_cv_[$1]_convertible=${u}${t}])
1168    test "${AS_TR_SH(ac_cv_type_[$1])}" = "yes" && n="$1"
1169    AC_DEFINE_UNQUOTED(rb_[$1], $n)
1170    AC_DEFINE_UNQUOTED([$3]2NUM[(v)], [${rb_cv_[$1]_convertible}2NUM(v)])
1171    AC_DEFINE_UNQUOTED(NUM2[$3][(v)], [NUM2${rb_cv_[$1]_convertible}(v)])
1172    AC_DEFINE_UNQUOTED(PRI_[$3]_PREFIX,
1173	[PRI_`echo ${rb_cv_[$1]_convertible} | sed ['s/^U//']`_PREFIX])
1174])
1175RUBY_REPLACE_TYPE(pid_t, int, PIDT)
1176RUBY_REPLACE_TYPE(uid_t, int, UIDT)
1177RUBY_REPLACE_TYPE(gid_t, int, GIDT)
1178RUBY_REPLACE_TYPE(time_t, [], TIMET, [@%:@include <time.h>])
1179RUBY_REPLACE_TYPE(dev_t, [int long "long long"], DEVT)
1180RUBY_REPLACE_TYPE(mode_t, ["unsigned int" long], MODET, [@%:@include <sys/stat.h>])
1181RUBY_REPLACE_TYPE(rlim_t, [int long "long long"], RLIM, [
1182@%:@ifdef HAVE_SYS_TYPES_H
1183@%:@include <sys/types.h>
1184@%:@endif
1185@%:@ifdef HAVE_SYS_TYPES_H
1186@%:@include <sys/time.h>
1187@%:@endif
1188@%:@include <sys/resource.h>
1189])
1190
1191AC_CACHE_CHECK(for prototypes, rb_cv_have_prototypes,
1192  [AC_TRY_COMPILE([int foo(int x) { return 0; }], [return foo(10);],
1193	rb_cv_have_prototypes=yes,
1194	rb_cv_have_prototypes=no)])
1195if test "$rb_cv_have_prototypes" = yes; then
1196  AC_DEFINE(HAVE_PROTOTYPES)
1197fi
1198
1199AC_CACHE_CHECK(token paste string, rb_cv_tokenpaste,
1200  [AC_TRY_COMPILE([@%:@define paste(a,b) a@%:@@%:@b],
1201		  [int xy = 1; return paste(x,y);],
1202		  rb_cv_tokenpaste=ansi,
1203		  rb_cv_tokenpaste=knr)])
1204if test "$rb_cv_tokenpaste" = ansi; then
1205  AC_DEFINE(TOKEN_PASTE(x,y),[x@%:@@%:@y])
1206else
1207  AC_DEFINE(TOKEN_PASTE(x,y),[x/**/y])
1208fi
1209
1210AC_CACHE_CHECK(stringization, rb_cv_stringization, [
1211  rb_cv_stringization=no
1212  for string in "#expr" '"expr"'; do
1213    AC_COMPILE_IFELSE([
1214      AC_LANG_BOOL_COMPILE_TRY([
1215#define STRINGIZE0(expr) $string
1216#define STRINGIZE(expr) STRINGIZE0(expr)
1217#undef real_test_for_stringization
1218#define test_for_stringization -.real_test_for_stringization.-
1219const char stringized[[]] = STRINGIZE(test_for_stringization);
1220], [sizeof(stringized) == 32])],
1221      [rb_cv_stringization="$string"; break],
1222      [rb_cv_stringization=no])
1223  done]
1224)
1225AC_DEFINE(STRINGIZE(expr),STRINGIZE0(expr))
1226if test x"$rb_cv_stringization" != xno -a "$rb_cv_stringization" != "#expr"; then
1227  AC_DEFINE_UNQUOTED(STRINGIZE0(expr),$rb_cv_stringization)
1228  AC_DEFINE(OLD_FASHIONED_STRINGIZATION,1)
1229fi
1230
1231AC_CACHE_CHECK([string literal concatenation],
1232  rb_cv_string_literal_concatenation, [
1233  AC_COMPILE_IFELSE([
1234    AC_LANG_BOOL_COMPILE_TRY([
1235const char concatenated_literal[[]] = "literals" "to"
1236  "be" "concatenated.";
1237], [sizeof(concatenated_literal) == 26])],
1238    [rb_cv_string_literal_concatenation=yes],
1239    [rb_cv_string_literal_concatenation=no])]
1240)
1241if test "$rb_cv_string_literal_concatenation" = no; then
1242  AC_DEFINE(NO_STRING_LITERAL_CONCATENATION,1)
1243fi
1244
1245AC_CACHE_CHECK(for variable length prototypes and stdarg.h, rb_cv_stdarg,
1246  [AC_TRY_COMPILE([
1247#include <stdarg.h>
1248int foo(int x, ...) {
1249	va_list va;
1250	va_start(va, x);
1251	va_arg(va, int);
1252	va_arg(va, char *);
1253	va_arg(va, double);
1254	return 0;
1255}
1256], [return foo(10, "", 3.14);],
1257	rb_cv_stdarg=yes,
1258	rb_cv_stdarg=no)])
1259if test "$rb_cv_stdarg" = yes; then
1260  AC_DEFINE(HAVE_STDARG_PROTOTYPES)
1261fi
1262
1263AC_CACHE_CHECK(for variable length macro, rb_cv_va_args_macro,
1264  [AC_TRY_COMPILE([
1265int foo(int x, ...);
1266@%:@define FOO(a, ...) foo(a, @%:@@%:@__VA_ARGS__)
1267], [FOO(1);FOO(1,2);FOO(1,2,3);],
1268  rb_cv_va_args_macro=yes,
1269  rb_cv_va_args_macro=no)])
1270if test "$rb_cv_va_args_macro" = yes; then
1271  AC_DEFINE(HAVE_VA_ARGS_MACRO)
1272fi
1273
1274AC_DEFUN([RUBY_DEFINE_IF], [dnl
1275    m4_ifval([$1], [AS_LITERAL_IF([$1], [], [test "X$1" = X || ])cat <<EOH >> confdefs.h
1276@%:@if $1
1277EOH
1278])dnl
1279AC_DEFINE_UNQUOTED($2, $3)dnl
1280    m4_ifval([$1], [AS_LITERAL_IF([$1], [], [test "X$1" = X || ])cat <<EOH >> confdefs.h
1281@%:@endif /* $1 */
1282EOH
1283])dnl
1284])dnl
1285
1286dnl RUBY_FUNC_ATTRIBUTE(attrib, macroname, cachevar, condition)
1287AC_DEFUN([RUBY_FUNC_ATTRIBUTE], [dnl
1288m4_ifval([$2], dnl
1289  [AS_VAR_PUSHDEF([attrib],[$2])], dnl
1290  [AS_VAR_PUSHDEF([attrib],[FUNC_]AS_TR_CPP($1))] dnl
1291)dnl
1292m4_ifval([$3], dnl
1293  [AS_VAR_PUSHDEF([rbcv],[$3])], dnl
1294  [AS_VAR_PUSHDEF([rbcv],[rb_cv_func_][$1])]dnl
1295)dnl
1296m4_ifval([$4], [rbcv_cond=["$4"]; test "$rbcv_cond" || unset rbcv_cond])
1297AC_CACHE_CHECK(for [$1] function attribute, rbcv,
1298[rbcv=x
1299RUBY_WERROR_FLAG([
1300for mac in "__attribute__ (($1)) x" "x __attribute__ (($1))" "__declspec($1) x" x; do
1301  m4_ifval([$4],mac="$mac"${rbcv_cond+" /* only if $rbcv_cond */"})
1302  AC_TRY_COMPILE(
1303    m4_ifval([$4],${rbcv_cond+[@%:@if ]$rbcv_cond})
1304[@%:@define ]attrib[(x) $mac]
1305m4_ifval([$4],${rbcv_cond+[@%:@else]}
1306${rbcv_cond+[@%:@define ]attrib[(x) x]}
1307${rbcv_cond+[@%:@endif]})
1308    attrib[(void conftest_attribute_check(void));], [],
1309    [rbcv="$mac"; break])
1310done
1311])])
1312if test "$rbcv" != x; then
1313    RUBY_DEFINE_IF(m4_ifval([$4],[${rbcv_cond}]), attrib[(x)], $rbcv)
1314fi
1315m4_ifval([$4], [unset rbcv_cond])dnl
1316AS_VAR_POPDEF([attrib])dnl
1317AS_VAR_POPDEF([rbcv])dnl
1318])
1319
1320RUBY_FUNC_ATTRIBUTE(noreturn, NORETURN)
1321RUBY_FUNC_ATTRIBUTE(deprecated, DEPRECATED)
1322RUBY_FUNC_ATTRIBUTE(noinline, NOINLINE)
1323
1324if_i386=${universal_binary+[defined __i386__]}
1325RUBY_FUNC_ATTRIBUTE(stdcall,  [], [], ${if_i386})
1326RUBY_FUNC_ATTRIBUTE(cdecl,    [], [], ${if_i386})
1327RUBY_FUNC_ATTRIBUTE(fastcall, [], [], ${if_i386})
1328
1329if test "$GCC" = yes; then
1330    AC_CACHE_CHECK([for function alias], [rb_cv_gcc_function_alias],
1331	[rb_cv_gcc_function_alias=no
1332	for a in alias weak,alias; do
1333	    AC_TRY_LINK([void foo(void) {}
1334		void bar(void) __attribute__(($a("foo")));], [bar()],
1335		[rb_cv_gcc_function_alias=$a; break])
1336	done])
1337    if test "$rb_cv_gcc_function_alias" != no; then
1338	AC_DEFINE_UNQUOTED([RUBY_ALIAS_FUNCTION_TYPE(type, prot, name, args)],
1339			   [type prot __attribute__(($rb_cv_gcc_function_alias(@%:@name)));])
1340	AC_DEFINE_UNQUOTED([RUBY_ALIAS_FUNCTION_VOID(prot, name, args)],
1341			   [RUBY_ALIAS_FUNCTION_TYPE(void, prot, name, args)])
1342    fi
1343
1344    AC_CACHE_CHECK([for __atomic builtins], [rb_cv_gcc_atomic_builtins], [
1345	AC_TRY_LINK([unsigned char atomic_var;],
1346		    [
1347			__atomic_exchange_n(&atomic_var, 0, __ATOMIC_SEQ_CST);
1348			__atomic_exchange_n(&atomic_var, 1, __ATOMIC_SEQ_CST);
1349			__atomic_fetch_add(&atomic_var, 1, __ATOMIC_SEQ_CST);
1350			__atomic_fetch_sub(&atomic_var, 1, __ATOMIC_SEQ_CST);
1351		    ],
1352		    [rb_cv_gcc_atomic_builtins=yes],
1353		    [rb_cv_gcc_atomic_builtins=no])])
1354    if test "$rb_cv_gcc_atomic_builtins" = yes; then
1355	AC_DEFINE(HAVE_GCC_ATOMIC_BUILTINS)
1356    fi
1357
1358    AC_CACHE_CHECK([for __sync builtins], [rb_cv_gcc_sync_builtins], [
1359	AC_TRY_LINK([unsigned char atomic_var;],
1360		    [
1361			__sync_lock_test_and_set(&atomic_var, 0);
1362			__sync_lock_test_and_set(&atomic_var, 1);
1363			__sync_fetch_and_add(&atomic_var, 1);
1364			__sync_fetch_and_sub(&atomic_var, 1);
1365		    ],
1366		    [rb_cv_gcc_sync_builtins=yes],
1367		    [rb_cv_gcc_sync_builtins=no])])
1368    if test "$rb_cv_gcc_sync_builtins" = yes; then
1369	AC_DEFINE(HAVE_GCC_SYNC_BUILTINS)
1370    fi
1371
1372    AC_CACHE_CHECK(for __builtin_unreachable, rb_cv_func___builtin_unreachable,
1373    [RUBY_WERROR_FLAG(
1374    [AC_TRY_LINK([@%:@include <stdlib.h>],
1375	[exit(0); __builtin_unreachable();],
1376	[rb_cv_func___builtin_unreachable=yes],
1377	[rb_cv_func___builtin_unreachable=no])
1378    ])
1379    ])
1380    if test "$rb_cv_func___builtin_unreachable" = yes; then
1381	AC_DEFINE_UNQUOTED(UNREACHABLE, [__builtin_unreachable()])
1382    fi
1383fi
1384
1385AC_CACHE_CHECK(for exported function attribute, rb_cv_func_exported, [
1386rb_cv_func_exported=no
1387RUBY_WERROR_FLAG([
1388for mac in '__attribute__ ((visibility("default")))' '__declspec(dllexport)'; do
1389  AC_TRY_COMPILE([@%:@define RUBY_FUNC_EXPORTED $mac extern
1390    RUBY_FUNC_EXPORTED void conftest_attribute_check(void);], [],
1391    [rb_cv_func_exported="$mac"; break])
1392done
1393])])
1394if test "$rb_cv_func_exported" != no; then
1395    AC_DEFINE_UNQUOTED(RUBY_FUNC_EXPORTED, [$rb_cv_func_exported extern])
1396fi
1397
1398RUBY_APPEND_OPTION(XCFLAGS, -DRUBY_EXPORT)
1399
1400dnl Check whether we need to define sys_nerr locally
1401AC_CHECK_DECLS([sys_nerr], [], [], [$ac_includes_default
1402@%:@include <errno.h>])
1403
1404AC_CHECK_LIB(crypt, crypt)
1405AC_CHECK_LIB(dl, dlopen)	# Dynamic linking for SunOS/Solaris and SYSV
1406AC_CHECK_LIB(dld, shl_load)	# Dynamic linking for HP-UX
1407AC_CHECK_LIB(socket, socketpair)	# SunOS/Solaris
1408AC_CHECK_LIB(rt, clock_gettime)	# GNU/Linux
1409
1410AS_CASE(["$target_cpu"],
1411[alpha*|sh4|sh4el|sh4eb], [AS_CASE(["$target_os"::"$GCC"],
1412		[*::yes],  # gcc
1413			[CFLAGS="-mieee $CFLAGS"],
1414		[osf*],    # ccc
1415			[CFLAGS="-ieee $CFLAGS"],
1416		)],
1417[sparc*], [AC_LIBOBJ([sparc])])
1418
1419ac_cv_header_net_socket_h=${ac_cv_header_net_socket_h=no}
1420if test "$ac_cv_header_net_socket_h" = yes; then
1421    ac_cv_header_sys_socket_h=${ac_cv_header_sys_socket_h=no}
1422else
1423    ac_cv_header_sys_socket_h=${ac_cv_header_sys_socket_h=yes}
1424fi
1425
1426
1427AC_TYPE_SIZE_T
1428RUBY_CHECK_SIZEOF(size_t, [int long void*], [], [@%:@include <sys/types.h>])
1429RUBY_CHECK_SIZEOF(ptrdiff_t, size_t, [], [@%:@include <stddef.h>])
1430RUBY_CHECK_PRINTF_PREFIX(size_t, z)
1431RUBY_CHECK_PRINTF_PREFIX(ptrdiff_t, t)
1432AC_STRUCT_ST_BLKSIZE
1433AC_STRUCT_ST_BLOCKS
1434AC_STRUCT_ST_RDEV
1435RUBY_CHECK_SIZEOF([struct stat.st_size], [int long "long long"], [], [@%:@include <sys/stat.h>])
1436if test "$ac_cv_member_struct_stat_st_blocks" = yes; then
1437    RUBY_CHECK_SIZEOF([struct stat.st_blocks], [int long "long long"], [], [@%:@include <sys/stat.h>])
1438fi
1439AC_CHECK_MEMBERS([struct stat.st_atim])
1440AC_CHECK_MEMBERS([struct stat.st_atimespec])
1441AC_CHECK_MEMBERS([struct stat.st_atimensec])
1442AC_CHECK_MEMBERS([struct stat.st_mtim])
1443AC_CHECK_MEMBERS([struct stat.st_mtimespec])
1444AC_CHECK_MEMBERS([struct stat.st_mtimensec])
1445AC_CHECK_MEMBERS([struct stat.st_ctim])
1446AC_CHECK_MEMBERS([struct stat.st_ctimespec])
1447AC_CHECK_MEMBERS([struct stat.st_ctimensec])
1448
1449AC_CHECK_TYPES([struct timeval], [], [], [@%:@ifdef HAVE_TIME_H
1450@%:@include <time.h>
1451@%:@endif
1452@%:@ifdef HAVE_SYS_TIME_H
1453@%:@include <sys/time.h>
1454@%:@endif])
1455
1456AC_CHECK_TYPES([struct timespec], [], [], [@%:@ifdef HAVE_TIME_H
1457@%:@include <time.h>
1458@%:@endif
1459@%:@ifdef HAVE_SYS_TIME_H
1460@%:@include <sys/time.h>
1461@%:@endif])
1462
1463AC_CHECK_TYPES([struct timezone], [], [], [@%:@ifdef HAVE_TIME_H
1464@%:@ include <time.h>
1465@%:@endif
1466@%:@ifdef HAVE_SYS_TIME_H
1467@%:@ include <sys/time.h>
1468@%:@endif])
1469
1470AC_CHECK_TYPES([clockid_t], [], [], [@%:@ifdef HAVE_TIME_H
1471@%:@ include <time.h>
1472@%:@endif
1473@%:@ifdef HAVE_SYS_TIME_H
1474@%:@ include <sys/time.h>
1475@%:@endif])
1476
1477AC_CACHE_VAL([rb_cv_large_fd_select],
1478    [AC_CHECK_TYPE(fd_mask, [rb_cv_large_fd_select=yes], [rb_cv_large_fd_select=no])])
1479if test "$rb_cv_large_fd_select" = yes; then
1480    AC_DEFINE(HAVE_RB_FD_INIT, 1)
1481fi
1482
1483dnl RUBY_DEFINT TYPENAME, SIZE, [SIGNED-OR-UNSIGNED], [INCLUDES = DEFAULT-INCLUDES]
1484AC_DEFUN([RUBY_DEFINT], [dnl
1485AC_CACHE_CHECK([for $1], [rb_cv_type_$1],
1486[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT([$4])
1487typedef $1 t; int s = sizeof(t) == 42;])],
1488   [rb_cv_type_$1=yes],
1489   [AS_CASE([m4_bmatch([$2], [^[1-9][0-9]*$], $2, [$ac_cv_sizeof_]AS_TR_SH($2))],
1490    ["1"], [ rb_cv_type_$1="m4_if([$3], [], [signed ], [$3 ])char"],
1491    ["$ac_cv_sizeof_short"], [ rb_cv_type_$1="m4_if([$3], [], [], [$3 ])short"],
1492    ["$ac_cv_sizeof_int"], [ rb_cv_type_$1="m4_if([$3], [], [], [$3 ])int"],
1493    ["$ac_cv_sizeof_long"], [ rb_cv_type_$1="m4_if([$3], [], [], [$3 ])long"],
1494    ["$ac_cv_sizeof_long_long"], [ rb_cv_type_$1="m4_if([$3], [], [], [$3 ])long long"],
1495    ["$ac_cv_sizeof___int64"], [ rb_cv_type_$1="m4_if([$3], [], [], [$3 ])__int64"],
1496    [ rb_cv_type_$1=no])])])
1497if test "${rb_cv_type_$1}" != no; then
1498    AC_DEFINE([HAVE_]AS_TR_CPP($1), 1)
1499    if test "${rb_cv_type_$1}" = yes; then
1500	m4_bmatch([$2], [^[1-9][0-9]*$], [AC_CHECK_SIZEOF([$1], 0, [AC_INCLUDES_DEFAULT([$4])])],
1501			[RUBY_CHECK_SIZEOF([$1], [$2], [], [AC_INCLUDES_DEFAULT([$4])])])
1502    else
1503	AC_DEFINE_UNQUOTED($1, [$rb_cv_type_$1])
1504	AC_DEFINE_UNQUOTED([SIZEOF_]AS_TR_CPP($1), [SIZEOF_]AS_TR_CPP([$rb_cv_type_$1]))
1505    fi
1506fi
1507])
1508
1509RUBY_DEFINT(int8_t, 1)
1510RUBY_DEFINT(uint8_t, 1, unsigned)
1511RUBY_DEFINT(int16_t, 2)
1512RUBY_DEFINT(uint16_t, 2, unsigned)
1513RUBY_DEFINT(int32_t, 4)
1514RUBY_DEFINT(uint32_t, 4, unsigned)
1515RUBY_DEFINT(int64_t, 8)
1516RUBY_DEFINT(uint64_t, 8, unsigned)
1517RUBY_DEFINT(int128_t, 16)
1518RUBY_DEFINT(uint128_t, 16, unsigned)
1519RUBY_DEFINT(intptr_t, void*)
1520RUBY_DEFINT(uintptr_t, void*, unsigned)
1521RUBY_DEFINT(ssize_t, size_t, [], [@%:@include <sys/types.h>])	dnl may differ from int, so not use AC_TYPE_SSIZE_T.
1522
1523RUBY_NACL_CHECK_PEPPER_TYPES
1524
1525AC_CACHE_CHECK(for stack end address, rb_cv_stack_end_address,
1526[rb_cv_stack_end_address=no
1527  AC_TRY_LINK(
1528    [extern void *__libc_stack_end;],
1529    [if (!__libc_stack_end) return 1;],
1530    [rb_cv_stack_end_address="__libc_stack_end"])
1531])
1532if test $rb_cv_stack_end_address != no; then
1533  AC_DEFINE_UNQUOTED(STACK_END_ADDRESS, $rb_cv_stack_end_address)
1534fi
1535
1536AS_CASE(["$target_os"],
1537[openbsd*], [
1538  AC_CACHE_CHECK(for heap align log on openbsd, rb_cv_page_size_log,
1539    [rb_cv_page_size_log=no
1540     for page_log in 12 13; do
1541       AC_TRY_RUN([
1542#include <math.h>
1543#include <unistd.h>
1544
1545int
1546main() {
1547  if ((int)log2((double)sysconf(_SC_PAGESIZE)) != $page_log) return 1;
1548  return 0;
1549}
1550       ],
1551       rb_cv_page_size_log="$page_log"; break)
1552     done])
1553  if test $rb_cv_page_size_log != no; then
1554    AC_DEFINE_UNQUOTED(HEAP_ALIGN_LOG, $rb_cv_page_size_log)
1555  else
1556    AC_DEFINE_UNQUOTED(HEAP_ALIGN_LOG, 12)
1557  fi
1558])
1559
1560dnl Checks for library functions.
1561AC_TYPE_GETGROUPS
1562AC_TYPE_SIGNAL
1563AS_CASE(["${target_cpu}-${target_os}:${target_archs}"],
1564[powerpc-darwin*], [
1565  AC_LIBSOURCES(alloca.c)
1566  AC_SUBST([ALLOCA], [\${LIBOBJDIR}alloca.${ac_objext}])
1567  AC_DEFINE(C_ALLOCA)
1568  AC_DEFINE_UNQUOTED(alloca, alloca)
1569  ],
1570[universal-darwin*:*ppc*], [
1571  AC_LIBSOURCES(alloca.c)
1572  AC_SUBST([ALLOCA], [\${LIBOBJDIR}alloca.${ac_objext}])
1573  RUBY_DEFINE_IF([defined __powerpc__], C_ALLOCA, 1)
1574  RUBY_DEFINE_IF([defined __powerpc__], alloca, alloca)
1575  ],
1576[
1577  AC_FUNC_ALLOCA
1578  ])
1579if test "x$ALLOCA" = "x"; then
1580    AC_CACHE_CHECK([for dynamic size alloca], rb_cv_dynamic_alloca, [
1581    for chk in ok __chkstk; do
1582	AC_TRY_LINK([
1583	    @%:@ifdef HAVE_ALLOCA_H
1584	    @%:@include <alloca.h>
1585	    @%:@endif
1586	    void $chk() {}
1587	    int dynamic_alloca_test;
1588	    int dynamic_alloca_result;],
1589	    [dynamic_alloca_result = alloca(dynamic_alloca_test) != 0;],
1590	    [rb_cv_dynamic_alloca=$chk; break])
1591    done])
1592    if test "x$rb_cv_dynamic_alloca" = "x__chkstk"; then
1593	AC_DEFINE_UNQUOTED(RUBY_ALLOCA_CHKSTK, _$rb_cv_dynamic_alloca)
1594	AS_CASE("$target_cpu",
1595	[x64|x86_64], [
1596	    AC_SUBST([ALLOCA], [\${LIBOBJDIR}x86_64-chkstk.${ac_objext}])
1597	],)
1598    fi
1599fi
1600AC_FUNC_MEMCMP
1601
1602# http://sources.redhat.com/ml/libc-hacker/2005-08/msg00008.html
1603# Debian GNU/Linux Etch's libc6.1 2.3.6.ds1-13etch5 has this problem.
1604# Debian GNU/Linux Lenny's libc6.1 2.7-10 has no problem.
1605AC_CACHE_CHECK(for broken erfc of glibc-2.3.6 on IA64, rb_cv_broken_glibc_ia64_erfc,
1606  [AC_TRY_RUN([
1607#include <math.h>
1608int
1609main()
1610{
1611   erfc(10000.0);
1612   return 0;
1613}
1614],
1615	rb_cv_broken_glibc_ia64_erfc=no,
1616	rb_cv_broken_glibc_ia64_erfc=yes,
1617	rb_cv_broken_glibc_ia64_erfc=no)])
1618AS_CASE([$rb_cv_broken_glibc_ia64_erfc],[yes],[ac_cv_func_erf=no])
1619
1620AS_CASE(["$target_os"],[freebsd*],[
1621	 AC_DEFINE(BROKEN_CLOSE)
1622	 AC_REPLACE_FUNCS(close)
1623	 ])
1624AC_REPLACE_FUNCS(dup2 memmove strerror\
1625		 strchr strstr crypt flock\
1626		 isnan finite isinf hypot acosh erf tgamma lgamma_r cbrt \
1627                 strlcpy strlcat ffs setproctitle)
1628
1629# for missing/setproctitle.c
1630AS_CASE(["$target_os"],
1631[aix* | k*bsd*-gnu | kopensolaris*-gnu | linux* | darwin*], [AC_DEFINE(SPT_TYPE,SPT_REUSEARGV)],
1632[hpux*], [AC_DEFINE(SPT_TYPE,SPT_PSTAT) ],
1633[])
1634AC_CHECK_HEADERS(sys/pstat.h)
1635
1636
1637AC_CACHE_CHECK(for signbit, rb_cv_have_signbit,
1638  [AC_TRY_LINK([
1639#include <math.h>
1640], [int v = signbit(-0.0);],
1641	rb_cv_have_signbit=yes,
1642	rb_cv_have_signbit=no)])
1643if test "$rb_cv_have_signbit" = yes; then
1644  AC_DEFINE(HAVE_SIGNBIT)
1645else
1646  AC_LIBOBJ([signbit])
1647fi
1648AC_CHECK_FUNCS(fmod killpg wait4 waitpid fork spawnv syscall __syscall chroot getcwd eaccess\
1649	      truncate ftruncate ftello chsize times utimes utimensat fcntl lockf lstat\
1650	      truncate64 ftruncate64 ftello64 fseeko fseeko64 \
1651	      link symlink readlink readdir_r fsync fdatasync fchown posix_fadvise\
1652	      setitimer setruid seteuid setreuid setresuid socketpair\
1653	      setrgid setegid setregid setresgid issetugid pause lchown lchmod\
1654	      getpgrp setpgrp getpgid setpgid initgroups getgroups setgroups\
1655	      getpriority getrlimit setrlimit sysconf close getpwnam_r getgrnam_r\
1656	      dlopen sigprocmask sigaction sigsetjmp _setjmp _longjmp\
1657	      getsid setsid telldir seekdir fchmod cosh sinh tanh log2 round llabs\
1658	      setuid setgid daemon select_large_fdset setenv unsetenv\
1659              mktime timegm gmtime_r clock_gettime gettimeofday poll ppoll\
1660              pread sendfile shutdown sigaltstack dl_iterate_phdr\
1661              dup dup3 pipe2 posix_memalign memalign ioctl)
1662
1663AC_CACHE_CHECK(for unsetenv returns a value, rb_cv_unsetenv_return_value,
1664  [AC_TRY_COMPILE([
1665#include <stdlib.h>
1666], [int v = unsetenv("foo");],
1667	rb_cv_unsetenv_return_value=yes,
1668	rb_cv_unsetenv_return_value=no)])
1669if test "$rb_cv_unsetenv_return_value" = no; then
1670  AC_DEFINE(VOID_UNSETENV)
1671fi
1672
1673AC_CACHE_CHECK(for __builtin_setjmp, ac_cv_func___builtin_setjmp,
1674[AC_TRY_LINK([@%:@include <setjmp.h>
1675    jmp_buf jb; void t(v) int v; {__builtin_longjmp(jb, v);}],
1676    [__builtin_setjmp(jb);],
1677    [ac_cv_func___builtin_setjmp=yes],
1678    [ac_cv_func___builtin_setjmp=no])
1679])
1680
1681test x$ac_cv_func__longjmp = xno && ac_cv_func__setjmp=no
1682
1683AC_MSG_CHECKING(for setjmp type)
1684AC_ARG_WITH(setjmp-type,
1685	AS_HELP_STRING([--with-setjmp-type], [select setjmp type]),
1686	[
1687	AS_CASE([$withval],
1688	[__builtin_setjmp], [ setjmp_prefix=__builtin_],
1689	[_setjmp], [ setjmp_prefix=_],
1690	[sigsetjmp], [ setjmp_prefix=sig],
1691	[setjmp], [ setjmp_prefix=],
1692	[''], [ unset setjmp_prefix],
1693	[   AC_MSG_ERROR(invalid setjmp type: $withval)])], [unset setjmp_prefix])
1694if test ${setjmp_prefix+set}; then
1695    if test "${setjmp_prefix}" && eval test '$ac_cv_func_'${setjmp_prefix}setjmp = no; then
1696	AC_MSG_ERROR(${setjmp_prefix}setjmp is not available)
1697    fi
1698elif test "$ac_cv_func___builtin_setjmp" = yes; then
1699    setjmp_prefix=__builtin_
1700elif test "$ac_cv_func__setjmp" = yes; then
1701    setjmp_prefix=_
1702elif test "$ac_cv_func_sigsetjmp" = yes; then
1703    AS_CASE([$target_os],[solaris*|cygwin*],[setjmp_prefix=],[setjmp_prefix=sig])
1704else
1705    setjmp_prefix=
1706fi
1707if test x$setjmp_prefix = xsig; then
1708    setjmp_sigmask=yes
1709else
1710    unset setjmp_sigmask
1711fi
1712AC_MSG_RESULT(${setjmp_prefix}setjmp)
1713AC_DEFINE_UNQUOTED([RUBY_SETJMP(env)], [${setjmp_prefix}setjmp(env${setjmp_sigmask+,0})])
1714AC_DEFINE_UNQUOTED([RUBY_LONGJMP(env,val)], [${setjmp_prefix}longjmp(env,val)])
1715AC_DEFINE_UNQUOTED(RUBY_JMP_BUF, ${setjmp_sigmask+${setjmp_prefix}}jmp_buf)
1716
1717AC_ARG_ENABLE(setreuid,
1718       AS_HELP_STRING([--enable-setreuid], [use setreuid()/setregid() according to need even if obsolete]),
1719       [use_setreuid=$enableval])
1720if test "$use_setreuid" = yes; then
1721    AC_DEFINE(USE_SETREUID)
1722    AC_DEFINE(USE_SETREGID)
1723fi
1724AC_STRUCT_TIMEZONE
1725AC_CACHE_CHECK(for struct tm.tm_gmtoff, rb_cv_member_struct_tm_tm_gmtoff,
1726  [AC_TRY_COMPILE([@%:@include <time.h>],
1727    [struct tm t; t.tm_gmtoff = 3600;],
1728  [rb_cv_member_struct_tm_tm_gmtoff=yes],
1729  [rb_cv_member_struct_tm_tm_gmtoff=no])])
1730if test "$rb_cv_member_struct_tm_tm_gmtoff" = yes; then
1731  AC_DEFINE(HAVE_STRUCT_TM_TM_GMTOFF)
1732fi
1733AC_CACHE_CHECK(for external int daylight, rb_cv_have_daylight,
1734  [AC_TRY_LINK([#include <time.h>
1735  int i;],
1736	[i = daylight;],
1737	rb_cv_have_daylight=yes,
1738	rb_cv_have_daylight=no)])
1739if test "$rb_cv_have_daylight" = yes; then
1740  AC_DEFINE(HAVE_DAYLIGHT)
1741fi
1742AC_DEFUN([RUBY_CHECK_VARTYPE], [dnl
1743AC_CACHE_CHECK([for external $1], AS_TR_SH(rb_cv_var_$1),
1744  [AS_TR_SH(rb_cv_var_$1)=no
1745  AC_TRY_COMPILE([
1746#ifndef _XOPEN_SOURCE
1747#define _XOPEN_SOURCE 1
1748#endif
1749$2
1750;
1751const volatile void *volatile t;],
1752    [t = &(&$1)[0];],
1753    [for t in $3; do
1754      AC_TRY_COMPILE([
1755#ifndef _XOPEN_SOURCE
1756#define _XOPEN_SOURCE 1
1757#endif
1758$2
1759;
1760extern $t $1;
1761const volatile void *volatile t;],
1762        [t = &(&$1)[0];],
1763        [AS_TR_SH(rb_cv_var_$1)=$t; break])
1764    done])])
1765if test "${AS_TR_SH(rb_cv_var_$1)}" != no; then
1766  AC_DEFINE(AS_TR_CPP(HAVE_VAR_$1))
1767  AC_DEFINE_UNQUOTED(AS_TR_CPP(TYPEOF_VAR_$1), ${AS_TR_SH(rb_cv_var_$1)})
1768fi])
1769RUBY_CHECK_VARTYPE(timezone, [@%:@include <time.h>], [long int])
1770RUBY_CHECK_VARTYPE(altzone, [@%:@include <time.h>], [long int])
1771AC_CHECK_FUNCS(timezone)
1772if test "$ac_cv_func_timezone" = yes; then
1773  AC_CACHE_CHECK([whether timezone requires zero arguments], rb_cv_func_timezone_void,
1774    [AC_TRY_COMPILE([@%:@include <time.h>],
1775      [(void)timezone(0, 0);],
1776      [rb_cv_func_timezone_void=no],
1777      [rb_cv_func_timezone_void=yes])]
1778  )
1779  if test $rb_cv_func_timezone_void = yes; then
1780    AC_DEFINE(TIMEZONE_VOID)
1781  fi
1782fi
1783
1784AC_CACHE_CHECK(for negative time_t for gmtime(3), rb_cv_negative_time_t,
1785  [AC_TRY_RUN([
1786#include <stdlib.h>
1787#include <time.h>
1788
1789void
1790check(tm, y, m, d, h, s)
1791    struct tm *tm;
1792    int y, m, d, h, s;
1793{
1794    if (!tm ||
1795	tm->tm_year != y ||
1796	tm->tm_mon  != m-1 ||
1797	tm->tm_mday != d ||
1798	tm->tm_hour != h ||
1799	tm->tm_sec  != s) {
1800	exit(1);
1801    }
1802}
1803
1804int
1805main()
1806{
1807   time_t t = -1;
1808   struct tm *tm;
1809
1810   check(gmtime(&t), 69, 12, 31, 23, 59);
1811   t = ~(time_t)0 << 31;
1812   check(gmtime(&t), 1, 12, 13, 20, 52);
1813   return 0;
1814}
1815],
1816	rb_cv_negative_time_t=yes,
1817	rb_cv_negative_time_t=no,
1818	rb_cv_negative_time_t=yes)])
1819if test "$rb_cv_negative_time_t" = yes; then
1820  AC_DEFINE(NEGATIVE_TIME_T)
1821fi
1822
1823# [ruby-dev:40910] overflow of time on FreeBSD
1824# http://www.freebsd.org/cgi/query-pr.cgi?pr=145341
1825AC_CACHE_CHECK(for localtime(3) overflow correctly, rb_cv_localtime_overflow,
1826  [AC_TRY_RUN([
1827#include <stdlib.h>
1828#include <time.h>
1829
1830void
1831check(time_t t1)
1832{
1833    struct tm *tm;
1834    time_t t2;
1835    tm = localtime(&t1);
1836    if (!tm)
1837	return; /* overflow detected.  ok. */
1838    t2 = mktime(tm);
1839    if (t1 == t2)
1840        return; /* round-trip.  ok. */
1841    exit(1);
1842}
1843
1844int
1845main()
1846{
1847    time_t t;
1848    if (~(time_t)0 <= 0) {
1849        t = (((time_t)1) << (sizeof(time_t) * 8 - 2));
1850        t |= t - 1;
1851    }
1852    else {
1853        t = ~(time_t)0;
1854    }
1855    check(t);
1856    return 0;
1857}
1858],
1859	rb_cv_localtime_overflow=yes,
1860	rb_cv_localtime_overflow=no,
1861	rb_cv_localtime_overflow=yes)])
1862if test "$rb_cv_localtime_overflow" = no; then
1863  AC_DEFINE(LOCALTIME_OVERFLOW_PROBLEM)
1864fi
1865
1866if test "$ac_cv_func_sigprocmask" = yes && test "$ac_cv_func_sigaction" = yes; then
1867   AC_DEFINE(POSIX_SIGNAL)
1868else
1869  AC_CHECK_FUNCS(sigsetmask)
1870  AC_CACHE_CHECK(for BSD signal semantics, rb_cv_bsd_signal,
1871    [AC_TRY_RUN([
1872#include <stdio.h>
1873#include <signal.h>
1874
1875void
1876sig_handler(dummy)
1877     int dummy;
1878{
1879}
1880
1881int
1882main()
1883{
1884  signal(SIGINT, sig_handler);
1885  kill(getpid(), SIGINT);
1886  kill(getpid(), SIGINT);
1887  return 0;
1888}
1889],
1890	rb_cv_bsd_signal=yes,
1891	rb_cv_bsd_signal=no,
1892	rb_cv_bsd_signal=$ac_cv_func_sigsetmask)])
1893  if test "$rb_cv_bsd_signal" = yes; then
1894    AC_DEFINE(BSD_SIGNAL)
1895  fi
1896fi
1897
1898if test "$ac_cv_func_getpgid" = no; then
1899AC_FUNC_GETPGRP
1900fi
1901if test "$ac_cv_func_setpgid:$ac_cv_func_setpgrp" = no:yes; then
1902AC_FUNC_SETPGRP
1903fi
1904
1905if test x"$target_cpu" = xia64; then
1906    AC_LIBOBJ([ia64])
1907    AC_CACHE_CHECK(for __libc_ia64_register_backing_store_base,
1908                   rb_cv___libc_ia64_register_backing_store_base,
1909    [rb_cv___libc_ia64_register_backing_store_base=no
1910    AC_TRY_LINK(
1911      [extern unsigned long __libc_ia64_register_backing_store_base;],
1912      [unsigned long p = __libc_ia64_register_backing_store_base;
1913       printf("%ld\n", p);],
1914      [rb_cv___libc_ia64_register_backing_store_base=yes])])
1915    if test $rb_cv___libc_ia64_register_backing_store_base = yes; then
1916      AC_DEFINE(HAVE___LIBC_IA64_REGISTER_BACKING_STORE_BASE)
1917    fi
1918fi
1919
1920AC_CACHE_CHECK(whether right shift preserve sign bit, rb_cv_rshift_sign,
1921    [AC_COMPILE_IFELSE([AC_LANG_BOOL_COMPILE_TRY([], [(-1==(-1>>1))])],
1922	rb_cv_rshift_sign=yes,
1923	rb_cv_rshift_sign=no)])
1924if test "$rb_cv_rshift_sign" = yes; then
1925  AC_DEFINE(RSHIFT(x,y), ((x)>>(int)(y)))
1926else
1927  AC_DEFINE(RSHIFT(x,y), (((x)<0) ? ~((~(x))>>(int)(y)) : (x)>>(int)(y)))
1928fi
1929
1930# win32.c still use this. Don't remove it.
1931test "$rb_cv_fcnt" = "not found" && rb_cv_fcnt="not found (OK if using GNU libc)"
1932AC_CACHE_CHECK([read count field in FILE structures], rb_cv_fcnt,
1933[rb_cv_fcnt="not found (OK if using GNU libc)"
1934for fcnt in	dnl
1935     _cnt	dnl
1936     __cnt	dnl
1937     _r		dnl
1938     readCount	dnl
1939     _rcount	dnl for emx0.9c
1940; do
1941    AC_TRY_COMPILE([#include <stdio.h>
1942],
1943	[FILE *f = stdin; f->$fcnt = 0;],
1944	[rb_cv_fcnt="$fcnt"; break])
1945done])
1946AS_CASE("$rb_cv_fcnt",
1947	["not found"*], [rb_cv_fcnt="not found"],
1948	[AC_DEFINE_UNQUOTED(FILE_COUNT, $rb_cv_fcnt)])
1949
1950# win32.c still use this. Don't remove it.
1951AC_CACHE_CHECK([read buffer ptr field in FILE structures], rb_cv_frptr,
1952[for frptr in	dnl
1953     _IO_read_ptr dnl
1954     _ptr	dnl
1955     __ptr	dnl
1956     bufpos	dnl
1957     _p	dnl
1958     __bufpos	dnl
1959; do
1960    AC_TRY_COMPILE([#include <stdio.h>
1961],
1962	[FILE *f = stdin; char buf[256]; f->$frptr = buf;],
1963	rb_cv_frptr="$frptr"; break,
1964	rb_cv_frptr="not found")
1965done])
1966if test "$rb_cv_frptr" != "not found"; then
1967  AC_DEFINE_UNQUOTED(FILE_READPTR, $rb_cv_frptr)
1968
1969  if test "$rb_cv_fcnt" = "not found"; then
1970    AC_CACHE_CHECK([read buffer end field in FILE structures], rb_cv_frend,
1971    [for frend in	dnl
1972         _IO_read_end	dnl
1973         bufread 	dnl
1974         __bufread 	dnl
1975    ; do
1976        AC_TRY_COMPILE([#include <stdio.h>
1977    ],
1978	[FILE *f = stdin; char buf[256]; f->$frend = buf;],
1979	rb_cv_frend="$frend"; break,
1980	rb_cv_frend="not found")
1981    done])
1982    if test "$rb_cv_frend" != "not found"; then
1983      AC_DEFINE_UNQUOTED(FILE_READEND, $rb_cv_frend)
1984    fi
1985  fi
1986fi
1987
1988RUBY_CHECK_SIZEOF([struct stat.st_ino], [long "long long"], [], [@%:@include <sys/stat.h>])
1989
1990AC_CACHE_CHECK([whether struct dirent.d_name is too small], rb_cv_sizeof_struct_dirent_too_small,
1991  [AC_COMPILE_IFELSE(
1992    [AC_LANG_BOOL_COMPILE_TRY([AC_INCLUDES_DEFAULT([
1993@%:@if defined _WIN32
1994@%:@ error <<<struct direct in win32/dir.h has variable length d_name>>>
1995@%:@elif defined HAVE_DIRENT_H
1996@%:@ include <dirent.h>
1997@%:@elif defined HAVE_DIRECT_H
1998@%:@ include <direct.h>
1999@%:@else
2000@%:@ define dirent direct
2001@%:@ if HAVE_SYS_NDIR_H
2002@%:@  include <sys/ndir.h>
2003@%:@ endif
2004@%:@ if HAVE_SYS_DIR_H
2005@%:@  include <sys/dir.h>
2006@%:@ endif
2007@%:@ if HAVE_NDIR_H
2008@%:@  include <ndir.h>
2009@%:@ endif
2010@%:@endif
2011@%:@include <stddef.h>
2012@%:@define numberof(array) [(int)(sizeof(array) / sizeof((array)[0]))]
2013struct dirent d;
2014])],
2015      [offsetof(struct dirent, [d_name[numberof(d.d_name)]]) - offsetof(struct dirent, d_name) < 256])],
2016    [rb_cv_sizeof_struct_dirent_too_small=yes],
2017    [rb_cv_sizeof_struct_dirent_too_small=no])])
2018if test "$rb_cv_sizeof_struct_dirent_too_small" = yes; then
2019  AC_DEFINE(SIZEOF_STRUCT_DIRENT_TOO_SMALL, 1)
2020fi
2021
2022if test "$ac_cv_func_sysconf" = yes; then
2023  AC_DEFUN([RUBY_CHECK_SYSCONF], [dnl
2024  AC_CACHE_CHECK([whether _SC_$1 is supported], rb_cv_have_sc_[]m4_tolower($1),
2025    [AC_TRY_COMPILE([#include <unistd.h>
2026      ],
2027      [_SC_$1 >= 0],
2028      rb_cv_have_sc_[]m4_tolower($1)=yes,
2029      rb_cv_have_sc_[]m4_tolower($1)=no)
2030    ])
2031  if test "$rb_cv_have_sc_[]m4_tolower($1)" = yes; then
2032    AC_DEFINE(HAVE__SC_$1)
2033  fi
2034  ])
2035  RUBY_CHECK_SYSCONF(CLK_TCK)
2036fi
2037
2038AC_DEFUN(RUBY_STACK_GROW_DIRECTION, [
2039    AS_VAR_PUSHDEF([stack_grow_dir], [rb_cv_stack_grow_dir_$1])
2040    AC_CACHE_CHECK(stack growing direction on $1, stack_grow_dir, [
2041AS_CASE(["$1"],
2042[m68*|x86*|x64|i?86|ia64|ppc*|sparc*|alpha*], [ $2=-1],
2043[hppa*], [ $2=+1],
2044[
2045  AC_TRY_RUN([
2046/* recurse to get rid of inlining */
2047static int
2048stack_growup_p(addr, n)
2049    volatile int *addr, n;
2050{
2051    volatile int end;
2052    if (n > 0)
2053	return *addr = stack_growup_p(addr, n - 1);
2054    else
2055	return (&end > addr);
2056}
2057int main()
2058{
2059    int x;
2060    return stack_growup_p(&x, 10);
2061}
2062], $2=-1, $2=+1, $2=0)
2063  ])
2064eval stack_grow_dir=\$$2])
2065eval $2=\$stack_grow_dir
2066AS_VAR_POPDEF([stack_grow_dir])])
2067if test "${universal_binary-no}" = yes ; then
2068    archflagpat=`eval echo '"'"${ARCH_FLAG}"'"' | sed 's/[[][|.*]]/\\&/g'`
2069    save_CFLAGS="$CFLAGS" new_cflags=`echo "$CFLAGS" | sed "s|$archflagpat"'||'`
2070    save_LDFLAGS="$LDFLAGS" new_ldflags=`echo "$LDFLAGS" | sed "s|$archflagpat"'||'`
2071    stack_dir=
2072    for archs in ${universal_archnames}; do
2073	archs=`echo $archs | sed 's/=.*//'`
2074	CFLAGS="$new_cflags -arch $archs"
2075	LDFLAGS="$new_ldflags -arch $archs"
2076	RUBY_STACK_GROW_DIRECTION($archs, dir)
2077	if test x$stack_dir = x; then
2078	    stack_dir=$dir
2079	elif test x$stack_dir != x$dir; then
2080	    stack_dir=no
2081	fi
2082    done
2083    CFLAGS="$save_CFLAGS" LDFLAGS="$save_LDFLAGS"
2084    if test x$stack_dir = xno; then
2085	for archs in ${universal_archnames}; do
2086	    archs=`echo $archs | sed 's/=.*//'`
2087	    eval dir=\$[rb_cv_stack_grow_dir_]AS_TR_SH([$archs])
2088	    RUBY_DEFINE_IF([defined __${archs}__], STACK_GROW_DIRECTION, $dir)
2089	done
2090    else
2091	AC_DEFINE_UNQUOTED(STACK_GROW_DIRECTION, $stack_dir)
2092    fi
2093else
2094    RUBY_STACK_GROW_DIRECTION($target_cpu, dir)
2095    AC_DEFINE_UNQUOTED(STACK_GROW_DIRECTION, $dir)
2096fi
2097
2098if test x"$enable_pthread" = xyes; then
2099    for pthread_lib in thr pthread pthreads c c_r root; do
2100	AC_CHECK_LIB($pthread_lib, pthread_kill,
2101		     rb_with_pthread=yes, rb_with_pthread=no)
2102	if test "$rb_with_pthread" = "yes"; then break; fi
2103    done
2104    if test x"$rb_with_pthread" = xyes; then
2105	AC_DEFINE(_REENTRANT)
2106	AC_DEFINE(_THREAD_SAFE)
2107	AC_DEFINE(HAVE_LIBPTHREAD)
2108	AC_CHECK_HEADERS(pthread_np.h, [], [], [@%:@include <pthread.h>])
2109	AS_CASE([$pthread_lib],
2110	[c],    [],
2111	[root], [],
2112	[c_r],  [MAINLIBS="-pthread $MAINLIBS"],
2113	        [AS_CASE(["$target_os"],
2114		    [openbsd*], [LIBS="-pthread $LIBS"],
2115		    [LIBS="-l$pthread_lib $LIBS"])])
2116    else
2117	AC_MSG_WARN("Don't know how to find pthread library on your system -- thread support disabled")
2118    fi
2119    AC_CHECK_FUNCS(sched_yield pthread_attr_setinheritsched \
2120	pthread_getattr_np pthread_attr_get_np pthread_attr_getstack\
2121	pthread_get_stackaddr_np pthread_get_stacksize_np \
2122	thr_stksegment pthread_stackseg_np pthread_getthrds_np \
2123	pthread_cond_init pthread_condattr_setclock pthread_condattr_init \
2124        pthread_sigmask)
2125    if test "${host_os}" = "nacl"; then
2126      ac_cv_func_pthread_attr_init=no
2127    else
2128      AC_CHECK_FUNCS(pthread_attr_init)
2129    fi
2130fi
2131if test x"$ac_cv_header_ucontext_h" = xyes; then
2132    if test x"$rb_with_pthread" = xyes; then
2133	AC_CHECK_FUNCS(getcontext setcontext)
2134    fi
2135fi
2136
2137if test "$ac_cv_func_fork" = "yes" -a "$rb_with_pthread" = "yes"; then
2138    AC_CACHE_CHECK([if fork works with pthread], rb_cv_fork_with_pthread,
2139	[AC_TRY_RUN([
2140#include <stdlib.h>
2141#include <unistd.h>
2142#include <pthread.h>
2143#include <stdio.h>
2144#include <sys/types.h>
2145#include <sys/wait.h>
2146#include <signal.h>
2147#ifndef EXIT_SUCCESS
2148#define EXIT_SUCCESS 0
2149#endif
2150#ifndef EXIT_FAILURE
2151#define EXIT_FAILURE 1
2152#endif
2153
2154void *
2155thread_func(void *dmy)
2156{
2157    return dmy;
2158}
2159
2160int
2161use_threads(void)
2162{
2163    pthread_t tid;
2164    if (pthread_create(&tid, 0, thread_func, 0) != 0) {
2165	return -1;
2166    }
2167    if (pthread_join(tid, 0) != 0) {
2168	return -1;
2169    }
2170    return 0;
2171}
2172
2173int
2174main(int argc, char *argv[])
2175{
2176    pid_t pid;
2177    if (use_threads()) return EXIT_FAILURE;
2178    pid = fork();
2179
2180    if (pid) {
2181	int loc;
2182	sleep(1);
2183	if (waitpid(pid, &loc, WNOHANG) == 0) {
2184	    kill(pid, SIGKILL);
2185	    return EXIT_FAILURE;
2186	}
2187        if (!WIFEXITED(loc) || WEXITSTATUS(loc) != EXIT_SUCCESS)
2188           return EXIT_FAILURE;
2189    }
2190    else {
2191	if (use_threads()) return EXIT_FAILURE;
2192    }
2193
2194    return EXIT_SUCCESS;
2195}],
2196	rb_cv_fork_with_pthread=yes,
2197	rb_cv_fork_with_pthread=no,
2198	rb_cv_fork_with_pthread=yes)])
2199    test x$rb_cv_fork_with_pthread = xyes || AC_DEFINE(CANNOT_FORK_WITH_PTHREAD)
2200fi
2201
2202
2203}
2204{ # runtime section
2205
2206dnl wheather use dln_a_out or not
2207AC_ARG_WITH(dln-a-out,
2208	AS_HELP_STRING([--with-dln-a-out], [use dln_a_out if possible]),
2209	[
2210	AS_CASE([$withval],
2211	[yes], [
2212	    if test "$enable_shared" = yes; then
2213		AC_MSG_ERROR(dln_a_out can not make shared library)
2214	    fi
2215	    with_dln_a_out=yes],
2216	[
2217	    with_dln_a_out=no])], [with_dln_a_out=no])
2218
2219AC_CACHE_CHECK(whether ELF binaries are produced, rb_cv_binary_elf,
2220[AC_TRY_LINK([],[], [
2221AS_CASE(["`head -1 conftest$EXEEXT | cat -e`"],
2222['^?ELF'*], [rb_cv_binary_elf=yes], [rb_cv_binary_elf=no])],
2223rb_cv_binary_elf=no)])
2224
2225if test "$rb_cv_binary_elf" = yes; then
2226  AC_DEFINE(USE_ELF)
2227  if test "$with_dln_a_out" = yes; then
2228    AC_MSG_ERROR(dln_a_out does not work with ELF)
2229  fi
2230  AC_CHECK_HEADERS([elf.h elf_abi.h])
2231  if test $ac_cv_header_elf_h = yes -o $ac_cv_header_elf_abi_h = yes; then
2232    AC_LIBOBJ([addr2line])
2233  fi
2234fi
2235
2236AS_CASE(["$target_os"],
2237[linux* | gnu* | k*bsd*-gnu | bsdi* | kopensolaris*-gnu | nacl], [
2238    if test "$rb_cv_binary_elf" = no; then
2239	with_dln_a_out=yes
2240    else
2241	LDFLAGS="$LDFLAGS -rdynamic"
2242    fi])
2243LIBEXT=a
2244
2245AC_SUBST(DLDFLAGS)dnl
2246AC_SUBST(ARCH_FLAG)dnl
2247
2248AC_SUBST(STATIC)dnl
2249AC_SUBST(CCDLFLAGS)dnl
2250AC_SUBST(LDSHARED)dnl
2251AC_SUBST(LDSHAREDXX)dnl
2252AC_SUBST(DLEXT)dnl
2253AC_SUBST(DLEXT2)dnl
2254AC_SUBST(LIBEXT)dnl
2255
2256STATIC=
2257: ${PATHFLAG=''}
2258
2259if test "$with_dln_a_out" != yes; then
2260  rb_cv_dlopen=unknown
2261  AC_MSG_CHECKING(whether OS depend dynamic link works)
2262  if test "$GCC" = yes; then
2263    AS_CASE(["$target_os"],
2264    [darwin*], [
2265      # The -fno-common is needed if we wish to embed the Ruby interpreter
2266      # into a plugin module of some project (as opposed to embedding it
2267      # within the project's application).  The -I/usr/local/include is
2268      # needed because CPP as discovered by configure (cc -E -traditional)
2269      # fails to consult /usr/local/include by default.  This causes
2270      # mkmf.rb's have_header() to fail if the desired resource happens to be
2271      # installed in the /usr/local tree.
2272      RUBY_APPEND_OPTION(CCDLFLAGS, -fno-common)],
2273    [bsdi*|beos*|haiku*|cygwin*|mingw*|aix*|interix*], [ ],
2274    [
2275      RUBY_APPEND_OPTION(CCDLFLAGS, -fPIC)])
2276  else
2277    AS_CASE(["$target_os"],
2278	[hpux*],          [CCDLFLAGS="$CCDLFLAGS +Z"],
2279	[solaris*|irix*], [CCDLFLAGS="$CCDLFLAGS -KPIC"],
2280	[sunos*],         [CCDLFLAGS="$CCDLFLAGS -PIC"],
2281	[esix*|uxpds*],   [CCDLFLAGS="$CCDLFLAGS -KPIC"],
2282	                  [: ${CCDLFLAGS=""}])
2283  fi
2284
2285
2286  AC_ARG_ENABLE(rpath,
2287       AS_HELP_STRING([--enable-rpath], [embed run path into extension libraries.
2288       enabled by default on ELF platforms]),
2289       [enable_rpath=$enableval], [enable_rpath="$rb_cv_binary_elf"])
2290  if test "$enable_rpath" = yes; then
2291    RPATHFLAG=" ${linker_flag}-R%1\$-s"
2292  fi
2293
2294  AS_CASE(["$target_os"],
2295	[hpux*], [	DLDFLAGS="$DLDFLAGS -E"
2296			: ${LDSHARED='$(LD) -b'}
2297			XLDFLAGS="$XLDFLAGS -Wl,-E"
2298			: ${LIBPATHENV=SHLIB_PATH}
2299			if test "$rb_cv_prog_gnu_ld" = no; then
2300			    RPATHFLAG=' +b %1$-s'
2301			fi
2302			rb_cv_dlopen=yes],
2303	[solaris*], [ 	if test "$GCC" = yes; then
2304			    : ${LDSHARED='$(CC) -shared'}
2305			    if test "$rb_cv_prog_gnu_ld" = yes; then
2306				LDFLAGS="$LDFLAGS -Wl,-E"
2307			    fi
2308			else
2309			    : ${LDSHARED='$(CC) -G'}
2310			fi
2311			if test "$ac_cv_sizeof_voidp" = 8; then
2312			    : ${LIBPATHENV=LD_LIBRARY_PATH_64}
2313			fi
2314			rb_cv_dlopen=yes],
2315	[sunos*], [	: ${LDSHARED='$(LD) -assert nodefinitions'}
2316			rb_cv_dlopen=yes],
2317	[irix*], [	: ${LDSHARED='$(LD) -shared'}
2318			rb_cv_dlopen=yes],
2319	[sysv4*], [	: ${LDSHARED='$(LD) -G'}
2320			rb_cv_dlopen=yes],
2321	[nto-qnx*], [	: ${LDSHARED='$(CC) -shared'}
2322			rb_cv_dlopen=yes],
2323	[esix*|uxpds*], [ : ${LDSHARED='$(LD) -G'}
2324			rb_cv_dlopen=yes],
2325	[osf*], [	: ${LDSHARED='$(LD) -shared -expect_unresolved "*"'}
2326			rb_cv_dlopen=yes],
2327	[bsdi3*], [	AS_CASE(["$CC"],
2328			[*shlicc*], [	: ${LDSHARED='$(CC) -r'}
2329					rb_cv_dlopen=yes])],
2330	[linux* | gnu* | k*bsd*-gnu | netbsd* | bsdi* | kopensolaris*-gnu], [
2331			: ${LDSHARED='$(CC) -shared'}
2332			if test "$rb_cv_binary_elf" = yes; then
2333			    LDFLAGS="$LDFLAGS -Wl,-export-dynamic"
2334			fi
2335			rb_cv_dlopen=yes],
2336	[interix*], [	: ${LDSHARED='$(CC) -shared'}
2337			XLDFLAGS="$XLDFLAGS -Wl,-E"
2338			LIBPATHFLAG=" -L%1\$-s"
2339			rb_cv_dlopen=yes],
2340	[freebsd*|dragonfly*], [
2341			: ${LDSHARED='$(CC) -shared'}
2342			if test "$rb_cv_binary_elf" = yes; then
2343			    LDFLAGS="$LDFLAGS -rdynamic"
2344			    DLDFLAGS="$DLDFLAGS "'-Wl,-soname,$@'
2345			else
2346			  test "$GCC" = yes && test "$rb_cv_prog_gnu_ld" = yes || LDSHARED='$(LD) -Bshareable'
2347			fi
2348			rb_cv_dlopen=yes],
2349	[openbsd*|mirbsd*], [	: ${LDSHARED='$(CC) -shared ${CCDLFLAGS}'}
2350			if test "$rb_cv_binary_elf" = yes; then
2351			    LDFLAGS="$LDFLAGS -Wl,-E"
2352			fi
2353			rb_cv_dlopen=yes],
2354	[darwin*], [	: ${LDSHARED='$(CC) -dynamic -bundle'}
2355			: ${DLDFLAGS="${linker_flag}-undefined${linker_flag:+,}dynamic_lookup ${linker_flag}-multiply_defined${linker_flag:+,}suppress"}
2356			: ${LDFLAGS=""}
2357			: ${LIBPATHENV=DYLD_LIBRARY_PATH}
2358			# /usr/local/include is always searched for
2359			# some reason, but /usr/local/lib is not.
2360			hdr=`find /usr/local/include -name \*.h -type f | sed 's:^/usr/local/include/::;q'`
2361			if test -n "$hdr" && $CC -E -include "$hdr" -xc - </dev/null 2>/dev/null | fgrep -q "$hdr"; then
2362			    $CC -print-search-dirs | grep -q '^libraries:.*:/usr/local/lib/*' ||
2363			    echo " $LDFLAGS " | grep -q ' -L */usr/local/lib/* ' ||
2364			    LDFLAGS="${LDFLAGS:+$LDFLAGS }-L/usr/local/lib"
2365			fi
2366			rb_cv_dlopen=yes],
2367        [aix*], [	: ${LDSHARED='$(CC)'}
2368			LDSHARED="$LDSHARED ${linker_flag}-G"
2369			EXTDLDFLAGS='-e$(TARGET_ENTRY)'
2370			XLDFLAGS="${linker_flag}"'-bE:$(ARCHFILE)'" ${linker_flag}-brtl"
2371			XLDFLAGS="$XLDFLAGS ${linker_flag}-blibpath:${prefix}/lib:${LIBPATH:-/usr/lib:/lib}"
2372			: ${ARCHFILE="ruby.imp"}
2373                        TRY_LINK='$(CC) $(LDFLAGS) -oconftest $(INCFLAGS) -I$(hdrdir) $(CPPFLAGS)'
2374                        TRY_LINK="$TRY_LINK"' $(CFLAGS) $(src) $(LIBPATH) $(LOCAL_LIBS) $(LIBS)'
2375			: ${LIBPATHENV=LIBPATH}
2376			RPATHFLAG=" ${linker_flag}-blibpath:%1\$-s:${prefix}/lib:${LIBPATH:-/usr/lib:/lib}"
2377			rb_cv_dlopen=yes],
2378	[beos*], [	AS_CASE(["$target_cpu"],
2379			  [powerpc*], [
2380			    : ${LDSHARED='$(LD) -xms'}
2381			    EXTDLDFLAGS='-export $(TARGET_ENTRY)'
2382			    DLDFLAGS="$DLDFLAGS -lbe -lroot glue-noinit.a init_term_dyn.o start_dyn.o"
2383			    LDFLAGS="$LDFLAGS -L/boot/home/config/lib -lbe -lroot"
2384			    ],
2385			  [i586*], [
2386			    : ${LDSHARED='$(LD) -shared'}
2387			    DLDFLAGS="$DLDFLAGS -L/boot/develop/lib/x86 -L/boot/home/config/lib \$(topdir)/_APP_ -lroot"
2388			    LDFLAGS="$LDFLAGS -L/boot/develop/lib/x86 -L/boot/home/config/lib -lroot"
2389			    ])
2390			: ${LIBPATHENV=LIBRARY_PATH}
2391			rb_cv_dlopen=yes],
2392	[haiku*], [	AS_CASE(["$target_cpu"],
2393			  [powerpc*], [
2394			    : ${LDSHARED='$(LD) -xms'}
2395			    EXTDLDFLAGS='-export $(TARGET_ENTRY)'
2396			    DLDFLAGS="$DLDFLAGS -lroot glue-noinit.a init_term_dyn.o start_dyn.o"
2397                            ],
2398			  [i586*], [
2399			    : ${LDSHARED='$(LD) -shared'}
2400			    DLDFLAGS="$DLDFLAGS -L/boot/develop/lib/x86 -lroot"
2401			    ])
2402			: ${LIBPATHENV=LIBRARY_PATH}
2403			rb_cv_dlopen=yes ],
2404	[nto-qnx*], [	DLDFLAGS="$DLDFLAGS -L/lib -L/usr/lib -L/usr/local/lib"
2405			: ${LDSHARED='$(LD) -Bshareable -x'}
2406			LDFLAGS="$LDFLAGS -L/lib -L/usr/lib -L/usr/local/lib"
2407			rb_cv_dlopen=yes],
2408	[cygwin*|mingw*], [
2409			: ${LDSHARED='$(CC) -shared $(if $(filter-out -g -g0,$(debugflags)),,-s)'}
2410			XLDFLAGS="$XLDFLAGS -Wl,--stack,0x00200000,--enable-auto-import"
2411			DLDFLAGS="${DLDFLAGS} -Wl,--enable-auto-image-base,--enable-auto-import"
2412			: ${LIBPATHENV=""}
2413			rb_cv_dlopen=yes],
2414	[hiuxmpp], [	: ${LDSHARED='$(LD) -r'}],
2415	[atheos*], [	: ${LDSHARED='$(CC) -shared'}
2416			rb_cv_dlopen=yes],
2417	[os2-emx*], [	LDFLAGS="$LDFLAGS -Zomf"
2418			],
2419        [nacl], [ LDSHARED='$(CC) -shared' ],
2420	[ 	: ${LDSHARED='$(LD)'}])
2421  AC_MSG_RESULT($rb_cv_dlopen)
2422fi
2423if test "${LDSHAREDXX}" = ""; then
2424    AS_CASE(["${LDSHARED}"],
2425	[*'$(CC)'*], [
2426	    LDSHAREDXX=`echo "${LDSHARED}" | sed 's/\$(CC)/$(CXX)/'`
2427	    ],
2428	[*'${CC}'*], [
2429	    LDSHAREDXX=`echo "${LDSHARED}" | sed 's/\${CC}/${CXX}/'`
2430	    ],
2431	[*$CC*], [
2432	    LDSHAREDXX=`echo "${LDSHARED}" | sed "s|$CC|$CXX|"`
2433	    ],
2434	[ld" "*], [
2435	    ])
2436fi
2437AS_CASE([${RPATHFLAG}],[*'%1$'*],[: ${LIBPATHFLAG=' -L%1$-s'}],[: ${LIBPATHFLAG=' -L%s'}])
2438
2439AC_SUBST(LINK_SO)
2440AC_SUBST(LIBPATHFLAG)
2441AC_SUBST(RPATHFLAG)
2442AC_SUBST(LIBPATHENV, "${LIBPATHENV-LD_LIBRARY_PATH}")
2443AC_SUBST(TRY_LINK)
2444
2445AC_ARG_WITH(opt-dir,
2446	AS_HELP_STRING([--with-opt-dir=DIR-LIST],
2447		       [add optional headers and libraries directories separated by $PATH_SEPARATOR]),
2448	[
2449		val=`echo "$PATH_SEPARATOR$withval" | sed "s|$PATH_SEPARATOR\([[^$PATH_SEPARATOR]*]\)| -I\1/include|g;s/^ //"`
2450		CPPFLAGS="$CPPFLAGS $val"
2451		val=`IFS="$PATH_SEPARATOR"
2452		    for dir in $withval; do
2453			echo x ${LIBPATHFLAG} ${RPATHFLAG} |
2454			sed "s/^x *//;s${IFS}"'%1\\$-s'"${IFS}${dir}/lib${IFS}g;s${IFS}%s${IFS}${dir}/lib${IFS}g"
2455		    done | tr '\012' ' '`
2456		LDFLAGS_OPTDIR="$val"
2457		LDFLAGS="$LDFLAGS${LDFLAGS:+ }$val"
2458		DLDFLAGS="$DLDFLAGS${DLDFLAGS:+ }$val"
2459	])
2460
2461AS_CASE(["$target_cpu-$target_os"],
2462[*-freebsd*|x86_64-netbsd*], [
2463    AC_CHECK_HEADERS([execinfo.h])
2464    if test "x$ac_cv_header_execinfo_h" = xyes; then
2465	AC_CHECK_LIB([execinfo], [backtrace])
2466	execinfo_frame_pointer=no
2467	RUBY_TRY_CFLAGS(-fno-omit-frame-pointer, [execinfo_frame_pointer=yes])
2468	if test "x$execinfo_frame_pointer" = xyes; then
2469	    # optflags must be manipulated very carefully.  For the
2470	    # later cflagspat/cxxflagspat substitution to work, CFLAGS
2471	    # and CXXFLAGS must start exactly with the value of
2472	    # optflags.
2473	    CFLAGS="${CFLAGS# }"; CFLAGS="${CFLAGS#"$optflags "}"
2474	    CXXFLAGS="${CXXFLAGS# }"; CXXFLAGS="${CXXFLAGS#"$optflags "}"
2475	    RUBY_APPEND_OPTION(optflags, -fno-omit-frame-pointer)
2476	    CFLAGS=" $optflags $CFLAGS"
2477	    CXXFLAGS=" $optflags $CXXFLAGS"
2478	fi
2479    fi])
2480AC_CHECK_FUNCS(backtrace)
2481
2482AC_ARG_WITH(valgrind,
2483        AS_HELP_STRING([--without-valgrind],[disable valgrind memcheck support]),
2484        [], with_valgrind=yes)
2485AS_IF([test x$with_valgrind != xno],
2486        [AC_CHECK_HEADERS(valgrind/memcheck.h)])
2487
2488dln_a_out_works=no
2489if test "$ac_cv_header_a_out_h" = yes; then
2490  if test "$with_dln_a_out" = yes || test "$rb_cv_dlopen" = unknown; then
2491    cat confdefs.h > config.h
2492    AC_CACHE_CHECK(whether matz's dln works, rb_cv_dln_a_out,
2493    [AC_TRY_COMPILE([
2494#define USE_DLN_A_OUT
2495#include "dln.c"
2496],
2497	[],
2498	rb_cv_dln_a_out=yes,
2499	rb_cv_dln_a_out=no)])
2500    if test "$rb_cv_dln_a_out" = yes; then
2501      dln_a_out_works=yes
2502      AC_DEFINE(USE_DLN_A_OUT)
2503    fi
2504  fi
2505fi
2506
2507if test "$dln_a_out_works" = yes; then
2508  if test "$GCC" = yes; then
2509    STATIC=-static
2510  else
2511    STATIC=-Bstatic
2512  fi
2513  DLEXT=so
2514  CCDLFLAGS=
2515else
2516  AS_CASE(["$target_os"],
2517    [hpux*], [
2518	DLEXT=sl],
2519    [darwin*], [
2520	RUBY_APPEND_OPTION(XLDFLAGS, [-Wl,-u,_objc_msgSend])
2521	DLEXT=bundle],
2522    [os2-emx*], [
2523	LOAD_RELATIVE=1
2524	DLEXT=dll],
2525    [cygwin*|mingw*|*djgpp*], [
2526	LOAD_RELATIVE=1
2527	DLEXT=so],
2528    [
2529	DLEXT=so])
2530fi
2531if test "$rb_cv_dlopen:$load_relative" = yes:yes; then
2532    AC_CHECK_FUNCS(dladdr)
2533    if test "$ac_cv_func_dladdr" = yes; then
2534	LOAD_RELATIVE=1
2535    fi
2536fi
2537if test x"$LOAD_RELATIVE" = x1; then
2538    load_relative=yes
2539else
2540    unset load_relative
2541fi
2542
2543len=2 # .rb
2544n=`expr "$DLEXT"  : '.*'`; test "$n" -gt "$len" && len=$n
2545n=`expr "$DLEXT2" : '.*'`; test "$n" -gt "$len" && len=$n
2546AC_DEFINE_UNQUOTED(DLEXT_MAXLEN, `expr $len + 1`)
2547test ".$DLEXT"  = "." || AC_DEFINE_UNQUOTED(DLEXT,  ".$DLEXT")
2548test ".$DLEXT2" = "." || AC_DEFINE_UNQUOTED(DLEXT2, ".$DLEXT2")
2549AC_SUBST(DLEXT)
2550
2551if test "$with_dln_a_out" = yes; then
2552  STRIP=true
2553else
2554  AC_CHECK_TOOL(STRIP, strip, :)dnl
2555fi
2556
2557AS_CASE(["$target_os"],
2558  [linux* | gnu* | k*bsd*-gnu | kopensolaris*-gnu], [
2559	STRIP="$STRIP -S -x"],
2560  [darwin*], [
2561	STRIP="$STRIP -A -n"])
2562
2563AC_ARG_WITH(ext,
2564            AC_HELP_STRING([--with-ext=EXTS],
2565                           [pass to --with-ext option of extmk.rb]))
2566AC_ARG_WITH(out-ext,
2567            AC_HELP_STRING([--with-out-ext=EXTS],
2568                           [pass to --without-ext option of extmk.rb]))
2569EXTSTATIC=
2570AC_SUBST(EXTSTATIC)dnl
2571AC_ARG_WITH(static-linked-ext,
2572	    AS_HELP_STRING([--with-static-linked-ext], [link external modules statically]),
2573            [AS_CASE([$withval],[yes],[STATIC=;EXTSTATIC=static])])
2574if test x"$EXTSTATIC" = xstatic; then
2575  ENCOBJS='enc/encinit.$(OBJEXT) enc/libenc.$(LIBEXT) enc/libtrans.$(LIBEXT)'
2576  EXTOBJS='ext/extinit.$(OBJEXT)'
2577  AC_DEFINE_UNQUOTED(EXTSTATIC, 1)
2578fi
2579AC_SUBST(ENCOBJS)
2580AC_SUBST(EXTOBJS)
2581
2582AS_CASE(["$target_os"],
2583  dnl OS/2 environment w/ Autoconf 2.1x for EMX
2584  [os2-emx], [
2585    setup=Setup.emx
2586    ],
2587  [*djgpp*], [
2588    setup=Setup.dj
2589    ],
2590  [nacl], [
2591    setup=Setup.nacl
2592    ],
2593  [
2594    setup=Setup
2595    ])
2596
2597AC_SUBST(setup)
2598
2599test x"$prefix" = xNONE && prefix=$ac_default_prefix
2600test x"${exec_prefix}" = xNONE && exec_prefix="$prefix"
2601pat=`echo "${exec_prefix}" | tr -c '\012' .`'\(.*\)'
2602for var in bindir libdir; do
2603    eval val='"$'$var'"'
2604    AS_CASE(["$val"], ["${exec_prefix}"*], [val='${exec_prefix}'"`expr \"$val\" : \"$pat\"`"])
2605    eval $var='"$val"'
2606done
2607
2608BTESTRUBY='$(MINIRUBY)'
2609if test x"$cross_compiling" = xyes; then
2610  test x"$MINIRUBY" = x && MINIRUBY="${RUBY-$BASERUBY} -I`$CHDIR .; pwd` "-r'$(arch)-fake'
2611  XRUBY_LIBDIR=`${RUBY-$BASERUBY} -rrbconfig -e ['puts RbConfig::CONFIG["libdir"]']`
2612  XRUBY_RUBYLIBDIR=`${RUBY-$BASERUBY} -rrbconfig -e ['puts RbConfig::CONFIG["rubylibdir"]']`
2613  XRUBY_RUBYHDRDIR=`${RUBY-$BASERUBY} -rrbconfig -e ['puts RbConfig::CONFIG["rubyhdrdir"]']`
2614  AC_SUBST(XRUBY_LIBDIR)
2615  AC_SUBST(XRUBY_RUBYLIBDIR)
2616  AC_SUBST(XRUBY_RUBYHDRDIR)
2617  PREP='$(arch)-fake.rb'
2618  RUNRUBY_COMMAND='$(MINIRUBY) -I`cd $(srcdir)/lib; pwd`'
2619  RUNRUBY='$(RUNRUBY_COMMAND)'
2620  XRUBY='$(MINIRUBY)'
2621  TEST_RUNNABLE=no
2622  CROSS_COMPILING=yes
2623
2624  if test "$host_os" = "nacl"; then
2625      if test "$build_cpu" = "$host_cpu" || test "${nacl_cv_cpu_nick}" = "x86" -a "$host_cpu" = "i686"; then
2626          nacl_cv_sel_ldr='`$(MINIRUBY) $(srcdir)/nacl/nacl-config.rb sel_ldr`'
2627          nacl_cv_irt_core='`$(MINIRUBY) $(srcdir)/nacl/nacl-config.rb irt_core`'
2628          nacl_cv_runnable_ld='`$(MINIRUBY) $(srcdir)/nacl/nacl-config.rb runnable_ld`'
2629          nacl_cv_host_lib='`$(MINIRUBY) $(srcdir)/nacl/nacl-config.rb host_lib`'
2630          TEST_RUNNABLE=yes
2631          BTESTRUBY="${nacl_cv_sel_ldr} -a -B ${nacl_cv_irt_core} -w 1:3 -w 2:4"
2632          BTESTRUBY="$BTESTRUBY -- ${nacl_cv_runnable_ld} --library-path ${nacl_cv_host_lib}"
2633          BTESTRUBY="$BTESTRUBY `pwd`/"'miniruby$(EXEEXT) -I`cd $(srcdir)/lib; pwd` -I.'
2634          BTESTRUBY="$BTESTRUBY"' -I$(EXTOUT)/common 3>&1 4>&2 1>/dev/null 2>/dev/null '
2635      fi
2636  fi
2637else
2638  MINIRUBY='./miniruby$(EXEEXT) -I$(srcdir)/lib -I.'
2639  MINIRUBY="$MINIRUBY"' -I$(EXTOUT)/common'
2640  PREP='miniruby$(EXEEXT)'
2641  RUNRUBY_COMMAND='$(MINIRUBY) $(srcdir)/tool/runruby.rb --extout=$(EXTOUT) $(RUNRUBYOPT)'
2642  RUNRUBY='$(RUNRUBY_COMMAND) --'
2643  XRUBY='$(RUNRUBY)'
2644  TEST_RUNNABLE=yes
2645  CROSS_COMPILING=no
2646fi
2647AC_SUBST(TEST_RUNNABLE)
2648AC_SUBST(CROSS_COMPILING)
2649AC_SUBST(MINIRUBY)
2650AC_SUBST(BTESTRUBY)
2651AC_SUBST(PREP)
2652AC_SUBST(RUNRUBY_COMMAND)
2653AC_SUBST(RUNRUBY)
2654AC_SUBST(XRUBY)
2655AC_SUBST(EXTOUT, [${EXTOUT=.ext}])
2656
2657FIRSTMAKEFILE=""
2658LIBRUBY_A='lib$(RUBY_SO_NAME)-static.a'
2659LIBRUBY='$(LIBRUBY_A)'
2660LIBRUBYARG_STATIC='-l$(RUBY_SO_NAME)-static'
2661LIBRUBYARG='$(LIBRUBYARG_STATIC)'
2662SOLIBS=
2663
2664AS_CASE(["$target_os"],
2665  [cygwin*|mingw*|beos*|haiku*|darwin*|os2-emx*], [
2666    : ${DLDLIBS=""}
2667    ],
2668  [
2669    DLDLIBS="$DLDLIBS -lc"
2670    ])
2671
2672AC_ARG_WITH(soname,
2673	AS_HELP_STRING([--with-soname=SONAME], [base name of shared library]),
2674	[RUBY_SO_NAME=$withval], [RUBY_SO_NAME='$(RUBY_BASE_NAME)'])
2675
2676LIBRUBY_LDSHARED=$LDSHARED
2677LIBRUBY_DLDFLAGS=$DLDFLAGS
2678LIBRUBY_SO='lib$(RUBY_SO_NAME).so.$(MAJOR).$(MINOR).$(TEENY)'
2679LIBRUBY_ALIASES='lib$(RUBY_SO_NAME).so'
2680ENABLE_SHARED=no
2681
2682AC_ARG_ENABLE(shared,
2683       AS_HELP_STRING([--enable-shared], [build a shared library for Ruby]),
2684       [enable_shared=$enableval])
2685libprefix='$(libdir)'
2686LIBRUBY_RELATIVE=${load_relative-no}
2687AS_CASE("$enable_shared", [yes], [
2688  LIBRUBY='$(LIBRUBY_SO)'
2689  LIBRUBYARG_SHARED='-l$(RUBY_SO_NAME)'
2690  LIBRUBYARG='$(LIBRUBYARG_SHARED)'
2691  LIBRUBY_RELATIVE=no
2692  test -z "$CCDLFLAGS" || CFLAGS="$CFLAGS $CCDLFLAGS"
2693  ENABLE_SHARED=yes
2694  if test "$rb_cv_binary_elf" = yes; then
2695    SOLIBS='$(LIBS)'
2696  fi
2697
2698  # libdir can be overridden in config.site file (on OpenSUSE at least).
2699  libdir_basename=lib
2700  if test "$bindir" = '${exec_prefix}/bin'; then
2701    AS_CASE(["$libdir"], ['${exec_prefix}/'*], [libdir_basename=`basename "$libdir"`])
2702  fi
2703  AC_DEFINE_UNQUOTED(LIBDIR_BASENAME, ["${libdir_basename}"])
2704
2705  AS_CASE(["$target_os"],
2706    [freebsd*|dragonfly*], [],
2707    [
2708     if test "$GCC" = yes; then
2709       RUBY_TRY_LDFLAGS([${linker_flag}--no-undefined], [no_undefined=yes], [no_undefined=no])
2710       if test "no_undefined" = yes; then
2711	  RUBY_APPEND_OPTION(EXTLDFLAGS, [${linker_flag}--no-undefined])
2712       fi
2713     fi
2714    ])
2715
2716  AS_CASE(["$target_os"],
2717    [sunos4*], [
2718	LIBRUBY_ALIASES='lib$(RUBY_SO_NAME).so.$(MAJOR).$(MINOR) lib$(RUBY_SO_NAME).so'
2719	],
2720    [linux* | gnu* | k*bsd*-gnu | atheos* | kopensolaris*-gnu], [
2721	LIBRUBY_DLDFLAGS='-Wl,-soname,lib$(RUBY_SO_NAME).so.$(MAJOR).$(MINOR)'" $LDFLAGS_OPTDIR"
2722	LIBRUBY_ALIASES='lib$(RUBY_SO_NAME).so.$(MAJOR).$(MINOR) lib$(RUBY_SO_NAME).so'
2723	if test "$load_relative" = yes; then
2724	    LIBRUBY_RPATHFLAGS="'-Wl,-rpath,\$\${ORIGIN}/../${libdir_basename}'"
2725	    LIBRUBY_RELATIVE=yes
2726	fi
2727	],
2728    [freebsd*|dragonfly*], [
2729	SOLIBS='$(LIBS)'
2730	LIBRUBY_SO='lib$(RUBY_SO_NAME).so.$(MAJOR)$(MINOR)'
2731	if test "$rb_cv_binary_elf" != "yes" ; then
2732	    LIBRUBY_SO="$LIBRUBY_SO.\$(TEENY)"
2733	    LIBRUBY_ALIASES=''
2734	fi
2735	],
2736    [netbsd*], [
2737	SOLIBS='$(LIBS)'
2738	LIBRUBY_SO='lib$(RUBY_SO_NAME).so.$(MAJOR)$(MINOR).$(TEENY)'
2739	LIBRUBY_DLDFLAGS='-Wl,-soname,lib$(RUBY_SO_NAME).so.$(MAJOR)$(MINOR)'" $LDFLAGS_OPTDIR"
2740	if test "$rb_cv_binary_elf" = yes; then # ELF platforms
2741	   LIBRUBY_ALIASES='lib$(RUBY_SO_NAME).so.$(MAJOR)$(MINOR) lib$(RUBY_SO_NAME).so'
2742	else	# a.out platforms
2743	   LIBRUBY_ALIASES=""
2744	fi
2745	],
2746    [openbsd*], [
2747	SOLIBS='$(LIBS)'
2748	LIBRUBY_SO='lib$(RUBY_SO_NAME).so.$(MAJOR).'`expr ${MINOR} \* 10 + ${TEENY}`
2749	],
2750    [solaris*], [
2751	SOLIBS='$(LIBS)'
2752	LIBRUBY_SO='lib$(RUBY_SO_NAME).so.$(MAJOR)'
2753	LIBRUBY_ALIASES='lib$(RUBY_SO_NAME).so.$(MAJOR).$(MINOR).$(TEENY) lib$(RUBY_SO_NAME).so'
2754	if test "$GCC" = yes; then
2755	    LIBRUBY_DLDFLAGS="$DLDFLAGS "'-Wl,-h,$(@F)'
2756	else
2757	    LIBRUBY_DLDFLAGS="$DLDFLAGS "'-h $(@F)'
2758	fi
2759	XLDFLAGS="$XLDFLAGS "'-R${libdir}'
2760	],
2761    [hpux*], [
2762	XLDFLAGS="$XLDFLAGS "'-Wl,+s,+b,$(libdir)'
2763	LIBRUBY_SO='lib$(RUBY_SO_NAME).sl.$(MAJOR).$(MINOR).$(TEENY)'
2764	LIBRUBY_ALIASES='lib$(RUBY_SO_NAME).sl.$(MAJOR).$(MINOR) lib$(RUBY_SO_NAME).sl'
2765	],
2766    [aix*], [
2767	LIBRUBY_DLDFLAGS="${linker_flag}-bnoentry $XLDFLAGS $LDFLAGS_OPTDIR"
2768	LIBRUBYARG_SHARED='-L${libdir} -l${RUBY_SO_NAME}'
2769	SOLIBS='-lm -lc'
2770	],
2771    [beos*], [
2772	AS_CASE(["$target_cpu"],
2773	[powerpc*], [
2774	    LIBRUBY_DLDFLAGS="-f ruby.exp -lnet -lbe -lroot glue-noinit.a init_term_dyn.o start_dyn.o $LDFLAGS_OPTDIR"
2775	    ])
2776	],
2777    [darwin*], [
2778	RUBY_SO_NAME="$RUBY_SO_NAME"'.$(MAJOR).$(MINOR).$(TEENY)'
2779	LIBRUBY_LDSHARED='$(CC) -dynamiclib'
2780	if test "$load_relative" = yes; then
2781	    libprefix="@executable_path/../${libdir_basename}"
2782	    LIBRUBY_RELATIVE=yes
2783	fi
2784	LIBRUBY_DLDFLAGS="$LIBRUBY_DLDFLAGS "'-install_name '${libprefix}'/$(LIBRUBY_SO)'
2785	LIBRUBY_DLDFLAGS="$LIBRUBY_DLDFLAGS "'-current_version $(MAJOR).$(MINOR).$(TEENY)'
2786	LIBRUBY_DLDFLAGS="$LIBRUBY_DLDFLAGS "'-compatibility_version $(ruby_version)'
2787	if test "$visibility_option" = ld; then
2788	    LIBRUBY_DLDFLAGS="$LIBRUBY_DLDFLAGS "'-Wl,-unexported_symbol,_Init_*'
2789	    LIBRUBY_DLDFLAGS="$LIBRUBY_DLDFLAGS "'-Wl,-unexported_symbol,*_threadptr_*'
2790	fi
2791	LIBRUBY_DLDFLAGS="$LIBRUBY_DLDFLAGS "' $(XLDFLAGS)'
2792	LIBRUBY_SO='lib$(RUBY_SO_NAME).dylib'
2793	LIBRUBY_ALIASES='lib$(RUBY_BASE_NAME).$(MAJOR).$(MINOR).dylib lib$(RUBY_INSTALL_NAME).dylib'
2794	],
2795    [interix*], [
2796	LIBRUBYARG_SHARED='-L. -L${libdir} -l$(RUBY_SO_NAME)'
2797	],
2798    [mingw*|cygwin*|mswin*], [
2799	LIBRUBY_RELATIVE=yes
2800	])
2801], [
2802  LIBRUBYARG_SHARED=
2803
2804  # enable PIE if possible
2805  pie=
2806  AS_CASE(["$target_os"],
2807  [haiku], [
2808    # gcc supports PIE, but doesn't work correctly in Haiku
2809    pie=no
2810  ],
2811  [nacl], [
2812    # -pie implies -shared for NaCl.
2813    pie=no
2814  ])
2815  if test "$GCC" = yes -a -z "$EXTSTATIC" -a "x$pie" != xno; then
2816    RUBY_TRY_CFLAGS(-fPIE, [pie=yes], [pie=no])
2817    if test "$pie" = yes; then
2818      # Use -fPIE when testing -pie.  RUBY_TRY_LDFLAGS sets
2819      # $save_CFLAGS internally, so set other name here.
2820      save_CFLAGS_before_pie="$CFLAGS"
2821      CFLAGS="$CFLAGS -fPIE"
2822
2823      # gcc need -pie but clang need -Wl,-pie.
2824      for pie in -pie -Wl,-pie; do
2825	RUBY_TRY_LDFLAGS([$pie], [], [pie=])
2826	if test "x$pie" != x; then
2827	  RUBY_APPEND_OPTION(XCFLAGS, -fPIE)
2828	  RUBY_APPEND_OPTION(XLDFLAGS, $pie)
2829	  break
2830	fi
2831      done
2832      CFLAGS="$save_CFLAGS_before_pie"
2833    fi
2834  fi
2835])
2836if test "$enable_rpath" = yes; then
2837    test -z "$LIBRUBY_RPATHFLAGS" || LIBRUBY_RPATHFLAGS="$LIBRUBY_RPATHFLAGS "
2838    LIBRUBY_RPATHFLAGS="$LIBRUBY_RPATHFLAGS${linker_flag}-R ${linker_flag}${libprefix} -L\$(libdir)"
2839    LIBRUBYARG_SHARED="$LIBRUBY_RPATHFLAGS $LIBRUBYARG_SHARED"
2840    LIBRUBYARG_STATIC="$LIBRUBY_RPATHFLAGS $LIBRUBYARG_STATIC"
2841fi
2842AC_SUBST(LIBRUBY_RELATIVE)
2843
2844LDFLAGS="-L. $LDFLAGS"
2845AC_SUBST(ARCHFILE)
2846
2847if test "$EXEEXT" = .exe; then
2848    EXECUTABLE_EXTS='".exe",".com",".cmd",".bat"'
2849    AC_DEFINE_UNQUOTED(EXECUTABLE_EXTS, $EXECUTABLE_EXTS)
2850    EXECUTABLE_EXTS=`echo $EXECUTABLE_EXTS | tr -d '"' | tr , ' '`
2851    AC_SUBST(EXECUTABLE_EXTS)
2852fi
2853
2854AC_ARG_ENABLE(dtrace,
2855        AS_HELP_STRING([--enable-dtrace],
2856        [enable DTrace for tracing inside ruby. enabled by default on systems having dtrace]),
2857        [enable_dtrace=$enableval], [enable_dtrace=auto])
2858
2859if test "${enable_dtrace}" = "auto"; then
2860    if test x"$DTRACE" != x -a x"$cross_compiling" != xyes; then
2861        RUBY_DTRACE_AVAILABLE()
2862        enable_dtrace=$rb_cv_dtrace_available
2863    else
2864        enable_dtrace=no
2865    fi
2866fi
2867
2868LIBRUBY_A_OBJS='$(OBJS)'
2869if test "${enable_dtrace}" = "yes"; then
2870    if test -z "$DTRACE"; then
2871        AC_MSG_ERROR([dtrace(1) is missing])
2872    elif test "$cross_compiling" = yes; then
2873        AC_MSG_ERROR([--enable-dtrace, however, cross compiling])
2874    else
2875        RUBY_DTRACE_AVAILABLE()
2876        enable_dtrace=$rb_cv_dtrace_available
2877        if test "${enable_dtrace}" = "no"; then
2878            AC_MSG_ERROR([--enable-dtrace, however, USDT is not available])
2879        fi
2880        RUBY_DTRACE_POSTPROCESS()
2881        if test "$rb_cv_prog_dtrace_g" = 'yes'; then
2882            DTRACE_OBJ='probes.$(OBJEXT)'
2883            DTRACE_GLOMMED_OBJ='ruby-glommed.$(OBJEXT)'
2884            LIBRUBY_A_OBJS='$(DTRACE_GLOMMED_OBJ)'
2885        fi
2886        AS_CASE("${target_os}", [freebsd*], [
2887            # FreeBSD's dtrace requires libelf
2888            LIBS="-lelf $LIBS"
2889        ])
2890    fi
2891    DTRACE_EXT=d
2892else
2893    DTRACE_EXT=dmyh
2894fi
2895AC_SUBST(DTRACE_EXT)
2896AC_SUBST(DTRACE_OBJ)
2897AC_SUBST(DTRACE_GLOMMED_OBJ)
2898AC_SUBST(LIBRUBY_A_OBJS)
2899
2900}
2901{ # build section
2902
2903dnl build rdoc index if requested
2904RDOCTARGET=""
2905CAPITARGET=""
2906AC_ARG_ENABLE(install-doc,
2907       AS_HELP_STRING([--disable-install-doc], [do not install neither rdoc indexes nor C API documents during install]),
2908       [install_doc=$enableval], [install_doc=yes])
2909AC_ARG_ENABLE(install-rdoc,
2910      AS_HELP_STRING([--disable-install-rdoc], [do not install rdoc indexes during install]),
2911      [install_rdoc=$enableval], [install_rdoc=yes])
2912AC_ARG_ENABLE(install-capi,
2913      AS_HELP_STRING([--disable-install-capi], [do not install C API documents during install]),
2914      [install_capi=$enableval], [install_capi=yes])
2915
2916if test "$install_doc" != no; then
2917    if test "$install_rdoc" != no; then
2918	RDOCTARGET="rdoc"
2919    else
2920	RDOCTARGET="nodoc"
2921    fi
2922    if test "$install_capi" != no -a -n "$DOXYGEN"; then
2923	CAPITARGET="capi"
2924    else
2925	CAPITARGET="nodoc"
2926    fi
2927else
2928    RDOCTARGET="nodoc"
2929    CAPITARGET="nodoc"
2930fi
2931
2932AC_SUBST(RDOCTARGET)
2933AC_SUBST(CAPITARGET)
2934
2935AS_CASE(["$RDOCTARGET:$CAPITARGET"],[nodoc:nodoc],[INSTALLDOC=nodoc],[INSTALLDOC=all])
2936AC_SUBST(INSTALLDOC)
2937
2938if test "$rb_with_pthread" = "yes"; then
2939    THREAD_MODEL=pthread
2940fi
2941AC_CACHE_CHECK([for prefix of external symbols], rb_cv_symbol_prefix, [
2942    AC_TRY_COMPILE([extern void conftest_external(void) {}], [], [
2943	rb_cv_symbol_prefix=`$NM conftest.$ac_objext |
2944			     sed -n ['/.*T[ 	]\([^ 	]*\)conftest_external.*/!d;s//\1/p;q']`
2945	],
2946	[rb_cv_symbol_prefix=''])
2947    test -n "$rb_cv_symbol_prefix" || rb_cv_symbol_prefix=NONE
2948])
2949SYMBOL_PREFIX="$rb_cv_symbol_prefix"
2950test "x$SYMBOL_PREFIX" = xNONE && SYMBOL_PREFIX=''
2951DLNOBJ=dln.o
2952AC_ARG_ENABLE(dln,
2953	      AC_HELP_STRING([--disable-dln], [disable dynamic link feature]),
2954	      [test "$enableval" = yes || DLNOBJ=dmydln.o])
2955AC_SUBST(DLNOBJ)
2956MINIDLNOBJ=dmydln.o
2957
2958AS_CASE(["$target_os"],
2959    [linux*], [
2960	],
2961    [netbsd*], [
2962	RUBY_APPEND_OPTION(CFLAGS, -pipe)
2963	],
2964    [darwin*], [
2965	RUBY_APPEND_OPTION(CFLAGS, -pipe)
2966	],
2967    [os2-emx], [
2968	AC_LIBOBJ([os2])
2969	CFLAGS="$CFLAGS -DOS2"
2970	LIBRUBY_A=`echo $LIBRUBY_A | sed 's/^lib//'`
2971	LIBRUBY_SO=`echo $LIBRUBY_SO | sed 's/^lib//'`
2972	LIBRUBY_ALIASES=`for i in $LIBRUBY_ALIASES; do echo "$i"; done | sed 's/^lib//'`
2973	],
2974    [osf*], [
2975	if test "$GCC" != "yes" ; then
2976	  # compile something small: taint.c is fine for this.
2977	  # the main point is the '-v' flag of 'cc'.
2978	  AS_CASE(["`cc -v -I. -c main.c -o /tmp/main.o 2>&1`"],
2979	  [*/gemc_cc*], [   # we have the new DEC GEM CC
2980                        CFLAGS="$CFLAGS -oldc"
2981                        ],
2982          [            # we have the old MIPS CC
2983                        ])
2984	  # cleanup
2985	  rm -f /tmp/main.o
2986	  CFLAGS="$CFLAGS -std"
2987	fi
2988	],
2989    [beos*], [
2990	AS_CASE(["$target_cpu"],[powerpc*], [CFLAGS="$CFLAGS -relax_pointers"])
2991	CPPFLAGS="$CPPFLAGS -I/boot/home/config/include"
2992	],
2993    [cygwin*|mingw*], [
2994	RUBY_SO_NAME="${RUBY_SO_NAME}"'$(MAJOR)$(MINOR)$(TEENY)'
2995	LIBRUBY_DLDFLAGS="${DLDFLAGS}"' -Wl,--out-implib=$(LIBRUBY)'
2996	AS_CASE(["$target_os"],
2997	[cygwin*], [
2998	    if test x"$enable_shared" = xyes; then
2999		LIBRUBY_SO='cyg$(RUBY_SO_NAME)'.dll
3000		LIBRUBY_DLDFLAGS="${LIBRUBY_DLDFLAGS}"' $(RUBYDEF)'
3001	    fi
3002	    ],
3003	[mingw*], [
3004	    RUBY_SO_NAME="${rb_cv_msvcrt}-${RUBY_SO_NAME}"
3005	    if test x"${target_cpu}" != xi386; then
3006		RUBY_SO_NAME="${target_cpu}-${RUBY_SO_NAME}"
3007	    fi
3008	    if test x"$enable_shared" = xyes; then
3009		LIBRUBY_SO='$(RUBY_SO_NAME)'.dll
3010		LIBRUBY_DLDFLAGS="${LIBRUBY_DLDFLAGS}"' $(RUBYDEF)'
3011	    fi
3012	    EXPORT_PREFIX=' '
3013	    DLDFLAGS="${DLDFLAGS}"' $(DEFFILE)'
3014	    AC_LIBOBJ([win32/win32])
3015	    AC_LIBOBJ([win32/file])
3016	    COMMON_LIBS=m
3017#	    COMMON_MACROS="WIN32_LEAN_AND_MEAN="
3018	    COMMON_HEADERS="winsock2.h windows.h"
3019	    THREAD_MODEL=win32
3020	    PLATFORM_DIR=win32
3021	    ])
3022	LIBRUBY_ALIASES=''
3023	FIRSTMAKEFILE=GNUmakefile:cygwin/GNUmakefile.in
3024	SOLIBS='$(LIBS)'
3025	if test x"$enable_shared" = xyes; then
3026	    LIBRUBY='lib$(RUBY_SO_NAME).dll.a'
3027	else
3028	    LIBRUBY_SO=dummy
3029	    LIBRUBY='lib$(RUBY_SO_NAME).a'
3030	    LIBRUBYARG='-l$(RUBY_SO_NAME)'
3031	fi
3032	],
3033    [hpux*], [
3034	AS_CASE(["$YACC"],[*yacc*], [
3035	    XCFLAGS="$XCFLAGS -DYYMAXDEPTH=300"
3036	    YACC="$YACC -Nl40000 -Nm40000"
3037	])],
3038    [nacl], [
3039	FIRSTMAKEFILE=GNUmakefile:nacl/GNUmakefile.in
3040	])
3041MINIOBJS="$MINIDLNOBJ"
3042
3043AS_CASE(["$THREAD_MODEL"],
3044[pthread], [AC_CHECK_HEADERS(pthread.h)],
3045[win32],   [],
3046[""],      [AC_MSG_ERROR(thread model is missing)],
3047           [AC_MSG_ERROR(unknown thread model $THREAD_MODEL)])
3048
3049AC_ARG_ENABLE(debug-env,
3050       AS_HELP_STRING([--enable-debug-env], [enable RUBY_DEBUG environment variable]),
3051       [AC_DEFINE(RUBY_DEBUG_ENV)])
3052
3053AS_CASE(["$FIRSTMAKEFILE"], [*GNUmakefile:*], [gnumake=yes], [
3054    AC_MSG_CHECKING([if ${MAKE-make} is GNU make])
3055    mkdir conftest.dir
3056    echo "all:; @echo yes" > conftest.dir/GNUmakefile
3057    echo "all:; @echo no" > conftest.dir/Makefile
3058    gnumake=`(cd conftest.dir; ${MAKE-make})`
3059    rm -fr conftest.dir
3060    AS_CASE(["$gnumake"],
3061    [*yes*], [
3062	echo '@%:@ -*- makefile -*-' > GNUmakefile
3063	echo 'override MFLAGS := $(filter-out -j%,$(MFLAGS))' >> GNUmakefile
3064	echo "include Makefile" >> GNUmakefile
3065	echo "-include uncommon.mk" >> GNUmakefile
3066	gnumake=yes],
3067    [
3068	gnumake=no])
3069    AC_MSG_RESULT($gnumake)
3070])
3071AS_IF([test "$gnumake" = yes], [ NULLCMD=: ], [
3072    AC_MSG_CHECKING([for safe null command for ${MAKE-make}])
3073    mkdir conftest.dir
3074    NULLCMD=
3075    for cmd in : true; do
3076	echo 'A=1' > conftest.dir/Makefile
3077	echo 'B=$(A:1=@'$cmd')' >> conftest.dir/Makefile
3078	echo 'all:; $B 1 2 3 4 5 6 7 8 9' >> conftest.dir/Makefile
3079	if (cd conftest.dir; ${MAKE-make} >/dev/null 2>/dev/null); then
3080	    NULLCMD=$cmd
3081	    break
3082	fi
3083    done
3084    rm -fr conftest.dir
3085    if test -z "$NULLCMD"; then
3086	AC_MSG_ERROR(no candidate for safe null command)
3087    fi
3088    AC_MSG_RESULT($NULLCMD)
3089])
3090AC_SUBST(NULLCMD)
3091
3092if test "${universal_binary-no}" = yes ; then
3093    AC_CACHE_CHECK([for architecture macros], rb_cv_architecture_macros, [
3094    mv confdefs.h confdefs1.h
3095    : > confdefs.h
3096    AC_TRY_COMPILE([@%:@if defined __`echo ${universal_archnames} |
3097    sed 's/=[^ ]*//g;s/ /__ || defined __/g'`__
3098@%:@else
3099@%:@error
3100>>>>>><<<<<<
3101@%:@endif], [],
3102[
3103    rb_cv_architecture_macros=yes
3104    mv -f confdefs1.h confdefs.h
3105], [
3106    rb_cv_architecture_macros=no
3107    archflagpat=`eval echo '"'"${ARCH_FLAG}"'"' | sed 's/[[][|.*]]/\\&/g'`
3108    new_cflags=`echo "$CFLAGS" | sed "s|$archflagpat"'||'`
3109    for archs in ${universal_archnames}; do
3110	cpu=${archs@%:@*=}
3111	archs=${archs%=*}
3112	CFLAGS="$new_cflags -arch $archs"
3113	archs="__${archs}__"
3114	AC_MSG_CHECKING([for macro ${archs} on ${cpu}])
3115	AC_TRY_COMPILE([@%:@ifndef ${archs}
3116@%:@error
3117@%:@endif], [], [AC_MSG_RESULT([yes])], [AC_MSG_RESULT([no])])
3118    done
3119    mv -f confdefs1.h confdefs.h
3120    AC_MSG_ERROR([failed])
3121    ])])
3122fi
3123
3124AC_CHECK_FUNC(memmem, [
3125  AC_CACHE_CHECK(for broken memmem, rb_cv_broken_memmem, [
3126    AC_TRY_RUN([
3127#include <string.h>
3128
3129int
3130main()
3131{
3132  char *str = "hogefugafoobar";
3133  char *rs = "foo";
3134  char *empty = "";
3135  char *p;
3136
3137  p = memmem(str, strlen(str), rs, strlen(rs));
3138  if (p == str+8) {
3139    p = memmem(str, strlen(str), empty, strlen(empty));
3140    if (p == str)
3141      return 0;
3142    else
3143      return 1;
3144  }
3145  else {
3146    return 1;
3147  }
3148}
3149    ],
3150    rb_cv_broken_memmem=no,
3151    rb_cv_broken_memmem=yes,
3152    rb_cv_broken_memmem=yes)
3153  ])
3154  if test "$rb_cv_broken_memmem" = no; then
3155    AC_DEFINE(HAVE_MEMMEM, 1)
3156  fi
3157])
3158
3159
3160CPPFLAGS="$CPPFLAGS "'$(DEFS)'
3161test -z "$CPPFLAGS" || CPPFLAGS="$CPPFLAGS "; CPPFLAGS="$CPPFLAGS"'${cppflags}'
3162if test -n "${cflags+set}"; then
3163    cflagspat=`eval echo '"'"${cflags}"'"' | sed 's/[[][|.*]]/\\&/g;s/^  */ /;s/^  *$/ /'`
3164    CFLAGS=`echo " $CFLAGS " | sed "s|$cflagspat"'|${cflags}|;s/^ *//;s/ *$//'`
3165fi
3166if test -n "${cxxflags+set}"; then
3167    cxxflagspat=`eval echo '"'"${cxxflags}"'"' | sed 's/[[][|.*]]/\\&/g;s/^  */ /;s/^  *$/ /'`
3168    CXXFLAGS=`echo " $CXXFLAGS " | sed "s|$cxxflagspat"'|${cxxflags}|;s/^ *//;s/ *$//'`
3169fi
3170if test "${ARCH_FLAG}"; then
3171    archflagpat=`eval echo '"'"${ARCH_FLAG}"'"' | sed 's/[[][|.*]]/\\&/g'`
3172    CFLAGS=`echo "$CFLAGS" | sed "s| *$archflagpat"'||'`
3173    CXXFLAGS=`echo "$CXXFLAGS" | sed "s| *$archflagpat"'||'`
3174    LDFLAGS=`echo "$LDFLAGS" | sed "s| *$archflagpat"'||'`
3175fi
3176warnflags="$rb_cv_warnflags"
3177AC_SUBST(cppflags, [])dnl
3178AC_SUBST(cflags, ["$orig_cflags "'${optflags} ${debugflags} ${warnflags}'])dnl
3179AC_SUBST(cxxflags, ["$orig_cxxflags "'${optflags} ${debugflags} ${warnflags}'])dnl
3180AC_SUBST(optflags)dnl
3181AC_SUBST(debugflags)dnl
3182AC_SUBST(warnflags)dnl
3183AC_SUBST(strict_warnflags)dnl
3184AC_SUBST(XCFLAGS)dnl
3185AC_SUBST(XLDFLAGS)dnl
3186AC_SUBST(EXTLDFLAGS)dnl
3187AC_SUBST(EXTDLDFLAGS)dnl
3188AC_SUBST(LIBRUBY_LDSHARED)
3189AC_SUBST(LIBRUBY_DLDFLAGS)
3190AC_SUBST(RUBY_INSTALL_NAME)
3191AC_SUBST(rubyw_install_name)
3192AC_SUBST(RUBYW_INSTALL_NAME)
3193AC_SUBST(RUBY_SO_NAME)
3194AC_SUBST(LIBRUBY_A)
3195AC_SUBST(LIBRUBY_SO)
3196AC_SUBST(LIBRUBY_ALIASES)
3197AC_SUBST(LIBRUBY)
3198AC_SUBST(LIBRUBYARG)
3199AC_SUBST(LIBRUBYARG_STATIC)
3200AC_SUBST(LIBRUBYARG_SHARED)
3201AC_SUBST(SOLIBS)
3202AC_SUBST(DLDLIBS)
3203AC_SUBST(ENABLE_SHARED)
3204AC_SUBST(MAINLIBS)
3205AC_SUBST(COMMON_LIBS)
3206AC_SUBST(COMMON_MACROS)
3207AC_SUBST(COMMON_HEADERS)
3208AC_SUBST(EXPORT_PREFIX)
3209AC_SUBST(SYMBOL_PREFIX)
3210AC_SUBST(MINIOBJS)
3211AC_SUBST(THREAD_MODEL)
3212AC_SUBST(PLATFORM_DIR)
3213
3214MAKEFILES="Makefile `echo $FIRSTMAKEFILE | sed 's/:.*//'`"
3215MAKEFILES="`echo $MAKEFILES`"
3216AC_SUBST(MAKEFILES)
3217
3218ri_prefix=
3219test "$program_prefix" != NONE &&
3220  ri_prefix=$program_prefix
3221
3222ri_suffix=
3223test "$program_suffix" != NONE &&
3224  ri_suffix=$program_suffix
3225
3226RUBY_INSTALL_NAME="${ri_prefix}"'$(RUBY_BASE_NAME)'"${ri_suffix}"
3227AS_CASE(["$target_os"],
3228  [cygwin*|mingw*], [
3229    RUBYW_INSTALL_NAME="${ri_prefix}"'$(RUBYW_BASE_NAME)'"${ri_suffix}"
3230    rubyw_install_name='$(RUBYW_INSTALL_NAME)'
3231    ])
3232
3233AC_ARG_ENABLE(multiarch,
3234	      AS_HELP_STRING([--enable-multiarch], [enable multiarch compatible directories]),
3235	      [multiarch=], [unset multiarch])
3236
3237archlibdir='${libdir}/${arch}'
3238sitearchlibdir='${libdir}/${sitearch}'
3239archincludedir='${includedir}/${arch}'
3240sitearchincludedir='${includedir}/${sitearch}'
3241
3242shvar_to_cpp() {
3243    var="$1" val="$2"
3244    exec_prefix_pat="`echo \"${exec_prefix}\" | sed 's/\\./\\\\./g'`"
3245    arch_pat="`echo \"${arch}\" | sed 's/\\./\\\\./g'`"
3246    sitearch_pat="`echo \"${sitearch}\" | sed 's/\\./\\\\./g'`"
3247    val="`echo '\"'\"${val}\"'\"' |
3248	sed \
3249	    -e 's/\${\([[A-Z][A-Z_]]*\)}/\"\1\"/g' \
3250	    -e 's|\${sitearchlibdir}|'\"${sitearchlibdir}|g\" \
3251	    -e 's|\${sitearchincludedir}|'\"${sitearchincludedir}|g\" \
3252	    -e 's|\${archlibdir}|'\"${archlibdir}|g\" \
3253	    -e 's|\${archincludedir}|'\"${archincludedir}|g\" \
3254	    -e 's|\${libdir}|'\"${libdir}|g\" \
3255	    -e 's/\${ruby_version}/\"RUBY_LIB_VERSION\"/g' \
3256	    -e 's/\${arch}/\"arch\"/g' \
3257	    -e 's/\${sitearch}/\"arch\"/g' \
3258	    -e 's/\${vendorarchdir}/\"RUBY_VENDOR_ARCH_LIB\"/g' \
3259	    -e 's/\${sitearchdir}/\"RUBY_SITE_ARCH_LIB\"/g' \
3260	    -e 's/\${vendorlibdir}/\"RUBY_VENDOR_LIB2\"/g' \
3261	    -e 's/\${sitelibdir}/\"RUBY_SITE_LIB2\"/g' \
3262	    -e 's/\${vendordir}/\"RUBY_VENDOR_LIB\"/g' \
3263	    -e 's/\${sitedir}/\"RUBY_SITE_LIB\"/g' \
3264	    -e 's/\${rubylibdir}/\"RUBY_LIB\"/g' \
3265	    -e 's/\${rubylibprefix}/\"RUBY_LIB_PREFIX\"/g' \
3266	    -e 's/\${rubyarchprefix}/\"RUBY_ARCH_PREFIX_FOR(arch)\"/g' \
3267	    -e 's/\${rubysitearchprefix}/\"RUBY_SITEARCH_PREFIX_FOR(arch)\"/g' \
3268	    -e 's/\${exec_prefix}/\"RUBY_EXEC_PREFIX\"/g' \
3269	    -e \"s|${exec_prefix_pat}/|\"'\"RUBY_EXEC_PREFIX\"/|g' \
3270	    -e \"s|${arch_pat}|\"'\"arch\"|g' \
3271	    -e \"s|${sitearch_pat}|\"'\"sitearch\"|g' \
3272	    -e 's|^\\\"NONE/|RUBY_EXEC_PREFIX\\\"/|' \
3273	    -e 's|^\\\"NONE\\\"|\\\"'\"${prefix}\"'\\\"|' \
3274	    -e 's/^\\\"\\\"\(.\)/\1/;s/\(.\)\\\"\\\"$/\1/'
3275	`"
3276    eval $var='"$val"'
3277}
3278
3279unexpand_shvar() {
3280    var=$1 n="" v="" expr=""
3281    shift
3282    test "$#" -eq 0 && return
3283    for n do
3284        eval v='"$'$n'"'
3285	v="`echo \"$v\" | sed -e ['s/${[^${}\"]*}/\"&\"/g'] -e ['s/[][$|.\\?*]/\\\\&/g']`"
3286	if test -n "$v"; then
3287	    expr=["${expr};s|"'\("[^$"]*\)'"$v|\\1\${$n}\"|g"]
3288	    AS_CASE(["$v"], [*'${'*'}'*], [expr=["$expr;s|$v|\"\${$n}\"|g"]])
3289	fi
3290    done
3291    expr=['s/${[^${}"]*}/"&"/g;'"${expr};"'s/"\(\${[^${}"]*}\)"/\1/g']
3292    eval $var='"`echo \"\\\"${'$var'}\\\"\" | sed \"$expr;s/\\\"//g\"`"'
3293}
3294
3295rubylibprefix='${libdir}/${RUBY_BASE_NAME}'
3296AC_ARG_WITH(rubylibprefix,
3297	    AS_HELP_STRING([--with-rubylibprefix=DIR], [prefix for ruby libraries [[LIBDIR/RUBY_BASE_NAME]]]),
3298	    [if test "x$withval" = xno; then
3299		AC_MSG_ERROR([No ruby, No libprefix])
3300	    fi
3301	    rubylibprefix="$withval"])
3302AC_SUBST(rubylibprefix)
3303rubylibdir='${rubylibprefix}/${ruby_version}'
3304rubyarchdir=${multiarch+'${rubyarchprefix}/${ruby_version}'}${multiarch-'${rubylibdir}/${arch}'}
3305
3306rubyarchprefix=${multiarch+'${archlibdir}/${RUBY_BASE_NAME}'}${multiarch-'${rubylibprefix}/${arch}'}
3307AC_ARG_WITH(rubyarchprefix,
3308	    AS_HELP_STRING([--with-rubyarchprefix=DIR],
3309			   [prefix for architecture dependent ruby libraries [[RUBYLIBPREFIX/ARCH]]]),
3310	    [rubyarchprefix="$withval"])
3311AC_SUBST(rubyarchprefix)
3312
3313rubysitearchprefix=${multiarch+'${sitearchlibdir}/${RUBY_BASE_NAME}'}${multiarch-'${rubylibprefix}/${sitearch}'}
3314AC_ARG_WITH(rubysitearchprefix,
3315	    AS_HELP_STRING([--with-rubysitearchprefix=DIR],
3316			   [prefix for architecture dependent site libraries [[RUBYLIBPREFIX/SITEARCH]]]),
3317	    [rubysitearchprefix="$withval"])
3318AC_SUBST(rubysitearchprefix)
3319
3320RI_BASE_NAME=`echo ${RUBY_BASE_NAME} | sed 's/ruby/ri/'`
3321ridir='${datarootdir}/${RI_BASE_NAME}'
3322AC_ARG_WITH(ridir,
3323	    AS_HELP_STRING([--with-ridir=DIR], [ri documentation [[DATAROOTDIR/ri]]]),
3324	    [ridir=$withval])
3325AC_SUBST(ridir)
3326AC_SUBST(RI_BASE_NAME)
3327
3328AC_ARG_WITH(ruby-version,
3329	    AS_HELP_STRING([--with-ruby-version=STR], [ruby version string for version specific directories [[full]] (full|minor|STR)]),
3330            [ruby_version=$withval],
3331            [ruby_version=full])
3332unset RUBY_LIB_VERSION
3333unset RUBY_LIB_VERSION_STYLE
3334AS_CASE(["$ruby_version"],
3335  [full],  [RUBY_LIB_VERSION_STYLE='3	/* full */'],
3336  [minor], [RUBY_LIB_VERSION_STYLE='2	/* minor */'])
3337if test ${RUBY_LIB_VERSION_STYLE+set}; then
3338    {
3339    echo "#define RUBY_LIB_VERSION_STYLE $RUBY_LIB_VERSION_STYLE"
3340    echo '#define STRINGIZE(x) x'
3341    test -f revision.h -o -f "${srcdir}/revision.h" || echo '#define RUBY_REVISION 0'
3342    echo '#include "verconf.h"'
3343    echo '#include "version.h"'
3344    echo 'ruby_version=RUBY_LIB_VERSION'
3345    } > conftest.c
3346    test -f verconf.h || > verconf.h
3347    ruby_version="`$CPP -I. -I"${srcdir}" -I"${srcdir}/include" conftest.c | sed '/^ruby_version=/!d;s/ //g'`"
3348    eval $ruby_version
3349else
3350    RUBY_LIB_VERSION="\"${ruby_version}\""
3351fi
3352
3353AC_ARG_WITH(sitedir,
3354	    AS_HELP_STRING([--with-sitedir=DIR], [site libraries in DIR [[RUBY_LIB_PREFIX/site_ruby]], "no" to disable site directory]),
3355            [sitedir=$withval],
3356            [sitedir='${rubylibprefix}/site_ruby'])
3357sitelibdir='${sitedir}/${ruby_version}'
3358
3359AC_ARG_WITH(sitearchdir,
3360	    AS_HELP_STRING([--with-arch-sitedir=DIR],
3361			   [architecture dependent site libraries in DIR [[SITEDIR/SITEARCH]], "no" to disable site directory]),
3362            [sitearchdir=$withval],
3363            [sitearchdir=${multiarch+'${rubysitearchprefix}/site_ruby/${ruby_version}'}${multiarch-'${sitelibdir}/${sitearch}'}])
3364
3365AC_ARG_WITH(vendordir,
3366	    AS_HELP_STRING([--with-vendordir=DIR], [vendor libraries in DIR [[RUBY_LIB_PREFIX/vendor_ruby]], "no" to disable vendor directory]),
3367            [vendordir=$withval],
3368            [vendordir='${rubylibprefix}/vendor_ruby'])
3369vendorlibdir='${vendordir}/${ruby_version}'
3370
3371AC_ARG_WITH(vendorarchdir,
3372	    AS_HELP_STRING([--with-arch-vendordir=DIR],
3373			   [architecture dependent vendor libraries in DIR [[VENDORDIR/SITEARCH]], "no" to disable vendor directory]),
3374            [vendorarchdir=$withval],
3375            [vendorarchdir=${multiarch+'${rubysitearchprefix}/vendor_ruby/${ruby_version}'}${multiarch-'${vendorlibdir}/${sitearch}'}])
3376
3377unexpand_shvar rubylibprefix       exec_prefix libdir RUBY_BASE_NAME
3378unexpand_shvar rubyarchprefix      exec_prefix libdir arch RUBY_BASE_NAME archlibdir rubylibprefix
3379unexpand_shvar rubysitearchprefix  exec_prefix libdir sitearch arch RUBY_BASE_NAME archlibdir sitearchlibdir rubylibprefix
3380if test "${LOAD_RELATIVE+set}"; then
3381    AC_DEFINE_UNQUOTED(LOAD_RELATIVE, $LOAD_RELATIVE)
3382    RUBY_EXEC_PREFIX='""'
3383else
3384    shvar_to_cpp RUBY_EXEC_PREFIX "${exec_prefix}"
3385fi
3386shvar_to_cpp RUBY_LIB_PREFIX "${rubylibprefix}"
3387shvar_to_cpp RUBY_ARCH_PREFIX_FOR "${rubyarchprefix}"
3388shvar_to_cpp RUBY_SITEARCH_PREFIX_FOR "${rubysitearchprefix}"
3389shvar_to_cpp RIDIR "${ridir}"
3390unexpand_shvar exec_prefix         prefix
3391
3392if test ${RUBY_LIB_VERSION_STYLE+set}; then
3393    AC_DEFINE_UNQUOTED(RUBY_LIB_VERSION_STYLE, $RUBY_LIB_VERSION_STYLE !<verconf>!)
3394else
3395    AC_DEFINE_UNQUOTED(RUBY_LIB_VERSION, [$RUBY_LIB_VERSION] !<verconf>!)
3396fi
3397AC_DEFINE_UNQUOTED(RUBY_EXEC_PREFIX, ${RUBY_EXEC_PREFIX})
3398AC_DEFINE_UNQUOTED(RUBY_LIB_PREFIX, ${RUBY_LIB_PREFIX} !<verconf>!)
3399AC_DEFINE_UNQUOTED(RUBY_ARCH_PREFIX_FOR(arch), ${RUBY_ARCH_PREFIX_FOR} !<verconf>!)
3400AC_DEFINE_UNQUOTED(RUBY_SITEARCH_PREFIX_FOR(arch), ${RUBY_SITEARCH_PREFIX_FOR} !<verconf>!)
3401
3402shvar_to_cpp RUBY_LIB "${rubylibdir}"
3403if test "x${RUBY_LIB}" != 'xRUBY_LIB_PREFIX"/"RUBY_LIB_VERSION'; then
3404    AC_DEFINE_UNQUOTED(RUBY_LIB, ${RUBY_LIB} !<verconf>!)
3405fi
3406shvar_to_cpp RUBY_ARCH_LIB_FOR "${rubyarchdir}"
3407AC_DEFINE_UNQUOTED(RUBY_ARCH_LIB_FOR(arch), ${RUBY_ARCH_LIB_FOR} !<verconf>!)
3408if test "x$sitedir" = xno; then
3409    AC_DEFINE(NO_RUBY_SITE_LIB, [] !<verconf>!)
3410else
3411    shvar_to_cpp RUBY_SITE_LIB "${sitedir}"
3412    AC_DEFINE_UNQUOTED(RUBY_SITE_LIB, ${RUBY_SITE_LIB} !<verconf>!)
3413    shvar_to_cpp RUBY_SITE_ARCH_LIB_FOR "${sitearchdir}"
3414    AC_DEFINE_UNQUOTED(RUBY_SITE_ARCH_LIB_FOR(arch), ${RUBY_SITE_ARCH_LIB_FOR} !<verconf>!)
3415fi
3416if test "x$vendordir" = xno; then
3417    AC_DEFINE(NO_RUBY_VENDOR_LIB, [] !<verconf>!)
3418else
3419    shvar_to_cpp RUBY_VENDOR_LIB "${vendordir}"
3420    AC_DEFINE_UNQUOTED(RUBY_VENDOR_LIB, ${RUBY_VENDOR_LIB} !<verconf>!)
3421    shvar_to_cpp RUBY_VENDOR_ARCH_LIB_FOR "${vendorarchdir}"
3422    AC_DEFINE_UNQUOTED(RUBY_VENDOR_ARCH_LIB_FOR(arch), ${RUBY_VENDOR_ARCH_LIB_FOR} !<verconf>!)
3423fi
3424
3425AC_SUBST(archlibdir)dnl
3426AC_SUBST(sitearchlibdir)dnl
3427AC_SUBST(archincludedir)dnl
3428AC_SUBST(sitearchincludedir)dnl
3429AC_SUBST(arch)dnl
3430AC_SUBST(sitearch)dnl
3431AC_SUBST(ruby_version)dnl
3432AC_SUBST(rubylibdir)dnl
3433AC_SUBST(rubyarchdir)dnl
3434AC_SUBST(sitedir)dnl
3435AC_SUBST(sitelibdir)dnl
3436AC_SUBST(sitearchdir)dnl
3437AC_SUBST(vendordir)dnl
3438AC_SUBST(vendorlibdir)dnl
3439AC_SUBST(vendorarchdir)dnl
3440
3441configure_args=$ac_configure_args
3442AC_SUBST(configure_args)dnl
3443
3444if test "${universal_binary-no}" = yes ; then
3445    arch="universal-${target_os}"
3446    AC_CACHE_CHECK(whether __ARCHITECTURE__ is available, rb_cv_architecture_available,
3447	AC_TRY_COMPILE([const char arch[] = __ARCHITECTURE__;], [puts(arch);],
3448	     [rb_cv_architecture_available=yes], [rb_cv_architecture_available=no]))
3449    if test "${rb_cv_architecture_available}" = yes; then
3450	AC_DEFINE_UNQUOTED(RUBY_PLATFORM_CPU, __ARCHITECTURE__ !<verconf>!)
3451    else
3452	for archs in ${universal_archnames}; do
3453	    cpu=`echo $archs | sed 's/.*=//'`
3454	    archs=`echo $archs | sed 's/=.*//'`
3455	    RUBY_DEFINE_IF([defined __${archs}__], RUBY_PLATFORM_CPU, ["${cpu}"])
3456	done
3457    fi
3458    ints='long int short'
3459    test "$ac_cv_type_long_long" = yes && ints="'long long' $ints"
3460    AC_SUBST(UNIVERSAL_ARCHNAMES, "${universal_archnames}")
3461    AC_SUBST(UNIVERSAL_INTS, "${ints}")
3462    AC_DEFINE_UNQUOTED(RUBY_PLATFORM_OS, "${target_os}" !<verconf>!)
3463    AC_DEFINE_UNQUOTED(RUBY_ARCH, "universal-"RUBY_PLATFORM_OS !<verconf>!)
3464    AC_DEFINE_UNQUOTED(RUBY_PLATFORM, "universal."RUBY_PLATFORM_CPU"-"RUBY_PLATFORM_OS !<verconf>!)
3465else
3466    arch="${target_cpu}-${target_os}"
3467    AC_DEFINE_UNQUOTED(RUBY_PLATFORM, "${arch}" !<verconf>!)
3468fi
3469
3470unset sitearch
3471AS_CASE(["$target_os"],[mingw*],[sitearch="$target_cpu-$rb_cv_msvcrt"])
3472test ${sitearch+set} && AC_DEFINE_UNQUOTED(RUBY_SITEARCH, "${sitearch}" !<verconf>!)
3473: ${sitearch='${arch}'}
3474
3475AC_ARG_WITH(search-path,
3476		AS_HELP_STRING([--with-search-path=DIR], [specify the additional search path]),
3477		[search_path=$withval])
3478if test "$search_path" != ""; then
3479    AC_DEFINE_UNQUOTED(RUBY_SEARCH_PATH,"$search_path" !<verconf>!)
3480fi
3481
3482AC_ARG_WITH(rubyhdrdir,
3483	    AS_HELP_STRING([--with-rubyhdrdir=DIR], [core headers in DIR [[INCLUDEDIR/RUBY_BASE_NAME-RUBY_VERSION]]]),
3484	    [rubyhdrdir=$withval],
3485	    [rubyhdrdir='${includedir}/${RUBY_VERSION_NAME}'])
3486
3487AC_ARG_WITH(rubyarchhdrdir,
3488	    AS_HELP_STRING([--with-arch-rubyhdrdir=DIR],
3489			   [architecture dependent core headers in DIR [[$(rubyhdrdir)/$(arch)]]]),
3490	    [rubyarchhdrdir=$withval],
3491	    [rubyarchhdrdir=${multiarch+'${archincludedir}/${RUBY_VERSION_NAME}'}${multiarch-'${rubyhdrdir}/${arch}'}])
3492
3493AC_ARG_WITH(sitehdrdir,
3494	    AS_HELP_STRING([--with-sitehdrdir=DIR], [core site headers in DIR [[RUBYHDRDIR/site_ruby]]]),
3495	    [sitehdrdir=$withval],
3496	    [sitehdrdir='${rubyhdrdir}/site_ruby'])
3497
3498AC_ARG_WITH(sitearchhdrdir,
3499	    AS_HELP_STRING([--with-arch-sitehdrdir=DIR],
3500			   [architecture dependent core site headers in DIR [[RUBYHDRDIR/site_ruby]]]),
3501	    [sitearchhdrdir=$withval],
3502	    [sitearchhdrdir=${multiarch+'${sitearchincludedir}/${RUBY_VERSION_NAME}/site_ruby'}${multiarch-'${sitehdrdir}/${sitearch}'}])
3503
3504AC_ARG_WITH(vendorhdrdir,
3505	    AS_HELP_STRING([--with-vendorhdrdir=DIR], [core vendor headers in DIR [[RUBYHDRDIR/vendor_ruby]]]),
3506	    [vendorhdrdir=$withval],
3507	    [vendorhdrdir='${rubyhdrdir}/vendor_ruby'])
3508
3509AC_ARG_WITH(vendorarchhdrdir,
3510	    AS_HELP_STRING([--with-arch-vendorhdrdir=DIR],
3511			   [architecture dependent core vendor headers in DIR [[RUBYHDRDIR/vendor_ruby]]]),
3512	    [vendorarchhdrdir=$withval],
3513	    [vendorarchhdrdir=${multiarch+'${sitearchincludedir}/${RUBY_VERSION_NAME}/vendor_ruby'}${multiarch-'${vendorhdrdir}/${sitearch}'}])
3514
3515AC_SUBST(rubyhdrdir)dnl
3516AC_SUBST(sitehdrdir)dnl
3517AC_SUBST(vendorhdrdir)dnl
3518AC_SUBST(rubyarchhdrdir)dnl
3519AC_SUBST(sitearchhdrdir)dnl
3520AC_SUBST(vendorarchhdrdir)dnl
3521
3522AC_ARG_WITH(mantype,
3523	AS_HELP_STRING([--with-mantype=TYPE], [specify man page type; TYPE is one of man and doc]),
3524		[
3525			AS_CASE(["$withval"],
3526			[man|doc], [MANTYPE=$withval],
3527			[AC_MSG_ERROR(invalid man type: $withval)])
3528		])
3529if test -z "$MANTYPE"; then
3530	AC_PATH_PROGS(NROFF, nroff awf, /bin/false, "/usr/bin:/usr/ucb")
3531	if ${NROFF} -mdoc ${srcdir}/man/ruby.1 >/dev/null 2>&1; then
3532		MANTYPE=doc
3533	else
3534		MANTYPE=man
3535	fi
3536fi
3537AC_SUBST(MANTYPE)
3538
3539AC_ARG_ENABLE(rubygems,
3540	AS_HELP_STRING([--disable-rubygems], [disable rubygems by default]),
3541	[enable_rubygems="$enableval"], [enable_rubygems=yes])
3542if test x"$enable_rubygems" = xno; then
3543    AC_DEFINE(DISABLE_RUBYGEMS, 1)
3544    USE_RUBYGEMS=NO
3545else
3546    USE_RUBYGEMS=YES
3547fi
3548AC_SUBST(USE_RUBYGEMS)
3549
3550arch_hdrdir="${EXTOUT}/include/${arch}/ruby"
3551AS_MKDIR_P("${arch_hdrdir}")
3552config_h="${arch_hdrdir}/config.h"
3553guard=INCLUDE_RUBY_CONFIG_H
3554{
3555  echo "#ifndef $guard"
3556  echo "#define $guard 1"
3557  grep -v "^#define PACKAGE_" confdefs.h | grep -v ' !<verconf>!$'
3558  echo "#endif /* $guard */"
3559} | tr -d '\015' |
3560${srcdir}/tool/ifchange "${config_h}" -
3561sed -n 's/ !<verconf>!$//p' confdefs.h | ${srcdir}/tool/ifchange verconf.h -
3562tr -d '\015' < largefile.h > confdefs.h
3563rm largefile.h
3564
3565BUILTIN_ENCS=["`sed -n -e '/^BUILTIN_ENCS[ 	]*=/{' \
3566	-e s/// -e :l -e '/\\\\$/N' -e 's/\\\\\\n/ /' -e 't l' -e p \
3567	-e '}' "${srcdir}/enc/Makefile.in"`"]
3568BUILTIN_ENCOBJS=
3569for e in $BUILTIN_ENCS; do BUILTIN_ENCOBJS="$BUILTIN_ENCOBJS `basename $e .c`"'.$(OBJEXT)'; done
3570AC_SUBST(BUILTIN_ENCOBJS)
3571
3572BUILTIN_TRANSES=["`sed -n -e '/^BUILTIN_TRANSES[ 	]*=/{' \
3573	-e s/// -e :l -e '/\\\\$/N' -e 's/\\\\\\n/ /' -e 't l' -e p \
3574	-e '}' "${srcdir}/enc/Makefile.in"`"]
3575BUILTIN_TRANSSRCS=
3576BUILTIN_TRANSOBJS=
3577for e in $BUILTIN_TRANSES; do
3578  BUILTIN_TRANSSRCS="$BUILTIN_TRANSSRCS `basename $e .trans`"'.c';
3579  BUILTIN_TRANSOBJS="$BUILTIN_TRANSOBJS `basename $e .trans`"'.$(OBJEXT)';
3580done
3581AC_SUBST(BUILTIN_TRANSSRCS)
3582AC_SUBST(BUILTIN_TRANSOBJS)
3583
3584PACKAGE=$RUBY_BASE_NAME
3585AC_SUBST(PACKAGE)
3586AC_MSG_RESULT($PACKAGE library version = $ruby_version)
3587
3588AS_CASE([" $CPP "], [*" $CC "*], [CPP=`echo " $CPP " | sed "s| $CC |"' $(CC) |;s/^ *//;s/  *$//'`])
3589
3590AC_CONFIG_FILES($FIRSTMAKEFILE)
3591AC_CONFIG_FILES(Makefile, [
3592    tmpmk=confmk$$.tmp
3593    {
3594	if test ${VCS+set}; then
3595	    :
3596	elif svn info "$srcdir" > /dev/null 2>&1; then
3597	    VCS='svn'
3598	elif test -d "$srcdir/.git/svn"; then
3599	    VCS='git svn'
3600	elif test -d "$srcdir/.git"; then
3601	    VCS='git'
3602	else
3603	    VCS='echo cannot'
3604	fi
3605	AS_CASE("$VCS",
3606		[svn],       [VCSUP='$(VCS) up $(SVNUPOPTIONS)'],
3607		["git svn"], [VCSUP='$(VCS) rebase $(GITSVNREBASEOPTIONS)'],
3608		[git],       [VCSUP='$(VCS) pull $(GITPULLOPTIONS)'],
3609		[VCSUP='$(VCS)'])
3610	sed '/^MISSING/s/\$U\././g;/^VCS *=/s#@VCS@#'"$VCS"'#;/^VCSUP *=/s#@VCSUP@#'"$VCSUP"'#' Makefile
3611	echo; test x"$EXEEXT" = x || echo 'miniruby: miniruby$(EXEEXT)'
3612	if test "$gnumake" != yes; then
3613	    echo ['$(MKFILES): $(srcdir)/common.mk']
3614	    sed ['s/{\$([^(){}]*)[^{}]*}//g'] ${srcdir}/common.mk
3615	else
3616	    echo 'distclean-local::; @$(RM) GNUmakefile uncommon.mk'
3617	fi
3618    } > $tmpmk && if ! grep '^ruby:' $tmpmk > /dev/null; then
3619	if test "${gnumake}" = yes; then
3620	    tmpgmk=confgmk$$.tmp
3621	    {
3622		echo "include $tmpmk"
3623		echo "-include uncommon.mk"
3624	    } > $tmpgmk
3625	else
3626	    tmpgmk=$tmpmk
3627	fi &&
3628	test -z "`${MAKE-make} -f $tmpgmk info-program | grep '^PROGRAM=ruby$'`" &&
3629	echo 'ruby: $(PROGRAM);' >> $tmpmk
3630	test "$tmpmk" = "$tmpgmk" || rm -f "$tmpgmk"
3631    fi && mv -f $tmpmk Makefile],
3632[EXEEXT='$EXEEXT' gnumake='$gnumake'])
3633
3634AC_ARG_WITH([ruby-pc],
3635	    AC_HELP_STRING([pc file basename]),
3636	    [ruby_pc="$withval"],
3637	    [ruby_pc="${RUBY_BASE_NAME}-${MAJOR}.${MINOR}.pc"])
3638AC_SUBST(ruby_pc)
3639AC_SUBST(exec, [exec])
3640
3641AC_CONFIG_FILES($ruby_pc:template/ruby.pc.in,
3642    [
3643    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 &&
3644	{
3645	    test -z "$PKG_CONFIG" ||
3646	    PKG_CONFIG_PATH=. $PKG_CONFIG --print-errors ruby.tmp
3647	}
3648    then
3649	mv -f ruby.tmp.pc $ruby_pc
3650    else
3651	exit 1
3652    fi
3653    ],
3654    [ruby_pc='$ruby_pc' PKG_CONFIG='$PKG_CONFIG'])
3655
3656AC_OUTPUT
3657}
3658}
3659