Update default gems list at c90b5303a2fff58eddd7b87a06262a [ci skip]
[ruby.git] / configure.ac
blobf35fad6a3626113f65e2cfa57f78b2beec6123ea
1 dnl Process this file with autoconf to produce a configure script.
2 AC_INIT
4 AC_CONFIG_AUX_DIR(tool)
6 AC_PREREQ(2.67)
8 tooldir="$srcdir/tool"
10 AC_DISABLE_OPTION_CHECKING
12 m4_define([RUBY_M4_INCLUDED], [])dnl
13 AC_DEFUN([RUBY_M4_INCLUDE], [m4_include([tool/m4/$1])dnl
14   m4_append([RUBY_M4_INCLUDED], [ \
15         $(tooldir)/m4/$1])dnl
17 RUBY_M4_INCLUDE([_colorize_result_prepare.m4])dnl
18 RUBY_M4_INCLUDE([ac_msg_result.m4])dnl
19 RUBY_M4_INCLUDE([colorize_result.m4])dnl
20 RUBY_M4_INCLUDE([ruby_append_option.m4])dnl
21 RUBY_M4_INCLUDE([ruby_append_options.m4])dnl
22 RUBY_M4_INCLUDE([ruby_check_builtin_func.m4])dnl
23 RUBY_M4_INCLUDE([ruby_check_builtin_setjmp.m4])dnl
24 RUBY_M4_INCLUDE([ruby_check_header.m4])dnl
25 RUBY_M4_INCLUDE([ruby_check_printf_prefix.m4])dnl
26 RUBY_M4_INCLUDE([ruby_check_setjmp.m4])dnl
27 RUBY_M4_INCLUDE([ruby_check_signedness.m4])dnl
28 RUBY_M4_INCLUDE([ruby_check_sizeof.m4])dnl
29 RUBY_M4_INCLUDE([ruby_check_sysconf.m4])dnl
30 RUBY_M4_INCLUDE([ruby_cppoutfile.m4])dnl
31 RUBY_M4_INCLUDE([ruby_decl_attribute.m4])dnl
32 RUBY_M4_INCLUDE([ruby_default_arch.m4])dnl
33 RUBY_M4_INCLUDE([ruby_define_if.m4])dnl
34 RUBY_M4_INCLUDE([ruby_defint.m4])dnl
35 RUBY_M4_INCLUDE([ruby_dtrace_available.m4])dnl
36 RUBY_M4_INCLUDE([ruby_dtrace_postprocess.m4])dnl
37 RUBY_M4_INCLUDE([ruby_func_attribute.m4])dnl
38 RUBY_M4_INCLUDE([ruby_mingw32.m4])dnl
39 RUBY_M4_INCLUDE([ruby_prepend_option.m4])dnl
40 RUBY_M4_INCLUDE([ruby_prog_gnu_ld.m4])dnl
41 RUBY_M4_INCLUDE([ruby_prog_makedirs.m4])dnl
42 RUBY_M4_INCLUDE([ruby_replace_funcs.m4])dnl
43 RUBY_M4_INCLUDE([ruby_replace_type.m4])dnl
44 RUBY_M4_INCLUDE([ruby_require_funcs.m4])dnl
45 RUBY_M4_INCLUDE([ruby_rm_recursive.m4])dnl
46 RUBY_M4_INCLUDE([ruby_setjmp_type.m4])dnl
47 RUBY_M4_INCLUDE([ruby_shared_gc.m4])dnl
48 RUBY_M4_INCLUDE([ruby_stack_grow_direction.m4])dnl
49 RUBY_M4_INCLUDE([ruby_thread.m4])dnl
50 RUBY_M4_INCLUDE([ruby_try_cflags.m4])dnl
51 RUBY_M4_INCLUDE([ruby_try_cxxflags.m4])dnl
52 RUBY_M4_INCLUDE([ruby_try_ldflags.m4])dnl
53 RUBY_M4_INCLUDE([ruby_universal_arch.m4])dnl
54 RUBY_M4_INCLUDE([ruby_wasm_tools.m4])dnl
55 RUBY_M4_INCLUDE([ruby_werror_flag.m4])dnl
57 AS_IF([test "x${GITHUB_ACTIONS}" = xtrue],
58 [AC_REQUIRE([_COLORIZE_RESULT_PREPARE])dnl
59 dnl 93(bright yellow) is copied from .github/workflows/mingw.yml
60     begin_group() { AS_ECHO(["::group::\e@<:@93m$[]1\e@<:@m"]);}
61     end_group() { AS_ECHO(["::endgroup::"]);}
63 [dnl
64     begin_group() { :;}
65     end_group() { :;}
68 AC_ARG_VAR([cflags], [additional CFLAGS (ignored when CFLAGS is given)])dnl
69 AC_ARG_VAR([cppflags], [additional CPPFLAGS (ignored when CPPFLAGS is given)])dnl
70 AC_ARG_VAR([cxxflags], [additional CXXFLAGS (ignored when CXXFLAGS is given)])dnl
72 [begin]_group "environment section" && {
73 HAVE_BASERUBY=yes
74 BASERUBY_VERSION=
75 AC_ARG_WITH(baseruby,
76         AS_HELP_STRING([--with-baseruby=RUBY], [use RUBY as baseruby; RUBY is the pathname of ruby]),
77         [AS_CASE(["$withval"],
78             [*ruby*],[BASERUBY=$withval],
79             [no],[HAVE_BASERUBY=no],
80             [AC_MSG_ERROR(need ruby)])
81         ],
82         [
83                 AC_PATH_PROG([BASERUBY], [ruby], [false])
84         ])
85 AS_IF([test "$HAVE_BASERUBY" != no], [
86     RUBYOPT=- $BASERUBY --disable=gems "${tooldir}/missing-baseruby.bat" || HAVE_BASERUBY=no
88 AS_IF([test "${HAVE_BASERUBY:=no}" != no], [
89     AS_CASE(["$build_os"], [mingw*], [
90         # Can MSys shell run a command with a drive letter?
91         RUBYOPT=- `cygpath -ma "$BASERUBY"` --disable=gems -e exit 2>/dev/null || HAVE_BASERUBY=no
92     ])
93     RUBY_APPEND_OPTION(BASERUBY, "--disable=gems")
94     BASERUBY_VERSION=`$BASERUBY -v`
95     $BASERUBY -C "$srcdir" tool/downloader.rb -d tool -e gnu config.guess config.sub >&AS_MESSAGE_FD
97 AS_IF([test "$HAVE_BASERUBY" = no], [
98     AS_IF([test "$cross_compiling" = yes], [AC_MSG_ERROR([executable host ruby is required for cross-compiling])])
99     BASERUBY=${tooldir}/missing-baseruby.bat
101 AC_SUBST(BASERUBY)
102 AC_SUBST(HAVE_BASERUBY)
104 : ${GIT=git}
105 HAVE_GIT=yes
106 AC_ARG_WITH(git,
107         AS_HELP_STRING([--without-git], [never use git]),
108         [AS_CASE([$withval],
109             [no],  [GIT=never-use HAVE_GIT=no],
110             [yes], [],
111             [GIT=$withval])])
112 AS_IF([test x"$HAVE_GIT" = xyes], [command -v "$GIT" > /dev/null || HAVE_GIT=no])
113 AC_SUBST(GIT)
114 AC_SUBST(HAVE_GIT)
116 eval `sed -n -e ['s/^@%:@define RUBY_[A-Z_]*VERSION_\([A-Z][A-Z][A-Z_0-9]*\) \([0-9][0-9]*\)$/\1=\2/p'] \
117       -e ['s/^@%:@define \(RUBY_ABI_VERSION\) \([0-9][0-9]*\).*/\1=\2/p'] \
118       -e ['s/^@%:@define \(RUBY_PATCHLEVEL\) \(.*\)/\1=\2/p'] \
119      $srcdir/include/ruby/internal/abi.h \
120      $srcdir/include/ruby/version.h $srcdir/version.h`
121 for v in MAJOR MINOR TEENY; do
122     AS_IF([eval "test \"\$$v\" = ''"], [
123         AC_MSG_ERROR(could not determine $v number from version.h)
124     ])
125 done
126 AC_SUBST(MAJOR)
127 AC_SUBST(MINOR)
128 AC_SUBST(TEENY)
129 AC_SUBST(RUBY_API_VERSION, '$(MAJOR).$(MINOR)')
130 AC_SUBST(RUBY_PROGRAM_VERSION, '$(MAJOR).$(MINOR).$(TEENY)')
131 AS_CASE([$RUBY_PATCHLEVEL], [-*], [
132     AC_DEFINE_UNQUOTED(RUBY_ABI_VERSION, [${RUBY_ABI_VERSION}])
133 ], [RUBY_ABI_VERSION=])
135 AS_IF([test "$program_prefix" = NONE], [
136   program_prefix=
138 AS_IF([test "$prefix" -ef .], [
139   AC_MSG_ERROR(--prefix cannot be the current working directory.)
141 RUBY_BASE_NAME=`echo ruby | sed "$program_transform_name"`
142 RUBYW_BASE_NAME=`echo rubyw | sed "$program_transform_name"`
143 AC_SUBST(RUBY_BASE_NAME)
144 AC_SUBST(RUBYW_BASE_NAME)
145 AC_SUBST(RUBY_VERSION_NAME, '${RUBY_BASE_NAME}-${ruby_version}')
147 dnl checks for alternative programs
148 AC_CANONICAL_BUILD
149 AC_CANONICAL_HOST
150 AC_CANONICAL_TARGET
151 AS_CASE(["$target_cpu-$target_os"],
152     [aarch64-darwin*], [
153         target_cpu=arm64
154         AS_CASE(["$target_vendor"], [unknown], [
155             target_vendor=apple
156             target=${target%%-unknown-*}-apple-${target@%:@*-unknown-}
157         ])
158         target="arm64-${target@%:@aarch64-}"
159         AS_IF([test -n "$target_alias"], [target_alias="arm64-${target_alias@%:@aarch64-}"])
160     ])
162 AC_ARG_PROGRAM
163 RUBY_RM_RECURSIVE
164 AC_ARG_WITH(gcc,
165         AS_HELP_STRING([--without-gcc], [never use gcc]),
166         [
167         AS_CASE([$withval],
168             [no],  [: ${CC=cc}],
169             [yes], [: ${CC=gcc}],
170                    [CC=$withval])])
171 dnl If the user switches compilers, we can't believe the cache
172 AS_IF([test ! -z "$ac_cv_prog_CC" -a ! -z "$CC" -a "$CC" != "$ac_cv_prog_CC"], [
173   AC_MSG_ERROR(cached CC is different -- throw away $cache_file
174 (it is also a good idea to do 'make clean' before compiling))
177 RUBY_WASM_TOOLS
179 AS_CASE(["${build_os}"],
180 [linux*|cygwin*|msys*], [
181     # Naruse prefers GCC on Linux
182     AC_CHECK_TOOLS([CC], [gcc clang cc])
184 [solaris*], [
185     # Clang on Solaris is largely untested.
186     # https://bugs.ruby-lang.org/issues/17949
187     AC_CHECK_TOOLS([CC], [cc gcc])
188 ], [
189     # OpenBSD wants to prefer cc over gcc.
190     # See https://github.com/ruby/ruby/pull/2443
191     AC_CHECK_TOOLS([CC], [cl.exe clang cc gcc c99 /usr/ucb/cc])
194 AC_ARG_VAR([AR],       [Archiver command])
195 AC_ARG_VAR([AS],       [Assembler command])
196 AC_ARG_VAR([CC],       [C compiler command])
197 AC_ARG_VAR([CXX],      [C++ compiler command])
198 AC_ARG_VAR([LD],       [Linker command])
199 AC_ARG_VAR([NM],       [Symbol list command])
200 AC_ARG_VAR([OBJCOPY],  [Objcopy command])
201 AC_ARG_VAR([OBJDUMP],  [Objdump command])
202 AC_ARG_VAR([RANLIB],   [Ranlib command])
203 AC_ARG_VAR([STRIP],    [Strip command])
205 # We don't want to bother things like `ccache gcc`, `clang -shared-libgcc`, ...
206 set rb_dummy ${CC}
207 rb_CC=$2
208 AC_DEFUN([RUBY_CHECK_PROG_FOR_CC], [
209     rb_prog=`echo "${rb_CC}" | sed "$2"`
210     AC_CHECK_PROG([$1], [$rb_prog], [$rb_prog])
212 AS_CASE(["/${rb_CC} "],
213 [*@<:@\ /@:>@"cc "*], [
214     # Don't try g++/clang++ when CC=cc
215     AC_CHECK_PROGS([CXX],    [cl.exe CC c++])
217 [*icc*],              [
218     # Intel C++ has interprocedural optimizations.  It tends to come with its
219     # own linker etc.
220     RUBY_CHECK_PROG_FOR_CC([AR],      [s/icc/xiar/])
221     RUBY_CHECK_PROG_FOR_CC([CXX],     [s/icc/icpc/])
222     RUBY_CHECK_PROG_FOR_CC([LD],      [s/icc/xild/])
224 [*gcc*],              [
225     # Ditto for GCC.
226     RUBY_CHECK_PROG_FOR_CC([LD],      [s/gcc/ld/])
227     RUBY_CHECK_PROG_FOR_CC([AR],      [s/gcc/gcc-ar/])
228     RUBY_CHECK_PROG_FOR_CC([CXX],     [s/gcc/g++/])
229     RUBY_CHECK_PROG_FOR_CC([NM],      [s/gcc/gcc-nm/])
230     RUBY_CHECK_PROG_FOR_CC([RANLIB],  [s/gcc/gcc-ranlib/])
232 [*clang*],            [
233     # Ditto for LLVM.  Note however that llvm-as is a LLVM-IR to LLVM bitcode
234     # assembler that does not target your machine native binary.
236     # Xcode has its own version tools that may be incompatible with
237     # genuine LLVM tools, use the tools in the same directory.
239     AS_IF([$rb_CC -E -dM -xc - < /dev/null | grep -F __apple_build_version__ > /dev/null],
240           [llvm_prefix=], [llvm_prefix=llvm-])
241     # AC_PREPROC_IFELSE cannot be used before AC_USE_SYSTEM_EXTENSIONS
243     RUBY_CHECK_PROG_FOR_CC([LD],      [s/clang/ld/]) # ... maybe try lld ?
244     RUBY_CHECK_PROG_FOR_CC([AR],      [s/clang/${llvm_prefix}ar/])
245 #   RUBY_CHECK_PROG_FOR_CC([AS],      [s/clang/${llvm_prefix}as/])
246     RUBY_CHECK_PROG_FOR_CC([CXX],     [s/clang/clang++/])
247     RUBY_CHECK_PROG_FOR_CC([NM],      [s/clang/${llvm_prefix}nm/])
248     RUBY_CHECK_PROG_FOR_CC([OBJCOPY], [s/clang/${llvm_prefix}objcopy/])
249     RUBY_CHECK_PROG_FOR_CC([OBJDUMP], [s/clang/${llvm_prefix}objdump/])
250     RUBY_CHECK_PROG_FOR_CC([RANLIB],  [s/clang/${llvm_prefix}ranlib/])
251     RUBY_CHECK_PROG_FOR_CC([STRIP],   [s/clang/${llvm_prefix}strip/])
253 AS_UNSET(rb_CC)
254 AS_UNSET(rb_dummy)
256 AS_CASE(["${build_os}"],
257 [solaris*], [
258     AC_PATH_TOOL([LD], [ld], [/usr/ccs/bin/ld], [/usr/ccs/bin:$PATH])
260 [aix*], [
261     AC_PATH_TOOL([NM], [nm], [/usr/ccs/bin/nm], [/usr/ccs/bin:$PATH])
263 AS_CASE(["${target_os}"],
264 [cygwin*|msys*|mingw*|darwin*], [
265     ac_cv_prog_ac_ct_OBJCOPY=":"
268 rb_test_CFLAGS=${CFLAGS+yes}
269 rb_test_CXXFLAGS=${CXXFLAGS+yes}
271 # BSD's ports and MacPorts prefix GNU binutils with 'g'
273 dnl Seems necessarily in order to add -std=gnu99 option for gcc 4.9.
274 m4_version_prereq([2.70], [AC_PROG_CC], [AC_PROG_CC_C99])
276 AC_PROG_CXX
277 AC_PROG_CPP
278 AC_PROG_RANLIB
279 AC_CHECK_TOOLS([AR],      [gar ar])
280 AC_CHECK_TOOLS([AS],      [gas as])
281 AC_CHECK_TOOLS([LD],      [gld ld]) # ... try gold ?
282 AC_CHECK_TOOLS([NM],      [gnm nm])
283 AC_CHECK_TOOLS([OBJCOPY], [gobjcopy objcopy], [:])
284 AC_CHECK_TOOLS([OBJDUMP], [gobjdump objdump])
285 AC_CHECK_TOOLS([STRIP],   [gstrip strip], [:])
287 # nm errors with Rust's LLVM bitcode when Rust uses a newer LLVM version than nm.
288 # In case we're working with llvm-nm, tell it to not worry about the bitcode.
289 AS_IF([${NM} --help 2>&1 | grep -q 'llvm-bc'], [NM="$NM --no-llvm-bc"])
291 AS_IF([test ! $rb_test_CFLAGS], [AS_UNSET(CFLAGS)]); AS_UNSET(rb_test_CFLAGS)
292 AS_IF([test ! $rb_test_CXXFLAGS], [AS_UNSET(CXXFLAGS)]); AS_UNSET(rb_save_CXXFLAGS)
294 AS_IF([test "${CXX}" = "g++" -a -z "${GXX}"], [
295     # AC_PROG_CXX sets $CXX to "g++" when it purposefully finds that there is
296     # _no_ g++.  This brain-damaged design must be worked around.  Thankfully,
297     # similar thing doesn't happen for AC_PROG_CC.
298     rb_there_is_in_fact_no_gplusplus_but_autoconf_is_cheating_us=true
301 test x"$target_alias" = x &&
302 target_os=`echo $target_os | sed 's/linux-gnu$/linux/;s/linux-gnu/linux-/'`
303 ac_install_sh='' # unusable for extension libraries.
305 AC_ARG_WITH(os-version-style,
306         AS_HELP_STRING([--with-os-version-style=TYPE],
307                        [OS version number for target and target_os [[full]]]
308                        [(full|teeny|minor+0|minor|major+0|major|none)]),
309         [os_version_style=$withval],
310         [os_version_style=full
311             AS_CASE($target_os, [[*[0-9].*]],
312                 [AS_CASE([`/usr/bin/ruby -e 'puts RUBY_PLATFORM' 2>/dev/null`],
313                     [[*-*[0-9].*.0]], [os_version_style=minor+0],
314                     [[*-*[0-9].*.*]], [os_version_style=full],
315                     [[*-*[0-9].0]  ], [os_version_style=major+0],
316                     [[*-*[0-9].*]  ], [os_version_style=minor],
317                     [[*-*[0-9]]    ], [os_version_style=major],
318                 )])
319         ])
320 os_version_style_transform=
321 AS_CASE("${os_version_style}",
322         [full|teeny], [],
323         [minor+0], [os_version_style_transform=['s/\([0-9]\.[0-9][0-9]*\)\.[0-9][.0-9]*$/\1.0/']],
324         [minor],   [os_version_style_transform=['s/\([0-9]\.[0-9][0-9]*\)\.[0-9][.0-9]*$/\1/']],
325         [major+0], [os_version_style_transform=['s/\([0-9]\)\.[0-9][.0-9]*$/\1.0/']],
326         [major],   [os_version_style_transform=['s/\([0-9]\)\.[0-9][.0-9]*$/\1/']],
327         [none],    [os_version_style_transform=['s/[0-9]*\.[0-9][.0-9]*$//']],
328         [AC_MSG_ERROR(unknown --with-os-version-style: $withval)])
329 AS_IF([test -z "$target_alias" -a -n "$os_version_style_transform"],
330         [
331         target=`echo ${target} | sed "$os_version_style_transform"`
332         target_os=`echo ${target_os} | sed "$os_version_style_transform"`
333         ])
335 AC_ARG_WITH(arch,
336         AS_HELP_STRING([--with-arch=ARCHS],
337                        [build an Apple/NeXT Multi Architecture Binary (MAB);
338                           ARCHS is a comma-delimited list of architectures for
339                           which to build; if this option is disabled or omitted
340                           entirely, then the package will be built only for the
341                           target platform]),
342        [target_archs="$withval"], [unset target_archs])
344 AC_ARG_ENABLE(load-relative,
345        AS_HELP_STRING([--enable-load-relative], [resolve load paths at run time]),
346        [load_relative=$enableval])
348 # checks for UNIX variants that set C preprocessor variables
349 AC_USE_SYSTEM_EXTENSIONS
351 dnl Checks for programs.
353 cflagspat=
354 test -z "$optflags" ||
355     cflagspat="$cflagspat;s|"`eval echo '"'"${optflags}"'"' | sed 's/[[][|.*]]/\\&/g;s/^ */ /;s/ *$/ /'`'| |g'
356 test -z "$debugflags" ||
357     cflagspat="$cflagspat;s|"`eval echo '"'"${debugflags}"'"' | sed 's/[[][|.*]]/\\&/g;s/^ */ /;s/ *$/ /'`'| |g'
358 test -z "$warnflags" ||
359     cflagspat="$cflagspat;s|"`eval echo '"'"${warnflags}"'"' | sed 's/[[][|.*]]/\\&/g;s/^ */ /;s/ *$/ /'`'| |g'
360 AS_IF([test -z "${CFLAGS+set}"], [
361     cflags=`echo " $cflags " | sed "$cflagspat;s/^ *//;s/ *$//"`
362     orig_cflags="$cflags"
363     cflags="$cflags "'${optflags} ${debugflags} ${warnflags}'
365 dnl AS_IF([test -z "${CXXFLAGS+set}"], [
366 dnl     cxxflags=`echo " $cxxflags " | sed "$cflagspat;s/^ *//;s/ *$//"`
367 dnl     orig_cxxflags="$cxxflags"
368 dnl     cxxflags="$cxxflags "'${optflags} ${debugflags} ${warnflags}'
369 dnl ])
371 AS_CASE(["$host_os:$build_os"],
372 [darwin*:darwin*], [
373     # Following Apple deployed clang are broken
374     # clang version 1.0 (http://llvm.org/svn/llvm-project/cfe/tags/Apple/clang-23 exported)
375     # Apple clang version 2.0 (tags/Apple/clang-137) (based on LLVM 2.9svn)
376     # Apple clang version 2.1 (tags/Apple/clang-163.7.1) (based on LLVM 3.0svn)
377     AC_PREPROC_IFELSE(
378         [AC_LANG_PROGRAM([
379             @%:@if defined __APPLE_CC__ && defined __clang_major__ && __clang_major__ < 3
380             @%:@error premature clang
381             @%:@endif
382         ])],
383         [],
384         [AC_MSG_ERROR([clang version 3.0 or later is required])])
387 AS_CASE(["$target_os"],
388 [darwin*], [
389     AC_MSG_CHECKING(if minimum required OS X version is supported)
390     AC_PREPROC_IFELSE([AC_LANG_SOURCE([[@%:@include <AvailabilityMacros.h>
391         @%:@if MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_5
392         @%:@error pre OS X 10.5
393         [!<===== pre OS X 10.5 =====>]
394         @%:@endif
395         ]])],
396         [AC_MSG_RESULT(yes)],
397         [AC_MSG_RESULT(no)
398         AC_MSG_ERROR([Unsupported OS X version is required])])
401 RUBY_MINGW32
402 AC_SUBST(GCC)
403 AC_SUBST(LD)
404 AS_IF([test "$GCC" = yes], [
405     linker_flag=-Wl,
406     : ${optflags=-O3}
407     gcc_major=`echo =__GNUC__ | $CC -E -xc - | sed '/^=/!d;s///'`
408     gcc_minor=`echo =__GNUC_MINOR__ | $CC -E -xc - | sed '/^=/!d;s///'`
409     test -n "$gcc_major" || gcc_major=0
410     test -n "$gcc_minor" || gcc_minor=0
411     icc_version=`echo =__ICC | $CC -E -xc - | sed '/^=/!d;s///;/^__ICC/d'`
412     test -n "$icc_version" || icc_version=0
413     # RUBY_APPEND_OPTIONS(XCFLAGS, ["-include ruby/config.h" "-include ruby/missing.h"])
415     AS_IF([test "$gcc_major" -lt 4], [
416         AC_MSG_ERROR([too old GCC: $gcc_major.$gcc_minor])
417     ])
418 ], [
419     linker_flag=
422 RUBY_PROG_GNU_LD
423 RUBY_CPPOUTFILE
425 : ${OUTFLAG='-o '}
426 : ${COUTFLAG=${OUTFLAG}}
427 : ${CSRCFLAG=''}
428 AC_SUBST(OUTFLAG)
429 AC_SUBST(COUTFLAG)
430 AC_SUBST(CSRCFLAG)
432 AS_CASE(["$build_os"],
433   [darwin*], [
434     # gcc 13 warns duplicate -l options, which are added by the
435     # default spec.
436     # Xcode linker warns for deprecated architecture and wrongly
437     # installed TBD files.
438     AC_MSG_CHECKING(for $CC linker warning)
439     suppress_ld_waring=no
440     echo 'int main(void) {return 0;}' > conftest.c
441     AS_IF([$CC -framework Foundation -o conftest conftest.c 2>&1 |
442            grep \
443               -e '^ld: warning: ignoring duplicate libraries:' \
444               -e '^ld: warning: text-based stub file' \
445               -e '^ld: warning: -multiply_defined is obsolete' \
446            >/dev/null], [
447         suppress_ld_waring=yes
448     ])
449     rm -fr conftest*
450     test $suppress_ld_waring = yes && warnflags="${warnflags:+${warnflags} }-Wl,-w"
451     AC_MSG_RESULT($suppress_ld_waring)
452   ])
453 AS_CASE(["$target_os"],
454   [wasi*], [
455     # Clang linker automatically uses wasm-opt with -O if it found.
456     # https://github.com/llvm/llvm-project/blob/812828984c10857a4cd260eb638c52a4411f9143/clang/lib/Driver/ToolChains/WebAssembly.cpp#L95-L118
457     # However optimization before asyncify causes misoptimization,
458     # so wrap clang to insert our fake wasm-opt, which does nothing, in PATH.
459     CC_WRAPPER=`cd -P "${tooldir}" && pwd`/wasm-clangw
460     CC="$CC_WRAPPER $CC"
461   ])
463 cc_version=
464 for option in --version -v -V -qversion; do
465     cc_version_message=`$CC $option 2>&1`
466     cc_version_status=$?
467     AS_CASE($cc_version_status, [0], [:], [continue])
468     AS_CASE($cc_version_message, [*Warning*], [continue])
469     cc_version='$(CC) '$option
470     break
471 done
472 AC_SUBST(CC_VERSION, $cc_version)
473 AC_SUBST(CC_VERSION_MESSAGE, $cc_version_message)
475 : ${DLDFLAGS="$LDFLAGS"}
477 RUBY_UNIVERSAL_ARCH
478 AS_IF([test "$target_cpu" != "$host_cpu" -a "$GCC" = yes -a "${universal_binary:-no}" = no], [
479     RUBY_DEFAULT_ARCH($target_cpu)
481 host_os=$target_os
482 host_vendor=$target_vendor
483 host_cpu=$target_cpu
484 host=$target
485 host_alias=$target_alias
487 AC_CACHE_CHECK([for $AR flags], [rb_cv_arflags], [
488     AS_IF([$AR rcD conftest.a > /dev/null 2>&1 && rm conftest.a],
489         [rb_cv_arflags=rcD], [rb_cv_arflags=rcu])
491 AC_SUBST(ARFLAGS, ["$rb_cv_arflags "])
492 AC_SUBST(ASFLAGS)
494 AS_CASE(["$target_os"],
495 [cygwin*|msys*|mingw*], [
496     AC_CHECK_TOOL(WINDRES, windres)
497     AC_CHECK_TOOL(DLLWRAP, dllwrap)
498     target=`echo $target | sed "s/^$target_cpu-/-/"`
499     target_alias=`echo $target_alias | sed "s/^$target_cpu-/-/"`
500     target_cpu=`echo $target_cpu | sed s/i.86/i386/`
501     AS_CASE(["$target"], [-*], [ target="$target_cpu${target}"])
502     AS_CASE(["$target_alias"], [-*], [ target_alias="$target_cpu${target_alias}"])
503     AS_CASE(["$target_os"],
504     [mingw*], [
505         test "$rb_cv_msvcrt" = "" && unset rb_cv_msvcrt
506         AC_CACHE_CHECK(for mingw32 runtime DLL, rb_cv_msvcrt, [
507         AC_LINK_IFELSE([AC_LANG_PROGRAM([[@%:@include <stdio.h>]],
508                     [[FILE* volatile f = stdin; return 0;]])],
509                     [rb_cv_msvcrt=`$OBJDUMP -p conftest$ac_exeext |
510                                    tr A-Z a-z |
511                                    sed -n '/^[[         ]]*dll name: \(msvc.*\)\.dll$/{s//\1/p;q;};
512                                         /^[[    ]]*dll name: \(ucrtbase\|api-ms-win-crt-.*\)\.dll$/{s//ucrt/p;q;}'`],
513                     [rb_cv_msvcrt=msvcrt])
514         test "$rb_cv_msvcrt" = "" && rb_cv_msvcrt=msvcrt])
515         RT_VER=`echo "$rb_cv_msvcrt" | tr -cd [0-9]`
516         test "$RT_VER" = "" && RT_VER=60
517         test "$rb_cv_msvcrt" = "ucrt" && RT_VER=140
518         AC_DEFINE_UNQUOTED(RUBY_MSVCRT_VERSION, $RT_VER)
519         sysconfdir=
520     ])
521     rb_cv_binary_elf=no
522     : ${enable_shared=yes}
523     AS_IF([$WINDRES --version | grep LLVM > /dev/null], [USE_LLVM_WINDRES=yes], [USE_LLVM_WINDRES=no])
524     ],
525 [hiuxmpp*], [AC_DEFINE(__HIUX_MPP__)])    # by TOYODA Eizi <toyoda@npd.kishou.go.jp>
527 AC_PROG_LN_S
528 AC_PROG_MAKE_SET
529 AC_PROG_INSTALL
531 AS_CASE(["$target_os"],[openbsd*],[
532     ac_cv_path_mkdir="mkdir"
535 RUBY_PROG_MAKEDIRS
537 AC_CHECK_PROG([DTRACE], [${ac_tool_prefix}dtrace], [${ac_tool_prefix}dtrace])
538 AS_IF([test "$cross_compiling:$ac_cv_prog_DTRACE" = no: -a -n "$ac_tool_prefix"], [
539     AC_CHECK_PROG([DTRACE], [dtrace], [dtrace])
542 AC_CHECK_PROGS(DOT, dot)
543 AC_CHECK_PROGS(DOXYGEN, doxygen)
545 tool_warned=$ac_tool_warned ac_tool_warned=no
546 AC_CHECK_TOOL(PKG_CONFIG, pkg-config)
547 ac_tool_warned=$tool_warned
548 AS_IF([test -z "$PKG_CONFIG"], [],
549 ["$PKG_CONFIG" --print-errors --version > /dev/null 2>&1], [],
551     unset ac_cv_prog_PKG_CONFIG
552     PKG_CONFIG=
553     AC_MSG_WARN([$PKG_CONFIG does not work; ignore])
556 AC_MSG_CHECKING([whether it is Android])
557 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
558         @%:@ifndef __ANDROID__
559         @%:@error Not android
560         @%:@endif
561 ]], [[]])],
563         AC_MSG_RESULT(yes)
564         target_os=${target_os}-android
565         AS_IF([test "x$cross_compiling" = xno], [
566                 AC_MSG_CHECKING([for Android API version])
567                 # hacky workaround: https://github.com/termux/termux-packages/issues/6176
568                 rb_android_api=`getprop ro.build.version.sdk`
569                 AC_MSG_RESULT($rb_android_api)
570                 RUBY_APPEND_OPTIONS(CPPFLAGS, -D__ANDROID_API__=$rb_android_api -Wno-macro-redefined)
571         ])
573 [AC_MSG_RESULT(no)])
575 AC_SUBST(RM, ['rm -f'])
576 AC_SUBST(CP, ['cp'])
577 RMDIRS='$(top_srcdir)/tool/rmdirs'
578 RMDIR=rmdir
579 mkdir "rmdirs_$$_test" "rmdirs_$$_test/a"
580 rmdir --ignore-fail-on-non-empty "rmdirs_$$_test" 2>/dev/null &&
581 RMDIR='rmdir --ignore-fail-on-non-empty'
582 $RMDIR -p "rmdirs_$$_test/a" 2>/dev/null &&
583 { test -d "rmdirs_$$_test" || RMDIRS="$RMDIR -p"; }
584 rmdir "rmdirs_$$_test/a" "rmdirs_$$_test" 2>/dev/null
585 AC_SUBST(RMDIR)
586 AC_SUBST(RMDIRS)
587 AC_SUBST(RMALL, ['rm -fr'])
589 AC_MSG_CHECKING([for cd using physical directory])
590 rm -fr conf$$.dir
591 mkdir conf$$.dir &&
592 (cd conf$$.dir && mkdir src build && cd src &&
593 $as_ln_s ../build . > /dev/null 2>&1 && cd build &&
594 for chdir in 'cd -P' 'PWD= cd'; do
595     /bin/sh -c "$chdir ../src && echo '$chdir' > cdcmd" 2> /dev/null && break
596 done)
597 AS_IF([test -f conf$$.dir/src/cdcmd], [
598     read CHDIR < conf$$.dir/src/cdcmd 2> /dev/null
599 ], [
600     CHDIR=cd
602 rm -fr conf$$.dir
603 AC_MSG_RESULT([$CHDIR])
604 AC_SUBST(CHDIR)
607 [begin]_group "compiler section" && {
608 RUBY_WERROR_FLAG([
609     AC_MSG_CHECKING([whether CFLAGS is valid])
610     AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
611         [AC_MSG_RESULT(yes)],
612         [
613         AC_MSG_RESULT(no)
614         AC_MSG_ERROR([something wrong with CFLAGS="$CFLAGS"])
615         ]
616     )
618     AC_MSG_CHECKING([whether LDFLAGS is valid])
619     {
620         mkdir tmp.$$.try_link &&
621         cd tmp.$$.try_link &&
622         cp ../confdefs.h . &&
623         echo '<?xml?><plist><dict><key>CFBundleIdentifier</key><string></string></dict></plist>' > Info.plist &&
624         :
625     } || AC_MSG_ERROR([failed to make temporary directory])
626     AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
627         [AC_MSG_RESULT(yes)],
628         [
629         cd .. && rm -fr tmp.$$.try_link
630         AC_MSG_RESULT(no)
631         AC_MSG_ERROR([something wrong with LDFLAGS="$LDFLAGS"])
632         ]
633     )
634     cd .. && rm -fr tmp.$$.try_link
637 : "rpath" && {
638     AC_CACHE_CHECK(whether ELF binaries are produced, rb_cv_binary_elf,
639         [AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[]])],[
640             AS_CASE(["`head -1 conftest$EXEEXT | tr -dc '\177ELF' | tr '\177' .`"],
641             [.ELF*], [rb_cv_binary_elf=yes], [rb_cv_binary_elf=no])],
642             [rb_cv_binary_elf=no])])
644     rpathflag=''
645     AS_IF([test x"${RPATHFLAG=}" = x], [
646         AS_CASE(["$target_os"],
647         [aix*], [rpathflag='-blibpath:'],
648         [for rpathflag in "-rpath " -R; do
649             AS_CASE("$rpathflag",
650                     [*" "], [AS_CASE(["${linker_flag}"],
651                                      [*,], [rpathflag=`echo "$rpathflag" | tr ' ' ,`])])
652             rpathflag="${linker_flag}${rpathflag}"
653             RUBY_TRY_LDFLAGS([${rpathflag}.], [], [rpathflag=])
654             AS_IF([test "x${rpathflag}" != x], [break])
655         done])
656     ], [
657         rpathflag=`echo "$RPATHFLAG" | sed 's/%.*//'`
658     ])
660     AC_ARG_ENABLE(rpath,
661         AS_HELP_STRING([--enable-rpath], [embed run path into extension libraries.
662         enabled by default on ELF platforms]),
663         [enable_rpath=$enableval], [enable_rpath="$rb_cv_binary_elf"])
665     AS_IF([test "$enable_rpath:${RPATHFLAG}" = yes:], [
666         RPATHFLAG="${rpathflag:+ ${rpathflag}%1\$-s}"
667     ])
668     AS_CASE([${RPATHFLAG}],[*'%1$'*],[: ${LIBPATHFLAG=' -L%1$-s'}],[: ${LIBPATHFLAG=' -L%s'}])
671 RUBY_TRY_LDFLAGS(-fdeclspec, [fdeclspec=yes], [fdeclspec=no])
672 AS_IF([test "$fdeclspec" = yes], [
673     RUBY_APPEND_OPTIONS(CFLAGS, -fdeclspec)
674     RUBY_APPEND_OPTIONS(cflags, -fdeclspec)
675     RUBY_APPEND_OPTIONS(orig_cflags, -fdeclspec)
677 RUBY_TRY_CXXFLAGS(-fdeclspec, [fdeclspec=yes], [fdeclspec=no])
678 AS_IF([test "$fdeclspec" = yes], [
679     RUBY_APPEND_OPTIONS(CXXFLAGS, -fdeclspec)
682 AC_ARG_ENABLE(devel,
683     AS_HELP_STRING([--enable-devel], [enable development build]),
684     [RUBY_DEVEL=$enableval],
685     [AS_IF([test "x${RUBY_DEVEL-no}" != xyes], [RUBY_DEVEL=])]
686 )dnl
687 AC_SUBST(RUBY_DEVEL)
688 particular_werror_flags=${RUBY_DEVEL:-no}
689 AC_ARG_ENABLE(werror,
690         AS_HELP_STRING([--disable-werror],
691                        [don't make warnings into errors
692                        even if a compiler support -Werror feature
693                        [[disabled by default unless development version]]]),
694         [particular_werror_flags=$enableval])
696 rb_cv_warnflags="$warnflags"
697 AS_CASE(["$GCC:${warnflags+set}:${extra_warnflags:+set}:"],
698 [yes::*|yes:*:set:], [# GCC && (!warnflags || extra_warnflags)
699     AS_IF([test $gcc_major -le 6], [
700         extra_warnflags="$extra_warnflags -Wno-maybe-uninitialized"
701     ])
702     AS_CASE([ $CFLAGS ], [*" -save-temps="*|*" -save-temps "*], [], [
703         extra_warnflags="$extra_warnflags -Werror=misleading-indentation"
704     ])
706     # ICC doesn't support -Werror=
707     AS_IF([test $icc_version -gt 0], [
708         particular_werror_flags=no
709     ])
710     for wflag in \
711                  -Werror=extra-tokens \
712                  -Werror=deprecated-declarations \
713                  -Werror=division-by-zero -Werror=div-by-zero \
714                  -Werror=duplicated-cond \
715                  -Werror=implicit-function-declaration \
716                  -Werror=implicit-int \
717                  -Werror=pointer-arith \
718                  -Werror=shorten-64-to-32 \
719                  -Werror=write-strings \
720                  -Werror=old-style-definition \
721                  -Wimplicit-fallthrough=0 \
722                  -Wmissing-noreturn \
723                  -Wno-cast-function-type \
724                  -Wno-constant-logical-operand \
725                  -Wno-long-long \
726                  -Wno-missing-field-initializers \
727                  -Wno-overlength-strings \
728                  -Wno-packed-bitfield-compat \
729                  -Wno-parentheses-equality \
730                  -Wno-self-assign \
731                  -Wno-tautological-compare \
732                  -Wno-unused-parameter \
733                  -Wno-unused-value \
734                  -Wsuggest-attribute=format \
735                  -Wsuggest-attribute=noreturn \
736                  -Wunused-variable \
737                  -diag-disable=175,188,1684,2259,2312 \
738                  $extra_warnflags \
739                  ; do
740         AS_IF([test "$particular_werror_flags" != yes], [
741             wflag=`echo x$wflag | sed 's/^x-Werror=/-W/;s/^x//'`
742         ])
743         ok=no
744         RUBY_TRY_CFLAGS($wflag, [
745             RUBY_APPEND_OPTIONS(warnflags, $wflag)
746             ok=yes
747         ])
748         AS_CASE([$ok:$wflag], [no:-Werror=*], [
749             wflag=`echo x$wflag | sed 's/^x-Werror=/-W/'`
750             RUBY_TRY_CFLAGS($wflag, [
751                 RUBY_APPEND_OPTIONS(warnflags, $wflag)
752                 particular_werror_flags=no
753             ])
754         ])
755     done
756     AS_IF([test "$particular_werror_flags" = "yes"], [
757         wflag=-Werror=undef
758     ], [
759         wflag=-Wundef
760     ])
761     RUBY_TRY_CFLAGS($wflag, [
762         RUBY_APPEND_OPTIONS(warnflags, $wflag)
763     ], [], [
764         @%:@if !defined(RUBY_CONFIG_TEST_NEVER_DEFINED_SYMBOL)
765         @%:@elif RUBY_CONFIG_TEST_NEVER_DEFINED_SYMBOL
766         @%:@endif
767     ])
768     AS_CASE([" $warnflags "],[*" -Wno-missing-field-initializers "*], [wflag="-Wall -Wextra"],
769                              [wflag=-Wall])
770     RUBY_TRY_CFLAGS($wflag, [warnflags="$wflag${warnflags+ $warnflags}"])
771     # Disable warnflags while conftest. -Werror=* flags might make bad OS capability guess.
772     rb_cv_warnflags="$warnflags"
773     warnflags=
775 RUBY_TRY_CFLAGS(-Qunused-arguments, [RUBY_APPEND_OPTIONS(rb_cv_wsuppress_flags, -Qunused-arguments)])
776 AC_COMPILE_IFELSE([
777     AC_LANG_PROGRAM([
778 @%:@if !(defined(__SUNPRO_C)||defined(__SUNPRO_CC))
779 @%:@error not sunpro
780 @%:@endif],[])], [
781     for e in \
782         E_STATEMENT_NOT_REACHED \
783         E_INIT_SIGN_EXTEND \
784         E_INIT_DOES_NOT_FIT \
785         E_INITIALIZATION_TYPE_MISMATCH
786     do
787         RUBY_TRY_CFLAGS([-erroff=${e}], [
788             RUBY_APPEND_OPTIONS(rb_cv_warnflags, [-erroff=${e}])
789         ])
790     done
793 AC_ARG_WITH(compress-debug-sections,
794         AS_HELP_STRING([--with-compress-debug-sections=type],
795             [enable debug section compression]),
796         [compress_debug_sections=$withval], [compress_debug_sections=])
798 AS_IF([test "$GCC" = yes], [
799     # -D_FORTIFY_SOURCE
800     # When defined _FORTIFY_SOURCE, glibc enables some additional sanity
801     # argument check. The performance drop is very little and Ubuntu enables
802     # _FORTIFY_SOURCE=2 by default. So, let's support it for protecting us from
803     # a mistake of silly C extensions.
805     # TODO: check if link succeeds with _FORTIFY_SOURCE=2.
806     AS_CASE(["$target_os"],
807     [mingw*], [
808         fortify_source=no
809     ])
810     AC_ARG_ENABLE(fortify_source,
811                   AS_HELP_STRING([--disable-fortify-source],
812                                  [disable -D_FORTIFY_SOURCE=2 option, which causes link error on mingw]),
813                   [fortify_source=$enableval])
814     AS_IF([test "x$fortify_source" != xno], [
815         RUBY_TRY_CFLAGS([$optflags -D_FORTIFY_SOURCE=2],
816                         [RUBY_APPEND_OPTION(XCFLAGS, -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2)], [],
817                         [@%:@include <stdio.h>])
818     ])
820     # -fstack-protector
821     AS_CASE(["$target_os"],
822     [emscripten*|wasi*], [
823         stack_protector=no
824     ])
825     AS_IF([test -z "${stack_protector+set}"], [
826         AS_FOR(option, opt, [-fstack-protector-strong -fstack-protector], [
827             RUBY_TRY_CFLAGS(option, [stack_protector=yes])
828             AS_IF([test "x$stack_protector" = xyes], [
829                 RUBY_TRY_LDFLAGS(option, [], [stack_protector=])
830             ])
831             AS_IF([test "x$stack_protector" = xyes], [stack_protector=option; break])
832         ])
833     ])
834     AC_MSG_CHECKING([for -fstack-protector])
835     AC_MSG_RESULT(["$stack_protector"])
836     AS_CASE(["$stack_protector"], [-*], [
837         RUBY_APPEND_OPTION(XCFLAGS, $stack_protector)
838         RUBY_APPEND_OPTION(XLDFLAGS, $stack_protector)
839         RUBY_APPEND_OPTION(LDFLAGS, $stack_protector)
840     ])
842     # aarch64 branch protection
843     AS_CASE(["$target_cpu"], [aarch64], [
844         AS_FOR(option, opt, [-mbranch-protection=pac-ret -msign-return-address=all], [
845             RUBY_TRY_CFLAGS(option, [branch_protection=yes], [branch_protection=no])
846             AS_IF([test "x$branch_protection" = xyes], [
847                 # C compiler and assembler must be consistent for -mbranch-protection
848                 # since they both check `__ARM_FEATURE_PAC_DEFAULT` definition.
849                 RUBY_APPEND_OPTION(XCFLAGS, option)
850                 RUBY_APPEND_OPTION(ASFLAGS, option)
851                 break
852             ])
853         ])
854     ])
856     AS_CASE("${compress_debug_sections:-zlib}",
857     [none|no], [], [
858     RUBY_TRY_LDFLAGS(${linker_flag}--compress-debug-sections=${compress_debug_sections:-zlib},
859                      [compress_debug_sections=${compress_debug_sections:-zlib}],
860                      [compress_debug_sections=no])
861     ])
862     AS_IF([test "x$compress_debug_sections" != xno], [
863         RUBY_APPEND_OPTION(DLDFLAGS, ${linker_flag}--compress-debug-sections=$compress_debug_sections)
864     ])
866     AS_CASE(["$target_os"],[mingw*], [
867       # On  Windows  platforms,   system  provided  headers  are  VC++
868       # optimized.  That  is, C++  habits are often  contaminated into
869       # various  headers.  Most frequent  situation is  the use  of //
870       # comments.   We  bypass  ANSI   C  mode  for  them.   Otherwise
871       # extension libs cannot include those headers.
873       # Since math.h in some mingw64 wrongly declares frexp and modf
874       # to be pure, the variables pointed by the second arguments are
875       # considered uninitialized unexpectedly.
876       AC_CACHE_CHECK([whether frexp and modf are broken],
877         rb_cv_mingw64_broken_frexp_modf,
878         [
879           save_CFLAGS="$CFLAGS"
880           AS_IF([test "$particular_werror_flags" = "yes"], [
881             CFLAGS="$CFLAGS -Werror=uninitialized"
882           ], [
883             CFLAGS="$CFLAGS -Werror -Wuninitialized"
884           ])
885           AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include <math.h>
886             int foo(double x)
887             {
888               int exp;
889               frexp(x, &exp);
890               return exp;
891             }]], [[if (foo(0.0)) return 1;]])],
892             [rb_cv_mingw64_broken_frexp_modf=no],
893             [rb_cv_mingw64_broken_frexp_modf=yes])
894           CFLAGS="$save_CFLAGS"
895         ])
896       AS_IF([test "$rb_cv_mingw64_broken_frexp_modf" = yes], [
897         AC_DEFINE(RUBY_MINGW64_BROKEN_FREXP_MODF)
898       ])
899     ],
900     [cygwin*|msys*|darwin*|netbsd*], [
901       # need lgamma_r()
902     ])
904     # suppress annoying -Wstrict-overflow warnings
905     RUBY_TRY_CFLAGS(-fno-strict-overflow, [RUBY_APPEND_OPTION(XCFLAGS, -fno-strict-overflow)])
907     test "${debugflags+set}" || {RUBY_TRY_LDFLAGS(-ggdb3, [debugflags=-ggdb3])}
908     test "${debugflags+set}" || {RUBY_TRY_LDFLAGS(-ggdb, [debugflags=-ggdb])}
909     test "${debugflags+set}" || {RUBY_TRY_LDFLAGS(-g3, [debugflags=-g3])}
911 test $ac_cv_prog_cc_g = yes && : ${debugflags=-g}
913 AS_IF([test "$GCC" = ""], [
914     AS_CASE(["$target_os"],[aix*],[warnflags="$warnflags -qinfo=por" rb_cv_warnflags="$rb_cv_warnflags -qinfo=por"])
916 AS_IF([test "$GCC" = yes], [
917     RUBY_TRY_CFLAGS(-fvisibility=hidden, [visibility_option=yes], [visibility_option=no])
918     AC_SUBST(WERRORFLAG, "-Werror")
919     AS_IF([test "$visibility_option" = yes], [
920         RUBY_APPEND_OPTION(XCFLAGS, -fvisibility=hidden)
921         AC_DEFINE(RUBY_SYMBOL_EXPORT_BEGIN, [_Pragma("GCC visibility push(default)")])
922         AC_DEFINE(RUBY_SYMBOL_EXPORT_END,   [_Pragma("GCC visibility pop")])
923     ], [
924         RUBY_TRY_LDFLAGS([-Wl,-unexported_symbol,_Init_*], [visibility_option=ld], [visibility_option=no])
925     ])
928 AS_IF([test "$GCC" = yes], [
929     # optflags
931     AS_CASE(["$target_os"], [mingw*], [
932         RUBY_TRY_CFLAGS(-fno-omit-frame-pointer, [optflags="${optflags+$optflags }-fno-omit-frame-pointer"])
933         RUBY_TRY_CFLAGS(-static-libgcc, [static_libgcc=yes], [static_libgcc=no])
934         AS_IF([test "$static_libgcc" = yes], [
935             RUBY_APPEND_OPTION(EXTLDFLAGS, -static-libgcc)
936         ])
937     ])
939     # disable fast-math
940     for oflag in -fno-fast-math; do
941         RUBY_TRY_CFLAGS($oflag, [RUBY_APPEND_OPTION(optflags, $oflag)])
942     done
943     for oflag in -fexcess-precision=standard -fp-model\ precise; do
944         RUBY_TRY_CFLAGS($oflag, [RUBY_APPEND_OPTION(XCFLAGS, $oflag)])
945     done
948 AS_CASE(["$target_cpu"], [[i[3-6]86*]], [
949     AC_CACHE_CHECK([for __sync_val_compare_and_swap], [rb_cv_gcc_compiler_cas], [
950         AC_LINK_IFELSE([AC_LANG_PROGRAM([[unsigned long atomic_var;]],
951             [[__sync_val_compare_and_swap(&atomic_var, 0, 1);]])],
952             [rb_cv_gcc_compiler_cas=yes],
953             [
954             save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -march=i486"
955             AC_LINK_IFELSE([AC_LANG_PROGRAM([[unsigned long atomic_var;]],
956                 [[__sync_val_compare_and_swap(&atomic_var, 0, 1);]])],
957                 [rb_cv_gcc_compiler_cas=i486],
958                 [rb_cv_gcc_compiler_cas=no])
959             CFLAGS="$save_CFLAGS"
960             ])
961     ])
962     AS_IF([test "$rb_cv_gcc_compiler_cas" = i486], [ARCH_FLAG="-march=i486"])
965 OPT_DIR=
966 AC_ARG_WITH([gmp-dir],
967   AS_HELP_STRING([--with-gmp-dir=DIR],
968                  [specify the prefix directory where gmp is installed]),
969   [OPT_DIR="${OPT_DIR:+$OPT_DIR$PATH_SEPARATOR}$withval"], [])
970 AC_ARG_WITH([gmp],
971   [AS_HELP_STRING([--without-gmp],
972                   [disable GNU GMP to accelerate Bignum operations])],
973   [], [with_gmp=yes])
975 AC_ARG_WITH(opt-dir,
976         AS_HELP_STRING([--with-opt-dir=DIR-LIST],
977                        [add optional headers and libraries directories separated by $PATH_SEPARATOR]),
978         [OPT_DIR="${OPT_DIR:+$OPT_DIR$PATH_SEPARATOR}$withval"], [])
980 AS_IF([test "x$OPT_DIR" != x], [
981     val=`IFS="$PATH_SEPARATOR"
982         for dir in $OPT_DIR; do
983             test -z "$dir" && continue
984             echo x ${LIBPATHFLAG} ${RPATHFLAG} |
985             sed "s/^x *//;s${IFS}"'%1\\$-s'"${IFS}${dir}/lib${IFS}g;s${IFS}%s${IFS}${dir}/lib${IFS}g"
986         done | tr '\012' ' ' | sed 's/ *$//'`
987     LDFLAGS="${LDFLAGS:+$LDFLAGS }$val"
988     DLDFLAGS="${DLDFLAGS:+$DLDFLAGS }$val"
989     LDFLAGS_OPTDIR="$val"
990     INCFLAGS="${INCFLAGS:+$INCFLAGS }"`echo "$OPT_DIR" | tr "${PATH_SEPARATOR}" '\012' |
991         sed '/^$/d;s|^|-I|;s|$|/include|' | tr '\012' ' ' | sed 's/ *$//'`
993 AC_SUBST(incflags, "$INCFLAGS")
995 test -z "${ac_env_CFLAGS_set}" -a -n "${cflags+set}" && eval CFLAGS="\"$cflags $ARCH_FLAG\""
996 test -z "${ac_env_CXXFLAGS_set}" -a -n "${cxxflags+set}" && eval CXXFLAGS="\"$cxxflags $ARCH_FLAG\""
998 AC_CACHE_CHECK([whether compiler has statement and declarations in expressions],
999   rb_cv_have_stmt_and_decl_in_expr,
1000   [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]],[[ __extension__ ({ int a = 0; a; }); ]])],
1001   [rb_cv_have_stmt_and_decl_in_expr=yes],
1002   [rb_cv_have_stmt_and_decl_in_expr=no])])
1003 AS_IF([test "$rb_cv_have_stmt_and_decl_in_expr" = yes], [
1004   AC_DEFINE(HAVE_STMT_AND_DECL_IN_EXPR)
1008 [begin]_group "header and library section" && {
1009 AC_ARG_WITH(winnt-ver,
1010   AS_HELP_STRING([--with-winnt-ver=0xXXXX], [target Windows NT version (default to 0x0600)]),
1011   [with_winnt_ver="$withval"], [with_winnt_ver="0x0600"])
1012 AS_CASE(["$target_os"],
1013 [mingw*], [
1014   RUBY_APPEND_OPTION(CPPFLAGS, -D_WIN32_WINNT=$with_winnt_ver)
1015   RUBY_APPEND_OPTION(CPPFLAGS, -D__MINGW_USE_VC2005_COMPAT)
1018 RUBY_THREAD
1020 dnl Checks for libraries.
1021 AS_CASE(["$target_os"],[*bsd*|dragonfly*],[],[ac_cv_func_daemon=no])
1023 AS_CASE(["$target_os"], [*android*], [
1024         AS_CASE(["$target_cpu"], [arm*], [
1025                 ac_cv_func___builtin_setjmp=no
1026         ])
1029 AS_UNSET(ORIG_LIBS)
1030 POSTLINK=:
1031 AC_SUBST(POSTLINK)
1032 cleanlibs=
1033 AC_SUBST(cleanlibs)
1034 AS_CASE(["$target_os"],
1035 [nextstep*], [  ],
1036 [openstep*], [  ],
1037 [rhapsody*], [  ],
1038 [darwin*], [
1039                 ORIG_LIBS="$LIBS"
1040                 RUBY_PREPEND_OPTION(LIBS, -lobjc)
1041                 RUBY_APPEND_OPTIONS(CPPFLAGS, -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT)
1042                 AC_CACHE_CHECK([whether syscall(2) is deprecated], rb_cv_syscall_deprecated,
1043                     [RUBY_WERROR_FLAG([
1044                         AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include <unistd.h>]],
1045                                                            [[if (syscall(0)) return 1;]])],
1046                             [rb_cv_syscall_deprecated=no],
1047                             [rb_cv_syscall_deprecated=yes])])])
1048                 AS_IF([test $rb_cv_syscall_deprecated = yes], [
1049                     ac_cv_func___syscall=no
1050                     ac_cv_func_syscall=no
1051                     ac_cv_header_sys_syscall_h=no
1052                     ac_cv_header_syscall_h=no
1053                 ])
1054                 ac_cv_func_getcontext=no
1055                 ac_cv_func_setcontext=no
1056                 ac_cv_type_getgroups=gid_t # getgroups() on Rosetta fills garbage
1057                 ac_cv_lib_crypt_crypt=no
1058                 ac_cv_func_fdatasync=no # Mac OS X wrongly reports it has fdatasync()
1059                 ac_cv_func_vfork=no
1060                 AS_IF([test $gcc_major -eq 4 -a $gcc_minor -lt 3], [
1061                     ac_cv_func___builtin_setjmp=no
1062                 ])
1063                 with_setjmp_type=sigsetjmp # to hijack SIGCHLD handler
1064                 AC_CACHE_CHECK(for broken crypt with 8bit chars, rb_cv_broken_crypt,
1065                     [AC_RUN_IFELSE([AC_LANG_SOURCE([[
1066 #include <stdio.h>
1067 #include <unistd.h>
1068 #include <string.h>
1070 void
1071 broken_crypt(const char *salt, const char *buf1, const char *buf2)
1073 #if 0
1074     printf("%.2x%.2x: %s -> %s\n", (unsigned char)salt[0], (unsigned char)salt[1],
1075            buf1+2, buf2+2);
1076 #endif
1080 main()
1082     int i;
1083     char salt[2], buf[256], *s;
1084     for (i = 0; i < 128*128; i++) {
1085         salt[0] = 0x80 | (i & 0x7f);
1086         salt[1] = 0x80 | (i >> 7);
1087         strcpy(buf, crypt("", salt));
1088         if (strcmp(buf, s = crypt("", salt))) {
1089             broken_crypt(salt, buf, s);
1090             return 1;
1091         }
1092     }
1093     salt[0] = salt[1] = ' ';
1094     strcpy(buf, crypt("", salt));
1095     salt[0] = salt[1] = 0x80 | ' ';
1096     if (strcmp(buf, s = crypt("", salt))) {
1097         broken_crypt(salt, buf, s);
1098         return 1;
1099     }
1100     return 0;
1102 ]])],
1103                     rb_cv_broken_crypt=no,
1104                     rb_cv_broken_crypt=yes,
1105                     rb_cv_broken_crypt=yes)])
1106                 AS_IF([test "$rb_cv_broken_crypt" = yes], [
1107                    AC_DEFINE(BROKEN_CRYPT, 1)
1108                 ])
1109                 POSTLINK=""
1110                 AC_CHECK_PROGS(codesign, codesign)
1111                 dsymutils=
1112                 AS_CASE("$CC_NO_WRAPPER", [gcc*-1[[3-9]]], [
1113                     dsymutils=${CC_NO_WRAPPER@%:@gcc}
1114                     dsymutils=dsymutil${dsymutils%-1*}
1115                     dsymutils="$dsymutils-19 $dsymutils-18 $dsymutils-17"
1116                 ])
1117                 AC_CHECK_PROGS(dsymutil, $dsymutils dsymutil)
1118                 AS_IF([test -n "$codesign"], [
1119                     POSTLINK="{ test -z '\$(RUBY_CODESIGN)' || $codesign -s '\$(RUBY_CODESIGN)' \$@; }${POSTLINK:+; $POSTLINK}"
1120                 ])
1121                 AS_IF([test -n "$dsymutil"], [
1122                     POSTLINK="$dsymutil \$@ 2>/dev/null${POSTLINK:+; $POSTLINK}"
1123                 ])
1124                 AC_CHECK_HEADERS(crt_externs.h, [], [], [
1125                     #include <crt_externs.h>
1126                 ])
1127                 cleanlibs='$(TARGET_SO:=.dSYM)'
1128                 ],
1129 [solaris*], [   LIBS="-lm $LIBS"
1130                 ac_cv_func_vfork=no
1131                 AC_MSG_CHECKING(whether _XOPEN_SOURCE is already given)
1132                 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <unistd.h>
1133                         #ifndef _XOPEN_SOURCE
1134                         #error _XOPEN_SOURCE is not defined
1135                         #endif
1136                         ]], [[]])],
1137                         [given_xopen_source=yes], [given_xopen_source=no])
1138                 AC_MSG_RESULT($given_xopen_source)
1139                 AS_IF([test $given_xopen_source = no], [
1140                   AC_MSG_CHECKING(appropriate _XOPEN_SOURCE value to define)
1141                   define_xopen_source=""
1142                   for tmp_xpg in 7 6 5; do
1143                     AS_IF([test x"$define_xopen_source" != x], [
1144                       break
1145                     ])
1146                     RUBY_WERROR_FLAG([AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
1147                         #define _XOPEN_SOURCE ${tmp_xpg}00
1148                         #include <unistd.h>
1149                         #ifndef _XPG${tmp_xpg}
1150                         #error _XPG${tmp_xpg} should be defined by _XOPEN_SOURCE=${tmp_xpg}00
1151                         #endif
1152                         ]], [[]])],
1153                         [define_xopen_source=${tmp_xpg}00], [])
1154                         ])
1155                   done
1156                   AS_IF([test x"$define_xopen_source" = x], [
1157                     define_xopen_source=no
1158                   ])
1159                   AC_MSG_RESULT($define_xopen_source)
1160                   AS_IF([test x"$define_xopen_source" != xno], [
1161                     RUBY_APPEND_OPTIONS(CPPFLAGS, -D_XOPEN_SOURCE=$define_xopen_source)
1162                     # _XOPEN_SOURCE should not be defined for C++ on Solaris.
1163                     RUBY_APPEND_OPTIONS(CXXFLAGS, -U_XOPEN_SOURCE)
1164                   ])
1165                 ])
1166                 AC_CHECK_TYPES([caddr_t],[],[],[@%:@include <sys/types.h>])
1167                 AC_CACHE_CHECK([whether madvise declaration is needed], rb_cv_madvice_prototype_using_caddr_t,
1168                   [RUBY_WERROR_FLAG([AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
1169                     @%:@include <sys/unistd.h>
1170                     @%:@include <sys/mman.h>
1171                     @%:@include <sys/types.h>
1172                     extern int madvise(caddr_t, size_t, int);
1173                     ]], [[]])],
1174                     [rb_cv_madvice_prototype_using_caddr_t=yes], [rb_cv_madvice_prototype_using_caddr_t=no])
1175                   ])
1176                 ])
1177                 AS_IF([test $rb_cv_madvice_prototype_using_caddr_t = yes], [AC_DEFINE(NEED_MADVICE_PROTOTYPE_USING_CADDR_T, 1)])
1178                 ],
1179 [haiku*], [
1180                 LIBS="$LIBS" # m lib is include in root
1181                 ],
1182 [cygwin*|msys*], [
1183                 ac_cv_header_langinfo_h=yes
1184                 RUBY_APPEND_OPTIONS(CPPFLAGS, -D_XOPEN_SOURCE -D_GNU_SOURCE)
1185                 AC_CHECK_FUNCS(cygwin_conv_path)
1186                 AC_LIBOBJ([langinfo])
1187                 ],
1188 [mingw*], [     LIBS="-lshell32 -lws2_32 -liphlpapi -limagehlp -lshlwapi -lbcrypt $LIBS"
1189                 ac_cv_header_pwd_h=no
1190                 ac_cv_header_utime_h=no
1191                 ac_cv_header_sys_ioctl_h=no
1192                 ac_cv_header_sys_param_h=no
1193                 ac_cv_header_sys_resource_h=no
1194                 ac_cv_header_sys_select_h=no
1195                 ac_cv_header_sys_time_h=no
1196                 ac_cv_header_sys_times_h=no
1197                 ac_cv_header_sys_socket_h=no
1198                 ac_cv_func_execv=yes
1199                 ac_cv_func_lstat=yes
1200                 ac_cv_func_times=yes
1201                 ac_cv_func_waitpid=yes
1202                 ac_cv_func_fsync=yes
1203                 ac_cv_func_seekdir=yes
1204                 ac_cv_func_telldir=yes
1205                 ac_cv_func_lchown=yes
1206                 ac_cv_func_link=yes
1207                 ac_cv_func_readlink=yes
1208                 ac_cv_func_shutdown=yes
1209                 ac_cv_func_symlink=yes
1210                 ac_cv_lib_crypt_crypt=no
1211                 ac_cv_func_getpgrp_void=no
1212                 ac_cv_func_memcmp_working=yes
1213                 ac_cv_lib_dl_dlopen=no
1214                 rb_cv_negative_time_t=yes
1215                 ac_cv_func_fcntl=yes
1216                 ac_cv_func_flock=yes
1217                 ac_cv_func_gmtime_r=yes
1218                 rb_cv_large_fd_select=yes
1219                 ac_cv_type_struct_timeval=yes
1220                 ac_cv_func_clock_gettime=yes
1221                 ac_cv_func_clock_getres=yes
1222                 ac_cv_func_malloc_usable_size=no
1223                 ac_cv_type_off_t=yes
1224                 ac_cv_sizeof_off_t=8
1225                 AS_IF([test "$target_cpu" = x64], [
1226                     ac_cv_func___builtin_setjmp=yes
1227                     ac_cv_func_round=no
1228                 ])
1229                 ac_cv_func_tgamma=no
1230                 AC_CHECK_TYPE([NET_LUID], [], [],
1231                               [@%:@include <winsock2.h>
1232                               @%:@include <iphlpapi.h>])
1233                 AS_IF([test x"$ac_cv_type_NET_LUID" = xyes], [
1234                     AC_DEFINE(HAVE_TYPE_NET_LUID, 1)
1235                 ])
1236                 AC_CHECK_FUNCS(_gmtime64_s)
1237                 AC_CHECK_FUNCS(_wfreopen_s)
1238                 AC_LIBOBJ([langinfo])
1239                 ],
1240 [bsdi*], [      LIBS="-lm $LIBS"
1241                 AC_DEFINE(BROKEN_SETREUID, 1)
1242                 AC_DEFINE(BROKEN_SETREGID, 1)
1243                 ac_cv_sizeof_rlim_t=8],
1244 [freebsd*], [   LIBS="-lm $LIBS"
1245                 ac_cv_func_getpeername=no
1246                 ac_cv_func_getsockname=no
1247                 ac_cv_func_shutdown=no
1248                 ac_cv_func_close=no
1249                 ],
1250 [netbsd*], [    LIBS="-lm $LIBS"
1251                 ],
1252 [dragonfly*], [ LIBS="-lm $LIBS"
1253                 ],
1254 [aix*],[        LIBS="-lm $LIBS"
1255                 ac_cv_func_round=no
1256                 ac_cv_func___builtin_setjmp=no
1257                 ],
1258 [linux*],[      LIBS="-lm $LIBS"
1259                 # __builtin_longjmp in ppc64* Linux does not restore
1260                 # the TOC register (r2), which is problematic
1261                 # when a global exit happens from JITted .so code.
1262                 # __builtin_setjmp can have issues on arm64 linux (see [Bug #14480]).
1263                 AS_CASE(["$target_cpu"], [powerpc64*|arm64|aarch64], [
1264                         ac_cv_func___builtin_setjmp=no
1265                 ])
1266                 # With gcc-8's -fcf-protection, RJIT's __builtin_longjmp fails.
1267                 AS_CASE(["$CC $CFLAGS "], [*" -fcf-protection "*], [cf_protection=yes], [cf_protection=no])
1268                 AS_IF([test "$cf_protection" = yes], [
1269                         ac_cv_func___builtin_setjmp=no
1270                 ])
1271                 ],
1272 [emscripten*], [LIBS="-lm -lc $LIBS"
1273                 RUBY_APPEND_OPTIONS(LDFLAGS, "-sALLOW_MEMORY_GROWTH=1")
1274                 RUBY_APPEND_OPTIONS(LDFLAGS, "-sASYNCIFY")
1275                 RUBY_APPEND_OPTIONS(LDFLAGS, "-sFORCE_FILESYSTEM=1")
1276                 ac_cv_func_shutdown=no
1277                 ],
1278 [wasi*],[       LIBS="-lm -lwasi-emulated-mman -lwasi-emulated-signal -lwasi-emulated-getpid -lwasi-emulated-process-clocks $LIBS"
1279                 RUBY_APPEND_OPTIONS(CFLAGS, -D_WASI_EMULATED_SIGNAL -D_WASI_EMULATED_MMAN -D_WASI_EMULATED_GETPID -D_WASI_EMULATED_PROCESS_CLOCKS)
1280                 RUBY_APPEND_OPTIONS(CPPFLAGS, -D_WASI_EMULATED_SIGNAL -D_WASI_EMULATED_MMAN -D_WASI_EMULATED_GETPID -D_WASI_EMULATED_PROCESS_CLOCKS)
1281                 POSTLINK="\$(WASMOPT) --asyncify \$(wasmoptflags) -o \$@ \$@${POSTLINK:+; $POSTLINK}"
1282                 # wasi-libc's sys/socket.h is not compatible with -std=gnu99,
1283                 # so re-declare shutdown in include/ruby/missing.h
1284                 ac_cv_func_shutdown=no
1285                 ],
1286 [       LIBS="-lm $LIBS"])
1287 : ${ORIG_LIBS=$LIBS}
1289 AS_IF([test -n "${POSTLINK}"], [
1290     # NOTE: A (part of) link commands used link shared extension libraries. If
1291     # the first line of the value is empty, mkmf prepends default link steps.
1292     LINK_SO="$LINK_SO
1293 \$(POSTLINK)"
1296 AS_IF([test -n "${rb_there_is_in_fact_no_gplusplus_but_autoconf_is_cheating_us}"], [
1297     AC_MSG_NOTICE([Test skipped due to lack of a C++ compiler.])
1299 [test -n "${CXX}"], [
1300     RUBY_WERROR_FLAG([
1301         AC_MSG_CHECKING([whether CXXFLAGS is valid])
1302         AC_LANG_PUSH(C++)
1303         AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include <cstdio>]], [[]])],
1304             [AC_MSG_RESULT(yes)],[
1305             AC_MSG_RESULT(no)
1306             # The message mentions CXXFLAGS, but CPPFLAGS might also affects.
1307             AC_MSG_WARN([something wrong with CXXFLAGS="$CXXFLAGS"])
1308             CXX=false
1309         ])
1310         AC_LANG_POP(C++)
1311     ])
1314 AC_CHECK_LIB(crypt, crypt)      # glibc (GNU/Linux, GNU/Hurd, GNU/kFreeBSD)
1315 AC_CHECK_LIB(dl, dlopen)        # Dynamic linking for SunOS/Solaris and SYSV
1316 AC_CHECK_LIB(socket, shutdown)  # SunOS/Solaris
1318 dnl Checks for header files.
1319 AC_HEADER_DIRENT
1320 dnl AC_HEADER_STDC has been checked in AC_USE_SYSTEM_EXTENSIONS
1321 AC_HEADER_STDBOOL
1322 AC_HEADER_SYS_WAIT
1324 AC_CHECK_HEADERS([afunix.h], [], [],
1325 [#ifdef _WIN32
1326 # include <winsock2.h>
1327 #endif
1329 AC_CHECK_HEADERS(atomic.h)
1330 AC_CHECK_HEADERS(copyfile.h)
1331 AC_CHECK_HEADERS(direct.h)
1332 AC_CHECK_HEADERS(grp.h)
1333 AC_CHECK_HEADERS(fcntl.h)
1334 AC_CHECK_HEADERS(float.h)
1335 AC_CHECK_HEADERS(ieeefp.h)
1336 AC_CHECK_HEADERS(intrinsics.h)
1337 AC_CHECK_HEADERS(langinfo.h)
1338 AC_CHECK_HEADERS(limits.h)
1339 AC_CHECK_HEADERS(locale.h)
1340 AC_CHECK_HEADERS(malloc.h)
1341 AC_CHECK_HEADERS(malloc/malloc.h)
1342 AC_CHECK_HEADERS(malloc_np.h)
1343 AC_CHECK_HEADERS(net/socket.h)
1344 AC_CHECK_HEADERS(process.h)
1345 AC_CHECK_HEADERS(pwd.h)
1346 AC_CHECK_HEADERS(sanitizer/asan_interface.h)
1347 AC_CHECK_HEADERS(sanitizer/msan_interface.h)
1348 AC_CHECK_HEADERS(setjmpex.h)
1349 AC_CHECK_HEADERS(stdalign.h)
1350 AC_CHECK_HEADERS(stdio.h)
1351 AC_CHECK_HEADERS(sys/attr.h)
1352 AC_CHECK_HEADERS(sys/eventfd.h)
1353 AC_CHECK_HEADERS(sys/fcntl.h)
1354 AC_CHECK_HEADERS(sys/file.h)
1355 AC_CHECK_HEADERS(sys/id.h)
1356 AC_CHECK_HEADERS(sys/ioctl.h)
1357 AC_CHECK_HEADERS(sys/mkdev.h)
1358 AC_CHECK_HEADERS(sys/param.h)
1359 AC_CHECK_HEADERS(sys/prctl.h)
1360 AC_CHECK_HEADERS(sys/random.h)
1361 AC_CHECK_HEADERS(sys/resource.h)
1362 AC_CHECK_HEADERS(sys/select.h)
1363 AC_CHECK_HEADERS(sys/sendfile.h)
1364 AC_CHECK_HEADERS(sys/socket.h)
1365 AC_CHECK_HEADERS(sys/syscall.h)
1366 AC_CHECK_HEADERS(sys/sysmacros.h)
1367 AC_CHECK_HEADERS(sys/time.h)
1368 AC_CHECK_HEADERS(sys/times.h)
1369 AC_CHECK_HEADERS(sys/uio.h)
1370 AC_CHECK_HEADERS(sys/utime.h)
1371 AC_CHECK_HEADERS(syscall.h)
1372 AC_CHECK_HEADERS(time.h)
1373 AC_CHECK_HEADERS(ucontext.h)
1374 AC_CHECK_HEADERS(utime.h)
1375 AC_CHECK_HEADERS(sys/epoll.h)
1376 AC_CHECK_HEADERS(sys/event.h)
1377 AC_CHECK_HEADERS(stdckdint.h)
1379 AS_CASE("$target_cpu", [x64|x86_64|i[3-6]86*], [
1380   AC_CHECK_HEADERS(x86intrin.h)
1382 RUBY_UNIVERSAL_CHECK_HEADER([x86_64, i386], x86intrin.h)
1384 AS_IF([test "x$with_gmp" != xno],
1385   [RUBY_CHECK_HEADER(gmp.h)
1386    AS_IF([test "x$ac_cv_header_gmp_h" != xno],
1387      AC_SEARCH_LIBS([__gmpz_init], [gmp],
1388        [AC_DEFINE(HAVE_LIBGMP, 1)]))])
1390 AC_ARG_WITH([jemalloc],
1391   [AS_HELP_STRING([--with-jemalloc],[use jemalloc allocator])],
1392   [with_jemalloc=$withval], [with_jemalloc=no])
1393 AS_IF([test "x$with_jemalloc" != xno],[
1394   # find jemalloc header first
1395   save_CPPFLAGS="${CPPFLAGS}"
1396   CPPFLAGS="${INCFLAGS} ${CPPFLAGS}"
1397   malloc_header=
1398   AC_CHECK_HEADER(jemalloc/jemalloc.h, [malloc_header=jemalloc/jemalloc.h], [
1399     AC_CHECK_HEADER(jemalloc.h, [malloc_header=jemalloc.h])
1400   ])
1401   AS_IF([test "$malloc_header" != ""], [
1402     AC_DEFINE_UNQUOTED(RUBY_ALTERNATIVE_MALLOC_HEADER, [<$malloc_header>])
1403   ])
1404   save_LIBS="$LIBS"
1405   AC_CACHE_CHECK([for jemalloc library], rb_cv_jemalloc_library, [
1406     rb_cv_jemalloc_library=no
1407     # try [with mangle, without mangle] x [no more additional
1408     # libraries, adding jemalloc] combination, using the jemalloc
1409     # header found above.
1410     for mangle in '' mangle; do
1411       for lib in '' -ljemalloc; do
1412         LIBS="${lib:+$lib }$LIBS"
1413         AC_LINK_IFELSE([AC_LANG_PROGRAM([${mangle:+@%:@define JEMALLOC_MANGLE 1}
1414           @%:@include <stdio.h>
1415           @%:@ifdef RUBY_ALTERNATIVE_MALLOC_HEADER
1416           @%:@include RUBY_ALTERNATIVE_MALLOC_HEADER
1417           @%:@else
1418           extern const char *malloc_conf;
1419           @%:@endif],
1420           [/* access at runtime not to be optimized away */
1421           if (malloc_conf) printf("malloc_conf=%s\n", malloc_conf);])],
1422           [rb_cv_jemalloc_library="${lib:-none required}${mangle:+ with mangle}"])
1423         LIBS="$save_LIBS"
1424         test "${rb_cv_jemalloc_library}" = no || break 2
1425       done
1426     done
1427   ])
1428   CPPFLAGS="${save_CPPFLAGS}"
1429   unset save_CPPFLAGS
1430   with_jemalloc=${rb_cv_jemalloc_library}
1431   AS_CASE(["$with_jemalloc"],
1432   [no],
1433     [AC_MSG_ERROR([jemalloc requested but not found])],
1434   [-l*], [
1435     set dummy $with_jemalloc
1436     LIBS="$2 $LIBS"
1437     DLDLIBS="$2${DLDLIBS:+ $DLDLIBS}" # probably needed also in extension libraries
1438   ])
1439   AS_CASE(["$with_jemalloc"],
1440   [*" with mangle"], [
1441     AC_DEFINE(JEMALLOC_MANGLE)
1442   ])
1443   AC_DEFINE(HAVE_MALLOC_CONF)
1444   ac_cv_func_malloc_usable_size=yes
1445 ]) # with_jemalloc
1447 dnl check for large file stuff
1448 mv confdefs.h confdefs1.h
1449 : > confdefs.h
1450 AC_SYS_LARGEFILE
1451 # On 32-bit Solaris, it is safe to define _LARGEFILE_SOURCE
1452 # which is not added by AC_SYS_LARGEFILE.
1453 AS_IF([test x"$enable_largefile" != xno], [
1454   AS_CASE(["$target_os"], [solaris*], [
1455     AC_MSG_CHECKING([whether _LARGEFILE_SOURCE should be defined])
1456     AS_CASE(["${ac_cv_sys_file_offset_bits}:${ac_cv_sys_large_files}"],
1457       ["64:"|"64:no"|"64:unknown"], [
1458         # insert _LARGEFILE_SOURCE before _FILE_OFFSET_BITS line
1459         # that is the same order as "getconf LFS_CFLAGS" output
1460         mv confdefs.h largefile0.h
1461         : > confdefs.h
1462         AC_DEFINE(_LARGEFILE_SOURCE)
1463         cat largefile0.h >> confdefs.h
1464         rm largefile0.h
1465         AC_MSG_RESULT([yes])
1466       ], [AC_MSG_RESULT([no])])
1467   ])
1469 mv confdefs.h largefile.h
1470 mv confdefs1.h confdefs.h
1471 cat largefile.h >> confdefs.h
1473 AS_CASE(["$target_os"],
1474     [aix*], [
1475     AS_CASE(["$target_cpu:$ac_cv_sys_large_files"],
1476         [ppc64:*|powerpc64:*], [],
1477         [*:no|*:unknown], [],
1478         [
1479             # AIX currently does not support a 32-bit call to posix_fadvise()
1480             # if _LARGE_FILES is defined.
1481             ac_cv_func_posix_fadvise=no
1482         ])
1483     ])
1485 AC_C_BIGENDIAN([], [], [], [AC_DEFINE(AC_APPLE_UNIVERSAL_BUILD, 1)])
1486 AC_C_CONST
1487 AC_C_CHAR_UNSIGNED
1488 AC_C_INLINE
1489 AC_C_VOLATILE
1490 AC_C_TYPEOF
1491 AC_C_RESTRICT
1493 AS_CASE(":$ac_cv_c_const:$ac_cv_c_volatile:",
1494     [*:no:*], [AC_MSG_ERROR(ANSI C-conforming const and volatile are mandatory)])
1496 AC_CHECK_TYPES([long long, off_t])
1498 AC_CACHE_CHECK([char bit], [rb_cv_char_bit],
1499     [test "$universal_binary" = yes && cross_compiling=yes
1500     AC_COMPUTE_INT([rb_cv_char_bit], [CHAR_BIT],
1501         [AC_INCLUDES_DEFAULT([@%:@include <limits.h>])], [rb_cv_char_bit=8])
1502     test "$universal_binary" = yes && cross_compiling=$real_cross_compiling])
1504 RUBY_CHECK_SIZEOF(int, [], [ILP])
1505 RUBY_CHECK_SIZEOF(short)
1506 RUBY_CHECK_SIZEOF(long, [int], [ILP LP])
1507 RUBY_CHECK_SIZEOF(long long)
1508 RUBY_CHECK_SIZEOF(__int64, [8], [ILP LP])
1509 RUBY_CHECK_SIZEOF(__int128, [16], [ILP LP])
1510 RUBY_CHECK_SIZEOF(off_t)
1511 RUBY_CHECK_SIZEOF(void*, [int long "long long"], [ILP LP LLP])
1512 RUBY_CHECK_SIZEOF(float)
1513 RUBY_CHECK_SIZEOF(double)
1514 RUBY_CHECK_SIZEOF(time_t, [long "long long"], [], [@%:@include <time.h>])
1515 RUBY_CHECK_SIZEOF(clock_t, [], [], [@%:@include <time.h>])
1516 AC_SUBST(X_BUILTIN_BINARY, yes)
1517 AS_IF([test "$cross_compiling" = yes],
1518 [dnl miniruby cannot run if cross compiling
1519     X_BUILTIN_BINARY=no
1522     AS_CASE([ac_cv_sizeof_voidp],
1523     [[1-9]*], [dnl fixed value
1524     ],
1525     [
1526         AC_CACHE_CHECK([word size], [rb_cv_word_size],
1527             [for w in 4 8; do
1528                 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@if SIZEOF_VOIDP != ${w}
1529                 @%:@error SIZEOF_VOIDP
1530                 @%:@endif]])], [rb_cv_word_size=${w}; break])
1531             done])
1532         AS_IF([test -z $rb_cv_word_size], [X_BUILTIN_BINARY=no])
1533     ])
1536 AC_CACHE_CHECK(packed struct attribute, rb_cv_packed_struct,
1537     [rb_cv_packed_struct=no
1538     for mac in \
1539         "__pragma(pack(push, 1)) x __pragma(pack(pop))" \
1540         "x __attribute__((packed))" \
1541         ; do
1542         AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@define PACKED_STRUCT(x) $mac
1543                         PACKED_STRUCT(struct { int a; });]], [[]])],
1544                 [rb_cv_packed_struct=$mac; break])
1545     done])
1546 AS_IF([test "$rb_cv_packed_struct" != no], [
1547     AC_DEFINE_UNQUOTED([RBIMPL_ATTR_PACKED_STRUCT_BEGIN()], [`echo " $rb_cv_packed_struct " | sed 's/ x .*//;s/^ *//'`])
1548     AC_DEFINE_UNQUOTED([RBIMPL_ATTR_PACKED_STRUCT_END()], [`echo " $rb_cv_packed_struct " | sed 's/.* x //;s/ *$//'`])
1549     RUBY_TRY_CFLAGS(-Wno-address-of-packed-member, [AC_DEFINE(USE_UNALIGNED_MEMBER_ACCESS)])
1552 AS_IF([test "x$ac_cv_type_long_long" = xyes], [
1553     RUBY_CHECK_PRINTF_PREFIX(long long, ll I64, LL)
1554 ], [test "x$ac_cv_type___int64" = xyes], [
1555     RUBY_CHECK_PRINTF_PREFIX(__int64, ll I64, LL)
1558 RUBY_REPLACE_TYPE(pid_t, int, PIDT)
1559 RUBY_REPLACE_TYPE(uid_t, int, UIDT)
1560 RUBY_REPLACE_TYPE(gid_t, int, GIDT)
1561 RUBY_REPLACE_TYPE(time_t, [], TIMET, [@%:@include <time.h>])
1562 RUBY_REPLACE_TYPE(dev_t, [int long "long long"], DEVT)
1563 RUBY_REPLACE_TYPE(mode_t, ["unsigned short" "unsigned int" long], MODET, [@%:@include <sys/stat.h>])
1564 RUBY_REPLACE_TYPE(rlim_t, [int long "long long"], RLIM, [
1565 @%:@ifdef HAVE_SYS_TYPES_H
1566 @%:@include <sys/types.h>
1567 @%:@endif
1568 @%:@ifdef HAVE_SYS_TYPES_H
1569 @%:@include <sys/time.h>
1570 @%:@endif
1571 @%:@include <sys/resource.h>
1573 RUBY_REPLACE_TYPE(off_t, [], OFFT)
1574 RUBY_REPLACE_TYPE(clockid_t, [], CLOCKID, [@%:@ifdef HAVE_TIME_H
1575 @%:@ include <time.h>
1576 @%:@endif
1577 @%:@ifdef HAVE_SYS_TIME_H
1578 @%:@ include <sys/time.h>
1579 @%:@endif])
1581 # __VA_ARGS__ is also tested in AC_PROG_CC_C99 since autoconf 2.60a (around
1582 # 2006). The check below is redundant and should always success.  Remain not
1583 # deleted for backward compat.
1584 AC_CACHE_CHECK(for variable length macro, rb_cv_va_args_macro,
1585   [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
1586 int foo(const char*);
1587 @%:@define FOO(...) foo(@%:@__VA_ARGS__)
1588 ]], [[FOO(1);FOO(1,2);FOO(1,2,3);]])],
1589   rb_cv_va_args_macro=yes,
1590   rb_cv_va_args_macro=no)])
1591 AS_IF([test "$rb_cv_va_args_macro" = yes], [
1592   AC_DEFINE(HAVE_VA_ARGS_MACRO)
1595 # We want C11's  `_Alignof`.  GCC (and alike) have  `__alignof__`, which behave
1596 # slightly differently  than the  C11's.  We cannot  use `__alignof__`  for our
1597 # purpose.   The problem  is, however,  that  old gcc  and old  clang had  both
1598 # implemented `_Alignof` as  a synonym of `__alignof__`.  They are  not what we
1599 # want.  We have to check sanity.
1601 # See also: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=52023
1602 # See also: https://bugs.llvm.org/show_bug.cgi?id=26547
1603 AC_CACHE_CHECK([if _Alignof() works], rb_cv_have__alignof,[
1604     rb_cv_have__alignof=no
1605     RUBY_WERROR_FLAG([
1606         AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
1607             @%:@ifdef HAVE_STDALIGN_H
1608             @%:@include <stdalign.h>
1609             @%:@endif
1610             @%:@ifdef STDC_HEADERS
1611             @%:@include <stddef.h>
1612             @%:@endif
1613             @%:@ifndef __GNUC__
1614             @%:@define __extension__
1615             @%:@endif
1616         ]], [[
1617             typedef struct conftest_tag {
1618                 char _;
1619                 double d;
1620             } T;
1621             static int conftest_ary@<:@
1622                 offsetof(T, d) == __extension__ _Alignof(double)
1623                 ? 1 : -1
1624             @:>@;
1625             return conftest_ary@<:@0@:>@;
1626         ]])],[
1627             rb_cv_have__alignof=yes
1628         ],[])
1629     ])
1631 AS_IF([test "$rb_cv_have__alignof" != no], [
1632     AC_DEFINE(HAVE__ALIGNOF)
1635 RUBY_FUNC_ATTRIBUTE(__const__, CONSTFUNC)
1636 RUBY_FUNC_ATTRIBUTE(__pure__, PUREFUNC)
1637 RUBY_FUNC_ATTRIBUTE(__noreturn__, NORETURN)
1638 RUBY_FUNC_ATTRIBUTE(__deprecated__, DEPRECATED)
1639 RUBY_FUNC_ATTRIBUTE(__deprecated__("by "@%:@n), DEPRECATED_BY(n,x), rb_cv_func_deprecated_by)
1640 RUBY_FUNC_ATTRIBUTE(__noinline__, NOINLINE)
1641 RUBY_FUNC_ATTRIBUTE(__always_inline__, ALWAYS_INLINE)
1642 RUBY_FUNC_ATTRIBUTE(__no_sanitize__(san), NO_SANITIZE(san, x), rb_cv_func_no_sanitize)
1643 RUBY_FUNC_ATTRIBUTE(__no_sanitize_address__, NO_SANITIZE_ADDRESS)
1644 RUBY_FUNC_ATTRIBUTE(__no_address_safety_analysis__, NO_ADDRESS_SAFETY_ANALYSIS)
1645 RUBY_FUNC_ATTRIBUTE(__warn_unused_result__, WARN_UNUSED_RESULT)
1646 RUBY_FUNC_ATTRIBUTE(__unused__, MAYBE_UNUSED)
1647 RUBY_FUNC_ATTRIBUTE(__error__ mesg, ERRORFUNC(mesg,x), rb_cv_func___error__)
1648 RUBY_FUNC_ATTRIBUTE(__warning__ mesg, WARNINGFUNC(mesg,x), rb_cv_func___warning__)
1649 RUBY_FUNC_ATTRIBUTE(__weak__, WEAK, rb_cv_func_weak)
1650 AS_IF([test "$rb_cv_func_weak" != x], [
1651    AC_DEFINE(HAVE_FUNC_WEAK)
1654 AC_CACHE_CHECK([for __attribute__((__depreacted__(msg))) in C++],
1655   rb_cv_CentOS6_CXX_workaround,
1656   RUBY_WERROR_FLAG([
1657     AC_LANG_PUSH([C++])
1658     AC_COMPILE_IFELSE(
1659       [AC_LANG_PROGRAM(
1660         [],
1661         [__attribute__((__deprecated__("message"))) int conftest(...);])],
1662       [rb_cv_CentOS6_CXX_workaround=yes],
1663       [rb_cv_CentOS6_CXX_workaround=no])
1664     AC_LANG_POP()]))
1665 AS_IF([test "$rb_cv_CentOS6_CXX_workaround" != no],[
1666   AC_DEFINE([RUBY_CXX_DEPRECATED(msg)],
1667     [__attribute__((__deprecated__(msg)))])])
1669 AC_CACHE_CHECK([for std::nullptr_t], rb_cv_CXX_nullptr, [
1670   AC_LANG_PUSH([C++])
1671   AC_COMPILE_IFELSE(
1672     [AC_LANG_PROGRAM(
1673       [@%:@include <cstddef>],
1674       [static std::nullptr_t const *const conftest = nullptr;])],
1675     [rb_cv_CXX_nullptr=yes],
1676     [rb_cv_CXX_nullptr=no])
1677   AC_LANG_POP()])
1678 AS_IF([test "$rb_cv_CXX_nullptr" != no],[AC_DEFINE(HAVE_NULLPTR)])
1680 if_i386=${universal_binary+[defined __i386__]}
1681 RUBY_FUNC_ATTRIBUTE(__stdcall__,  FUNC_STDCALL,  rb_cv_func_stdcall,  ${if_i386})
1682 RUBY_FUNC_ATTRIBUTE(__cdecl__,    FUNC_CDECL,    rb_cv_func_cdecl,    ${if_i386})
1683 RUBY_FUNC_ATTRIBUTE(__fastcall__, FUNC_FASTCALL, rb_cv_func_fastcall, ${if_i386})
1684 RUBY_FUNC_ATTRIBUTE(__optimize__("O0"), FUNC_UNOPTIMIZED, rb_cv_func_unoptimized)
1685 RUBY_FUNC_ATTRIBUTE(__optimize__("-Os","-fomit-frame-pointer"), FUNC_MINIMIZED, rb_cv_func_minimized)
1687 AS_IF([test "$GCC" = yes], [
1688     AC_CACHE_CHECK([for function alias], [rb_cv_gcc_function_alias],
1689         [rb_cv_gcc_function_alias=no
1690         for a in alias weak,alias; do
1691             AC_LINK_IFELSE([AC_LANG_PROGRAM([[void foo(void) {}
1692                 void bar(void) __attribute__(($a("foo")));]], [[bar()]])],
1693                 [rb_cv_gcc_function_alias=$a; break])
1694         done])
1695     AS_IF([test "$rb_cv_gcc_function_alias" != no], [
1696         AC_DEFINE(HAVE_ATTRIBUTE_FUNCTION_ALIAS)
1697         AC_DEFINE_UNQUOTED([RUBY_ALIAS_FUNCTION_TYPE(type, prot, name, args)],
1698                            [type prot __attribute__(($rb_cv_gcc_function_alias(@%:@name)));])
1699         AC_DEFINE_UNQUOTED([RUBY_ALIAS_FUNCTION_VOID(prot, name, args)],
1700                            [RUBY_ALIAS_FUNCTION_TYPE(void, prot, name, args)])
1701     ])
1705     AC_CACHE_CHECK([for __atomic builtins], [rb_cv_gcc_atomic_builtins], [
1706         AC_LINK_IFELSE([AC_LANG_PROGRAM([[unsigned int atomic_var;]],
1707                     [[
1708                         __atomic_exchange_n(&atomic_var, 0, __ATOMIC_SEQ_CST);
1709                         __atomic_exchange_n(&atomic_var, 1, __ATOMIC_SEQ_CST);
1710                         __atomic_fetch_add(&atomic_var, 1, __ATOMIC_SEQ_CST);
1711                         __atomic_fetch_sub(&atomic_var, 1, __ATOMIC_SEQ_CST);
1712                         __atomic_or_fetch(&atomic_var, 1, __ATOMIC_SEQ_CST);
1713                     ]])],
1714                     [rb_cv_gcc_atomic_builtins=yes],
1715                     [rb_cv_gcc_atomic_builtins=no])])
1716     AS_IF([test "$rb_cv_gcc_atomic_builtins" = yes], [
1717         AC_DEFINE(HAVE_GCC_ATOMIC_BUILTINS)
1718     ])
1720     AC_CACHE_CHECK([for __sync builtins], [rb_cv_gcc_sync_builtins], [
1721         AC_LINK_IFELSE([AC_LANG_PROGRAM([[unsigned int atomic_var;]],
1722                     [[
1723                         __sync_lock_test_and_set(&atomic_var, 0);
1724                         __sync_lock_test_and_set(&atomic_var, 1);
1725                         __sync_fetch_and_add(&atomic_var, 1);
1726                         __sync_fetch_and_sub(&atomic_var, 1);
1727                         __sync_or_and_fetch(&atomic_var, 1);
1728                         __sync_val_compare_and_swap(&atomic_var, 0, 1);
1729                     ]])],
1730                     [rb_cv_gcc_sync_builtins=yes],
1731                     [rb_cv_gcc_sync_builtins=no])])
1732     AS_IF([test "$rb_cv_gcc_sync_builtins" = yes], [
1733         AC_DEFINE(HAVE_GCC_SYNC_BUILTINS)
1734     ])
1736     AC_CACHE_CHECK(for __builtin_unreachable, rb_cv_func___builtin_unreachable,
1737     [RUBY_WERROR_FLAG(
1738     [AC_LINK_IFELSE([AC_LANG_PROGRAM([[volatile int zero;]],
1739         [[if (zero) __builtin_unreachable();]])],
1740         [rb_cv_func___builtin_unreachable=yes],
1741         [rb_cv_func___builtin_unreachable=no])
1742     ])
1743     ])
1744     AS_IF([test "$rb_cv_func___builtin_unreachable" = yes], [
1745         AC_DEFINE(HAVE___BUILTIN_UNREACHABLE)
1746     ])
1748     AC_CACHE_CHECK(for __assume, rb_cv_func___assume,
1749     [RUBY_WERROR_FLAG([
1750         AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],
1751             [[__assume(1);]])],
1752             [rb_cv_func___assume=yes],
1753             [rb_cv_func___assume=no])
1754     ])
1755     ])
1756     AS_IF([test "$rb_cv_func___assume" = yes], [
1757         AC_DEFINE(HAVE___ASSUME)
1758     ])
1761 AC_CACHE_CHECK(for exported function attribute, rb_cv_func_exported, [
1762 rb_cv_func_exported=no
1763 RUBY_WERROR_FLAG([
1764 for mac in '__attribute__ ((__visibility__("default")))' '__declspec(dllexport)'; do
1765   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@define RUBY_FUNC_EXPORTED $mac extern
1766     RUBY_FUNC_EXPORTED void conftest_attribute_check(void);]], [[]])],
1767     [rb_cv_func_exported="$mac"; break])
1768 done
1769 ])])
1770 AS_IF([test "$rb_cv_func_exported" != no], [
1771     AC_DEFINE_UNQUOTED(RUBY_FUNC_EXPORTED, [$rb_cv_func_exported extern])
1773 RUBY_DECL_ATTRIBUTE([__nonnull__(n)], [RUBY_FUNC_NONNULL(n,x)], [rb_cv_func_nonnull],
1774                     [], [function], [
1775 @%:@define x int conftest_attribute_check(void *p)
1776 @%:@define n 1
1779 RUBY_APPEND_OPTION(XCFLAGS, -DRUBY_EXPORT)
1781 AC_ARG_ENABLE(mathn,
1782     AS_HELP_STRING([--enable-mathn], [enable canonicalization for mathn]),
1783     [AC_MSG_ERROR([mathn support has been dropped])])
1785 AC_CACHE_CHECK(for function name string predefined identifier,
1786     rb_cv_function_name_string,
1787     [AS_CASE(["$target_os"],[openbsd*],[
1788       rb_cv_function_name_string=__func__
1789      ],[
1790       rb_cv_function_name_string=no
1791       RUBY_WERROR_FLAG([
1792         for func in __func__ __FUNCTION__; do
1793             AC_LINK_IFELSE([AC_LANG_PROGRAM([[@%:@include <stdio.h>]],
1794                                             [[puts($func);]])],
1795             [rb_cv_function_name_string=$func
1796             break])
1797         done
1798       ])
1799     ])]
1801 AS_IF([test "$rb_cv_function_name_string" != no], [
1802     AC_DEFINE_UNQUOTED(RUBY_FUNCTION_NAME_STRING, [$rb_cv_function_name_string])
1805 AC_CACHE_CHECK(if enum over int is allowed, rb_cv_enum_over_int, [
1806     rb_cv_enum_over_int=no
1807     AS_IF([test "x$ac_cv_type_long_long" = xyes], [
1808         type="unsigned long long" max="ULLONG_MAX"
1809     ], [
1810         type="unsigned long" max="ULONG_MAX"
1811     ])
1812     RUBY_WERROR_FLAG([
1813         AC_COMPILE_IFELSE([
1814             AC_LANG_BOOL_COMPILE_TRY([
1815                     @%:@include <limits.h>
1816                     enum {conftest_max = $max};
1817                 ], [
1818                     (conftest_max == $max) &&
1819                     (sizeof(conftest_max) == sizeof($type))
1820                 ]
1821             )],
1822             [rb_cv_enum_over_int=yes],
1823             [rb_cv_enum_over_int=no]
1824         )
1825     ])
1827 AS_IF([test $rb_cv_enum_over_int = yes], [
1828     AC_DEFINE(ENUM_OVER_INT, 1)
1831 dnl Check whether we need to define sys_nerr locally
1832 AC_CHECK_DECLS([sys_nerr], [], [], [$ac_includes_default
1833 @%:@include <errno.h>])
1835 AC_CHECK_DECLS([getenv])
1837 AS_CASE(["$target_cpu"],
1838 [alpha*|sh4|sh4el|sh4eb], [AS_CASE(["$target_os"::"$GCC"],
1839                 [*::yes],  # gcc
1840                         [CFLAGS="-mieee $CFLAGS"],
1841                 [osf*],    # ccc
1842                         [CFLAGS="-ieee $CFLAGS"],
1843                 )],
1844 [sparc*], [AC_LIBOBJ([sparc])])
1846 ac_cv_header_net_socket_h=${ac_cv_header_net_socket_h=no}
1847 AS_IF([test "$ac_cv_header_net_socket_h" = yes], [
1848     ac_cv_header_sys_socket_h=${ac_cv_header_sys_socket_h=no}
1849 ], [
1850     ac_cv_header_sys_socket_h=${ac_cv_header_sys_socket_h=yes}
1854 AC_TYPE_SIZE_T
1855 RUBY_CHECK_SIGNEDNESS(size_t, [AC_MSG_ERROR(size_t is signed)], [],
1856                       [@%:@include <sys/types.h>])
1857 RUBY_CHECK_SIZEOF(size_t, [int long void*], [], [@%:@include <sys/types.h>])
1858 RUBY_CHECK_SIZEOF(ptrdiff_t, size_t, [], [@%:@include <stddef.h>])
1859 RUBY_CHECK_SIZEOF(dev_t)
1860 RUBY_CHECK_PRINTF_PREFIX(size_t, z)
1861 RUBY_CHECK_PRINTF_PREFIX(ptrdiff_t, t)
1862 AC_CHECK_MEMBERS([struct stat.st_blksize])
1863 AC_CHECK_MEMBERS([struct stat.st_blocks])
1864 AC_CHECK_MEMBERS([struct stat.st_rdev])
1865 RUBY_CHECK_SIZEOF([struct stat.st_size], [off_t int long "long long"], [], [@%:@include <sys/stat.h>])
1866 AS_IF([test "$ac_cv_member_struct_stat_st_blocks" = yes], [
1867     RUBY_CHECK_SIZEOF([struct stat.st_blocks], [off_t int long "long long"], [], [@%:@include <sys/stat.h>])
1869 RUBY_CHECK_SIZEOF([struct stat.st_ino], [long "long long"], [], [@%:@include <sys/stat.h>])
1870 RUBY_CHECK_SIZEOF([struct stat.st_dev], [dev_t int long "long long"], [], [@%:@include <sys/stat.h>])
1871 AS_IF([test "$ac_cv_member_struct_stat_st_rdev" = yes], [
1872     RUBY_CHECK_SIZEOF([struct stat.st_rdev], [dev_t int long "long long"], [], [@%:@include <sys/stat.h>])
1874 AC_CHECK_MEMBERS([struct stat.st_atim])
1875 AC_CHECK_MEMBERS([struct stat.st_atimespec])
1876 AC_CHECK_MEMBERS([struct stat.st_atimensec])
1877 AC_CHECK_MEMBERS([struct stat.st_mtim])
1878 AC_CHECK_MEMBERS([struct stat.st_mtimespec])
1879 AC_CHECK_MEMBERS([struct stat.st_mtimensec])
1880 AC_CHECK_MEMBERS([struct stat.st_ctim])
1881 AC_CHECK_MEMBERS([struct stat.st_ctimespec])
1882 AC_CHECK_MEMBERS([struct stat.st_ctimensec])
1883 AC_CHECK_MEMBERS([struct stat.st_birthtimespec])
1884 AS_IF([test "x$ac_cv_member_struct_stat_st_birthtimespec" != xyes],
1885     [AC_CHECK_MEMBERS([struct statx.stx_btime])])
1887 AC_CHECK_TYPES([struct timeval], [], [], [@%:@ifdef HAVE_TIME_H
1888 @%:@include <time.h>
1889 @%:@endif
1890 @%:@ifdef HAVE_SYS_TIME_H
1891 @%:@include <sys/time.h>
1892 @%:@endif])
1894 AS_IF([test "${ac_cv_type_struct_timeval}" = yes], [
1895     RUBY_CHECK_SIZEOF([struct timeval.tv_sec], [time_t long "long long"], [],
1896                       [@%:@ifdef HAVE_TIME_H
1897 @%:@include <time.h>
1898 @%:@endif
1899 @%:@ifdef HAVE_SYS_TIME_H
1900 @%:@include <sys/time.h>
1901 @%:@endif])
1902     AS_CASE(${ac_cv_sizeof_struct_timeval_tv_sec},
1903             [SIZEOF_INT], [t=int],
1904             [SIZEOF_LONG], [t=long],
1905             [SIZEOF_LONG_LONG], [t=LONG_LONG],
1906             [t=])
1907     AS_IF([test "${t}" != ""], [
1908         AC_DEFINE_UNQUOTED(TYPEOF_TIMEVAL_TV_SEC, [$t])
1909     ])
1912 AC_CHECK_TYPES([struct timespec], [], [], [@%:@ifdef HAVE_TIME_H
1913 @%:@include <time.h>
1914 @%:@endif
1915 @%:@ifdef HAVE_SYS_TIME_H
1916 @%:@include <sys/time.h>
1917 @%:@endif])
1919 AC_CHECK_TYPES([struct timezone], [], [], [@%:@ifdef HAVE_TIME_H
1920 @%:@ include <time.h>
1921 @%:@endif
1922 @%:@ifdef HAVE_SYS_TIME_H
1923 @%:@ include <sys/time.h>
1924 @%:@endif])
1926 AC_CACHE_VAL([rb_cv_large_fd_select],
1927     [AC_CHECK_TYPE(fd_mask, [rb_cv_large_fd_select=yes], [rb_cv_large_fd_select=no], [AC_INCLUDES_DEFAULT([])
1928 @%:@ifdef HAVE_SYS_SELECT_H
1929 @%:@ include <sys/select.h>
1930 @%:@endif])])
1931 AS_IF([test "$rb_cv_large_fd_select" = yes], [
1932     AC_DEFINE(HAVE_RB_FD_INIT, 1)
1935 RUBY_DEFINT(int8_t, 1)
1936 RUBY_DEFINT(uint8_t, 1, unsigned)
1937 RUBY_DEFINT(int16_t, 2)
1938 RUBY_DEFINT(uint16_t, 2, unsigned)
1939 RUBY_DEFINT(int32_t, 4)
1940 RUBY_DEFINT(uint32_t, 4, unsigned)
1941 RUBY_DEFINT(int64_t, 8)
1942 RUBY_DEFINT(uint64_t, 8, unsigned)
1943 RUBY_DEFINT(int128_t, 16)
1944 RUBY_DEFINT(uint128_t, 16, unsigned)
1945 RUBY_DEFINT(intptr_t, void*)
1946 RUBY_DEFINT(uintptr_t, void*, unsigned)
1947 AS_IF([test "x$rb_cv_type_intptr_t" != xno], [
1948     RUBY_CHECK_PRINTF_PREFIX(intptr_t, '' ll I64 l, PTR)
1950 RUBY_DEFINT(ssize_t, size_t, [], [@%:@include <sys/types.h>])   dnl may differ from int, so not use AC_TYPE_SSIZE_T.
1951 AS_IF([test "x$rb_cv_type_int64_t" != xno], [
1952     RUBY_CHECK_PRINTF_PREFIX(int64_t, ll I64 l, 64)
1955 AC_CACHE_CHECK(for stack end address, rb_cv_stack_end_address,
1956 [rb_cv_stack_end_address=no
1957   AC_LINK_IFELSE([AC_LANG_PROGRAM(
1958       [[extern void *__libc_stack_end;]],
1959       [[if (!__libc_stack_end) return 1;]])],
1960     [rb_cv_stack_end_address="__libc_stack_end"])
1962 AS_IF([test $rb_cv_stack_end_address != no], [
1963   AC_DEFINE_UNQUOTED(STACK_END_ADDRESS, $rb_cv_stack_end_address)
1966 dnl Checks for library functions.
1967 AC_TYPE_GETGROUPS
1968 AS_CASE(["${target_cpu}-${target_os}:${target_archs}"],
1969 [powerpc*-darwin*], [
1970   AC_LIBSOURCES(alloca.c)
1971   AC_SUBST([ALLOCA], [\${LIBOBJDIR}alloca.${ac_objext}])
1972   AC_DEFINE(C_ALLOCA)
1973   AC_DEFINE_UNQUOTED(alloca, alloca)
1974   ],
1975 [universal-darwin*:*ppc*], [
1976   AC_LIBSOURCES(alloca.c)
1977   AC_SUBST([ALLOCA], [\${LIBOBJDIR}alloca.${ac_objext}])
1978   RUBY_DEFINE_IF([defined __POWERPC__], C_ALLOCA, 1) # Darwin defines __POWERPC__ for ppc and ppc64 both
1979   RUBY_DEFINE_IF([defined __POWERPC__], alloca, alloca)
1980   ],
1982   AC_FUNC_ALLOCA
1983   ])
1984 AS_IF([test "x$ALLOCA" = "x"], [
1985     AC_CACHE_CHECK([for dynamic size alloca], rb_cv_dynamic_alloca, [
1986     for chk in ok __chkstk; do
1987         AC_LINK_IFELSE([AC_LANG_PROGRAM([[
1988             @%:@ifdef HAVE_ALLOCA_H
1989             @%:@include <alloca.h>
1990             @%:@endif
1991             void $chk() {}
1992             int dynamic_alloca_test;
1993             int dynamic_alloca_result;]],
1994             [[dynamic_alloca_result = alloca(dynamic_alloca_test) != 0;]])],
1995             [rb_cv_dynamic_alloca=$chk; break])
1996     done])
1997     AS_IF([test "x$rb_cv_dynamic_alloca" = "x__chkstk"], [
1998         AC_DEFINE_UNQUOTED(RUBY_ALLOCA_CHKSTK, _$rb_cv_dynamic_alloca)
1999         AS_CASE("$target_cpu",
2000         [x64|x86_64], [
2001             AC_SUBST([ALLOCA], [\${LIBOBJDIR}x86_64-chkstk.${ac_objext}])
2002         ],)
2003     ])
2005 AC_FUNC_MEMCMP
2007 AS_CASE(["$target_os"],[freebsd*],[
2008          AC_DEFINE(BROKEN_CLOSE)
2009          AC_REPLACE_FUNCS(close)
2010          ])
2012 # dup and dup2 are always available except for WASI
2013 AS_CASE(["$target_os"],
2014     [wasi*], [],
2015     [
2016         RUBY_REQUIRE_FUNCS(dup dup2)
2017     ]
2020 AC_REPLACE_FUNCS(acosh)
2021 AC_REPLACE_FUNCS(cbrt)
2022 AC_REPLACE_FUNCS(crypt)
2023 AC_REPLACE_FUNCS(erf)
2024 AC_REPLACE_FUNCS(explicit_bzero)
2025 AC_REPLACE_FUNCS(ffs)
2026 AC_REPLACE_FUNCS(flock)
2027 AC_REPLACE_FUNCS(hypot)
2028 AC_REPLACE_FUNCS(lgamma_r)
2029 AC_REPLACE_FUNCS(memmove)
2030 AC_REPLACE_FUNCS(nan)
2031 AC_REPLACE_FUNCS(nextafter)
2032 AC_REPLACE_FUNCS(setproctitle)
2033 AC_REPLACE_FUNCS(strchr)
2034 AC_REPLACE_FUNCS(strerror)
2035 AC_REPLACE_FUNCS(strlcat)
2036 AC_REPLACE_FUNCS(strlcpy)
2037 AC_REPLACE_FUNCS(strstr)
2038 AC_REPLACE_FUNCS(tgamma)
2040 AC_DEFINE(HAVE_ISFINITE)        # C99; backward compatibility
2042 # for missing/setproctitle.c
2043 AS_CASE(["$target_os"],
2044 [aix* | k*bsd*-gnu | kopensolaris*-gnu | linux* | darwin*], [AC_DEFINE(SPT_TYPE,SPT_REUSEARGV)],
2046 AC_CHECK_HEADERS(sys/pstat.h)
2049 AC_DEFINE(HAVE_SIGNBIT)         # C99; backward compatibility
2051 AC_FUNC_FORK
2053 AC_CHECK_FUNCS(__syscall)
2054 AC_CHECK_FUNCS(_longjmp)                # used for AC_ARG_WITH(setjmp-type)
2055 # we don't use _setjmp if _longjmp doesn't exist.
2056 test x$ac_cv_func__longjmp = xno && ac_cv_func__setjmp=no
2057 AC_CHECK_FUNCS(arc4random_buf)
2058 AC_CHECK_FUNCS(atan2l atan2f)
2059 AC_CHECK_FUNCS(chmod)
2060 AC_CHECK_FUNCS(chown)
2061 AC_CHECK_FUNCS(chroot)
2062 AC_CHECK_FUNCS(chsize)
2063 AC_CHECK_FUNCS(clock_gettime)
2064 AC_CHECK_FUNCS(copy_file_range)
2065 AC_CHECK_FUNCS(cosh)
2066 AC_CHECK_FUNCS(crypt_r)
2067 AC_CHECK_FUNCS(daemon)
2068 AC_CHECK_FUNCS(dirfd)
2069 AC_CHECK_FUNCS(dl_iterate_phdr)
2070 AC_CHECK_FUNCS(dlopen)
2071 AC_CHECK_FUNCS(dladdr)
2072 AC_CHECK_FUNCS(dup3)
2073 AC_CHECK_FUNCS(eaccess)
2074 AC_CHECK_FUNCS(endgrent)
2075 AC_CHECK_FUNCS(eventfd)
2076 AC_CHECK_FUNCS(execl)
2077 AC_CHECK_FUNCS(execle)
2078 AC_CHECK_FUNCS(execv)
2079 AC_CHECK_FUNCS(execve)
2080 AC_CHECK_FUNCS(explicit_memset)
2081 AC_CHECK_FUNCS(fcopyfile)
2082 AC_CHECK_FUNCS(fchdir)
2083 AC_CHECK_FUNCS(fchmod)
2084 AC_CHECK_FUNCS(fchown)
2085 AC_CHECK_FUNCS(fcntl)
2086 AC_CHECK_FUNCS(fdatasync)
2087 AC_CHECK_FUNCS(fdopendir)
2088 AC_CHECK_FUNCS(fgetattrlist)
2089 AC_CHECK_FUNCS(fmod)
2090 AC_CHECK_FUNCS(fstatat)
2091 AC_CHECK_FUNCS(fsync)
2092 AC_CHECK_FUNCS(ftruncate)
2093 AC_CHECK_FUNCS(ftruncate64)             # used for Win32 platform
2094 AC_CHECK_FUNCS(getattrlist)
2095 AC_CHECK_FUNCS(getcwd)
2096 AC_CHECK_FUNCS(getegid)
2097 AC_CHECK_FUNCS(getentropy)
2098 AC_CHECK_FUNCS(geteuid)
2099 AC_CHECK_FUNCS(getgid)
2100 AC_CHECK_FUNCS(getgidx)
2101 AC_CHECK_FUNCS(getgrnam)
2102 AC_CHECK_FUNCS(getgrnam_r)
2103 AC_CHECK_FUNCS(getgroups)
2104 AC_CHECK_FUNCS(getlogin)
2105 AC_CHECK_FUNCS(getlogin_r)
2106 AC_CHECK_FUNCS(getpgid)
2107 AC_CHECK_FUNCS(getpgrp)
2108 AC_CHECK_FUNCS(getppid)
2109 AC_CHECK_FUNCS(getpriority)
2110 AC_CHECK_FUNCS(getpwnam)
2111 AC_CHECK_FUNCS(getpwnam_r)
2112 AC_CHECK_FUNCS(getpwuid)
2113 AC_CHECK_FUNCS(getpwuid_r)
2114 AC_CHECK_FUNCS(getrandom)
2115 AC_CHECK_FUNCS(getresgid)
2116 AC_CHECK_FUNCS(getresuid)
2117 AC_CHECK_FUNCS(getrlimit)
2118 AC_CHECK_FUNCS(getsid)
2119 AC_CHECK_FUNCS(gettimeofday)            # for making ac_cv_func_gettimeofday
2120 AC_CHECK_FUNCS(getuid)
2121 AC_CHECK_FUNCS(getuidx)
2122 AC_CHECK_FUNCS(gmtime_r)
2123 AC_CHECK_FUNCS(initgroups)
2124 AC_CHECK_FUNCS(ioctl)
2125 AC_CHECK_FUNCS(isfinite)
2126 AC_CHECK_FUNCS(issetugid)
2127 AC_CHECK_FUNCS(kill)
2128 AC_CHECK_FUNCS(killpg)
2129 AC_CHECK_FUNCS(lchmod)
2130 AC_CHECK_FUNCS(lchown)
2131 AC_CHECK_FUNCS(link)
2132 AC_CHECK_FUNCS(llabs)
2133 AC_CHECK_FUNCS(lockf)
2134 AC_CHECK_FUNCS(log2)
2135 AC_CHECK_FUNCS(lstat)
2136 AC_CHECK_FUNCS(lutimes)
2137 AC_CHECK_FUNCS(malloc_usable_size)
2138 AC_CHECK_FUNCS(malloc_size)
2139 AC_CHECK_FUNCS(malloc_trim)
2140 AC_CHECK_FUNCS(mblen)
2141 AC_CHECK_FUNCS(memalign)
2142 AC_CHECK_FUNCS(memset_s)
2143 AC_CHECK_FUNCS(writev)
2144 AC_CHECK_FUNCS(memrchr)
2145 AC_CHECK_FUNCS(memmem)
2146 AC_CHECK_FUNCS(mkfifo)
2147 AC_CHECK_FUNCS(mknod)
2148 AC_CHECK_FUNCS(mktime)
2149 AC_CHECK_FUNCS(mmap)
2150 AC_CHECK_FUNCS(mremap)
2151 AC_CHECK_FUNCS(openat)
2152 AC_CHECK_FUNCS(pclose)
2153 AC_CHECK_FUNCS(pipe)
2154 AC_CHECK_FUNCS(pipe2)
2155 AC_CHECK_FUNCS(poll)
2156 AC_CHECK_FUNCS(popen)
2157 AC_CHECK_FUNCS(posix_fadvise)
2158 AC_CHECK_FUNCS(posix_madvise)
2159 AC_CHECK_FUNCS(posix_memalign)
2160 AC_CHECK_FUNCS(ppoll)
2161 AC_CHECK_FUNCS(pread)
2162 AC_CHECK_FUNCS(pwrite)
2163 AC_CHECK_FUNCS(qsort_r)
2164 AC_CHECK_FUNCS(qsort_s)
2165 AC_CHECK_FUNCS(readlink)
2166 AC_CHECK_FUNCS(realpath)
2167 AC_CHECK_FUNCS(round)
2168 AC_CHECK_FUNCS(sched_getaffinity)
2169 AC_CHECK_FUNCS(seekdir)
2170 AC_CHECK_FUNCS(select_large_fdset)
2171 AC_CHECK_FUNCS(sendfile)
2172 AC_CHECK_FUNCS(setegid)
2173 AC_CHECK_FUNCS(setenv)
2174 AC_CHECK_FUNCS(seteuid)
2175 AC_CHECK_FUNCS(setgid)
2176 AC_CHECK_FUNCS(setgroups)
2177 AC_CHECK_FUNCS(setpgid)
2178 AC_CHECK_FUNCS(setpgrp)
2179 AC_CHECK_FUNCS(setregid)
2180 AC_CHECK_FUNCS(setresgid)
2181 AC_CHECK_FUNCS(setresuid)
2182 AC_CHECK_FUNCS(setreuid)
2183 AC_CHECK_FUNCS(setrgid)
2184 AC_CHECK_FUNCS(setrlimit)
2185 AC_CHECK_FUNCS(setruid)
2186 AC_CHECK_FUNCS(setsid)
2187 AC_CHECK_FUNCS(setuid)
2188 AC_CHECK_FUNCS(shutdown)
2189 AC_CHECK_FUNCS(sigaction)
2190 AC_CHECK_FUNCS(sigaltstack)
2191 AC_CHECK_FUNCS(sigprocmask)
2192 AC_CHECK_FUNCS(sinh)
2193 AC_CHECK_FUNCS(snprintf)
2194 AC_CHECK_FUNCS(spawnv)
2195 AC_CHECK_FUNCS(symlink)
2196 AC_CHECK_FUNCS(syscall)
2197 AC_CHECK_FUNCS(sysconf)
2198 AC_CHECK_FUNCS(system)
2199 AC_CHECK_FUNCS(tanh)
2200 AC_CHECK_FUNCS(telldir)
2201 AC_CHECK_FUNCS(timegm)
2202 AC_CHECK_FUNCS(times)
2203 AC_CHECK_FUNCS(truncate)
2204 AC_CHECK_FUNCS(truncate64)              # used for Win32
2205 AC_CHECK_FUNCS(tzset)
2206 AC_CHECK_FUNCS(umask)
2207 AC_CHECK_FUNCS(unsetenv)
2208 AC_CHECK_FUNCS(utimensat)
2209 AC_CHECK_FUNCS(utimes)
2210 AC_CHECK_FUNCS(wait4)
2211 AC_CHECK_FUNCS(waitpid)
2212 AC_CHECK_FUNCS(__cospi)
2213 AC_CHECK_FUNCS(__sinpi)
2215 AS_IF([test "x$ac_cv_member_struct_statx_stx_btime" = xyes],
2216     [AC_CHECK_FUNCS(statx)])
2218 AS_IF([test "$ac_cv_func_getcwd" = yes], [
2219     AC_CACHE_CHECK(if getcwd allocates buffer if NULL is given, [rb_cv_getcwd_malloc],
2220         [AC_RUN_IFELSE([AC_LANG_SOURCE([[
2221 @%:@include <stddef.h>
2222 @%:@include <stdio.h>
2223 @%:@ifdef HAVE_UNISTD_H
2224 @%:@include <unistd.h>
2225 @%:@endif
2226 @%:@ifndef EXIT_SUCCESS
2227 @%:@define EXIT_SUCCESS 0
2228 @%:@endif
2229 @%:@ifndef EXIT_FAILURE
2230 @%:@define EXIT_FAILURE 1
2231 @%:@endif
2234 main(int argc, char **argv)
2236     if (!getcwd(NULL, 0)) return EXIT_FAILURE;
2237     return EXIT_SUCCESS;
2239 ]])],
2240             rb_cv_getcwd_malloc=yes,
2241             rb_cv_getcwd_malloc=no,
2242             AS_CASE($target_os,
2243                 [linux*|darwin*|*bsd|cygwin*|msys*|mingw*|mswin*],
2244                 [rb_cv_getcwd_malloc=yes],
2245                 [rb_cv_getcwd_malloc=no]))])
2246     AS_IF([test "$rb_cv_getcwd_malloc" = no], [AC_DEFINE(NO_GETCWD_MALLOC, 1)])
2249 AS_IF([test "$ac_cv_func_crypt_r" = yes],
2250     [AC_CHECK_HEADERS(crypt.h)])
2251 AS_IF([test "$ac_cv_func_crypt_r:$ac_cv_header_crypt_h" = yes:yes],
2252     [AC_CHECK_MEMBERS([struct crypt_data.initialized], [], [],
2253                       [AC_INCLUDES_DEFAULT([@%:@include <crypt.h>])])])
2255 RUBY_CHECK_BUILTIN_FUNC(__builtin_alloca_with_align, [__builtin_alloca_with_align(1, 4096)])
2256 RUBY_CHECK_BUILTIN_FUNC(__builtin_assume_aligned, [__builtin_assume_aligned((void*)32, 32)])
2257 RUBY_CHECK_BUILTIN_FUNC(__builtin_bswap16, [__builtin_bswap16(0)])
2258 RUBY_CHECK_BUILTIN_FUNC(__builtin_bswap32, [__builtin_bswap32(0)])
2259 RUBY_CHECK_BUILTIN_FUNC(__builtin_bswap64, [__builtin_bswap64(0)])
2260 RUBY_CHECK_BUILTIN_FUNC(__builtin_popcount, [__builtin_popcount(0)])
2261 RUBY_CHECK_BUILTIN_FUNC(__builtin_popcountll, [__builtin_popcountll(0)])
2262 RUBY_CHECK_BUILTIN_FUNC(__builtin_clz, [__builtin_clz(0)])
2263 RUBY_CHECK_BUILTIN_FUNC(__builtin_clzl, [__builtin_clzl(0)])
2264 RUBY_CHECK_BUILTIN_FUNC(__builtin_clzll, [__builtin_clzll(0)])
2265 RUBY_CHECK_BUILTIN_FUNC(__builtin_ctz, [__builtin_ctz(0)])
2266 RUBY_CHECK_BUILTIN_FUNC(__builtin_ctzll, [__builtin_ctzll(0)])
2267 RUBY_CHECK_BUILTIN_FUNC(__builtin_add_overflow, [int x;__builtin_add_overflow(0,0,&x)])
2268 RUBY_CHECK_BUILTIN_FUNC(__builtin_sub_overflow, [int x;__builtin_sub_overflow(0,0,&x)])
2269 RUBY_CHECK_BUILTIN_FUNC(__builtin_mul_overflow, [int x;__builtin_mul_overflow(0,0,&x)])
2270 RUBY_CHECK_BUILTIN_FUNC(__builtin_mul_overflow_p, [__builtin_mul_overflow_p(0,0,(int)0)])
2271 RUBY_CHECK_BUILTIN_FUNC(__builtin_constant_p, [__builtin_constant_p(0)])
2272 RUBY_CHECK_BUILTIN_FUNC(__builtin_choose_expr, [
2273     [int x[__extension__(__builtin_choose_expr(1, 1, -1))]];
2274     [int y[__extension__(__builtin_choose_expr(0, -1, 1))]];
2275     ])
2276 AS_IF([test x$rb_cv_builtin___builtin_choose_expr = xyes], [
2277     RUBY_CHECK_BUILTIN_FUNC(__builtin_choose_expr_constant_p, [
2278     [int x[__extension__(__builtin_choose_expr(__builtin_constant_p(1), 1, -1))]];
2279     [int y[__extension__(__builtin_choose_expr(__builtin_constant_p(foo), -1, 1))]];
2280     ])
2282 RUBY_CHECK_BUILTIN_FUNC(__builtin_types_compatible_p, [__builtin_types_compatible_p(int, int)])
2283 RUBY_CHECK_BUILTIN_FUNC(__builtin_trap, [__builtin_trap()])
2284 RUBY_CHECK_BUILTIN_FUNC(__builtin_expect, [__builtin_expect(0, 0)])
2286 AS_IF([test "$rb_cv_builtin___builtin_mul_overflow" != no], [
2287   AC_CACHE_CHECK(for __builtin_mul_overflow with long long arguments, rb_cv_use___builtin_mul_overflow_long_long, [
2288     AC_LINK_IFELSE([AC_LANG_SOURCE([[
2289 #pragma clang optimize off
2292 main(void)
2294     long long x = 0, y;
2295     __builtin_mul_overflow(x, x, &y);
2297     return 0;
2299 ]])],
2300         rb_cv_use___builtin_mul_overflow_long_long=yes,
2301         rb_cv_use___builtin_mul_overflow_long_long=no)])
2303 AS_IF([test "$rb_cv_use___builtin_mul_overflow_long_long" = yes], [
2304   AC_DEFINE(USE___BUILTIN_MUL_OVERFLOW_LONG_LONG, 1)
2307 AS_IF([test "$ac_cv_func_qsort_r" != no], [
2308   AC_CACHE_CHECK(whether qsort_r is GNU version, rb_cv_gnu_qsort_r,
2309     [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
2310 @%:@include <stdlib.h>
2311 void (qsort_r)(void *base, size_t nmemb, size_t size,
2312             int (*compar)(const void *, const void *, void *),
2313             void *arg);
2314 ]], [[ ]])],
2315       [rb_cv_gnu_qsort_r=yes],
2316       [rb_cv_gnu_qsort_r=no])
2317   ])
2318   AC_CACHE_CHECK(whether qsort_r is BSD version, rb_cv_bsd_qsort_r,
2319     [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
2320 @%:@include <stdlib.h>
2321 void (qsort_r)(void *base, size_t nmemb, size_t size,
2322              void *arg, int (*compar)(void *, const void *, const void *));
2323 ]], [[ ]])],
2324       [rb_cv_bsd_qsort_r=yes],
2325       [rb_cv_bsd_qsort_r=no])
2326   ])
2327   AS_CASE("$rb_cv_gnu_qsort_r:$rb_cv_bsd_qsort_r",
2328   [yes:no], [
2329     AC_DEFINE(HAVE_GNU_QSORT_R, 1)
2330   ],
2331   [no:yes], [
2332     AC_DEFINE(HAVE_BSD_QSORT_R, 1)
2333   ])
2336 AC_CACHE_CHECK(whether atan2 handles Inf as C99, rb_cv_atan2_inf_c99, [
2337     AS_IF([test $ac_cv_func_atan2f:$ac_cv_func_atan2l = yes:yes], [
2338         AC_RUN_IFELSE([AC_LANG_SOURCE([[
2339 @%:@include <math.h>
2340 @%:@ifdef HAVE_UNISTD_H
2341 @%:@include <unistd.h>
2342 @%:@endif
2343 @%:@ifndef EXIT_SUCCESS
2344 @%:@define EXIT_SUCCESS 0
2345 @%:@endif
2346 @%:@ifndef EXIT_FAILURE
2347 @%:@define EXIT_FAILURE 1
2348 @%:@endif
2351 main(int argc, char **argv)
2353     if (fabs(atan2(INFINITY, INFINITY) - M_PI_4) <= 0.01) return EXIT_SUCCESS;
2354     return EXIT_FAILURE;
2356 ]])],
2357         [rb_cv_atan2_inf_c99=yes],
2358         [rb_cv_atan2_inf_c99=no],
2359         [AS_CASE($target_os, [mingw*|mswin*], [rb_cv_atan2_inf_c99=no], [rb_cv_atan2_inf_c99=yes])]
2360         )
2361     ], [rb_cv_atan2_inf_c99=no])
2363 AS_IF([test "x$rb_cv_atan2_inf_c99" = xyes], [AC_DEFINE(ATAN2_INF_C99)])
2365 # Some platform need -lrt for clock_gettime, but the other don't.
2366 AS_IF([test x"$ac_cv_func_clock_gettime" != xyes], [
2367     # glibc 2.17 moves clock_* functions from librt to the main C library.
2368     # https://sourceware.org/legacy-ml/libc-announce/2012/msg00001.html
2369     AC_CHECK_LIB(rt, clock_gettime)
2370     AS_IF([test x"$ac_cv_lib_rt_clock_gettime" = xyes], [
2371         AC_DEFINE(HAVE_CLOCK_GETTIME, 1)
2372     ])
2374 AC_CHECK_FUNCS(clock_getres) # clock_getres should be tested after clock_gettime test including librt test.
2375 AC_CHECK_LIB([rt], [timer_create])
2376 AC_CHECK_LIB([rt], [timer_settime])
2377 AS_IF([test x"$ac_cv_lib_rt_timer_create" = xyes], [
2378     AC_DEFINE(HAVE_TIMER_CREATE, 1)
2380 AS_IF([test x"$ac_cv_lib_rt_timer_settime" = xyes], [
2381     AC_DEFINE(HAVE_TIMER_SETTIME, 1)
2384 AC_CACHE_CHECK(for unsetenv returns a value, rb_cv_unsetenv_return_value,
2385   [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
2386 #include <stdlib.h>
2387 ]], [[int v = unsetenv("foo");]])],
2388         rb_cv_unsetenv_return_value=yes,
2389         rb_cv_unsetenv_return_value=no)])
2390 AS_IF([test "$rb_cv_unsetenv_return_value" = no], [
2391   AC_DEFINE(VOID_UNSETENV)
2394 # End of setjmp check.
2396 AC_ARG_ENABLE(setreuid,
2397        AS_HELP_STRING([--enable-setreuid], [use setreuid()/setregid() according to need even if obsolete]),
2398        [use_setreuid=$enableval])
2399 AS_IF([test "$use_setreuid" = yes], [
2400     AC_DEFINE(USE_SETREUID)
2401     AC_DEFINE(USE_SETREGID)
2403 AC_STRUCT_TIMEZONE
2404 AC_CACHE_CHECK(for struct tm.tm_gmtoff, rb_cv_member_struct_tm_tm_gmtoff,
2405   [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
2406 @%:@define _BSD_SOURCE
2407 @%:@define _DEFAULT_SOURCE
2408 @%:@include <time.h>
2409     ]],
2410     [[struct tm t; t.tm_gmtoff = 3600;]])],
2411   [rb_cv_member_struct_tm_tm_gmtoff=yes],
2412   [rb_cv_member_struct_tm_tm_gmtoff=no])])
2413 AS_IF([test "$rb_cv_member_struct_tm_tm_gmtoff" = yes], [
2414   AC_DEFINE(HAVE_STRUCT_TM_TM_GMTOFF)
2416 AC_CACHE_CHECK(for external int daylight, rb_cv_have_daylight,
2417   [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <time.h>
2418   int i;]],
2419         [[i = daylight;]])],
2420         rb_cv_have_daylight=yes,
2421         rb_cv_have_daylight=no)])
2422 AS_IF([test "$rb_cv_have_daylight" = yes], [
2423   AC_DEFINE(HAVE_DAYLIGHT)
2426 AC_CACHE_CHECK(for negative time_t for gmtime(3), rb_cv_negative_time_t,
2427   [AC_RUN_IFELSE([AC_LANG_SOURCE([[
2428 #include <stdlib.h>
2429 #include <time.h>
2431 void
2432 check(tm, y, m, d, h, s)
2433     struct tm *tm;
2434     int y, m, d, h, s;
2436     if (!tm ||
2437         tm->tm_year != y ||
2438         tm->tm_mon  != m-1 ||
2439         tm->tm_mday != d ||
2440         tm->tm_hour != h ||
2441         tm->tm_sec  != s) {
2442         exit(1);
2443     }
2447 main()
2449    time_t t = -1;
2450    struct tm *tm;
2452    check(gmtime(&t), 69, 12, 31, 23, 59);
2453    t = ~(time_t)0 << 31;
2454    check(gmtime(&t), 1, 12, 13, 20, 52);
2455    return 0;
2457 ]])],
2458         rb_cv_negative_time_t=yes,
2459         rb_cv_negative_time_t=no,
2460         rb_cv_negative_time_t=yes)])
2461 AS_IF([test "$rb_cv_negative_time_t" = yes], [
2462   AC_DEFINE(NEGATIVE_TIME_T)
2465 # [ruby-dev:40910] overflow of time on FreeBSD
2466 # https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=145341
2467 AC_CACHE_CHECK(for localtime(3) overflow correctly, rb_cv_localtime_overflow,
2468   [AC_RUN_IFELSE([AC_LANG_SOURCE([[
2469 #include <stdlib.h>
2470 #include <time.h>
2472 void
2473 check(time_t t1)
2475     struct tm *tm;
2476     time_t t2;
2477     tm = localtime(&t1);
2478     if (!tm)
2479         return; /* overflow detected.  ok. */
2480     t2 = mktime(tm);
2481     if (t1 == t2)
2482         return; /* round-trip.  ok. */
2483     exit(1);
2487 main()
2489     time_t t;
2490     if (~(time_t)0 <= 0) {
2491         t = (((time_t)1) << (sizeof(time_t) * 8 - 2));
2492         t |= t - 1;
2493     }
2494     else {
2495         t = ~(time_t)0;
2496     }
2497     check(t);
2498     return 0;
2500 ]])],
2501         rb_cv_localtime_overflow=yes,
2502         rb_cv_localtime_overflow=no,
2503         rb_cv_localtime_overflow=no)])
2504 AS_IF([test "$rb_cv_localtime_overflow" = no], [
2505   AC_DEFINE(LOCALTIME_OVERFLOW_PROBLEM)
2508 AS_IF([test "$ac_cv_func_sigprocmask" = yes && test "$ac_cv_func_sigaction" = yes], [
2509    AC_DEFINE(POSIX_SIGNAL)
2510 ], [
2511   AC_CHECK_FUNCS(sigsetmask)
2512   AC_CACHE_CHECK(for BSD signal semantics, rb_cv_bsd_signal,
2513     [AC_RUN_IFELSE([AC_LANG_SOURCE([[
2514 #include <stdio.h>
2515 #include <signal.h>
2517 void
2518 sig_handler(dummy)
2519      int dummy;
2524 main()
2526   signal(SIGINT, sig_handler);
2527   kill(getpid(), SIGINT);
2528   kill(getpid(), SIGINT);
2529   return 0;
2531 ]])],
2532         rb_cv_bsd_signal=yes,
2533         rb_cv_bsd_signal=no,
2534         rb_cv_bsd_signal=$ac_cv_func_sigsetmask)])
2535   AS_IF([test "$rb_cv_bsd_signal" = yes], [
2536     AC_DEFINE(BSD_SIGNAL)
2537   ])
2540 AC_CHECK_TYPES([sig_t],[],[],[@%:@include <signal.h>])
2542 AS_IF([test "$ac_cv_func_getpgid" = no], [
2543   # AC_FUNC_GETPGRP fails when cross-compiling with old autoconf.
2544   # autoconf is changed between 2.52d and 2.52f?
2545   # https://lists.gnu.org/archive/html/bug-gnu-utils/2001-09/msg00181.html
2546   # "autoconf cleanup for AC_FUNC_GETPGRP and GETPGRP_VOID"
2547 AC_FUNC_GETPGRP
2549 AS_IF([test "$ac_cv_func_setpgid:$ac_cv_func_setpgrp" = no:yes], [
2550   # AC_FUNC_SETPGRP fails when cross-compiling.  (until autoconf 2.69?)
2551   # https://lists.gnu.org/archive/html/bug-autoconf/2013-02/msg00002.html
2552   # "AC_FUNC_SETPGRP fails to work properly when cross-compiling"
2553 AC_FUNC_SETPGRP
2556 AS_IF([test x"$ac_cv_func_dirfd" = xno], [
2557   AS_CASE(["$target_os"],[solaris*],
2558           [AC_CHECK_MEMBERS([DIR.d_fd, DIR.dd_fd],,,[
2559 #include <sys/types.h>
2560 #include <dirent.h>
2561 ])])
2564 AC_CACHE_CHECK(whether right shift preserve sign bit, rb_cv_rshift_sign,
2565     [AC_COMPILE_IFELSE([AC_LANG_BOOL_COMPILE_TRY([], [(-1==(-1>>1))])],
2566         rb_cv_rshift_sign=yes,
2567         rb_cv_rshift_sign=no)])
2568 AS_IF([test "$rb_cv_rshift_sign" = yes], [
2569   AC_DEFINE(RSHIFT(x,y), ((x)>>(int)(y)))
2570 ], [
2571   AC_DEFINE(RSHIFT(x,y), (((x)<0) ? ~((~(x))>>(int)(y)) : (x)>>(int)(y)))
2574 AS_IF([test "$ac_cv_func_copy_file_range" = no], [
2575   AC_CACHE_CHECK([for copy_file_range],
2576     rb_cv_use_copy_file_range,
2577     [AC_RUN_IFELSE([AC_LANG_SOURCE([[
2578 #include <sys/types.h>
2579 #include <sys/stat.h>
2580 #include <sys/syscall.h>
2581 #include <fcntl.h>
2582 #include <unistd.h>
2584 #ifndef O_TMPFILE
2585   #define O_TMPFILE __O_TMPFILE
2586 #endif
2589 main()
2591 #ifdef __NR_copy_file_range
2592    int ret, fd_in, fd_out;
2593    fd_in = open("/tmp", O_TMPFILE|O_RDWR, S_IRUSR);
2594    fd_out = open("/tmp", O_TMPFILE|O_WRONLY, S_IWUSR);
2595    ret = syscall(__NR_copy_file_range, fd_in, NULL, fd_out, NULL, 0, 0);
2596    close(fd_in);
2597    close(fd_out);
2598    if (ret == -1) { return 1; }
2599    return 0;
2600 #else
2601    return 1;
2602 #endif
2604   ]])],
2605     [rb_cv_use_copy_file_range=yes],
2606     [rb_cv_use_copy_file_range=no],
2607     [rb_cv_use_copy_file_range=no])])
2609 AS_CASE(["$ac_cv_func_copy_file_range:$rb_cv_use_copy_file_range"], [*yes*], [
2610   AC_DEFINE(USE_COPY_FILE_RANGE)
2613 AS_CASE(["$ac_cv_func_gettimeofday:$ac_cv_func_clock_gettime"],
2614 [*yes*], [],
2616     AC_MSG_ERROR(clock_gettime() or gettimeofday() must exist)
2619 AS_IF([test "$ac_cv_func_sysconf" = yes], [
2620   RUBY_CHECK_SYSCONF(CLK_TCK)
2623 AS_IF([test "${universal_binary-no}" = yes ], [
2624     archflagpat=`eval echo '"'"${ARCH_FLAG}"'"' | sed 's/[[][|.*]]/\\&/g'`
2625     save_CFLAGS="$CFLAGS" new_cflags=`echo "$CFLAGS" | sed "s|$archflagpat"'||'`
2626     save_LDFLAGS="$LDFLAGS" new_ldflags=`echo "$LDFLAGS" | sed "s|$archflagpat"'||'`
2627     stack_dir=
2628     for archs in ${universal_archnames}; do
2629         archs=`echo $archs | sed 's/=.*//'`
2630         CFLAGS="$new_cflags -arch $archs"
2631         LDFLAGS="$new_ldflags -arch $archs"
2632         RUBY_STACK_GROW_DIRECTION($archs, dir)
2633         AS_IF([test x$stack_dir = x], [
2634             stack_dir=$dir
2635         ], [test x$stack_dir != x$dir], [
2636             stack_dir=no
2637         ])
2638     done
2639     CFLAGS="$save_CFLAGS" LDFLAGS="$save_LDFLAGS"
2640     AS_IF([test x$stack_dir = xno], [
2641         for archs in ${universal_archnames}; do
2642             archs=`echo $archs | sed 's/=.*//'`
2643             eval dir=\$[rb_cv_stack_grow_dir_]AS_TR_SH([$archs])
2644             RUBY_DEFINE_IF([defined __${archs}__], STACK_GROW_DIRECTION, $dir)
2645         done
2646     ], [
2647         AC_DEFINE_UNQUOTED(STACK_GROW_DIRECTION, $stack_dir)
2648     ])
2649 ], [
2650     RUBY_STACK_GROW_DIRECTION($target_cpu, dir)
2651     AC_DEFINE_UNQUOTED(STACK_GROW_DIRECTION, $dir)
2654 AC_ARG_WITH(coroutine,
2655     AS_HELP_STRING([--with-coroutine=IMPLEMENTATION], [specify the coroutine implementation to use]),
2656     [coroutine_type=$withval], [coroutine_type=])
2657 AS_CASE([$coroutine_type], [yes|''], [
2658     coroutine_type=
2659     AS_CASE(["$target_cpu-$target_os"],
2660         [universal-darwin*], [
2661             coroutine_type=universal
2662         ],
2663         [x*64-darwin*], [
2664             coroutine_type=amd64
2665         ],
2666         [arm64-darwin*], [
2667             coroutine_type=arm64
2668         ],
2669         # Correct target name is powerpc*-, but Ruby seems to prefer ppc*-.
2670         # Notice that Darwin PPC ABI differs from AIX and ELF.
2671         # Adding PPC targets for AIX, *BSD and *Linux will require separate implementations.
2672         [powerpc-darwin*|ppc-darwin*], [
2673             coroutine_type=ppc
2674         ],
2675         [powerpc64-darwin*|ppc64-darwin*], [
2676             coroutine_type=ppc64
2677         ],
2678         [x*64-linux*], [
2679             AS_CASE(["$ac_cv_sizeof_voidp"],
2680                 [8], [ coroutine_type=amd64 ],
2681                 [4], [ coroutine_type=x86 ],
2682                 dnl unknown pointer size, bail out as no Context.h soon.
2683             )
2684         ],
2685         [*86-linux*], [
2686             coroutine_type=x86
2687         ],
2688         [x64-mingw*], [
2689             coroutine_type=win64
2690         ],
2691         [*86-mingw*], [
2692             coroutine_type=win32
2693         ],
2694         [aarch64-mingw*], [
2695             coroutine_type=arm64
2696         ],
2697         [arm*-linux*], [
2698             coroutine_type=arm32
2699         ],
2700         [aarch64-linux*], [
2701             coroutine_type=arm64
2702         ],
2703         [powerpc64le-linux*], [
2704             coroutine_type=ppc64le
2705         ],
2706         [riscv64-linux*], [
2707             coroutine_type=riscv64
2708         ],
2709         [loongarch64-linux*], [
2710             coroutine_type=loongarch64
2711         ],
2712         [x86_64-freebsd*], [
2713             coroutine_type=amd64
2714         ],
2715         [i386-freebsd*], [
2716             coroutine_type=x86
2717         ],
2718         [aarch64-freebsd*], [
2719             coroutine_type=arm64
2720         ],
2721         [x86_64-netbsd*], [
2722             coroutine_type=amd64
2723         ],
2724         [i386-netbsd*], [
2725             coroutine_type=x86
2726         ],
2727         [aarch64-netbsd*], [
2728             coroutine_type=arm64
2729         ],
2730         [x86_64-openbsd*], [
2731             coroutine_type=amd64
2732         ],
2733         [i386-openbsd*], [
2734             coroutine_type=x86
2735         ],
2736         [aarch64-openbsd*], [
2737             coroutine_type=arm64
2738         ],
2739         [*-openbsd*], [
2740             coroutine_type=pthread
2741         ],
2742         [x86_64-dragonfly*], [
2743             coroutine_type=amd64
2744         ],
2745         [*-haiku*], [
2746             coroutine_type=pthread
2747         ],
2748         [*-emscripten*], [
2749             coroutine_type=emscripten
2750         ],
2751         [*-wasi*], [
2752             coroutine_type=asyncify
2753         ],
2754         [
2755             AC_CHECK_FUNCS([getcontext swapcontext makecontext],
2756                 [coroutine_type=ucontext],
2757                 [coroutine_type=pthread; break]
2758             )
2759         ]
2760     )
2761     AC_MSG_CHECKING(native coroutine implementation for ${target_cpu}-${target_os})
2762     AC_MSG_RESULT(${coroutine_type})
2764 COROUTINE_H=coroutine/$coroutine_type/Context.h
2765 AS_IF([test ! -f "$srcdir/$COROUTINE_H"],
2766       [AC_MSG_ERROR('$coroutine_type' is not supported as coroutine)])
2767 COROUTINE_SRC=coroutine/$coroutine_type/Context.c
2768 AS_IF([test ! -f "$srcdir/$COROUTINE_SRC"],
2769       [COROUTINE_SRC=coroutine/$coroutine_type/Context.'$(ASMEXT)'])
2770 AC_DEFINE_UNQUOTED(COROUTINE_H, ["$COROUTINE_H"])
2771 AC_SUBST(X_COROUTINE_H, [$COROUTINE_H])
2772 AC_SUBST(X_COROUTINE_SRC, [$COROUTINE_SRC])
2774 AS_IF([test "$THREAD_MODEL" = pthread], [
2775     AC_CACHE_CHECK([whether pthread_t is scalar type], [rb_cv_scalar_pthread_t], [
2776         AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
2777             @%:@include <pthread.h>
2778             ]], [[
2779             pthread_t thread_id;
2780             thread_id = 0;
2781             if (!thread_id) return 0;
2782             ]])],[rb_cv_scalar_pthread_t=yes],[rb_cv_scalar_pthread_t=no])
2783     ])
2784     AS_IF([test x"$rb_cv_scalar_pthread_t" = xyes], [
2785         : # RUBY_CHECK_SIZEOF(pthread_t, [void* int long], [], [@%:@include <pthread.h>])
2786     ], [
2787         AC_DEFINE(NON_SCALAR_THREAD_ID)
2788     ])
2789     AC_CHECK_FUNCS(sched_yield pthread_attr_setinheritsched \
2790         pthread_attr_get_np pthread_attr_getstack pthread_attr_getguardsize \
2791         pthread_get_stackaddr_np pthread_get_stacksize_np \
2792         thr_stksegment pthread_stackseg_np pthread_getthrds_np \
2793         pthread_condattr_setclock \
2794         pthread_setname_np pthread_set_name_np)
2795     AS_CASE(["$target_os"],[emscripten*],[ac_cv_func_pthread_sigmask=no],[AC_CHECK_FUNCS(pthread_sigmask)])
2796     AS_CASE(["$target_os"],[aix*],[ac_cv_func_pthread_getattr_np=no],[AC_CHECK_FUNCS(pthread_getattr_np)])
2797     set_current_thread_name=
2798     AS_IF([test "$ac_cv_func_pthread_setname_np" = yes], [
2799         AC_CACHE_CHECK([arguments of pthread_setname_np], [rb_cv_func_pthread_setname_np_arguments],
2800             [rb_cv_func_pthread_setname_np_arguments=
2801             # Linux,AIX,  (pthread_self(), name)
2802             # NetBSD (pthread_self(), \"%s\", name)
2803             # Darwin (name)
2804             for mac in \
2805                 "(pthread_self(), name)" \
2806                 "(pthread_self(), \"%s\", name)" \
2807                 "(name)" \
2808                 ; do
2809                 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
2810                     @%:@include <pthread.h>
2811                     @%:@ifdef HAVE_PTHREAD_NP_H
2812                     @%:@include <pthread_np.h>
2813                     @%:@endif
2814                     @%:@define SET_THREAD_NAME(name) pthread_setname_np${mac}
2815                     ]],
2816                     [[if (SET_THREAD_NAME("conftest")) return 1;]])],
2817                     [rb_cv_func_pthread_setname_np_arguments="${mac}"
2818                     break])
2819             done
2820             ]
2821         )
2822         AS_IF([test -n "${rb_cv_func_pthread_setname_np_arguments}"], [
2823             set_current_thread_name="pthread_setname_np${rb_cv_func_pthread_setname_np_arguments}"
2824         ])
2825     ], [test "$ac_cv_func_pthread_set_name_np" = yes], [
2826         set_current_thread_name="pthread_set_name_np(pthread_self(), name)"
2827     ])
2828     AS_IF([test -n "$set_current_thread_name"], [
2829         AC_DEFINE_UNQUOTED(SET_CURRENT_THREAD_NAME(name), $set_current_thread_name)
2830         AS_CASE([$set_current_thread_name],
2831             [*'pthread_self()'*], [
2832                 set_another_thread_name=`echo "$set_current_thread_name" | sed 's/pthread_self()/thid/'`
2833                 AC_DEFINE_UNQUOTED(SET_ANOTHER_THREAD_NAME(thid,name), $set_another_thread_name)
2834             ])
2835     ])
2837     AC_CACHE_CHECK([for thread-local storage sepcifier], [rb_cv_tls_specifier],
2838         rb_cv_tls_specifier=none
2839         RUBY_WERROR_FLAG([
2840             for attr in \
2841                 _Thread_local \
2842                 __thread \
2843                 ; do
2844                 AC_LINK_IFELSE([AC_LANG_PROGRAM([[$attr int conftest;]])],
2845                     [rb_cv_tls_specifier=$attr; break])
2846             done
2847         ])
2848     )
2849     AS_IF([test x"${rb_cv_tls_specifier}" != xnone],
2850         [AC_DEFINE_UNQUOTED(RB_THREAD_LOCAL_SPECIFIER, ${rb_cv_tls_specifier})]
2851     )
2854 AS_IF([test x"$ac_cv_header_ucontext_h" = xno], [
2855     AC_CACHE_CHECK([if signal.h defines ucontext_t], [rb_cv_ucontext_in_signal_h],
2856         [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include <signal.h>]],
2857                                             [[size_t size = sizeof(ucontext_t);]])],
2858         [rb_cv_ucontext_in_signal_h=yes], [rb_cv_ucontext_in_signal_h=no])])
2859     AS_IF([test x"$rb_cv_ucontext_in_signal_h" = xyes], [
2860             AC_DEFINE_UNQUOTED(UCONTEXT_IN_SIGNAL_H, 1)
2861     ])
2863 AS_IF([test x"$ac_cv_header_ucontext_h" = xyes -o x"$rb_cv_ucontext_in_signal_h" = xyes], [
2864     AC_CACHE_CHECK([if mcontext_t is a pointer], [rb_cv_mcontext_t_ptr],
2865         [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
2866             @%:@include <signal.h>
2867             @%:@ifdef HAVE_UCONTEXT_H
2868             @%:@include <ucontext.h>
2869             @%:@endif
2870         mcontext_t test(mcontext_t mc) {return mc+1;}
2871           ]],
2872           [[test(0);]])],
2873         [rb_cv_mcontext_t_ptr=yes], [rb_cv_mcontext_t_ptr=no])])
2874     AS_IF([test x"$rb_cv_mcontext_t_ptr" = xyes], [
2875         AC_DEFINE_UNQUOTED(DEFINE_MCONTEXT_PTR(mc, uc), mcontext_t mc = (uc)->uc_mcontext)
2876     ], [
2877         AC_DEFINE_UNQUOTED(DEFINE_MCONTEXT_PTR(mc, uc), mcontext_t *mc = &(uc)->uc_mcontext)
2878     ])
2879     AS_IF([test x"$THREAD_MODEL" = xpthread], [
2880         AC_CHECK_FUNCS(getcontext setcontext)
2881     ])
2884 AS_IF([test "$ac_cv_func_fork_works" = "yes" -a x"$THREAD_MODEL" = xpthread], [
2885     AC_CACHE_CHECK([if fork works with pthread], rb_cv_fork_with_pthread,
2886         [AC_RUN_IFELSE([AC_LANG_SOURCE([[
2887 #include <stdlib.h>
2888 #include <unistd.h>
2889 #include <pthread.h>
2890 #include <stdio.h>
2891 #include <sys/types.h>
2892 #include <sys/wait.h>
2893 #include <signal.h>
2894 #ifndef EXIT_SUCCESS
2895 #define EXIT_SUCCESS 0
2896 #endif
2897 #ifndef EXIT_FAILURE
2898 #define EXIT_FAILURE 1
2899 #endif
2901 void *
2902 thread_func(void *dmy)
2904     return dmy;
2908 use_threads(void)
2910     pthread_t tid;
2911     if (pthread_create(&tid, 0, thread_func, 0) != 0) {
2912         return -1;
2913     }
2914     if (pthread_join(tid, 0) != 0) {
2915         return -1;
2916     }
2917     return 0;
2921 main(int argc, char *argv[])
2923     pid_t pid;
2924     if (use_threads()) return EXIT_FAILURE;
2925     pid = fork();
2927     if (pid) {
2928         int loc;
2929         sleep(1);
2930         if (waitpid(pid, &loc, WNOHANG) == 0) {
2931             kill(pid, SIGKILL);
2932             return EXIT_FAILURE;
2933         }
2934         if (!WIFEXITED(loc) || WEXITSTATUS(loc) != EXIT_SUCCESS)
2935            return EXIT_FAILURE;
2936     }
2937     else {
2938         if (use_threads()) return EXIT_FAILURE;
2939     }
2941     return EXIT_SUCCESS;
2942 }]])],
2943         rb_cv_fork_with_pthread=yes,
2944         rb_cv_fork_with_pthread=no,
2945         rb_cv_fork_with_pthread=yes)])
2946     test x$rb_cv_fork_with_pthread = xyes || AC_DEFINE(CANNOT_FORK_WITH_PTHREAD)
2949 AC_CHECK_HEADERS([sys/user.h])
2950 AS_IF([test "x$ac_cv_func_mmap" = xyes], [
2951     AC_CACHE_CHECK([whether PAGE_SIZE is compile-time const], rb_cv_const_page_size,
2952         [malloc_headers=`sed -n '/MALLOC_HEADERS_BEGIN/,/MALLOC_HEADERS_END/p' ${srcdir}/gc.c`
2953         AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[$malloc_headers
2954             typedef char conftest_page[PAGE_SIZE];
2955         ]], [[]])],
2956         [rb_cv_const_page_size=yes],
2957         [rb_cv_const_page_size=no])])
2959 AS_IF([test "x$rb_cv_const_page_size" = xyes],
2960     [AC_DEFINE(HAVE_CONST_PAGE_SIZE, 1)],
2961     [AC_DEFINE(HAVE_CONST_PAGE_SIZE, 0)]
2964 AS_IF([test "x$ac_cv_func_ioctl" = xyes], [
2965     AC_CACHE_CHECK([ioctl request type], rb_cv_ioctl_request_type,
2966         [rb_cv_ioctl_request_type=no
2967         dnl corresponding NUM2IOCTLREQ needs to be defined
2968         for type in "unsigned long:ULONG_MAX" int:INT_MAX; do
2969             max=`echo $type | sed 's/.*://'`
2970             type=`echo $type | sed 's/:.*//'`
2971             RUBY_WERROR_FLAG([
2972                 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
2973                     @%:@include <limits.h>
2974                     @%:@include <sys/types.h>
2975                     @%:@if defined(HAVE_SYS_IOCTL_H) && !defined(_WIN32)
2976                     @%:@include <sys/ioctl.h>
2977                     @%:@endif
2978                 ]], [[
2979                     $type req = $max;
2980                     if (ioctl(0, req)) {/* do nothing*/};
2981                 ]])],
2982                 [rb_cv_ioctl_request_type="$type"])
2983             ])
2984             test "x$rb_cv_ioctl_request_type" = xno || break
2985         done])
2986     AS_CASE(["$rb_cv_ioctl_request_type"], [no|int], [],
2987     ["unsigned long"], [
2988         AC_DEFINE_UNQUOTED(IOCTL_REQ_TYPE, [$rb_cv_ioctl_request_type])
2989         AC_DEFINE_UNQUOTED(NUM2IOCTLREQ(num), [NUM2ULONG(num)])
2990     ])
2995 [begin]_group "runtime section" && {
2996 dnl whether use dln_a_out or not
2997 AC_ARG_WITH(dln-a-out,
2998         AS_HELP_STRING([--with-dln-a-out], [dln_a_out is deprecated]),
2999         [
3000         AS_CASE([$withval],
3001         [yes], [
3002             AC_MSG_ERROR(dln_a_out no longer supported)
3003         ])
3006 AS_IF([test "$rb_cv_binary_elf" = yes], [
3007   AC_DEFINE(USE_ELF)
3008   AC_CHECK_HEADERS([elf.h elf_abi.h])
3009   AS_IF([test $ac_cv_header_elf_h = yes -o $ac_cv_header_elf_abi_h = yes], [
3010     AC_LIBOBJ([addr2line])
3011     AC_CHECK_LIB([z], [uncompress])
3012   ])
3015 AC_CHECK_HEADERS([mach-o/loader.h])
3016 AS_IF([test "$ac_cv_header_mach_o_loader_h" = yes], [
3017   AC_LIBOBJ([addr2line])
3020 AS_CASE(["$target_os"],
3021 [linux* | gnu* | k*bsd*-gnu | bsdi* | kopensolaris*-gnu], [
3022     AS_IF([test "$rb_cv_binary_elf" = no], [
3023         AC_MSG_ERROR(Not ELF)
3024     ], [
3025         LDFLAGS="$LDFLAGS -rdynamic"
3026     ])])
3027 LIBEXT=a
3029 AC_SUBST(DLDFLAGS)dnl
3030 AC_SUBST(ARCH_FLAG)dnl
3032 AC_SUBST(STATIC)dnl
3033 AC_SUBST(CCDLFLAGS)dnl
3034 AC_SUBST(LDSHARED)dnl
3035 AC_SUBST(LDSHAREDXX)dnl
3036 AC_SUBST(DLEXT)dnl
3037 AC_SUBST(LIBEXT)dnl
3038 AC_SUBST(ASMEXT, S)dnl
3040 STATIC=
3042 : "dlopen" && {
3043   rb_cv_dlopen=unknown
3044   AC_MSG_CHECKING(whether OS depend dynamic link works)
3045   AS_IF([test "$GCC" = yes], [
3046     AS_CASE(["$target_os"],
3047     [darwin*], [
3048       # The -fno-common is needed if we wish to embed the Ruby interpreter
3049       # into a plugin module of some project (as opposed to embedding it
3050       # within the project's application).  The -I/usr/local/include is
3051       # needed because CPP as discovered by configure (cc -E -traditional)
3052       # fails to consult /usr/local/include by default.  This causes
3053       # mkmf.rb's have_header() to fail if the desired resource happens to be
3054       # installed in the /usr/local tree.
3055       RUBY_APPEND_OPTION(CCDLFLAGS, -fno-common)],
3056     [bsdi*|cygwin*|msys*|mingw*|aix*|interix*], [ ],
3057     [
3058       RUBY_APPEND_OPTION(CCDLFLAGS, -fPIC)])
3059   ], [
3060     AS_CASE(["$target_os"],
3061         [solaris*|irix*], [CCDLFLAGS="$CCDLFLAGS -KPIC"],
3062         [sunos*],         [CCDLFLAGS="$CCDLFLAGS -PIC"],
3063         [esix*|uxpds*],   [CCDLFLAGS="$CCDLFLAGS -KPIC"],
3064                           [: ${CCDLFLAGS=""}])
3065   ])
3068 EXTSTATIC=
3069 AC_SUBST(EXTSTATIC)dnl
3070 AC_ARG_WITH(static-linked-ext,
3071             AS_HELP_STRING([--with-static-linked-ext], [link external modules statically]),
3072             [AS_CASE([$withval],[yes],[STATIC=;EXTSTATIC=static],[no],[],[EXTSTATIC="$withval"])])
3073 AS_CASE([",$EXTSTATIC,"], [,static,|*,enc,*], [
3074   ENCOBJS='enc/encinit.$(OBJEXT) enc/libenc.$(LIBEXT) enc/libtrans.$(LIBEXT)'
3075   EXTOBJS='ext/extinit.$(OBJEXT)'
3076   AC_DEFINE_UNQUOTED(EXTSTATIC, 1)
3077   AC_SUBST(ENCSTATIC, static)
3078 ], [
3079   ENCOBJS='dmyenc.$(OBJEXT)'
3080   EXTOBJS='dmyext.$(OBJEXT)'
3082 AC_SUBST(ENCOBJS)
3083 AC_SUBST(EXTOBJS)
3085 : "rpath" && {
3086     AS_CASE(["$target_os"],
3087         [solaris*], [   AS_IF([test "$GCC" = yes], [
3088                             : ${LDSHARED='$(CC) -shared'}
3089                             AS_IF([test "$rb_cv_prog_gnu_ld" = yes], [
3090                                 LDFLAGS="$LDFLAGS -Wl,-E"
3091                             ])
3092                         ], [
3093                             : ${LDSHARED='$(CC) -G'}
3094                         ])
3095                         AS_IF([test "$ac_cv_sizeof_voidp" = 8], [
3096                             : ${LIBPATHENV=LD_LIBRARY_PATH_64}
3097                             : ${PRELOADENV=LD_PRELOAD_64}
3098                         ], [
3099                             : ${LIBPATHENV=LD_LIBRARY_PATH_32}
3100                             : ${PRELOADENV=LD_PRELOAD_32}
3101                         ])
3102                         rb_cv_dlopen=yes],
3103         [sunos*], [     : ${LDSHARED='$(LD) -assert nodefinitions'}
3104                         rb_cv_dlopen=yes],
3105         [irix*], [      : ${LDSHARED='$(LD) -shared'}
3106                         rb_cv_dlopen=yes],
3107         [sysv4*], [     : ${LDSHARED='$(LD) -G'}
3108                         rb_cv_dlopen=yes],
3109         [nto-qnx*], [   : ${LDSHARED='$(CC) -shared'}
3110                         rb_cv_dlopen=yes],
3111         [esix*|uxpds*], [ : ${LDSHARED='$(LD) -G'}
3112                         rb_cv_dlopen=yes],
3113         [osf*], [       : ${LDSHARED='$(LD) -shared -expect_unresolved "*"'}
3114                         rb_cv_dlopen=yes],
3115         [bsdi3*], [     AS_CASE(["$CC"],
3116                         [*shlicc*], [   : ${LDSHARED='$(CC) -r'}
3117                                         rb_cv_dlopen=yes])],
3118         [linux* | gnu* | k*bsd*-gnu | netbsd* | bsdi* | kopensolaris*-gnu | haiku*], [
3119                         : ${LDSHARED='$(CC) -shared'}
3120                         AS_IF([test "$rb_cv_binary_elf" = yes], [
3121                             LDFLAGS="$LDFLAGS -Wl,-export-dynamic"
3122                         ])
3123                         rb_cv_dlopen=yes],
3124         [interix*], [   : ${LDSHARED='$(CC) -shared'}
3125                         XLDFLAGS="$XLDFLAGS -Wl,-E"
3126                         rb_cv_dlopen=yes],
3127         [freebsd*|dragonfly*], [
3128                         : ${LDSHARED='$(CC) -shared'}
3129                         AS_IF([test "$rb_cv_binary_elf" = yes], [
3130                             LDFLAGS="$LDFLAGS -rdynamic"
3131                             DLDFLAGS="$DLDFLAGS "'-Wl,-soname,$@'
3132                         ], [
3133                           test "$GCC" = yes && test "$rb_cv_prog_gnu_ld" = yes || LDSHARED='$(LD) -Bshareable'
3134                         ])
3135                         rb_cv_dlopen=yes],
3136         [openbsd*|mirbsd*], [   : ${LDSHARED='$(CC) -shared ${CCDLFLAGS}'}
3137                         AS_IF([test "$rb_cv_binary_elf" = yes], [
3138                             LDFLAGS="$LDFLAGS -Wl,-E"
3139                         ])
3140                         rb_cv_dlopen=yes],
3141         [darwin*], [    : ${LDSHARED='$(CC) -dynamic -bundle'}
3142                         : ${DLDSHARED='$(CC) -dynamiclib'}
3143                         : ${LDFLAGS=""}
3144                         : ${LIBPATHENV=DYLD_LIBRARY_PATH}
3145                         : ${PRELOADENV=DYLD_INSERT_LIBRARIES}
3146                         AS_IF([test x"$enable_shared" = xyes], [
3147                             # Resolve symbols from libruby.dylib in $(LIBS) when --enable-shared
3148                         ], [test "x$EXTSTATIC" = x], [
3149                             # When building exts as bundles, a mach-o bundle needs to know its loader
3150                             # program to bind symbols from the ruby executable
3151                             EXTDLDFLAGS="-bundle_loader '\$(BUILTRUBY)'"
3152                         ])
3153                         rb_cv_dlopen=yes],
3154         [aix*], [       : ${LDSHARED='$(CC)'}
3155                         AS_IF([test "$GCC" = yes], [
3156                             LDSHARED="$LDSHARED ${linker_flag}-G -shared"
3157                         ], [
3158                             LDSHARED="$LDSHARED ${linker_flag}-G"
3159                         ])
3160                         EXTDLDFLAGS='-e$(TARGET_ENTRY)'
3161                         XLDFLAGS="${linker_flag}"'-bE:$(ARCHFILE)'" ${linker_flag}-brtl"
3162                         XLDFLAGS="$XLDFLAGS ${linker_flag}-blibpath:${prefix}/lib:${LIBPATH:-/usr/lib:/lib}"
3163                         : ${ARCHFILE="ruby.imp"}
3164                         TRY_LINK='$(CC) -oconftest $(INCFLAGS) -I$(hdrdir) $(CPPFLAGS)'
3165                         TRY_LINK="$TRY_LINK"' $(CFLAGS) $(src) $(LIBPATH) $(LDFLAGS) $(LOCAL_LIBS) $(LIBS)'
3166                         : ${LIBPATHENV=LIBPATH}
3167                         : ${PRELOADENV=LDR_PRELOAD}
3168                         rb_cv_dlopen=yes],
3169         [nto-qnx*], [   DLDFLAGS="$DLDFLAGS -L/lib -L/usr/lib -L/usr/local/lib"
3170                         : ${LDSHARED='$(LD) -Bshareable -x'}
3171                         LDFLAGS="$LDFLAGS -L/lib -L/usr/lib -L/usr/local/lib"
3172                         rb_cv_dlopen=yes],
3173         [cygwin*|msys*|mingw*], [
3174                         : ${LDSHARED='$(CC) -shared'}
3175                         XLDFLAGS="$XLDFLAGS -Wl,--stack,0x00200000,--enable-auto-import"
3176                         DLDFLAGS="${DLDFLAGS} -Wl,--enable-auto-image-base,--enable-auto-import"
3177                         : ${LIBPATHENV=PATH}
3178                         : ${PRELOADENV=""}
3179                         rb_cv_dlopen=yes],
3180         [hiuxmpp], [    : ${LDSHARED='$(LD) -r'}],
3181         [atheos*], [    : ${LDSHARED='$(CC) -shared'}
3182                         rb_cv_dlopen=yes],
3183         [wasi*], [      : ${LDSHARED='$(LD) -shared -Xlinker --export-dynamic'}],
3184         [       : ${LDSHARED='$(LD)'}])
3185     AC_MSG_RESULT($rb_cv_dlopen)
3188 AS_IF([test "$rb_cv_dlopen" = yes], [
3189     AS_CASE(["$target_os"],
3190     [darwin*], [
3191         AC_SUBST(ADDITIONAL_DLDFLAGS, "")
3192         for flag in \
3193           "-multiply_defined suppress" \
3194           "-undefined dynamic_lookup" \
3195           ; do
3196             test "x${linker_flag}" = x || flag="${linker_flag}`echo ${flag} | tr ' ' ,`"
3197             RUBY_TRY_LDFLAGS([$flag], [], [flag=])
3198             AS_IF([test x"$flag" = x], [continue])
3200             AC_MSG_CHECKING([whether $flag is accepted for bundle])
3201             : > conftest.c
3202             AS_IF([${LDSHARED%%'$(CC)'*}$CC${LDSHARED@%:@*'$(CC)'} -o conftest.bundle $flag conftest.c >/dev/null 2>conftest.err &&
3203                 test ! -s conftest.err], [
3204                 AC_MSG_RESULT([yes])
3205                 RUBY_APPEND_OPTIONS(DLDFLAGS, [$flag])
3206             ], [
3207                 AC_MSG_RESULT([no])
3208                 RUBY_APPEND_OPTIONS(ADDITIONAL_DLDFLAGS, [$flag])
3209             ])
3210             rm -fr conftest.*
3211         done
3212     ])
3215 AS_IF([test "${LDSHAREDXX}" = ""], [
3216     AS_CASE(["${LDSHARED}"],
3217         [*'$(CC)'*], [
3218             LDSHAREDXX=`echo "${LDSHARED}" | sed 's/\$(CC)/$(CXX)/'`
3219             ],
3220         [*'${CC}'*], [
3221             LDSHAREDXX=`echo "${LDSHARED}" | sed 's/\${CC}/${CXX}/'`
3222             ],
3223         [*$CC*], [
3224             LDSHAREDXX=`echo "${LDSHARED}" | sed "s|$CC|$CXX|"`
3225             ],
3226         [ld" "*], [
3227             ])
3230 AC_SUBST(LINK_SO)
3231 AC_SUBST(LIBPATHFLAG)
3232 AC_SUBST(RPATHFLAG)
3233 AC_SUBST(LIBPATHENV, "${LIBPATHENV-LD_LIBRARY_PATH}")
3234 AC_SUBST(PRELOADENV, "${PRELOADENV-LD_PRELOAD}")
3235 AC_SUBST(TRY_LINK)
3237 AS_CASE(["$target_os"],
3238 [freebsd*], [
3239     AC_CHECK_LIB([procstat], [procstat_open_sysctl])
3240     AS_IF([test "x$ac_cv_lib_procstat_procstat_open_sysctl" = xyes], [
3241         AC_CHECK_FUNCS(procstat_getvmmap)
3242     ])
3243     ])
3244 AS_CASE(["$target_cpu-$target_os"],
3245 [*-darwin*], [
3246     AC_CHECK_HEADERS([libproc.h])
3247     AC_CHECK_HEADERS([execinfo.h])
3248     AS_IF([test "x$ac_cv_header_execinfo_h" = xyes], [
3249         AC_CHECK_LIB([execinfo], [backtrace])
3250         AC_CHECK_HEADERS([libunwind.h])
3252     AC_CHECK_HEADERS([mach/task.h mach/mach_init.h mach/mach_port.h])
3253     AS_IF([ test \
3254         "x${ac_cv_header_mach_task_h}" = xyes -a \
3255         "x${ac_cv_header_mach_mach_init_h}" = xyes -a \
3256         "x${ac_cv_header_mach_mach_port_h}" = xyes \
3257     ], [
3258         AC_DEFINE([HAVE_MACH_TASK_EXCEPTION_PORTS], [1])
3259     ])
3260     ])],
3261 [*-freebsd*|x86_64-netbsd*], [
3262     AC_CHECK_HEADERS([execinfo.h])
3263     AS_IF([test "x$ac_cv_header_execinfo_h" = xyes], [
3264         AC_CHECK_LIB([execinfo], [backtrace])
3265         AC_CHECK_LIB([unwind], [unw_backtrace])
3266     ])])
3267 AC_CHECK_FUNCS(backtrace)
3269 AS_IF([test "x$ac_cv_func_backtrace" = xyes], [
3270   AC_CACHE_CHECK(for broken backtrace, rb_cv_broken_backtrace,
3271     [AC_RUN_IFELSE([AC_LANG_SOURCE([[
3272 #include <unistd.h>
3273 #include <stdio.h>
3274 #include <stdlib.h>
3275 #include <stdint.h>
3276 #include <string.h>
3277 #include <signal.h>
3278 #include <execinfo.h>
3280 ]`grep '^@%:@ *define  *RUBY_SIGALTSTACK_SIZE' ${srcdir}/signal.c`[
3281 #define TRACE_SIZE 256
3283 void sigsegv(int signum, siginfo_t *info, void *ctx){
3284     void *trace[TRACE_SIZE];
3285     int n = backtrace(trace, TRACE_SIZE);
3286     if (n > 0) {
3287         /*fprintf(stdout, "backtrace:%d\n",n);*/
3288     } else {
3289         _exit(EXIT_FAILURE);
3290     }
3291     _exit(EXIT_SUCCESS);
3294 main(void)
3296     volatile int *a = NULL;
3297     stack_t ss;
3298     struct sigaction sa;
3300     ss.ss_sp = malloc(RUBY_SIGALTSTACK_SIZE);
3301     if (ss.ss_sp == NULL) {
3302         fprintf(stderr, "cannot allocate memory for sigaltstack\n");
3303         return EXIT_FAILURE;
3304     }
3305     ss.ss_size = RUBY_SIGALTSTACK_SIZE;
3306     ss.ss_flags = 0;
3307     if (sigaltstack(&ss, NULL) == -1) {
3308         fprintf(stderr, "sigaltstack failed\n");
3309         return EXIT_FAILURE;
3310     }
3311     memset(&sa, 0, sizeof(struct sigaction));
3312     sigemptyset(&sa.sa_mask);
3313     sa.sa_sigaction = sigsegv;
3314     sa.sa_flags |= SA_SIGINFO;
3315     sa.sa_flags |= SA_ONSTACK;
3316     sigaction(SIGSEGV, &sa, NULL);
3317     a[0] = 1;
3318     return EXIT_SUCCESS;
3320 ]])],
3321         rb_cv_broken_backtrace=no,
3322         rb_cv_broken_backtrace=yes,
3323         rb_cv_broken_backtrace=no)])
3324   AS_IF([test "$rb_cv_broken_backtrace" = yes], [
3325     AC_DEFINE(BROKEN_BACKTRACE, 1)
3326   ])
3329 AC_ARG_WITH(valgrind,
3330         AS_HELP_STRING([--without-valgrind],[disable valgrind memcheck support]),
3331         [], with_valgrind=yes)
3332 AS_IF([test x$with_valgrind != xno],
3333         [AC_CHECK_HEADERS(valgrind/memcheck.h)])
3335 : "dlext & soext" && {
3336   AS_CASE(["$target_os"],
3337     [darwin*], [
3338         SOEXT=dylib
3339         DLEXT=bundle],
3340     [cygwin*|msys*|mingw*|*djgpp*], [
3341         LOAD_RELATIVE=1
3342         SOEXT=dll
3343         DLEXT=so],
3344     [
3345         DLEXT=so])
3346 : ${SOEXT="${DLEXT}"}
3347 AC_SUBST(SOEXT)
3350 AS_IF([test "$rb_cv_dlopen:$load_relative" = yes:yes], [
3351     AS_IF([test "$ac_cv_func_dladdr" = yes], [
3352         LOAD_RELATIVE=1
3353     ])
3355 AS_IF([test x"$LOAD_RELATIVE" = x1], [
3356     load_relative=yes
3357 ], [
3358     unset load_relative
3361 len=2 # .rb
3362 n=`expr "$DLEXT"  : '.*'`; test "$n" -gt "$len" && len=$n
3363 AC_DEFINE_UNQUOTED(DLEXT_MAXLEN, `expr $len + 1`)
3364 test ".$DLEXT"  = "." || AC_DEFINE_UNQUOTED(DLEXT,  ".$DLEXT")
3365 AC_SUBST(DLEXT)
3367 : "strip" && {
3368     AC_MSG_CHECKING([for $STRIP flags])
3369     AC_LINK_IFELSE([AC_LANG_PROGRAM], [AS_IF(
3370         ["${STRIP}" -A -n conftest$ac_exeext 2>/dev/null], [
3371             AC_MSG_RESULT([-A -n])
3372             STRIP="${STRIP} -A -n"
3373         ],
3374         ["${STRIP}" -S -x conftest$ac_exeext 2>/dev/null], [
3375             AC_MSG_RESULT([-S -x])
3376             STRIP="${STRIP} -S -x"
3377         ], [
3378             AC_MSG_RESULT([none needed])
3379         ])
3380     ])
3383 AC_ARG_WITH(ext,
3384             AS_HELP_STRING([--with-ext=EXTS],
3385                            [pass to --with-ext option of extmk.rb]))
3386 AC_ARG_WITH(out-ext,
3387             AS_HELP_STRING([--with-out-ext=EXTS],
3388                            [pass to --without-ext option of extmk.rb]))
3389 AC_ARG_WITH(setup,
3390             AS_HELP_STRING([--with-setup=SETUP], [use extension libraries setup]),
3391             [setup=$withval])
3392 AS_IF([test -n "$setup"], [
3393     AS_IF([! test -f "ext/$setup" -o -f "$srcdir/ext/$setup"], [
3394         AC_MSG_ERROR(Setup file $setup not found under ext or $srcdir/ext)
3395     ])
3396 ], [test -f "$srcdir/ext/Setup.$target_os"], [
3397     setup="Setup.$target_os"
3398 ], [
3399     setup=
3400     for file in "$srcdir"/ext/Setup.*; do
3401         AS_CASE(["$file"], [*~|*.bak|*.orig|*.rej|*.tmp], [continue])
3402         setup=`basename "$file"`
3403         AS_CASE(["$target_os"], [`expr "$setup" : 'Setup.\(.*\)'`*], [break])
3404         platform=`sed '/^option  *platform  */!d;s///;s/|/*|/g;q' "$file"`
3405         AS_IF([test "x$platform" != x], [
3406             eval "AS_CASE([\"\$target_os\"], [$platform*], [break])"
3407         ])
3408         setup=
3409     done
3410     : ${setup:=Setup}
3412 AC_SUBST(setup)
3414 rubylibprefix='${libdir}/${RUBY_BASE_NAME}'
3415 AC_ARG_WITH(rubylibprefix,
3416             AS_HELP_STRING([--with-rubylibprefix=DIR], [prefix for ruby libraries [[LIBDIR/RUBY_BASE_NAME]]]),
3417             [AS_IF([test "x$withval" = xno], [
3418                 AC_MSG_ERROR([No ruby, No libprefix])
3419             ])
3420             rubylibprefix="$withval"])
3421 AC_SUBST(rubylibprefix)
3423 AS_IF([test x"${exec_prefix}" != xNONE], [
3424     RUBY_EXEC_PREFIX="$exec_prefix"
3425 ], [test x"$prefix" != xNONE], [
3426     RUBY_EXEC_PREFIX="$prefix"
3427 ], [
3428     RUBY_EXEC_PREFIX=$ac_default_prefix
3430 pat=`echo "${RUBY_EXEC_PREFIX}" | tr -c '\012' .`'\(.*\)'
3431 for var in bindir includedir libdir rubylibprefix; do
3432     eval val='"$'$var'"'
3433     AS_CASE(["$val"], ["${RUBY_EXEC_PREFIX}"*], [val='${exec_prefix}'"`expr \"$val\" : \"$pat\"`"])
3434     eval $var='"$val"'
3435 done
3437 BTESTRUBY='$(MINIRUBY)'
3438 AS_IF([test x"$cross_compiling" = xyes], [
3439   test x"$MINIRUBY" = x && MINIRUBY="${RUBY-$BASERUBY} -I`$CHDIR .; pwd` "-r'$(arch)-fake'
3440   XRUBY_LIBDIR=`${RUBY-$BASERUBY} -rrbconfig -e ['puts RbConfig::CONFIG["libdir"]']`
3441   XRUBY_RUBYLIBDIR=`${RUBY-$BASERUBY} -rrbconfig -e ['puts RbConfig::CONFIG["rubylibdir"]']`
3442   XRUBY_RUBYHDRDIR=`${RUBY-$BASERUBY} -rrbconfig -e ['puts RbConfig::CONFIG["rubyhdrdir"]']`
3443   AC_SUBST(XRUBY_LIBDIR)
3444   AC_SUBST(XRUBY_RUBYLIBDIR)
3445   AC_SUBST(XRUBY_RUBYHDRDIR)
3446   PREP='$(arch)-fake.rb'
3447   AS_CASE(["$enable_shared:$EXTSTATIC:$target_os"], [no::darwin*], [
3448     # darwin target requires miniruby for linking ext bundles
3449     PREP="$PREP"' miniruby$(EXEEXT)'
3450   ])
3451   RUNRUBY_COMMAND='$(MINIRUBY) -I`cd $(srcdir)/lib; pwd`'
3452   RUNRUBY='$(RUNRUBY_COMMAND)'
3453   XRUBY='$(MINIRUBY)'
3454   TEST_RUNNABLE=no
3455   CROSS_COMPILING=yes
3456   AC_DEFINE(CROSS_COMPILING, 1)
3457 ], [
3458   MINIRUBY='./miniruby$(EXEEXT) -I$(srcdir)/lib -I.'
3459   MINIRUBY="$MINIRUBY"' -I$(EXTOUT)/common'
3460   PREP='miniruby$(EXEEXT)'
3461   RUNRUBY_COMMAND='$(MINIRUBY) $(tooldir)/runruby.rb --extout=$(EXTOUT) $(RUNRUBYOPT)'
3462   RUNRUBY='$(RUNRUBY_COMMAND) --'
3463   XRUBY='$(RUNRUBY)'
3464   TEST_RUNNABLE=yes
3465   CROSS_COMPILING=no
3467 AC_SUBST(TEST_RUNNABLE)
3468 AC_SUBST(CROSS_COMPILING)
3469 AC_SUBST(MINIRUBY)
3470 AC_SUBST(BTESTRUBY)
3471 AC_SUBST(PREP)
3472 AC_SUBST(RUNRUBY_COMMAND)
3473 AC_SUBST(RUNRUBY)
3474 AC_SUBST(XRUBY)
3475 AC_SUBST(EXTOUT, [${EXTOUT=.ext}])
3477 FIRSTMAKEFILE=""
3478 LIBRUBY_A='lib$(RUBY_SO_NAME)-static.a'
3479 LIBRUBY='$(LIBRUBY_A)'
3480 LIBRUBYARG_STATIC='-l$(RUBY_SO_NAME)-static'
3481 LIBRUBYARG='$(LIBRUBYARG_STATIC)'
3482 SOLIBS='$(MAINLIBS)'
3484 AS_CASE(["$target_os"],
3485   [cygwin*|msys*|mingw*|haiku*|darwin*], [
3486     : ${DLDLIBS=""}
3487     ],
3488   [
3489     DLDLIBS="${DLDLIBS:+$DLDLIBS }-lc"
3490     ])
3492 AC_ARG_ENABLE(multiarch,
3493               AS_HELP_STRING([--enable-multiarch], [enable multiarch compatible directories]),
3494               [multiarch=], [unset multiarch])
3495 AS_IF([test ${multiarch+set}], [
3496    AC_DEFINE(ENABLE_MULTIARCH)
3499 archlibdir='${libdir}/${arch}'
3500 sitearchlibdir='${libdir}/${sitearch}'
3501 archincludedir='${includedir}/${arch}'
3502 sitearchincludedir='${includedir}/${sitearch}'
3504 AC_ARG_WITH(soname,
3505         AS_HELP_STRING([--with-soname=SONAME], [base name of shared library]),
3506         [RUBY_SO_NAME=$withval],
3507         [
3508             AS_CASE(["$target_os"],
3509             [darwin*], [
3510                 RUBY_SO_NAME='$(RUBY_BASE_NAME).$(RUBY_API_VERSION)'
3511             ],
3512             [cygwin*], [
3513                 RUBY_SO_NAME='$(RUBY_BASE_NAME)$(MAJOR)$(MINOR)0'
3514             ],
3515             [mingw*], [
3516                 RUBY_SO_NAME="${rb_cv_msvcrt}"'-$(RUBY_BASE_NAME)$(MAJOR)$(MINOR)0'
3517                 AS_IF([test x"${target_cpu}" != xi386], [
3518                     RUBY_SO_NAME="${target_cpu}-${RUBY_SO_NAME}"
3519                 ])
3520             ],
3521             [RUBY_SO_NAME='$(RUBY_BASE_NAME)'])
3522         ])
3524 LIBRUBY_LDSHARED=${DLDSHARED=${LDSHARED}}
3525 LIBRUBY_DLDFLAGS=$DLDFLAGS
3526 LIBRUBY_SO='lib$(RUBY_SO_NAME).$(SOEXT).$(RUBY_PROGRAM_VERSION)'
3527 LIBRUBY_SONAME='lib$(RUBY_SO_NAME).$(SOEXT).$(RUBY_API_VERSION)'
3528 LIBRUBY_ALIASES='lib$(RUBY_SO_NAME).$(SOEXT)'
3529 ENABLE_SHARED=no
3531 AC_ARG_ENABLE(shared,
3532        AS_HELP_STRING([--enable-shared], [build a shared library for Ruby]),
3533        [enable_shared=$enableval])
3534 libprefix=${multiarch+'$(archlibdir)'}${multiarch-'$(libdir)'}
3535 LIBRUBY_RELATIVE=${load_relative-no}
3536 AS_CASE("$enable_shared", [yes], [
3537   LIBRUBY='$(LIBRUBY_SO)'
3538   LIBRUBYARG_SHARED='-l$(RUBY_SO_NAME)'
3539   LIBRUBYARG='$(LIBRUBYARG_SHARED)'
3540   LIBRUBY_RELATIVE=no
3541   test -z "$CCDLFLAGS" || CFLAGS="$CFLAGS $CCDLFLAGS"
3542   ENABLE_SHARED=yes
3544   # libdir can be overridden in config.site file (on OpenSUSE at least).
3545   libdir_basename=lib
3546   AS_IF([test "$bindir" = '${exec_prefix}/bin'], [
3547     AS_CASE(["$libdir"], ['${exec_prefix}/'*], [libdir_basename=`basename "$libdir"`])
3548   ])
3549   AC_DEFINE_UNQUOTED(LIBDIR_BASENAME, ["${libdir_basename}"])
3550   libdir_basename="${libdir_basename}"${multiarch+'/${arch}'}
3552   # Debian bullseye reportedly has its ld(1) patched, which breaks
3553   # --enable-shared --with-jemalloc combination.  We might have to deal with
3554   # the ld(1) change sooner or later, but in the meantime let us force it
3555   # the old way.
3556   #
3557   # See https://github.com/ruby/ruby/pull/4627
3558   RUBY_TRY_LDFLAGS([${linker_flag}--no-as-needed], [no_as_needed=yes], [no_as_needed=no])
3559   AS_IF([test "$no_as_needed" = yes], [
3560       RUBY_APPEND_OPTIONS(LDFLAGS, [${linker_flag}--no-as-needed])
3561   ])
3563   AS_CASE(["$target_os"],
3564     [freebsd*|dragonfly*], [],
3565     [
3566      AS_IF([test "$GCC" = yes], [
3567        RUBY_TRY_LDFLAGS([${linker_flag}--no-undefined], [no_undefined=yes], [no_undefined=no])
3568        AS_IF([test "no_undefined" = yes], [
3569           RUBY_APPEND_OPTION(EXTLDFLAGS, [${linker_flag}--no-undefined])
3570        ])
3571      ])
3572     ])
3574   AS_CASE(["$target_os"],
3575     [sunos4*], [
3576         LIBRUBY_ALIASES='$(LIBRUBY_SONAME) lib$(RUBY_SO_NAME).$(SOEXT)'
3577         ],
3578     [linux* | gnu* | k*bsd*-gnu | atheos* | kopensolaris*-gnu | haiku*], [
3579         RUBY_APPEND_OPTIONS(LIBRUBY_DLDFLAGS, ['-Wl,-soname,$(LIBRUBY_SONAME)' "$LDFLAGS_OPTDIR"])
3580         LIBRUBY_ALIASES='$(LIBRUBY_SONAME) lib$(RUBY_SO_NAME).$(SOEXT)'
3581         AS_IF([test "$load_relative" = yes], [
3582             libprefix="'\$\${ORIGIN}/../${multiarch+../../}${libdir_basename}'"
3583             LIBRUBY_RPATHFLAGS="-Wl,-rpath,${libprefix}"
3584             LIBRUBY_RELATIVE=yes
3585         ])
3586         ],
3587     [freebsd*|dragonfly*], [
3588         LIBRUBY_SO='lib$(RUBY_SO_NAME).$(SOEXT).$(MAJOR)$(MINOR)'
3589         LIBRUBY_SONAME='$(LIBRUBY_SO)'
3590         AS_IF([test "$rb_cv_binary_elf" != "yes" ], [
3591             LIBRUBY_SO="$LIBRUBY_SO.\$(TEENY)"
3592             LIBRUBY_ALIASES=''
3593         ], [test "$load_relative" = yes], [
3594             libprefix="'\$\$ORIGIN/../${multiarch+../../}${libdir_basename}'"
3595             LIBRUBY_RPATHFLAGS="-Wl,-rpath,${libprefix}"
3596             LIBRUBY_RELATIVE=yes
3597         ])
3598         ],
3599     [netbsd*], [
3600         LIBRUBY_SONAME='lib$(RUBY_SO_NAME).$(SOEXT).$(MAJOR)$(MINOR)'
3601         LIBRUBY_SO="${LIBRUBY_SONAME}"'.$(TEENY)'
3602         RUBY_APPEND_OPTIONS(LIBRUBY_DLDFLAGS, ['-Wl,-soname,$(LIBRUBY_SONAME)' "$LDFLAGS_OPTDIR"])
3603         AS_IF([test "$rb_cv_binary_elf" = yes], [ # ELF platforms
3604            LIBRUBY_ALIASES='$(LIBRUBY_SONAME) lib$(RUBY_SO_NAME).$(SOEXT)'
3605         ], [    # a.out platforms
3606            LIBRUBY_ALIASES=""
3607         ])
3608         ],
3609     [openbsd*|mirbsd*], [
3610         LIBRUBY_SO='lib$(RUBY_SO_NAME).$(SOEXT).$(MAJOR).'`expr ${MINOR} \* 10 + ${TEENY}`
3611         ],
3612     [solaris*], [
3613         LIBRUBY_SO='lib$(RUBY_SO_NAME).$(SOEXT).$(MAJOR)'
3614         LIBRUBY_SONAME='lib$(RUBY_SO_NAME).$(SOEXT).$(RUBY_PROGRAM_VERSION)'
3615         LIBRUBY_ALIASES='$(LIBRUBY_SONAME) lib$(RUBY_SO_NAME).$(SOEXT)'
3616         RUBY_APPEND_OPTIONS(LIBRUBY_DLDFLAGS, ["${linker_flag}-h${linker_flag:+,}"'$(@F)'])
3617         AS_IF([test "$load_relative" = yes], [
3618             libprefix="'\$\$ORIGIN/../${multiarch+../../}${libdir_basename}'"
3619             LIBRUBY_RPATHFLAGS="-R${libprefix}"
3620             LIBRUBY_RELATIVE=yes
3621         ], [
3622             LIBRUBY_RPATHFLAGS='-R${libdir}'
3623         ])
3624         ],
3625     [aix*], [
3626         RUBY_APPEND_OPTIONS(LIBRUBY_DLDFLAGS, ["${linker_flag}-bnoentry" "$XLDFLAGS" "$LDFLAGS_OPTDIR"])
3627         LIBRUBYARG_SHARED='-L${libdir} -l${RUBY_SO_NAME}'
3628         LIBS="$LIBS -lm -lc"
3629         ],
3630     [darwin*], [
3631         LIBRUBY_SO='lib$(RUBY_SO_NAME).$(SOEXT)'
3632         LIBRUBY_SONAME='$(LIBRUBY_SO)'
3633         LIBRUBY_ALIASES='lib$(RUBY_INSTALL_NAME).$(SOEXT)'
3634         AS_IF([test "$load_relative" = yes], [
3635             libprefix="@executable_path/../${multiarch+../../}${libdir_basename}"
3636             LIBRUBY_RELATIVE=yes
3637         ])
3638         LIBRUBY_DLDFLAGS="$LIBRUBY_DLDFLAGS -install_name ${libprefix}"'/$(LIBRUBY_SONAME)'
3639         LIBRUBY_DLDFLAGS="$LIBRUBY_DLDFLAGS "'-compatibility_version $(RUBY_API_VERSION)'
3640         LIBRUBY_DLDFLAGS="$LIBRUBY_DLDFLAGS "'-current_version $(RUBY_PROGRAM_VERSION)'
3641         AS_IF([test "$visibility_option" = ld], [
3642             LIBRUBY_DLDFLAGS="$LIBRUBY_DLDFLAGS "'-Wl,-unexported_symbol,_Init_*'
3643             LIBRUBY_DLDFLAGS="$LIBRUBY_DLDFLAGS "'-Wl,-unexported_symbol,_ruby_static_id_*'
3644             LIBRUBY_DLDFLAGS="$LIBRUBY_DLDFLAGS "'-Wl,-unexported_symbol,*_threadptr_*'
3645         ])
3646         LIBRUBY_DLDFLAGS="$LIBRUBY_DLDFLAGS "' $(XLDFLAGS)'
3647         ],
3648     [interix*], [
3649         LIBRUBYARG_SHARED='-L. -L${libdir} -l$(RUBY_SO_NAME)'
3650         ],
3651     [cygwin*|msys*|mingw*|mswin*], [
3652         LIBRUBY_RELATIVE=yes
3653         ])
3654 ], [
3655   LIBRUBYARG_SHARED=
3657   # enable PIE if possible
3658   AC_ARG_ENABLE(pie,
3659           AS_HELP_STRING([--disable-pie], [disable PIE feature]),
3660           [pie=$enableval], [pie=])
3661   AS_IF([test "$GCC" = yes -a -z "$EXTSTATIC" -a "x$pie" != xno], [
3662     RUBY_TRY_CFLAGS(-fPIE, [pie=yes], [pie=no])
3663     AS_IF([test "$pie" = yes], [
3664       # Use -fPIE when testing -pie.  RUBY_TRY_LDFLAGS sets
3665       # $save_CFLAGS internally, so set other name here.
3666       save_CFLAGS_before_pie="$CFLAGS"
3667       CFLAGS="$CFLAGS -fPIE"
3669       # gcc need -pie but clang need -Wl,-pie.
3670       for pie in -pie -Wl,-pie; do
3671         RUBY_TRY_LDFLAGS([$pie], [], [pie=])
3672         AS_IF([test "x$pie" != x], [
3673           RUBY_APPEND_OPTION(XCFLAGS, -fPIE)
3674           RUBY_APPEND_OPTION(XLDFLAGS, $pie)
3675           break
3676         ])
3677       done
3678       CFLAGS="$save_CFLAGS_before_pie"
3679     ])
3680   ])
3682 AS_IF([test "$enable_rpath" = yes], [
3683     test -z "$LIBRUBY_RPATHFLAGS" || LIBRUBY_RPATHFLAGS="$LIBRUBY_RPATHFLAGS "
3684     rpathflag="${RPATHFLAG}"
3685     AS_CASE(["${cross_compiling}${load_relative}"], [*yes*], [], [rpathflag="$RPATHFLAG$LIBPATHFLAG"])
3686     rpathflag=`IFS="$PATH_SEPARATOR"
3687         echo x "$rpathflag" |
3688         sed "s/^x *//;s${IFS}"'%1\\$-s'"${IFS}${libprefix}${IFS}g;s${IFS}%s${IFS}${libprefix}${IFS}g"
3689     `
3690     LIBRUBY_RPATHFLAGS="$LIBRUBY_RPATHFLAGS${rpathflag}"
3691     LIBRUBYARG_SHARED="$LIBRUBY_RPATHFLAGS $LIBRUBYARG_SHARED"
3692     LIBRUBYARG_STATIC="$LIBRUBY_RPATHFLAGS $LIBRUBYARG_STATIC"
3694 AC_SUBST(LIBRUBY_RELATIVE)
3696 LDFLAGS="-L. $LDFLAGS"
3697 AC_SUBST(ARCHFILE)
3699 AS_IF([test "$EXEEXT" = .exe], [
3700     EXECUTABLE_EXTS='".exe",".com",".cmd",".bat"'
3701     AC_DEFINE_UNQUOTED(EXECUTABLE_EXTS, $EXECUTABLE_EXTS)
3702     EXECUTABLE_EXTS=`echo $EXECUTABLE_EXTS | tr -d '"' | tr , ' '`
3703     AC_SUBST(EXECUTABLE_EXTS)
3706 AS_CASE("$cross_compiling:${LIBPATHENV}", [yes:* | no:], [], [
3707     AC_MSG_CHECKING(whether wrapper for $LIBPATHENV is needed)
3708     AS_IF([env ${LIBPATHENV}=/lib /bin/sh -c ': ${'${LIBPATHENV}'?}' 2>/dev/null],
3709         [AC_MSG_RESULT(no)],
3710         [AC_SUBST(XRUBY_LIBPATHENV_WRAPPER, 'exe/$(PROGRAM)')
3711         AC_MSG_RESULT(yes)]
3712     )
3715 AC_ARG_ENABLE(dtrace,
3716         AS_HELP_STRING([--enable-dtrace],
3717         [enable DTrace for tracing inside ruby. enabled by default on systems having dtrace]),
3718         [enable_dtrace=$enableval], [enable_dtrace=auto])
3720 LIBRUBY_A_OBJS='$(OBJS)'
3721 DTRACE_REBUILD=
3722 AS_CASE(["${enable_dtrace}"],
3723 [yes|auto], [
3724     RUBY_DTRACE_AVAILABLE()
3725 ], [
3726     rb_cv_dtrace_available=no
3728 AS_CASE(["$target_os"],[freebsd*],[
3729          rb_cv_dtrace_available=no
3730          ])
3731 AS_IF([test "${enable_dtrace}" = yes], [dnl
3732     AS_IF([test -z "$DTRACE"], [dnl
3733         AC_MSG_ERROR([dtrace(1) is missing])
3734     ], [test "$cross_compiling" = yes], [dnl
3735         AC_MSG_ERROR([--enable-dtrace, however, cross compiling])
3736     ], [test "${rb_cv_dtrace_available}" = "no"], [dnl
3737        AC_MSG_ERROR([--enable-dtrace, however, USDT is not available])
3738     ])
3740 AS_CASE([$rb_cv_dtrace_available],
3741 [yes*], [dnl
3742     RUBY_DTRACE_POSTPROCESS()
3743     AS_IF([test "$rb_cv_prog_dtrace_g" != no], [dnl
3744         DTRACE_OBJ='probes.$(OBJEXT)'
3745     ])
3746     AS_IF([test "$rb_cv_prog_dtrace_g" = rebuild], [dnl
3747         DTRACE_REBUILD=yes
3748         LIBRUBY_A_OBJS='$(DTRACE_GLOMMED_OBJ)'
3749     ])
3750     AS_CASE("${target_os}", [freebsd*], [dnl
3751         # FreeBSD's dtrace requires libelf
3752         LIBS="-lelf $LIBS"
3753     ])
3754     DTRACE_EXT=d
3755 ], [dnl
3756     enable_dtrace=no
3757     DTRACE_EXT=dmyh
3759 AC_SUBST(DTRACE_EXT)
3760 AC_SUBST(DTRACE_OBJ)
3761 AC_SUBST(DTRACE_REBUILD)
3762 AC_SUBST(DTRACE_OPT)
3763 AC_SUBST(LIBRUBY_A_OBJS)
3765 AC_ARG_ENABLE(gcov,
3766        AS_HELP_STRING([--enable-gcov], [enable coverage measurement by gcov]),
3767        [gcov=yes])
3768 AS_IF([test x"$gcov" = xyes], [
3769     CFLAGS="$CFLAGS -coverage"
3770     LDFLAGS="$LDFLAGS -coverage"
3773 RUBY_SETJMP_TYPE
3774 RUBY_SHARED_GC
3777 [begin]_group "installation section" && {
3778 dnl build rdoc index if requested
3779 RDOCTARGET=""
3780 CAPITARGET=""
3781 AC_ARG_ENABLE(install-doc,
3782        AS_HELP_STRING([--disable-install-doc], [do not install either rdoc indexes or C API documents during install]),
3783        [install_doc=$enableval], [install_doc=yes])
3784 AC_ARG_WITH(rdoc,
3785       AS_HELP_STRING([--with-rdoc=ri,html], [comma/space separated list of RDoc formats to install]),
3786       [install_rdoc=`echo ,$withval, | sed 'y/,/ /;s/ ri / rdoc /;s/^ *//;s/ *$//'`], [
3787 AC_ARG_ENABLE(install-rdoc,
3788       AS_HELP_STRING([--disable-install-rdoc], [do not install rdoc indexes during install]),
3789       [install_rdoc=$enableval], [install_rdoc=yes])
3791 AC_ARG_ENABLE(install-capi,
3792       AS_HELP_STRING([--disable-install-capi], [do not install C API documents during install]),
3793       [install_capi=$enableval], [install_capi=no])
3795 AS_IF([test "$install_doc" != no], [
3796     AS_CASE(["$install_rdoc"],
3797     [yes], [
3798         RDOCTARGET="rdoc"
3799     ],
3800     [all], [
3801         RDOCTARGET="rdoc html"
3802     ],
3803     [no|''], [
3804         RDOCTARGET="nodoc"
3805     ],
3806     [
3807         RDOCTARGET="$install_rdoc"
3808     ])
3809     AS_IF([test "$install_capi" != no -a -n "$DOXYGEN"], [
3810         CAPITARGET="capi"
3811     ], [
3812         CAPITARGET="nodoc"
3813     ])
3814 ], [
3815     RDOCTARGET="nodoc"
3816     CAPITARGET="nodoc"
3819 AC_SUBST(RDOCTARGET)
3820 AC_SUBST(CAPITARGET)
3822 AS_CASE(["$RDOCTARGET:$CAPITARGET"],[nodoc:nodoc],[INSTALLDOC=nodoc],[INSTALLDOC=all])
3823 AC_SUBST(INSTALLDOC)
3825 AC_ARG_ENABLE(install-static-library,
3826         AS_HELP_STRING([--disable-install-static-library], [do not install static ruby library]),
3827         [INSTALL_STATIC_LIBRARY=$enableval
3828          AS_IF([test x"$enable_shared" = xno -a x"$INSTALL_STATIC_LIBRARY" = xno],
3829                  [AC_MSG_ERROR([must install either static or shared library])],
3830                  [])],
3831         AS_IF([test x"$enable_shared" = xyes],
3832             [INSTALL_STATIC_LIBRARY=no],
3833             [INSTALL_STATIC_LIBRARY=yes]))
3834 AC_SUBST(INSTALL_STATIC_LIBRARY)
3837 [begin]_group "JIT section" && {
3838 AC_CHECK_PROG(RUSTC, [rustc], [rustc], [no]) dnl no ac_tool_prefix
3840 dnl check if rustc is recent enough to build YJIT (rustc >= 1.58.0)
3841 YJIT_RUSTC_OK=no
3842 AS_IF([test "$RUSTC" != "no"],
3843     AC_MSG_CHECKING([whether ${RUSTC} works for YJIT])
3844     YJIT_TARGET_ARCH=
3845     AS_CASE(["$target_cpu"],
3846         [arm64|aarch64], [YJIT_TARGET_ARCH=aarch64],
3847         [x86_64], [YJIT_TARGET_ARCH=x86_64],
3848     )
3849     dnl Fails in case rustc target doesn't match ruby target.
3850     dnl Can happen on Rosetta, for example.
3851     AS_IF([echo "#[cfg(target_arch = \"$YJIT_TARGET_ARCH\")] fn main() { let x = 1; format!(\"{x}\"); }" |
3852             $RUSTC - --emit asm=/dev/null 2>/dev/null],
3853         [YJIT_RUSTC_OK=yes]
3854     )
3855     AC_MSG_RESULT($YJIT_RUSTC_OK)
3858 dnl check if we can build YJIT on this target platform
3859 dnl we can't easily cross-compile with rustc so we don't support that
3860 YJIT_TARGET_OK=no
3861 AS_IF([test "$cross_compiling" = no],
3862     AS_CASE(["$target_cpu-$target_os"],
3863         [*android*], [
3864             YJIT_TARGET_OK=no
3865         ],
3866         [arm64-darwin*|aarch64-darwin*|x86_64-darwin*], [
3867             YJIT_TARGET_OK=yes
3868         ],
3869         [arm64-*linux*|aarch64-*linux*|x86_64-*linux*], [
3870             YJIT_TARGET_OK=yes
3871         ],
3872         [arm64-*bsd*|aarch64-*bsd*|x86_64-*bsd*], [
3873             YJIT_TARGET_OK=yes
3874         ]
3875     )
3878 dnl build YJIT in release mode if rustc >= 1.58.0 is present and we are on a supported platform
3879 AC_ARG_ENABLE(yjit,
3880     AS_HELP_STRING([--enable-yjit],
3881     [enable in-process JIT compiler that requires Rust build tools. enabled by default on supported platforms if rustc 1.58.0+ is available]),
3882     [YJIT_SUPPORT=$enableval],
3883     [AS_CASE(["$YJIT_TARGET_OK:$YJIT_RUSTC_OK"],
3884         [yes:yes], [
3885             YJIT_SUPPORT=yes
3886         ],
3887         [YJIT_SUPPORT=no]
3888     )]
3891 CARGO=
3892 CARGO_BUILD_ARGS=
3893 YJIT_LIBS=
3894 AS_CASE(["${YJIT_SUPPORT}"],
3895 [yes|dev|stats|dev_nodebug], [
3896     AS_IF([test x"$RUSTC" = "xno"],
3897         AC_MSG_ERROR([rustc is required. Installation instructions available at https://www.rust-lang.org/tools/install])
3898     )
3900     AS_CASE(["${YJIT_SUPPORT}"],
3901     [yes], [
3902         rb_rust_target_subdir=release
3903     ],
3904     [dev], [
3905         rb_rust_target_subdir=debug
3906         CARGO_BUILD_ARGS='--features stats,disasm'
3907         AC_DEFINE(RUBY_DEBUG, 1)
3908     ],
3909     [dev_nodebug], [
3910         rb_rust_target_subdir=dev_nodebug
3911         CARGO_BUILD_ARGS='--profile dev_nodebug --features stats,disasm'
3912         AC_DEFINE(YJIT_STATS, 1)
3913     ],
3914     [stats], [
3915         rb_rust_target_subdir=stats
3916         CARGO_BUILD_ARGS='--profile stats --features stats'
3917         AC_DEFINE(YJIT_STATS, 1)
3918     ])
3920     AS_IF([test -n "${CARGO_BUILD_ARGS}"], [
3921              AC_CHECK_TOOL(CARGO, [cargo], [no])
3922              AS_IF([test x"$CARGO" = "xno"],
3923                 AC_MSG_ERROR([cargo is required. Installation instructions available at https://www.rust-lang.org/tools/install])
3924              ]))
3926     YJIT_LIBS="yjit/target/${rb_rust_target_subdir}/libyjit.a"
3927     AS_CASE(["$target_os"],[openbsd*],[
3928         # Link libc++abi (which requires libpthread) for _Unwind_* functions needed by yjit
3929         LDFLAGS="$LDFLAGS -lpthread -lc++abi"
3930     ])
3931     YJIT_OBJ='yjit.$(OBJEXT)'
3932     AS_IF([test x"$YJIT_SUPPORT" != "xyes" ], [
3933         AC_DEFINE_UNQUOTED(YJIT_SUPPORT, [$YJIT_SUPPORT])
3934     ])
3935     AC_DEFINE(USE_YJIT, 1)
3936 ], [
3937     AC_DEFINE(USE_YJIT, 0)
3940 dnl These variables end up in ::RbConfig::CONFIG
3941 AC_SUBST(YJIT_SUPPORT)dnl what flavor of YJIT the Ruby build includes
3942 AC_SUBST(RUSTC)dnl Rust compiler command
3943 AC_SUBST(CARGO)dnl Cargo command for Rust builds
3944 AC_SUBST(CARGO_BUILD_ARGS)dnl for selecting Rust build profiles
3945 AC_SUBST(YJIT_LIBS)dnl for optionally building the Rust parts of YJIT
3946 AC_SUBST(YJIT_OBJ)dnl for optionally building the C parts of YJIT
3948 dnl RJIT supports only x86_64 platforms, but allows arm64/aarch64 for custom JITs.
3949 RJIT_TARGET_OK=no
3950 AS_IF([test "$cross_compiling" = no],
3951     AS_CASE(["$target_cpu-$target_os"],
3952         [*android*], [
3953             RJIT_TARGET_OK=no
3954         ],
3955         [arm64-darwin*|aarch64-darwin*|x86_64-darwin*], [
3956             RJIT_TARGET_OK=yes
3957         ],
3958         [arm64-*linux*|aarch64-*linux*|x86_64-*linux*], [
3959             RJIT_TARGET_OK=yes
3960         ],
3961         [arm64-*bsd*|aarch64-*bsd*|x86_64-*bsd*], [
3962             RJIT_TARGET_OK=yes
3963         ]
3964     )
3967 dnl Build RJIT on supported platforms or if --enable-rjit is specified.
3968 AC_ARG_ENABLE(rjit,
3969     AS_HELP_STRING([--enable-rjit],
3970     [enable pure-Ruby JIT compiler. enabled by default on Unix x86_64 platforms]),
3971     [RJIT_SUPPORT=$enableval],
3972     [AS_CASE(["$RJIT_TARGET_OK"],
3973         [yes], [RJIT_SUPPORT=yes],
3974         [RJIT_SUPPORT=no]
3975     )]
3978 AS_CASE(["$RJIT_SUPPORT"],
3979 [yes|dev], [
3980     AS_CASE(["$RJIT_SUPPORT"],
3981     [dev], [
3982         # Link libcapstone for --rjit-dump-disasm
3983         AC_CHECK_LIB([capstone], [cs_disasm])
3984     ])
3986     AC_DEFINE(USE_RJIT, 1)
3987 ], [
3988     AC_DEFINE(USE_RJIT, 0)
3991 AC_SUBST(RJIT_SUPPORT)
3994 [begin]_group "build section" && {
3995 AC_CACHE_CHECK([for prefix of external symbols], rb_cv_symbol_prefix, [
3996     AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[extern void conftest_external(void) {}]], [[]])],[
3997         rb_cv_symbol_prefix=`$NM conftest.$ac_objext |
3998                              sed -n ['/.*T[     ]\([^   ]*\)conftest_external.*/!d;s//\1/p;q']`
3999         ],
4000         [rb_cv_symbol_prefix=''])
4001     test -n "$rb_cv_symbol_prefix" || rb_cv_symbol_prefix=NONE
4003 SYMBOL_PREFIX="$rb_cv_symbol_prefix"
4004 test "x$SYMBOL_PREFIX" = xNONE && SYMBOL_PREFIX=''
4006 AS_IF([test x"$enable_shared" = xyes], [
4007     AC_CACHE_CHECK([for default symbols in empty shared library], rb_cv_symbols_in_emptylib, [
4008         save_CC="$CC"
4009         eval CC=\"`printf "%s" "${DLDSHARED}" | sed ['s/\$(CC)/${CC}/']`\"
4010         AC_LINK_IFELSE([AC_LANG_PROGRAM()],[
4011             rb_cv_symbols_in_emptylib=`$NM -Pgp conftest$ac_exeext |
4012                 sed ["/ [A-TV-Z] .*/!d;s///;s/^${SYMBOL_PREFIX}//;/^main$/d"]`
4013         ])
4014         set dummy ${rb_cv_symbols_in_emptylib}
4015         shift
4016         rb_cv_symbols_in_emptylib="$*"
4017         CC="$save_CC"
4018     ])
4020 AC_SUBST(XSYMBOLS_IN_EMPTYLIB, "${rb_cv_symbols_in_emptylib}")
4022 DLNOBJ=dln.o
4023 AC_ARG_ENABLE(dln,
4024               AS_HELP_STRING([--disable-dln], [disable dynamic link feature]),
4025               [test "$enableval" = yes || DLNOBJ=dmydln.o])
4026 AC_SUBST(DLNOBJ)
4027 MINIDLNOBJ=dmydln.o
4029 AS_CASE(["$target_os"],
4030     [linux*], [
4031         ],
4032     [netbsd*], [
4033         RUBY_APPEND_OPTION(CFLAGS, -pipe)
4034         ],
4035     [darwin*], [
4036         RUBY_APPEND_OPTION(CFLAGS, -pipe)
4037         AC_MSG_CHECKING([whether Security framework is needed])
4038         AC_COMPILE_IFELSE([
4039             AC_LANG_BOOL_COMPILE_TRY([
4040 @%:@include <AvailabilityMacros.h>
4041 enum {
4042     least = MAC_OS_X_VERSION_10_7, /* just fail if undefined */
4043     required = MAC_OS_X_VERSION_MIN_REQUIRED,
4044     upper /* bigger than MIN_REQUIRED, or */
4045 @%:@ifdef MAC_OS_X_VERSION_10_10
4046         = MAC_OS_X_VERSION_10_10
4047 @%:@endif
4048 };],
4049             [required >= least && required < upper])],
4050             [dnl
4051                 AC_MSG_RESULT(yes)
4052                 RUBY_APPEND_OPTION(XLDFLAGS, [-framework Security])
4053                 RUBY_APPEND_OPTION(LIBRUBYARG_STATIC, [-framework Security])
4054             ],dnl
4055             [dnl
4056                 AC_MSG_RESULT(no)
4057             ]dnl
4058         )
4059         RUBY_APPEND_OPTION(XLDFLAGS, [-framework CoreFoundation])
4060         RUBY_APPEND_OPTION(LIBRUBYARG_STATIC, [-framework CoreFoundation])
4061         ],
4062     [osf*], [
4063         AS_IF([test "$GCC" != "yes" ], [
4064           # compile something small: taint.c is fine for this.
4065           # the main point is the '-v' flag of 'cc'.
4066           AS_CASE(["`cc -v -I. -c main.c -o /tmp/main.o 2>&1`"],
4067           [*/gemc_cc*], [   # we have the new DEC GEM CC
4068                         CFLAGS="$CFLAGS -oldc"
4069                         ],
4070           [            # we have the old MIPS CC
4071                         ])
4072           # cleanup
4073           rm -f /tmp/main.o
4074           CFLAGS="$CFLAGS -std"
4075         ])
4076         ],
4077     [cygwin*|msys*|mingw*], [
4078         LIBRUBY_DLDFLAGS="${LIBRUBY_DLDFLAGS}"' -Wl,--out-implib=$(LIBRUBY)'
4079         AS_CASE(["$target_os"],
4080         [cygwin*], [
4081             AS_IF([test x"$enable_shared" = xyes], [
4082                 LIBRUBY_SO='cyg$(RUBY_SO_NAME)'.dll
4083                 LIBRUBY_DLDFLAGS="${LIBRUBY_DLDFLAGS}"' $(RUBYDEF)'
4084             ])
4085             ],
4086         [mingw*], [
4087             AS_IF([test x"$enable_shared" = xyes], [
4088                 LIBRUBY_SO='$(RUBY_SO_NAME)'.dll
4089                 LIBRUBY_DLDFLAGS="${LIBRUBY_DLDFLAGS}"' $(RUBYDEF)'
4090             ])
4091             EXPORT_PREFIX=' '
4092             EXTDLDFLAGS='$(DEFFILE)'
4093             AC_LIBOBJ([win32/win32])
4094             AC_LIBOBJ([win32/file])
4095             COMMON_LIBS=m
4096 #           COMMON_MACROS="WIN32_LEAN_AND_MEAN="
4097             COMMON_HEADERS="winsock2.h windows.h"
4098             PLATFORM_DIR=win32
4099             ])
4100         LIBRUBY_ALIASES=''
4101         FIRSTMAKEFILE=GNUmakefile:cygwin/GNUmakefile.in
4102         AS_IF([test x"$enable_shared" = xyes], [
4103             LIBRUBY='lib$(RUBY_SO_NAME).dll.a'
4104         ], [
4105             LIBRUBY_SO=dummy
4106             LIBRUBY='lib$(RUBY_SO_NAME).a'
4107             LIBRUBYARG='-l$(RUBY_SO_NAME)'
4108         ])
4109         ],
4110     [wasi*], [
4111         FIRSTMAKEFILE=GNUmakefile:wasm/GNUmakefile.in
4112         AC_LIBOBJ([wasm/missing])
4113         AC_LIBOBJ([wasm/runtime])
4114         AC_LIBOBJ([wasm/fiber])
4115         AC_LIBOBJ([wasm/machine])
4116         AC_LIBOBJ([wasm/setjmp])
4117         AC_LIBOBJ([wasm/machine_core])
4118         AC_LIBOBJ([wasm/setjmp_core])
4119         PLATFORM_DIR=wasm
4122 MINIOBJS="$MINIDLNOBJ"
4124 AC_ARG_ENABLE(debug-env,
4125        AS_HELP_STRING([--enable-debug-env], [enable RUBY_DEBUG environment variable]),
4126        [AC_SUBST(ENABLE_DEBUG_ENV, yes)])
4128 AS_CASE(["$FIRSTMAKEFILE"], [*GNUmakefile:*], [gnumake=yes], [
4129     AC_MSG_CHECKING([if ${MAKE-make} is GNU make])
4130     mkdir conftest.dir
4131     echo "all:; @echo yes" > conftest.dir/GNUmakefile
4132     echo "all:; @echo no" > conftest.dir/Makefile
4133     gnumake=`(cd conftest.dir; ${MAKE-make})`
4134     rm -fr conftest.dir
4135     AS_CASE(["$gnumake"],
4136     [*yes*], [
4137         FIRSTMAKEFILE=GNUmakefile:template/GNUmakefile.in
4138         gnumake=yes],
4139     [
4140         gnumake=no])
4141     AC_MSG_RESULT($gnumake)
4143 AS_IF([test "$gnumake" = yes], [ NULLCMD=: ], [
4144     AC_MSG_CHECKING([for safe null command for ${MAKE-make}])
4145     mkdir conftest.dir
4146     NULLCMD=
4147     for cmd in : true; do
4148         echo 'A=1' > conftest.dir/Makefile
4149         echo 'B=$(A:1=@'$cmd')' >> conftest.dir/Makefile
4150         echo 'all:; $B 1 2 3 4 5 6 7 8 9' >> conftest.dir/Makefile
4151         AS_IF([(cd conftest.dir; ${MAKE-make} >/dev/null 2>/dev/null)], [
4152             NULLCMD=$cmd
4153             break
4154         ])
4155     done
4156     rm -fr conftest.dir
4157     AS_IF([test -z "$NULLCMD"], [
4158         AC_MSG_ERROR(no candidate for safe null command)
4159     ])
4160     AC_MSG_RESULT($NULLCMD)
4162 AC_SUBST(NULLCMD)
4164 AS_IF([test "${universal_binary-no}" = yes ], [
4165     AC_CACHE_CHECK([for architecture macros], rb_cv_architecture_macros, [
4166     mv confdefs.h confdefs1.h
4167     : > confdefs.h
4168     AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@if defined __`echo ${universal_archnames} |
4169     sed 's/=[^ ]*//g;s/ /__ || defined __/g'`__
4170 @%:@else
4171 @%:@error
4172 >>>>>><<<<<<
4173 @%:@endif]], [[]])],[
4174     rb_cv_architecture_macros=yes
4175     mv -f confdefs1.h confdefs.h
4176 ], [
4177     rb_cv_architecture_macros=no
4178     archflagpat=`eval echo '"'"${ARCH_FLAG}"'"' | sed 's/[[][|.*]]/\\&/g'`
4179     new_cflags=`echo "$CFLAGS" | sed "s|$archflagpat"'||'`
4180     for archs in ${universal_archnames}; do
4181         cpu=${archs@%:@*=}
4182         archs=${archs%=*}
4183         CFLAGS="$new_cflags -arch $archs"
4184         archs="__${archs}__"
4185         AC_MSG_CHECKING([for macro ${archs} on ${cpu}])
4186         AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@ifndef ${archs}
4187 @%:@error
4188 @%:@endif]], [[]])],
4189         [AC_MSG_RESULT([yes])], [AC_MSG_RESULT([no])])
4190     done
4191     mv -f confdefs1.h confdefs.h
4192     AC_MSG_ERROR([failed])
4193     ])])
4194     AC_CACHE_CHECK(whether __ARCHITECTURE__ is available, rb_cv_architecture_available,
4195         AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include <stdio.h>
4196                 const char arch[[]] = __ARCHITECTURE__;]], [[puts(arch);]])],
4197                 [rb_cv_architecture_available=yes], [rb_cv_architecture_available=no]))
4201 [end]_group
4203 MAINLIBS="$LIBS"
4204 LIBS=$ORIG_LIBS
4205 AS_IF([test -n "${LIBS}"], [
4206     libspat=`echo "${LIBS}" | sed 's/[[][|.*$^]]/\\&/g;s/^  */ /;s/^  *$/ /'`
4207     MAINFLAGS=`echo " $MAINLIBS " | sed "s|$libspat"'||;s/^ *//;s/ *$//'`
4209 LIBRUBYARG_STATIC="${LIBRUBYARG_STATIC} \$(MAINLIBS)"
4210 CPPFLAGS="$CPPFLAGS "'$(DEFS)'
4211 test -z "$CPPFLAGS" || CPPFLAGS="$CPPFLAGS "; CPPFLAGS="$CPPFLAGS"'${cppflags}'
4212 AS_IF([test -n "${cflags+set}"], [
4213     cflagspat=`eval echo '"'"${cflags}"'"' | sed 's/[[][|.*]]/\\&/g;s/^  */ /;s/^  *$/ /'`
4214     CFLAGS=`echo " $CFLAGS " | sed "s|$cflagspat"'|${cflags}|;s/^ *//;s/ *$//'`
4216 AS_IF([test -n "${cxxflags+set}"], [
4217     cxxflagspat=`eval echo '"'"${cxxflags}"'"' | sed 's/[[][|.*]]/\\&/g;s/^  */ /;s/^  *$/ /'`
4218     CXXFLAGS=`echo " $CXXFLAGS " | sed "s|$cxxflagspat"'|${cxxflags}|;s/^ *//;s/ *$//'`
4220 AS_IF([test "${ARCH_FLAG}"], [
4221     archflagpat=`eval echo '"'"${ARCH_FLAG}"'"' | sed 's/[[][|.*]]/\\&/g'`
4222     CFLAGS=`echo "$CFLAGS" | sed "s| *$archflagpat"'||'`
4223     CXXFLAGS=`echo "$CXXFLAGS" | sed "s| *$archflagpat"'||'`
4224     LDFLAGS=`echo "$LDFLAGS" | sed "s| *$archflagpat"'||'`
4226 rb_cv_warnflags=`echo "$rb_cv_warnflags" | sed 's/^ *//;s/ *$//'`
4227 warnflags="$rb_cv_warnflags"
4228 AC_SUBST(cppflags)dnl
4229 AC_SUBST(cflags, ["${orig_cflags:+$orig_cflags }"'${optflags} ${debugflags} ${warnflags}'])dnl
4230 AC_SUBST(cxxflags)dnl
4231 AC_SUBST(optflags)dnl
4232 AC_SUBST(debugflags)dnl
4233 AC_SUBST(warnflags)dnl
4234 AC_SUBST(strict_warnflags)dnl
4235 AC_SUBST(XCFLAGS)dnl
4236 AC_SUBST(XLDFLAGS)dnl
4237 AC_SUBST(EXTLDFLAGS)dnl
4238 AC_SUBST(EXTDLDFLAGS)dnl
4239 AC_SUBST(LIBRUBY_LDSHARED)
4240 AC_SUBST(LIBRUBY_DLDFLAGS)
4241 AC_SUBST(RUBY_INSTALL_NAME)
4242 AC_SUBST(rubyw_install_name)
4243 AC_SUBST(RUBYW_INSTALL_NAME)
4244 AC_SUBST(RUBY_SO_NAME)
4245 AC_SUBST(LIBRUBY_A)
4246 AC_SUBST(LIBRUBY_SO)
4247 AC_SUBST(LIBRUBY_SONAME)
4248 AC_SUBST(LIBRUBY_ALIASES)
4249 AC_SUBST(LIBRUBY)
4250 AC_SUBST(LIBRUBYARG)
4251 AC_SUBST(LIBRUBYARG_STATIC)
4252 AC_SUBST(LIBRUBYARG_SHARED)
4253 AC_SUBST(SOLIBS)
4254 AC_SUBST(DLDLIBS)
4255 AC_SUBST(DLDSHARED)
4256 AC_SUBST(ENABLE_SHARED)
4257 AC_SUBST(MAINLIBS)
4258 AC_SUBST(COMMON_LIBS)
4259 AC_SUBST(COMMON_MACROS)
4260 AC_SUBST(COMMON_HEADERS)
4261 AC_SUBST(EXPORT_PREFIX)
4262 AC_SUBST(SYMBOL_PREFIX)
4263 AC_SUBST(MINIOBJS)
4264 AC_SUBST(THREAD_MODEL)
4265 AC_SUBST(COROUTINE_TYPE, ${coroutine_type})
4266 AC_SUBST(PLATFORM_DIR)
4267 AC_SUBST(USE_LLVM_WINDRES)
4269 firstmf=`echo $FIRSTMAKEFILE | sed 's/:.*//'`
4270 firsttmpl=`echo $FIRSTMAKEFILE | sed 's/.*://'`
4271 MAKEFILES="Makefile $firstmf"
4272 MAKEFILES="`echo $MAKEFILES`"
4273 AC_SUBST(MAKEFILES)
4275 ri_prefix=
4276 test "$program_prefix" != NONE &&
4277   ri_prefix=$program_prefix
4279 ri_suffix=
4280 test "$program_suffix" != NONE &&
4281   ri_suffix=$program_suffix
4283 RUBY_INSTALL_NAME="${ri_prefix}"'$(RUBY_BASE_NAME)'"${ri_suffix}"
4284 AS_CASE(["$target_os"],
4285   [cygwin*|msys*|mingw*], [
4286     RUBYW_INSTALL_NAME="${ri_prefix}"'$(RUBYW_BASE_NAME)'"${ri_suffix}"
4287     rubyw_install_name='$(RUBYW_INSTALL_NAME)'
4288     ])
4290 rubylibdir='${rubylibprefix}/${ruby_version}'
4291 rubyarchdir=${multiarch+'${rubyarchprefix}/${ruby_version}'}${multiarch-'${rubylibdir}/${arch}'}
4293 rubyarchprefix=${multiarch+'${archlibdir}/${RUBY_BASE_NAME}'}${multiarch-'${rubylibprefix}/${arch}'}
4294 AC_ARG_WITH(rubyarchprefix,
4295             AS_HELP_STRING([--with-rubyarchprefix=DIR],
4296                            [prefix for architecture dependent ruby libraries [[RUBYLIBPREFIX/ARCH]]]),
4297             [rubyarchprefix="$withval"])
4298 AC_SUBST(rubyarchprefix)
4300 rubysitearchprefix=${multiarch+'${sitearchlibdir}/${RUBY_BASE_NAME}'}${multiarch-'${rubylibprefix}/${sitearch}'}
4301 AC_ARG_WITH(rubysitearchprefix,
4302             AS_HELP_STRING([--with-rubysitearchprefix=DIR],
4303                            [prefix for architecture dependent site libraries [[RUBYLIBPREFIX/SITEARCH]]]),
4304             [rubysitearchprefix="$withval"])
4305 AC_SUBST(rubysitearchprefix)
4307 RI_BASE_NAME=`echo ${RUBY_BASE_NAME} | sed 's/ruby/ri/'`
4308 ridir='${datarootdir}/${RI_BASE_NAME}'
4309 AC_ARG_WITH(ridir,
4310             AS_HELP_STRING([--with-ridir=DIR], [ri documentation [[DATAROOTDIR/ri]]]),
4311             [ridir=$withval])
4312 AC_SUBST(ridir)
4313 AC_SUBST(RI_BASE_NAME)
4315 AC_ARG_WITH(ruby-version,
4316             AS_HELP_STRING([--with-ruby-version=STR], [ruby version string for version specific directories [[full]] (full|minor|STR)]),
4317             [ruby_version=$withval],
4318             [ruby_version=full])
4319 unset RUBY_LIB_VERSION
4320 unset RUBY_LIB_VERSION_STYLE
4321 AS_CASE(["$ruby_version"],
4322   [full],  [RUBY_LIB_VERSION_STYLE='3   /* full */'],
4323   [minor], [RUBY_LIB_VERSION_STYLE='2   /* minor */'])
4324 AS_IF([test ${RUBY_LIB_VERSION_STYLE+set}], [
4325     {
4326     echo "#define RUBY_LIB_VERSION_STYLE $RUBY_LIB_VERSION_STYLE"
4327     echo '@%:@include "confdefs.h"'
4328     echo '#define STRINGIZE(x) x'
4329     test -f revision.h -o -f "${srcdir}/revision.h" || echo '#define RUBY_REVISION 0'
4330     echo '#include "version.h"'
4331     echo 'ruby_version=RUBY_LIB_VERSION'
4332     } > conftest.c
4333     ruby_version="`$CPP -I. -I"${srcdir}" -I"${srcdir}/include" conftest.c | sed '/^ruby_version=/!d;s/ //g'`"
4334     eval $ruby_version
4335 ], [test -z "${ruby_version}"], [
4336     AC_MSG_ERROR([No ruby version, No place for bundled libraries])
4337 ], [
4338     RUBY_LIB_VERSION="${ruby_version}"
4340 AC_SUBST(RUBY_LIB_VERSION_STYLE)
4341 AC_SUBST(RUBY_LIB_VERSION)
4343 AC_ARG_WITH(sitedir,
4344             AS_HELP_STRING([--with-sitedir=DIR], [site libraries in DIR [[RUBY_LIB_PREFIX/site_ruby]], "no" to disable site directory]),
4345             [sitedir=$withval],
4346             [sitedir='${rubylibprefix}/site_ruby'])
4347 sitelibdir='${sitedir}/${ruby_version}'
4349 AC_ARG_WITH(sitearchdir,
4350             AS_HELP_STRING([--with-sitearchdir=DIR],
4351                            [architecture dependent site libraries in DIR [[SITEDIR/SITEARCH]], "no" to disable site directory]),
4352             [sitearchdir=$withval],
4353             [sitearchdir=${multiarch+'${rubysitearchprefix}/site_ruby/${ruby_version}'}${multiarch-'${sitelibdir}/${sitearch}'}])
4355 AC_ARG_WITH(vendordir,
4356             AS_HELP_STRING([--with-vendordir=DIR], [vendor libraries in DIR [[RUBY_LIB_PREFIX/vendor_ruby]], "no" to disable vendor directory]),
4357             [vendordir=$withval],
4358             [vendordir='${rubylibprefix}/vendor_ruby'])
4359 vendorlibdir='${vendordir}/${ruby_version}'
4361 AC_ARG_WITH(vendorarchdir,
4362             AS_HELP_STRING([--with-vendorarchdir=DIR],
4363                            [architecture dependent vendor libraries in DIR [[VENDORDIR/SITEARCH]], "no" to disable vendor directory]),
4364             [vendorarchdir=$withval],
4365             [vendorarchdir=${multiarch+'${rubysitearchprefix}/vendor_ruby/${ruby_version}'}${multiarch-'${vendorlibdir}/${sitearch}'}])
4367 AS_IF([test "${LOAD_RELATIVE+set}"], [
4368     AC_DEFINE_UNQUOTED(LOAD_RELATIVE, $LOAD_RELATIVE)
4369     RUBY_EXEC_PREFIX=''
4372 AC_SUBST(RUBY_EXEC_PREFIX)
4374 AC_SUBST(libdirname, ${multiarch+arch}libdir)
4375 AC_SUBST(archlibdir)dnl
4376 AC_SUBST(sitearchlibdir)dnl
4377 AC_SUBST(archincludedir)dnl
4378 AC_SUBST(sitearchincludedir)dnl
4379 AC_SUBST(arch)dnl
4380 AC_SUBST(sitearch)dnl
4381 AC_SUBST(ruby_version)dnl
4382 AC_SUBST(rubylibdir)dnl
4383 AC_SUBST(rubyarchdir)dnl
4384 AC_SUBST(sitedir)dnl
4385 AC_SUBST(sitelibdir)dnl
4386 AC_SUBST(sitearchdir)dnl
4387 AC_SUBST(vendordir)dnl
4388 AC_SUBST(vendorlibdir)dnl
4389 AC_SUBST(vendorarchdir)dnl
4391 AC_SUBST(CONFIGURE, "`echo $0 | sed 's|.*/||'`")dnl
4392 AC_SUBST(configure_args, "`echo "${ac_configure_args}" | sed 's/\\$/$$/g'`")dnl
4394 AS_IF([test "${universal_binary-no}" = yes ], [
4395     arch="universal-${target_os}"
4396     AS_IF([test "${rb_cv_architecture_available}" = yes], [
4397         AC_DEFINE_UNQUOTED(RUBY_PLATFORM_CPU, __ARCHITECTURE__)
4398     ], [
4399         for archs in ${universal_archnames}; do
4400             cpu=`echo $archs | sed 's/.*=//'`
4401             archs=`echo $archs | sed 's/=.*//'`
4402             RUBY_DEFINE_IF([defined __${archs}__ &&! defined RUBY_PLATFORM_CPU], RUBY_PLATFORM_CPU, ["${cpu}"])
4403         done
4404     ])
4405     ints='long int short'
4406     test "$ac_cv_type_long_long" = yes && ints="'long long' $ints"
4407     AC_SUBST(UNIVERSAL_ARCHNAMES, "${universal_archnames}")
4408     AC_SUBST(UNIVERSAL_INTS, "${ints}")
4409     AC_DEFINE_UNQUOTED(RUBY_PLATFORM_OS, "${target_os}")
4410     AC_DEFINE_UNQUOTED(RUBY_ARCH, "universal-" RUBY_PLATFORM_OS)
4411     AC_DEFINE_UNQUOTED(RUBY_PLATFORM, "universal." RUBY_PLATFORM_CPU "-" RUBY_PLATFORM_OS)
4412 ], [
4413     AS_IF([test "${target_os}-${rb_cv_msvcrt}" = "mingw32-ucrt" ], [
4414         arch="${target_cpu}-mingw-ucrt"
4415     ], [
4416         arch="${target_cpu}-${target_os}"
4417     ])
4418     AC_DEFINE_UNQUOTED(RUBY_PLATFORM, "$arch")
4420     AS_IF([test "$arch" = "s390x-linux"], [
4421        AC_DEFINE_UNQUOTED(USE_MN_THREADS, 0)
4422     ])
4425 unset sitearch
4426 AS_CASE(["$target_os"],[mingw*],[sitearch="$target_cpu-$rb_cv_msvcrt"])
4427 : ${sitearch='${arch}'}
4429 AC_ARG_WITH(search-path,
4430                 AS_HELP_STRING([--with-search-path=DIR], [specify the additional search path]),
4431                 [search_path=$withval])
4432 AS_IF([test "$search_path" != ""], [
4433     AC_SUBST(RUBY_SEARCH_PATH, $search_path)
4436 AC_ARG_WITH(rubyhdrdir,
4437             AS_HELP_STRING([--with-rubyhdrdir=DIR], [core headers in DIR [[INCLUDEDIR/RUBY_BASE_NAME-RUBY_VERSION]]]),
4438             [rubyhdrdir=$withval],
4439             [rubyhdrdir='${includedir}/${RUBY_VERSION_NAME}'])
4441 AC_ARG_WITH(rubyarchhdrdir,
4442             AS_HELP_STRING([--with-rubyarchhdrdir=DIR],
4443                            [architecture dependent core headers in DIR [[$(rubyhdrdir)/$(arch)]]]),
4444             [rubyarchhdrdir=$withval],
4445             [rubyarchhdrdir=${multiarch+'${archincludedir}/${RUBY_VERSION_NAME}'}${multiarch-'${rubyhdrdir}/${arch}'}])
4447 AC_ARG_WITH(sitehdrdir,
4448             AS_HELP_STRING([--with-sitehdrdir=DIR], [core site headers in DIR [[RUBYHDRDIR/site_ruby]]]),
4449             [sitehdrdir=$withval],
4450             [sitehdrdir='${rubyhdrdir}/site_ruby'])
4452 AC_ARG_WITH(sitearchhdrdir,
4453             AS_HELP_STRING([--with-sitearchhdrdir=DIR],
4454                            [architecture dependent core site headers in DIR [[RUBYHDRDIR/site_ruby]]]),
4455             [sitearchhdrdir=$withval],
4456             [sitearchhdrdir=${multiarch+'${sitearchincludedir}/${RUBY_VERSION_NAME}/site_ruby'}${multiarch-'${sitehdrdir}/${sitearch}'}])
4458 AC_ARG_WITH(vendorhdrdir,
4459             AS_HELP_STRING([--with-vendorhdrdir=DIR], [core vendor headers in DIR [[RUBYHDRDIR/vendor_ruby]]]),
4460             [vendorhdrdir=$withval],
4461             [vendorhdrdir='${rubyhdrdir}/vendor_ruby'])
4463 AC_ARG_WITH(vendorarchhdrdir,
4464             AS_HELP_STRING([--with-vendorarchhdrdir=DIR],
4465                            [architecture dependent core vendor headers in DIR [[RUBYHDRDIR/vendor_ruby]]]),
4466             [vendorarchhdrdir=$withval],
4467             [vendorarchhdrdir=${multiarch+'${sitearchincludedir}/${RUBY_VERSION_NAME}/vendor_ruby'}${multiarch-'${vendorhdrdir}/${sitearch}'}])
4469 AC_SUBST(rubyhdrdir)dnl
4470 AC_SUBST(sitehdrdir)dnl
4471 AC_SUBST(vendorhdrdir)dnl
4472 AC_SUBST(rubyarchhdrdir)dnl
4473 AC_SUBST(sitearchhdrdir)dnl
4474 AC_SUBST(vendorarchhdrdir)dnl
4476 AC_ARG_WITH(mantype,
4477         AS_HELP_STRING([--with-mantype=TYPE], [specify man page type; TYPE is one of man and doc]),
4478                 [
4479                         AS_CASE(["$withval"],
4480                         [man|man.gz|man.bz2|doc|doc.gz|doc.bz2], [MANTYPE=$withval],
4481                         [AC_MSG_ERROR(invalid man type: $withval)])
4482                 ])
4483 AS_IF([test -z "$MANTYPE"], [
4484         dnl Looks for nroff with -mdoc support.
4485         AC_CACHE_VAL([ac_cv_path_NROFF], [
4486                 AC_PATH_PROGS_FEATURE_CHECK([NROFF],
4487                         [nroff awf mandoc],
4488                         [$ac_path_NROFF -mdoc ${srcdir}/man/ruby.1 \
4489                                 >/dev/null 2>&1 &&
4490                                 ac_cv_path_NROFF=$ac_path_NROFF \
4491                                 ac_path_NROFF_found=:],
4492                         [], ["/usr/bin:/usr/ucb"]
4493                 )
4494         ])
4495         AS_IF([test -n "$ac_cv_path_NROFF"], [
4496                 MANTYPE=doc
4497         ], [
4498                 MANTYPE=man
4499         ])
4501 AC_SUBST(MANTYPE)
4503 MKMF_VERBOSE=0
4504 AC_ARG_ENABLE(mkmf-verbose,
4505     AS_HELP_STRING([--enable-mkmf-verbose], [enable verbose in mkmf]),
4506     [MKMF_VERBOSE=1],
4507     [MKMF_VERBOSE=0])
4508 AC_SUBST(MKMF_VERBOSE)
4510 AC_ARG_ENABLE(rubygems,
4511         AS_HELP_STRING([--disable-rubygems], [disable rubygems by default]),
4512         [enable_rubygems="$enableval"], [enable_rubygems=yes])
4513 AS_IF([test x"$enable_rubygems" = xno], [
4514     USE_RUBYGEMS=no
4515 ], [
4516     USE_RUBYGEMS=yes
4518 AC_SUBST(USE_RUBYGEMS)
4520 arch_hdrdir="${EXTOUT}/include/${arch}/ruby"
4521 AS_MKDIR_P("${arch_hdrdir}")
4522 config_h="${arch_hdrdir}/config.h"
4523 guard=INCLUDE_RUBY_CONFIG_H
4525   echo "#ifndef $guard"
4526   echo "#define $guard 1"
4527   sed "/^@%:@define PACKAGE_/d;s/  *$//" confdefs.h
4528   echo "#endif /* $guard */"
4529 } | tr -d '\015' |
4531   AS_IF([test "x$CONFIGURE_TTY" = xyes], [color=--color], [color=])
4532   exec ${SHELL} ${tooldir}/ifchange $color "${config_h}" -
4533 ) >&AS_MESSAGE_FD || AC_MSG_ERROR([failed to create ${config_h}])
4534 tr -d '\015' < largefile.h > confdefs.h
4535 rm largefile.h
4537 BUILTIN_ENCS=["`sed -n -e '/^BUILTIN_ENCS[      ]*=/{' \
4538         -e s/// -e :l -e '/\\\\$/N' -e 's/\\\\\\n/ /' -e 't l' -e p \
4539         -e '}' "${srcdir}/enc/Makefile.in"`"]
4540 BUILTIN_ENCOBJS=
4541 for e in $BUILTIN_ENCS; do BUILTIN_ENCOBJS="$BUILTIN_ENCOBJS "`echo $e | sed 's/\.c$/.$(OBJEXT)/'`; done
4542 AC_SUBST(BUILTIN_ENCOBJS)
4544 BUILTIN_TRANSES=["`sed -n -e '/^BUILTIN_TRANSES[        ]*=/{' \
4545         -e s/// -e :l -e '/\\\\$/N' -e 's/\\\\\\n/ /' -e 't l' -e p \
4546         -e '}' "${srcdir}/enc/Makefile.in"`"]
4547 BUILTIN_TRANSSRCS=
4548 BUILTIN_TRANSOBJS=
4549 for e in $BUILTIN_TRANSES; do
4550   BUILTIN_TRANSSRCS="$BUILTIN_TRANSSRCS "`echo $e | sed 's/\.trans$/.c/'`
4551   BUILTIN_TRANSOBJS="$BUILTIN_TRANSOBJS "`echo $e | sed 's/\.trans$/.$(OBJEXT)/'`
4552 done
4553 AC_SUBST(BUILTIN_TRANSSRCS)
4554 AC_SUBST(BUILTIN_TRANSOBJS)
4556 PACKAGE=$RUBY_BASE_NAME
4557 AC_SUBST(PACKAGE)
4558 AS_MESSAGE([$PACKAGE library version = $ruby_version])
4560 AS_IF([test x"$CC_WRAPPER" != x], [
4561     CC='$(CC_WRAPPER) '"${CC@%:@$CC_WRAPPER }"
4562     CPP='$(CC_WRAPPER) '"${CPP@%:@$CC_WRAPPER }"
4563     XCC_WRAPPER="$CC_WRAPPER"
4565 AC_SUBST(CC_WRAPPER, '')
4566 AC_SUBST(XCC_WRAPPER)
4568 AS_CASE([" $CPP "], [*" $CC "*], [CPP=`echo " $CPP " | sed "s| $CC |"' $(CC) |;s/^ *//;s/  *$//'`])
4570 AS_IF([test ! -f "$srcdir/revision.h"], [
4571     AS_IF([test "x$HAVE_BASERUBY" = xyes], [
4572         ${BASERUBY} -C "$srcdir" tool/file2lastrev.rb -q --revision.h > "$srcdir/revision.h"
4573     ], [
4574         touch "$srcdir/revision.h"
4575     ])
4578 AS_IF([test x"$firstmf" != x], [
4579     AC_CONFIG_FILES($firstmf:$firsttmpl, [], [firstmf="$firstmf" firsttmpl="$firsttmpl"])
4581 AC_CONFIG_FILES(Makefile:template/Makefile.in, [
4582     tmpmk=confmk$$.tmp
4583     {
4584         AS_IF([test ${VCS+set}], [
4585             :
4586         ], [git_dir=`$GIT --work-tree="$srcdir" --git-dir="$srcdir/.git" rev-parse --git-dir 2>/dev/null`], [
4587             VCS='$(GIT)'
4588         ], [
4589             VCS='echo cannot'
4590         ])
4591         AS_CASE("$VCS",
4592                 ['$(GIT)'|git], [VCSUP='$(VCS) pull --rebase $(GITPULLOPTIONS)'],
4593                 [VCSUP='$(VCS)'])
4594         for f in "$srcdir/version.h" "$srcdir/revision.h"; do
4595             test -f "$f" || continue
4596             sed -n \
4597                 -e '[/^@%:@define \(RUBY_RELEASE_[A-Z]*\) \([0-9][0-9]*\)/]{' \
4598                 -e   's//\1 = \2/' \
4599                 -e   '[s/ \([0-9]\)$/ 0\1/]' \
4600                 -e   p \
4601                 -e '}' "$f"
4602         done
4603         sed '/^MISSING/s/\$U\././g;/^VCS *=/s#@VCS@#'"$VCS"'#;/^VCSUP *=/s#@VCSUP@#'"$VCSUP"'#' Makefile
4604         echo; test x"$EXEEXT" = x || echo 'miniruby: miniruby$(EXEEXT)'
4605         AS_IF([test "$gnumake" != yes], [
4606             echo ['$(MKFILES): $(srcdir)/common.mk']
4607             sed ['s/{\$([^(){}]*)[^{}]*}//g'] ${srcdir}/common.mk
4608             AS_IF([test "$YJIT_SUPPORT" = yes], [
4609                 cat ${srcdir}/yjit/not_gmake.mk
4610                 echo ['$(MKFILES): ${srcdir}/yjit/not_gmake.mk']
4611             ])
4612         ], [
4613             echo 'distclean-local::; @$(RM) GNUmakefile uncommon.mk'
4614         ])
4616         echo; echo '$(srcdir)/$(CONFIGURE):RUBY_M4_INCLUDED \
4617         $(empty)'
4618     } > $tmpmk && AS_IF([! grep '^ruby:' $tmpmk > /dev/null], [
4619         AS_IF([test "${gnumake}" = yes], [
4620             tmpgmk=confgmk$$.tmp
4621             {
4622                 echo "include $tmpmk"
4623                 echo "-include uncommon.mk"
4624             } > $tmpgmk
4625         ], [
4626             tmpgmk=$tmpmk
4627         ]) &&
4628         test -z "`${MAKE-make} -f $tmpgmk info-program | grep '^PROGRAM=ruby$'`" &&
4629         echo 'ruby: $(PROGRAM);' >> $tmpmk
4630         test "$tmpmk" = "$tmpgmk" || rm -f "$tmpgmk"
4631     ]) && mv -f $tmpmk Makefile],
4632 [EXEEXT='$EXEEXT' MAKE='${MAKE-make}' gnumake='$gnumake' GIT='$GIT' YJIT_SUPPORT='$YJIT_SUPPORT'])
4634 AC_ARG_WITH([ruby-pc],
4635             AS_HELP_STRING([--with-ruby-pc=FILENAME], [pc file basename]),
4636             [ruby_pc="$withval"],
4637             [ruby_pc="${RUBY_BASE_NAME}-${MAJOR}.${MINOR}.pc"])
4638 AC_SUBST(ruby_pc)
4639 AC_SUBST(exec, [exec])
4641 AC_ARG_WITH(destdir,
4642             AS_HELP_STRING([--with-destdir=DESTDIR], [specify default directory to install]),
4643             [DESTDIR="$withval"])
4644 AC_SUBST(DESTDIR)
4646 AC_OUTPUT
4649 AS_IF([test "$silent" = yes], [], [
4650 AS_IF([${FOLD+:} false], [], [
4651 AS_IF([test "`echo abcdefg hijklmno | fold -s -w10 | sed 1d`" = hijklmno], [FOLD="fold"], [FOLD=])
4653 fold_width=`expr $COLUMNS - 30 2>/dev/null` || fold_width=50
4654 AS_REQUIRE_SHELL_FN([config_summary],
4655     [AS_FUNCTION_DESCRIBE([config_summary], [NAME, VAL], [configuration summary])],
4656     [AS_IF([test -z "$2"], [], [
4657         AS_ECHO_N(["   * $1:                     "]) | dd bs=1 count=26 2>/dev/null
4658         AS_IF([test "$FOLD"], [
4659             echo "$2" | fold -s -w$fold_width |
4660             sed '1!s/^/                          /;$!s/$/\\/'
4661         ], [echo "$2"])
4662     ])]
4665 AS_IF([test $install_doc = yes],
4666     [DOCTARGETS=`echo " $RDOCTARGET $CAPITARGET " | sed 's/ nodoc //g;s/^ *//;s/ *$//'`],
4667     [DOCTARGETS=no])
4668 echo "---"
4669 echo "Configuration summary for $RUBY_BASE_NAME version $MAJOR.$MINOR.$TEENY"
4670 echo ""
4671 config_summary "Installation prefix" "$prefix"
4672 config_summary "exec prefix"         "$exec_prefix"
4673 config_summary "arch"                "$arch"
4674 config_summary "site arch"           "$sitearch"
4675 config_summary "RUBY_BASE_NAME"      "$RUBY_BASE_NAME"
4676 config_summary "enable shared"       "$enable_shared"
4677 config_summary "ruby lib prefix"     "$rubylibprefix"
4678 config_summary "site libraries path" "$rubysitearchprefix"
4679 config_summary "vendor path"         "$vendordir"
4680 config_summary "target OS"           "$target_os"
4681 config_summary "compiler"            "$CC"
4682 config_summary "with thread"         "$THREAD_MODEL"
4683 config_summary "with coroutine"      "$coroutine_type"
4684 config_summary "with shared GC"      "$with_shared_gc"
4685 config_summary "enable shared libs"  "$ENABLE_SHARED"
4686 config_summary "dynamic library ext" "$DLEXT"
4687 config_summary "CFLAGS"              "$cflags"
4688 config_summary "CPPFLAGS"            "$cppflags"
4689 config_summary "LDFLAGS"             "$LDFLAGS"
4690 config_summary "DLDFLAGS"            "$DLDFLAGS"
4691 config_summary "optflags"            "$optflags"
4692 config_summary "debugflags"          "$debugflags"
4693 config_summary "warnflags"           "$warnflags"
4694 config_summary "strip command"       "$STRIP"
4695 config_summary "install doc"         "$DOCTARGETS"
4696 config_summary "YJIT support"        "$YJIT_SUPPORT"
4697 config_summary "RJIT support"        "$RJIT_SUPPORT"
4698 config_summary "man page type"       "$MANTYPE"
4699 config_summary "search path"         "$search_path"
4700 config_summary "static-linked-ext"   ${EXTSTATIC:+"yes"}
4701 config_summary "BASERUBY -v"         "$BASERUBY_VERSION"
4702 echo ""
4703 echo "---"