1 dnl Process this file with autoconf to produce a configure script.
4 AC_CONFIG_AUX_DIR(tool)
10 AC_DISABLE_OPTION_CHECKING
12 m4_include([tool/m4/_colorize_result_prepare.m4])dnl
13 m4_include([tool/m4/ac_msg_result.m4])dnl
14 m4_include([tool/m4/colorize_result.m4])dnl
15 m4_include([tool/m4/ruby_append_option.m4])dnl
16 m4_include([tool/m4/ruby_append_options.m4])dnl
17 m4_include([tool/m4/ruby_check_builtin_func.m4])dnl
18 m4_include([tool/m4/ruby_check_builtin_setjmp.m4])dnl
19 m4_include([tool/m4/ruby_check_printf_prefix.m4])dnl
20 m4_include([tool/m4/ruby_check_setjmp.m4])dnl
21 m4_include([tool/m4/ruby_check_signedness.m4])dnl
22 m4_include([tool/m4/ruby_check_sizeof.m4])dnl
23 m4_include([tool/m4/ruby_check_sysconf.m4])dnl
24 m4_include([tool/m4/ruby_cppoutfile.m4])dnl
25 m4_include([tool/m4/ruby_decl_attribute.m4])dnl
26 m4_include([tool/m4/ruby_default_arch.m4])dnl
27 m4_include([tool/m4/ruby_define_if.m4])dnl
28 m4_include([tool/m4/ruby_defint.m4])dnl
29 m4_include([tool/m4/ruby_dtrace_available.m4])dnl
30 m4_include([tool/m4/ruby_dtrace_postprocess.m4])dnl
31 m4_include([tool/m4/ruby_func_attribute.m4])dnl
32 m4_include([tool/m4/ruby_mingw32.m4])dnl
33 m4_include([tool/m4/ruby_prepend_option.m4])dnl
34 m4_include([tool/m4/ruby_prog_gnu_ld.m4])dnl
35 m4_include([tool/m4/ruby_prog_makedirs.m4])dnl
36 m4_include([tool/m4/ruby_replace_funcs.m4])dnl
37 m4_include([tool/m4/ruby_replace_type.m4])dnl
38 m4_include([tool/m4/ruby_require_funcs.m4])dnl
39 m4_include([tool/m4/ruby_rm_recursive.m4])dnl
40 m4_include([tool/m4/ruby_setjmp_type.m4])dnl
41 m4_include([tool/m4/ruby_shared_gc.m4])dnl
42 m4_include([tool/m4/ruby_stack_grow_direction.m4])dnl
43 m4_include([tool/m4/ruby_thread.m4])dnl
44 m4_include([tool/m4/ruby_try_cflags.m4])dnl
45 m4_include([tool/m4/ruby_try_cxxflags.m4])dnl
46 m4_include([tool/m4/ruby_try_ldflags.m4])dnl
47 m4_include([tool/m4/ruby_universal_arch.m4])dnl
48 m4_include([tool/m4/ruby_wasm_tools.m4])dnl
49 m4_include([tool/m4/ruby_werror_flag.m4])dnl
51 AS_IF([test "x${GITHUB_ACTIONS}" = xtrue],
52 [AC_REQUIRE([_COLORIZE_RESULT_PREPARE])dnl
53 dnl 93(bright yellow) is copied from .github/workflows/mingw.yml
54 begin_group() { AS_ECHO(["::group::
\e@<:@93m$[]1
\e@<:@m"]);}
55 end_group() { AS_ECHO(["::endgroup::"]);}
62 AC_ARG_VAR([cflags], [additional CFLAGS (ignored when CFLAGS is given)])dnl
63 AC_ARG_VAR([cppflags], [additional CPPFLAGS (ignored when CPPFLAGS is given)])dnl
64 AC_ARG_VAR([cxxflags], [additional CXXFLAGS (ignored when CXXFLAGS is given)])dnl
66 [begin]_group "environment section" && {
70 AS_HELP_STRING([--with-baseruby=RUBY], [use RUBY as baseruby; RUBY is the pathname of ruby]),
71 [AS_CASE(["$withval"],
72 [*ruby*],[BASERUBY=$withval],
73 [no],[HAVE_BASERUBY=no],
74 [AC_MSG_ERROR(need ruby)])
77 AC_PATH_PROG([BASERUBY], [ruby], [false])
79 AS_IF([test "$HAVE_BASERUBY" != no], [
80 RUBYOPT=- $BASERUBY --disable=gems "${tooldir}/missing-baseruby.bat" || HAVE_BASERUBY=no
82 AS_IF([test "${HAVE_BASERUBY:=no}" != no], [
83 AS_CASE(["$build_os"], [mingw*], [
84 # Can MSys shell run a command with a drive letter?
85 RUBYOPT=- `cygpath -ma "$BASERUBY"` --disable=gems -e exit 2>/dev/null || HAVE_BASERUBY=no
87 RUBY_APPEND_OPTION(BASERUBY, "--disable=gems")
88 BASERUBY_VERSION=`$BASERUBY -v`
89 $BASERUBY -C "$srcdir" tool/downloader.rb -d tool -e gnu config.guess config.sub >&AS_MESSAGE_FD
91 AS_IF([test "$HAVE_BASERUBY" = no], [
92 AS_IF([test "$cross_compiling" = yes], [AC_MSG_ERROR([executable host ruby is required for cross-compiling])])
93 BASERUBY=${tooldir}/missing-baseruby.bat
96 AC_SUBST(HAVE_BASERUBY)
101 AS_HELP_STRING([--without-git], [never use git]),
103 [no], [GIT=never-use HAVE_GIT=no],
106 AS_IF([test x"$HAVE_GIT" = xyes], [command -v "$GIT" > /dev/null || HAVE_GIT=no])
110 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'] \
111 -e ['s/^@%:@define \(RUBY_ABI_VERSION\) \([0-9][0-9]*\).*/\1=\2/p'] \
112 -e ['s/^@%:@define \(RUBY_PATCHLEVEL\) \(.*\)/\1=\2/p'] \
113 $srcdir/include/ruby/internal/abi.h \
114 $srcdir/include/ruby/version.h $srcdir/version.h`
115 for v in MAJOR MINOR TEENY; do
116 AS_IF([eval "test \"\$$v\" = ''"], [
117 AC_MSG_ERROR(could not determine $v number from version.h)
123 AC_SUBST(RUBY_API_VERSION, '$(MAJOR).$(MINOR)')
124 AC_SUBST(RUBY_PROGRAM_VERSION, '$(MAJOR).$(MINOR).$(TEENY)')
125 AS_CASE([$RUBY_PATCHLEVEL], [-*], [
126 AC_DEFINE_UNQUOTED(RUBY_ABI_VERSION, [${RUBY_ABI_VERSION}])
127 ], [RUBY_ABI_VERSION=])
129 AS_IF([test "$program_prefix" = NONE], [
132 AS_IF([test "$prefix" -ef .], [
133 AC_MSG_ERROR(--prefix cannot be the current working directory.)
135 RUBY_BASE_NAME=`echo ruby | sed "$program_transform_name"`
136 RUBYW_BASE_NAME=`echo rubyw | sed "$program_transform_name"`
137 AC_SUBST(RUBY_BASE_NAME)
138 AC_SUBST(RUBYW_BASE_NAME)
139 AC_SUBST(RUBY_VERSION_NAME, '${RUBY_BASE_NAME}-${ruby_version}')
141 dnl checks for alternative programs
145 AS_CASE(["$target_cpu-$target_os"],
148 AS_CASE(["$target_vendor"], [unknown], [
150 target=${target%%-unknown-*}-apple-${target@%:@*-unknown-}
152 target="arm64-${target@%:@aarch64-}"
153 AS_IF([test -n "$target_alias"], [target_alias="arm64-${target_alias@%:@aarch64-}"])
159 AS_HELP_STRING([--without-gcc], [never use gcc]),
163 [yes], [: ${CC=gcc}],
165 dnl If the user switches compilers, we can't believe the cache
166 AS_IF([test ! -z "$ac_cv_prog_CC" -a ! -z "$CC" -a "$CC" != "$ac_cv_prog_CC"], [
167 AC_MSG_ERROR(cached CC is different -- throw away $cache_file
168 (it is also a good idea to do 'make clean' before compiling))
173 AS_CASE(["${build_os}"],
174 [linux*|cygwin*|msys*], [
175 # Naruse prefers GCC on Linux
176 AC_CHECK_TOOLS([CC], [gcc clang cc])
179 # Clang on Solaris is largely untested.
180 # https://bugs.ruby-lang.org/issues/17949
181 AC_CHECK_TOOLS([CC], [cc gcc])
183 # OpenBSD wants to prefer cc over gcc.
184 # See https://github.com/ruby/ruby/pull/2443
185 AC_CHECK_TOOLS([CC], [cl.exe clang cc gcc c99 /usr/ucb/cc])
188 AC_ARG_VAR([AR], [Archiver command])
189 AC_ARG_VAR([AS], [Assembler command])
190 AC_ARG_VAR([CC], [C compiler command])
191 AC_ARG_VAR([CXX], [C++ compiler command])
192 AC_ARG_VAR([LD], [Linker command])
193 AC_ARG_VAR([NM], [Symbol list command])
194 AC_ARG_VAR([OBJCOPY], [Objcopy command])
195 AC_ARG_VAR([OBJDUMP], [Objdump command])
196 AC_ARG_VAR([RANLIB], [Ranlib command])
197 AC_ARG_VAR([STRIP], [Strip command])
199 # We don't want to bother things like `ccache gcc`, `clang -shared-libgcc`, ...
202 AC_DEFUN([RUBY_CHECK_PROG_FOR_CC], [
203 rb_prog=`echo "${rb_CC}" | sed "$2"`
204 AC_CHECK_PROG([$1], [$rb_prog], [$rb_prog])
206 AS_CASE(["/${rb_CC} "],
207 [*@<:@\ /@:>@"cc "*], [
208 # Don't try g++/clang++ when CC=cc
209 AC_CHECK_PROGS([CXX], [cl.exe CC c++])
212 # Intel C++ has interprocedural optimizations. It tends to come with its
214 RUBY_CHECK_PROG_FOR_CC([AR], [s/icc/xiar/])
215 RUBY_CHECK_PROG_FOR_CC([CXX], [s/icc/icpc/])
216 RUBY_CHECK_PROG_FOR_CC([LD], [s/icc/xild/])
220 RUBY_CHECK_PROG_FOR_CC([LD], [s/gcc/ld/])
221 RUBY_CHECK_PROG_FOR_CC([AR], [s/gcc/gcc-ar/])
222 RUBY_CHECK_PROG_FOR_CC([CXX], [s/gcc/g++/])
223 RUBY_CHECK_PROG_FOR_CC([NM], [s/gcc/gcc-nm/])
224 RUBY_CHECK_PROG_FOR_CC([RANLIB], [s/gcc/gcc-ranlib/])
227 # Ditto for LLVM. Note however that llvm-as is a LLVM-IR to LLVM bitcode
228 # assembler that does not target your machine native binary.
229 RUBY_CHECK_PROG_FOR_CC([LD], [s/clang/ld/]) # ... maybe try lld ?
230 RUBY_CHECK_PROG_FOR_CC([AR], [s/clang/llvm-ar/])
231 # RUBY_CHECK_PROG_FOR_CC([AS], [s/clang/llvm-as/])
232 RUBY_CHECK_PROG_FOR_CC([CXX], [s/clang/clang++/])
233 RUBY_CHECK_PROG_FOR_CC([NM], [s/clang/llvm-nm/])
234 RUBY_CHECK_PROG_FOR_CC([OBJCOPY], [s/clang/llvm-objcopy/])
235 RUBY_CHECK_PROG_FOR_CC([OBJDUMP], [s/clang/llvm-objdump/])
236 RUBY_CHECK_PROG_FOR_CC([RANLIB], [s/clang/llvm-ranlib/])
237 RUBY_CHECK_PROG_FOR_CC([STRIP], [s/clang/llvm-strip/])
242 AS_CASE(["${build_os}"],
244 AC_PATH_TOOL([LD], [ld], [/usr/ccs/bin/ld], [/usr/ccs/bin:$PATH])
247 AC_PATH_TOOL([NM], [nm], [/usr/ccs/bin/nm], [/usr/ccs/bin:$PATH])
250 # For Apple clang version 14.0.3 (clang-1403.0.22.14.1)
251 ac_cv_prog_ac_ct_AR=`$CC -print-prog-name=ar`
252 ac_cv_prog_ac_ct_LD=`$CC -print-prog-name=ld`
253 ac_cv_prog_ac_ct_NM=`$CC -print-prog-name=nm`
255 AS_CASE(["${target_os}"],
256 [cygwin*|msys*|mingw*|darwin*], [
257 ac_cv_prog_ac_ct_OBJCOPY=":"
260 rb_test_CFLAGS=${CFLAGS+yes}
261 rb_test_CXXFLAGS=${CXXFLAGS+yes}
263 # BSD's ports and MacPorts prefix GNU binutils with 'g'
265 dnl Seems necessarily in order to add -std=gnu99 option for gcc 4.9.
266 m4_version_prereq([2.70], [AC_PROG_CC], [AC_PROG_CC_C99])
271 AC_CHECK_TOOLS([AR], [gar ar])
272 AC_CHECK_TOOLS([AS], [gas as])
273 AC_CHECK_TOOLS([LD], [gld ld]) # ... try gold ?
274 AC_CHECK_TOOLS([NM], [gnm nm])
275 AC_CHECK_TOOLS([OBJCOPY], [gobjcopy objcopy], [:])
276 AC_CHECK_TOOLS([OBJDUMP], [gobjdump objdump])
277 AC_CHECK_TOOLS([STRIP], [gstrip strip], [:])
279 # nm errors with Rust's LLVM bitcode when Rust uses a newer LLVM version than nm.
280 # In case we're working with llvm-nm, tell it to not worry about the bitcode.
281 AS_IF([${NM} --help 2>&1 | grep -q 'llvm-bc'], [NM="$NM --no-llvm-bc"])
283 AS_IF([test ! $rb_test_CFLAGS], [AS_UNSET(CFLAGS)]); AS_UNSET(rb_test_CFLAGS)
284 AS_IF([test ! $rb_test_CXXFLAGS], [AS_UNSET(CXXFLAGS)]); AS_UNSET(rb_save_CXXFLAGS)
286 AS_IF([test "${CXX}" = "g++" -a -z "${GXX}"], [
287 # AC_PROG_CXX sets $CXX to "g++" when it purposefully finds that there is
288 # _no_ g++. This brain-damaged design must be worked around. Thankfully,
289 # similar thing doesn't happen for AC_PROG_CC.
290 rb_there_is_in_fact_no_gplusplus_but_autoconf_is_cheating_us=true
293 test x"$target_alias" = x &&
294 target_os=`echo $target_os | sed 's/linux-gnu$/linux/;s/linux-gnu/linux-/'`
295 ac_install_sh='' # unusable for extension libraries.
297 AC_ARG_WITH(os-version-style,
298 AS_HELP_STRING([--with-os-version-style=TYPE],
299 [OS version number for target and target_os [[full]]]
300 [(full|teeny|minor+0|minor|major+0|major|none)]),
301 [os_version_style=$withval],
302 [os_version_style=full
303 AS_CASE($target_os, [[*[0-9].*]],
304 [AS_CASE([`/usr/bin/ruby -e 'puts RUBY_PLATFORM' 2>/dev/null`],
305 [[*-*[0-9].*.0]], [os_version_style=minor+0],
306 [[*-*[0-9].*.*]], [os_version_style=full],
307 [[*-*[0-9].0] ], [os_version_style=major+0],
308 [[*-*[0-9].*] ], [os_version_style=minor],
309 [[*-*[0-9]] ], [os_version_style=major],
312 os_version_style_transform=
313 AS_CASE("${os_version_style}",
315 [minor+0], [os_version_style_transform=['s/\([0-9]\.[0-9][0-9]*\)\.[0-9][.0-9]*$/\1.0/']],
316 [minor], [os_version_style_transform=['s/\([0-9]\.[0-9][0-9]*\)\.[0-9][.0-9]*$/\1/']],
317 [major+0], [os_version_style_transform=['s/\([0-9]\)\.[0-9][.0-9]*$/\1.0/']],
318 [major], [os_version_style_transform=['s/\([0-9]\)\.[0-9][.0-9]*$/\1/']],
319 [none], [os_version_style_transform=['s/[0-9]*\.[0-9][.0-9]*$//']],
320 [AC_MSG_ERROR(unknown --with-os-version-style: $withval)])
321 AS_IF([test -z "$target_alias" -a -n "$os_version_style_transform"],
323 target=`echo ${target} | sed "$os_version_style_transform"`
324 target_os=`echo ${target_os} | sed "$os_version_style_transform"`
328 AS_HELP_STRING([--with-arch=ARCHS],
329 [build an Apple/NeXT Multi Architecture Binary (MAB);
330 ARCHS is a comma-delimited list of architectures for
331 which to build; if this option is disabled or omitted
332 entirely, then the package will be built only for the
334 [target_archs="$withval"], [unset target_archs])
336 AC_ARG_ENABLE(load-relative,
337 AS_HELP_STRING([--enable-load-relative], [resolve load paths at run time]),
338 [load_relative=$enableval])
340 # checks for UNIX variants that set C preprocessor variables
341 AC_USE_SYSTEM_EXTENSIONS
343 dnl Checks for programs.
346 test -z "$optflags" ||
347 cflagspat="$cflagspat;s|"`eval echo '"'"${optflags}"'"' | sed 's/[[][|.*]]/\\&/g;s/^ */ /;s/ *$/ /'`'| |g'
348 test -z "$debugflags" ||
349 cflagspat="$cflagspat;s|"`eval echo '"'"${debugflags}"'"' | sed 's/[[][|.*]]/\\&/g;s/^ */ /;s/ *$/ /'`'| |g'
350 test -z "$warnflags" ||
351 cflagspat="$cflagspat;s|"`eval echo '"'"${warnflags}"'"' | sed 's/[[][|.*]]/\\&/g;s/^ */ /;s/ *$/ /'`'| |g'
352 AS_IF([test -z "${CFLAGS+set}"], [
353 cflags=`echo " $cflags " | sed "$cflagspat;s/^ *//;s/ *$//"`
354 orig_cflags="$cflags"
355 cflags="$cflags "'${optflags} ${debugflags} ${warnflags}'
357 dnl AS_IF([test -z "${CXXFLAGS+set}"], [
358 dnl cxxflags=`echo " $cxxflags " | sed "$cflagspat;s/^ *//;s/ *$//"`
359 dnl orig_cxxflags="$cxxflags"
360 dnl cxxflags="$cxxflags "'${optflags} ${debugflags} ${warnflags}'
363 AS_CASE(["$host_os:$build_os"],
365 # Following Apple deployed clang are broken
366 # clang version 1.0 (http://llvm.org/svn/llvm-project/cfe/tags/Apple/clang-23 exported)
367 # Apple clang version 2.0 (tags/Apple/clang-137) (based on LLVM 2.9svn)
368 # Apple clang version 2.1 (tags/Apple/clang-163.7.1) (based on LLVM 3.0svn)
371 @%:@if defined __APPLE_CC__ && defined __clang_major__ && __clang_major__ < 3
372 @%:@error premature clang
376 [AC_MSG_ERROR([clang version 3.0 or later is required])])
379 AS_CASE(["$target_os"],
381 AC_MSG_CHECKING(if minimum required OS X version is supported)
382 AC_PREPROC_IFELSE([AC_LANG_SOURCE([[@%:@include <AvailabilityMacros.h>
383 @%:@if MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_5
384 @%:@error pre OS X 10.5
385 [!<===== pre OS X 10.5 =====>]
388 [AC_MSG_RESULT(yes)],
390 AC_MSG_ERROR([Unsupported OS X version is required])])
396 AS_IF([test "$GCC" = yes], [
399 gcc_major=`echo =__GNUC__ | $CC -E -xc - | sed '/^=/!d;s///'`
400 gcc_minor=`echo =__GNUC_MINOR__ | $CC -E -xc - | sed '/^=/!d;s///'`
401 test -n "$gcc_major" || gcc_major=0
402 test -n "$gcc_minor" || gcc_minor=0
403 icc_version=`echo =__ICC | $CC -E -xc - | sed '/^=/!d;s///;/^__ICC/d'`
404 test -n "$icc_version" || icc_version=0
405 # RUBY_APPEND_OPTIONS(XCFLAGS, ["-include ruby/config.h" "-include ruby/missing.h"])
407 AS_IF([test "$gcc_major" -lt 4], [
408 AC_MSG_ERROR([too old GCC: $gcc_major.$gcc_minor])
418 : ${COUTFLAG=${OUTFLAG}}
424 AS_CASE(["$build_os"],
426 # gcc 13 warns duplicate -l options, which are added by the
428 # Xcode linker warns for deprecated architecture and wrongly
429 # installed TBD files.
430 AC_MSG_CHECKING(for $CC linker warning)
431 suppress_ld_waring=no
432 echo 'int main(void) {return 0;}' > conftest.c
433 AS_IF([$CC -framework Foundation -o conftest -ggdb3 conftest.c 2>&1 |
435 -e '^ld: warning: ignoring duplicate libraries:' \
436 -e '^ld: warning: text-based stub file' \
437 -e '^ld: warning: -multiply_defined is obsolete' \
438 -e "^warning: '\.debug_macinfo'" \
439 -e '^note: while processing' \
441 suppress_ld_waring=yes
444 test $suppress_ld_waring = yes && warnflags="${warnflags:+${warnflags} }-Wl,-w"
445 AC_MSG_RESULT($suppress_ld_waring)
447 AS_CASE(["$target_os"],
449 # Clang linker automatically uses wasm-opt with -O if it found.
450 # https://github.com/llvm/llvm-project/blob/812828984c10857a4cd260eb638c52a4411f9143/clang/lib/Driver/ToolChains/WebAssembly.cpp#L95-L118
451 # However optimization before asyncify causes misoptimization,
452 # so wrap clang to insert our fake wasm-opt, which does nothing, in PATH.
453 CC_WRAPPER=`cd -P "${tooldir}" && pwd`/wasm-clangw
458 for option in --version -v -V -qversion; do
459 cc_version_message=`$CC $option 2>&1`
461 AS_CASE($cc_version_status, [0], [:], [continue])
462 AS_CASE($cc_version_message, [*Warning*], [continue])
463 cc_version='$(CC) '$option
466 AC_SUBST(CC_VERSION, $cc_version)
467 AC_SUBST(CC_VERSION_MESSAGE, $cc_version_message)
469 : ${DLDFLAGS="$LDFLAGS"}
472 AS_IF([test "$target_cpu" != "$host_cpu" -a "$GCC" = yes -a "${universal_binary:-no}" = no], [
473 RUBY_DEFAULT_ARCH($target_cpu)
476 host_vendor=$target_vendor
479 host_alias=$target_alias
481 AC_CACHE_CHECK([for $AR flags], [rb_cv_arflags], [
482 AS_IF([$AR rcD conftest.a > /dev/null 2>&1 && rm conftest.a],
483 [rb_cv_arflags=rcD], [rb_cv_arflags=rcu])
485 AC_SUBST(ARFLAGS, ["$rb_cv_arflags "])
488 AS_CASE(["$target_os"],
489 [cygwin*|msys*|mingw*], [
490 AC_CHECK_TOOL(WINDRES, windres)
491 AC_CHECK_TOOL(DLLWRAP, dllwrap)
492 target=`echo $target | sed "s/^$target_cpu-/-/"`
493 target_alias=`echo $target_alias | sed "s/^$target_cpu-/-/"`
494 target_cpu=`echo $target_cpu | sed s/i.86/i386/`
495 AS_CASE(["$target"], [-*], [ target="$target_cpu${target}"])
496 AS_CASE(["$target_alias"], [-*], [ target_alias="$target_cpu${target_alias}"])
497 AS_CASE(["$target_os"],
499 test "$rb_cv_msvcrt" = "" && unset rb_cv_msvcrt
500 AC_CACHE_CHECK(for mingw32 runtime DLL, rb_cv_msvcrt, [
501 AC_LINK_IFELSE([AC_LANG_PROGRAM([[@%:@include <stdio.h>]],
502 [[FILE* volatile f = stdin; return 0;]])],
503 [rb_cv_msvcrt=`$OBJDUMP -p conftest$ac_exeext |
505 sed -n '/^[[ ]]*dll name: \(msvc.*\)\.dll$/{s//\1/p;q;};
506 /^[[ ]]*dll name: \(ucrtbase\|api-ms-win-crt-.*\)\.dll$/{s//ucrt/p;q;}'`],
507 [rb_cv_msvcrt=msvcrt])
508 test "$rb_cv_msvcrt" = "" && rb_cv_msvcrt=msvcrt])
509 RT_VER=`echo "$rb_cv_msvcrt" | tr -cd [0-9]`
510 test "$RT_VER" = "" && RT_VER=60
511 test "$rb_cv_msvcrt" = "ucrt" && RT_VER=140
512 AC_DEFINE_UNQUOTED(RUBY_MSVCRT_VERSION, $RT_VER)
516 : ${enable_shared=yes}
517 AS_IF([$WINDRES --version | grep LLVM > /dev/null], [USE_LLVM_WINDRES=yes], [USE_LLVM_WINDRES=no])
519 [hiuxmpp*], [AC_DEFINE(__HIUX_MPP__)]) # by TOYODA Eizi <toyoda@npd.kishou.go.jp>
525 AS_CASE(["$target_os"],[openbsd*],[
526 ac_cv_path_mkdir="mkdir"
531 AC_CHECK_PROG([DTRACE], [${ac_tool_prefix}dtrace], [${ac_tool_prefix}dtrace])
532 AS_IF([test "$cross_compiling:$ac_cv_prog_DTRACE" = no: -a -n "$ac_tool_prefix"], [
533 AC_CHECK_PROG([DTRACE], [dtrace], [dtrace])
536 AC_CHECK_PROGS(DOT, dot)
537 AC_CHECK_PROGS(DOXYGEN, doxygen)
539 tool_warned=$ac_tool_warned ac_tool_warned=no
540 AC_CHECK_TOOL(PKG_CONFIG, pkg-config)
541 ac_tool_warned=$tool_warned
542 AS_IF([test -z "$PKG_CONFIG"], [],
543 ["$PKG_CONFIG" --print-errors --version > /dev/null 2>&1], [],
545 unset ac_cv_prog_PKG_CONFIG
547 AC_MSG_WARN([$PKG_CONFIG does not work; ignore])
550 AC_MSG_CHECKING([whether it is Android])
551 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
552 @%:@ifndef __ANDROID__
553 @%:@error Not android
558 target_os=${target_os}-android
559 AS_IF([test "x$cross_compiling" = xno], [
560 AC_MSG_CHECKING([for Android API version])
561 # hacky workaround: https://github.com/termux/termux-packages/issues/6176
562 rb_android_api=`getprop ro.build.version.sdk`
563 AC_MSG_RESULT($rb_android_api)
564 RUBY_APPEND_OPTIONS(CPPFLAGS, -D__ANDROID_API__=$rb_android_api -Wno-macro-redefined)
569 AC_SUBST(RM, ['rm -f'])
571 RMDIRS='$(top_srcdir)/tool/rmdirs'
573 mkdir "rmdirs_$$_test" "rmdirs_$$_test/a"
574 rmdir --ignore-fail-on-non-empty "rmdirs_$$_test" 2>/dev/null &&
575 RMDIR='rmdir --ignore-fail-on-non-empty'
576 $RMDIR -p "rmdirs_$$_test/a" 2>/dev/null &&
577 { test -d "rmdirs_$$_test" || RMDIRS="$RMDIR -p"; }
578 rmdir "rmdirs_$$_test/a" "rmdirs_$$_test" 2>/dev/null
581 AC_SUBST(RMALL, ['rm -fr'])
583 AC_MSG_CHECKING([for cd using physical directory])
586 (cd conf$$.dir && mkdir src build && cd src &&
587 $as_ln_s ../build . > /dev/null 2>&1 && cd build &&
588 for chdir in 'cd -P' 'PWD= cd'; do
589 /bin/sh -c "$chdir ../src && echo '$chdir' > cdcmd" 2> /dev/null && break
591 AS_IF([test -f conf$$.dir/src/cdcmd], [
592 read CHDIR < conf$$.dir/src/cdcmd 2> /dev/null
597 AC_MSG_RESULT([$CHDIR])
601 [begin]_group "compiler section" && {
603 AC_MSG_CHECKING([whether CFLAGS is valid])
604 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
605 [AC_MSG_RESULT(yes)],
608 AC_MSG_ERROR([something wrong with CFLAGS="$CFLAGS"])
612 AC_MSG_CHECKING([whether LDFLAGS is valid])
614 mkdir tmp.$$.try_link &&
615 cd tmp.$$.try_link &&
616 cp ../confdefs.h . &&
617 echo '<?xml?><plist><dict><key>CFBundleIdentifier</key><string></string></dict></plist>' > Info.plist &&
619 } || AC_MSG_ERROR([failed to make temporary directory])
620 AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
621 [AC_MSG_RESULT(yes)],
623 cd .. && rm -fr tmp.$$.try_link
625 AC_MSG_ERROR([something wrong with LDFLAGS="$LDFLAGS"])
628 cd .. && rm -fr tmp.$$.try_link
632 AC_CACHE_CHECK(whether ELF binaries are produced, rb_cv_binary_elf,
633 [AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[]])],[
634 AS_CASE(["`head -1 conftest$EXEEXT | tr -dc '\177ELF' | tr '\177' .`"],
635 [.ELF*], [rb_cv_binary_elf=yes], [rb_cv_binary_elf=no])],
636 [rb_cv_binary_elf=no])])
639 AS_IF([test x"${RPATHFLAG=}" = x], [
640 AS_CASE(["$target_os"],
641 [aix*], [rpathflag='-blibpath:'],
642 [for rpathflag in "-rpath " -R; do
643 AS_CASE("$rpathflag",
644 [*" "], [AS_CASE(["${linker_flag}"],
645 [*,], [rpathflag=`echo "$rpathflag" | tr ' ' ,`])])
646 rpathflag="${linker_flag}${rpathflag}"
647 RUBY_TRY_LDFLAGS([${rpathflag}.], [], [rpathflag=])
648 AS_IF([test "x${rpathflag}" != x], [break])
651 rpathflag=`echo "$RPATHFLAG" | sed 's/%.*//'`
655 AS_HELP_STRING([--enable-rpath], [embed run path into extension libraries.
656 enabled by default on ELF platforms]),
657 [enable_rpath=$enableval], [enable_rpath="$rb_cv_binary_elf"])
659 AS_IF([test "$enable_rpath:${RPATHFLAG}" = yes:], [
660 RPATHFLAG="${rpathflag:+ ${rpathflag}%1\$-s}"
662 AS_CASE([${RPATHFLAG}],[*'%1$'*],[: ${LIBPATHFLAG=' -L%1$-s'}],[: ${LIBPATHFLAG=' -L%s'}])
665 RUBY_TRY_LDFLAGS(-fdeclspec, [fdeclspec=yes], [fdeclspec=no])
666 AS_IF([test "$fdeclspec" = yes], [
667 RUBY_APPEND_OPTIONS(CFLAGS, -fdeclspec)
668 RUBY_APPEND_OPTIONS(cflags, -fdeclspec)
669 RUBY_APPEND_OPTIONS(orig_cflags, -fdeclspec)
671 RUBY_TRY_CXXFLAGS(-fdeclspec, [fdeclspec=yes], [fdeclspec=no])
672 AS_IF([test "$fdeclspec" = yes], [
673 RUBY_APPEND_OPTIONS(CXXFLAGS, -fdeclspec)
677 AS_HELP_STRING([--enable-devel], [enable development build]),
678 [RUBY_DEVEL=$enableval],
679 [AS_IF([test "x${RUBY_DEVEL-no}" != xyes], [RUBY_DEVEL=])]
682 particular_werror_flags=${RUBY_DEVEL:-no}
683 AC_ARG_ENABLE(werror,
684 AS_HELP_STRING([--disable-werror],
685 [don't make warnings into errors
686 even if a compiler support -Werror feature
687 [[disabled by default unless development version]]]),
688 [particular_werror_flags=$enableval])
690 rb_cv_warnflags="$warnflags"
691 AS_CASE(["$GCC:${warnflags+set}:${extra_warnflags:+set}:"],
692 [yes::*|yes:*:set:], [# GCC && (!warnflags || extra_warnflags)
693 AS_IF([test $gcc_major -le 6], [
694 extra_warnflags="$extra_warnflags -Wno-maybe-uninitialized"
696 AS_CASE([ $CFLAGS ], [*" -save-temps="*|*" -save-temps "*], [], [
697 extra_warnflags="$extra_warnflags -Werror=misleading-indentation"
700 # ICC doesn't support -Werror=
701 AS_IF([test $icc_version -gt 0], [
702 particular_werror_flags=no
705 -Werror=extra-tokens \
706 -Werror=deprecated-declarations \
707 -Werror=division-by-zero -Werror=div-by-zero \
708 -Werror=duplicated-cond \
709 -Werror=implicit-function-declaration \
710 -Werror=implicit-int \
711 -Werror=pointer-arith \
712 -Werror=shorten-64-to-32 \
713 -Werror=write-strings \
714 -Werror=old-style-definition \
715 -Wimplicit-fallthrough=0 \
717 -Wno-cast-function-type \
718 -Wno-constant-logical-operand \
720 -Wno-missing-field-initializers \
721 -Wno-overlength-strings \
722 -Wno-packed-bitfield-compat \
723 -Wno-parentheses-equality \
725 -Wno-tautological-compare \
726 -Wno-unused-parameter \
728 -Wsuggest-attribute=format \
729 -Wsuggest-attribute=noreturn \
731 -diag-disable=175,188,1684,2259,2312 \
734 AS_IF([test "$particular_werror_flags" != yes], [
735 wflag=`echo x$wflag | sed 's/^x-Werror=/-W/;s/^x//'`
738 RUBY_TRY_CFLAGS($wflag, [
739 RUBY_APPEND_OPTIONS(warnflags, $wflag)
742 AS_CASE([$ok:$wflag], [no:-Werror=*], [
743 wflag=`echo x$wflag | sed 's/^x-Werror=/-W/'`
744 RUBY_TRY_CFLAGS($wflag, [
745 RUBY_APPEND_OPTIONS(warnflags, $wflag)
746 particular_werror_flags=no
750 AS_IF([test "$particular_werror_flags" = "yes"], [
755 RUBY_TRY_CFLAGS($wflag, [
756 RUBY_APPEND_OPTIONS(warnflags, $wflag)
758 @%:@if !defined(RUBY_CONFIG_TEST_NEVER_DEFINED_SYMBOL)
759 @%:@elif RUBY_CONFIG_TEST_NEVER_DEFINED_SYMBOL
762 AS_CASE([" $warnflags "],[*" -Wno-missing-field-initializers "*], [wflag="-Wall -Wextra"],
764 RUBY_TRY_CFLAGS($wflag, [warnflags="$wflag${warnflags+ $warnflags}"])
765 # Disable warnflags while conftest. -Werror=* flags might make bad OS capability guess.
766 rb_cv_warnflags="$warnflags"
769 RUBY_TRY_CFLAGS(-Qunused-arguments, [RUBY_APPEND_OPTIONS(rb_cv_wsuppress_flags, -Qunused-arguments)])
772 @%:@if !(defined(__SUNPRO_C)||defined(__SUNPRO_CC))
776 E_STATEMENT_NOT_REACHED \
778 E_INIT_DOES_NOT_FIT \
779 E_INITIALIZATION_TYPE_MISMATCH
781 RUBY_TRY_CFLAGS([-erroff=${e}], [
782 RUBY_APPEND_OPTIONS(rb_cv_warnflags, [-erroff=${e}])
787 AC_ARG_WITH(compress-debug-sections,
788 AS_HELP_STRING([--with-compress-debug-sections=type],
789 [enable debug section compression]),
790 [compress_debug_sections=$withval], [compress_debug_sections=])
792 AS_IF([test "$GCC" = yes], [
794 # When defined _FORTIFY_SOURCE, glibc enables some additional sanity
795 # argument check. The performance drop is very little and Ubuntu enables
796 # _FORTIFY_SOURCE=2 by default. So, let's support it for protecting us from
797 # a mistake of silly C extensions.
799 # TODO: check if link succeeds with _FORTIFY_SOURCE=2.
800 AS_CASE(["$target_os"],
804 AC_ARG_ENABLE(fortify_source,
805 AS_HELP_STRING([--disable-fortify-source],
806 [disable -D_FORTIFY_SOURCE=2 option, which causes link error on mingw]),
807 [fortify_source=$enableval])
808 AS_IF([test "x$fortify_source" != xno], [
809 RUBY_TRY_CFLAGS([$optflags -D_FORTIFY_SOURCE=2],
810 [RUBY_APPEND_OPTION(XCFLAGS, -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2)], [],
811 [@%:@include <stdio.h>])
815 AS_CASE(["$target_os"],
816 [emscripten*|wasi*], [
819 AS_IF([test -z "${stack_protector+set}"], [
820 AS_FOR(option, opt, [-fstack-protector-strong -fstack-protector], [
821 RUBY_TRY_CFLAGS(option, [stack_protector=yes])
822 AS_IF([test "x$stack_protector" = xyes], [
823 RUBY_TRY_LDFLAGS(option, [], [stack_protector=])
825 AS_IF([test "x$stack_protector" = xyes], [stack_protector=option; break])
828 AC_MSG_CHECKING([for -fstack-protector])
829 AC_MSG_RESULT(["$stack_protector"])
830 AS_CASE(["$stack_protector"], [-*], [
831 RUBY_APPEND_OPTION(XCFLAGS, $stack_protector)
832 RUBY_APPEND_OPTION(XLDFLAGS, $stack_protector)
833 RUBY_APPEND_OPTION(LDFLAGS, $stack_protector)
836 # aarch64 branch protection
837 AS_CASE(["$target_cpu"], [aarch64], [
838 AS_FOR(option, opt, [-mbranch-protection=pac-ret -msign-return-address=all], [
839 RUBY_TRY_CFLAGS(option, [branch_protection=yes], [branch_protection=no])
840 AS_IF([test "x$branch_protection" = xyes], [
841 # C compiler and assembler must be consistent for -mbranch-protection
842 # since they both check `__ARM_FEATURE_PAC_DEFAULT` definition.
843 RUBY_APPEND_OPTION(XCFLAGS, option)
844 RUBY_APPEND_OPTION(ASFLAGS, option)
850 AS_CASE("${compress_debug_sections:-zlib}",
852 RUBY_TRY_LDFLAGS(${linker_flag}--compress-debug-sections=${compress_debug_sections:-zlib},
853 [compress_debug_sections=${compress_debug_sections:-zlib}],
854 [compress_debug_sections=no])
856 AS_IF([test "x$compress_debug_sections" != xno], [
857 RUBY_APPEND_OPTION(DLDFLAGS, ${linker_flag}--compress-debug-sections=$compress_debug_sections)
860 AS_CASE(["$target_os"],[mingw*], [
861 # On Windows platforms, system provided headers are VC++
862 # optimized. That is, C++ habits are often contaminated into
863 # various headers. Most frequent situation is the use of //
864 # comments. We bypass ANSI C mode for them. Otherwise
865 # extension libs cannot include those headers.
867 # Since math.h in some mingw64 wrongly declares frexp and modf
868 # to be pure, the variables pointed by the second arguments are
869 # considered uninitialized unexpectedly.
870 AC_CACHE_CHECK([whether frexp and modf are broken],
871 rb_cv_mingw64_broken_frexp_modf,
873 save_CFLAGS="$CFLAGS"
874 AS_IF([test "$particular_werror_flags" = "yes"], [
875 CFLAGS="$CFLAGS -Werror=uninitialized"
877 CFLAGS="$CFLAGS -Werror -Wuninitialized"
879 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include <math.h>
885 }]], [[if (foo(0.0)) return 1;]])],
886 [rb_cv_mingw64_broken_frexp_modf=no],
887 [rb_cv_mingw64_broken_frexp_modf=yes])
888 CFLAGS="$save_CFLAGS"
890 AS_IF([test "$rb_cv_mingw64_broken_frexp_modf" = yes], [
891 AC_DEFINE(RUBY_MINGW64_BROKEN_FREXP_MODF)
894 [cygwin*|msys*|darwin*|netbsd*], [
898 # suppress annoying -Wstrict-overflow warnings
899 RUBY_TRY_CFLAGS(-fno-strict-overflow, [RUBY_APPEND_OPTION(XCFLAGS, -fno-strict-overflow)])
901 test "${debugflags+set}" || {RUBY_TRY_CFLAGS(-ggdb3, [debugflags=-ggdb3])}
902 test "${debugflags+set}" || {RUBY_TRY_CFLAGS(-ggdb, [debugflags=-ggdb])}
903 test "${debugflags+set}" || {RUBY_TRY_CFLAGS(-g3, [debugflags=-g3])}
905 test $ac_cv_prog_cc_g = yes && : ${debugflags=-g}
907 AS_IF([test "$GCC" = ""], [
908 AS_CASE(["$target_os"],[aix*],[warnflags="$warnflags -qinfo=por" rb_cv_warnflags="$rb_cv_warnflags -qinfo=por"])
910 AS_IF([test "$GCC" = yes], [
911 RUBY_TRY_CFLAGS(-fvisibility=hidden, [visibility_option=yes], [visibility_option=no])
912 AC_SUBST(WERRORFLAG, "-Werror")
913 AS_IF([test "$visibility_option" = yes], [
914 RUBY_APPEND_OPTION(XCFLAGS, -fvisibility=hidden)
915 AC_DEFINE(RUBY_SYMBOL_EXPORT_BEGIN, [_Pragma("GCC visibility push(default)")])
916 AC_DEFINE(RUBY_SYMBOL_EXPORT_END, [_Pragma("GCC visibility pop")])
918 RUBY_TRY_LDFLAGS([-Wl,-unexported_symbol,_Init_*], [visibility_option=ld], [visibility_option=no])
922 AS_IF([test "$GCC" = yes], [
925 AS_CASE(["$target_os"], [mingw*], [
926 RUBY_TRY_CFLAGS(-fno-omit-frame-pointer, [optflags="${optflags+$optflags }-fno-omit-frame-pointer"])
927 RUBY_TRY_CFLAGS(-static-libgcc, [static_libgcc=yes], [static_libgcc=no])
928 AS_IF([test "$static_libgcc" = yes], [
929 RUBY_APPEND_OPTION(EXTLDFLAGS, -static-libgcc)
934 for oflag in -fno-fast-math; do
935 RUBY_TRY_CFLAGS($oflag, [RUBY_APPEND_OPTION(optflags, $oflag)])
937 for oflag in -fexcess-precision=standard -fp-model\ precise; do
938 RUBY_TRY_CFLAGS($oflag, [RUBY_APPEND_OPTION(XCFLAGS, $oflag)])
942 AS_CASE(["$target_cpu"], [[i[3-6]86*]], [
943 AC_CACHE_CHECK([for __sync_val_compare_and_swap], [rb_cv_gcc_compiler_cas], [
944 AC_LINK_IFELSE([AC_LANG_PROGRAM([[unsigned long atomic_var;]],
945 [[__sync_val_compare_and_swap(&atomic_var, 0, 1);]])],
946 [rb_cv_gcc_compiler_cas=yes],
948 save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -march=i486"
949 AC_LINK_IFELSE([AC_LANG_PROGRAM([[unsigned long atomic_var;]],
950 [[__sync_val_compare_and_swap(&atomic_var, 0, 1);]])],
951 [rb_cv_gcc_compiler_cas=i486],
952 [rb_cv_gcc_compiler_cas=no])
953 CFLAGS="$save_CFLAGS"
956 AS_IF([test "$rb_cv_gcc_compiler_cas" = i486], [ARCH_FLAG="-march=i486"])
960 AC_ARG_WITH([gmp-dir],
961 AS_HELP_STRING([--with-gmp-dir=DIR],
962 [specify the prefix directory where gmp is installed]),
963 [OPT_DIR="${OPT_DIR:+$OPT_DIR$PATH_SEPARATOR}$withval"], [])
965 [AS_HELP_STRING([--without-gmp],
966 [disable GNU GMP to accelerate Bignum operations])],
970 AS_HELP_STRING([--with-opt-dir=DIR-LIST],
971 [add optional headers and libraries directories separated by $PATH_SEPARATOR]),
972 [OPT_DIR="${OPT_DIR:+$OPT_DIR$PATH_SEPARATOR}$withval"], [])
974 AS_IF([test "x$OPT_DIR" != x], [
975 val=`IFS="$PATH_SEPARATOR"
976 for dir in $OPT_DIR; do
977 test -z "$dir" && continue
978 echo x ${LIBPATHFLAG} ${RPATHFLAG} |
979 sed "s/^x *//;s${IFS}"'%1\\$-s'"${IFS}${dir}/lib${IFS}g;s${IFS}%s${IFS}${dir}/lib${IFS}g"
980 done | tr '\012' ' ' | sed 's/ *$//'`
981 LDFLAGS="${LDFLAGS:+$LDFLAGS }$val"
982 DLDFLAGS="${DLDFLAGS:+$DLDFLAGS }$val"
983 LDFLAGS_OPTDIR="$val"
984 INCFLAGS="${INCFLAGS:+$INCFLAGS }"`echo "$OPT_DIR" | tr "${PATH_SEPARATOR}" '\012' |
985 sed '/^$/d;s|^|-I|;s|$|/include|' | tr '\012' ' ' | sed 's/ *$//'`
987 AC_SUBST(incflags, "$INCFLAGS")
989 test -z "${ac_env_CFLAGS_set}" -a -n "${cflags+set}" && eval CFLAGS="\"$cflags $ARCH_FLAG\""
990 test -z "${ac_env_CXXFLAGS_set}" -a -n "${cxxflags+set}" && eval CXXFLAGS="\"$cxxflags $ARCH_FLAG\""
993 AC_CACHE_CHECK([whether compiler has statement and declarations in expressions],
994 rb_cv_have_stmt_and_decl_in_expr,
995 [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]],[[ __extension__ ({ int a = 0; a; }); ]])],
996 [rb_cv_have_stmt_and_decl_in_expr=yes],
997 [rb_cv_have_stmt_and_decl_in_expr=no])])
998 AS_IF([test "$rb_cv_have_stmt_and_decl_in_expr" = yes], [
999 AC_DEFINE(HAVE_STMT_AND_DECL_IN_EXPR)
1002 [begin]_group "header and library section" && {
1003 AC_ARG_WITH(winnt-ver,
1004 AS_HELP_STRING([--with-winnt-ver=0xXXXX], [target Windows NT version (default to 0x0600)]),
1005 [with_winnt_ver="$withval"], [with_winnt_ver="0x0600"])
1006 AS_CASE(["$target_os"],
1008 RUBY_APPEND_OPTION(CPPFLAGS, -D_WIN32_WINNT=$with_winnt_ver)
1009 RUBY_APPEND_OPTION(CPPFLAGS, -D__MINGW_USE_VC2005_COMPAT)
1014 dnl Checks for libraries.
1015 AS_CASE(["$target_os"],[*bsd*|dragonfly*],[],[ac_cv_func_daemon=no])
1017 AS_CASE(["$target_os"], [*android*], [
1018 AS_CASE(["$target_cpu"], [arm*], [
1019 ac_cv_func___builtin_setjmp=no
1028 AS_CASE(["$target_os"],
1034 RUBY_PREPEND_OPTION(LIBS, -lobjc)
1035 RUBY_APPEND_OPTIONS(CPPFLAGS, -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT)
1036 AC_CACHE_CHECK([whether syscall(2) is deprecated], rb_cv_syscall_deprecated,
1038 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include <unistd.h>]],
1039 [[if (syscall(0)) return 1;]])],
1040 [rb_cv_syscall_deprecated=no],
1041 [rb_cv_syscall_deprecated=yes])])])
1042 AS_IF([test $rb_cv_syscall_deprecated = yes], [
1043 ac_cv_func___syscall=no
1044 ac_cv_func_syscall=no
1045 ac_cv_header_sys_syscall_h=no
1046 ac_cv_header_syscall_h=no
1048 ac_cv_func_getcontext=no
1049 ac_cv_func_setcontext=no
1050 ac_cv_type_getgroups=gid_t # getgroups() on Rosetta fills garbage
1051 ac_cv_lib_crypt_crypt=no
1052 ac_cv_func_fdatasync=no # Mac OS X wrongly reports it has fdatasync()
1054 AS_IF([test $gcc_major -eq 4 -a $gcc_minor -lt 3], [
1055 ac_cv_func___builtin_setjmp=no
1057 with_setjmp_type=sigsetjmp # to hijack SIGCHLD handler
1058 AC_CACHE_CHECK(for broken crypt with 8bit chars, rb_cv_broken_crypt,
1059 [AC_RUN_IFELSE([AC_LANG_SOURCE([[
1065 broken_crypt(const char *salt, const char *buf1, const char *buf2)
1068 printf("%.2x%.2x: %s -> %s\n", (unsigned char)salt[0], (unsigned char)salt[1],
1077 char salt[2], buf[256], *s;
1078 for (i = 0; i < 128*128; i++) {
1079 salt[0] = 0x80 | (i & 0x7f);
1080 salt[1] = 0x80 | (i >> 7);
1081 strcpy(buf, crypt("", salt));
1082 if (strcmp(buf, s = crypt("", salt))) {
1083 broken_crypt(salt, buf, s);
1087 salt[0] = salt[1] = ' ';
1088 strcpy(buf, crypt("", salt));
1089 salt[0] = salt[1] = 0x80 | ' ';
1090 if (strcmp(buf, s = crypt("", salt))) {
1091 broken_crypt(salt, buf, s);
1097 rb_cv_broken_crypt=no,
1098 rb_cv_broken_crypt=yes,
1099 rb_cv_broken_crypt=yes)])
1100 AS_IF([test "$rb_cv_broken_crypt" = yes], [
1101 AC_DEFINE(BROKEN_CRYPT, 1)
1104 AC_CHECK_PROGS(codesign, codesign)
1106 AS_CASE("$CC_NO_WRAPPER", [gcc*-1[[3-9]]], [
1107 dsymutils=${CC_NO_WRAPPER@%:@gcc}
1108 dsymutils=dsymutil${dsymutils%-1*}
1109 dsymutils="$dsymutils-19 $dsymutils-18 $dsymutils-17"
1111 AC_CHECK_PROGS(dsymutil, $dsymutils dsymutil)
1112 AS_IF([test -n "$codesign"], [
1113 POSTLINK="{ test -z '\$(RUBY_CODESIGN)' || $codesign -s '\$(RUBY_CODESIGN)' \$@; }${POSTLINK:+; $POSTLINK}"
1115 AS_IF([test -n "$dsymutil"], [
1116 POSTLINK="$dsymutil \$@ 2>/dev/null${POSTLINK:+; $POSTLINK}"
1118 AC_CHECK_HEADERS(crt_externs.h, [], [], [
1119 #include <crt_externs.h>
1121 cleanlibs='$(TARGET_SO:=.dSYM)'
1123 [solaris*], [ LIBS="-lm $LIBS"
1125 AC_MSG_CHECKING(whether _XOPEN_SOURCE is already given)
1126 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <unistd.h>
1127 #ifndef _XOPEN_SOURCE
1128 #error _XOPEN_SOURCE is not defined
1131 [given_xopen_source=yes], [given_xopen_source=no])
1132 AC_MSG_RESULT($given_xopen_source)
1133 AS_IF([test $given_xopen_source = no], [
1134 AC_MSG_CHECKING(appropriate _XOPEN_SOURCE value to define)
1135 define_xopen_source=""
1136 for tmp_xpg in 7 6 5; do
1137 AS_IF([test x"$define_xopen_source" != x], [
1140 RUBY_WERROR_FLAG([AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
1141 #define _XOPEN_SOURCE ${tmp_xpg}00
1143 #ifndef _XPG${tmp_xpg}
1144 #error _XPG${tmp_xpg} should be defined by _XOPEN_SOURCE=${tmp_xpg}00
1147 [define_xopen_source=${tmp_xpg}00], [])
1150 AS_IF([test x"$define_xopen_source" = x], [
1151 define_xopen_source=no
1153 AC_MSG_RESULT($define_xopen_source)
1154 AS_IF([test x"$define_xopen_source" != xno], [
1155 RUBY_APPEND_OPTIONS(CPPFLAGS, -D_XOPEN_SOURCE=$define_xopen_source)
1156 # _XOPEN_SOURCE should not be defined for C++ on Solaris.
1157 RUBY_APPEND_OPTIONS(CXXFLAGS, -U_XOPEN_SOURCE)
1160 AC_CHECK_TYPES([caddr_t],[],[],[@%:@include <sys/types.h>])
1161 AC_CACHE_CHECK([whether madvise declaration is needed], rb_cv_madvice_prototype_using_caddr_t,
1162 [RUBY_WERROR_FLAG([AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
1163 @%:@include <sys/unistd.h>
1164 @%:@include <sys/mman.h>
1165 @%:@include <sys/types.h>
1166 extern int madvise(caddr_t, size_t, int);
1168 [rb_cv_madvice_prototype_using_caddr_t=yes], [rb_cv_madvice_prototype_using_caddr_t=no])
1171 AS_IF([test $rb_cv_madvice_prototype_using_caddr_t = yes], [AC_DEFINE(NEED_MADVICE_PROTOTYPE_USING_CADDR_T, 1)])
1174 LIBS="$LIBS" # m lib is include in root
1177 ac_cv_header_langinfo_h=yes
1178 RUBY_APPEND_OPTIONS(CPPFLAGS, -D_XOPEN_SOURCE -D_GNU_SOURCE)
1179 AC_CHECK_FUNCS(cygwin_conv_path)
1180 AC_LIBOBJ([langinfo])
1182 [mingw*], [ LIBS="-lshell32 -lws2_32 -liphlpapi -limagehlp -lshlwapi -lbcrypt $LIBS"
1183 ac_cv_header_pwd_h=no
1184 ac_cv_header_utime_h=no
1185 ac_cv_header_sys_ioctl_h=no
1186 ac_cv_header_sys_param_h=no
1187 ac_cv_header_sys_resource_h=no
1188 ac_cv_header_sys_select_h=no
1189 ac_cv_header_sys_time_h=no
1190 ac_cv_header_sys_times_h=no
1191 ac_cv_header_sys_socket_h=no
1192 ac_cv_func_execv=yes
1193 ac_cv_func_lstat=yes
1194 ac_cv_func_times=yes
1195 ac_cv_func_waitpid=yes
1196 ac_cv_func_fsync=yes
1197 ac_cv_func_seekdir=yes
1198 ac_cv_func_telldir=yes
1199 ac_cv_func_lchown=yes
1201 ac_cv_func_readlink=yes
1202 ac_cv_func_shutdown=yes
1203 ac_cv_func_symlink=yes
1204 ac_cv_lib_crypt_crypt=no
1205 ac_cv_func_getpgrp_void=no
1206 ac_cv_func_memcmp_working=yes
1207 ac_cv_lib_dl_dlopen=no
1208 rb_cv_negative_time_t=yes
1209 ac_cv_func_fcntl=yes
1210 ac_cv_func_flock=yes
1211 ac_cv_func_gmtime_r=yes
1212 rb_cv_large_fd_select=yes
1213 ac_cv_type_struct_timeval=yes
1214 ac_cv_func_clock_gettime=yes
1215 ac_cv_func_clock_getres=yes
1216 ac_cv_func_malloc_usable_size=no
1217 ac_cv_type_off_t=yes
1218 ac_cv_sizeof_off_t=8
1219 AS_IF([test "$target_cpu" = x64], [
1220 ac_cv_func___builtin_setjmp=yes
1223 ac_cv_func_tgamma=no
1224 AC_CHECK_TYPE([NET_LUID], [], [],
1225 [@%:@include <winsock2.h>
1226 @%:@include <iphlpapi.h>])
1227 AS_IF([test x"$ac_cv_type_NET_LUID" = xyes], [
1228 AC_DEFINE(HAVE_TYPE_NET_LUID, 1)
1230 AC_CHECK_FUNCS(_gmtime64_s)
1231 AC_CHECK_FUNCS(_wfreopen_s)
1232 AC_LIBOBJ([langinfo])
1234 [bsdi*], [ LIBS="-lm $LIBS"
1235 AC_DEFINE(BROKEN_SETREUID, 1)
1236 AC_DEFINE(BROKEN_SETREGID, 1)
1237 ac_cv_sizeof_rlim_t=8],
1238 [freebsd*], [ LIBS="-lm $LIBS"
1239 ac_cv_func_getpeername=no
1240 ac_cv_func_getsockname=no
1241 ac_cv_func_shutdown=no
1244 [netbsd*], [ LIBS="-lm $LIBS"
1246 [dragonfly*], [ LIBS="-lm $LIBS"
1248 [aix*],[ LIBS="-lm $LIBS"
1250 ac_cv_func___builtin_setjmp=no
1252 [linux*],[ LIBS="-lm $LIBS"
1253 # __builtin_longjmp in ppc64* Linux does not restore
1254 # the TOC register (r2), which is problematic
1255 # when a global exit happens from JITted .so code.
1256 AS_CASE(["$target_cpu"], [powerpc64*], [
1257 ac_cv_func___builtin_setjmp=no
1259 # With gcc-8's -fcf-protection, RJIT's __builtin_longjmp fails.
1260 AS_CASE(["$CC $CFLAGS "], [*" -fcf-protection "*], [cf_protection=yes], [cf_protection=no])
1261 AS_IF([test "$cf_protection" = yes], [
1262 ac_cv_func___builtin_setjmp=no
1265 [emscripten*], [LIBS="-lm -lc $LIBS"
1266 RUBY_APPEND_OPTIONS(LDFLAGS, "-sALLOW_MEMORY_GROWTH=1")
1267 RUBY_APPEND_OPTIONS(LDFLAGS, "-sASYNCIFY")
1268 RUBY_APPEND_OPTIONS(LDFLAGS, "-sFORCE_FILESYSTEM=1")
1269 ac_cv_func_shutdown=no
1271 [wasi*],[ LIBS="-lm -lwasi-emulated-mman -lwasi-emulated-signal -lwasi-emulated-getpid -lwasi-emulated-process-clocks $LIBS"
1272 RUBY_APPEND_OPTIONS(CFLAGS, -D_WASI_EMULATED_SIGNAL -D_WASI_EMULATED_MMAN -D_WASI_EMULATED_GETPID -D_WASI_EMULATED_PROCESS_CLOCKS)
1273 RUBY_APPEND_OPTIONS(CPPFLAGS, -D_WASI_EMULATED_SIGNAL -D_WASI_EMULATED_MMAN -D_WASI_EMULATED_GETPID -D_WASI_EMULATED_PROCESS_CLOCKS)
1274 POSTLINK="\$(WASMOPT) --asyncify \$(wasmoptflags) -o \$@ \$@${POSTLINK:+; $POSTLINK}"
1275 # wasi-libc's sys/socket.h is not compatible with -std=gnu99,
1276 # so re-declare shutdown in include/ruby/missing.h
1277 ac_cv_func_shutdown=no
1279 [ LIBS="-lm $LIBS"])
1280 : ${ORIG_LIBS=$LIBS}
1282 AS_IF([test -n "${POSTLINK}"], [
1283 # NOTE: A (part of) link commands used link shared extension libraries. If
1284 # the first line of the value is empty, mkmf prepends default link steps.
1289 AS_IF([test -n "${rb_there_is_in_fact_no_gplusplus_but_autoconf_is_cheating_us}"], [
1290 AC_MSG_NOTICE([Test skipped due to lack of a C++ compiler.])
1292 [test -n "${CXX}"], [
1294 AC_MSG_CHECKING([whether CXXFLAGS is valid])
1296 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include <cstdio>]], [[]])],
1297 [AC_MSG_RESULT(yes)],[
1299 # The message mentions CXXFLAGS, but CPPFLAGS might also affects.
1300 AC_MSG_WARN([something wrong with CXXFLAGS="$CXXFLAGS"])
1307 AC_CHECK_LIB(crypt, crypt) # glibc (GNU/Linux, GNU/Hurd, GNU/kFreeBSD)
1308 AC_CHECK_LIB(dl, dlopen) # Dynamic linking for SunOS/Solaris and SYSV
1309 AC_CHECK_LIB(socket, shutdown) # SunOS/Solaris
1311 dnl Checks for header files.
1313 dnl AC_HEADER_STDC has been checked in AC_USE_SYSTEM_EXTENSIONS
1317 AC_CHECK_HEADERS([afunix.h], [], [],
1319 # include <winsock2.h>
1322 AC_CHECK_HEADERS(atomic.h)
1323 AC_CHECK_HEADERS(copyfile.h)
1324 AC_CHECK_HEADERS(direct.h)
1325 AC_CHECK_HEADERS(grp.h)
1326 AC_CHECK_HEADERS(fcntl.h)
1327 AC_CHECK_HEADERS(float.h)
1328 AC_CHECK_HEADERS(ieeefp.h)
1329 AC_CHECK_HEADERS(intrinsics.h)
1330 AC_CHECK_HEADERS(langinfo.h)
1331 AC_CHECK_HEADERS(limits.h)
1332 AC_CHECK_HEADERS(locale.h)
1333 AC_CHECK_HEADERS(malloc.h)
1334 AC_CHECK_HEADERS(malloc/malloc.h)
1335 AC_CHECK_HEADERS(malloc_np.h)
1336 AC_CHECK_HEADERS(net/socket.h)
1337 AC_CHECK_HEADERS(process.h)
1338 AC_CHECK_HEADERS(pwd.h)
1339 AC_CHECK_HEADERS(sanitizer/asan_interface.h)
1340 AC_CHECK_HEADERS(sanitizer/msan_interface.h)
1341 AC_CHECK_HEADERS(setjmpex.h)
1342 AC_CHECK_HEADERS(stdalign.h)
1343 AC_CHECK_HEADERS(stdio.h)
1344 AC_CHECK_HEADERS(sys/attr.h)
1345 AC_CHECK_HEADERS(sys/eventfd.h)
1346 AC_CHECK_HEADERS(sys/fcntl.h)
1347 AC_CHECK_HEADERS(sys/file.h)
1348 AC_CHECK_HEADERS(sys/id.h)
1349 AC_CHECK_HEADERS(sys/ioctl.h)
1350 AC_CHECK_HEADERS(sys/mkdev.h)
1351 AC_CHECK_HEADERS(sys/param.h)
1352 AC_CHECK_HEADERS(sys/prctl.h)
1353 AC_CHECK_HEADERS(sys/random.h)
1354 AC_CHECK_HEADERS(sys/resource.h)
1355 AC_CHECK_HEADERS(sys/select.h)
1356 AC_CHECK_HEADERS(sys/sendfile.h)
1357 AC_CHECK_HEADERS(sys/socket.h)
1358 AC_CHECK_HEADERS(sys/syscall.h)
1359 AC_CHECK_HEADERS(sys/sysmacros.h)
1360 AC_CHECK_HEADERS(sys/time.h)
1361 AC_CHECK_HEADERS(sys/times.h)
1362 AC_CHECK_HEADERS(sys/uio.h)
1363 AC_CHECK_HEADERS(sys/utime.h)
1364 AC_CHECK_HEADERS(syscall.h)
1365 AC_CHECK_HEADERS(time.h)
1366 AC_CHECK_HEADERS(ucontext.h)
1367 AC_CHECK_HEADERS(utime.h)
1368 AC_CHECK_HEADERS(sys/epoll.h)
1369 AC_CHECK_HEADERS(sys/event.h)
1370 AC_CHECK_HEADERS(stdckdint.h)
1372 AS_CASE("$target_cpu", [x64|x86_64|i[3-6]86*], [
1373 AC_CHECK_HEADERS(x86intrin.h)
1375 RUBY_UNIVERSAL_CHECK_HEADER([x86_64, i386], x86intrin.h)
1377 AS_IF([test "x$with_gmp" != xno],
1378 [AC_CHECK_HEADERS(gmp.h)
1379 AS_IF([test "x$ac_cv_header_gmp_h" != xno],
1380 AC_SEARCH_LIBS([__gmpz_init], [gmp],
1381 [AC_DEFINE(HAVE_LIBGMP, 1)]))])
1383 AC_ARG_WITH([jemalloc],
1384 [AS_HELP_STRING([--with-jemalloc],[use jemalloc allocator])],
1385 [with_jemalloc=$withval], [with_jemalloc=no])
1386 AS_IF([test "x$with_jemalloc" != xno],[
1387 # find jemalloc header first
1389 AC_CHECK_HEADER(jemalloc/jemalloc.h, [malloc_header=jemalloc/jemalloc.h], [
1390 AC_CHECK_HEADER(jemalloc.h, [malloc_header=jemalloc.h])
1392 AS_IF([test "$malloc_header" != ""], [
1393 AC_DEFINE_UNQUOTED(RUBY_ALTERNATIVE_MALLOC_HEADER, [<$malloc_header>])
1396 AC_CACHE_CHECK([for jemalloc library], rb_cv_jemalloc_library, [
1397 rb_cv_jemalloc_library=no
1398 # try [with mangle, without mangle] x [no more additional
1399 # libraries, adding jemalloc] combination, using the jemalloc
1400 # header found above.
1401 for mangle in '' mangle; do
1402 for lib in '' -ljemalloc; do
1403 LIBS="${lib:+$lib }$LIBS"
1404 AC_LINK_IFELSE([AC_LANG_PROGRAM([${mangle:+@%:@define JEMALLOC_MANGLE 1}
1405 @%:@include <stdio.h>
1406 @%:@ifdef RUBY_ALTERNATIVE_MALLOC_HEADER
1407 @%:@include RUBY_ALTERNATIVE_MALLOC_HEADER
1409 extern const char *malloc_conf;
1411 [/* access at runtime not to be optimized away */
1412 if (malloc_conf) printf("malloc_conf=%s\n", malloc_conf);])],
1413 [rb_cv_jemalloc_library="${lib:-none required}${mangle:+ with mangle}"])
1415 test "${rb_cv_jemalloc_library}" = no || break 2
1419 with_jemalloc=${rb_cv_jemalloc_library}
1420 AS_CASE(["$with_jemalloc"],
1422 [AC_MSG_ERROR([jemalloc requested but not found])],
1424 set dummy $with_jemalloc
1426 DLDLIBS="$2${DLDLIBS:+ $DLDLIBS}" # probably needed also in extension libraries
1428 AS_CASE(["$with_jemalloc"],
1429 [*" with mangle"], [
1430 AC_DEFINE(JEMALLOC_MANGLE)
1432 AC_DEFINE(HAVE_MALLOC_CONF)
1433 ac_cv_func_malloc_usable_size=yes
1436 dnl check for large file stuff
1437 mv confdefs.h confdefs1.h
1440 # On 32-bit Solaris, it is safe to define _LARGEFILE_SOURCE
1441 # which is not added by AC_SYS_LARGEFILE.
1442 AS_IF([test x"$enable_largefile" != xno], [
1443 AS_CASE(["$target_os"], [solaris*], [
1444 AC_MSG_CHECKING([whether _LARGEFILE_SOURCE should be defined])
1445 AS_CASE(["${ac_cv_sys_file_offset_bits}:${ac_cv_sys_large_files}"],
1446 ["64:"|"64:no"|"64:unknown"], [
1447 # insert _LARGEFILE_SOURCE before _FILE_OFFSET_BITS line
1448 # that is the same order as "getconf LFS_CFLAGS" output
1449 mv confdefs.h largefile0.h
1451 AC_DEFINE(_LARGEFILE_SOURCE)
1452 cat largefile0.h >> confdefs.h
1454 AC_MSG_RESULT([yes])
1455 ], [AC_MSG_RESULT([no])])
1458 mv confdefs.h largefile.h
1459 mv confdefs1.h confdefs.h
1460 cat largefile.h >> confdefs.h
1462 AS_CASE(["$target_os"],
1464 AS_CASE(["$target_cpu:$ac_cv_sys_large_files"],
1465 [ppc64:*|powerpc64:*], [],
1466 [*:no|*:unknown], [],
1468 # AIX currently does not support a 32-bit call to posix_fadvise()
1469 # if _LARGE_FILES is defined.
1470 ac_cv_func_posix_fadvise=no
1474 AC_C_BIGENDIAN([], [], [], [AC_DEFINE(AC_APPLE_UNIVERSAL_BUILD, 1)])
1482 AS_CASE(":$ac_cv_c_const:$ac_cv_c_volatile:",
1483 [*:no:*], [AC_MSG_ERROR(ANSI C-conforming const and volatile are mandatory)])
1485 AC_CHECK_TYPES([long long, off_t])
1487 AC_CACHE_CHECK([char bit], [rb_cv_char_bit],
1488 [test "$universal_binary" = yes && cross_compiling=yes
1489 AC_COMPUTE_INT([rb_cv_char_bit], [CHAR_BIT],
1490 [AC_INCLUDES_DEFAULT([@%:@include <limits.h>])], [rb_cv_char_bit=8])
1491 test "$universal_binary" = yes && cross_compiling=$real_cross_compiling])
1493 RUBY_CHECK_SIZEOF(int, [], [ILP])
1494 RUBY_CHECK_SIZEOF(short)
1495 RUBY_CHECK_SIZEOF(long, [int], [ILP LP])
1496 RUBY_CHECK_SIZEOF(long long)
1497 RUBY_CHECK_SIZEOF(__int64, [8], [ILP LP])
1498 RUBY_CHECK_SIZEOF(__int128, [16], [ILP LP])
1499 RUBY_CHECK_SIZEOF(off_t)
1500 RUBY_CHECK_SIZEOF(void*, [int long "long long"], [ILP LP LLP])
1501 RUBY_CHECK_SIZEOF(float)
1502 RUBY_CHECK_SIZEOF(double)
1503 RUBY_CHECK_SIZEOF(time_t, [long "long long"], [], [@%:@include <time.h>])
1504 RUBY_CHECK_SIZEOF(clock_t, [], [], [@%:@include <time.h>])
1505 AC_SUBST(X_BUILTIN_BINARY, yes)
1506 AS_IF([test "$cross_compiling" = yes],
1507 [dnl miniruby cannot run if cross compiling
1511 AS_CASE([ac_cv_sizeof_voidp],
1512 [[1-9]*], [dnl fixed value
1515 AC_CACHE_CHECK([word size], [rb_cv_word_size],
1517 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@if SIZEOF_VOIDP != ${w}
1518 @%:@error SIZEOF_VOIDP
1519 @%:@endif]])], [rb_cv_word_size=${w}; break])
1521 AS_IF([test -z $rb_cv_word_size], [X_BUILTIN_BINARY=no])
1525 AC_CACHE_CHECK(packed struct attribute, rb_cv_packed_struct,
1526 [rb_cv_packed_struct=no
1528 "__pragma(pack(push, 1)) x __pragma(pack(pop))" \
1529 "x __attribute__((packed))" \
1531 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@define PACKED_STRUCT(x) $mac
1532 PACKED_STRUCT(struct { int a; });]], [[]])],
1533 [rb_cv_packed_struct=$mac; break])
1535 AS_IF([test "$rb_cv_packed_struct" != no], [
1536 AC_DEFINE_UNQUOTED([RBIMPL_ATTR_PACKED_STRUCT_BEGIN()], [`echo " $rb_cv_packed_struct " | sed 's/ x .*//;s/^ *//'`])
1537 AC_DEFINE_UNQUOTED([RBIMPL_ATTR_PACKED_STRUCT_END()], [`echo " $rb_cv_packed_struct " | sed 's/.* x //;s/ *$//'`])
1538 RUBY_TRY_CFLAGS(-Wno-address-of-packed-member, [AC_DEFINE(USE_UNALIGNED_MEMBER_ACCESS)])
1541 AS_IF([test "x$ac_cv_type_long_long" = xyes], [
1542 RUBY_CHECK_PRINTF_PREFIX(long long, ll I64, LL)
1543 ], [test "x$ac_cv_type___int64" = xyes], [
1544 RUBY_CHECK_PRINTF_PREFIX(__int64, ll I64, LL)
1547 RUBY_REPLACE_TYPE(pid_t, int, PIDT)
1548 RUBY_REPLACE_TYPE(uid_t, int, UIDT)
1549 RUBY_REPLACE_TYPE(gid_t, int, GIDT)
1550 RUBY_REPLACE_TYPE(time_t, [], TIMET, [@%:@include <time.h>])
1551 RUBY_REPLACE_TYPE(dev_t, [int long "long long"], DEVT)
1552 RUBY_REPLACE_TYPE(mode_t, ["unsigned short" "unsigned int" long], MODET, [@%:@include <sys/stat.h>])
1553 RUBY_REPLACE_TYPE(rlim_t, [int long "long long"], RLIM, [
1554 @%:@ifdef HAVE_SYS_TYPES_H
1555 @%:@include <sys/types.h>
1557 @%:@ifdef HAVE_SYS_TYPES_H
1558 @%:@include <sys/time.h>
1560 @%:@include <sys/resource.h>
1562 RUBY_REPLACE_TYPE(off_t, [], OFFT)
1563 RUBY_REPLACE_TYPE(clockid_t, [], CLOCKID, [@%:@ifdef HAVE_TIME_H
1564 @%:@ include <time.h>
1566 @%:@ifdef HAVE_SYS_TIME_H
1567 @%:@ include <sys/time.h>
1570 # __VA_ARGS__ is also tested in AC_PROG_CC_C99 since autoconf 2.60a (around
1571 # 2006). The check below is redundant and should always success. Remain not
1572 # deleted for backward compat.
1573 AC_CACHE_CHECK(for variable length macro, rb_cv_va_args_macro,
1574 [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
1575 int foo(const char*);
1576 @%:@define FOO(...) foo(@%:@__VA_ARGS__)
1577 ]], [[FOO(1);FOO(1,2);FOO(1,2,3);]])],
1578 rb_cv_va_args_macro=yes,
1579 rb_cv_va_args_macro=no)])
1580 AS_IF([test "$rb_cv_va_args_macro" = yes], [
1581 AC_DEFINE(HAVE_VA_ARGS_MACRO)
1584 # We want C11's `_Alignof`. GCC (and alike) have `__alignof__`, which behave
1585 # slightly differently than the C11's. We cannot use `__alignof__` for our
1586 # purpose. The problem is, however, that old gcc and old clang had both
1587 # implemented `_Alignof` as a synonym of `__alignof__`. They are not what we
1588 # want. We have to check sanity.
1590 # See also: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=52023
1591 # See also: https://bugs.llvm.org/show_bug.cgi?id=26547
1592 AC_CACHE_CHECK([if _Alignof() works], rb_cv_have__alignof,[
1593 rb_cv_have__alignof=no
1595 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
1596 @%:@ifdef HAVE_STDALIGN_H
1597 @%:@include <stdalign.h>
1599 @%:@ifdef STDC_HEADERS
1600 @%:@include <stddef.h>
1603 @%:@define __extension__
1606 typedef struct conftest_tag {
1610 static int conftest_ary@<:@
1611 offsetof(T, d) == __extension__ _Alignof(double)
1614 return conftest_ary@<:@0@:>@;
1616 rb_cv_have__alignof=yes
1620 AS_IF([test "$rb_cv_have__alignof" != no], [
1621 AC_DEFINE(HAVE__ALIGNOF)
1624 RUBY_FUNC_ATTRIBUTE(__const__, CONSTFUNC)
1625 RUBY_FUNC_ATTRIBUTE(__pure__, PUREFUNC)
1626 RUBY_FUNC_ATTRIBUTE(__noreturn__, NORETURN)
1627 RUBY_FUNC_ATTRIBUTE(__deprecated__, DEPRECATED)
1628 RUBY_FUNC_ATTRIBUTE(__deprecated__("by "@%:@n), DEPRECATED_BY(n,x), rb_cv_func_deprecated_by)
1629 RUBY_FUNC_ATTRIBUTE(__noinline__, NOINLINE)
1630 RUBY_FUNC_ATTRIBUTE(__always_inline__, ALWAYS_INLINE)
1631 RUBY_FUNC_ATTRIBUTE(__no_sanitize__(san), NO_SANITIZE(san, x), rb_cv_func_no_sanitize)
1632 RUBY_FUNC_ATTRIBUTE(__no_sanitize_address__, NO_SANITIZE_ADDRESS)
1633 RUBY_FUNC_ATTRIBUTE(__no_address_safety_analysis__, NO_ADDRESS_SAFETY_ANALYSIS)
1634 RUBY_FUNC_ATTRIBUTE(__warn_unused_result__, WARN_UNUSED_RESULT)
1635 RUBY_FUNC_ATTRIBUTE(__unused__, MAYBE_UNUSED)
1636 RUBY_FUNC_ATTRIBUTE(__error__ mesg, ERRORFUNC(mesg,x), rb_cv_func___error__)
1637 RUBY_FUNC_ATTRIBUTE(__warning__ mesg, WARNINGFUNC(mesg,x), rb_cv_func___warning__)
1638 RUBY_FUNC_ATTRIBUTE(__weak__, WEAK, rb_cv_func_weak)
1639 AS_IF([test "$rb_cv_func_weak" != x], [
1640 AC_DEFINE(HAVE_FUNC_WEAK)
1643 AC_CACHE_CHECK([for __attribute__((__depreacted__(msg))) in C++],
1644 rb_cv_CentOS6_CXX_workaround,
1650 [__attribute__((__deprecated__("message"))) int conftest(...);])],
1651 [rb_cv_CentOS6_CXX_workaround=yes],
1652 [rb_cv_CentOS6_CXX_workaround=no])
1654 AS_IF([test "$rb_cv_CentOS6_CXX_workaround" != no],[
1655 AC_DEFINE([RUBY_CXX_DEPRECATED(msg)],
1656 [__attribute__((__deprecated__(msg)))])])
1658 AC_CACHE_CHECK([for std::nullptr_t], rb_cv_CXX_nullptr, [
1662 [@%:@include <cstddef>],
1663 [static std::nullptr_t const *const conftest = nullptr;])],
1664 [rb_cv_CXX_nullptr=yes],
1665 [rb_cv_CXX_nullptr=no])
1667 AS_IF([test "$rb_cv_CXX_nullptr" != no],[AC_DEFINE(HAVE_NULLPTR)])
1669 if_i386=${universal_binary+[defined __i386__]}
1670 RUBY_FUNC_ATTRIBUTE(__stdcall__, FUNC_STDCALL, rb_cv_func_stdcall, ${if_i386})
1671 RUBY_FUNC_ATTRIBUTE(__cdecl__, FUNC_CDECL, rb_cv_func_cdecl, ${if_i386})
1672 RUBY_FUNC_ATTRIBUTE(__fastcall__, FUNC_FASTCALL, rb_cv_func_fastcall, ${if_i386})
1673 RUBY_FUNC_ATTRIBUTE(__optimize__("O0"), FUNC_UNOPTIMIZED, rb_cv_func_unoptimized)
1674 RUBY_FUNC_ATTRIBUTE(__optimize__("-Os","-fomit-frame-pointer"), FUNC_MINIMIZED, rb_cv_func_minimized)
1676 AS_IF([test "$GCC" = yes], [
1677 AC_CACHE_CHECK([for function alias], [rb_cv_gcc_function_alias],
1678 [rb_cv_gcc_function_alias=no
1679 for a in alias weak,alias; do
1680 AC_LINK_IFELSE([AC_LANG_PROGRAM([[void foo(void) {}
1681 void bar(void) __attribute__(($a("foo")));]], [[bar()]])],
1682 [rb_cv_gcc_function_alias=$a; break])
1684 AS_IF([test "$rb_cv_gcc_function_alias" != no], [
1685 AC_DEFINE(HAVE_ATTRIBUTE_FUNCTION_ALIAS)
1686 AC_DEFINE_UNQUOTED([RUBY_ALIAS_FUNCTION_TYPE(type, prot, name, args)],
1687 [type prot __attribute__(($rb_cv_gcc_function_alias(@%:@name)));])
1688 AC_DEFINE_UNQUOTED([RUBY_ALIAS_FUNCTION_VOID(prot, name, args)],
1689 [RUBY_ALIAS_FUNCTION_TYPE(void, prot, name, args)])
1694 AC_CACHE_CHECK([for __atomic builtins], [rb_cv_gcc_atomic_builtins], [
1695 AC_LINK_IFELSE([AC_LANG_PROGRAM([[unsigned int atomic_var;]],
1697 __atomic_exchange_n(&atomic_var, 0, __ATOMIC_SEQ_CST);
1698 __atomic_exchange_n(&atomic_var, 1, __ATOMIC_SEQ_CST);
1699 __atomic_fetch_add(&atomic_var, 1, __ATOMIC_SEQ_CST);
1700 __atomic_fetch_sub(&atomic_var, 1, __ATOMIC_SEQ_CST);
1701 __atomic_or_fetch(&atomic_var, 1, __ATOMIC_SEQ_CST);
1703 [rb_cv_gcc_atomic_builtins=yes],
1704 [rb_cv_gcc_atomic_builtins=no])])
1705 AS_IF([test "$rb_cv_gcc_atomic_builtins" = yes], [
1706 AC_DEFINE(HAVE_GCC_ATOMIC_BUILTINS)
1709 AC_CACHE_CHECK([for __sync builtins], [rb_cv_gcc_sync_builtins], [
1710 AC_LINK_IFELSE([AC_LANG_PROGRAM([[unsigned int atomic_var;]],
1712 __sync_lock_test_and_set(&atomic_var, 0);
1713 __sync_lock_test_and_set(&atomic_var, 1);
1714 __sync_fetch_and_add(&atomic_var, 1);
1715 __sync_fetch_and_sub(&atomic_var, 1);
1716 __sync_or_and_fetch(&atomic_var, 1);
1717 __sync_val_compare_and_swap(&atomic_var, 0, 1);
1719 [rb_cv_gcc_sync_builtins=yes],
1720 [rb_cv_gcc_sync_builtins=no])])
1721 AS_IF([test "$rb_cv_gcc_sync_builtins" = yes], [
1722 AC_DEFINE(HAVE_GCC_SYNC_BUILTINS)
1725 AC_CACHE_CHECK(for __builtin_unreachable, rb_cv_func___builtin_unreachable,
1727 [AC_LINK_IFELSE([AC_LANG_PROGRAM([[volatile int zero;]],
1728 [[if (zero) __builtin_unreachable();]])],
1729 [rb_cv_func___builtin_unreachable=yes],
1730 [rb_cv_func___builtin_unreachable=no])
1733 AS_IF([test "$rb_cv_func___builtin_unreachable" = yes], [
1734 AC_DEFINE(HAVE___BUILTIN_UNREACHABLE)
1737 AC_CACHE_CHECK(for __assume, rb_cv_func___assume,
1739 AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],
1741 [rb_cv_func___assume=yes],
1742 [rb_cv_func___assume=no])
1745 AS_IF([test "$rb_cv_func___assume" = yes], [
1746 AC_DEFINE(HAVE___ASSUME)
1750 AC_CACHE_CHECK(for exported function attribute, rb_cv_func_exported, [
1751 rb_cv_func_exported=no
1753 for mac in '__attribute__ ((__visibility__("default")))' '__declspec(dllexport)'; do
1754 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@define RUBY_FUNC_EXPORTED $mac extern
1755 RUBY_FUNC_EXPORTED void conftest_attribute_check(void);]], [[]])],
1756 [rb_cv_func_exported="$mac"; break])
1759 AS_IF([test "$rb_cv_func_exported" != no], [
1760 AC_DEFINE_UNQUOTED(RUBY_FUNC_EXPORTED, [$rb_cv_func_exported extern])
1762 RUBY_DECL_ATTRIBUTE([__nonnull__(n)], [RUBY_FUNC_NONNULL(n,x)], [rb_cv_func_nonnull],
1764 @%:@define x int conftest_attribute_check(void *p)
1768 RUBY_APPEND_OPTION(XCFLAGS, -DRUBY_EXPORT)
1770 AC_ARG_ENABLE(mathn,
1771 AS_HELP_STRING([--enable-mathn], [enable canonicalization for mathn]),
1772 [AC_MSG_ERROR([mathn support has been dropped])])
1774 AC_CACHE_CHECK(for function name string predefined identifier,
1775 rb_cv_function_name_string,
1776 [AS_CASE(["$target_os"],[openbsd*],[
1777 rb_cv_function_name_string=__func__
1779 rb_cv_function_name_string=no
1781 for func in __func__ __FUNCTION__; do
1782 AC_LINK_IFELSE([AC_LANG_PROGRAM([[@%:@include <stdio.h>]],
1784 [rb_cv_function_name_string=$func
1790 AS_IF([test "$rb_cv_function_name_string" != no], [
1791 AC_DEFINE_UNQUOTED(RUBY_FUNCTION_NAME_STRING, [$rb_cv_function_name_string])
1794 AC_CACHE_CHECK(if enum over int is allowed, rb_cv_enum_over_int, [
1795 rb_cv_enum_over_int=no
1796 AS_IF([test "x$ac_cv_type_long_long" = xyes], [
1797 type="unsigned long long" max="ULLONG_MAX"
1799 type="unsigned long" max="ULONG_MAX"
1803 AC_LANG_BOOL_COMPILE_TRY([
1804 @%:@include <limits.h>
1805 enum {conftest_max = $max};
1807 (conftest_max == $max) &&
1808 (sizeof(conftest_max) == sizeof($type))
1811 [rb_cv_enum_over_int=yes],
1812 [rb_cv_enum_over_int=no]
1816 AS_IF([test $rb_cv_enum_over_int = yes], [
1817 AC_DEFINE(ENUM_OVER_INT, 1)
1820 dnl Check whether we need to define sys_nerr locally
1821 AC_CHECK_DECLS([sys_nerr], [], [], [$ac_includes_default
1822 @%:@include <errno.h>])
1824 AC_CHECK_DECLS([getenv])
1826 AS_CASE(["$target_cpu"],
1827 [alpha*|sh4|sh4el|sh4eb], [AS_CASE(["$target_os"::"$GCC"],
1829 [CFLAGS="-mieee $CFLAGS"],
1831 [CFLAGS="-ieee $CFLAGS"],
1833 [sparc*], [AC_LIBOBJ([sparc])])
1835 ac_cv_header_net_socket_h=${ac_cv_header_net_socket_h=no}
1836 AS_IF([test "$ac_cv_header_net_socket_h" = yes], [
1837 ac_cv_header_sys_socket_h=${ac_cv_header_sys_socket_h=no}
1839 ac_cv_header_sys_socket_h=${ac_cv_header_sys_socket_h=yes}
1844 RUBY_CHECK_SIGNEDNESS(size_t, [AC_MSG_ERROR(size_t is signed)], [],
1845 [@%:@include <sys/types.h>])
1846 RUBY_CHECK_SIZEOF(size_t, [int long void*], [], [@%:@include <sys/types.h>])
1847 RUBY_CHECK_SIZEOF(ptrdiff_t, size_t, [], [@%:@include <stddef.h>])
1848 RUBY_CHECK_SIZEOF(dev_t)
1849 RUBY_CHECK_PRINTF_PREFIX(size_t, z)
1850 RUBY_CHECK_PRINTF_PREFIX(ptrdiff_t, t)
1851 AC_CHECK_MEMBERS([struct stat.st_blksize])
1852 AC_CHECK_MEMBERS([struct stat.st_blocks])
1853 AC_CHECK_MEMBERS([struct stat.st_rdev])
1854 RUBY_CHECK_SIZEOF([struct stat.st_size], [off_t int long "long long"], [], [@%:@include <sys/stat.h>])
1855 AS_IF([test "$ac_cv_member_struct_stat_st_blocks" = yes], [
1856 RUBY_CHECK_SIZEOF([struct stat.st_blocks], [off_t int long "long long"], [], [@%:@include <sys/stat.h>])
1858 RUBY_CHECK_SIZEOF([struct stat.st_ino], [long "long long"], [], [@%:@include <sys/stat.h>])
1859 RUBY_CHECK_SIZEOF([struct stat.st_dev], [dev_t int long "long long"], [], [@%:@include <sys/stat.h>])
1860 AS_IF([test "$ac_cv_member_struct_stat_st_rdev" = yes], [
1861 RUBY_CHECK_SIZEOF([struct stat.st_rdev], [dev_t int long "long long"], [], [@%:@include <sys/stat.h>])
1863 AC_CHECK_MEMBERS([struct stat.st_atim])
1864 AC_CHECK_MEMBERS([struct stat.st_atimespec])
1865 AC_CHECK_MEMBERS([struct stat.st_atimensec])
1866 AC_CHECK_MEMBERS([struct stat.st_mtim])
1867 AC_CHECK_MEMBERS([struct stat.st_mtimespec])
1868 AC_CHECK_MEMBERS([struct stat.st_mtimensec])
1869 AC_CHECK_MEMBERS([struct stat.st_ctim])
1870 AC_CHECK_MEMBERS([struct stat.st_ctimespec])
1871 AC_CHECK_MEMBERS([struct stat.st_ctimensec])
1872 AC_CHECK_MEMBERS([struct stat.st_birthtimespec])
1873 AS_IF([test "x$ac_cv_member_struct_stat_st_birthtimespec" != xyes],
1874 [AC_CHECK_MEMBERS([struct statx.stx_btime])])
1876 AC_CHECK_TYPES([struct timeval], [], [], [@%:@ifdef HAVE_TIME_H
1877 @%:@include <time.h>
1879 @%:@ifdef HAVE_SYS_TIME_H
1880 @%:@include <sys/time.h>
1883 AS_IF([test "${ac_cv_type_struct_timeval}" = yes], [
1884 RUBY_CHECK_SIZEOF([struct timeval.tv_sec], [time_t long "long long"], [],
1885 [@%:@ifdef HAVE_TIME_H
1886 @%:@include <time.h>
1888 @%:@ifdef HAVE_SYS_TIME_H
1889 @%:@include <sys/time.h>
1891 AS_CASE(${ac_cv_sizeof_struct_timeval_tv_sec},
1892 [SIZEOF_INT], [t=int],
1893 [SIZEOF_LONG], [t=long],
1894 [SIZEOF_LONG_LONG], [t=LONG_LONG],
1896 AS_IF([test "${t}" != ""], [
1897 AC_DEFINE_UNQUOTED(TYPEOF_TIMEVAL_TV_SEC, [$t])
1901 AC_CHECK_TYPES([struct timespec], [], [], [@%:@ifdef HAVE_TIME_H
1902 @%:@include <time.h>
1904 @%:@ifdef HAVE_SYS_TIME_H
1905 @%:@include <sys/time.h>
1908 AC_CHECK_TYPES([struct timezone], [], [], [@%:@ifdef HAVE_TIME_H
1909 @%:@ include <time.h>
1911 @%:@ifdef HAVE_SYS_TIME_H
1912 @%:@ include <sys/time.h>
1915 AC_CACHE_VAL([rb_cv_large_fd_select],
1916 [AC_CHECK_TYPE(fd_mask, [rb_cv_large_fd_select=yes], [rb_cv_large_fd_select=no], [AC_INCLUDES_DEFAULT([])
1917 @%:@ifdef HAVE_SYS_SELECT_H
1918 @%:@ include <sys/select.h>
1920 AS_IF([test "$rb_cv_large_fd_select" = yes], [
1921 AC_DEFINE(HAVE_RB_FD_INIT, 1)
1924 RUBY_DEFINT(int8_t, 1)
1925 RUBY_DEFINT(uint8_t, 1, unsigned)
1926 RUBY_DEFINT(int16_t, 2)
1927 RUBY_DEFINT(uint16_t, 2, unsigned)
1928 RUBY_DEFINT(int32_t, 4)
1929 RUBY_DEFINT(uint32_t, 4, unsigned)
1930 RUBY_DEFINT(int64_t, 8)
1931 RUBY_DEFINT(uint64_t, 8, unsigned)
1932 RUBY_DEFINT(int128_t, 16)
1933 RUBY_DEFINT(uint128_t, 16, unsigned)
1934 RUBY_DEFINT(intptr_t, void*)
1935 RUBY_DEFINT(uintptr_t, void*, unsigned)
1936 AS_IF([test "x$rb_cv_type_intptr_t" != xno], [
1937 RUBY_CHECK_PRINTF_PREFIX(intptr_t, '' ll I64 l, PTR)
1939 RUBY_DEFINT(ssize_t, size_t, [], [@%:@include <sys/types.h>]) dnl may differ from int, so not use AC_TYPE_SSIZE_T.
1940 AS_IF([test "x$rb_cv_type_int64_t" != xno], [
1941 RUBY_CHECK_PRINTF_PREFIX(int64_t, ll I64 l, 64)
1944 AC_CACHE_CHECK(for stack end address, rb_cv_stack_end_address,
1945 [rb_cv_stack_end_address=no
1946 AC_LINK_IFELSE([AC_LANG_PROGRAM(
1947 [[extern void *__libc_stack_end;]],
1948 [[if (!__libc_stack_end) return 1;]])],
1949 [rb_cv_stack_end_address="__libc_stack_end"])
1951 AS_IF([test $rb_cv_stack_end_address != no], [
1952 AC_DEFINE_UNQUOTED(STACK_END_ADDRESS, $rb_cv_stack_end_address)
1955 dnl Checks for library functions.
1957 AS_CASE(["${target_cpu}-${target_os}:${target_archs}"],
1958 [powerpc*-darwin*], [
1959 AC_LIBSOURCES(alloca.c)
1960 AC_SUBST([ALLOCA], [\${LIBOBJDIR}alloca.${ac_objext}])
1962 AC_DEFINE_UNQUOTED(alloca, alloca)
1964 [universal-darwin*:*ppc*], [
1965 AC_LIBSOURCES(alloca.c)
1966 AC_SUBST([ALLOCA], [\${LIBOBJDIR}alloca.${ac_objext}])
1967 RUBY_DEFINE_IF([defined __POWERPC__], C_ALLOCA, 1) # Darwin defines __POWERPC__ for ppc and ppc64 both
1968 RUBY_DEFINE_IF([defined __POWERPC__], alloca, alloca)
1973 AS_IF([test "x$ALLOCA" = "x"], [
1974 AC_CACHE_CHECK([for dynamic size alloca], rb_cv_dynamic_alloca, [
1975 for chk in ok __chkstk; do
1976 AC_LINK_IFELSE([AC_LANG_PROGRAM([[
1977 @%:@ifdef HAVE_ALLOCA_H
1978 @%:@include <alloca.h>
1981 int dynamic_alloca_test;
1982 int dynamic_alloca_result;]],
1983 [[dynamic_alloca_result = alloca(dynamic_alloca_test) != 0;]])],
1984 [rb_cv_dynamic_alloca=$chk; break])
1986 AS_IF([test "x$rb_cv_dynamic_alloca" = "x__chkstk"], [
1987 AC_DEFINE_UNQUOTED(RUBY_ALLOCA_CHKSTK, _$rb_cv_dynamic_alloca)
1988 AS_CASE("$target_cpu",
1990 AC_SUBST([ALLOCA], [\${LIBOBJDIR}x86_64-chkstk.${ac_objext}])
1996 AS_CASE(["$target_os"],[freebsd*],[
1997 AC_DEFINE(BROKEN_CLOSE)
1998 AC_REPLACE_FUNCS(close)
2001 # dup and dup2 are always available except for WASI
2002 AS_CASE(["$target_os"],
2005 RUBY_REQUIRE_FUNCS(dup dup2)
2009 AC_REPLACE_FUNCS(acosh)
2010 AC_REPLACE_FUNCS(cbrt)
2011 AC_REPLACE_FUNCS(crypt)
2012 AC_REPLACE_FUNCS(erf)
2013 AC_REPLACE_FUNCS(explicit_bzero)
2014 AC_REPLACE_FUNCS(ffs)
2015 AC_REPLACE_FUNCS(flock)
2016 AC_REPLACE_FUNCS(hypot)
2017 AC_REPLACE_FUNCS(lgamma_r)
2018 AC_REPLACE_FUNCS(memmove)
2019 AC_REPLACE_FUNCS(nan)
2020 AC_REPLACE_FUNCS(nextafter)
2021 AC_REPLACE_FUNCS(setproctitle)
2022 AC_REPLACE_FUNCS(strchr)
2023 AC_REPLACE_FUNCS(strerror)
2024 AC_REPLACE_FUNCS(strlcat)
2025 AC_REPLACE_FUNCS(strlcpy)
2026 AC_REPLACE_FUNCS(strstr)
2027 AC_REPLACE_FUNCS(tgamma)
2029 AC_DEFINE(HAVE_ISFINITE) # C99; backward compatibility
2031 # for missing/setproctitle.c
2032 AS_CASE(["$target_os"],
2033 [aix* | k*bsd*-gnu | kopensolaris*-gnu | linux* | darwin*], [AC_DEFINE(SPT_TYPE,SPT_REUSEARGV)],
2035 AC_CHECK_HEADERS(sys/pstat.h)
2038 AC_DEFINE(HAVE_SIGNBIT) # C99; backward compatibility
2042 AC_CHECK_FUNCS(__syscall)
2043 AC_CHECK_FUNCS(_longjmp) # used for AC_ARG_WITH(setjmp-type)
2044 # we don't use _setjmp if _longjmp doesn't exist.
2045 test x$ac_cv_func__longjmp = xno && ac_cv_func__setjmp=no
2046 AC_CHECK_FUNCS(arc4random_buf)
2047 AC_CHECK_FUNCS(atan2l atan2f)
2048 AC_CHECK_FUNCS(chmod)
2049 AC_CHECK_FUNCS(chown)
2050 AC_CHECK_FUNCS(chroot)
2051 AC_CHECK_FUNCS(chsize)
2052 AC_CHECK_FUNCS(clock_gettime)
2053 AC_CHECK_FUNCS(copy_file_range)
2054 AC_CHECK_FUNCS(cosh)
2055 AC_CHECK_FUNCS(crypt_r)
2056 AC_CHECK_FUNCS(daemon)
2057 AC_CHECK_FUNCS(dirfd)
2058 AC_CHECK_FUNCS(dl_iterate_phdr)
2059 AC_CHECK_FUNCS(dlopen)
2060 AC_CHECK_FUNCS(dladdr)
2061 AC_CHECK_FUNCS(dup3)
2062 AC_CHECK_FUNCS(eaccess)
2063 AC_CHECK_FUNCS(endgrent)
2064 AC_CHECK_FUNCS(eventfd)
2065 AC_CHECK_FUNCS(execl)
2066 AC_CHECK_FUNCS(execle)
2067 AC_CHECK_FUNCS(execv)
2068 AC_CHECK_FUNCS(execve)
2069 AC_CHECK_FUNCS(explicit_memset)
2070 AC_CHECK_FUNCS(fcopyfile)
2071 AC_CHECK_FUNCS(fchdir)
2072 AC_CHECK_FUNCS(fchmod)
2073 AC_CHECK_FUNCS(fchown)
2074 AC_CHECK_FUNCS(fcntl)
2075 AC_CHECK_FUNCS(fdatasync)
2076 AC_CHECK_FUNCS(fdopendir)
2077 AC_CHECK_FUNCS(fgetattrlist)
2078 AC_CHECK_FUNCS(fmod)
2079 AC_CHECK_FUNCS(fstatat)
2080 AC_CHECK_FUNCS(fsync)
2081 AC_CHECK_FUNCS(ftruncate)
2082 AC_CHECK_FUNCS(ftruncate64) # used for Win32 platform
2083 AC_CHECK_FUNCS(getattrlist)
2084 AC_CHECK_FUNCS(getcwd)
2085 AC_CHECK_FUNCS(getegid)
2086 AC_CHECK_FUNCS(getentropy)
2087 AC_CHECK_FUNCS(geteuid)
2088 AC_CHECK_FUNCS(getgid)
2089 AC_CHECK_FUNCS(getgidx)
2090 AC_CHECK_FUNCS(getgrnam)
2091 AC_CHECK_FUNCS(getgrnam_r)
2092 AC_CHECK_FUNCS(getgroups)
2093 AC_CHECK_FUNCS(getlogin)
2094 AC_CHECK_FUNCS(getlogin_r)
2095 AC_CHECK_FUNCS(getpgid)
2096 AC_CHECK_FUNCS(getpgrp)
2097 AC_CHECK_FUNCS(getppid)
2098 AC_CHECK_FUNCS(getpriority)
2099 AC_CHECK_FUNCS(getpwnam)
2100 AC_CHECK_FUNCS(getpwnam_r)
2101 AC_CHECK_FUNCS(getpwuid)
2102 AC_CHECK_FUNCS(getpwuid_r)
2103 AC_CHECK_FUNCS(getrandom)
2104 AC_CHECK_FUNCS(getresgid)
2105 AC_CHECK_FUNCS(getresuid)
2106 AC_CHECK_FUNCS(getrlimit)
2107 AC_CHECK_FUNCS(getsid)
2108 AC_CHECK_FUNCS(gettimeofday) # for making ac_cv_func_gettimeofday
2109 AC_CHECK_FUNCS(getuid)
2110 AC_CHECK_FUNCS(getuidx)
2111 AC_CHECK_FUNCS(gmtime_r)
2112 AC_CHECK_FUNCS(initgroups)
2113 AC_CHECK_FUNCS(ioctl)
2114 AC_CHECK_FUNCS(isfinite)
2115 AC_CHECK_FUNCS(issetugid)
2116 AC_CHECK_FUNCS(kill)
2117 AC_CHECK_FUNCS(killpg)
2118 AC_CHECK_FUNCS(lchmod)
2119 AC_CHECK_FUNCS(lchown)
2120 AC_CHECK_FUNCS(link)
2121 AC_CHECK_FUNCS(llabs)
2122 AC_CHECK_FUNCS(lockf)
2123 AC_CHECK_FUNCS(log2)
2124 AC_CHECK_FUNCS(lstat)
2125 AC_CHECK_FUNCS(lutimes)
2126 AC_CHECK_FUNCS(malloc_usable_size)
2127 AC_CHECK_FUNCS(malloc_size)
2128 AC_CHECK_FUNCS(malloc_trim)
2129 AC_CHECK_FUNCS(mblen)
2130 AC_CHECK_FUNCS(memalign)
2131 AC_CHECK_FUNCS(memset_s)
2132 AC_CHECK_FUNCS(writev)
2133 AC_CHECK_FUNCS(memrchr)
2134 AC_CHECK_FUNCS(memmem)
2135 AC_CHECK_FUNCS(mkfifo)
2136 AC_CHECK_FUNCS(mknod)
2137 AC_CHECK_FUNCS(mktime)
2138 AC_CHECK_FUNCS(mmap)
2139 AC_CHECK_FUNCS(mremap)
2140 AC_CHECK_FUNCS(openat)
2141 AC_CHECK_FUNCS(pclose)
2142 AC_CHECK_FUNCS(pipe)
2143 AC_CHECK_FUNCS(pipe2)
2144 AC_CHECK_FUNCS(poll)
2145 AC_CHECK_FUNCS(popen)
2146 AC_CHECK_FUNCS(posix_fadvise)
2147 AC_CHECK_FUNCS(posix_madvise)
2148 AC_CHECK_FUNCS(posix_memalign)
2149 AC_CHECK_FUNCS(ppoll)
2150 AC_CHECK_FUNCS(pread)
2151 AC_CHECK_FUNCS(pwrite)
2152 AC_CHECK_FUNCS(qsort_r)
2153 AC_CHECK_FUNCS(qsort_s)
2154 AC_CHECK_FUNCS(readlink)
2155 AC_CHECK_FUNCS(realpath)
2156 AC_CHECK_FUNCS(round)
2157 AC_CHECK_FUNCS(sched_getaffinity)
2158 AC_CHECK_FUNCS(seekdir)
2159 AC_CHECK_FUNCS(select_large_fdset)
2160 AC_CHECK_FUNCS(sendfile)
2161 AC_CHECK_FUNCS(setegid)
2162 AC_CHECK_FUNCS(setenv)
2163 AC_CHECK_FUNCS(seteuid)
2164 AC_CHECK_FUNCS(setgid)
2165 AC_CHECK_FUNCS(setgroups)
2166 AC_CHECK_FUNCS(setpgid)
2167 AC_CHECK_FUNCS(setpgrp)
2168 AC_CHECK_FUNCS(setregid)
2169 AC_CHECK_FUNCS(setresgid)
2170 AC_CHECK_FUNCS(setresuid)
2171 AC_CHECK_FUNCS(setreuid)
2172 AC_CHECK_FUNCS(setrgid)
2173 AC_CHECK_FUNCS(setrlimit)
2174 AC_CHECK_FUNCS(setruid)
2175 AC_CHECK_FUNCS(setsid)
2176 AC_CHECK_FUNCS(setuid)
2177 AC_CHECK_FUNCS(shutdown)
2178 AC_CHECK_FUNCS(sigaction)
2179 AC_CHECK_FUNCS(sigaltstack)
2180 AC_CHECK_FUNCS(sigprocmask)
2181 AC_CHECK_FUNCS(sinh)
2182 AC_CHECK_FUNCS(snprintf)
2183 AC_CHECK_FUNCS(spawnv)
2184 AC_CHECK_FUNCS(symlink)
2185 AC_CHECK_FUNCS(syscall)
2186 AC_CHECK_FUNCS(sysconf)
2187 AC_CHECK_FUNCS(system)
2188 AC_CHECK_FUNCS(tanh)
2189 AC_CHECK_FUNCS(telldir)
2190 AC_CHECK_FUNCS(timegm)
2191 AC_CHECK_FUNCS(times)
2192 AC_CHECK_FUNCS(truncate)
2193 AC_CHECK_FUNCS(truncate64) # used for Win32
2194 AC_CHECK_FUNCS(tzset)
2195 AC_CHECK_FUNCS(umask)
2196 AC_CHECK_FUNCS(unsetenv)
2197 AC_CHECK_FUNCS(utimensat)
2198 AC_CHECK_FUNCS(utimes)
2199 AC_CHECK_FUNCS(wait4)
2200 AC_CHECK_FUNCS(waitpid)
2201 AC_CHECK_FUNCS(__cospi)
2202 AC_CHECK_FUNCS(__sinpi)
2204 AS_IF([test "x$ac_cv_member_struct_statx_stx_btime" = xyes],
2205 [AC_CHECK_FUNCS(statx)])
2207 AS_IF([test "$ac_cv_func_getcwd" = yes], [
2208 AC_CACHE_CHECK(if getcwd allocates buffer if NULL is given, [rb_cv_getcwd_malloc],
2209 [AC_RUN_IFELSE([AC_LANG_SOURCE([[
2210 @%:@include <stddef.h>
2211 @%:@include <stdio.h>
2212 @%:@ifdef HAVE_UNISTD_H
2213 @%:@include <unistd.h>
2215 @%:@ifndef EXIT_SUCCESS
2216 @%:@define EXIT_SUCCESS 0
2218 @%:@ifndef EXIT_FAILURE
2219 @%:@define EXIT_FAILURE 1
2223 main(int argc, char **argv)
2225 if (!getcwd(NULL, 0)) return EXIT_FAILURE;
2226 return EXIT_SUCCESS;
2229 rb_cv_getcwd_malloc=yes,
2230 rb_cv_getcwd_malloc=no,
2232 [linux*|darwin*|*bsd|cygwin*|msys*|mingw*|mswin*],
2233 [rb_cv_getcwd_malloc=yes],
2234 [rb_cv_getcwd_malloc=no]))])
2235 AS_IF([test "$rb_cv_getcwd_malloc" = no], [AC_DEFINE(NO_GETCWD_MALLOC, 1)])
2238 AS_IF([test "$ac_cv_func_crypt_r" = yes],
2239 [AC_CHECK_HEADERS(crypt.h)])
2240 AS_IF([test "$ac_cv_func_crypt_r:$ac_cv_header_crypt_h" = yes:yes],
2241 [AC_CHECK_MEMBERS([struct crypt_data.initialized], [], [],
2242 [AC_INCLUDES_DEFAULT([@%:@include <crypt.h>])])])
2244 RUBY_CHECK_BUILTIN_FUNC(__builtin_alloca_with_align, [__builtin_alloca_with_align(1, 4096)])
2245 RUBY_CHECK_BUILTIN_FUNC(__builtin_assume_aligned, [__builtin_assume_aligned((void*)32, 32)])
2246 RUBY_CHECK_BUILTIN_FUNC(__builtin_bswap16, [__builtin_bswap16(0)])
2247 RUBY_CHECK_BUILTIN_FUNC(__builtin_bswap32, [__builtin_bswap32(0)])
2248 RUBY_CHECK_BUILTIN_FUNC(__builtin_bswap64, [__builtin_bswap64(0)])
2249 RUBY_CHECK_BUILTIN_FUNC(__builtin_popcount, [__builtin_popcount(0)])
2250 RUBY_CHECK_BUILTIN_FUNC(__builtin_popcountll, [__builtin_popcountll(0)])
2251 RUBY_CHECK_BUILTIN_FUNC(__builtin_clz, [__builtin_clz(0)])
2252 RUBY_CHECK_BUILTIN_FUNC(__builtin_clzl, [__builtin_clzl(0)])
2253 RUBY_CHECK_BUILTIN_FUNC(__builtin_clzll, [__builtin_clzll(0)])
2254 RUBY_CHECK_BUILTIN_FUNC(__builtin_ctz, [__builtin_ctz(0)])
2255 RUBY_CHECK_BUILTIN_FUNC(__builtin_ctzll, [__builtin_ctzll(0)])
2256 RUBY_CHECK_BUILTIN_FUNC(__builtin_add_overflow, [int x;__builtin_add_overflow(0,0,&x)])
2257 RUBY_CHECK_BUILTIN_FUNC(__builtin_sub_overflow, [int x;__builtin_sub_overflow(0,0,&x)])
2258 RUBY_CHECK_BUILTIN_FUNC(__builtin_mul_overflow, [int x;__builtin_mul_overflow(0,0,&x)])
2259 RUBY_CHECK_BUILTIN_FUNC(__builtin_mul_overflow_p, [__builtin_mul_overflow_p(0,0,(int)0)])
2260 RUBY_CHECK_BUILTIN_FUNC(__builtin_constant_p, [__builtin_constant_p(0)])
2261 RUBY_CHECK_BUILTIN_FUNC(__builtin_choose_expr, [
2262 [int x[__extension__(__builtin_choose_expr(1, 1, -1))]];
2263 [int y[__extension__(__builtin_choose_expr(0, -1, 1))]];
2265 AS_IF([test x$rb_cv_builtin___builtin_choose_expr = xyes], [
2266 RUBY_CHECK_BUILTIN_FUNC(__builtin_choose_expr_constant_p, [
2267 [int x[__extension__(__builtin_choose_expr(__builtin_constant_p(1), 1, -1))]];
2268 [int y[__extension__(__builtin_choose_expr(__builtin_constant_p(foo), -1, 1))]];
2271 RUBY_CHECK_BUILTIN_FUNC(__builtin_types_compatible_p, [__builtin_types_compatible_p(int, int)])
2272 RUBY_CHECK_BUILTIN_FUNC(__builtin_trap, [__builtin_trap()])
2273 RUBY_CHECK_BUILTIN_FUNC(__builtin_expect, [__builtin_expect(0, 0)])
2275 AS_IF([test "$rb_cv_builtin___builtin_mul_overflow" != no], [
2276 AC_CACHE_CHECK(for __builtin_mul_overflow with long long arguments, rb_cv_use___builtin_mul_overflow_long_long, [
2277 AC_LINK_IFELSE([AC_LANG_SOURCE([[
2278 #pragma clang optimize off
2284 __builtin_mul_overflow(x, x, &y);
2289 rb_cv_use___builtin_mul_overflow_long_long=yes,
2290 rb_cv_use___builtin_mul_overflow_long_long=no)])
2292 AS_IF([test "$rb_cv_use___builtin_mul_overflow_long_long" = yes], [
2293 AC_DEFINE(USE___BUILTIN_MUL_OVERFLOW_LONG_LONG, 1)
2296 AS_IF([test "$ac_cv_func_qsort_r" != no], [
2297 AC_CACHE_CHECK(whether qsort_r is GNU version, rb_cv_gnu_qsort_r,
2298 [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
2299 @%:@include <stdlib.h>
2300 void (qsort_r)(void *base, size_t nmemb, size_t size,
2301 int (*compar)(const void *, const void *, void *),
2304 [rb_cv_gnu_qsort_r=yes],
2305 [rb_cv_gnu_qsort_r=no])
2307 AC_CACHE_CHECK(whether qsort_r is BSD version, rb_cv_bsd_qsort_r,
2308 [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
2309 @%:@include <stdlib.h>
2310 void (qsort_r)(void *base, size_t nmemb, size_t size,
2311 void *arg, int (*compar)(void *, const void *, const void *));
2313 [rb_cv_bsd_qsort_r=yes],
2314 [rb_cv_bsd_qsort_r=no])
2316 AS_CASE("$rb_cv_gnu_qsort_r:$rb_cv_bsd_qsort_r",
2318 AC_DEFINE(HAVE_GNU_QSORT_R, 1)
2321 AC_DEFINE(HAVE_BSD_QSORT_R, 1)
2325 AC_CACHE_CHECK(whether atan2 handles Inf as C99, rb_cv_atan2_inf_c99, [
2326 AS_IF([test $ac_cv_func_atan2f:$ac_cv_func_atan2l = yes:yes], [
2327 AC_RUN_IFELSE([AC_LANG_SOURCE([[
2328 @%:@include <math.h>
2329 @%:@ifdef HAVE_UNISTD_H
2330 @%:@include <unistd.h>
2332 @%:@ifndef EXIT_SUCCESS
2333 @%:@define EXIT_SUCCESS 0
2335 @%:@ifndef EXIT_FAILURE
2336 @%:@define EXIT_FAILURE 1
2340 main(int argc, char **argv)
2342 if (fabs(atan2(INFINITY, INFINITY) - M_PI_4) <= 0.01) return EXIT_SUCCESS;
2343 return EXIT_FAILURE;
2346 [rb_cv_atan2_inf_c99=yes],
2347 [rb_cv_atan2_inf_c99=no],
2348 [AS_CASE($target_os, [mingw*|mswin*], [rb_cv_atan2_inf_c99=no], [rb_cv_atan2_inf_c99=yes])]
2350 ], [rb_cv_atan2_inf_c99=no])
2352 AS_IF([test "x$rb_cv_atan2_inf_c99" = xyes], [AC_DEFINE(ATAN2_INF_C99)])
2354 # Some platform need -lrt for clock_gettime, but the other don't.
2355 AS_IF([test x"$ac_cv_func_clock_gettime" != xyes], [
2356 # glibc 2.17 moves clock_* functions from librt to the main C library.
2357 # https://sourceware.org/legacy-ml/libc-announce/2012/msg00001.html
2358 AC_CHECK_LIB(rt, clock_gettime)
2359 AS_IF([test x"$ac_cv_lib_rt_clock_gettime" = xyes], [
2360 AC_DEFINE(HAVE_CLOCK_GETTIME, 1)
2363 AC_CHECK_FUNCS(clock_getres) # clock_getres should be tested after clock_gettime test including librt test.
2364 AC_CHECK_LIB([rt], [timer_create])
2365 AC_CHECK_LIB([rt], [timer_settime])
2366 AS_IF([test x"$ac_cv_lib_rt_timer_create" = xyes], [
2367 AC_DEFINE(HAVE_TIMER_CREATE, 1)
2369 AS_IF([test x"$ac_cv_lib_rt_timer_settime" = xyes], [
2370 AC_DEFINE(HAVE_TIMER_SETTIME, 1)
2373 AC_CACHE_CHECK(for unsetenv returns a value, rb_cv_unsetenv_return_value,
2374 [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
2376 ]], [[int v = unsetenv("foo");]])],
2377 rb_cv_unsetenv_return_value=yes,
2378 rb_cv_unsetenv_return_value=no)])
2379 AS_IF([test "$rb_cv_unsetenv_return_value" = no], [
2380 AC_DEFINE(VOID_UNSETENV)
2383 # End of setjmp check.
2385 AC_ARG_ENABLE(setreuid,
2386 AS_HELP_STRING([--enable-setreuid], [use setreuid()/setregid() according to need even if obsolete]),
2387 [use_setreuid=$enableval])
2388 AS_IF([test "$use_setreuid" = yes], [
2389 AC_DEFINE(USE_SETREUID)
2390 AC_DEFINE(USE_SETREGID)
2393 AC_CACHE_CHECK(for struct tm.tm_gmtoff, rb_cv_member_struct_tm_tm_gmtoff,
2394 [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
2395 @%:@define _BSD_SOURCE
2396 @%:@define _DEFAULT_SOURCE
2397 @%:@include <time.h>
2399 [[struct tm t; t.tm_gmtoff = 3600;]])],
2400 [rb_cv_member_struct_tm_tm_gmtoff=yes],
2401 [rb_cv_member_struct_tm_tm_gmtoff=no])])
2402 AS_IF([test "$rb_cv_member_struct_tm_tm_gmtoff" = yes], [
2403 AC_DEFINE(HAVE_STRUCT_TM_TM_GMTOFF)
2405 AC_CACHE_CHECK(for external int daylight, rb_cv_have_daylight,
2406 [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <time.h>
2408 [[i = daylight;]])],
2409 rb_cv_have_daylight=yes,
2410 rb_cv_have_daylight=no)])
2411 AS_IF([test "$rb_cv_have_daylight" = yes], [
2412 AC_DEFINE(HAVE_DAYLIGHT)
2415 AC_CACHE_CHECK(for negative time_t for gmtime(3), rb_cv_negative_time_t,
2416 [AC_RUN_IFELSE([AC_LANG_SOURCE([[
2421 check(tm, y, m, d, h, s)
2427 tm->tm_mon != m-1 ||
2441 check(gmtime(&t), 69, 12, 31, 23, 59);
2442 t = ~(time_t)0 << 31;
2443 check(gmtime(&t), 1, 12, 13, 20, 52);
2447 rb_cv_negative_time_t=yes,
2448 rb_cv_negative_time_t=no,
2449 rb_cv_negative_time_t=yes)])
2450 AS_IF([test "$rb_cv_negative_time_t" = yes], [
2451 AC_DEFINE(NEGATIVE_TIME_T)
2454 # [ruby-dev:40910] overflow of time on FreeBSD
2455 # https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=145341
2456 AC_CACHE_CHECK(for localtime(3) overflow correctly, rb_cv_localtime_overflow,
2457 [AC_RUN_IFELSE([AC_LANG_SOURCE([[
2466 tm = localtime(&t1);
2468 return; /* overflow detected. ok. */
2471 return; /* round-trip. ok. */
2479 if (~(time_t)0 <= 0) {
2480 t = (((time_t)1) << (sizeof(time_t) * 8 - 2));
2490 rb_cv_localtime_overflow=yes,
2491 rb_cv_localtime_overflow=no,
2492 rb_cv_localtime_overflow=no)])
2493 AS_IF([test "$rb_cv_localtime_overflow" = no], [
2494 AC_DEFINE(LOCALTIME_OVERFLOW_PROBLEM)
2497 AS_IF([test "$ac_cv_func_sigprocmask" = yes && test "$ac_cv_func_sigaction" = yes], [
2498 AC_DEFINE(POSIX_SIGNAL)
2500 AC_CHECK_FUNCS(sigsetmask)
2501 AC_CACHE_CHECK(for BSD signal semantics, rb_cv_bsd_signal,
2502 [AC_RUN_IFELSE([AC_LANG_SOURCE([[
2515 signal(SIGINT, sig_handler);
2516 kill(getpid(), SIGINT);
2517 kill(getpid(), SIGINT);
2521 rb_cv_bsd_signal=yes,
2522 rb_cv_bsd_signal=no,
2523 rb_cv_bsd_signal=$ac_cv_func_sigsetmask)])
2524 AS_IF([test "$rb_cv_bsd_signal" = yes], [
2525 AC_DEFINE(BSD_SIGNAL)
2529 AC_CHECK_TYPES([sig_t],[],[],[@%:@include <signal.h>])
2531 AS_IF([test "$ac_cv_func_getpgid" = no], [
2532 # AC_FUNC_GETPGRP fails when cross-compiling with old autoconf.
2533 # autoconf is changed between 2.52d and 2.52f?
2534 # https://lists.gnu.org/archive/html/bug-gnu-utils/2001-09/msg00181.html
2535 # "autoconf cleanup for AC_FUNC_GETPGRP and GETPGRP_VOID"
2538 AS_IF([test "$ac_cv_func_setpgid:$ac_cv_func_setpgrp" = no:yes], [
2539 # AC_FUNC_SETPGRP fails when cross-compiling. (until autoconf 2.69?)
2540 # https://lists.gnu.org/archive/html/bug-autoconf/2013-02/msg00002.html
2541 # "AC_FUNC_SETPGRP fails to work properly when cross-compiling"
2545 AS_IF([test x"$ac_cv_func_dirfd" = xno], [
2546 AS_CASE(["$target_os"],[solaris*],
2547 [AC_CHECK_MEMBERS([DIR.d_fd, DIR.dd_fd],,,[
2548 #include <sys/types.h>
2553 AC_CACHE_CHECK(whether right shift preserve sign bit, rb_cv_rshift_sign,
2554 [AC_COMPILE_IFELSE([AC_LANG_BOOL_COMPILE_TRY([], [(-1==(-1>>1))])],
2555 rb_cv_rshift_sign=yes,
2556 rb_cv_rshift_sign=no)])
2557 AS_IF([test "$rb_cv_rshift_sign" = yes], [
2558 AC_DEFINE(RSHIFT(x,y), ((x)>>(int)(y)))
2560 AC_DEFINE(RSHIFT(x,y), (((x)<0) ? ~((~(x))>>(int)(y)) : (x)>>(int)(y)))
2563 AS_IF([test "$ac_cv_func_copy_file_range" = no], [
2564 AC_CACHE_CHECK([for copy_file_range],
2565 rb_cv_use_copy_file_range,
2566 [AC_RUN_IFELSE([AC_LANG_SOURCE([[
2567 #include <sys/types.h>
2568 #include <sys/stat.h>
2569 #include <sys/syscall.h>
2574 #define O_TMPFILE __O_TMPFILE
2580 #ifdef __NR_copy_file_range
2581 int ret, fd_in, fd_out;
2582 fd_in = open("/tmp", O_TMPFILE|O_RDWR, S_IRUSR);
2583 fd_out = open("/tmp", O_TMPFILE|O_WRONLY, S_IWUSR);
2584 ret = syscall(__NR_copy_file_range, fd_in, NULL, fd_out, NULL, 0, 0);
2587 if (ret == -1) { return 1; }
2594 [rb_cv_use_copy_file_range=yes],
2595 [rb_cv_use_copy_file_range=no],
2596 [rb_cv_use_copy_file_range=no])])
2598 AS_CASE(["$ac_cv_func_copy_file_range:$rb_cv_use_copy_file_range"], [*yes*], [
2599 AC_DEFINE(USE_COPY_FILE_RANGE)
2602 AS_CASE(["$ac_cv_func_gettimeofday:$ac_cv_func_clock_gettime"],
2605 AC_MSG_ERROR(clock_gettime() or gettimeofday() must exist)
2608 AS_IF([test "$ac_cv_func_sysconf" = yes], [
2609 RUBY_CHECK_SYSCONF(CLK_TCK)
2612 AS_IF([test "${universal_binary-no}" = yes ], [
2613 archflagpat=`eval echo '"'"${ARCH_FLAG}"'"' | sed 's/[[][|.*]]/\\&/g'`
2614 save_CFLAGS="$CFLAGS" new_cflags=`echo "$CFLAGS" | sed "s|$archflagpat"'||'`
2615 save_LDFLAGS="$LDFLAGS" new_ldflags=`echo "$LDFLAGS" | sed "s|$archflagpat"'||'`
2617 for archs in ${universal_archnames}; do
2618 archs=`echo $archs | sed 's/=.*//'`
2619 CFLAGS="$new_cflags -arch $archs"
2620 LDFLAGS="$new_ldflags -arch $archs"
2621 RUBY_STACK_GROW_DIRECTION($archs, dir)
2622 AS_IF([test x$stack_dir = x], [
2624 ], [test x$stack_dir != x$dir], [
2628 CFLAGS="$save_CFLAGS" LDFLAGS="$save_LDFLAGS"
2629 AS_IF([test x$stack_dir = xno], [
2630 for archs in ${universal_archnames}; do
2631 archs=`echo $archs | sed 's/=.*//'`
2632 eval dir=\$[rb_cv_stack_grow_dir_]AS_TR_SH([$archs])
2633 RUBY_DEFINE_IF([defined __${archs}__], STACK_GROW_DIRECTION, $dir)
2636 AC_DEFINE_UNQUOTED(STACK_GROW_DIRECTION, $stack_dir)
2639 RUBY_STACK_GROW_DIRECTION($target_cpu, dir)
2640 AC_DEFINE_UNQUOTED(STACK_GROW_DIRECTION, $dir)
2643 AC_ARG_WITH(coroutine,
2644 AS_HELP_STRING([--with-coroutine=IMPLEMENTATION], [specify the coroutine implementation to use]),
2645 [coroutine_type=$withval], [coroutine_type=])
2646 AS_CASE([$coroutine_type], [yes|''], [
2648 AS_CASE(["$target_cpu-$target_os"],
2649 [universal-darwin*], [
2650 coroutine_type=universal
2653 coroutine_type=amd64
2656 coroutine_type=arm64
2658 # Correct target name is powerpc*-, but Ruby seems to prefer ppc*-.
2659 # Notice that Darwin PPC ABI differs from AIX and ELF.
2660 # Adding PPC targets for AIX, *BSD and *Linux will require separate implementations.
2661 [powerpc-darwin*|ppc-darwin*], [
2664 [powerpc64-darwin*|ppc64-darwin*], [
2665 coroutine_type=ppc64
2668 AS_CASE(["$ac_cv_sizeof_voidp"],
2669 [8], [ coroutine_type=amd64 ],
2670 [4], [ coroutine_type=x86 ],
2671 dnl unknown pointer size, bail out as no Context.h soon.
2678 coroutine_type=win64
2681 coroutine_type=win32
2684 coroutine_type=arm64
2687 coroutine_type=arm32
2690 coroutine_type=arm64
2692 [powerpc64le-linux*], [
2693 coroutine_type=ppc64le
2696 coroutine_type=riscv64
2698 [loongarch64-linux*], [
2699 coroutine_type=loongarch64
2701 [x86_64-freebsd*], [
2702 coroutine_type=amd64
2707 [aarch64-freebsd*], [
2708 coroutine_type=arm64
2711 coroutine_type=amd64
2716 [aarch64-netbsd*], [
2717 coroutine_type=arm64
2719 [x86_64-openbsd*], [
2720 coroutine_type=amd64
2725 [aarch64-openbsd*], [
2726 coroutine_type=arm64
2729 coroutine_type=pthread
2731 [x86_64-dragonfly*], [
2732 coroutine_type=amd64
2735 coroutine_type=pthread
2738 coroutine_type=emscripten
2741 coroutine_type=asyncify
2744 AC_CHECK_FUNCS([getcontext swapcontext makecontext],
2745 [coroutine_type=ucontext],
2746 [coroutine_type=pthread; break]
2750 AC_MSG_CHECKING(native coroutine implementation for ${target_cpu}-${target_os})
2751 AC_MSG_RESULT(${coroutine_type})
2753 COROUTINE_H=coroutine/$coroutine_type/Context.h
2754 AS_IF([test ! -f "$srcdir/$COROUTINE_H"],
2755 [AC_MSG_ERROR('$coroutine_type' is not supported as coroutine)])
2756 COROUTINE_SRC=coroutine/$coroutine_type/Context.c
2757 AS_IF([test ! -f "$srcdir/$COROUTINE_SRC"],
2758 [COROUTINE_SRC=coroutine/$coroutine_type/Context.'$(ASMEXT)'])
2759 AC_DEFINE_UNQUOTED(COROUTINE_H, ["$COROUTINE_H"])
2760 AC_SUBST(X_COROUTINE_H, [$COROUTINE_H])
2761 AC_SUBST(X_COROUTINE_SRC, [$COROUTINE_SRC])
2763 AS_IF([test "$THREAD_MODEL" = pthread], [
2764 AC_CACHE_CHECK([whether pthread_t is scalar type], [rb_cv_scalar_pthread_t], [
2765 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
2766 @%:@include <pthread.h>
2768 pthread_t thread_id;
2770 if (!thread_id) return 0;
2771 ]])],[rb_cv_scalar_pthread_t=yes],[rb_cv_scalar_pthread_t=no])
2773 AS_IF([test x"$rb_cv_scalar_pthread_t" = xyes], [
2774 : # RUBY_CHECK_SIZEOF(pthread_t, [void* int long], [], [@%:@include <pthread.h>])
2776 AC_DEFINE(NON_SCALAR_THREAD_ID)
2778 AC_CHECK_FUNCS(sched_yield pthread_attr_setinheritsched \
2779 pthread_attr_get_np pthread_attr_getstack pthread_attr_getguardsize \
2780 pthread_get_stackaddr_np pthread_get_stacksize_np \
2781 thr_stksegment pthread_stackseg_np pthread_getthrds_np \
2782 pthread_condattr_setclock \
2783 pthread_setname_np pthread_set_name_np)
2784 AS_CASE(["$target_os"],[emscripten*],[ac_cv_func_pthread_sigmask=no],[AC_CHECK_FUNCS(pthread_sigmask)])
2785 AS_CASE(["$target_os"],[aix*],[ac_cv_func_pthread_getattr_np=no],[AC_CHECK_FUNCS(pthread_getattr_np)])
2786 set_current_thread_name=
2787 AS_IF([test "$ac_cv_func_pthread_setname_np" = yes], [
2788 AC_CACHE_CHECK([arguments of pthread_setname_np], [rb_cv_func_pthread_setname_np_arguments],
2789 [rb_cv_func_pthread_setname_np_arguments=
2790 # Linux,AIX, (pthread_self(), name)
2791 # NetBSD (pthread_self(), \"%s\", name)
2794 "(pthread_self(), name)" \
2795 "(pthread_self(), \"%s\", name)" \
2798 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
2799 @%:@include <pthread.h>
2800 @%:@ifdef HAVE_PTHREAD_NP_H
2801 @%:@include <pthread_np.h>
2803 @%:@define SET_THREAD_NAME(name) pthread_setname_np${mac}
2805 [[if (SET_THREAD_NAME("conftest")) return 1;]])],
2806 [rb_cv_func_pthread_setname_np_arguments="${mac}"
2811 AS_IF([test -n "${rb_cv_func_pthread_setname_np_arguments}"], [
2812 set_current_thread_name="pthread_setname_np${rb_cv_func_pthread_setname_np_arguments}"
2814 ], [test "$ac_cv_func_pthread_set_name_np" = yes], [
2815 set_current_thread_name="pthread_set_name_np(pthread_self(), name)"
2817 AS_IF([test -n "$set_current_thread_name"], [
2818 AC_DEFINE_UNQUOTED(SET_CURRENT_THREAD_NAME(name), $set_current_thread_name)
2819 AS_CASE([$set_current_thread_name],
2820 [*'pthread_self()'*], [
2821 set_another_thread_name=`echo "$set_current_thread_name" | sed 's/pthread_self()/thid/'`
2822 AC_DEFINE_UNQUOTED(SET_ANOTHER_THREAD_NAME(thid,name), $set_another_thread_name)
2826 AC_CACHE_CHECK([for thread-local storage sepcifier], [rb_cv_tls_specifier],
2827 rb_cv_tls_specifier=none
2833 AC_LINK_IFELSE([AC_LANG_PROGRAM([[$attr int conftest;]])],
2834 [rb_cv_tls_specifier=$attr; break])
2838 AS_IF([test x"${rb_cv_tls_specifier}" != xnone],
2839 [AC_DEFINE_UNQUOTED(RB_THREAD_LOCAL_SPECIFIER, ${rb_cv_tls_specifier})]
2843 AS_IF([test x"$ac_cv_header_ucontext_h" = xno], [
2844 AC_CACHE_CHECK([if signal.h defines ucontext_t], [rb_cv_ucontext_in_signal_h],
2845 [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include <signal.h>]],
2846 [[size_t size = sizeof(ucontext_t);]])],
2847 [rb_cv_ucontext_in_signal_h=yes], [rb_cv_ucontext_in_signal_h=no])])
2848 AS_IF([test x"$rb_cv_ucontext_in_signal_h" = xyes], [
2849 AC_DEFINE_UNQUOTED(UCONTEXT_IN_SIGNAL_H, 1)
2852 AS_IF([test x"$ac_cv_header_ucontext_h" = xyes -o x"$rb_cv_ucontext_in_signal_h" = xyes], [
2853 AC_CACHE_CHECK([if mcontext_t is a pointer], [rb_cv_mcontext_t_ptr],
2854 [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
2855 @%:@include <signal.h>
2856 @%:@ifdef HAVE_UCONTEXT_H
2857 @%:@include <ucontext.h>
2859 mcontext_t test(mcontext_t mc) {return mc+1;}
2862 [rb_cv_mcontext_t_ptr=yes], [rb_cv_mcontext_t_ptr=no])])
2863 AS_IF([test x"$rb_cv_mcontext_t_ptr" = xyes], [
2864 AC_DEFINE_UNQUOTED(DEFINE_MCONTEXT_PTR(mc, uc), mcontext_t mc = (uc)->uc_mcontext)
2866 AC_DEFINE_UNQUOTED(DEFINE_MCONTEXT_PTR(mc, uc), mcontext_t *mc = &(uc)->uc_mcontext)
2868 AS_IF([test x"$THREAD_MODEL" = xpthread], [
2869 AC_CHECK_FUNCS(getcontext setcontext)
2873 AS_IF([test "$ac_cv_func_fork_works" = "yes" -a x"$THREAD_MODEL" = xpthread], [
2874 AC_CACHE_CHECK([if fork works with pthread], rb_cv_fork_with_pthread,
2875 [AC_RUN_IFELSE([AC_LANG_SOURCE([[
2878 #include <pthread.h>
2880 #include <sys/types.h>
2881 #include <sys/wait.h>
2883 #ifndef EXIT_SUCCESS
2884 #define EXIT_SUCCESS 0
2886 #ifndef EXIT_FAILURE
2887 #define EXIT_FAILURE 1
2891 thread_func(void *dmy)
2900 if (pthread_create(&tid, 0, thread_func, 0) != 0) {
2903 if (pthread_join(tid, 0) != 0) {
2910 main(int argc, char *argv[])
2913 if (use_threads()) return EXIT_FAILURE;
2919 if (waitpid(pid, &loc, WNOHANG) == 0) {
2921 return EXIT_FAILURE;
2923 if (!WIFEXITED(loc) || WEXITSTATUS(loc) != EXIT_SUCCESS)
2924 return EXIT_FAILURE;
2927 if (use_threads()) return EXIT_FAILURE;
2930 return EXIT_SUCCESS;
2932 rb_cv_fork_with_pthread=yes,
2933 rb_cv_fork_with_pthread=no,
2934 rb_cv_fork_with_pthread=yes)])
2935 test x$rb_cv_fork_with_pthread = xyes || AC_DEFINE(CANNOT_FORK_WITH_PTHREAD)
2938 AC_CHECK_HEADERS([sys/user.h])
2939 AS_IF([test "x$ac_cv_func_mmap" = xyes], [
2940 AC_CACHE_CHECK([whether PAGE_SIZE is compile-time const], rb_cv_const_page_size,
2941 [malloc_headers=`sed -n '/MALLOC_HEADERS_BEGIN/,/MALLOC_HEADERS_END/p' ${srcdir}/gc.c`
2942 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[$malloc_headers
2943 typedef char conftest_page[PAGE_SIZE];
2945 [rb_cv_const_page_size=yes],
2946 [rb_cv_const_page_size=no])])
2948 AS_IF([test "x$rb_cv_const_page_size" = xyes],
2949 [AC_DEFINE(HAVE_CONST_PAGE_SIZE, 1)],
2950 [AC_DEFINE(HAVE_CONST_PAGE_SIZE, 0)]
2953 AS_IF([test "x$ac_cv_func_ioctl" = xyes], [
2954 AC_CACHE_CHECK([ioctl request type], rb_cv_ioctl_request_type,
2955 [rb_cv_ioctl_request_type=no
2956 dnl corresponding NUM2IOCTLREQ needs to be defined
2957 for type in "unsigned long:ULONG_MAX" int:INT_MAX; do
2958 max=`echo $type | sed 's/.*://'`
2959 type=`echo $type | sed 's/:.*//'`
2961 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
2962 @%:@include <limits.h>
2963 @%:@include <sys/types.h>
2964 @%:@if defined(HAVE_SYS_IOCTL_H) && !defined(_WIN32)
2965 @%:@include <sys/ioctl.h>
2969 if (ioctl(0, req)) {/* do nothing*/};
2971 [rb_cv_ioctl_request_type="$type"])
2973 test "x$rb_cv_ioctl_request_type" = xno || break
2975 AS_CASE(["$rb_cv_ioctl_request_type"], [no|int], [],
2976 ["unsigned long"], [
2977 AC_DEFINE_UNQUOTED(IOCTL_REQ_TYPE, [$rb_cv_ioctl_request_type])
2978 AC_DEFINE_UNQUOTED(NUM2IOCTLREQ(num), [NUM2ULONG(num)])
2984 [begin]_group "runtime section" && {
2985 dnl whether use dln_a_out or not
2986 AC_ARG_WITH(dln-a-out,
2987 AS_HELP_STRING([--with-dln-a-out], [dln_a_out is deprecated]),
2991 AC_MSG_ERROR(dln_a_out no longer supported)
2995 AS_IF([test "$rb_cv_binary_elf" = yes], [
2997 AC_CHECK_HEADERS([elf.h elf_abi.h])
2998 AS_IF([test $ac_cv_header_elf_h = yes -o $ac_cv_header_elf_abi_h = yes], [
2999 AC_LIBOBJ([addr2line])
3000 AC_CHECK_LIB([z], [uncompress])
3004 AC_CHECK_HEADERS([mach-o/loader.h])
3005 AS_IF([test "$ac_cv_header_mach_o_loader_h" = yes], [
3006 AC_LIBOBJ([addr2line])
3009 AS_CASE(["$target_os"],
3010 [linux* | gnu* | k*bsd*-gnu | bsdi* | kopensolaris*-gnu], [
3011 AS_IF([test "$rb_cv_binary_elf" = no], [
3012 AC_MSG_ERROR(Not ELF)
3014 LDFLAGS="$LDFLAGS -rdynamic"
3018 AC_SUBST(DLDFLAGS)dnl
3019 AC_SUBST(ARCH_FLAG)dnl
3022 AC_SUBST(CCDLFLAGS)dnl
3023 AC_SUBST(LDSHARED)dnl
3024 AC_SUBST(LDSHAREDXX)dnl
3027 AC_SUBST(ASMEXT, S)dnl
3032 rb_cv_dlopen=unknown
3033 AC_MSG_CHECKING(whether OS depend dynamic link works)
3034 AS_IF([test "$GCC" = yes], [
3035 AS_CASE(["$target_os"],
3037 # The -fno-common is needed if we wish to embed the Ruby interpreter
3038 # into a plugin module of some project (as opposed to embedding it
3039 # within the project's application). The -I/usr/local/include is
3040 # needed because CPP as discovered by configure (cc -E -traditional)
3041 # fails to consult /usr/local/include by default. This causes
3042 # mkmf.rb's have_header() to fail if the desired resource happens to be
3043 # installed in the /usr/local tree.
3044 RUBY_APPEND_OPTION(CCDLFLAGS, -fno-common)],
3045 [bsdi*|cygwin*|msys*|mingw*|aix*|interix*], [ ],
3047 RUBY_APPEND_OPTION(CCDLFLAGS, -fPIC)])
3049 AS_CASE(["$target_os"],
3050 [solaris*|irix*], [CCDLFLAGS="$CCDLFLAGS -KPIC"],
3051 [sunos*], [CCDLFLAGS="$CCDLFLAGS -PIC"],
3052 [esix*|uxpds*], [CCDLFLAGS="$CCDLFLAGS -KPIC"],
3053 [: ${CCDLFLAGS=""}])
3058 AC_SUBST(EXTSTATIC)dnl
3059 AC_ARG_WITH(static-linked-ext,
3060 AS_HELP_STRING([--with-static-linked-ext], [link external modules statically]),
3061 [AS_CASE([$withval],[yes],[STATIC=;EXTSTATIC=static],[no],[],[EXTSTATIC="$withval"])])
3062 AS_CASE([",$EXTSTATIC,"], [,static,|*,enc,*], [
3063 ENCOBJS='enc/encinit.$(OBJEXT) enc/libenc.$(LIBEXT) enc/libtrans.$(LIBEXT)'
3064 EXTOBJS='ext/extinit.$(OBJEXT)'
3065 AC_DEFINE_UNQUOTED(EXTSTATIC, 1)
3066 AC_SUBST(ENCSTATIC, static)
3068 ENCOBJS='dmyenc.$(OBJEXT)'
3069 EXTOBJS='dmyext.$(OBJEXT)'
3075 AS_CASE(["$target_os"],
3076 [solaris*], [ AS_IF([test "$GCC" = yes], [
3077 : ${LDSHARED='$(CC) -shared'}
3078 AS_IF([test "$rb_cv_prog_gnu_ld" = yes], [
3079 LDFLAGS="$LDFLAGS -Wl,-E"
3082 : ${LDSHARED='$(CC) -G'}
3084 AS_IF([test "$ac_cv_sizeof_voidp" = 8], [
3085 : ${LIBPATHENV=LD_LIBRARY_PATH_64}
3086 : ${PRELOADENV=LD_PRELOAD_64}
3088 : ${LIBPATHENV=LD_LIBRARY_PATH_32}
3089 : ${PRELOADENV=LD_PRELOAD_32}
3092 [sunos*], [ : ${LDSHARED='$(LD) -assert nodefinitions'}
3094 [irix*], [ : ${LDSHARED='$(LD) -shared'}
3096 [sysv4*], [ : ${LDSHARED='$(LD) -G'}
3098 [nto-qnx*], [ : ${LDSHARED='$(CC) -shared'}
3100 [esix*|uxpds*], [ : ${LDSHARED='$(LD) -G'}
3102 [osf*], [ : ${LDSHARED='$(LD) -shared -expect_unresolved "*"'}
3104 [bsdi3*], [ AS_CASE(["$CC"],
3105 [*shlicc*], [ : ${LDSHARED='$(CC) -r'}
3106 rb_cv_dlopen=yes])],
3107 [linux* | gnu* | k*bsd*-gnu | netbsd* | bsdi* | kopensolaris*-gnu | haiku*], [
3108 : ${LDSHARED='$(CC) -shared'}
3109 AS_IF([test "$rb_cv_binary_elf" = yes], [
3110 LDFLAGS="$LDFLAGS -Wl,-export-dynamic"
3113 [interix*], [ : ${LDSHARED='$(CC) -shared'}
3114 XLDFLAGS="$XLDFLAGS -Wl,-E"
3116 [freebsd*|dragonfly*], [
3117 : ${LDSHARED='$(CC) -shared'}
3118 AS_IF([test "$rb_cv_binary_elf" = yes], [
3119 LDFLAGS="$LDFLAGS -rdynamic"
3120 DLDFLAGS="$DLDFLAGS "'-Wl,-soname,$@'
3122 test "$GCC" = yes && test "$rb_cv_prog_gnu_ld" = yes || LDSHARED='$(LD) -Bshareable'
3125 [openbsd*|mirbsd*], [ : ${LDSHARED='$(CC) -shared ${CCDLFLAGS}'}
3126 AS_IF([test "$rb_cv_binary_elf" = yes], [
3127 LDFLAGS="$LDFLAGS -Wl,-E"
3130 [darwin*], [ : ${LDSHARED='$(CC) -dynamic -bundle'}
3131 : ${DLDSHARED='$(CC) -dynamiclib'}
3133 : ${LIBPATHENV=DYLD_LIBRARY_PATH}
3134 : ${PRELOADENV=DYLD_INSERT_LIBRARIES}
3135 AS_IF([test x"$enable_shared" = xyes], [
3136 # Resolve symbols from libruby.dylib in $(LIBS) when --enable-shared
3137 ], [test "x$EXTSTATIC" = x], [
3138 # When building exts as bundles, a mach-o bundle needs to know its loader
3139 # program to bind symbols from the ruby executable
3140 EXTDLDFLAGS="-bundle_loader '\$(BUILTRUBY)'"
3143 [aix*], [ : ${LDSHARED='$(CC)'}
3144 AS_IF([test "$GCC" = yes], [
3145 LDSHARED="$LDSHARED ${linker_flag}-G -shared"
3147 LDSHARED="$LDSHARED ${linker_flag}-G"
3149 EXTDLDFLAGS='-e$(TARGET_ENTRY)'
3150 XLDFLAGS="${linker_flag}"'-bE:$(ARCHFILE)'" ${linker_flag}-brtl"
3151 XLDFLAGS="$XLDFLAGS ${linker_flag}-blibpath:${prefix}/lib:${LIBPATH:-/usr/lib:/lib}"
3152 : ${ARCHFILE="ruby.imp"}
3153 TRY_LINK='$(CC) -oconftest $(INCFLAGS) -I$(hdrdir) $(CPPFLAGS)'
3154 TRY_LINK="$TRY_LINK"' $(CFLAGS) $(src) $(LIBPATH) $(LDFLAGS) $(LOCAL_LIBS) $(LIBS)'
3155 : ${LIBPATHENV=LIBPATH}
3156 : ${PRELOADENV=LDR_PRELOAD}
3158 [nto-qnx*], [ DLDFLAGS="$DLDFLAGS -L/lib -L/usr/lib -L/usr/local/lib"
3159 : ${LDSHARED='$(LD) -Bshareable -x'}
3160 LDFLAGS="$LDFLAGS -L/lib -L/usr/lib -L/usr/local/lib"
3162 [cygwin*|msys*|mingw*], [
3163 : ${LDSHARED='$(CC) -shared'}
3164 XLDFLAGS="$XLDFLAGS -Wl,--stack,0x00200000,--enable-auto-import"
3165 DLDFLAGS="${DLDFLAGS} -Wl,--enable-auto-image-base,--enable-auto-import"
3166 : ${LIBPATHENV=PATH}
3169 [hiuxmpp], [ : ${LDSHARED='$(LD) -r'}],
3170 [atheos*], [ : ${LDSHARED='$(CC) -shared'}
3172 [wasi*], [ : ${LDSHARED='$(LD) -shared -Xlinker --export-dynamic'}],
3173 [ : ${LDSHARED='$(LD)'}])
3174 AC_MSG_RESULT($rb_cv_dlopen)
3177 AS_IF([test "$rb_cv_dlopen" = yes], [
3178 AS_CASE(["$target_os"],
3180 AC_SUBST(ADDITIONAL_DLDFLAGS, "")
3182 "-multiply_defined suppress" \
3183 "-undefined dynamic_lookup" \
3185 test "x${linker_flag}" = x || flag="${linker_flag}`echo ${flag} | tr ' ' ,`"
3186 RUBY_TRY_LDFLAGS([$flag], [], [flag=])
3187 AS_IF([test x"$flag" = x], [continue])
3189 AC_MSG_CHECKING([whether $flag is accepted for bundle])
3191 AS_IF([${LDSHARED%%'$(CC)'*}$CC${LDSHARED@%:@*'$(CC)'} -o conftest.bundle $flag conftest.c >/dev/null 2>conftest.err &&
3192 test ! -s conftest.err], [
3193 AC_MSG_RESULT([yes])
3194 RUBY_APPEND_OPTIONS(DLDFLAGS, [$flag])
3197 RUBY_APPEND_OPTIONS(ADDITIONAL_DLDFLAGS, [$flag])
3204 AS_IF([test "${LDSHAREDXX}" = ""], [
3205 AS_CASE(["${LDSHARED}"],
3207 LDSHAREDXX=`echo "${LDSHARED}" | sed 's/\$(CC)/$(CXX)/'`
3210 LDSHAREDXX=`echo "${LDSHARED}" | sed 's/\${CC}/${CXX}/'`
3213 LDSHAREDXX=`echo "${LDSHARED}" | sed "s|$CC|$CXX|"`
3220 AC_SUBST(LIBPATHFLAG)
3222 AC_SUBST(LIBPATHENV, "${LIBPATHENV-LD_LIBRARY_PATH}")
3223 AC_SUBST(PRELOADENV, "${PRELOADENV-LD_PRELOAD}")
3226 AS_CASE(["$target_os"],
3228 AC_CHECK_LIB([procstat], [procstat_open_sysctl])
3229 AS_IF([test "x$ac_cv_lib_procstat_procstat_open_sysctl" = xyes], [
3230 AC_CHECK_FUNCS(procstat_getvmmap)
3233 AS_CASE(["$target_cpu-$target_os"],
3235 AC_CHECK_HEADERS([libproc.h])
3236 AC_CHECK_HEADERS([execinfo.h])
3237 AS_IF([test "x$ac_cv_header_execinfo_h" = xyes], [
3238 AC_CHECK_LIB([execinfo], [backtrace])
3239 AC_CHECK_HEADERS([libunwind.h])
3241 AC_CHECK_HEADERS([mach/task.h mach/mach_init.h mach/mach_port.h])
3243 "x${ac_cv_header_mach_task_h}" = xyes -a \
3244 "x${ac_cv_header_mach_mach_init_h}" = xyes -a \
3245 "x${ac_cv_header_mach_mach_port_h}" = xyes \
3247 AC_DEFINE([HAVE_MACH_TASK_EXCEPTION_PORTS], [1])
3250 [*-freebsd*|x86_64-netbsd*], [
3251 AC_CHECK_HEADERS([execinfo.h])
3252 AS_IF([test "x$ac_cv_header_execinfo_h" = xyes], [
3253 AC_CHECK_LIB([execinfo], [backtrace])
3254 AC_CHECK_LIB([unwind], [unw_backtrace])
3256 AC_CHECK_FUNCS(backtrace)
3258 AS_IF([test "x$ac_cv_func_backtrace" = xyes], [
3259 AC_CACHE_CHECK(for broken backtrace, rb_cv_broken_backtrace,
3260 [AC_RUN_IFELSE([AC_LANG_SOURCE([[
3267 #include <execinfo.h>
3269 ]`grep '^@%:@ *define *RUBY_SIGALTSTACK_SIZE' ${srcdir}/signal.c`[
3270 #define TRACE_SIZE 256
3272 void sigsegv(int signum, siginfo_t *info, void *ctx){
3273 void *trace[TRACE_SIZE];
3274 int n = backtrace(trace, TRACE_SIZE);
3276 /*fprintf(stdout, "backtrace:%d\n",n);*/
3278 _exit(EXIT_FAILURE);
3280 _exit(EXIT_SUCCESS);
3285 volatile int *a = NULL;
3287 struct sigaction sa;
3289 ss.ss_sp = malloc(RUBY_SIGALTSTACK_SIZE);
3290 if (ss.ss_sp == NULL) {
3291 fprintf(stderr, "cannot allocate memory for sigaltstack\n");
3292 return EXIT_FAILURE;
3294 ss.ss_size = RUBY_SIGALTSTACK_SIZE;
3296 if (sigaltstack(&ss, NULL) == -1) {
3297 fprintf(stderr, "sigaltstack failed\n");
3298 return EXIT_FAILURE;
3300 memset(&sa, 0, sizeof(struct sigaction));
3301 sigemptyset(&sa.sa_mask);
3302 sa.sa_sigaction = sigsegv;
3303 sa.sa_flags |= SA_SIGINFO;
3304 sa.sa_flags |= SA_ONSTACK;
3305 sigaction(SIGSEGV, &sa, NULL);
3307 return EXIT_SUCCESS;
3310 rb_cv_broken_backtrace=no,
3311 rb_cv_broken_backtrace=yes,
3312 rb_cv_broken_backtrace=no)])
3313 AS_IF([test "$rb_cv_broken_backtrace" = yes], [
3314 AC_DEFINE(BROKEN_BACKTRACE, 1)
3318 AC_ARG_WITH(valgrind,
3319 AS_HELP_STRING([--without-valgrind],[disable valgrind memcheck support]),
3320 [], with_valgrind=yes)
3321 AS_IF([test x$with_valgrind != xno],
3322 [AC_CHECK_HEADERS(valgrind/memcheck.h)])
3324 : "dlext & soext" && {
3325 AS_CASE(["$target_os"],
3329 [cygwin*|msys*|mingw*|*djgpp*], [
3335 : ${SOEXT="${DLEXT}"}
3339 AS_IF([test "$rb_cv_dlopen:$load_relative" = yes:yes], [
3340 AS_IF([test "$ac_cv_func_dladdr" = yes], [
3344 AS_IF([test x"$LOAD_RELATIVE" = x1], [
3351 n=`expr "$DLEXT" : '.*'`; test "$n" -gt "$len" && len=$n
3352 AC_DEFINE_UNQUOTED(DLEXT_MAXLEN, `expr $len + 1`)
3353 test ".$DLEXT" = "." || AC_DEFINE_UNQUOTED(DLEXT, ".$DLEXT")
3357 AC_MSG_CHECKING([for $STRIP flags])
3358 AC_LINK_IFELSE([AC_LANG_PROGRAM], [AS_IF(
3359 ["${STRIP}" -A -n conftest$ac_exeext 2>/dev/null], [
3360 AC_MSG_RESULT([-A -n])
3361 STRIP="${STRIP} -A -n"
3363 ["${STRIP}" -S -x conftest$ac_exeext 2>/dev/null], [
3364 AC_MSG_RESULT([-S -x])
3365 STRIP="${STRIP} -S -x"
3367 AC_MSG_RESULT([none needed])
3373 AS_HELP_STRING([--with-ext=EXTS],
3374 [pass to --with-ext option of extmk.rb]))
3375 AC_ARG_WITH(out-ext,
3376 AS_HELP_STRING([--with-out-ext=EXTS],
3377 [pass to --without-ext option of extmk.rb]))
3379 AS_HELP_STRING([--with-setup=SETUP], [use extension libraries setup]),
3381 AS_IF([test -n "$setup"], [
3382 AS_IF([! test -f "ext/$setup" -o -f "$srcdir/ext/$setup"], [
3383 AC_MSG_ERROR(Setup file $setup not found under ext or $srcdir/ext)
3385 ], [test -f "$srcdir/ext/Setup.$target_os"], [
3386 setup="Setup.$target_os"
3389 for file in "$srcdir"/ext/Setup.*; do
3390 AS_CASE(["$file"], [*~|*.bak|*.orig|*.rej|*.tmp], [continue])
3391 setup=`basename "$file"`
3392 AS_CASE(["$target_os"], [`expr "$setup" : 'Setup.\(.*\)'`*], [break])
3393 platform=`sed '/^option *platform */!d;s///;s/|/*|/g;q' "$file"`
3394 AS_IF([test "x$platform" != x], [
3395 eval "AS_CASE([\"\$target_os\"], [$platform*], [break])"
3403 rubylibprefix='${libdir}/${RUBY_BASE_NAME}'
3404 AC_ARG_WITH(rubylibprefix,
3405 AS_HELP_STRING([--with-rubylibprefix=DIR], [prefix for ruby libraries [[LIBDIR/RUBY_BASE_NAME]]]),
3406 [AS_IF([test "x$withval" = xno], [
3407 AC_MSG_ERROR([No ruby, No libprefix])
3409 rubylibprefix="$withval"])
3410 AC_SUBST(rubylibprefix)
3412 AS_IF([test x"${exec_prefix}" != xNONE], [
3413 RUBY_EXEC_PREFIX="$exec_prefix"
3414 ], [test x"$prefix" != xNONE], [
3415 RUBY_EXEC_PREFIX="$prefix"
3417 RUBY_EXEC_PREFIX=$ac_default_prefix
3419 pat=`echo "${RUBY_EXEC_PREFIX}" | tr -c '\012' .`'\(.*\)'
3420 for var in bindir includedir libdir rubylibprefix; do
3421 eval val='"$'$var'"'
3422 AS_CASE(["$val"], ["${RUBY_EXEC_PREFIX}"*], [val='${exec_prefix}'"`expr \"$val\" : \"$pat\"`"])
3426 BTESTRUBY='$(MINIRUBY)'
3427 AS_IF([test x"$cross_compiling" = xyes], [
3428 test x"$MINIRUBY" = x && MINIRUBY="${RUBY-$BASERUBY} -I`$CHDIR .; pwd` "-r'$(arch)-fake'
3429 XRUBY_LIBDIR=`${RUBY-$BASERUBY} -rrbconfig -e ['puts RbConfig::CONFIG["libdir"]']`
3430 XRUBY_RUBYLIBDIR=`${RUBY-$BASERUBY} -rrbconfig -e ['puts RbConfig::CONFIG["rubylibdir"]']`
3431 XRUBY_RUBYHDRDIR=`${RUBY-$BASERUBY} -rrbconfig -e ['puts RbConfig::CONFIG["rubyhdrdir"]']`
3432 AC_SUBST(XRUBY_LIBDIR)
3433 AC_SUBST(XRUBY_RUBYLIBDIR)
3434 AC_SUBST(XRUBY_RUBYHDRDIR)
3435 PREP='$(arch)-fake.rb'
3436 AS_CASE(["$enable_shared:$EXTSTATIC:$target_os"], [no::darwin*], [
3437 # darwin target requires miniruby for linking ext bundles
3438 PREP="$PREP"' miniruby$(EXEEXT)'
3440 RUNRUBY_COMMAND='$(MINIRUBY) -I`cd $(srcdir)/lib; pwd`'
3441 RUNRUBY='$(RUNRUBY_COMMAND)'
3445 AC_DEFINE(CROSS_COMPILING, 1)
3447 MINIRUBY='./miniruby$(EXEEXT) -I$(srcdir)/lib -I.'
3448 MINIRUBY="$MINIRUBY"' -I$(EXTOUT)/common'
3449 PREP='miniruby$(EXEEXT)'
3450 RUNRUBY_COMMAND='$(MINIRUBY) $(tooldir)/runruby.rb --extout=$(EXTOUT) $(RUNRUBYOPT)'
3451 RUNRUBY='$(RUNRUBY_COMMAND) --'
3456 AC_SUBST(TEST_RUNNABLE)
3457 AC_SUBST(CROSS_COMPILING)
3461 AC_SUBST(RUNRUBY_COMMAND)
3464 AC_SUBST(EXTOUT, [${EXTOUT=.ext}])
3467 LIBRUBY_A='lib$(RUBY_SO_NAME)-static.a'
3468 LIBRUBY='$(LIBRUBY_A)'
3469 LIBRUBYARG_STATIC='-l$(RUBY_SO_NAME)-static'
3470 LIBRUBYARG='$(LIBRUBYARG_STATIC)'
3471 SOLIBS='$(MAINLIBS)'
3473 AS_CASE(["$target_os"],
3474 [cygwin*|msys*|mingw*|haiku*|darwin*], [
3478 DLDLIBS="${DLDLIBS:+$DLDLIBS }-lc"
3481 AC_ARG_ENABLE(multiarch,
3482 AS_HELP_STRING([--enable-multiarch], [enable multiarch compatible directories]),
3483 [multiarch=], [unset multiarch])
3484 AS_IF([test ${multiarch+set}], [
3485 AC_DEFINE(ENABLE_MULTIARCH)
3488 archlibdir='${libdir}/${arch}'
3489 sitearchlibdir='${libdir}/${sitearch}'
3490 archincludedir='${includedir}/${arch}'
3491 sitearchincludedir='${includedir}/${sitearch}'
3494 AS_HELP_STRING([--with-soname=SONAME], [base name of shared library]),
3495 [RUBY_SO_NAME=$withval],
3497 AS_CASE(["$target_os"],
3499 RUBY_SO_NAME='$(RUBY_BASE_NAME).$(RUBY_API_VERSION)'
3502 RUBY_SO_NAME='$(RUBY_BASE_NAME)$(MAJOR)$(MINOR)0'
3505 RUBY_SO_NAME="${rb_cv_msvcrt}"'-$(RUBY_BASE_NAME)$(MAJOR)$(MINOR)0'
3506 AS_IF([test x"${target_cpu}" != xi386], [
3507 RUBY_SO_NAME="${target_cpu}-${RUBY_SO_NAME}"
3510 [RUBY_SO_NAME='$(RUBY_BASE_NAME)'])
3513 LIBRUBY_LDSHARED=${DLDSHARED=${LDSHARED}}
3514 LIBRUBY_DLDFLAGS=$DLDFLAGS
3515 LIBRUBY_SO='lib$(RUBY_SO_NAME).$(SOEXT).$(RUBY_PROGRAM_VERSION)'
3516 LIBRUBY_SONAME='lib$(RUBY_SO_NAME).$(SOEXT).$(RUBY_API_VERSION)'
3517 LIBRUBY_ALIASES='lib$(RUBY_SO_NAME).$(SOEXT)'
3520 AC_ARG_ENABLE(shared,
3521 AS_HELP_STRING([--enable-shared], [build a shared library for Ruby]),
3522 [enable_shared=$enableval])
3523 libprefix=${multiarch+'$(archlibdir)'}${multiarch-'$(libdir)'}
3524 LIBRUBY_RELATIVE=${load_relative-no}
3525 AS_CASE("$enable_shared", [yes], [
3526 LIBRUBY='$(LIBRUBY_SO)'
3527 LIBRUBYARG_SHARED='-l$(RUBY_SO_NAME)'
3528 LIBRUBYARG='$(LIBRUBYARG_SHARED)'
3530 test -z "$CCDLFLAGS" || CFLAGS="$CFLAGS $CCDLFLAGS"
3533 # libdir can be overridden in config.site file (on OpenSUSE at least).
3535 AS_IF([test "$bindir" = '${exec_prefix}/bin'], [
3536 AS_CASE(["$libdir"], ['${exec_prefix}/'*], [libdir_basename=`basename "$libdir"`])
3538 AC_DEFINE_UNQUOTED(LIBDIR_BASENAME, ["${libdir_basename}"])
3539 libdir_basename="${libdir_basename}"${multiarch+'/${arch}'}
3541 # Debian bullseye reportedly has its ld(1) patched, which breaks
3542 # --enable-shared --with-jemalloc combination. We might have to deal with
3543 # the ld(1) change sooner or later, but in the meantime let us force it
3546 # See https://github.com/ruby/ruby/pull/4627
3547 RUBY_TRY_LDFLAGS([${linker_flag}--no-as-needed], [no_as_needed=yes], [no_as_needed=no])
3548 AS_IF([test "$no_as_needed" = yes], [
3549 RUBY_APPEND_OPTIONS(LDFLAGS, [${linker_flag}--no-as-needed])
3552 AS_CASE(["$target_os"],
3553 [freebsd*|dragonfly*], [],
3555 AS_IF([test "$GCC" = yes], [
3556 RUBY_TRY_LDFLAGS([${linker_flag}--no-undefined], [no_undefined=yes], [no_undefined=no])
3557 AS_IF([test "no_undefined" = yes], [
3558 RUBY_APPEND_OPTION(EXTLDFLAGS, [${linker_flag}--no-undefined])
3563 AS_CASE(["$target_os"],
3565 LIBRUBY_ALIASES='$(LIBRUBY_SONAME) lib$(RUBY_SO_NAME).$(SOEXT)'
3567 [linux* | gnu* | k*bsd*-gnu | atheos* | kopensolaris*-gnu | haiku*], [
3568 RUBY_APPEND_OPTIONS(LIBRUBY_DLDFLAGS, ['-Wl,-soname,$(LIBRUBY_SONAME)' "$LDFLAGS_OPTDIR"])
3569 LIBRUBY_ALIASES='$(LIBRUBY_SONAME) lib$(RUBY_SO_NAME).$(SOEXT)'
3570 AS_IF([test "$load_relative" = yes], [
3571 libprefix="'\$\${ORIGIN}/../${multiarch+../../}${libdir_basename}'"
3572 LIBRUBY_RPATHFLAGS="-Wl,-rpath,${libprefix}"
3573 LIBRUBY_RELATIVE=yes
3576 [freebsd*|dragonfly*], [
3577 LIBRUBY_SO='lib$(RUBY_SO_NAME).$(SOEXT).$(MAJOR)$(MINOR)'
3578 LIBRUBY_SONAME='$(LIBRUBY_SO)'
3579 AS_IF([test "$rb_cv_binary_elf" != "yes" ], [
3580 LIBRUBY_SO="$LIBRUBY_SO.\$(TEENY)"
3582 ], [test "$load_relative" = yes], [
3583 libprefix="'\$\$ORIGIN/../${multiarch+../../}${libdir_basename}'"
3584 LIBRUBY_RPATHFLAGS="-Wl,-rpath,${libprefix}"
3585 LIBRUBY_RELATIVE=yes
3589 LIBRUBY_SONAME='lib$(RUBY_SO_NAME).$(SOEXT).$(MAJOR)$(MINOR)'
3590 LIBRUBY_SO="${LIBRUBY_SONAME}"'.$(TEENY)'
3591 RUBY_APPEND_OPTIONS(LIBRUBY_DLDFLAGS, ['-Wl,-soname,$(LIBRUBY_SONAME)' "$LDFLAGS_OPTDIR"])
3592 AS_IF([test "$rb_cv_binary_elf" = yes], [ # ELF platforms
3593 LIBRUBY_ALIASES='$(LIBRUBY_SONAME) lib$(RUBY_SO_NAME).$(SOEXT)'
3594 ], [ # a.out platforms
3598 [openbsd*|mirbsd*], [
3599 LIBRUBY_SO='lib$(RUBY_SO_NAME).$(SOEXT).$(MAJOR).'`expr ${MINOR} \* 10 + ${TEENY}`
3602 LIBRUBY_SO='lib$(RUBY_SO_NAME).$(SOEXT).$(MAJOR)'
3603 LIBRUBY_SONAME='lib$(RUBY_SO_NAME).$(SOEXT).$(RUBY_PROGRAM_VERSION)'
3604 LIBRUBY_ALIASES='$(LIBRUBY_SONAME) lib$(RUBY_SO_NAME).$(SOEXT)'
3605 RUBY_APPEND_OPTIONS(LIBRUBY_DLDFLAGS, ["${linker_flag}-h${linker_flag:+,}"'$(@F)'])
3606 AS_IF([test "$load_relative" = yes], [
3607 libprefix="'\$\$ORIGIN/../${multiarch+../../}${libdir_basename}'"
3608 LIBRUBY_RPATHFLAGS="-R${libprefix}"
3609 LIBRUBY_RELATIVE=yes
3611 LIBRUBY_RPATHFLAGS='-R${libdir}'
3615 RUBY_APPEND_OPTIONS(LIBRUBY_DLDFLAGS, ["${linker_flag}-bnoentry" "$XLDFLAGS" "$LDFLAGS_OPTDIR"])
3616 LIBRUBYARG_SHARED='-L${libdir} -l${RUBY_SO_NAME}'
3617 LIBS="$LIBS -lm -lc"
3620 LIBRUBY_SO='lib$(RUBY_SO_NAME).$(SOEXT)'
3621 LIBRUBY_SONAME='$(LIBRUBY_SO)'
3622 LIBRUBY_ALIASES='lib$(RUBY_INSTALL_NAME).$(SOEXT)'
3623 AS_IF([test "$load_relative" = yes], [
3624 libprefix="@executable_path/../${multiarch+../../}${libdir_basename}"
3625 LIBRUBY_RELATIVE=yes
3627 LIBRUBY_DLDFLAGS="$LIBRUBY_DLDFLAGS -install_name ${libprefix}"'/$(LIBRUBY_SONAME)'
3628 LIBRUBY_DLDFLAGS="$LIBRUBY_DLDFLAGS "'-compatibility_version $(RUBY_API_VERSION)'
3629 LIBRUBY_DLDFLAGS="$LIBRUBY_DLDFLAGS "'-current_version $(RUBY_PROGRAM_VERSION)'
3630 AS_IF([test "$visibility_option" = ld], [
3631 LIBRUBY_DLDFLAGS="$LIBRUBY_DLDFLAGS "'-Wl,-unexported_symbol,_Init_*'
3632 LIBRUBY_DLDFLAGS="$LIBRUBY_DLDFLAGS "'-Wl,-unexported_symbol,_ruby_static_id_*'
3633 LIBRUBY_DLDFLAGS="$LIBRUBY_DLDFLAGS "'-Wl,-unexported_symbol,*_threadptr_*'
3635 LIBRUBY_DLDFLAGS="$LIBRUBY_DLDFLAGS "' $(XLDFLAGS)'
3638 LIBRUBYARG_SHARED='-L. -L${libdir} -l$(RUBY_SO_NAME)'
3640 [cygwin*|msys*|mingw*|mswin*], [
3641 LIBRUBY_RELATIVE=yes
3646 # enable PIE if possible
3648 AS_HELP_STRING([--disable-pie], [disable PIE feature]),
3649 [pie=$enableval], [pie=])
3650 AS_IF([test "$GCC" = yes -a -z "$EXTSTATIC" -a "x$pie" != xno], [
3651 RUBY_TRY_CFLAGS(-fPIE, [pie=yes], [pie=no])
3652 AS_IF([test "$pie" = yes], [
3653 # Use -fPIE when testing -pie. RUBY_TRY_LDFLAGS sets
3654 # $save_CFLAGS internally, so set other name here.
3655 save_CFLAGS_before_pie="$CFLAGS"
3656 CFLAGS="$CFLAGS -fPIE"
3658 # gcc need -pie but clang need -Wl,-pie.
3659 for pie in -pie -Wl,-pie; do
3660 RUBY_TRY_LDFLAGS([$pie], [], [pie=])
3661 AS_IF([test "x$pie" != x], [
3662 RUBY_APPEND_OPTION(XCFLAGS, -fPIE)
3663 RUBY_APPEND_OPTION(XLDFLAGS, $pie)
3667 CFLAGS="$save_CFLAGS_before_pie"
3671 AS_IF([test "$enable_rpath" = yes], [
3672 test -z "$LIBRUBY_RPATHFLAGS" || LIBRUBY_RPATHFLAGS="$LIBRUBY_RPATHFLAGS "
3673 rpathflag="${RPATHFLAG}"
3674 AS_CASE(["${cross_compiling}${load_relative}"], [*yes*], [], [rpathflag="$RPATHFLAG$LIBPATHFLAG"])
3675 rpathflag=`IFS="$PATH_SEPARATOR"
3676 echo x "$rpathflag" |
3677 sed "s/^x *//;s${IFS}"'%1\\$-s'"${IFS}${libprefix}${IFS}g;s${IFS}%s${IFS}${libprefix}${IFS}g"
3679 LIBRUBY_RPATHFLAGS="$LIBRUBY_RPATHFLAGS${rpathflag}"
3680 LIBRUBYARG_SHARED="$LIBRUBY_RPATHFLAGS $LIBRUBYARG_SHARED"
3681 LIBRUBYARG_STATIC="$LIBRUBY_RPATHFLAGS $LIBRUBYARG_STATIC"
3683 AC_SUBST(LIBRUBY_RELATIVE)
3685 LDFLAGS="-L. $LDFLAGS"
3688 AS_IF([test "$EXEEXT" = .exe], [
3689 EXECUTABLE_EXTS='".exe",".com",".cmd",".bat"'
3690 AC_DEFINE_UNQUOTED(EXECUTABLE_EXTS, $EXECUTABLE_EXTS)
3691 EXECUTABLE_EXTS=`echo $EXECUTABLE_EXTS | tr -d '"' | tr , ' '`
3692 AC_SUBST(EXECUTABLE_EXTS)
3695 AS_CASE("$cross_compiling:${LIBPATHENV}", [yes:* | no:], [], [
3696 AC_MSG_CHECKING(whether wrapper for $LIBPATHENV is needed)
3697 AS_IF([env ${LIBPATHENV}=/lib /bin/sh -c ': ${'${LIBPATHENV}'?}' 2>/dev/null],
3698 [AC_MSG_RESULT(no)],
3699 [AC_SUBST(XRUBY_LIBPATHENV_WRAPPER, 'exe/$(PROGRAM)')
3704 AC_ARG_ENABLE(dtrace,
3705 AS_HELP_STRING([--enable-dtrace],
3706 [enable DTrace for tracing inside ruby. enabled by default on systems having dtrace]),
3707 [enable_dtrace=$enableval], [enable_dtrace=auto])
3709 LIBRUBY_A_OBJS='$(OBJS)'
3711 AS_CASE(["${enable_dtrace}"],
3713 RUBY_DTRACE_AVAILABLE()
3715 rb_cv_dtrace_available=no
3717 AS_CASE(["$target_os"],[freebsd*],[
3718 rb_cv_dtrace_available=no
3720 AS_IF([test "${enable_dtrace}" = yes], [dnl
3721 AS_IF([test -z "$DTRACE"], [dnl
3722 AC_MSG_ERROR([dtrace(1) is missing])
3723 ], [test "$cross_compiling" = yes], [dnl
3724 AC_MSG_ERROR([--enable-dtrace, however, cross compiling])
3725 ], [test "${rb_cv_dtrace_available}" = "no"], [dnl
3726 AC_MSG_ERROR([--enable-dtrace, however, USDT is not available])
3729 AS_CASE([$rb_cv_dtrace_available],
3731 RUBY_DTRACE_POSTPROCESS()
3732 AS_IF([test "$rb_cv_prog_dtrace_g" != no], [dnl
3733 DTRACE_OBJ='probes.$(OBJEXT)'
3735 AS_IF([test "$rb_cv_prog_dtrace_g" = rebuild], [dnl
3737 LIBRUBY_A_OBJS='$(DTRACE_GLOMMED_OBJ)'
3739 AS_CASE("${target_os}", [freebsd*], [dnl
3740 # FreeBSD's dtrace requires libelf
3748 AC_SUBST(DTRACE_EXT)
3749 AC_SUBST(DTRACE_OBJ)
3750 AC_SUBST(DTRACE_REBUILD)
3751 AC_SUBST(DTRACE_OPT)
3752 AC_SUBST(LIBRUBY_A_OBJS)
3755 AS_HELP_STRING([--enable-gcov], [enable coverage measurement by gcov]),
3757 AS_IF([test x"$gcov" = xyes], [
3758 CFLAGS="$CFLAGS -coverage"
3759 LDFLAGS="$LDFLAGS -coverage"
3766 [begin]_group "installation section" && {
3767 dnl build rdoc index if requested
3770 AC_ARG_ENABLE(install-doc,
3771 AS_HELP_STRING([--disable-install-doc], [do not install either rdoc indexes or C API documents during install]),
3772 [install_doc=$enableval], [install_doc=yes])
3774 AS_HELP_STRING([--with-rdoc=ri,html], [comma/space separated list of RDoc formats to install]),
3775 [install_rdoc=`echo ,$withval, | sed 'y/,/ /;s/ ri / rdoc /;s/^ *//;s/ *$//'`], [
3776 AC_ARG_ENABLE(install-rdoc,
3777 AS_HELP_STRING([--disable-install-rdoc], [do not install rdoc indexes during install]),
3778 [install_rdoc=$enableval], [install_rdoc=yes])
3780 AC_ARG_ENABLE(install-capi,
3781 AS_HELP_STRING([--disable-install-capi], [do not install C API documents during install]),
3782 [install_capi=$enableval], [install_capi=no])
3784 AS_IF([test "$install_doc" != no], [
3785 AS_CASE(["$install_rdoc"],
3790 RDOCTARGET="rdoc html"
3796 RDOCTARGET="$install_rdoc"
3798 AS_IF([test "$install_capi" != no -a -n "$DOXYGEN"], [
3808 AC_SUBST(RDOCTARGET)
3809 AC_SUBST(CAPITARGET)
3811 AS_CASE(["$RDOCTARGET:$CAPITARGET"],[nodoc:nodoc],[INSTALLDOC=nodoc],[INSTALLDOC=all])
3812 AC_SUBST(INSTALLDOC)
3814 AC_ARG_ENABLE(install-static-library,
3815 AS_HELP_STRING([--disable-install-static-library], [do not install static ruby library]),
3816 [INSTALL_STATIC_LIBRARY=$enableval
3817 AS_IF([test x"$enable_shared" = xno -a x"$INSTALL_STATIC_LIBRARY" = xno],
3818 [AC_MSG_ERROR([must install either static or shared library])],
3820 AS_IF([test x"$enable_shared" = xyes],
3821 [INSTALL_STATIC_LIBRARY=no],
3822 [INSTALL_STATIC_LIBRARY=yes]))
3823 AC_SUBST(INSTALL_STATIC_LIBRARY)
3826 [begin]_group "JIT section" && {
3827 AC_CHECK_PROG(RUSTC, [rustc], [rustc], [no]) dnl no ac_tool_prefix
3829 dnl check if rustc is recent enough to build YJIT (rustc >= 1.58.0)
3831 AS_IF([test "$RUSTC" != "no"],
3832 AC_MSG_CHECKING([whether ${RUSTC} works for YJIT])
3834 AS_CASE(["$target_cpu"],
3835 [arm64|aarch64], [YJIT_TARGET_ARCH=aarch64],
3836 [x86_64], [YJIT_TARGET_ARCH=x86_64],
3838 dnl Fails in case rustc target doesn't match ruby target.
3839 dnl Can happen on Rosetta, for example.
3840 AS_IF([echo "#[cfg(target_arch = \"$YJIT_TARGET_ARCH\")] fn main() { let x = 1; format!(\"{x}\"); }" |
3841 $RUSTC - --emit asm=/dev/null 2>/dev/null],
3844 AC_MSG_RESULT($YJIT_RUSTC_OK)
3847 dnl check if we can build YJIT on this target platform
3848 dnl we can't easily cross-compile with rustc so we don't support that
3850 AS_IF([test "$cross_compiling" = no],
3851 AS_CASE(["$target_cpu-$target_os"],
3855 [arm64-darwin*|aarch64-darwin*|x86_64-darwin*], [
3858 [arm64-*linux*|aarch64-*linux*|x86_64-*linux*], [
3861 [arm64-*bsd*|aarch64-*bsd*|x86_64-*bsd*], [
3867 dnl build YJIT in release mode if rustc >= 1.58.0 is present and we are on a supported platform
3869 AS_HELP_STRING([--enable-yjit],
3870 [enable in-process JIT compiler that requires Rust build tools. enabled by default on supported platforms if rustc 1.58.0+ is available]),
3871 [YJIT_SUPPORT=$enableval],
3872 [AS_CASE(["$YJIT_TARGET_OK:$YJIT_RUSTC_OK"],
3883 AS_CASE(["${YJIT_SUPPORT}"],
3884 [yes|dev|stats|dev_nodebug], [
3885 AS_IF([test x"$RUSTC" = "xno"],
3886 AC_MSG_ERROR([rustc is required. Installation instructions available at https://www.rust-lang.org/tools/install])
3889 AS_CASE(["${YJIT_SUPPORT}"],
3891 rb_rust_target_subdir=release
3894 rb_rust_target_subdir=debug
3895 CARGO_BUILD_ARGS='--features stats,disasm'
3896 AC_DEFINE(RUBY_DEBUG, 1)
3899 rb_rust_target_subdir=dev_nodebug
3900 CARGO_BUILD_ARGS='--profile dev_nodebug --features stats,disasm'
3901 AC_DEFINE(YJIT_STATS, 1)
3904 rb_rust_target_subdir=stats
3905 CARGO_BUILD_ARGS='--profile stats --features stats'
3906 AC_DEFINE(YJIT_STATS, 1)
3909 AS_IF([test -n "${CARGO_BUILD_ARGS}"], [
3910 AC_CHECK_TOOL(CARGO, [cargo], [no])
3911 AS_IF([test x"$CARGO" = "xno"],
3912 AC_MSG_ERROR([cargo is required. Installation instructions available at https://www.rust-lang.org/tools/install])
3915 YJIT_LIBS="yjit/target/${rb_rust_target_subdir}/libyjit.a"
3916 AS_CASE(["$target_os"],[openbsd*],[
3917 # Link libc++abi (which requires libpthread) for _Unwind_* functions needed by yjit
3918 LDFLAGS="$LDFLAGS -lpthread -lc++abi"
3920 YJIT_OBJ='yjit.$(OBJEXT)'
3921 AS_IF([test x"$YJIT_SUPPORT" != "xyes" ], [
3922 AC_DEFINE_UNQUOTED(YJIT_SUPPORT, [$YJIT_SUPPORT])
3924 AC_DEFINE(USE_YJIT, 1)
3926 AC_DEFINE(USE_YJIT, 0)
3929 dnl These variables end up in ::RbConfig::CONFIG
3930 AC_SUBST(YJIT_SUPPORT)dnl what flavor of YJIT the Ruby build includes
3931 AC_SUBST(RUSTC)dnl Rust compiler command
3932 AC_SUBST(CARGO)dnl Cargo command for Rust builds
3933 AC_SUBST(CARGO_BUILD_ARGS)dnl for selecting Rust build profiles
3934 AC_SUBST(YJIT_LIBS)dnl for optionally building the Rust parts of YJIT
3935 AC_SUBST(YJIT_OBJ)dnl for optionally building the C parts of YJIT
3937 dnl RJIT supports only x86_64 platforms, but allows arm64/aarch64 for custom JITs.
3939 AS_IF([test "$cross_compiling" = no],
3940 AS_CASE(["$target_cpu-$target_os"],
3944 [arm64-darwin*|aarch64-darwin*|x86_64-darwin*], [
3947 [arm64-*linux*|aarch64-*linux*|x86_64-*linux*], [
3950 [arm64-*bsd*|aarch64-*bsd*|x86_64-*bsd*], [
3956 dnl Build RJIT on supported platforms or if --enable-rjit is specified.
3958 AS_HELP_STRING([--enable-rjit],
3959 [enable pure-Ruby JIT compiler. enabled by default on Unix x86_64 platforms]),
3960 [RJIT_SUPPORT=$enableval],
3961 [AS_CASE(["$RJIT_TARGET_OK"],
3962 [yes], [RJIT_SUPPORT=yes],
3967 AS_CASE(["$RJIT_SUPPORT"],
3969 AS_CASE(["$RJIT_SUPPORT"],
3971 # Link libcapstone for --rjit-dump-disasm
3972 AC_CHECK_LIB([capstone], [cs_disasm])
3975 AC_DEFINE(USE_RJIT, 1)
3977 AC_DEFINE(USE_RJIT, 0)
3980 AC_SUBST(RJIT_SUPPORT)
3983 [begin]_group "build section" && {
3984 AC_CACHE_CHECK([for prefix of external symbols], rb_cv_symbol_prefix, [
3985 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[extern void conftest_external(void) {}]], [[]])],[
3986 rb_cv_symbol_prefix=`$NM conftest.$ac_objext |
3987 sed -n ['/.*T[ ]\([^ ]*\)conftest_external.*/!d;s//\1/p;q']`
3989 [rb_cv_symbol_prefix=''])
3990 test -n "$rb_cv_symbol_prefix" || rb_cv_symbol_prefix=NONE
3992 SYMBOL_PREFIX="$rb_cv_symbol_prefix"
3993 test "x$SYMBOL_PREFIX" = xNONE && SYMBOL_PREFIX=''
3995 AS_IF([test x"$enable_shared" = xyes], [
3996 AC_CACHE_CHECK([for default symbols in empty shared library], rb_cv_symbols_in_emptylib, [
3998 eval CC=\"`printf "%s" "${DLDSHARED}" | sed ['s/\$(CC)/${CC}/']`\"
3999 AC_LINK_IFELSE([AC_LANG_PROGRAM()],[
4000 rb_cv_symbols_in_emptylib=`$NM -Pgp conftest$ac_exeext |
4001 sed ["/ [A-TV-Z] .*/!d;s///;s/^${SYMBOL_PREFIX}//;/^main$/d"]`
4003 set dummy ${rb_cv_symbols_in_emptylib}
4005 rb_cv_symbols_in_emptylib="$*"
4009 AC_SUBST(XSYMBOLS_IN_EMPTYLIB, "${rb_cv_symbols_in_emptylib}")
4013 AS_HELP_STRING([--disable-dln], [disable dynamic link feature]),
4014 [test "$enableval" = yes || DLNOBJ=dmydln.o])
4018 AS_CASE(["$target_os"],
4022 RUBY_APPEND_OPTION(CFLAGS, -pipe)
4025 RUBY_APPEND_OPTION(CFLAGS, -pipe)
4026 AC_MSG_CHECKING([whether Security framework is needed])
4028 AC_LANG_BOOL_COMPILE_TRY([
4029 @%:@include <AvailabilityMacros.h>
4031 least = MAC_OS_X_VERSION_10_7, /* just fail if undefined */
4032 required = MAC_OS_X_VERSION_MIN_REQUIRED,
4033 upper /* bigger than MIN_REQUIRED, or */
4034 @%:@ifdef MAC_OS_X_VERSION_10_10
4035 = MAC_OS_X_VERSION_10_10
4038 [required >= least && required < upper])],
4041 RUBY_APPEND_OPTION(XLDFLAGS, [-framework Security])
4042 RUBY_APPEND_OPTION(LIBRUBYARG_STATIC, [-framework Security])
4048 RUBY_APPEND_OPTION(XLDFLAGS, [-framework CoreFoundation])
4049 RUBY_APPEND_OPTION(LIBRUBYARG_STATIC, [-framework CoreFoundation])
4052 AS_IF([test "$GCC" != "yes" ], [
4053 # compile something small: taint.c is fine for this.
4054 # the main point is the '-v' flag of 'cc'.
4055 AS_CASE(["`cc -v -I. -c main.c -o /tmp/main.o 2>&1`"],
4056 [*/gemc_cc*], [ # we have the new DEC GEM CC
4057 CFLAGS="$CFLAGS -oldc"
4059 [ # we have the old MIPS CC
4063 CFLAGS="$CFLAGS -std"
4066 [cygwin*|msys*|mingw*], [
4067 LIBRUBY_DLDFLAGS="${LIBRUBY_DLDFLAGS}"' -Wl,--out-implib=$(LIBRUBY)'
4068 AS_CASE(["$target_os"],
4070 AS_IF([test x"$enable_shared" = xyes], [
4071 LIBRUBY_SO='cyg$(RUBY_SO_NAME)'.dll
4072 LIBRUBY_DLDFLAGS="${LIBRUBY_DLDFLAGS}"' $(RUBYDEF)'
4076 AS_IF([test x"$enable_shared" = xyes], [
4077 LIBRUBY_SO='$(RUBY_SO_NAME)'.dll
4078 LIBRUBY_DLDFLAGS="${LIBRUBY_DLDFLAGS}"' $(RUBYDEF)'
4081 EXTDLDFLAGS='$(DEFFILE)'
4082 AC_LIBOBJ([win32/win32])
4083 AC_LIBOBJ([win32/file])
4085 # COMMON_MACROS="WIN32_LEAN_AND_MEAN="
4086 COMMON_HEADERS="winsock2.h windows.h"
4090 FIRSTMAKEFILE=GNUmakefile:cygwin/GNUmakefile.in
4091 AS_IF([test x"$enable_shared" = xyes], [
4092 LIBRUBY='lib$(RUBY_SO_NAME).dll.a'
4095 LIBRUBY='lib$(RUBY_SO_NAME).a'
4096 LIBRUBYARG='-l$(RUBY_SO_NAME)'
4100 FIRSTMAKEFILE=GNUmakefile:wasm/GNUmakefile.in
4101 AC_LIBOBJ([wasm/missing])
4102 AC_LIBOBJ([wasm/runtime])
4103 AC_LIBOBJ([wasm/fiber])
4104 AC_LIBOBJ([wasm/machine])
4105 AC_LIBOBJ([wasm/setjmp])
4106 AC_LIBOBJ([wasm/machine_core])
4107 AC_LIBOBJ([wasm/setjmp_core])
4111 MINIOBJS="$MINIDLNOBJ"
4113 AC_ARG_ENABLE(debug-env,
4114 AS_HELP_STRING([--enable-debug-env], [enable RUBY_DEBUG environment variable]),
4115 [AC_SUBST(ENABLE_DEBUG_ENV, yes)])
4117 AS_CASE(["$FIRSTMAKEFILE"], [*GNUmakefile:*], [gnumake=yes], [
4118 AC_MSG_CHECKING([if ${MAKE-make} is GNU make])
4120 echo "all:; @echo yes" > conftest.dir/GNUmakefile
4121 echo "all:; @echo no" > conftest.dir/Makefile
4122 gnumake=`(cd conftest.dir; ${MAKE-make})`
4124 AS_CASE(["$gnumake"],
4126 FIRSTMAKEFILE=GNUmakefile:template/GNUmakefile.in
4130 AC_MSG_RESULT($gnumake)
4132 AS_IF([test "$gnumake" = yes], [ NULLCMD=: ], [
4133 AC_MSG_CHECKING([for safe null command for ${MAKE-make}])
4136 for cmd in : true; do
4137 echo 'A=1' > conftest.dir/Makefile
4138 echo 'B=$(A:1=@'$cmd')' >> conftest.dir/Makefile
4139 echo 'all:; $B 1 2 3 4 5 6 7 8 9' >> conftest.dir/Makefile
4140 AS_IF([(cd conftest.dir; ${MAKE-make} >/dev/null 2>/dev/null)], [
4146 AS_IF([test -z "$NULLCMD"], [
4147 AC_MSG_ERROR(no candidate for safe null command)
4149 AC_MSG_RESULT($NULLCMD)
4153 AS_IF([test "${universal_binary-no}" = yes ], [
4154 AC_CACHE_CHECK([for architecture macros], rb_cv_architecture_macros, [
4155 mv confdefs.h confdefs1.h
4157 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@if defined __`echo ${universal_archnames} |
4158 sed 's/=[^ ]*//g;s/ /__ || defined __/g'`__
4162 @%:@endif]], [[]])],[
4163 rb_cv_architecture_macros=yes
4164 mv -f confdefs1.h confdefs.h
4166 rb_cv_architecture_macros=no
4167 archflagpat=`eval echo '"'"${ARCH_FLAG}"'"' | sed 's/[[][|.*]]/\\&/g'`
4168 new_cflags=`echo "$CFLAGS" | sed "s|$archflagpat"'||'`
4169 for archs in ${universal_archnames}; do
4172 CFLAGS="$new_cflags -arch $archs"
4173 archs="__${archs}__"
4174 AC_MSG_CHECKING([for macro ${archs} on ${cpu}])
4175 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@ifndef ${archs}
4177 @%:@endif]], [[]])],
4178 [AC_MSG_RESULT([yes])], [AC_MSG_RESULT([no])])
4180 mv -f confdefs1.h confdefs.h
4181 AC_MSG_ERROR([failed])
4183 AC_CACHE_CHECK(whether __ARCHITECTURE__ is available, rb_cv_architecture_available,
4184 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include <stdio.h>
4185 const char arch[[]] = __ARCHITECTURE__;]], [[puts(arch);]])],
4186 [rb_cv_architecture_available=yes], [rb_cv_architecture_available=no]))
4194 AS_IF([test -n "${LIBS}"], [
4195 libspat=`echo "${LIBS}" | sed 's/[[][|.*$^]]/\\&/g;s/^ */ /;s/^ *$/ /'`
4196 MAINFLAGS=`echo " $MAINLIBS " | sed "s|$libspat"'||;s/^ *//;s/ *$//'`
4198 LIBRUBYARG_STATIC="${LIBRUBYARG_STATIC} \$(MAINLIBS)"
4199 CPPFLAGS="$CPPFLAGS "'$(DEFS)'
4200 test -z "$CPPFLAGS" || CPPFLAGS="$CPPFLAGS "; CPPFLAGS="$CPPFLAGS"'${cppflags}'
4201 AS_IF([test -n "${cflags+set}"], [
4202 cflagspat=`eval echo '"'"${cflags}"'"' | sed 's/[[][|.*]]/\\&/g;s/^ */ /;s/^ *$/ /'`
4203 CFLAGS=`echo " $CFLAGS " | sed "s|$cflagspat"'|${cflags}|;s/^ *//;s/ *$//'`
4205 AS_IF([test -n "${cxxflags+set}"], [
4206 cxxflagspat=`eval echo '"'"${cxxflags}"'"' | sed 's/[[][|.*]]/\\&/g;s/^ */ /;s/^ *$/ /'`
4207 CXXFLAGS=`echo " $CXXFLAGS " | sed "s|$cxxflagspat"'|${cxxflags}|;s/^ *//;s/ *$//'`
4209 AS_IF([test "${ARCH_FLAG}"], [
4210 archflagpat=`eval echo '"'"${ARCH_FLAG}"'"' | sed 's/[[][|.*]]/\\&/g'`
4211 CFLAGS=`echo "$CFLAGS" | sed "s| *$archflagpat"'||'`
4212 CXXFLAGS=`echo "$CXXFLAGS" | sed "s| *$archflagpat"'||'`
4213 LDFLAGS=`echo "$LDFLAGS" | sed "s| *$archflagpat"'||'`
4215 rb_cv_warnflags=`echo "$rb_cv_warnflags" | sed 's/^ *//;s/ *$//'`
4216 warnflags="$rb_cv_warnflags"
4217 AC_SUBST(cppflags)dnl
4218 AC_SUBST(cflags, ["${orig_cflags:+$orig_cflags }"'${optflags} ${debugflags} ${warnflags}'])dnl
4219 AC_SUBST(cxxflags)dnl
4220 AC_SUBST(optflags)dnl
4221 AC_SUBST(debugflags)dnl
4222 AC_SUBST(warnflags)dnl
4223 AC_SUBST(strict_warnflags)dnl
4224 AC_SUBST(XCFLAGS)dnl
4225 AC_SUBST(XLDFLAGS)dnl
4226 AC_SUBST(EXTLDFLAGS)dnl
4227 AC_SUBST(EXTDLDFLAGS)dnl
4228 AC_SUBST(LIBRUBY_LDSHARED)
4229 AC_SUBST(LIBRUBY_DLDFLAGS)
4230 AC_SUBST(RUBY_INSTALL_NAME)
4231 AC_SUBST(rubyw_install_name)
4232 AC_SUBST(RUBYW_INSTALL_NAME)
4233 AC_SUBST(RUBY_SO_NAME)
4235 AC_SUBST(LIBRUBY_SO)
4236 AC_SUBST(LIBRUBY_SONAME)
4237 AC_SUBST(LIBRUBY_ALIASES)
4239 AC_SUBST(LIBRUBYARG)
4240 AC_SUBST(LIBRUBYARG_STATIC)
4241 AC_SUBST(LIBRUBYARG_SHARED)
4245 AC_SUBST(ENABLE_SHARED)
4247 AC_SUBST(COMMON_LIBS)
4248 AC_SUBST(COMMON_MACROS)
4249 AC_SUBST(COMMON_HEADERS)
4250 AC_SUBST(EXPORT_PREFIX)
4251 AC_SUBST(SYMBOL_PREFIX)
4253 AC_SUBST(THREAD_MODEL)
4254 AC_SUBST(COROUTINE_TYPE, ${coroutine_type})
4255 AC_SUBST(PLATFORM_DIR)
4256 AC_SUBST(USE_LLVM_WINDRES)
4258 firstmf=`echo $FIRSTMAKEFILE | sed 's/:.*//'`
4259 firsttmpl=`echo $FIRSTMAKEFILE | sed 's/.*://'`
4260 MAKEFILES="Makefile $firstmf"
4261 MAKEFILES="`echo $MAKEFILES`"
4265 test "$program_prefix" != NONE &&
4266 ri_prefix=$program_prefix
4269 test "$program_suffix" != NONE &&
4270 ri_suffix=$program_suffix
4272 RUBY_INSTALL_NAME="${ri_prefix}"'$(RUBY_BASE_NAME)'"${ri_suffix}"
4273 AS_CASE(["$target_os"],
4274 [cygwin*|msys*|mingw*], [
4275 RUBYW_INSTALL_NAME="${ri_prefix}"'$(RUBYW_BASE_NAME)'"${ri_suffix}"
4276 rubyw_install_name='$(RUBYW_INSTALL_NAME)'
4279 rubylibdir='${rubylibprefix}/${ruby_version}'
4280 rubyarchdir=${multiarch+'${rubyarchprefix}/${ruby_version}'}${multiarch-'${rubylibdir}/${arch}'}
4282 rubyarchprefix=${multiarch+'${archlibdir}/${RUBY_BASE_NAME}'}${multiarch-'${rubylibprefix}/${arch}'}
4283 AC_ARG_WITH(rubyarchprefix,
4284 AS_HELP_STRING([--with-rubyarchprefix=DIR],
4285 [prefix for architecture dependent ruby libraries [[RUBYLIBPREFIX/ARCH]]]),
4286 [rubyarchprefix="$withval"])
4287 AC_SUBST(rubyarchprefix)
4289 rubysitearchprefix=${multiarch+'${sitearchlibdir}/${RUBY_BASE_NAME}'}${multiarch-'${rubylibprefix}/${sitearch}'}
4290 AC_ARG_WITH(rubysitearchprefix,
4291 AS_HELP_STRING([--with-rubysitearchprefix=DIR],
4292 [prefix for architecture dependent site libraries [[RUBYLIBPREFIX/SITEARCH]]]),
4293 [rubysitearchprefix="$withval"])
4294 AC_SUBST(rubysitearchprefix)
4296 RI_BASE_NAME=`echo ${RUBY_BASE_NAME} | sed 's/ruby/ri/'`
4297 ridir='${datarootdir}/${RI_BASE_NAME}'
4299 AS_HELP_STRING([--with-ridir=DIR], [ri documentation [[DATAROOTDIR/ri]]]),
4302 AC_SUBST(RI_BASE_NAME)
4304 AC_ARG_WITH(ruby-version,
4305 AS_HELP_STRING([--with-ruby-version=STR], [ruby version string for version specific directories [[full]] (full|minor|STR)]),
4306 [ruby_version=$withval],
4307 [ruby_version=full])
4308 unset RUBY_LIB_VERSION
4309 unset RUBY_LIB_VERSION_STYLE
4310 AS_CASE(["$ruby_version"],
4311 [full], [RUBY_LIB_VERSION_STYLE='3 /* full */'],
4312 [minor], [RUBY_LIB_VERSION_STYLE='2 /* minor */'])
4313 AS_IF([test ${RUBY_LIB_VERSION_STYLE+set}], [
4315 echo "#define RUBY_LIB_VERSION_STYLE $RUBY_LIB_VERSION_STYLE"
4316 echo '@%:@include "confdefs.h"'
4317 echo '#define STRINGIZE(x) x'
4318 test -f revision.h -o -f "${srcdir}/revision.h" || echo '#define RUBY_REVISION 0'
4319 echo '#include "version.h"'
4320 echo 'ruby_version=RUBY_LIB_VERSION'
4322 ruby_version="`$CPP -I. -I"${srcdir}" -I"${srcdir}/include" conftest.c | sed '/^ruby_version=/!d;s/ //g'`"
4324 ], [test -z "${ruby_version}"], [
4325 AC_MSG_ERROR([No ruby version, No place for bundled libraries])
4327 RUBY_LIB_VERSION="${ruby_version}"
4329 AC_SUBST(RUBY_LIB_VERSION_STYLE)
4330 AC_SUBST(RUBY_LIB_VERSION)
4332 AC_ARG_WITH(sitedir,
4333 AS_HELP_STRING([--with-sitedir=DIR], [site libraries in DIR [[RUBY_LIB_PREFIX/site_ruby]], "no" to disable site directory]),
4335 [sitedir='${rubylibprefix}/site_ruby'])
4336 sitelibdir='${sitedir}/${ruby_version}'
4338 AC_ARG_WITH(sitearchdir,
4339 AS_HELP_STRING([--with-sitearchdir=DIR],
4340 [architecture dependent site libraries in DIR [[SITEDIR/SITEARCH]], "no" to disable site directory]),
4341 [sitearchdir=$withval],
4342 [sitearchdir=${multiarch+'${rubysitearchprefix}/site_ruby/${ruby_version}'}${multiarch-'${sitelibdir}/${sitearch}'}])
4344 AC_ARG_WITH(vendordir,
4345 AS_HELP_STRING([--with-vendordir=DIR], [vendor libraries in DIR [[RUBY_LIB_PREFIX/vendor_ruby]], "no" to disable vendor directory]),
4346 [vendordir=$withval],
4347 [vendordir='${rubylibprefix}/vendor_ruby'])
4348 vendorlibdir='${vendordir}/${ruby_version}'
4350 AC_ARG_WITH(vendorarchdir,
4351 AS_HELP_STRING([--with-vendorarchdir=DIR],
4352 [architecture dependent vendor libraries in DIR [[VENDORDIR/SITEARCH]], "no" to disable vendor directory]),
4353 [vendorarchdir=$withval],
4354 [vendorarchdir=${multiarch+'${rubysitearchprefix}/vendor_ruby/${ruby_version}'}${multiarch-'${vendorlibdir}/${sitearch}'}])
4356 AS_IF([test "${LOAD_RELATIVE+set}"], [
4357 AC_DEFINE_UNQUOTED(LOAD_RELATIVE, $LOAD_RELATIVE)
4361 AC_SUBST(RUBY_EXEC_PREFIX)
4363 AC_SUBST(libdirname, ${multiarch+arch}libdir)
4364 AC_SUBST(archlibdir)dnl
4365 AC_SUBST(sitearchlibdir)dnl
4366 AC_SUBST(archincludedir)dnl
4367 AC_SUBST(sitearchincludedir)dnl
4369 AC_SUBST(sitearch)dnl
4370 AC_SUBST(ruby_version)dnl
4371 AC_SUBST(rubylibdir)dnl
4372 AC_SUBST(rubyarchdir)dnl
4373 AC_SUBST(sitedir)dnl
4374 AC_SUBST(sitelibdir)dnl
4375 AC_SUBST(sitearchdir)dnl
4376 AC_SUBST(vendordir)dnl
4377 AC_SUBST(vendorlibdir)dnl
4378 AC_SUBST(vendorarchdir)dnl
4380 AC_SUBST(CONFIGURE, "`echo $0 | sed 's|.*/||'`")dnl
4381 AC_SUBST(configure_args, "`echo "${ac_configure_args}" | sed 's/\\$/$$/g'`")dnl
4383 AS_IF([test "${universal_binary-no}" = yes ], [
4384 arch="universal-${target_os}"
4385 AS_IF([test "${rb_cv_architecture_available}" = yes], [
4386 AC_DEFINE_UNQUOTED(RUBY_PLATFORM_CPU, __ARCHITECTURE__)
4388 for archs in ${universal_archnames}; do
4389 cpu=`echo $archs | sed 's/.*=//'`
4390 archs=`echo $archs | sed 's/=.*//'`
4391 RUBY_DEFINE_IF([defined __${archs}__ &&! defined RUBY_PLATFORM_CPU], RUBY_PLATFORM_CPU, ["${cpu}"])
4394 ints='long int short'
4395 test "$ac_cv_type_long_long" = yes && ints="'long long' $ints"
4396 AC_SUBST(UNIVERSAL_ARCHNAMES, "${universal_archnames}")
4397 AC_SUBST(UNIVERSAL_INTS, "${ints}")
4398 AC_DEFINE_UNQUOTED(RUBY_PLATFORM_OS, "${target_os}")
4399 AC_DEFINE_UNQUOTED(RUBY_ARCH, "universal-" RUBY_PLATFORM_OS)
4400 AC_DEFINE_UNQUOTED(RUBY_PLATFORM, "universal." RUBY_PLATFORM_CPU "-" RUBY_PLATFORM_OS)
4402 AS_IF([test "${target_os}-${rb_cv_msvcrt}" = "mingw32-ucrt" ], [
4403 arch="${target_cpu}-mingw-ucrt"
4405 arch="${target_cpu}-${target_os}"
4407 AC_DEFINE_UNQUOTED(RUBY_PLATFORM, "$arch")
4409 AS_IF([test "$arch" = "s390x-linux"], [
4410 AC_DEFINE_UNQUOTED(USE_MN_THREADS, 0)
4415 AS_CASE(["$target_os"],[mingw*],[sitearch="$target_cpu-$rb_cv_msvcrt"])
4416 : ${sitearch='${arch}'}
4418 AC_ARG_WITH(search-path,
4419 AS_HELP_STRING([--with-search-path=DIR], [specify the additional search path]),
4420 [search_path=$withval])
4421 AS_IF([test "$search_path" != ""], [
4422 AC_SUBST(RUBY_SEARCH_PATH, $search_path)
4425 AC_ARG_WITH(rubyhdrdir,
4426 AS_HELP_STRING([--with-rubyhdrdir=DIR], [core headers in DIR [[INCLUDEDIR/RUBY_BASE_NAME-RUBY_VERSION]]]),
4427 [rubyhdrdir=$withval],
4428 [rubyhdrdir='${includedir}/${RUBY_VERSION_NAME}'])
4430 AC_ARG_WITH(rubyarchhdrdir,
4431 AS_HELP_STRING([--with-rubyarchhdrdir=DIR],
4432 [architecture dependent core headers in DIR [[$(rubyhdrdir)/$(arch)]]]),
4433 [rubyarchhdrdir=$withval],
4434 [rubyarchhdrdir=${multiarch+'${archincludedir}/${RUBY_VERSION_NAME}'}${multiarch-'${rubyhdrdir}/${arch}'}])
4436 AC_ARG_WITH(sitehdrdir,
4437 AS_HELP_STRING([--with-sitehdrdir=DIR], [core site headers in DIR [[RUBYHDRDIR/site_ruby]]]),
4438 [sitehdrdir=$withval],
4439 [sitehdrdir='${rubyhdrdir}/site_ruby'])
4441 AC_ARG_WITH(sitearchhdrdir,
4442 AS_HELP_STRING([--with-sitearchhdrdir=DIR],
4443 [architecture dependent core site headers in DIR [[RUBYHDRDIR/site_ruby]]]),
4444 [sitearchhdrdir=$withval],
4445 [sitearchhdrdir=${multiarch+'${sitearchincludedir}/${RUBY_VERSION_NAME}/site_ruby'}${multiarch-'${sitehdrdir}/${sitearch}'}])
4447 AC_ARG_WITH(vendorhdrdir,
4448 AS_HELP_STRING([--with-vendorhdrdir=DIR], [core vendor headers in DIR [[RUBYHDRDIR/vendor_ruby]]]),
4449 [vendorhdrdir=$withval],
4450 [vendorhdrdir='${rubyhdrdir}/vendor_ruby'])
4452 AC_ARG_WITH(vendorarchhdrdir,
4453 AS_HELP_STRING([--with-vendorarchhdrdir=DIR],
4454 [architecture dependent core vendor headers in DIR [[RUBYHDRDIR/vendor_ruby]]]),
4455 [vendorarchhdrdir=$withval],
4456 [vendorarchhdrdir=${multiarch+'${sitearchincludedir}/${RUBY_VERSION_NAME}/vendor_ruby'}${multiarch-'${vendorhdrdir}/${sitearch}'}])
4458 AC_SUBST(rubyhdrdir)dnl
4459 AC_SUBST(sitehdrdir)dnl
4460 AC_SUBST(vendorhdrdir)dnl
4461 AC_SUBST(rubyarchhdrdir)dnl
4462 AC_SUBST(sitearchhdrdir)dnl
4463 AC_SUBST(vendorarchhdrdir)dnl
4465 AC_ARG_WITH(mantype,
4466 AS_HELP_STRING([--with-mantype=TYPE], [specify man page type; TYPE is one of man and doc]),
4468 AS_CASE(["$withval"],
4469 [man|man.gz|man.bz2|doc|doc.gz|doc.bz2], [MANTYPE=$withval],
4470 [AC_MSG_ERROR(invalid man type: $withval)])
4472 AS_IF([test -z "$MANTYPE"], [
4473 dnl Looks for nroff with -mdoc support.
4474 AC_CACHE_VAL([ac_cv_path_NROFF], [
4475 AC_PATH_PROGS_FEATURE_CHECK([NROFF],
4477 [$ac_path_NROFF -mdoc ${srcdir}/man/ruby.1 \
4479 ac_cv_path_NROFF=$ac_path_NROFF \
4480 ac_path_NROFF_found=:],
4481 [], ["/usr/bin:/usr/ucb"]
4484 AS_IF([test -n "$ac_cv_path_NROFF"], [
4493 AC_ARG_ENABLE(mkmf-verbose,
4494 AS_HELP_STRING([--enable-mkmf-verbose], [enable verbose in mkmf]),
4497 AC_SUBST(MKMF_VERBOSE)
4499 AC_ARG_ENABLE(rubygems,
4500 AS_HELP_STRING([--disable-rubygems], [disable rubygems by default]),
4501 [enable_rubygems="$enableval"], [enable_rubygems=yes])
4502 AS_IF([test x"$enable_rubygems" = xno], [
4507 AC_SUBST(USE_RUBYGEMS)
4509 arch_hdrdir="${EXTOUT}/include/${arch}/ruby"
4510 AS_MKDIR_P("${arch_hdrdir}")
4511 config_h="${arch_hdrdir}/config.h"
4512 guard=INCLUDE_RUBY_CONFIG_H
4514 echo "#ifndef $guard"
4515 echo "#define $guard 1"
4516 sed "/^@%:@define PACKAGE_/d;s/ *$//" confdefs.h
4517 echo "#endif /* $guard */"
4520 AS_IF([test "x$CONFIGURE_TTY" = xyes], [color=--color], [color=])
4521 exec ${SHELL} ${tooldir}/ifchange $color "${config_h}" -
4522 ) >&AS_MESSAGE_FD || AC_MSG_ERROR([failed to create ${config_h}])
4523 tr -d '\015' < largefile.h > confdefs.h
4526 BUILTIN_ENCS=["`sed -n -e '/^BUILTIN_ENCS[ ]*=/{' \
4527 -e s/// -e :l -e '/\\\\$/N' -e 's/\\\\\\n/ /' -e 't l' -e p \
4528 -e '}' "${srcdir}/enc/Makefile.in"`"]
4530 for e in $BUILTIN_ENCS; do BUILTIN_ENCOBJS="$BUILTIN_ENCOBJS "`echo $e | sed 's/\.c$/.$(OBJEXT)/'`; done
4531 AC_SUBST(BUILTIN_ENCOBJS)
4533 BUILTIN_TRANSES=["`sed -n -e '/^BUILTIN_TRANSES[ ]*=/{' \
4534 -e s/// -e :l -e '/\\\\$/N' -e 's/\\\\\\n/ /' -e 't l' -e p \
4535 -e '}' "${srcdir}/enc/Makefile.in"`"]
4538 for e in $BUILTIN_TRANSES; do
4539 BUILTIN_TRANSSRCS="$BUILTIN_TRANSSRCS "`echo $e | sed 's/\.trans$/.c/'`
4540 BUILTIN_TRANSOBJS="$BUILTIN_TRANSOBJS "`echo $e | sed 's/\.trans$/.$(OBJEXT)/'`
4542 AC_SUBST(BUILTIN_TRANSSRCS)
4543 AC_SUBST(BUILTIN_TRANSOBJS)
4545 PACKAGE=$RUBY_BASE_NAME
4547 AS_MESSAGE([$PACKAGE library version = $ruby_version])
4549 AS_IF([test x"$CC_WRAPPER" != x], [
4550 CC='$(CC_WRAPPER) '"${CC@%:@$CC_WRAPPER }"
4551 CPP='$(CC_WRAPPER) '"${CPP@%:@$CC_WRAPPER }"
4552 XCC_WRAPPER="$CC_WRAPPER"
4554 AC_SUBST(CC_WRAPPER, '')
4555 AC_SUBST(XCC_WRAPPER)
4557 AS_CASE([" $CPP "], [*" $CC "*], [CPP=`echo " $CPP " | sed "s| $CC |"' $(CC) |;s/^ *//;s/ *$//'`])
4559 AS_IF([test ! -f "$srcdir/revision.h"], [
4560 AS_IF([test "x$HAVE_BASERUBY" = xyes], [
4561 ${BASERUBY} -C "$srcdir" tool/file2lastrev.rb -q --revision.h > "$srcdir/revision.h"
4563 touch "$srcdir/revision.h"
4567 AS_IF([test x"$firstmf" != x], [
4568 AC_CONFIG_FILES($firstmf:$firsttmpl, [], [firstmf="$firstmf" firsttmpl="$firsttmpl"])
4570 AC_CONFIG_FILES(Makefile:template/Makefile.in, [
4573 AS_IF([test ${VCS+set}], [
4575 ], [git_dir=`$GIT --work-tree="$srcdir" --git-dir="$srcdir/.git" rev-parse --git-dir 2>/dev/null`], [
4581 ['$(GIT)'|git], [VCSUP='$(VCS) pull --rebase $(GITPULLOPTIONS)'],
4583 for f in "$srcdir/version.h" "$srcdir/revision.h"; do
4584 test -f "$f" || continue
4586 -e '[/^@%:@define \(RUBY_RELEASE_[A-Z]*\) \([0-9][0-9]*\)/]{' \
4588 -e '[s/ \([0-9]\)$/ 0\1/]' \
4592 sed '/^MISSING/s/\$U\././g;/^VCS *=/s#@VCS@#'"$VCS"'#;/^VCSUP *=/s#@VCSUP@#'"$VCSUP"'#' Makefile
4593 echo; test x"$EXEEXT" = x || echo 'miniruby: miniruby$(EXEEXT)'
4594 AS_IF([test "$gnumake" != yes], [
4595 echo ['$(MKFILES): $(srcdir)/common.mk']
4596 sed ['s/{\$([^(){}]*)[^{}]*}//g'] ${srcdir}/common.mk
4597 AS_IF([test "$YJIT_SUPPORT" = yes], [
4598 cat ${srcdir}/yjit/not_gmake.mk
4599 echo ['$(MKFILES): ${srcdir}/yjit/not_gmake.mk']
4602 echo 'distclean-local::; @$(RM) GNUmakefile uncommon.mk'
4604 } > $tmpmk && AS_IF([! grep '^ruby:' $tmpmk > /dev/null], [
4605 AS_IF([test "${gnumake}" = yes], [
4606 tmpgmk=confgmk$$.tmp
4608 echo "include $tmpmk"
4609 echo "-include uncommon.mk"
4614 test -z "`${MAKE-make} -f $tmpgmk info-program | grep '^PROGRAM=ruby$'`" &&
4615 echo 'ruby: $(PROGRAM);' >> $tmpmk
4616 test "$tmpmk" = "$tmpgmk" || rm -f "$tmpgmk"
4617 ]) && mv -f $tmpmk Makefile],
4618 [EXEEXT='$EXEEXT' MAKE='${MAKE-make}' gnumake='$gnumake' GIT='$GIT' YJIT_SUPPORT='$YJIT_SUPPORT'])
4620 AC_ARG_WITH([ruby-pc],
4621 AS_HELP_STRING([--with-ruby-pc=FILENAME], [pc file basename]),
4622 [ruby_pc="$withval"],
4623 [ruby_pc="${RUBY_BASE_NAME}-${MAJOR}.${MINOR}.pc"])
4625 AC_SUBST(exec, [exec])
4627 AC_ARG_WITH(destdir,
4628 AS_HELP_STRING([--with-destdir=DESTDIR], [specify default directory to install]),
4629 [DESTDIR="$withval"])
4635 AS_IF([test "$silent" = yes], [], [
4636 AS_IF([${FOLD+:} false], [], [
4637 AS_IF([test "`echo abcdefg hijklmno | fold -s -w10 | sed 1d`" = hijklmno], [FOLD="fold"], [FOLD=])
4639 fold_width=`expr $COLUMNS - 30 2>/dev/null` || fold_width=50
4640 AS_REQUIRE_SHELL_FN([config_summary],
4641 [AS_FUNCTION_DESCRIBE([config_summary], [NAME, VAL], [configuration summary])],
4642 [AS_IF([test -z "$2"], [], [
4643 AS_ECHO_N([" * $1: "]) | dd bs=1 count=26 2>/dev/null
4644 AS_IF([test "$FOLD"], [
4645 echo "$2" | fold -s -w$fold_width |
4646 sed '1!s/^/ /;$!s/$/\\/'
4651 AS_IF([test $install_doc = yes],
4652 [DOCTARGETS=`echo " $RDOCTARGET $CAPITARGET " | sed 's/ nodoc //g;s/^ *//;s/ *$//'`],
4655 echo "Configuration summary for $RUBY_BASE_NAME version $MAJOR.$MINOR.$TEENY"
4657 config_summary "Installation prefix" "$prefix"
4658 config_summary "exec prefix" "$exec_prefix"
4659 config_summary "arch" "$arch"
4660 config_summary "site arch" "$sitearch"
4661 config_summary "RUBY_BASE_NAME" "$RUBY_BASE_NAME"
4662 config_summary "enable shared" "$enable_shared"
4663 config_summary "ruby lib prefix" "$rubylibprefix"
4664 config_summary "site libraries path" "$rubysitearchprefix"
4665 config_summary "vendor path" "$vendordir"
4666 config_summary "target OS" "$target_os"
4667 config_summary "compiler" "$CC"
4668 config_summary "with thread" "$THREAD_MODEL"
4669 config_summary "with coroutine" "$coroutine_type"
4670 config_summary "with shared GC" "$with_shared_gc"
4671 config_summary "enable shared libs" "$ENABLE_SHARED"
4672 config_summary "dynamic library ext" "$DLEXT"
4673 config_summary "CFLAGS" "$cflags"
4674 config_summary "CPPFLAGS" "$cppflags"
4675 config_summary "LDFLAGS" "$LDFLAGS"
4676 config_summary "DLDFLAGS" "$DLDFLAGS"
4677 config_summary "optflags" "$optflags"
4678 config_summary "debugflags" "$debugflags"
4679 config_summary "warnflags" "$warnflags"
4680 config_summary "strip command" "$STRIP"
4681 config_summary "install doc" "$DOCTARGETS"
4682 config_summary "YJIT support" "$YJIT_SUPPORT"
4683 config_summary "RJIT support" "$RJIT_SUPPORT"
4684 config_summary "man page type" "$MANTYPE"
4685 config_summary "search path" "$search_path"
4686 config_summary "static-linked-ext" ${EXTSTATIC:+"yes"}
4687 config_summary "BASERUBY -v" "$BASERUBY_VERSION"