diff options
Diffstat (limited to 'configure.ac')
| -rw-r--r-- | configure.ac | 3767 |
1 files changed, 2038 insertions, 1729 deletions
diff --git a/configure.ac b/configure.ac index 6c15929f05..2de91209d6 100644 --- a/configure.ac +++ b/configure.ac @@ -1,37 +1,79 @@ dnl Process this file with autoconf to produce a configure script. -AC_INIT() +AC_INIT { AC_CONFIG_AUX_DIR(tool) AC_PREREQ(2.67) +tooldir="$srcdir/tool" + AC_DISABLE_OPTION_CHECKING -AC_ARG_VAR([cflags], [additional CFLAGS]) -AC_ARG_VAR([cppflags], [additional CPPFLAGS]) -AC_ARG_VAR([cxxflags], [additional CXXFLAGS]) - -AC_DEFUN([RUBY_RM_RECURSIVE], [ -m4_version_prereq([2.70], [-1], [ -# suppress error messages, rm: cannot remove 'conftest.dSYM', from -# AC_EGREP_CPP with CFLAGS=-g on Darwin. -AS_CASE([$build_os], [darwin*], [ -rm() { - rm_recursive='' - for arg do - AS_CASE("$arg", - [--*], [], - [-*r*], [break], - [conftest.*], [AS_IF([test -d "$arg"], [rm_recursive=-r; break])], - []) - done - command rm $rm_recursive "[$]@" -} -])])]) +m4_define([RUBY_M4_INCLUDED], [])dnl +AC_DEFUN([RUBY_M4_INCLUDE], [m4_include([tool/m4/$1])dnl + m4_append([RUBY_M4_INCLUDED], [ \ + $(tooldir)/m4/$1])dnl +]) +RUBY_M4_INCLUDE([_colorize_result_prepare.m4])dnl +RUBY_M4_INCLUDE([ac_msg_result.m4])dnl +RUBY_M4_INCLUDE([colorize_result.m4])dnl +RUBY_M4_INCLUDE([ruby_append_option.m4])dnl +RUBY_M4_INCLUDE([ruby_append_options.m4])dnl +RUBY_M4_INCLUDE([ruby_check_builtin_func.m4])dnl +RUBY_M4_INCLUDE([ruby_check_builtin_overflow.m4])dnl +RUBY_M4_INCLUDE([ruby_check_builtin_setjmp.m4])dnl +RUBY_M4_INCLUDE([ruby_check_header.m4])dnl +RUBY_M4_INCLUDE([ruby_check_printf_prefix.m4])dnl +RUBY_M4_INCLUDE([ruby_check_setjmp.m4])dnl +RUBY_M4_INCLUDE([ruby_check_signedness.m4])dnl +RUBY_M4_INCLUDE([ruby_check_sizeof.m4])dnl +RUBY_M4_INCLUDE([ruby_check_sysconf.m4])dnl +RUBY_M4_INCLUDE([ruby_cppoutfile.m4])dnl +RUBY_M4_INCLUDE([ruby_decl_attribute.m4])dnl +RUBY_M4_INCLUDE([ruby_default_arch.m4])dnl +RUBY_M4_INCLUDE([ruby_define_if.m4])dnl +RUBY_M4_INCLUDE([ruby_defint.m4])dnl +RUBY_M4_INCLUDE([ruby_dtrace_available.m4])dnl +RUBY_M4_INCLUDE([ruby_dtrace_postprocess.m4])dnl +RUBY_M4_INCLUDE([ruby_func_attribute.m4])dnl +RUBY_M4_INCLUDE([ruby_mingw32.m4])dnl +RUBY_M4_INCLUDE([ruby_prepend_option.m4])dnl +RUBY_M4_INCLUDE([ruby_prog_gnu_ld.m4])dnl +RUBY_M4_INCLUDE([ruby_prog_makedirs.m4])dnl +RUBY_M4_INCLUDE([ruby_replace_funcs.m4])dnl +RUBY_M4_INCLUDE([ruby_replace_type.m4])dnl +RUBY_M4_INCLUDE([ruby_require_funcs.m4])dnl +RUBY_M4_INCLUDE([ruby_rm_recursive.m4])dnl +RUBY_M4_INCLUDE([ruby_setjmp_type.m4])dnl +RUBY_M4_INCLUDE([ruby_modular_gc.m4])dnl +RUBY_M4_INCLUDE([ruby_stack_grow_direction.m4])dnl +RUBY_M4_INCLUDE([ruby_thread.m4])dnl +RUBY_M4_INCLUDE([ruby_try_cflags.m4])dnl +RUBY_M4_INCLUDE([ruby_try_cxxflags.m4])dnl +RUBY_M4_INCLUDE([ruby_try_ldflags.m4])dnl +RUBY_M4_INCLUDE([ruby_universal_arch.m4])dnl +RUBY_M4_INCLUDE([ruby_wasm_tools.m4])dnl +RUBY_M4_INCLUDE([ruby_werror_flag.m4])dnl + +AS_IF([test "x${GITHUB_ACTIONS}" = xtrue], +[AC_REQUIRE([_COLORIZE_RESULT_PREPARE])dnl +dnl 93(bright yellow) is copied from .github/workflows/mingw.yml + begin_group() { AS_ECHO(["::group::@<:@93m$[]1@<:@m"]);} + end_group() { AS_ECHO(["::endgroup::"]);} +], +[dnl + begin_group() { :;} + end_group() { :;} +]) -{ # environment section +AC_ARG_VAR([cflags], [additional CFLAGS (ignored when CFLAGS is given)])dnl +AC_ARG_VAR([cppflags], [additional CPPFLAGS (ignored when CPPFLAGS is given)])dnl +AC_ARG_VAR([cxxflags], [additional CXXFLAGS (ignored when CXXFLAGS is given)])dnl +AC_ARG_VAR([rustc_flags], [additional RUSTC_FLAGS])dnl +[begin]_group "environment section" && { HAVE_BASERUBY=yes +BASERUBY_VERSION= AC_ARG_WITH(baseruby, AS_HELP_STRING([--with-baseruby=RUBY], [use RUBY as baseruby; RUBY is the pathname of ruby]), [AS_CASE(["$withval"], @@ -41,104 +83,122 @@ AC_ARG_WITH(baseruby, ], [ AC_PATH_PROG([BASERUBY], [ruby], [false]) + HAVE_BASERUBY= ]) -AS_IF([test "$HAVE_BASERUBY" = yes -a "`RUBYOPT=- $BASERUBY -e 'print 42' 2>/dev/null`" = 42], [ - AS_IF([test "`RUBYOPT=- $BASERUBY --disable=gems -e 'print 42' 2>/dev/null`" = 42], [ - BASERUBY="$BASERUBY --disable=gems" - ]) - $BASERUBY -C "$srcdir" tool/downloader.rb -d tool -e gnu config.guess config.sub -], [ - BASERUBY="echo executable host ruby is required. use --with-baseruby option.; false" +AS_IF([test "$HAVE_BASERUBY" = no], [ + # --without-baseruby +], [error=`RUBYOPT=- $BASERUBY --disable=gems "${tooldir}/missing-baseruby.bat" --verbose 2>&1`], [ + HAVE_BASERUBY=yes +], [test "$HAVE_BASERUBY" = ""], [ # no --with-baseruby option + AC_MSG_WARN($error) # just warn and continue HAVE_BASERUBY=no +], [ # the ruby given by --with-baseruby is too old + AC_MSG_ERROR($error) # bail out +]) +AS_IF([test "${HAVE_BASERUBY:=no}" != no], [ + AS_CASE(["$build_os"], [mingw*], [ + # Can MSys shell run a command with a drive letter? + RUBYOPT=- `cygpath -ma "$BASERUBY"` --disable=gems -e exit 2>/dev/null || HAVE_BASERUBY=no + ]) + RUBY_APPEND_OPTION(BASERUBY, "--disable=gems") + BASERUBY_VERSION=`$BASERUBY -v` + $BASERUBY -C "$srcdir" tool/downloader.rb -d tool -e gnu config.guess config.sub >&AS_MESSAGE_FD +]) +AS_IF([test "$HAVE_BASERUBY" = no], [ + AS_IF([test "$cross_compiling" = yes], [AC_MSG_ERROR([executable host ruby is required for cross-compiling])]) + BASERUBY=${tooldir}/missing-baseruby.bat ]) AC_SUBST(BASERUBY) AC_SUBST(HAVE_BASERUBY) +AS_IF([test "$cross_compiling" = yes], + [X_BUILD_EXEEXT=`$BASERUBY -rrbconfig -e ['puts RbConfig::CONFIG["EXEEXT"]']`], + [X_BUILD_EXEEXT='$(EXEEXT)'] +) +AC_SUBST(X_BUILD_EXEEXT) + +AC_ARG_WITH(dump-ast, + AS_HELP_STRING([--with-dump-ast=DUMP_AST], [use DUMP_AST as dump_ast; for cross-compiling with a host-built dump_ast]), + [DUMP_AST=$withval DUMP_AST_TARGET='$(empty)'], + [AS_IF([test "$cross_compiling" = yes], [ + DUMP_AST='build-tool/dump_ast$(BUILD_EXEEXT)' + ], [ + DUMP_AST='./dump_ast$(BUILD_EXEEXT)' + ]) + DUMP_AST_TARGET='$(DUMP_AST)']) +dnl Without baseruby, .rbinc files cannot be regenerated, so clear the +dnl dependency on dump_ast to avoid rebuilding pre-generated .rbinc files. +AS_IF([test "$HAVE_BASERUBY" = no], [DUMP_AST_TARGET='$(empty)']) +AC_SUBST(X_DUMP_AST, "${DUMP_AST}") +AC_SUBST(X_DUMP_AST_TARGET, "${DUMP_AST_TARGET}") : ${GIT=git} HAVE_GIT=yes AC_ARG_WITH(git, AS_HELP_STRING([--without-git], [never use git]), [AS_CASE([$withval], - [no], [GIT=never-use HAVE_GIT=no], + [no], [HAVE_GIT=no], [yes], [], [GIT=$withval])]) -AS_IF([test x"$HAVE_GIT" = xyes], [command -v "$GIT" > /dev/null || HAVE_GIT=no]) +{ + test x"$HAVE_GIT" = xyes && + command -v "$GIT" > /dev/null && + # `git -C`: 1.8.5 + # `git log --no-show-signature`: 2.10.0 + AS_CASE([`$GIT -C . --version 2> /dev/null | sed 's/.* //'`], + [0.*|1.*|2.@<:@0-9@:>@.*], [false], + [true]) +} || HAVE_GIT=no GIT=never-use AC_SUBST(GIT) AC_SUBST(HAVE_GIT) -AC_DEFUN([RUBY_MINGW32], -[AS_CASE(["$host_os"], -[cygwin*], [ -AC_CACHE_CHECK(for mingw32 environment, rb_cv_mingw32, -[AC_TRY_CPP([ -#ifndef __MINGW32__ -# error -#endif -], rb_cv_mingw32=yes,rb_cv_mingw32=no) -rm -f conftest*]) -AS_IF([test "$rb_cv_mingw32" = yes], [ - target_os="mingw32" - : ${ac_tool_prefix:="`expr "$CC" : ['\(.*-\)g\?cc[^/]*$']`"} -]) -]) -AS_CASE(["$target_os"], [mingw*msvc], [ -target_os="`echo ${target_os} | sed 's/msvc$//'`" -]) -AS_CASE(["$target_cpu-$target_os"], [x86_64-mingw*], [ -target_cpu=x64 -]) -]) - -AC_DEFUN([RUBY_CPPOUTFILE], -[AC_CACHE_CHECK(whether ${CPP} accepts -o, rb_cv_cppoutfile, -[save_CPPFLAGS="$CPPFLAGS" -CPPFLAGS='-o conftest-1.i' -rb_cv_cppoutfile=no -AC_TRY_CPP([test-for-cppout], - [grep test-for-cppout conftest-1.i > /dev/null && rb_cv_cppoutfile=yes]) -CPPFLAGS="$save_CPPFLAGS" -rm -f conftest*]) -AS_IF([test "$rb_cv_cppoutfile" = yes], [ - CPPOUTFILE='-o conftest.i' -], [test "$rb_cv_cppoutfile" = no], [ - CPPOUTFILE='> conftest.i' -], [test -n "$rb_cv_cppoutfile"], [ - CPPOUTFILE="$rb_cv_cppoutfile" -]) -AC_SUBST(CPPOUTFILE)]) - -AC_DEFUN([RUBY_PROG_GNU_LD], -[AC_CACHE_CHECK(whether the linker is GNU ld, rb_cv_prog_gnu_ld, -[AS_IF([`$CC $CFLAGS $CPPFLAGS $LDFLAGS --print-prog-name=ld 2>&1` -v 2>&1 | grep "GNU ld" > /dev/null], [ - rb_cv_prog_gnu_ld=yes -], [ - rb_cv_prog_gnu_ld=no -])]) -GNU_LD=$rb_cv_prog_gnu_ld -AC_SUBST(GNU_LD)]) - -eval `sed -n ['s/^@%:@define RUBY_API_VERSION_\([A-Z][A-Z_0-9]*\) \([0-9][0-9]*\)/API_\1=\2/p'] $srcdir/include/ruby/version.h` -RUBY_PROGRAM_VERSION=`sed -n 's/^@%:@define RUBY_VERSION "\(.*\)"/\1/p' $srcdir/version.h` -MAJOR=`echo $RUBY_PROGRAM_VERSION | cut -d. -f1` -MINOR=`echo $RUBY_PROGRAM_VERSION | cut -d. -f2` -TEENY=`echo $RUBY_PROGRAM_VERSION | cut -d. -f3` +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'] \ + -e ['s/^@%:@define \(RUBY_ABI_VERSION\) \([0-9][0-9]*\).*/\1=\2/p'] \ + -e ['s/^@%:@define \(RUBY_PATCHLEVEL\) \(.*\)/\1=\2/p'] \ + $srcdir/include/ruby/internal/abi.h \ + $srcdir/include/ruby/version.h $srcdir/version.h` for v in MAJOR MINOR TEENY; do AS_IF([eval "test \"\$$v\" = ''"], [ AC_MSG_ERROR(could not determine $v number from version.h) ]) done -AS_IF([test "$MAJOR.$MINOR" != "$API_MAJOR.$API_MINOR"], [ - AC_MSG_ERROR([API version $API_MAJOR.$API_MINOR differs from program version $MAJOR.$MINOR]) -]) AC_SUBST(MAJOR) AC_SUBST(MINOR) AC_SUBST(TEENY) -AC_SUBST(RUBY_PROGRAM_VERSION) AC_SUBST(RUBY_API_VERSION, '$(MAJOR).$(MINOR)') -RUBY_PATCHLEVEL=`sed -n 's/^#define RUBY_PATCHLEVEL //p' $srcdir/version.h` -AC_DEFINE(CANONICALIZATION_FOR_MATHN) +AC_SUBST(RUBY_PROGRAM_VERSION, '$(MAJOR).$(MINOR).$(TEENY)') +AS_CASE([$RUBY_PATCHLEVEL], [-*], [ + AC_DEFINE_UNQUOTED(RUBY_ABI_VERSION, [${RUBY_ABI_VERSION}]) +], [RUBY_ABI_VERSION=]) + +AS_IF([test "$program_prefix" = NONE], [ + program_prefix= +]) +AS_IF([test "$prefix" -ef .], [ + AC_MSG_ERROR(--prefix cannot be the current working directory.) +]) +RUBY_BASE_NAME=`echo ruby | sed "$program_transform_name"` +RUBYW_BASE_NAME=`echo rubyw | sed "$program_transform_name"` +AC_SUBST(RUBY_BASE_NAME) +AC_SUBST(RUBYW_BASE_NAME) +AC_SUBST(RUBY_VERSION_NAME, '${RUBY_BASE_NAME}-${ruby_version}') + dnl checks for alternative programs AC_CANONICAL_BUILD +AC_CANONICAL_HOST +AC_CANONICAL_TARGET +AC_SUBST(config_target, $target) +AS_CASE(["$target_cpu-$target_os"], + [aarch64-darwin*], [ + target_cpu=arm64 + AS_CASE(["$target_vendor"], [unknown], [ + target_vendor=apple + target=${target%%-unknown-*}-apple-${target@%:@*-unknown-} + ]) + target="arm64-${target@%:@aarch64-}" + AS_IF([test -n "$target_alias"], [target_alias="arm64-${target_alias@%:@aarch64-}"]) + ]) + +AC_ARG_PROGRAM RUBY_RM_RECURSIVE AC_ARG_WITH(gcc, AS_HELP_STRING([--without-gcc], [never use gcc]), @@ -152,21 +212,140 @@ AS_IF([test ! -z "$ac_cv_prog_CC" -a ! -z "$CC" -a "$CC" != "$ac_cv_prog_CC"], [ AC_MSG_ERROR(cached CC is different -- throw away $cache_file (it is also a good idea to do 'make clean' before compiling)) ]) -test -z "$CC" || ac_cv_prog_CC="$CC" -AS_IF([test "$program_prefix" = NONE], [ - program_prefix= +RUBY_WASM_TOOLS + +AS_CASE(["${build_os}"], +[linux*|cygwin*|msys*], [ + # Naruse prefers GCC on Linux + AC_CHECK_TOOLS([CC], [gcc clang cc]) +], +[solaris*], [ + # Clang on Solaris is largely untested. + # https://bugs.ruby-lang.org/issues/17949 + AC_CHECK_TOOLS([CC], [cc gcc]) +], [ + # OpenBSD wants to prefer cc over gcc. + # See https://github.com/ruby/ruby/pull/2443 + AC_CHECK_TOOLS([CC], [cl.exe clang cc gcc c99 /usr/ucb/cc]) +]) + +AC_ARG_VAR([AR], [Archiver command]) +AC_ARG_VAR([AS], [Assembler command]) +AC_ARG_VAR([CC], [C compiler command]) +AC_ARG_VAR([CXX], [C++ compiler command]) +AC_ARG_VAR([LD], [Linker command]) +AC_ARG_VAR([NM], [Symbol list command]) +AC_ARG_VAR([OBJCOPY], [Objcopy command]) +AC_ARG_VAR([OBJDUMP], [Objdump command]) +AC_ARG_VAR([RANLIB], [Ranlib command]) +AC_ARG_VAR([STRIP], [Strip command]) + +# We don't want to bother things like `ccache gcc`, `clang -shared-libgcc`, ... +set rb_dummy ${CC} +rb_CC=$2 +AC_DEFUN([RUBY_CHECK_PROG_FOR_CC], [ + rb_prog=`echo "${rb_CC}" | sed ["s:$2\([^/]*\)$:$3\1:"]` + AC_CHECK_PROG([$1], [$rb_prog], [$rb_prog]) +]) +AS_CASE(["/${rb_CC} "], +[*@<:@\ /@:>@"cc "*], [ + # Don't try g++/clang++ when CC=cc + AC_CHECK_PROGS([CXX], [cl.exe CC c++]) +], +[*icc*], [ + # Intel C++ has interprocedural optimizations. It tends to come with its + # own linker etc. + RUBY_CHECK_PROG_FOR_CC([AR], [icc], [xiar]) + RUBY_CHECK_PROG_FOR_CC([CXX], [icc], [icpc]) + RUBY_CHECK_PROG_FOR_CC([LD], [icc], [xild]) +], +[*gcc*], [ + # Ditto for GCC. + RUBY_CHECK_PROG_FOR_CC([LD], [gcc], [ld]) + RUBY_CHECK_PROG_FOR_CC([AR], [gcc], [gcc-ar]) + RUBY_CHECK_PROG_FOR_CC([CXX], [gcc], [g++]) + RUBY_CHECK_PROG_FOR_CC([NM], [gcc], [gcc-nm]) + RUBY_CHECK_PROG_FOR_CC([RANLIB], [gcc], [gcc-ranlib]) +], +[*clang*], [ + # Ditto for LLVM. Note however that llvm-as is a LLVM-IR to LLVM bitcode + # assembler that does not target your machine native binary. + + # Xcode has its own version tools that may be incompatible with + # genuine LLVM tools, use the tools in the same directory. + + AS_IF([$rb_CC -E -dM -xc - < /dev/null | grep -F __apple_build_version__ > /dev/null], + [llvm_prefix=], [llvm_prefix=llvm-]) + # AC_PREPROC_IFELSE cannot be used before AC_USE_SYSTEM_EXTENSIONS + + RUBY_CHECK_PROG_FOR_CC([LD], [clang], [ld]) # ... maybe try lld ? + RUBY_CHECK_PROG_FOR_CC([AR], [clang], [${llvm_prefix}ar]) +# RUBY_CHECK_PROG_FOR_CC([AS], [clang], [${llvm_prefix}as]) + RUBY_CHECK_PROG_FOR_CC([CXX], [clang], [clang++]) + RUBY_CHECK_PROG_FOR_CC([NM], [clang], [${llvm_prefix}nm]) + RUBY_CHECK_PROG_FOR_CC([OBJCOPY], [clang], [${llvm_prefix}objcopy]) + RUBY_CHECK_PROG_FOR_CC([OBJDUMP], [clang], [${llvm_prefix}objdump]) + RUBY_CHECK_PROG_FOR_CC([RANLIB], [clang], [${llvm_prefix}ranlib]) + RUBY_CHECK_PROG_FOR_CC([STRIP], [clang], [${llvm_prefix}strip]) + + # These -Wno-* flags silence clang-specific diagnostics that don't exist + # in GCC. GCC silently accepts unknown -Wno-* flags but later emits noisy + # "unrecognized command-line option" notes whenever another warning fires. + clang_warnflags="-Wno-constant-logical-operand -Wno-parentheses-equality -Wno-self-assign" +]) +AS_UNSET(rb_CC) +AS_UNSET(rb_dummy) + +AS_CASE(["${build_os}"], +[solaris*], [ + AC_PATH_TOOL([LD], [ld], [/usr/ccs/bin/ld], [/usr/ccs/bin:$PATH]) +], +[aix*], [ + AC_PATH_TOOL([NM], [nm], [/usr/ccs/bin/nm], [/usr/ccs/bin:$PATH]) ]) -AS_IF([test "$prefix" -ef .], [ - AC_MSG_ERROR(--prefix cannot be the current working directory.) +AS_CASE(["${target_os}"], +[cygwin*|msys*|mingw*|darwin*], [ + ac_ct_OBJCOPY=":" + ac_cv_prog_OBJCOPY=":" + ac_cv_prog_ac_ct_OBJCOPY=":" +]) + +rb_test_CFLAGS=${CFLAGS+yes} +rb_test_CXXFLAGS=${CXXFLAGS+yes} + +# BSD's ports and MacPorts prefix GNU binutils with 'g' + +dnl Seems necessarily in order to add -std=gnu99 option for gcc 4.9. +m4_version_prereq([2.70], [AC_PROG_CC], [AC_PROG_CC_C99]) + +AC_PROG_CXX +AC_PROG_CPP +AC_PROG_RANLIB +AC_CHECK_TOOLS([AR], [gar ar]) +AC_CHECK_TOOLS([AS], [gas as]) +AC_CHECK_TOOLS([LD], [gld ld]) # ... try gold ? +AC_CHECK_TOOLS([NM], [gnm nm]) +AC_CHECK_TOOLS([OBJCOPY], [gobjcopy objcopy], [:]) +AC_CHECK_TOOLS([OBJDUMP], [gobjdump objdump]) +AC_CHECK_TOOLS([STRIP], [gstrip strip], [:]) + +FIRSTMAKEFILE="" + +# nm errors with Rust's LLVM bitcode when Rust uses a newer LLVM version than nm. +# In case we're working with llvm-nm, tell it to not worry about the bitcode. +AS_IF([${NM} --help 2>&1 | grep -q 'llvm-bc'], [NM="$NM --no-llvm-bc"]) + +AS_IF([test ! $rb_test_CFLAGS], [AS_UNSET(CFLAGS)]); AS_UNSET(rb_test_CFLAGS) +AS_IF([test ! $rb_test_CXXFLAGS], [AS_UNSET(CXXFLAGS)]); AS_UNSET(rb_save_CXXFLAGS) + +AS_IF([test "${CXX}" = "g++" -a -z "${GXX}"], [ + # AC_PROG_CXX sets $CXX to "g++" when it purposefully finds that there is + # _no_ g++. This brain-damaged design must be worked around. Thankfully, + # similar thing doesn't happen for AC_PROG_CC. + rb_there_is_in_fact_no_gplusplus_but_autoconf_is_cheating_us=true ]) -RUBY_BASE_NAME=`echo ruby | sed "$program_transform_name"` -RUBYW_BASE_NAME=`echo rubyw | sed "$program_transform_name"` -AC_SUBST(RUBY_BASE_NAME) -AC_SUBST(RUBYW_BASE_NAME) -AC_SUBST(RUBY_VERSION_NAME, '${RUBY_BASE_NAME}-${ruby_version}') -AC_CANONICAL_TARGET test x"$target_alias" = x && target_os=`echo $target_os | sed 's/linux-gnu$/linux/;s/linux-gnu/linux-/'` ac_install_sh='' # unusable for extension libraries. @@ -193,7 +372,7 @@ AS_CASE("${os_version_style}", [minor], [os_version_style_transform=['s/\([0-9]\.[0-9][0-9]*\)\.[0-9][.0-9]*$/\1/']], [major+0], [os_version_style_transform=['s/\([0-9]\)\.[0-9][.0-9]*$/\1.0/']], [major], [os_version_style_transform=['s/\([0-9]\)\.[0-9][.0-9]*$/\1/']], - [none], [os_version_style_transform=['s/[0-9]\.[0-9][.0-9]*$//']], + [none], [os_version_style_transform=['s/[0-9]*\.[0-9][.0-9]*$//']], [AC_MSG_ERROR(unknown --with-os-version-style: $withval)]) AS_IF([test -z "$target_alias" -a -n "$os_version_style_transform"], [ @@ -201,28 +380,6 @@ AS_IF([test -z "$target_alias" -a -n "$os_version_style_transform"], target_os=`echo ${target_os} | sed "$os_version_style_transform"` ]) -AC_DEFUN([RUBY_APPEND_OPTION], - [# RUBY_APPEND_OPTION($1) - AS_CASE([" [$]{$1-} "], - [*" $2 "*], [], [' '], [ $1="$2"], [ $1="[$]$1 $2"])]) -AC_DEFUN([RUBY_APPEND_OPTIONS], - [# RUBY_APPEND_OPTIONS($1) - for rb_opt in $2; do - AS_CASE([" [$]{$1-} "], - [*" [$]{rb_opt} "*], [], [' '], [ $1="[$]{rb_opt}"], [ $1="[$]$1 [$]{rb_opt}"]) - done]) -AC_DEFUN([RUBY_PREPEND_OPTION], - [# RUBY_PREPEND_OPTION($1) - AS_CASE([" [$]{$1-} "], - [*" $2 "*], [], [' '], [ $1="$2"], [ $1="$2 [$]$1"])]) -AC_DEFUN([RUBY_PREPEND_OPTIONS], - [# RUBY_PREPEND_OPTIONS($1) - unset rb_opts; for rb_opt in $2; do - AS_CASE([" [$]{rb_opts} [$]{$1-} "], - [*" [$]{rb_opt} "*], [], [' '], [ $1="[$]{rb_opt}"], [ rb_opts="[$]{rb_opts}[$]{rb_opt} "]) - done - $1="[$]{rb_opts}[$]$1"]) - AC_ARG_WITH(arch, AS_HELP_STRING([--with-arch=ARCHS], [build an Apple/NeXT Multi Architecture Binary (MAB); @@ -232,111 +389,12 @@ AC_ARG_WITH(arch, target platform]), [target_archs="$withval"], [unset target_archs]) -AC_DEFUN([RUBY_DEFAULT_ARCH], [ -AC_MSG_CHECKING([arch option]) -AS_CASE([$1], - [*64], [ARCH_FLAG=-m64], - [[i[3-6]86]], [ARCH_FLAG=-m32], - [AC_MSG_ERROR(unknown target architecture: $target_archs)] - ) -AC_MSG_RESULT([$ARCH_FLAG]) -]) - -AC_DEFUN([RUBY_UNIVERSAL_ARCH], [ -# RUBY_UNIVERSAL_ARCH begin -ARCH_FLAG=`expr " $CXXFLAGS " : ['.* \(-m[0-9][0-9]*\) ']` -test ${CXXFLAGS+set} && CXXFLAGS=`echo "$CXXFLAGS" | sed [-e 's/ *-arch *[^ ]*//g' -e 's/ *-m32//g' -e 's/ *-m64//g']` -ARCH_FLAG=`expr " $CFLAGS " : ['.* \(-m[0-9][0-9]*\) ']` -test ${CFLAGS+set} && CFLAGS=`echo "$CFLAGS" | sed [-e 's/ *-arch *[^ ]*//g' -e 's/ *-m32//g' -e 's/ *-m64//g']` -test ${LDFLAGS+set} && LDFLAGS=`echo "$LDFLAGS" | sed [-e 's/ *-arch *[^ ]*//g' -e 's/ *-m32//g' -e 's/ *-m64//g']` -unset universal_binary universal_archnames -AS_IF([test ${target_archs+set}], [ - AC_MSG_CHECKING([target architectures]) - target_archs=`echo $target_archs | tr , ' '` - # /usr/lib/arch_tool -archify_list $TARGET_ARCHS - for archs in $target_archs - do - AS_CASE([",$universal_binary,"],[*",$archs,"*], [],[ - cpu=`$SHELL "$ac_aux_dir/config.sub" "${archs}-${target_os}" 2>&1` || { - AC_MSG_RESULT([failed]) - AC_MSG_ERROR([$cpu]) - } - cpu=`echo $cpu | sed 's/-.*-.*//'` - universal_binary="${universal_binary+$universal_binary,}$cpu" - universal_archnames="${universal_archnames} ${archs}=${cpu}" - ARCH_FLAG="${ARCH_FLAG+$ARCH_FLAG }-arch $archs" - ]) - done - target_archs="$universal_binary" - unset universal_binary - AS_CASE(["$target_archs"], - [*,*], [universal_binary=yes], - [unset universal_archnames]) - AC_MSG_RESULT([$target_archs]) - - target=`echo $target | sed "s/^$target_cpu-/-/"` - target_alias=`echo $target_alias | sed "s/^$target_cpu-/-/"` - AS_IF([test "${universal_binary-no}" = yes], [ - AC_SUBST(try_header,try_compile) - target_cpu=universal - real_cross_compiling=$cross_compiling - ], [ - AS_IF([test x"$target_cpu" != x"${target_archs}"], [ - echo 'int main(){return 0;}' > conftest.c - AS_IF([$CC $CFLAGS $ARCH_FLAG -o conftest conftest.c > /dev/null 2>&1], [ - rm -fr conftest.* - ], [ - RUBY_DEFAULT_ARCH("$target_archs") - ]) - ]) - target_cpu=${target_archs} - ]) - AS_CASE(["$target"], [-*], [ target="$target_cpu${target}"]) - AS_CASE(["$target_alias"], [-*], [ target_alias="$target_cpu${target_alias}"]) -], [ - AS_IF([test x"$target_alias" = x], [ - AS_CASE(["$target_os"], - [darwin*], [ - AC_MSG_CHECKING([for real target cpu]) - target=`echo $target | sed "s/^$target_cpu-/-/"` - target_cpu=`$CC -E - 2>/dev/null <<EOF | -#ifdef __x86_64__ -"processor-name=x86_64" -#endif -#ifdef __i386__ -"processor-name=i386" -#endif -#ifdef __ppc__ -"processor-name=powerpc" -#endif -#ifdef __ppc64__ -"processor-name=powerpc64" -#endif -EOF - sed -n 's/^"processor-name=\(.*\)"/\1/p'` - target="$target_cpu${target}" - AC_MSG_RESULT([$target_cpu]) - ]) - ]) - target_archs="$target_cpu" -]) -AS_IF([test "${target_archs}" != "${rb_cv_target_archs-${target_archs}}"], [ - AC_MSG_ERROR([target arch(s) has changed from ${rb_cv_target_archs-nothing} to ${target_archs}]) -], [ - rb_cv_target_archs=${target_archs} -]) -AS_IF([test "x${ARCH_FLAG}" != x], [ - CFLAGS="${CFLAGS:+$CFLAGS }${ARCH_FLAG}" - LDFLAGS="${LDFLAGS:+$LDFLAGS }${ARCH_FLAG}" -]) -# RUBY_UNIVERSAL_ARCH end -]) - AC_ARG_ENABLE(load-relative, AS_HELP_STRING([--enable-load-relative], [resolve load paths at run time]), [load_relative=$enableval]) -AC_ARG_PROGRAM +# checks for UNIX variants that set C preprocessor variables +AC_USE_SYSTEM_EXTENSIONS dnl Checks for programs. @@ -345,59 +403,51 @@ test -z "$optflags" || cflagspat="$cflagspat;s|"`eval echo '"'"${optflags}"'"' | sed 's/[[][|.*]]/\\&/g;s/^ */ /;s/ *$/ /'`'| |g' test -z "$debugflags" || cflagspat="$cflagspat;s|"`eval echo '"'"${debugflags}"'"' | sed 's/[[][|.*]]/\\&/g;s/^ */ /;s/ *$/ /'`'| |g' -test -z "warnflags" || +test -z "$warnflags" || cflagspat="$cflagspat;s|"`eval echo '"'"${warnflags}"'"' | sed 's/[[][|.*]]/\\&/g;s/^ */ /;s/ *$/ /'`'| |g' AS_IF([test -z "${CFLAGS+set}"], [ cflags=`echo " $cflags " | sed "$cflagspat;s/^ *//;s/ *$//"` orig_cflags="$cflags" - cflags="$cflags "'${optflags} ${debugflags} ${warnflags}' -]) -AS_IF([test -z "${CXXFLAGS+set}"], [ - cxxflags=`echo " $cxxflags " | sed "$cflagspat;s/^ *//;s/ *$//"` - orig_cxxflags="$cxxflags" - cxxflags="$cxxflags "'${optflags} ${debugflags} ${warnflags}' + cflags='${hardenflags} '"$cflags "'${optflags} ${debugflags} ${warnflags}' ]) +dnl AS_IF([test -z "${CXXFLAGS+set}"], [ +dnl cxxflags=`echo " $cxxflags " | sed "$cflagspat;s/^ *//;s/ *$//"` +dnl orig_cxxflags="$cxxflags" +dnl cxxflags="$cxxflags "'${optflags} ${debugflags} ${warnflags}' +dnl ]) AS_CASE(["$host_os:$build_os"], [darwin*:darwin*], [ - AC_CHECK_TOOLS(CC, [clang gcc cc]) # Following Apple deployed clang are broken # clang version 1.0 (http://llvm.org/svn/llvm-project/cfe/tags/Apple/clang-23 exported) # Apple clang version 2.0 (tags/Apple/clang-137) (based on LLVM 2.9svn) # Apple clang version 2.1 (tags/Apple/clang-163.7.1) (based on LLVM 3.0svn) - AS_IF([! $CC -E -xc - <<SRC >/dev/null], [ - @%:@if defined __APPLE_CC__ && defined __clang_major__ && __clang_major__ < 3 - @%:@error premature clang - @%:@endif -SRC - AC_MSG_ERROR([clang version 3.0 or later is required]) - ]) -]) -AS_IF([test x"${build}" != x"${host}"], [ - AC_CHECK_TOOL(CC, gcc) + AC_PREPROC_IFELSE( + [AC_LANG_PROGRAM([ + @%:@if defined __APPLE_CC__ && defined __clang_major__ && __clang_major__ < 3 + @%:@error premature clang + @%:@endif + ])], + [], + [AC_MSG_ERROR([clang version 3.0 or later is required])]) ]) -AC_PROG_CC - -dnl Select the appropriate C++ compiler in OS X -AS_CASE(["$build_os"], - [darwin1*.*], [ - AS_CASE(["x$CC"], - [xgcc-4.2|x/usr/bin/gcc-4.2], [: ${CXX=g++-4.2}], - [xgcc|x/usr/bin/gcc], [: ${CXX=g++}], - [xcc|x/usr/bin/cc], [: ${CXX=c++}], - [xicc], [: ${CXX=icpc}], - [xclang|x/usr/bin/clang], [: ${CXX=clang++}]) - ]) -test -z "$CXX" || ac_cv_prog_CXX="$CXX" +AS_CASE(["$target_os"], +[darwin*], [ + AC_MSG_CHECKING(if minimum required OS X version is supported) + AC_PREPROC_IFELSE([AC_LANG_SOURCE([[@%:@include <AvailabilityMacros.h> + @%:@if MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_5 + @%:@error pre OS X 10.5 + [!<===== pre OS X 10.5 =====>] + @%:@endif + ]])], + [AC_MSG_RESULT(yes)], + [AC_MSG_RESULT(no) + AC_MSG_ERROR([Unsupported OS X version is required])]) +]) -AC_PROG_CXX RUBY_MINGW32 -AC_PROG_GCC_TRADITIONAL AC_SUBST(GCC) -AS_CASE(["$target_os"], -[solaris*], [AC_PATH_TOOL([LD], [ld], [/usr/ccs/bin/ld], [/usr/ccs/bin:$PATH])], -[AC_CHECK_TOOL([LD], [ld], [ld])]) AC_SUBST(LD) AS_IF([test "$GCC" = yes], [ linker_flag=-Wl, @@ -406,7 +456,13 @@ AS_IF([test "$GCC" = yes], [ gcc_minor=`echo =__GNUC_MINOR__ | $CC -E -xc - | sed '/^=/!d;s///'` test -n "$gcc_major" || gcc_major=0 test -n "$gcc_minor" || gcc_minor=0 + icc_version=`echo =__ICC | $CC -E -xc - | sed '/^=/!d;s///;/^__ICC/d'` + test -n "$icc_version" || icc_version=0 # RUBY_APPEND_OPTIONS(XCFLAGS, ["-include ruby/config.h" "-include ruby/missing.h"]) + + AS_IF([test "$gcc_major" -lt 4], [ + AC_MSG_ERROR([too old GCC: $gcc_major.$gcc_minor]) + ]) ], [ linker_flag= ]) @@ -421,6 +477,39 @@ AC_SUBST(OUTFLAG) AC_SUBST(COUTFLAG) AC_SUBST(CSRCFLAG) +AS_CASE(["$build_os"], + [darwin*], [ + # gcc 13 warns duplicate -l options, which are added by the + # default spec. + # Xcode linker warns for deprecated architecture and wrongly + # installed TBD files. + AC_MSG_CHECKING(for $CC linker warning) + suppress_ld_waring=no + echo 'int main(void) {return 0;}' > conftest.c + AS_IF([$CC -framework Foundation -o conftest conftest.c 2>&1 | + grep \ + -e '^ld: warning: ignoring duplicate libraries:' \ + -e '^ld: warning: text-based stub file' \ + -e '^ld: warning: -multiply_defined is obsolete' \ + >/dev/null], [ + suppress_ld_waring=yes + ]) + rm -fr conftest* + test $suppress_ld_waring = yes && warnflags="${warnflags:+${warnflags} }-Wl,-w" + AC_MSG_RESULT($suppress_ld_waring) + ]) +AS_CASE(["$target_os"], + [wasi*], [ + # Clang linker automatically uses wasm-opt with -O if it found. + # https://github.com/llvm/llvm-project/blob/812828984c10857a4cd260eb638c52a4411f9143/clang/lib/Driver/ToolChains/WebAssembly.cpp#L95-L118 + # However optimization before asyncify causes misoptimization, + # so wrap clang to insert our fake wasm-opt, which does nothing, in PATH. + CC_WRAPPER=`cd -P "${tooldir}" && pwd`/wasm-clangw + CC="$CC_WRAPPER $CC" + + FIRSTMAKEFILE=GNUmakefile:wasm/GNUmakefile.in + ]) + cc_version= for option in --version -v -V -qversion; do cc_version_message=`$CC $option 2>&1` @@ -433,64 +522,26 @@ done AC_SUBST(CC_VERSION, $cc_version) AC_SUBST(CC_VERSION_MESSAGE, $cc_version_message) +: ${DLDFLAGS="$LDFLAGS"} + RUBY_UNIVERSAL_ARCH -AS_IF([test "$target_cpu" != "$host_cpu" -a "$GCC" = yes -a "$cross_compiling" = no -a "$universal_binary" = no], [ - RUBY_DEFAULT_ARCH("$target_cpu") -]) - -AS_CASE(["$target_cpu-$target_os"], [[i[3-6]86*]], [ - AC_CACHE_CHECK([for __sync_val_compare_and_swap], [rb_cv_gcc_compiler_cas], [ - AC_TRY_LINK([unsigned long atomic_var;], - [ - __sync_val_compare_and_swap(&atomic_var, 0, 1); - ], - [rb_cv_gcc_compiler_cas=yes], - [rb_cv_gcc_compiler_cas=no])]) - AS_IF([test "$rb_cv_gcc_compiler_cas" = no], [ - unset rb_cv_gcc_compiler_cas - save_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS -march=i486" - AC_CACHE_CHECK([for __sync_val_compare_and_swap with -march=i486], [rb_cv_gcc_compiler_cas], [ - AC_TRY_LINK([unsigned long atomic_var;], - [ - __sync_val_compare_and_swap(&atomic_var, 0, 1); - ], - [rb_cv_gcc_compiler_cas=yes - ARCH_FLAG="-march=i486"], - [rb_cv_gcc_compiler_cas=no])]) - CFLAGS="$save_CFLAGS" - ])]) - -AS_CASE(["$target_os"], [darwin*], [ -if libtool 2>&1 | grep no_warning_for_no_symbols > /dev/null; then - ac_cv_prog_ac_ct_RANLIB=: - ac_cv_prog_ac_ct_AR='libtool -static' - rb_cv_arflags='-no_warning_for_no_symbols -o' -fi -]) -AC_CHECK_TOOL(RANLIB, ranlib, :) -AC_CHECK_TOOL(AR, ar) -AS_IF([test -z "$AR"], [ - AC_CHECK_PROGS(AR, aal, ar) +AS_IF([test "$target_cpu" != "$host_cpu" -a "$GCC" = yes -a "${universal_binary:-no}" = no], [ + RUBY_DEFAULT_ARCH($target_cpu) ]) +host_os=$target_os +host_vendor=$target_vendor +host_cpu=$target_cpu +host=$target +host_alias=$target_alias + AC_CACHE_CHECK([for $AR flags], [rb_cv_arflags], [ AS_IF([$AR rcD conftest.a > /dev/null 2>&1 && rm conftest.a], [rb_cv_arflags=rcD], [rb_cv_arflags=rcu]) ]) AC_SUBST(ARFLAGS, ["$rb_cv_arflags "]) -AC_CHECK_TOOL(AS, as) -ASFLAGS=$ASFLAGS -AC_SUBST(ASFLAGS) - -AS_CASE(["$target_os"],[cygwin*|mingw*], [ac_cv_prog_ac_ct_OBJCOPY=":"]) - -# BSD's ports and MacPorts prefix GNU binutils with 'g' -AC_CHECK_TOOLS(OBJDUMP, [objdump gobjdump]) -AC_CHECK_TOOLS(OBJCOPY, [objcopy gobjcopy]) - AS_CASE(["$target_os"], -[cygwin*|mingw*], [ +[cygwin*|msys*|mingw*], [ AC_CHECK_TOOL(WINDRES, windres) AC_CHECK_TOOL(DLLWRAP, dllwrap) target=`echo $target | sed "s/^$target_cpu-/-/"` @@ -498,92 +549,40 @@ AS_CASE(["$target_os"], target_cpu=`echo $target_cpu | sed s/i.86/i386/` AS_CASE(["$target"], [-*], [ target="$target_cpu${target}"]) AS_CASE(["$target_alias"], [-*], [ target_alias="$target_cpu${target_alias}"]) + # cygwin/GNUmakefile.in is not exclusively for cygwin. + FIRSTMAKEFILE=GNUmakefile:cygwin/GNUmakefile.in AS_CASE(["$target_os"], [mingw*], [ test "$rb_cv_msvcrt" = "" && unset rb_cv_msvcrt AC_CACHE_CHECK(for mingw32 runtime DLL, rb_cv_msvcrt, [ - AC_TRY_LINK([@%:@include <stdio.h>], - [FILE* volatile f = stdin; return 0;], + AC_LINK_IFELSE([AC_LANG_PROGRAM([[@%:@include <stdio.h>]], + [[FILE* volatile f = stdin; return 0;]])], [rb_cv_msvcrt=`$OBJDUMP -p conftest$ac_exeext | tr A-Z a-z | - sed -n '/^[[ ]]*dll name: \(msvc.*\)\.dll$/{s//\1/p;q;}'`], + sed -n '/^[[ ]]*dll name: \(msvc.*\)\.dll$/{s//\1/p;q;}; + /^[[ ]]*dll name: \(ucrtbase\|api-ms-win-crt-.*\)\.dll$/{s//ucrt/p;q;}'`], [rb_cv_msvcrt=msvcrt]) test "$rb_cv_msvcrt" = "" && rb_cv_msvcrt=msvcrt]) RT_VER=`echo "$rb_cv_msvcrt" | tr -cd [0-9]` test "$RT_VER" = "" && RT_VER=60 + test "$rb_cv_msvcrt" = "ucrt" && RT_VER=140 AC_DEFINE_UNQUOTED(RUBY_MSVCRT_VERSION, $RT_VER) sysconfdir= ]) + rb_cv_binary_elf=no : ${enable_shared=yes} ], -[aix*], [AC_CHECK_TOOL(NM, nm, /usr/ccs/bin/nm, /usr/ccs/bin:$PATH)], [hiuxmpp*], [AC_DEFINE(__HIUX_MPP__)]) # by TOYODA Eizi <toyoda@npd.kishou.go.jp> -AC_CHECK_TOOL(NM, nm) AC_PROG_LN_S AC_PROG_MAKE_SET AC_PROG_INSTALL -AC_PROG_MKDIR_P -AS_IF([test "x$MKDIR_P" = "x -d"], [ - AS_IF([test x"$as_mkdir_p" != xfalse], [ - MKDIR_P='mkdir -p' - echo "use 'mkdir -p' as MKDIR_P" - ], [ - AC_MSG_ERROR([mkdir -p is required]) - ]) -]) -MAKEDIRS="$MKDIR_P" -AC_SUBST(MAKEDIRS) -AC_DEFUN([RUBY_DTRACE_AVAILABLE], -[AC_CACHE_CHECK(whether dtrace USDT is available, rb_cv_dtrace_available, -[ - echo "provider conftest{ probe fire(); };" > conftest_provider.d - rb_cv_dtrace_available=no - AS_FOR(opt, rb_dtrace_opt, ["-xnolibs" ""], [dnl - AS_IF([$DTRACE opt -h -o conftest_provider.h -s conftest_provider.d >/dev/null 2>/dev/null], - [], [continue]) - AC_TRY_COMPILE([@%:@include "conftest_provider.h"], [CONFTEST_FIRE();], - [], [continue]) - # DTrace is available on the system - rb_cv_dtrace_available=yes${rb_dtrace_opt:+"(opt)"} - break - ]) - rm -f conftest.[co] conftest_provider.[dho] -]) -AS_CASE(["$rb_cv_dtrace_available"], ["yes("*")"], - [DTRACE_OPT=`expr "$rb_cv_dtrace_available" : "yes(\(.*\))"`]) +AS_CASE(["$target_os"],[openbsd*],[ + ac_cv_path_mkdir="mkdir" ]) -AC_DEFUN([RUBY_DTRACE_POSTPROCESS], -[AC_CACHE_CHECK(whether $DTRACE needs post processing, rb_cv_prog_dtrace_g, -[ - rb_cv_prog_dtrace_g=no - AS_IF([{ - cat >conftest_provider.d <<_PROBES && - provider conftest { - probe fire(); - }; -_PROBES - $DTRACE ${DTRACE_OPT} -h -o conftest_provider.h -s conftest_provider.d >/dev/null 2>/dev/null && - : - }], [ - AC_TRY_COMPILE([@%:@include "conftest_provider.h"], [CONFTEST_FIRE();], [ - AS_IF([{ - cp -p conftest.${ac_objext} conftest.${ac_objext}.save && - $DTRACE ${DTRACE_OPT} -G -s conftest_provider.d conftest.${ac_objext} 2>/dev/null && - : - }], [ - AS_IF([cmp -s conftest.o conftest.${ac_objext}.save], [ - rb_cv_prog_dtrace_g=yes - ], [ - rb_cv_prog_dtrace_g=rebuild - ]) - ])]) - ]) - rm -f conftest.[co] conftest_provider.[dho] -]) -]) +RUBY_PROG_MAKEDIRS AC_CHECK_PROG([DTRACE], [${ac_tool_prefix}dtrace], [${ac_tool_prefix}dtrace]) AS_IF([test "$cross_compiling:$ac_cv_prog_DTRACE" = no: -a -n "$ac_tool_prefix"], [ @@ -593,11 +592,35 @@ AS_IF([test "$cross_compiling:$ac_cv_prog_DTRACE" = no: -a -n "$ac_tool_prefix"] AC_CHECK_PROGS(DOT, dot) AC_CHECK_PROGS(DOXYGEN, doxygen) -AC_CHECK_PROG(PKG_CONFIG, pkg-config, [pkg-config], [], [], - [`"$as_dir/$ac_word$ac_exec_ext" --print-errors --version > /dev/null 2>&1 || echo "$as_dir/$ac_word$ac_exec_ext"`]) +tool_warned=$ac_tool_warned ac_tool_warned=no +AC_CHECK_TOOL(PKG_CONFIG, pkg-config) +ac_tool_warned=$tool_warned +AS_IF([test -z "$PKG_CONFIG"], [], +["$PKG_CONFIG" --print-errors --version > /dev/null 2>&1], [], +[ + unset ac_cv_prog_PKG_CONFIG + PKG_CONFIG= + AC_MSG_WARN([$PKG_CONFIG does not work; ignore]) +]) -# checks for UNIX variants that set C preprocessor variables -AC_USE_SYSTEM_EXTENSIONS +AC_MSG_CHECKING([whether it is Android]) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + @%:@ifndef __ANDROID__ + @%:@error Not android + @%:@endif +]], [[]])], +[ + AC_MSG_RESULT(yes) + target_os=${target_os}-android + AS_IF([test "x$cross_compiling" = xno], [ + AC_MSG_CHECKING([for Android API version]) + # hacky workaround: https://github.com/termux/termux-packages/issues/6176 + rb_android_api=`getprop ro.build.version.sdk` + AC_MSG_RESULT($rb_android_api) + RUBY_APPEND_OPTIONS(CPPFLAGS, -D__ANDROID_API__=$rb_android_api -Wno-macro-redefined) + ]) +], +[AC_MSG_RESULT(no)]) AC_SUBST(RM, ['rm -f']) AC_SUBST(CP, ['cp']) @@ -630,36 +653,34 @@ rm -fr conf$$.dir AC_MSG_RESULT([$CHDIR]) AC_SUBST(CHDIR) +AS_CASE(["$FIRSTMAKEFILE"], [*GNUmakefile:*], [gnumake=yes], [ + AC_MSG_CHECKING([if ${MAKE-make} is GNU make]) + mkdir conftest.dir + echo "all:; @echo yes" > conftest.dir/GNUmakefile + echo "all:; @echo no" > conftest.dir/Makefile + gnumake=`(cd conftest.dir; ${MAKE-make})` + rm -fr conftest.dir + AS_CASE(["$gnumake"], + [*yes*], [ + FIRSTMAKEFILE=GNUmakefile:template/GNUmakefile.in + gnumake=yes], + [ + gnumake=no]) + AC_MSG_RESULT($gnumake) +]) } -{ # compiler section - -AC_DEFUN([RUBY_WERROR_FLAG], [dnl -save_CFLAGS="$CFLAGS" -CFLAGS="$CFLAGS $rb_cv_warnflags" -AS_IF([test "${ac_c_werror_flag+set}"], [ - rb_c_werror_flag="$ac_c_werror_flag" -], [ - unset rb_c_werror_flag -]) -ac_c_werror_flag=yes -$1 -CFLAGS="$save_CFLAGS" -save_CFLAGS= -AS_IF([test "${rb_c_werror_flag+set}"], [ - ac_c_werror_flag="$rb_c_werror_flag" -], [ - unset ac_c_werror_flag -])]) +[begin]_group "compiler section" && { RUBY_WERROR_FLAG([ AC_MSG_CHECKING([whether CFLAGS is valid]) - AC_TRY_COMPILE([], [], + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])], [AC_MSG_RESULT(yes)], [ AC_MSG_RESULT(no) AC_MSG_ERROR([something wrong with CFLAGS="$CFLAGS"]) ] ) + AC_MSG_CHECKING([whether LDFLAGS is valid]) { mkdir tmp.$$.try_link && @@ -668,7 +689,7 @@ RUBY_WERROR_FLAG([ echo '<?xml?><plist><dict><key>CFBundleIdentifier</key><string></string></dict></plist>' > Info.plist && : } || AC_MSG_ERROR([failed to make temporary directory]) - AC_TRY_LINK([], [], + AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[]])], [AC_MSG_RESULT(yes)], [ cd .. && rm -fr tmp.$$.try_link @@ -679,55 +700,58 @@ RUBY_WERROR_FLAG([ cd .. && rm -fr tmp.$$.try_link ]) -AC_DEFUN([RUBY_TRY_CFLAGS], [ - AC_MSG_CHECKING([whether ]$1[ is accepted as CFLAGS]) - RUBY_WERROR_FLAG([ - CFLAGS="[$]CFLAGS $1" - AC_TRY_COMPILE([$4], [$5], - [$2 - AC_MSG_RESULT(yes)], - [$3 - AC_MSG_RESULT(no)]) - ]) -]) - -AC_DEFUN([RUBY_TRY_LDFLAGS], [ - save_LDFLAGS="$LDFLAGS" - LDFLAGS="[$]LDFLAGS $1" - AC_MSG_CHECKING([whether $1 is accepted as LDFLAGS]) - RUBY_WERROR_FLAG([ - AC_TRY_LINK([$4], [$5], - [$2 - AC_MSG_RESULT(yes)], - [$3 - AC_MSG_RESULT(no)]) - ]) - LDFLAGS="$save_LDFLAGS" - save_LDFLAGS= -]) +: "rpath" && { + AC_CACHE_CHECK(whether ELF binaries are produced, rb_cv_binary_elf, + [AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[]])],[ + AS_CASE(["`head -1 conftest$EXEEXT | tr -dc '\177ELF' | tr '\177' .`"], + [.ELF*], [rb_cv_binary_elf=yes], [rb_cv_binary_elf=no])], + [rb_cv_binary_elf=no])]) -: ${DLDFLAGS="$LDFLAGS"} -: ${RPATHFLAG=''} -rpathflag='' -AS_IF([test x"${RPATHFLAG}" = x], [ - AS_CASE(["$target_os"], - [hpux*], [AS_IF([test "$rb_cv_prog_gnu_ld" = no], [rpathflag='+b '])], + rpathflag='' + AS_IF([test x"${RPATHFLAG=}" = x], [ + AS_CASE(["$target_os"], [aix*], [rpathflag='-blibpath:'], - [for rpathflag in -R "-rpath "; do + [for rpathflag in "-rpath " -R; do AS_CASE("$rpathflag", [*" "], [AS_CASE(["${linker_flag}"], [*,], [rpathflag=`echo "$rpathflag" | tr ' ' ,`])]) rpathflag="${linker_flag}${rpathflag}" RUBY_TRY_LDFLAGS([${rpathflag}.], [], [rpathflag=]) - AS_IF([test "x${rpathflag}" != x], []) + AS_IF([test "x${rpathflag}" != x], [break]) done]) -], [ - rpathflag=`echo "$RPATHFLAG" | sed 's/%.*//'` + ], [ + rpathflag=`echo "$RPATHFLAG" | sed 's/%.*//'` + ]) + + AC_ARG_ENABLE(rpath, + AS_HELP_STRING([--enable-rpath], [embed run path into extension libraries. + enabled by default on ELF platforms]), + [enable_rpath=$enableval], [enable_rpath="$rb_cv_binary_elf"]) + + AS_IF([test "$enable_rpath:${RPATHFLAG}" = yes:], [ + RPATHFLAG="${rpathflag:+${rpathflag}%1\$-s}" + ]) + AS_CASE([${RPATHFLAG}],[*'%1$'*],[: ${LIBPATHFLAG='-L%1$-s'}],[: ${LIBPATHFLAG='-L%s'}]) +} + +RUBY_TRY_LDFLAGS(-fdeclspec, [fdeclspec=yes], [fdeclspec=no]) +AS_IF([test "$fdeclspec" = yes], [ + RUBY_APPEND_OPTIONS(CFLAGS, -fdeclspec) + RUBY_APPEND_OPTIONS(cflags, -fdeclspec) + RUBY_APPEND_OPTIONS(orig_cflags, -fdeclspec) +]) +RUBY_TRY_CXXFLAGS(-fdeclspec, [fdeclspec=yes], [fdeclspec=no], [@%:@include <cstdio>]) +AS_IF([test "$fdeclspec" = yes], [ + RUBY_APPEND_OPTIONS(CXXFLAGS, -fdeclspec) ]) -AS_CASE([$RUBY_PATCHLEVEL], [-*], - [RUBY_DEVEL=yes], [RUBY_DEVEL=no]) -particular_werror_flags=$RUBY_DEVEL +AC_ARG_ENABLE(devel, + AS_HELP_STRING([--enable-devel], [enable development build]), + [RUBY_DEVEL=$enableval], + [AS_IF([test "x${RUBY_DEVEL-no}" != xyes], [RUBY_DEVEL=])] +)dnl +AC_SUBST(RUBY_DEVEL) +particular_werror_flags=${RUBY_DEVEL:-no} AC_ARG_ENABLE(werror, AS_HELP_STRING([--disable-werror], [don't make warnings into errors @@ -736,39 +760,51 @@ AC_ARG_ENABLE(werror, [particular_werror_flags=$enableval]) rb_cv_warnflags="$warnflags" -AS_IF([test "$GCC:${warnflags+set}:no" = yes::no], [ - AS_IF([test $gcc_major -ge 4], [ - extra_warning=-Werror=extra-tokens +AS_CASE(["$GCC:${warnflags+set}:${extra_warnflags:+set}:"], +[yes::*|yes:*:set:], [# GCC && (!warnflags || extra_warnflags) + AS_IF([test $gcc_major -le 6], [ + extra_warnflags="$extra_warnflags -Wno-maybe-uninitialized" + ]) + AS_CASE([ $CFLAGS ], [*" -save-temps="*|*" -save-temps "*], [], [ + extra_warnflags="$extra_warnflags -Werror=misleading-indentation" + ]) + AS_CASE([$target_os], [mingw*], [ + # 64bit Windows is IL32P64; shorten-64-to-32 causes tons of warnigs + extra_warnflags="$extra_warnflags -Wno-shorten-64-to-32" ], [ - extra_warning= + extra_warnflags="$extra_warnflags -Werror=shorten-64-to-32" ]) - AS_IF([test $gcc_major -ge 5 -a $gcc_major -le 6], [ - extra_warning="$extra_warning -Wno-maybe-uninitialized" + + # ICC doesn't support -Werror= + AS_IF([test $icc_version -gt 0], [ + particular_werror_flags=no ]) - for wflag in -Wno-unused-parameter -Wno-parentheses -Wno-long-long \ - -diag-disable=2259 \ - -Wno-missing-field-initializers \ - -Wno-tautological-compare \ - -Wno-parentheses-equality \ - -Wno-constant-logical-operand \ - -Wno-self-assign \ - -Wunused-variable \ + for wflag in \ + -Werror=extra-tokens \ + -Werror=deprecated-declarations \ + -Werror=division-by-zero -Werror=div-by-zero \ + -Werror=duplicated-cond \ + -Werror=implicit-function-declaration \ -Werror=implicit-int \ -Werror=pointer-arith \ -Werror=write-strings \ - -Werror=declaration-after-statement \ - -Werror=shorten-64-to-32 \ - -Werror=implicit-function-declaration \ - -Werror=division-by-zero \ - -Werror=deprecated-declarations \ - -Werror=misleading-indentation \ + -Werror=old-style-definition \ + -Wimplicit-fallthrough=0 \ + -Wmissing-noreturn \ + -Wno-cast-function-type \ + -Wno-long-long \ + -Wno-missing-field-initializers \ + -Wno-overlength-strings \ -Wno-packed-bitfield-compat \ - -Wsuggest-attribute=noreturn \ + -Wno-tautological-compare \ + -Wno-unused-parameter \ + -Wno-unused-value \ -Wsuggest-attribute=format \ - -Wimplicit-fallthrough=0 \ - -Werror=duplicated-cond \ - -Werror=restrict \ - $extra_warning \ + -Wsuggest-attribute=noreturn \ + -Wunused-variable \ + -diag-disable=175,188,1684,2259,2312 \ + $clang_warnflags \ + $extra_warnflags \ ; do AS_IF([test "$particular_werror_flags" != yes], [ wflag=`echo x$wflag | sed 's/^x-Werror=/-W/;s/^x//'` @@ -786,6 +822,18 @@ AS_IF([test "$GCC:${warnflags+set}:no" = yes::no], [ ]) ]) done + AS_IF([test "$particular_werror_flags" = "yes"], [ + wflag=-Werror=undef + ], [ + wflag=-Wundef + ]) + RUBY_TRY_CFLAGS($wflag, [ + RUBY_APPEND_OPTIONS(warnflags, $wflag) + ], [], [ + @%:@if !defined(RUBY_CONFIG_TEST_NEVER_DEFINED_SYMBOL) + @%:@elif RUBY_CONFIG_TEST_NEVER_DEFINED_SYMBOL + @%:@endif + ]) AS_CASE([" $warnflags "],[*" -Wno-missing-field-initializers "*], [wflag="-Wall -Wextra"], [wflag=-Wall]) RUBY_TRY_CFLAGS($wflag, [warnflags="$wflag${warnflags+ $warnflags}"]) @@ -794,20 +842,22 @@ AS_IF([test "$GCC:${warnflags+set}:no" = yes::no], [ warnflags= ]) RUBY_TRY_CFLAGS(-Qunused-arguments, [RUBY_APPEND_OPTIONS(rb_cv_wsuppress_flags, -Qunused-arguments)]) - -for n in infinity nan; do - m=AS_TR_CPP($n) - AC_CACHE_CHECK([whether $m is available without C99 option], rb_cv_$n, - [AC_COMPILE_IFELSE( - [AC_LANG_BOOL_COMPILE_TRY(AC_INCLUDES_DEFAULT([@%:@include <math.h> -@%:@ifndef $m -@%:@error no $m -@%:@endif -]), [1])], [eval rb_cv_$n=yes], [eval rb_cv_$n=no])]) - AS_IF([eval test '"$rb_cv_'$n'"' = yes], [ - AC_DEFINE_UNQUOTED([HAVE_]$m) - ]) -done +AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([ +@%:@if !(defined(__SUNPRO_C)||defined(__SUNPRO_CC)) +@%:@error not sunpro +@%:@endif],[])], [ + for e in \ + E_STATEMENT_NOT_REACHED \ + E_INIT_SIGN_EXTEND \ + E_INIT_DOES_NOT_FIT \ + E_INITIALIZATION_TYPE_MISMATCH + do + RUBY_TRY_CFLAGS([-erroff=${e}], [ + RUBY_APPEND_OPTIONS(rb_cv_warnflags, [-erroff=${e}]) + ]) + done +]) AC_ARG_WITH(compress-debug-sections, AS_HELP_STRING([--with-compress-debug-sections=type], @@ -820,23 +870,80 @@ AS_IF([test "$GCC" = yes], [ # argument check. The performance drop is very little and Ubuntu enables # _FORTIFY_SOURCE=2 by default. So, let's support it for protecting us from # a mistake of silly C extensions. - RUBY_TRY_CFLAGS(-D_FORTIFY_SOURCE=2, [RUBY_APPEND_OPTION(XCFLAGS, -D_FORTIFY_SOURCE=2)]) - # -fstack-protector + # TODO: check if link succeeds with _FORTIFY_SOURCE=2. AS_CASE(["$target_os"], [mingw*], [ + fortify_source=no + ]) + AC_ARG_ENABLE(fortify_source, + AS_HELP_STRING([--disable-fortify-source], + [disable -D_FORTIFY_SOURCE=2 option, which causes link error on mingw]), + [fortify_source=$enableval]) + AS_IF([test "x$fortify_source" != xno], [ + RUBY_TRY_CFLAGS([$optflags -D_FORTIFY_SOURCE=2], + [RUBY_PREPEND_OPTION(hardenflags, -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2)], [], + [@%:@include <stdio.h>]) + ]) + + # -fstack-protector + AS_CASE(["$target_os"], + [emscripten*|wasi*], [ stack_protector=no ]) AS_IF([test -z "${stack_protector+set}"], [ - RUBY_TRY_CFLAGS(-fstack-protector, [stack_protector=yes], [stack_protector=no]) - AS_IF([test "x$stack_protector" = xyes], [ - RUBY_TRY_LDFLAGS(-fstack-protector, [], [stack_protector=broken]) + AS_FOR(option, opt, [-fstack-protector-strong -fstack-protector], [ + RUBY_TRY_CFLAGS(option, [stack_protector=yes]) + AS_IF([test "x$stack_protector" = xyes], [ + RUBY_TRY_LDFLAGS(option, [], [stack_protector=]) + ]) + AS_IF([test "x$stack_protector" = xyes], [stack_protector=option; break]) ]) ]) - AS_IF([test "x$stack_protector" = xyes], [ - RUBY_APPEND_OPTION(XCFLAGS, -fstack-protector) - RUBY_APPEND_OPTION(XLDFLAGS, -fstack-protector) - RUBY_APPEND_OPTION(LDFLAGS, -fstack-protector) + AC_MSG_CHECKING([for -fstack-protector]) + AC_MSG_RESULT(["$stack_protector"]) + AS_CASE(["$stack_protector"], [-*], [ + RUBY_PREPEND_OPTION(hardenflags, $stack_protector) + RUBY_APPEND_OPTION(XLDFLAGS, $stack_protector) + RUBY_APPEND_OPTION(LDFLAGS, $stack_protector) + ]) + + # aarch64 branch protection + AS_CASE(["$target_cpu"], [aarch64|arm64], [ + # LLVM libunwind is not actually capable of unwinding code compiled with pointer + # authentication unless it's built without LIBUNWIND_ENABLE_CROSS_UNWINDING (see + # https://github.com/llvm/llvm-project/blob/8e35c86977ce5529a9387657321ac9fefcdae5b5/libunwind/src/DwarfInstructions.hpp#L294) + # It seems that macOS ships LLVM compiled this way. + # Detect this and disable automatic insertion of pac-ret flags in that case, since we assume + # that reliable backtraces are more important than hardening flags. + AC_MSG_CHECKING([for a broken LLVM libunwind that cannot unwind code with RA signing]) + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + @%:@include <libunwind.h> + int foo = UNW_ECROSSRASIGNING; + ]])], + # If compilation succeeds, that means we a) had libunwind, and b) it was NOT native only + [rb_cv_libunwind_broken_ra_signing=yes], + # if compilation fails, that means we either a) do not have libunwind, or b) have it in + # native only mode (which is good!) + [rb_cv_libunwind_broken_ra_signing=no] + ) + AC_MSG_RESULT(["$rb_cv_libunwind_broken_ra_signing"]) + AS_IF([test "x$rb_cv_libunwind_broken_ra_signing" = "xno"], [ + AS_FOR(option, opt, [-mbranch-protection=pac-ret -msign-return-address=all], [ + # Try these flags in the _prepended_ position - i.e. we want to try building a program + # with CFLAGS="-mbranch-protection=pac-ret $CFLAGS". If the builder has provided different + # branch protection flags in CFLAGS, we don't want to overwrite those. We just want to + # find some branch protection flags which work if none were provided. + RUBY_TRY_CFLAGS_PREPEND(option, [branch_protection=yes], [branch_protection=no]) + AS_IF([test "x$branch_protection" = xyes], [ + # _prepend_ the options to CFLAGS, so that user-provided flags will overwrite them. + # These CFLAGS are used during the configure script to compile further test programs; + # however, $harden_flags is prepended separately to CFLAGS at the end of the script. + RUBY_PREPEND_OPTION(hardenflags, $opt) + break + ]) + ]) + ]) ]) AS_CASE("${compress_debug_sections:-zlib}", @@ -856,7 +963,7 @@ AS_IF([test "$GCC" = yes], [ # comments. We bypass ANSI C mode for them. Otherwise # extension libs cannot include those headers. - # Since math.h in some mingw64 wrongly delcares frexp and modf + # Since math.h in some mingw64 wrongly declares frexp and modf # to be pure, the variables pointed by the second arguments are # considered uninitialized unexpectedly. AC_CACHE_CHECK([whether frexp and modf are broken], @@ -868,13 +975,13 @@ AS_IF([test "$GCC" = yes], [ ], [ CFLAGS="$CFLAGS -Werror -Wuninitialized" ]) - AC_TRY_COMPILE([@%:@include <math.h> + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include <math.h> int foo(double x) { int exp; frexp(x, &exp); return exp; - }], [if (foo(0.0)) return 1;], + }]], [[if (foo(0.0)) return 1;]])], [rb_cv_mingw64_broken_frexp_modf=no], [rb_cv_mingw64_broken_frexp_modf=yes]) CFLAGS="$save_CFLAGS" @@ -883,37 +990,24 @@ AS_IF([test "$GCC" = yes], [ AC_DEFINE(RUBY_MINGW64_BROKEN_FREXP_MODF) ]) ], - [cygwin*|darwin*|netbsd*], [ - # need lgamma_r(), finite() - ], - [ - # ANSI (no XCFLAGS because this is C only) - for ansi_options in -std=gnu99; do - RUBY_TRY_CFLAGS(${ansi_options}, [ - RUBY_APPEND_OPTIONS(warnflags, ${ansi_options}) - RUBY_APPEND_OPTIONS(strict_warnflags, ${ansi_options}) - ], [ansi_options=]) - test "x${ansi_options}" = x || break - done + [cygwin*|msys*|darwin*|netbsd*], [ + # need lgamma_r() ]) # suppress annoying -Wstrict-overflow warnings RUBY_TRY_CFLAGS(-fno-strict-overflow, [RUBY_APPEND_OPTION(XCFLAGS, -fno-strict-overflow)]) - test "${debugflags+set}" || {RUBY_TRY_CFLAGS(-ggdb3, [debugflags=-ggdb3])} - test "${debugflags+set}" || {RUBY_TRY_CFLAGS(-ggdb, [debugflags=-ggdb])} - test "${debugflags+set}" || {RUBY_TRY_CFLAGS(-g3, [debugflags=-g3])} + test "${debugflags+set}" || {RUBY_TRY_LDFLAGS(-ggdb3, [debugflags=-ggdb3])} + test "${debugflags+set}" || {RUBY_TRY_LDFLAGS(-ggdb, [debugflags=-ggdb])} + test "${debugflags+set}" || {RUBY_TRY_LDFLAGS(-g3, [debugflags=-g3])} ]) test $ac_cv_prog_cc_g = yes && : ${debugflags=-g} -AS_IF([test "x$RUBY_DEVEL" = xyes], [RUBY_APPEND_OPTION(XCFLAGS, -DRUBY_DEVEL=1)]) AS_IF([test "$GCC" = ""], [ AS_CASE(["$target_os"],[aix*],[warnflags="$warnflags -qinfo=por" rb_cv_warnflags="$rb_cv_warnflags -qinfo=por"]) ]) AS_IF([test "$GCC" = yes], [ - AS_IF([test "$gcc_major" -ge 4], [ - RUBY_TRY_CFLAGS(-fvisibility=hidden, [visibility_option=yes], [visibility_option=no]) - ]) + RUBY_TRY_CFLAGS(-fvisibility=hidden, [visibility_option=yes], [visibility_option=no]) AC_SUBST(WERRORFLAG, "-Werror") AS_IF([test "$visibility_option" = yes], [ RUBY_APPEND_OPTION(XCFLAGS, -fvisibility=hidden) @@ -922,7 +1016,6 @@ AS_IF([test "$GCC" = yes], [ ], [ RUBY_TRY_LDFLAGS([-Wl,-unexported_symbol,_Init_*], [visibility_option=ld], [visibility_option=no]) ]) - test "$visibility_option" = no || OBJCOPY=: ]) AS_IF([test "$GCC" = yes], [ @@ -938,110 +1031,139 @@ AS_IF([test "$GCC" = yes], [ # disable fast-math for oflag in -fno-fast-math; do - RUBY_TRY_CFLAGS($oflag, [RUBY_APPEND_OPTION(CFLAGS, $oflag)]) + RUBY_TRY_CFLAGS($oflag, [RUBY_APPEND_OPTION(optflags, $oflag)]) done for oflag in -fexcess-precision=standard -fp-model\ precise; do RUBY_TRY_CFLAGS($oflag, [RUBY_APPEND_OPTION(XCFLAGS, $oflag)]) done ]) +AS_CASE(["$target_cpu"], [[i[3-6]86*]], [ + AC_CACHE_CHECK([for __sync_val_compare_and_swap], [rb_cv_gcc_compiler_cas], [ + AC_LINK_IFELSE([AC_LANG_PROGRAM([[unsigned long atomic_var;]], + [[__sync_val_compare_and_swap(&atomic_var, 0, 1);]])], + [rb_cv_gcc_compiler_cas=yes], + [ + save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -march=i486" + AC_LINK_IFELSE([AC_LANG_PROGRAM([[unsigned long atomic_var;]], + [[__sync_val_compare_and_swap(&atomic_var, 0, 1);]])], + [rb_cv_gcc_compiler_cas=i486], + [rb_cv_gcc_compiler_cas=no]) + CFLAGS="$save_CFLAGS" + ]) + ]) + AS_IF([test "$rb_cv_gcc_compiler_cas" = i486], [ARCH_FLAG="-march=i486"]) +]) + +OPT_DIR= +AC_ARG_WITH([gmp-dir], + AS_HELP_STRING([--with-gmp-dir=DIR], + [specify the prefix directory where gmp is installed]), + [OPT_DIR="${OPT_DIR:+$OPT_DIR$PATH_SEPARATOR}$withval"], []) +AC_ARG_WITH([gmp], + [AS_HELP_STRING([--without-gmp], + [disable GNU GMP to accelerate Bignum operations])], + [], [with_gmp=yes]) + AC_ARG_WITH(opt-dir, AS_HELP_STRING([--with-opt-dir=DIR-LIST], [add optional headers and libraries directories separated by $PATH_SEPARATOR]), - [ - val=`echo "$PATH_SEPARATOR$withval" | sed "s|$PATH_SEPARATOR\([[^$PATH_SEPARATOR]*]\)| -I\1/include|g;s/^ //"` - CPPFLAGS="$CPPFLAGS $val" - val=`echo "$PATH_SEPARATOR$withval" | sed "s|$PATH_SEPARATOR\([[^$PATH_SEPARATOR]*]\)| -L\1/lib${rpathflag:+ $rpathflag\\\\1/lib}|g;s/^ //"` - LDFLAGS="$LDFLAGS $val" - LDFLAGS_OPTDIR="$val" - OPT_DIR="$withval" - ], [OPT_DIR=]) + [OPT_DIR="${OPT_DIR:+$OPT_DIR$PATH_SEPARATOR}$withval"], []) + +AS_IF([test "x$OPT_DIR" != x], [ + save_IFS="$IFS" IFS="$PATH_SEPARATOR" val= PWD= + for dir in $OPT_DIR; do + test -z "$dir" && continue + dir=`eval $CHDIR '"$dir"' 2>/dev/null && pwd` || continue + val="${val:+$val$PATH_SEPARATOR}$dir" + done + IFS="$save_IFS" OPT_DIR="$val" + unset PWD + unset save_IFS + val=`IFS="$PATH_SEPARATOR" + for dir in $OPT_DIR; do + echo x ${LIBPATHFLAG} ${RPATHFLAG} | + sed "s/^x *//;s${IFS}"'%1\\$-s'"${IFS}${dir}/lib${IFS}g;s${IFS}%s${IFS}${dir}/lib${IFS}g" + done | tr '\012' ' ' | sed 's/ *$//'` + LDFLAGS="${LDFLAGS:+$LDFLAGS }$val" + DLDFLAGS="${DLDFLAGS:+$DLDFLAGS }$val" + LDFLAGS_OPTDIR="$val" + INCFLAGS="${INCFLAGS:+$INCFLAGS }"`echo "$OPT_DIR" | tr "${PATH_SEPARATOR}" '\012' | + sed '/^$/d;s|^|-I|;s|$|/include|' | tr '\012' ' ' | sed 's/ *$//'` +]) +AC_SUBST(incflags, "$INCFLAGS") test -z "${ac_env_CFLAGS_set}" -a -n "${cflags+set}" && eval CFLAGS="\"$cflags $ARCH_FLAG\"" test -z "${ac_env_CXXFLAGS_set}" -a -n "${cxxflags+set}" && eval CXXFLAGS="\"$cxxflags $ARCH_FLAG\"" + +AC_CACHE_CHECK([whether compiler has statement and declarations in expressions], + rb_cv_have_stmt_and_decl_in_expr, + [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]],[[ __extension__ ({ int a = 0; a; }); ]])], + [rb_cv_have_stmt_and_decl_in_expr=yes], + [rb_cv_have_stmt_and_decl_in_expr=no])]) +AS_IF([test "$rb_cv_have_stmt_and_decl_in_expr" = yes], [ + AC_DEFINE(HAVE_STMT_AND_DECL_IN_EXPR) +]) } -{ # header and library section +[begin]_group "header and library section" && { AC_ARG_WITH(winnt-ver, - AS_HELP_STRING([--with-winnt-ver=0xXXXX], [target Windows NT version (default to 0x0501)]), - [with_winnt_ver="$withval"], [with_winnt_ver="0x0501"]) + AS_HELP_STRING([--with-winnt-ver=0xXXXX], [target Windows NT version (default to 0x0600)]), + [with_winnt_ver="$withval"], [with_winnt_ver="0x0600"]) AS_CASE(["$target_os"], [mingw*], [ RUBY_APPEND_OPTION(CPPFLAGS, -D_WIN32_WINNT=$with_winnt_ver) RUBY_APPEND_OPTION(CPPFLAGS, -D__MINGW_USE_VC2005_COMPAT) ]) -AS_CASE(["$target_os"], -[freebsd*], [ - AC_CACHE_CHECK([whether pthread should be enabled by default], - rb_cv_enable_pthread_default, - [AC_TRY_CPP([ -#include <osreldate.h> -#if __FreeBSD_version < 502102 -#error pthread should be disabled on this platform -#endif - ], - rb_cv_enable_pthread_default=yes, - rb_cv_enable_pthread_default=no)]) - enable_pthread=$rb_cv_enable_pthread_default - ], -[mingw*], [ - enable_pthread=no - ], -[ - enable_pthread=yes - ]) +RUBY_THREAD dnl Checks for libraries. AS_CASE(["$target_os"],[*bsd*|dragonfly*],[],[ac_cv_func_daemon=no]) +AS_CASE(["$target_os"], [*android*], [ + AS_CASE(["$target_cpu"], [arm*], [ + ac_cv_func___builtin_setjmp=no + ]) +]) + +AS_UNSET(ORIG_LIBS) POSTLINK=: AC_SUBST(POSTLINK) +cleanlibs= +AC_SUBST(cleanlibs) AS_CASE(["$target_os"], [nextstep*], [ ], [openstep*], [ ], [rhapsody*], [ ], -[darwin*], [ RUBY_PREPEND_OPTION(LIBS, -lobjc) +[darwin*], [ + ORIG_LIBS="$LIBS" + RUBY_PREPEND_OPTION(LIBS, -lobjc) RUBY_APPEND_OPTIONS(CPPFLAGS, -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT) - AC_MSG_CHECKING(whether Mac OS X 10.5 or later) - AC_TRY_CPP([#include <AvailabilityMacros.h> - #if MAC_OS_X_VERSION_MAX_ALLOWED <= 1040 - #error pre OS X 10.4 - [!<===== pre OS X 10.4 =====>] - #endif - ], - [macosx_10_5=yes], [macosx_10_5=no]) - AC_MSG_RESULT($macosx_10_5) - AS_IF([test "${target_os@%:@darwin}" -ge 16], [ + AC_CACHE_CHECK([whether syscall(2) is deprecated], rb_cv_syscall_deprecated, + [RUBY_WERROR_FLAG([ + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include <unistd.h>]], + [[if (syscall(0)) return 1;]])], + [rb_cv_syscall_deprecated=no], + [rb_cv_syscall_deprecated=yes])])]) + AS_IF([test $rb_cv_syscall_deprecated = yes], [ ac_cv_func___syscall=no ac_cv_func_syscall=no ac_cv_header_sys_syscall_h=no ac_cv_header_syscall_h=no ]) - AS_IF([test $macosx_10_5 = yes], [ - ac_cv_func_getcontext=no - ac_cv_func_setcontext=no - ], [ - AC_DEFINE(BROKEN_SETREUID, 1) - AC_DEFINE(BROKEN_SETREGID, 1) - ]) - incs=`$CC -v -E -xc - < /dev/null 2>&1 | sed ['1,/^@%:@include </d;s/^ *//;s|[^./][^/]*/\.\./||g;/\/include$/!d;s||/lib|;/\/usr\/lib/d']` - for d in `$CC -print-search-dirs | sed -e '/^libraries: */!d;s///' | tr : '\012' | fgrep -v /../ | sed -n 's|^\(/.*/lib\)/$|\1|p'`; do - incs=`echo "$incs" | fgrep -v "$d"` - done - for d in $incs; do - test -d "$d" && RUBY_APPEND_OPTIONS(LDFLAGS, "-L$d") - done + ac_cv_func_getcontext=no + ac_cv_func_setcontext=no ac_cv_type_getgroups=gid_t # getgroups() on Rosetta fills garbage ac_cv_lib_crypt_crypt=no ac_cv_func_fdatasync=no # Mac OS X wrongly reports it has fdatasync() ac_cv_func_vfork=no - AS_IF([test $gcc_major -lt 4 -o \( $gcc_major -eq 4 -a $gcc_minor -lt 3 \)], [ + AS_IF([test $gcc_major -eq 4 -a $gcc_minor -lt 3], [ ac_cv_func___builtin_setjmp=no ]) AC_CACHE_CHECK(for broken crypt with 8bit chars, rb_cv_broken_crypt, - [AC_TRY_RUN([ + [AC_RUN_IFELSE([AC_LANG_SOURCE([[ #include <stdio.h> #include <unistd.h> #include <string.h> @@ -1078,7 +1200,7 @@ main() } return 0; } -], +]])], rb_cv_broken_crypt=no, rb_cv_broken_crypt=yes, rb_cv_broken_crypt=yes)]) @@ -1087,65 +1209,50 @@ main() ]) POSTLINK="" AC_CHECK_PROGS(codesign, codesign) - AC_CHECK_PROGS(dsymutil, dsymutil) + dsymutils= + AS_CASE("$CC_NO_WRAPPER", [gcc*-1[[3-9]]], [ + dsymutils=${CC_NO_WRAPPER@%:@gcc} + dsymutils=dsymutil${dsymutils%-1*} + dsymutils="$dsymutils-19 $dsymutils-18 $dsymutils-17" + ]) + AC_CHECK_PROGS(dsymutil, $dsymutils dsymutil) AS_IF([test -n "$codesign"], [ - POSTLINK="{ test -z '\$(RUBY_CODESIGN)' || $codesign -s '\$(RUBY_CODESIGN)' -f \$@; }${POSTLINK:+; $POSTLINK}" + POSTLINK="{ test -z '\$(RUBY_CODESIGN)' || $codesign -s '\$(RUBY_CODESIGN)' \$@; }${POSTLINK:+; $POSTLINK}" ]) AS_IF([test -n "$dsymutil"], [ - POSTLINK="$dsymutil \$@${POSTLINK:+; $POSTLINK}" - ]) - AS_IF([test -n "${POSTLINK}"], [ - LINK_SO="$LINK_SO -\$(POSTLINK)" + POSTLINK="$dsymutil \$@ 2>/dev/null${POSTLINK:+; $POSTLINK}" ]) AC_CHECK_HEADERS(crt_externs.h, [], [], [ #include <crt_externs.h> ]) + cleanlibs='$(TARGET_SO:=.dSYM)' ], -[hpux*], [ LIBS="-lm $LIBS" - ac_cv_c_inline=no], [solaris*], [ LIBS="-lm $LIBS" ac_cv_func_vfork=no AC_MSG_CHECKING(whether _XOPEN_SOURCE is already given) - AC_TRY_COMPILE([#include <unistd.h> - #ifndef _XOPEN_SOURCE - #error _XOPEN_SOURCE is not defined - #endif - ], [], - [given_xopen_source=yes], [given_xopen_source=no]) + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <unistd.h> + #ifndef _XOPEN_SOURCE + #error _XOPEN_SOURCE is not defined + #endif + ]], [[]])], + [given_xopen_source=yes], [given_xopen_source=no]) AC_MSG_RESULT($given_xopen_source) AS_IF([test $given_xopen_source = no], [ - # On Solaris, with gcc, -std=iso9899:1999 in $ansi_options - # is often also needed in CPPFLAGS, because some feature - # definitions vary depending on such standards options. - AS_CASE(["${ansi_options}"], - [*-std=iso9899:1999*], [ - RUBY_APPEND_OPTIONS(CPPFLAGS, ${ansi_options}) - ]) AC_MSG_CHECKING(appropriate _XOPEN_SOURCE value to define) define_xopen_source="" for tmp_xpg in 7 6 5; do AS_IF([test x"$define_xopen_source" != x], [ - break + break ]) - # Both AC_TRY_CPP and AC_TRY_COMPILE should pass - # because some options may not be set to CPPFLAGS. - AC_TRY_CPP([ + RUBY_WERROR_FLAG([AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #define _XOPEN_SOURCE ${tmp_xpg}00 #include <unistd.h> #ifndef _XPG${tmp_xpg} #error _XPG${tmp_xpg} should be defined by _XOPEN_SOURCE=${tmp_xpg}00 #endif - ], [ - AC_TRY_COMPILE([ - #define _XOPEN_SOURCE ${tmp_xpg}00 - #include <unistd.h> - #ifndef _XPG${tmp_xpg} - #error _XPG${tmp_xpg} should be defined by _XOPEN_SOURCE=${tmp_xpg}00 - #endif - ], [], + ]], [[]])], [define_xopen_source=${tmp_xpg}00], []) - ], []) + ]) done AS_IF([test x"$define_xopen_source" = x], [ define_xopen_source=no @@ -1153,19 +1260,33 @@ main() AC_MSG_RESULT($define_xopen_source) AS_IF([test x"$define_xopen_source" != xno], [ RUBY_APPEND_OPTIONS(CPPFLAGS, -D_XOPEN_SOURCE=$define_xopen_source) + # _XOPEN_SOURCE should not be defined for C++ on Solaris. + RUBY_APPEND_OPTIONS(CXXFLAGS, -U_XOPEN_SOURCE) + ]) + ]) + AC_CHECK_TYPES([caddr_t],[],[],[@%:@include <sys/types.h>]) + AC_CACHE_CHECK([whether madvise declaration is needed], rb_cv_madvice_prototype_using_caddr_t, + [RUBY_WERROR_FLAG([AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + @%:@include <sys/unistd.h> + @%:@include <sys/mman.h> + @%:@include <sys/types.h> + extern int madvise(caddr_t, size_t, int); + ]], [[]])], + [rb_cv_madvice_prototype_using_caddr_t=yes], [rb_cv_madvice_prototype_using_caddr_t=no]) ]) ]) + AS_IF([test $rb_cv_madvice_prototype_using_caddr_t = yes], [AC_DEFINE(NEED_MADVICE_PROTOTYPE_USING_CADDR_T, 1)]) ], [haiku*], [ LIBS="$LIBS" # m lib is include in root ], -[cygwin*], [ ac_cv_header_langinfo_h=yes +[cygwin*|msys*], [ + ac_cv_header_langinfo_h=yes RUBY_APPEND_OPTIONS(CPPFLAGS, -D_XOPEN_SOURCE -D_GNU_SOURCE) AC_CHECK_FUNCS(cygwin_conv_path) AC_LIBOBJ([langinfo]) ], -[mingw*], [ LIBS="-lshell32 -lws2_32 -liphlpapi -limagehlp -lshlwapi $LIBS" - ac_cv_header_a_out_h=no +[mingw*], [ LIBS="-lshell32 -lws2_32 -liphlpapi -limagehlp -lshlwapi -lbcrypt $LIBS" ac_cv_header_pwd_h=no ac_cv_header_utime_h=no ac_cv_header_sys_ioctl_h=no @@ -1175,42 +1296,47 @@ main() ac_cv_header_sys_time_h=no ac_cv_header_sys_times_h=no ac_cv_header_sys_socket_h=no + ac_cv_func_chown=yes + ac_cv_func_getegid=yes + ac_cv_func_geteuid=yes + ac_cv_func_getgid=yes + ac_cv_func_getuid=yes + ac_cv_func_execv=yes ac_cv_func_lstat=yes ac_cv_func_times=yes ac_cv_func_waitpid=yes ac_cv_func_fsync=yes ac_cv_func_seekdir=yes ac_cv_func_telldir=yes - ac_cv_func_isinf=yes - ac_cv_func_isnan=yes - ac_cv_func_finite=yes ac_cv_func_lchown=yes ac_cv_func_link=yes ac_cv_func_readlink=yes + ac_cv_func_shutdown=yes ac_cv_func_symlink=yes + ac_cv_func_clock_getres=yes + ac_cv_func_clock_gettime=yes ac_cv_lib_crypt_crypt=no ac_cv_func_getpgrp_void=no ac_cv_func_memcmp_working=yes ac_cv_lib_dl_dlopen=no - rb_cv_binary_elf=no - rb_cv_negative_time_t=no + rb_cv_negative_time_t=yes ac_cv_func_fcntl=yes ac_cv_func_flock=yes ac_cv_func_gmtime_r=yes rb_cv_large_fd_select=yes ac_cv_type_struct_timeval=yes - ac_cv_func_clock_gettime=yes - ac_cv_func_clock_getres=yes ac_cv_func_malloc_usable_size=no + ac_cv_type_off_t=yes + ac_cv_sizeof_off_t=8 AS_IF([test "$target_cpu" = x64], [ - ac_cv_func___builtin_setjmp=no + ac_cv_func___builtin_setjmp=yes ac_cv_func_round=no + ac_cv_func_tgamma=no ]) - ac_cv_func_tgamma=no - rb_cv_negative_time_t=yes AC_CHECK_TYPE([NET_LUID], [], [], [@%:@include <winsock2.h> - @%:@include <iphlpapi.h>]) + @%:@include <windows.h> + @%:@include <iphlpapi.h>]) AS_IF([test x"$ac_cv_type_NET_LUID" = xyes], [ AC_DEFINE(HAVE_TYPE_NET_LUID, 1) ]) @@ -1231,18 +1357,64 @@ main() [netbsd*], [ LIBS="-lm $LIBS" ], [dragonfly*], [ LIBS="-lm $LIBS" - # isinf() and isnan() are macros on DragonFly. - ac_cv_func_isinf=yes - ac_cv_func_isnan=yes ], [aix*],[ LIBS="-lm $LIBS" ac_cv_func_round=no + ac_cv_func___builtin_setjmp=no + ], +[linux*],[ LIBS="-lm $LIBS" + # __builtin_longjmp in ppc64* Linux does not restore + # the TOC register (r2), which is problematic + # when a global exit happens from JITted .so code. + # __builtin_setjmp can have issues on arm64 linux (see [Bug #14480]). + AS_CASE(["$target_cpu"], [powerpc64*|arm64|aarch64], [ + ac_cv_func___builtin_setjmp=no + ]) + ], +[emscripten*], [LIBS="-lm -lc $LIBS" + RUBY_APPEND_OPTIONS(LDFLAGS, "-sALLOW_MEMORY_GROWTH=1") + RUBY_APPEND_OPTIONS(LDFLAGS, "-sASYNCIFY") + RUBY_APPEND_OPTIONS(LDFLAGS, "-sFORCE_FILESYSTEM=1") + ac_cv_func_shutdown=no + ], +[wasi*],[ LIBS="-lm -lwasi-emulated-mman -lwasi-emulated-signal -lwasi-emulated-getpid -lwasi-emulated-process-clocks $LIBS" + RUBY_APPEND_OPTIONS(CFLAGS, -D_WASI_EMULATED_SIGNAL -D_WASI_EMULATED_MMAN -D_WASI_EMULATED_GETPID -D_WASI_EMULATED_PROCESS_CLOCKS) + RUBY_APPEND_OPTIONS(CPPFLAGS, -D_WASI_EMULATED_SIGNAL -D_WASI_EMULATED_MMAN -D_WASI_EMULATED_GETPID -D_WASI_EMULATED_PROCESS_CLOCKS) + POSTLINK="\$(WASMOPT) --asyncify \$(wasmoptflags) -o \$@ \$@${POSTLINK:+; $POSTLINK}" + # wasi-libc's sys/socket.h is not compatible with -std=gnu99, + # so re-declare shutdown in include/ruby/missing.h + ac_cv_func_shutdown=no ], [ LIBS="-lm $LIBS"]) +: ${ORIG_LIBS=$LIBS} + +AS_IF([test -n "${POSTLINK}"], [ + # NOTE: A (part of) link commands used link shared extension libraries. If + # the first line of the value is empty, mkmf prepends default link steps. + LINK_SO="$LINK_SO +\$(POSTLINK)" +]) + +AS_IF([test -n "${rb_there_is_in_fact_no_gplusplus_but_autoconf_is_cheating_us}"], [ + AC_MSG_NOTICE([Test skipped due to lack of a C++ compiler.]) +], +[test -n "${CXX}"], [ + RUBY_WERROR_FLAG([ + AC_MSG_CHECKING([whether CXXFLAGS is valid]) + AC_LANG_PUSH(C++) + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include <cstdio>]], [[]])], + [AC_MSG_RESULT(yes)],[ + AC_MSG_RESULT(no) + # The message mentions CXXFLAGS, but CPPFLAGS might also affects. + AC_MSG_WARN([something wrong with CXXFLAGS="$CXXFLAGS"]) + CXX=false + ]) + AC_LANG_POP(C++) + ]) +]) AC_CHECK_LIB(crypt, crypt) # glibc (GNU/Linux, GNU/Hurd, GNU/kFreeBSD) AC_CHECK_LIB(dl, dlopen) # Dynamic linking for SunOS/Solaris and SYSV -AC_CHECK_LIB(dld, shl_load) # Dynamic linking for HP-UX AC_CHECK_LIB(socket, shutdown) # SunOS/Solaris dnl Checks for header files. @@ -1251,8 +1423,13 @@ dnl AC_HEADER_STDC has been checked in AC_USE_SYSTEM_EXTENSIONS AC_HEADER_STDBOOL AC_HEADER_SYS_WAIT -AC_CHECK_HEADERS(a.out.h) +AC_CHECK_HEADERS([afunix.h], [], [], +[#ifdef _WIN32 +# include <winsock2.h> +#endif +]) AC_CHECK_HEADERS(atomic.h) +AC_CHECK_HEADERS(copyfile.h) AC_CHECK_HEADERS(direct.h) AC_CHECK_HEADERS(grp.h) AC_CHECK_HEADERS(fcntl.h) @@ -1268,8 +1445,14 @@ AC_CHECK_HEADERS(malloc_np.h) AC_CHECK_HEADERS(net/socket.h) AC_CHECK_HEADERS(process.h) AC_CHECK_HEADERS(pwd.h) +AC_CHECK_HEADERS(sanitizer/asan_interface.h) +AC_CHECK_HEADERS(sanitizer/msan_interface.h) +AC_CHECK_HEADERS(sanitizer/tsan_interface.h) AC_CHECK_HEADERS(setjmpex.h) +AC_CHECK_HEADERS(stdalign.h) +AC_CHECK_HEADERS(stdio.h) AC_CHECK_HEADERS(sys/attr.h) +AC_CHECK_HEADERS(sys/eventfd.h) AC_CHECK_HEADERS(sys/fcntl.h) AC_CHECK_HEADERS(sys/file.h) AC_CHECK_HEADERS(sys/id.h) @@ -1277,6 +1460,7 @@ AC_CHECK_HEADERS(sys/ioctl.h) AC_CHECK_HEADERS(sys/mkdev.h) AC_CHECK_HEADERS(sys/param.h) AC_CHECK_HEADERS(sys/prctl.h) +AC_CHECK_HEADERS(sys/random.h) AC_CHECK_HEADERS(sys/resource.h) AC_CHECK_HEADERS(sys/select.h) AC_CHECK_HEADERS(sys/sendfile.h) @@ -1291,14 +1475,18 @@ AC_CHECK_HEADERS(syscall.h) AC_CHECK_HEADERS(time.h) AC_CHECK_HEADERS(ucontext.h) AC_CHECK_HEADERS(utime.h) +AC_CHECK_HEADERS(sys/epoll.h) +AC_CHECK_HEADERS(sys/event.h) +AC_CHECK_HEADERS(stdckdint.h) +AC_CHECK_HEADERS(stdatomic.h) + +AS_CASE("$target_cpu", [x64|x86_64|[i[3-6]86*]], [ + AC_CHECK_HEADERS(x86intrin.h) +]) +RUBY_UNIVERSAL_CHECK_HEADER([x86_64, i386], x86intrin.h) -AC_ARG_WITH([gmp], - [AS_HELP_STRING([--without-gmp], - [disable GNU GMP to accelerate Bignum operations])], - [], - [with_gmp=yes]) AS_IF([test "x$with_gmp" != xno], - [AC_CHECK_HEADERS(gmp.h) + [RUBY_CHECK_HEADER(gmp.h) AS_IF([test "x$ac_cv_header_gmp_h" != xno], AC_SEARCH_LIBS([__gmpz_init], [gmp], [AC_DEFINE(HAVE_LIBGMP, 1)]))]) @@ -1306,36 +1494,59 @@ AS_IF([test "x$with_gmp" != xno], AC_ARG_WITH([jemalloc], [AS_HELP_STRING([--with-jemalloc],[use jemalloc allocator])], [with_jemalloc=$withval], [with_jemalloc=no]) -AS_IF([test "x$with_jemalloc" = xyes],[ - AC_SEARCH_LIBS([malloc_conf], [jemalloc], - [AC_DEFINE(HAVE_LIBJEMALLOC, 1)], [with_jemalloc=no]) - AC_CHECK_HEADER(jemalloc/jemalloc.h, [ - AC_DEFINE(RUBY_ALTERNATIVE_MALLOC_HEADER, [<jemalloc/jemalloc.h>]) +AS_IF([test "x$with_jemalloc" != xno],[ + # find jemalloc header first + save_CPPFLAGS="${CPPFLAGS}" + CPPFLAGS="${INCFLAGS} ${CPPFLAGS}" + malloc_header= + AC_CHECK_HEADER(jemalloc/jemalloc.h, [malloc_header=jemalloc/jemalloc.h], [ + AC_CHECK_HEADER(jemalloc.h, [malloc_header=jemalloc.h]) ]) - AS_IF([test "x$with_jemalloc" = xno], [ - AC_CACHE_CHECK([for jemalloc with JEMALLOC_MANGLE], rb_cv_jemalloc_demangle, - [AC_LINK_IFELSE([AC_LANG_PROGRAM([@%:@define JEMALLOC_MANGLE 1 - @%:@ifdef RUBY_ALTERNATIVE_MALLOC_HEADER - @%:@include RUBY_ALTERNATIVE_MALLOC_HEADER - @%:@else - @%:@include <jemalloc.h> - @%:@endif], [return !&malloc_conf])], - [rb_cv_jemalloc_demangle=yes], - [rb_cv_jemalloc_demangle=no]) - ]) + AS_IF([test "$malloc_header" != ""], [ + AC_DEFINE_UNQUOTED(RUBY_ALTERNATIVE_MALLOC_HEADER, [<$malloc_header>]) ]) - AS_IF([test "x$rb_cv_jemalloc_demangle" = xyes], [ - AC_DEFINE(JEMALLOC_MANGLE) - with_jemalloc=yes + save_LIBS="$LIBS" + AC_CACHE_CHECK([for jemalloc library], rb_cv_jemalloc_library, [ + rb_cv_jemalloc_library=no + # try [with mangle, without mangle] x [no more additional + # libraries, adding jemalloc] combination, using the jemalloc + # header found above. + for mangle in '' mangle; do + for lib in '' -ljemalloc; do + LIBS="${lib:+$lib }$LIBS" + AC_LINK_IFELSE([AC_LANG_PROGRAM([${mangle:+@%:@define JEMALLOC_MANGLE 1} + @%:@include <stdio.h> + @%:@ifdef RUBY_ALTERNATIVE_MALLOC_HEADER + @%:@include RUBY_ALTERNATIVE_MALLOC_HEADER + @%:@else + extern const char *malloc_conf; + @%:@endif], + [/* access at runtime not to be optimized away */ + if (malloc_conf) printf("malloc_conf=%s\n", malloc_conf);])], + [rb_cv_jemalloc_library="${lib:-none required}${mangle:+ with mangle}"]) + LIBS="$save_LIBS" + test "${rb_cv_jemalloc_library}" = no || break 2 + done + done ]) - AS_IF([test "x$with_jemalloc" = xyes], - [ - AC_DEFINE(HAVE_MALLOC_CONF) - ac_cv_func_malloc_usable_size=yes - ], - [AC_MSG_ERROR([jemalloc requested but not found]) + CPPFLAGS="${save_CPPFLAGS}" + unset save_CPPFLAGS + with_jemalloc=${rb_cv_jemalloc_library} + AS_CASE(["$with_jemalloc"], + [no], + [AC_MSG_ERROR([jemalloc requested but not found])], + [-l*], [ + set dummy $with_jemalloc + LIBS="$2 $LIBS" + DLDLIBS="$2${DLDLIBS:+ $DLDLIBS}" # probably needed also in extension libraries ]) -]) + AS_CASE(["$with_jemalloc"], + [*" with mangle"], [ + AC_DEFINE(JEMALLOC_MANGLE) + ]) + AC_DEFINE(HAVE_MALLOC_CONF) + ac_cv_func_malloc_usable_size=yes +]) # with_jemalloc dnl check for large file stuff mv confdefs.h confdefs1.h @@ -1345,7 +1556,7 @@ AC_SYS_LARGEFILE # which is not added by AC_SYS_LARGEFILE. AS_IF([test x"$enable_largefile" != xno], [ AS_CASE(["$target_os"], [solaris*], [ - AC_MSG_CHECKING([wheather _LARGEFILE_SOURCE should be defined]) + AC_MSG_CHECKING([whether _LARGEFILE_SOURCE should be defined]) AS_CASE(["${ac_cv_sys_file_offset_bits}:${ac_cv_sys_large_files}"], ["64:"|"64:no"|"64:unknown"], [ # insert _LARGEFILE_SOURCE before _FILE_OFFSET_BITS line @@ -1364,7 +1575,6 @@ mv confdefs1.h confdefs.h cat largefile.h >> confdefs.h AS_CASE(["$target_os"], - [mingw*], [ac_cv_type_off_t=yes;ac_cv_sizeof_off_t=8], [aix*], [ AS_CASE(["$target_cpu:$ac_cv_sys_large_files"], [ppc64:*|powerpc64:*], [], @@ -1376,12 +1586,13 @@ AS_CASE(["$target_os"], ]) ]) -AC_C_BIGENDIAN +AC_C_BIGENDIAN([], [], [], [AC_DEFINE(AC_APPLE_UNIVERSAL_BUILD, 1)]) AC_C_CONST AC_C_CHAR_UNSIGNED AC_C_INLINE AC_C_VOLATILE AC_C_TYPEOF +AC_C_RESTRICT AS_CASE(":$ac_cv_c_const:$ac_cv_c_volatile:", [*:no:*], [AC_MSG_ERROR(ANSI C-conforming const and volatile are mandatory)]) @@ -1394,114 +1605,6 @@ AC_CACHE_CHECK([char bit], [rb_cv_char_bit], [AC_INCLUDES_DEFAULT([@%:@include <limits.h>])], [rb_cv_char_bit=8]) test "$universal_binary" = yes && cross_compiling=$real_cross_compiling]) -dnl RUBY_CHECK_SIZEOF [typename], [maybe same size types], [macros], [include] -AC_DEFUN([RUBY_CHECK_SIZEOF], -[dnl -AS_VAR_PUSHDEF([rbcv_var], [rbcv_sizeof_var])dnl -AS_VAR_PUSHDEF([cond], [rbcv_sizeof_cond])dnl -AS_VAR_PUSHDEF([t], [rbcv_sizeof_type])dnl -AS_VAR_PUSHDEF([s], [rbcv_sizeof_size])dnl -] -[m4_bmatch([$1], [\.], [], [if test "$universal_binary" = yes; then]) -AC_CACHE_CHECK([size of $1], [AS_TR_SH([ac_cv_sizeof_$1])], [ - unset AS_TR_SH(ac_cv_sizeof_$1) - rbcv_var=" -typedef m4_bpatsubst([$1], [\..*]) ac__type_sizeof_; -static ac__type_sizeof_ *rbcv_ptr; -@%:@define AS_TR_CPP(SIZEOF_$1) sizeof((*rbcv_ptr)[]m4_bmatch([$1], [\.], .m4_bpatsubst([$1], [^[^.]*\.]))) -" - m4_ifval([$2], [test -z "${AS_TR_SH(ac_cv_sizeof_$1)+set}" && { - for t in $2; do - AC_COMPILE_IFELSE( - [AC_LANG_BOOL_COMPILE_TRY(AC_INCLUDES_DEFAULT([$4] - [$rbcv_var]), - [AS_TR_CPP(SIZEOF_$1) == sizeof($t)])], [ - AS_TR_SH(ac_cv_sizeof_$1)=AS_TR_CPP([SIZEOF_]$t) - break]) - done - }], [ - AC_COMPUTE_INT([AS_TR_SH(ac_cv_sizeof_$1)], [AS_TR_CPP(SIZEOF_$1)], - [AC_INCLUDES_DEFAULT([$4]) -$rbcv_var], - [AS_TR_SH(ac_cv_sizeof_$1)=]) - ]) - unset cond - m4_ifval([$3], [test -z "${AS_TR_SH(ac_cv_sizeof_$1)+set}" && { - for s in 32 64 128; do - for t in $3; do - cond="${cond} -@%:@${cond+el}if defined(__${t}${s}__) || defined(__${t}${s}) || defined(_${t}${s}) || defined(${t}${s})" - hdr="AC_INCLUDES_DEFAULT([$4 -@%:@if defined(__${t}${s}__) || defined(__${t}${s}) || defined(_${t}${s}) || defined(${t}${s}) -@%:@ define AS_TR_CPP(HAVE_$1) 1 -@%:@else -@%:@ define AS_TR_CPP(HAVE_$1) 0 -@%:@endif])" - AC_COMPILE_IFELSE([AC_LANG_BOOL_COMPILE_TRY([$hdr], [!AS_TR_CPP(HAVE_$1)])], [continue]) - AC_COMPILE_IFELSE([AC_LANG_BOOL_COMPILE_TRY([$hdr] - [$rbcv_var], - [AS_TR_CPP(HAVE_$1) == (AS_TR_CPP(SIZEOF_$1) == ($s / $rb_cv_char_bit))])], - [AS_TR_SH(ac_cv_sizeof_$1)="${AS_TR_SH(ac_cv_sizeof_$1)+${AS_TR_SH(ac_cv_sizeof_$1)-} }${t}${s}"; continue]) - AC_COMPILE_IFELSE([AC_LANG_BOOL_COMPILE_TRY([$hdr] -[ -@%:@if AS_TR_CPP(HAVE_$1) -$rbcv_var -@%:@else -@%:@define AS_TR_CPP(SIZEOF_$1) 0 -@%:@endif -], - [AS_TR_CPP(HAVE_$1) == (AS_TR_CPP(SIZEOF_$1) == (m4_bmatch([$2], [^[0-9][0-9]*$], [$2], [($s / $rb_cv_char_bit)])))])], - [AS_TR_SH(ac_cv_sizeof_$1)="${AS_TR_SH(ac_cv_sizeof_$1)+${AS_TR_SH(ac_cv_sizeof_$1)-} }${t}${s}m4_bmatch([$2], [^[0-9][0-9]*$], [:$2])"]) - done - done - }]) - test "${AS_TR_SH(ac_cv_sizeof_$1)@%:@@<:@1-9@:>@}" = "${AS_TR_SH(ac_cv_sizeof_$1)}" && - m4_ifval([$2][$3], - [test "${AS_TR_SH(ac_cv_sizeof_$1)@%:@SIZEOF_}" = "${AS_TR_SH(ac_cv_sizeof_$1)}" && ]){ - test "$universal_binary" = yes && cross_compiling=yes - AC_COMPUTE_INT([t], AS_TR_CPP(SIZEOF_$1), [AC_INCLUDES_DEFAULT([$4])] -[${cond+$cond -@%:@else} -$rbcv_var -${cond+@%:@endif} -@%:@ifndef AS_TR_CPP(SIZEOF_$1) -@%:@define AS_TR_CPP(SIZEOF_$1) 0 -@%:@endif], [t=0]) - test "$universal_binary" = yes && cross_compiling=$real_cross_compiling - AS_IF([test ${t-0} != 0], [ - AS_TR_SH(ac_cv_sizeof_$1)="${AS_TR_SH(ac_cv_sizeof_$1)+${AS_TR_SH(ac_cv_sizeof_$1)-} }${t}" - ]) - } - : ${AS_TR_SH(ac_cv_sizeof_$1)=0} -]) -{ - unset cond - for t in ${AS_TR_SH(ac_cv_sizeof_$1)-}; do - AS_CASE(["$t"], - [[[0-9]*|SIZEOF_*]], [ - ${cond+echo "@%:@else"} - echo "[@%:@define ]AS_TR_CPP(SIZEOF_$1) $t" - break - ], - [ - s=`expr $t : ['.*[^0-9]\([0-9][0-9]*\)$']` - AS_CASE([$t], [*:*], [t="${t%:*}"], [s=`expr $s / $rb_cv_char_bit`]) - echo "@%:@${cond+el}if defined(__${t}__) || defined(__${t}) || defined(_${t}) || defined($t)" - echo "@%:@define AS_TR_CPP(SIZEOF_$1) $s" - cond=1 - ]) - done - ${cond+echo "@%:@endif"} -} >> confdefs.h -m4_bmatch([$1], [\.], [], [else -AC_CHECK_SIZEOF([$1], 0, [$4]) -fi]) -AS_VAR_POPDEF([rbcv_var])dnl -AS_VAR_POPDEF([cond])dnl -AS_VAR_POPDEF([t])dnl -AS_VAR_POPDEF([s])dnl -]) - RUBY_CHECK_SIZEOF(int, [], [ILP]) RUBY_CHECK_SIZEOF(short) RUBY_CHECK_SIZEOF(long, [int], [ILP LP]) @@ -1514,6 +1617,25 @@ RUBY_CHECK_SIZEOF(float) RUBY_CHECK_SIZEOF(double) RUBY_CHECK_SIZEOF(time_t, [long "long long"], [], [@%:@include <time.h>]) RUBY_CHECK_SIZEOF(clock_t, [], [], [@%:@include <time.h>]) +AC_SUBST(X_BUILTIN_BINARY, yes) +AS_IF([test "$cross_compiling" = yes], +[dnl miniruby cannot run if cross compiling + X_BUILTIN_BINARY=no +], +[ + AS_CASE([ac_cv_sizeof_voidp], + [[1-9]*], [dnl fixed value + ], + [ + AC_CACHE_CHECK([word size], [rb_cv_word_size], + [for w in 4 8; do + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@if SIZEOF_VOIDP != ${w} + @%:@error SIZEOF_VOIDP + @%:@endif]])], [rb_cv_word_size=${w}; break]) + done]) + AS_IF([test -z $rb_cv_word_size], [X_BUILTIN_BINARY=no]) + ]) +]) AC_CACHE_CHECK(packed struct attribute, rb_cv_packed_struct, [rb_cv_packed_struct=no @@ -1521,40 +1643,14 @@ AC_CACHE_CHECK(packed struct attribute, rb_cv_packed_struct, "__pragma(pack(push, 1)) x __pragma(pack(pop))" \ "x __attribute__((packed))" \ ; do - AC_TRY_COMPILE([@%:@define PACKED_STRUCT(x) $mac - PACKED_STRUCT(struct { int a; });], [], + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@define PACKED_STRUCT(x) $mac + PACKED_STRUCT(struct { int a; });]], [[]])], [rb_cv_packed_struct=$mac; break]) done]) AS_IF([test "$rb_cv_packed_struct" != no], [ - AC_DEFINE_UNQUOTED([PACKED_STRUCT(x)], [$rb_cv_packed_struct]) + AC_DEFINE_UNQUOTED([RBIMPL_ATTR_PACKED_STRUCT_BEGIN()], [`echo " $rb_cv_packed_struct " | sed 's/ x .*//;s/^ *//'`]) + AC_DEFINE_UNQUOTED([RBIMPL_ATTR_PACKED_STRUCT_END()], [`echo " $rb_cv_packed_struct " | sed 's/.* x //;s/ *$//'`]) RUBY_TRY_CFLAGS(-Wno-address-of-packed-member, [AC_DEFINE(USE_UNALIGNED_MEMBER_ACCESS)]) -], [ - AC_DEFINE_UNQUOTED([PACKED_STRUCT(x)], x) -]) - -AC_DEFUN([RUBY_CHECK_PRINTF_PREFIX], [ -AC_CACHE_CHECK([for printf prefix for $1], [rb_cv_pri_prefix_]AS_TR_SH($1),[ - [rb_cv_pri_prefix_]AS_TR_SH($1)=[NONE] - RUBY_WERROR_FLAG(RUBY_APPEND_OPTIONS(CFLAGS, $rb_cv_wsuppress_flags) - for pri in $2; do - AC_TRY_COMPILE( - [@%:@include <stdio.h> - @%:@include <stddef.h> - @%:@ifdef __GNUC__ - @%:@define PRINTF_ARGS(decl, string_index, first_to_check) \ - decl __attribute__((format(printf, string_index, first_to_check))) - @%:@else - @%:@define PRINTF_ARGS(decl, string_index, first_to_check) decl - @%:@endif - PRINTF_ARGS(void test_sprintf(const char*, ...), 1, 2);], - [printf("%]${pri}[d", (]$1[)42); - test_sprintf("%]${pri}[d", (]$1[)42);], - [rb_cv_pri_prefix_]AS_TR_SH($1)[=[$pri]; break]) - done)]) -AS_IF([test "[$rb_cv_pri_prefix_]AS_TR_SH($1)" != NONE], [ - AC_DEFINE_UNQUOTED([PRI_]m4_ifval($3,$3,AS_TR_CPP(m4_bpatsubst([$1],[_t$])))[_PREFIX], - "[$rb_cv_pri_prefix_]AS_TR_SH($1)") -]) ]) AS_IF([test "x$ac_cv_type_long_long" = xyes], [ @@ -1563,71 +1659,12 @@ AS_IF([test "x$ac_cv_type_long_long" = xyes], [ RUBY_CHECK_PRINTF_PREFIX(__int64, ll I64, LL) ]) -dnl RUBY_CHECK_SIGNEDNESS [typename] [if-signed] [if-unsigned] [included] -AC_DEFUN([RUBY_CHECK_SIGNEDNESS], [dnl - AC_COMPILE_IFELSE([AC_LANG_BOOL_COMPILE_TRY([AC_INCLUDES_DEFAULT([$4])], [($1)-1 > 0])], - [$3], [$2])]) - -dnl RUBY_REPLACE_TYPE [typename] [default type] [macro type] [included] -AC_DEFUN([RUBY_REPLACE_TYPE], [dnl - AC_CHECK_TYPE([$1], - [n="patsubst([$1],["],[\\"])"], - [n="patsubst([$2],["],[\\"])"], - [$4]) - AC_CACHE_CHECK([for convertible type of [$1]], rb_cv_[$1]_convertible, [ - u= t= - AS_CASE(["$n "], - [*" signed "*], [ ], - [*" unsigned "*], [ - u=U], - [RUBY_CHECK_SIGNEDNESS($n, [], [u=U], [$4])]) - AS_IF([test x"$t" = x], [ - for t in "long long" long int short; do - test -n "$u" && t="unsigned $t" - AC_COMPILE_IFELSE( - [AC_LANG_BOOL_COMPILE_TRY([AC_INCLUDES_DEFAULT([$4])] - [typedef $n rbcv_conftest_target_type; - typedef $t rbcv_conftest_replace_type; - extern rbcv_conftest_target_type rbcv_conftest_var; - extern rbcv_conftest_replace_type rbcv_conftest_var; - extern rbcv_conftest_target_type rbcv_conftest_func(void); - extern rbcv_conftest_replace_type rbcv_conftest_func(void); - ], [sizeof(rbcv_conftest_target_type) == sizeof(rbcv_conftest_replace_type)])], - [n="$t"; break]) - done - ]) - AS_CASE([" $n "], - [*" long long "*], [ - t=LL], - [*" long "*], [ - t=LONG], - [ - t=INT]) - rb_cv_[$1]_convertible=${u}${t}]) - AS_IF([test "${AS_TR_SH(ac_cv_type_[$1])}" = "yes"], [ - n="$1" - ], [ - AS_CASE(["${rb_cv_[$1]_convertible}"], - [*LL], [n="long long"], - [*LONG], [n="long"], - [n="int"]) - AS_CASE(["${rb_cv_[$1]_convertible}"], - [U*], [n="unsigned $n"]) - ]) - AS_CASE("${rb_cv_[$1]_convertible}", [U*], [u=+1], [u=-1]) - AC_DEFINE_UNQUOTED(rb_[$1], $n) - AC_DEFINE_UNQUOTED([SIGNEDNESS_OF_]AS_TR_CPP($1), $u) - AC_DEFINE_UNQUOTED([$3]2NUM[(v)], [${rb_cv_[$1]_convertible}2NUM(v)]) - AC_DEFINE_UNQUOTED(NUM2[$3][(v)], [NUM2${rb_cv_[$1]_convertible}(v)]) - AC_DEFINE_UNQUOTED(PRI_[$3]_PREFIX, - [PRI_`echo ${rb_cv_[$1]_convertible} | sed ['s/^U//']`_PREFIX]) -]) RUBY_REPLACE_TYPE(pid_t, int, PIDT) RUBY_REPLACE_TYPE(uid_t, int, UIDT) RUBY_REPLACE_TYPE(gid_t, int, GIDT) RUBY_REPLACE_TYPE(time_t, [], TIMET, [@%:@include <time.h>]) RUBY_REPLACE_TYPE(dev_t, [int long "long long"], DEVT) -RUBY_REPLACE_TYPE(mode_t, ["unsigned int" long], MODET, [@%:@include <sys/stat.h>]) +RUBY_REPLACE_TYPE(mode_t, ["unsigned short" "unsigned int" long], MODET, [@%:@include <sys/stat.h>]) RUBY_REPLACE_TYPE(rlim_t, [int long "long long"], RLIM, [ @%:@ifdef HAVE_SYS_TYPES_H @%:@include <sys/types.h> @@ -1638,160 +1675,65 @@ RUBY_REPLACE_TYPE(rlim_t, [int long "long long"], RLIM, [ @%:@include <sys/resource.h> ]) RUBY_REPLACE_TYPE(off_t, [], OFFT) -RUBY_REPLACE_TYPE(clockid_t, [], CLOCKID) - -AC_CACHE_CHECK(for prototypes, rb_cv_have_prototypes, - [AC_TRY_COMPILE([int foo(int x) { return 0; }], [return foo(10);], - rb_cv_have_prototypes=yes, - rb_cv_have_prototypes=no)]) -AS_IF([test "$rb_cv_have_prototypes" = yes], [ - AC_DEFINE(HAVE_PROTOTYPES) -]) - -AC_CACHE_CHECK(token paste string, rb_cv_tokenpaste, - [AC_TRY_COMPILE([@%:@define paste(a,b) a@%:@@%:@b], - [int xy = 1; return paste(x,y);], - rb_cv_tokenpaste=ansi, - rb_cv_tokenpaste=knr)]) -AS_IF([test "$rb_cv_tokenpaste" = ansi], [ - AC_DEFINE(TOKEN_PASTE(x,y),[x@%:@@%:@y]) -], [ - AC_DEFINE(TOKEN_PASTE(x,y),[x/**/y]) -]) - -AC_CACHE_CHECK(stringization, rb_cv_stringization, [ - rb_cv_stringization=no - for string in "#expr" '"expr"'; do - AC_COMPILE_IFELSE([ - AC_LANG_BOOL_COMPILE_TRY([ -#define STRINGIZE0(expr) $string -#define STRINGIZE(expr) STRINGIZE0(expr) -#undef real_test_for_stringization -#define test_for_stringization -.real_test_for_stringization.- -const char stringized[[]] = STRINGIZE(test_for_stringization); -], [sizeof(stringized) == 32])], - [rb_cv_stringization="$string"; break], - [rb_cv_stringization=no]) - done] -) -AC_DEFINE(STRINGIZE(expr),STRINGIZE0(expr)) -AS_IF([test x"$rb_cv_stringization" != xno -a "$rb_cv_stringization" != "#expr"], [ - AC_DEFINE_UNQUOTED(STRINGIZE0(expr),$rb_cv_stringization) - AC_DEFINE(OLD_FASHIONED_STRINGIZATION,1) -]) - -AC_CACHE_CHECK([string literal concatenation], - rb_cv_string_literal_concatenation, [ - AC_COMPILE_IFELSE([ - AC_LANG_BOOL_COMPILE_TRY([ -const char concatenated_literal[[]] = "literals" "to" - "be" "concatenated."; -], [sizeof(concatenated_literal) == 26])], - [rb_cv_string_literal_concatenation=yes], - [rb_cv_string_literal_concatenation=no])] -) -AS_IF([test "$rb_cv_string_literal_concatenation" = no], [ - AC_DEFINE(NO_STRING_LITERAL_CONCATENATION,1) -]) - -AC_CACHE_CHECK(for variable length prototypes and stdarg.h, rb_cv_stdarg, - [AC_TRY_COMPILE([ -#include <stdarg.h> -int foo(int x, ...) { - va_list va; - va_start(va, x); - va_arg(va, int); - va_arg(va, char *); - va_arg(va, double); - return 0; -} -], [return foo(10, "", 3.14);], - rb_cv_stdarg=yes, - rb_cv_stdarg=no)]) -AS_IF([test "$rb_cv_stdarg" = yes], [ - AC_DEFINE(HAVE_STDARG_PROTOTYPES) -]) +RUBY_REPLACE_TYPE(clockid_t, [], CLOCKID, [@%:@ifdef HAVE_TIME_H +@%:@ include <time.h> +@%:@endif +@%:@ifdef HAVE_SYS_TIME_H +@%:@ include <sys/time.h> +@%:@endif]) +# __VA_ARGS__ is also tested in AC_PROG_CC_C99 since autoconf 2.60a (around +# 2006). The check below is redundant and should always success. Remain not +# deleted for backward compat. AC_CACHE_CHECK(for variable length macro, rb_cv_va_args_macro, - [AC_TRY_COMPILE([ -int foo(int x, ...); -@%:@define FOO(a, ...) foo(a, @%:@@%:@__VA_ARGS__) -], [FOO(1);FOO(1,2);FOO(1,2,3);], + [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ +int foo(const char*); +@%:@define FOO(...) foo(@%:@__VA_ARGS__) +]], [[FOO(1);FOO(1,2);FOO(1,2,3);]])], rb_cv_va_args_macro=yes, rb_cv_va_args_macro=no)]) AS_IF([test "$rb_cv_va_args_macro" = yes], [ AC_DEFINE(HAVE_VA_ARGS_MACRO) ]) -AC_DEFUN([RUBY_DEFINE_IF], [dnl - m4_ifval([$1], [AS_LITERAL_IF([$1], [], [test "X$1" = X || ])cat <<EOH >> confdefs.h -@%:@if $1 -EOH -])dnl -AC_DEFINE_UNQUOTED($2, $3)dnl - m4_ifval([$1], [AS_LITERAL_IF([$1], [], [test "X$1" = X || ])cat <<EOH >> confdefs.h -@%:@endif /* $1 */ -EOH -])dnl -])dnl - -dnl RUBY_DECL_ATTRIBUTE(attrib, macroname, cachevar, condition, type, code) -AC_DEFUN([RUBY_DECL_ATTRIBUTE], [dnl -m4_ifval([$2], dnl - [AS_VAR_PUSHDEF([attrib], m4_bpatsubst([$2], [(.*)], []))], dnl - [AS_VAR_PUSHDEF([attrib], m4_toupper(m4_format(%.4s, [$5]))[_]AS_TR_CPP($1))] dnl -)dnl -m4_ifval([$3], dnl - [AS_VAR_PUSHDEF([rbcv],[$3])], dnl - [AS_VAR_PUSHDEF([rbcv],[rb_cv_]m4_format(%.4s, [$5])[_][$1])]dnl -)dnl -m4_pushdef([attrib_code],[m4_bpatsubst([$1],["],[\\"])])dnl -m4_pushdef([attrib_params],[m4_bpatsubst([$2(x)],[^[^()]*(\([^()]*\)).*],[\1])])dnl -m4_ifval([$4], [rbcv_cond=["$4"]; test "$rbcv_cond" || unset rbcv_cond]) -AC_CACHE_CHECK(for m4_ifval([$2],[m4_bpatsubst([$2], [(.*)], [])],[$1]) [$5] attribute, rbcv, dnl -[rbcv=x -RUBY_WERROR_FLAG([ -for mac in \ - "__attribute__ ((attrib_code)) x" \ - "x __attribute__ ((attrib_code))" \ - "__declspec(attrib_code) x" \ - x; do - m4_ifval([$4],mac="$mac"${rbcv_cond+" /* only if $rbcv_cond */"}) - AC_TRY_COMPILE( - m4_ifval([$4],${rbcv_cond+[@%:@if ]$rbcv_cond}) -[@%:@define ]attrib[](attrib_params)[ $mac] -m4_ifval([$4],${rbcv_cond+[@%:@else]} -${rbcv_cond+[@%:@define ]attrib[](attrib_params)[ x]} -${rbcv_cond+[@%:@endif]}) -$6 -@%:@define mesg ("") - attrib[](attrib_params)[;], [], - [rbcv="$mac"; break]) -done -])]) -AS_IF([test "$rbcv" != x], [ - RUBY_DEFINE_IF(m4_ifval([$4],[${rbcv_cond}]), attrib[](attrib_params)[], $rbcv) -]) -m4_ifval([$4], [unset rbcv_cond]) dnl -m4_popdef([attrib_params])dnl -m4_popdef([attrib_code])dnl -AS_VAR_POPDEF([attrib])dnl -AS_VAR_POPDEF([rbcv])dnl -]) - -dnl RUBY_FUNC_ATTRIBUTE(attrib, macroname, cachevar, condition) -AC_DEFUN([RUBY_FUNC_ATTRIBUTE], [dnl - RUBY_DECL_ATTRIBUTE([$1], [$2], [$3], [$4], - [function], [@%:@define x int conftest_attribute_check(void)] - ) -]) - -dnl RUBY_TYPE_ATTRIBUTE(attrib, macroname, cachevar, condition) -AC_DEFUN([RUBY_TYPE_ATTRIBUTE], [dnl - RUBY_DECL_ATTRIBUTE([$1], [$2], [$3], [$4], - [type], [ -@%:@define x struct conftest_attribute_check {int i;} +# We want C11's `_Alignof`. GCC (and alike) have `__alignof__`, which behave +# slightly differently than the C11's. We cannot use `__alignof__` for our +# purpose. The problem is, however, that old gcc and old clang had both +# implemented `_Alignof` as a synonym of `__alignof__`. They are not what we +# want. We have to check sanity. +# +# See also: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=52023 +# See also: https://bugs.llvm.org/show_bug.cgi?id=26547 +AC_CACHE_CHECK([if _Alignof() works], rb_cv_have__alignof,[ + rb_cv_have__alignof=no + RUBY_WERROR_FLAG([ + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + @%:@ifdef HAVE_STDALIGN_H + @%:@include <stdalign.h> + @%:@endif + @%:@ifdef STDC_HEADERS + @%:@include <stddef.h> + @%:@endif + @%:@ifndef __GNUC__ + @%:@define __extension__ + @%:@endif + ]], [[ + typedef struct conftest_tag { + char _; + double d; + } T; + static int conftest_ary@<:@ + offsetof(T, d) == __extension__ _Alignof(double) + ? 1 : -1 + @:>@; + return conftest_ary@<:@0@:>@; + ]])],[ + rb_cv_have__alignof=yes + ],[]) + ]) ]) +AS_IF([test "$rb_cv_have__alignof" != no], [ + AC_DEFINE(HAVE__ALIGNOF) ]) RUBY_FUNC_ATTRIBUTE(__const__, CONSTFUNC) @@ -1799,9 +1741,11 @@ RUBY_FUNC_ATTRIBUTE(__pure__, PUREFUNC) RUBY_FUNC_ATTRIBUTE(__noreturn__, NORETURN) RUBY_FUNC_ATTRIBUTE(__deprecated__, DEPRECATED) RUBY_FUNC_ATTRIBUTE(__deprecated__("by "@%:@n), DEPRECATED_BY(n,x), rb_cv_func_deprecated_by) -RUBY_TYPE_ATTRIBUTE(__deprecated__ mesg, DEPRECATED_TYPE(mesg,x), rb_cv_type_deprecated) RUBY_FUNC_ATTRIBUTE(__noinline__, NOINLINE) RUBY_FUNC_ATTRIBUTE(__always_inline__, ALWAYS_INLINE) +RUBY_FUNC_ATTRIBUTE(__no_sanitize__(san), NO_SANITIZE(san, x), rb_cv_func_no_sanitize) +RUBY_FUNC_ATTRIBUTE(__no_sanitize_address__, NO_SANITIZE_ADDRESS) +RUBY_FUNC_ATTRIBUTE(__no_address_safety_analysis__, NO_ADDRESS_SAFETY_ANALYSIS) RUBY_FUNC_ATTRIBUTE(__warn_unused_result__, WARN_UNUSED_RESULT) RUBY_FUNC_ATTRIBUTE(__unused__, MAYBE_UNUSED) RUBY_FUNC_ATTRIBUTE(__error__ mesg, ERRORFUNC(mesg,x), rb_cv_func___error__) @@ -1811,6 +1755,17 @@ AS_IF([test "$rb_cv_func_weak" != x], [ AC_DEFINE(HAVE_FUNC_WEAK) ]) +AC_CACHE_CHECK([for std::nullptr_t], rb_cv_CXX_nullptr, [ + AC_LANG_PUSH([C++]) + AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM( + [@%:@include <cstddef>], + [static std::nullptr_t const *const conftest = nullptr;])], + [rb_cv_CXX_nullptr=yes], + [rb_cv_CXX_nullptr=no]) + AC_LANG_POP()]) +AS_IF([test "$rb_cv_CXX_nullptr" != no],[AC_DEFINE(HAVE_NULLPTR)]) + if_i386=${universal_binary+[defined __i386__]} RUBY_FUNC_ATTRIBUTE(__stdcall__, FUNC_STDCALL, rb_cv_func_stdcall, ${if_i386}) RUBY_FUNC_ATTRIBUTE(__cdecl__, FUNC_CDECL, rb_cv_func_cdecl, ${if_i386}) @@ -1822,8 +1777,8 @@ AS_IF([test "$GCC" = yes], [ AC_CACHE_CHECK([for function alias], [rb_cv_gcc_function_alias], [rb_cv_gcc_function_alias=no for a in alias weak,alias; do - AC_TRY_LINK([void foo(void) {} - void bar(void) __attribute__(($a("foo")));], [bar()], + AC_LINK_IFELSE([AC_LANG_PROGRAM([[void foo(void) {} + void bar(void) __attribute__(($a("foo")));]], [[bar()]])], [rb_cv_gcc_function_alias=$a; break]) done]) AS_IF([test "$rb_cv_gcc_function_alias" != no], [ @@ -1833,32 +1788,54 @@ AS_IF([test "$GCC" = yes], [ AC_DEFINE_UNQUOTED([RUBY_ALIAS_FUNCTION_VOID(prot, name, args)], [RUBY_ALIAS_FUNCTION_TYPE(void, prot, name, args)]) ]) +]) +{ AC_CACHE_CHECK([for __atomic builtins], [rb_cv_gcc_atomic_builtins], [ - AC_TRY_LINK([unsigned char atomic_var;], - [ + AC_LINK_IFELSE([AC_LANG_PROGRAM([[unsigned int atomic_var;]], + [[ __atomic_exchange_n(&atomic_var, 0, __ATOMIC_SEQ_CST); __atomic_exchange_n(&atomic_var, 1, __ATOMIC_SEQ_CST); __atomic_fetch_add(&atomic_var, 1, __ATOMIC_SEQ_CST); __atomic_fetch_sub(&atomic_var, 1, __ATOMIC_SEQ_CST); __atomic_or_fetch(&atomic_var, 1, __ATOMIC_SEQ_CST); - ], + ]])], [rb_cv_gcc_atomic_builtins=yes], [rb_cv_gcc_atomic_builtins=no])]) AS_IF([test "$rb_cv_gcc_atomic_builtins" = yes], [ AC_DEFINE(HAVE_GCC_ATOMIC_BUILTINS) + for lib in "" atomic; do + AS_IF([test "$lib" != ""], [ + AC_CHECK_LIB([atomic], [__atomic_fetch_add_8]) + unset rb_cv_gcc_atomic_builtins_64 + ]) + AC_CACHE_CHECK([for 64bit __atomic builtins${lib:+ with -l$lib}], + [rb_cv_gcc_atomic_builtins_64], [ + AC_LINK_IFELSE([AC_LANG_PROGRAM([[@%:@include <stdint.h> + uint64_t atomic_var;]], + [[ + __atomic_load_n(&atomic_var, __ATOMIC_RELAXED); + __atomic_store_n(&atomic_var, 0, __ATOMIC_RELAXED); + ]])], + [rb_cv_gcc_atomic_builtins_64=yes], + [rb_cv_gcc_atomic_builtins_64=no])]) + AS_IF([test "$rb_cv_gcc_atomic_builtins_64" = yes], [ + AC_DEFINE(HAVE_GCC_ATOMIC_BUILTINS_64) + break + ]) + done ]) AC_CACHE_CHECK([for __sync builtins], [rb_cv_gcc_sync_builtins], [ - AC_TRY_LINK([unsigned char atomic_var;], - [ + AC_LINK_IFELSE([AC_LANG_PROGRAM([[unsigned int atomic_var;]], + [[ __sync_lock_test_and_set(&atomic_var, 0); __sync_lock_test_and_set(&atomic_var, 1); __sync_fetch_and_add(&atomic_var, 1); __sync_fetch_and_sub(&atomic_var, 1); __sync_or_and_fetch(&atomic_var, 1); __sync_val_compare_and_swap(&atomic_var, 0, 1); - ], + ]])], [rb_cv_gcc_sync_builtins=yes], [rb_cv_gcc_sync_builtins=no])]) AS_IF([test "$rb_cv_gcc_sync_builtins" = yes], [ @@ -1867,42 +1844,63 @@ AS_IF([test "$GCC" = yes], [ AC_CACHE_CHECK(for __builtin_unreachable, rb_cv_func___builtin_unreachable, [RUBY_WERROR_FLAG( - [AC_TRY_LINK([volatile int zero;], - [if (zero) __builtin_unreachable();], + [AC_LINK_IFELSE([AC_LANG_PROGRAM([[volatile int zero;]], + [[if (zero) __builtin_unreachable();]])], [rb_cv_func___builtin_unreachable=yes], [rb_cv_func___builtin_unreachable=no]) ]) ]) AS_IF([test "$rb_cv_func___builtin_unreachable" = yes], [ - AC_DEFINE_UNQUOTED(UNREACHABLE, [__builtin_unreachable()]) + AC_DEFINE(HAVE___BUILTIN_UNREACHABLE) ]) -]) + + AC_CACHE_CHECK(for __assume, rb_cv_func___assume, + [RUBY_WERROR_FLAG([ + AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], + [[__assume(1);]])], + [rb_cv_func___assume=yes], + [rb_cv_func___assume=no]) + ]) + ]) + AS_IF([test "$rb_cv_func___assume" = yes], [ + AC_DEFINE(HAVE___ASSUME) + ]) +} AC_CACHE_CHECK(for exported function attribute, rb_cv_func_exported, [ rb_cv_func_exported=no RUBY_WERROR_FLAG([ -for mac in '__attribute__ ((__visibility__("default")))' '__declspec(dllexport)'; do - AC_TRY_COMPILE([@%:@define RUBY_FUNC_EXPORTED $mac extern - RUBY_FUNC_EXPORTED void conftest_attribute_check(void);], [], +for mac in '__declspec(dllexport)' '__attribute__ ((__visibility__("default")))'; do + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@define RUBY_FUNC_EXPORTED $mac extern + RUBY_FUNC_EXPORTED void conftest_attribute_check(void);]], [[]])], [rb_cv_func_exported="$mac"; break]) done ])]) AS_IF([test "$rb_cv_func_exported" != no], [ AC_DEFINE_UNQUOTED(RUBY_FUNC_EXPORTED, [$rb_cv_func_exported extern]) ]) +RUBY_DECL_ATTRIBUTE([__nonnull__(n)], [RUBY_FUNC_NONNULL(n,x)], [rb_cv_func_nonnull], + [], [function], [ +@%:@define x int conftest_attribute_check(void *p) +@%:@define n 1 +]) RUBY_APPEND_OPTION(XCFLAGS, -DRUBY_EXPORT) AC_CACHE_CHECK(for function name string predefined identifier, rb_cv_function_name_string, - [rb_cv_function_name_string=no - RUBY_WERROR_FLAG([ - for func in __func__ __FUNCTION__; do - AC_TRY_LINK([@%:@include <stdio.h>], - [puts($func);], - [rb_cv_function_name_string=$func - break]) - done + [AS_CASE(["$target_os"],[openbsd*],[ + rb_cv_function_name_string=__func__ + ],[ + rb_cv_function_name_string=no + RUBY_WERROR_FLAG([ + for func in __func__ __FUNCTION__; do + AC_LINK_IFELSE([AC_LANG_PROGRAM([[@%:@include <stdio.h>]], + [[puts($func);]])], + [rb_cv_function_name_string=$func + break]) + done + ]) ])] ) AS_IF([test "$rb_cv_function_name_string" != no], [ @@ -1963,16 +1961,21 @@ RUBY_CHECK_SIGNEDNESS(size_t, [AC_MSG_ERROR(size_t is signed)], [], [@%:@include <sys/types.h>]) RUBY_CHECK_SIZEOF(size_t, [int long void*], [], [@%:@include <sys/types.h>]) RUBY_CHECK_SIZEOF(ptrdiff_t, size_t, [], [@%:@include <stddef.h>]) +RUBY_CHECK_SIZEOF(dev_t) RUBY_CHECK_PRINTF_PREFIX(size_t, z) RUBY_CHECK_PRINTF_PREFIX(ptrdiff_t, t) -AC_STRUCT_ST_BLKSIZE -AC_STRUCT_ST_BLOCKS -AC_STRUCT_ST_RDEV +AC_CHECK_MEMBERS([struct stat.st_blksize]) +AC_CHECK_MEMBERS([struct stat.st_blocks]) +AC_CHECK_MEMBERS([struct stat.st_rdev]) RUBY_CHECK_SIZEOF([struct stat.st_size], [off_t int long "long long"], [], [@%:@include <sys/stat.h>]) AS_IF([test "$ac_cv_member_struct_stat_st_blocks" = yes], [ RUBY_CHECK_SIZEOF([struct stat.st_blocks], [off_t int long "long long"], [], [@%:@include <sys/stat.h>]) ]) RUBY_CHECK_SIZEOF([struct stat.st_ino], [long "long long"], [], [@%:@include <sys/stat.h>]) +RUBY_CHECK_SIZEOF([struct stat.st_dev], [dev_t int long "long long"], [], [@%:@include <sys/stat.h>]) +AS_IF([test "$ac_cv_member_struct_stat_st_rdev" = yes], [ + RUBY_CHECK_SIZEOF([struct stat.st_rdev], [dev_t int long "long long"], [], [@%:@include <sys/stat.h>]) +]) AC_CHECK_MEMBERS([struct stat.st_atim]) AC_CHECK_MEMBERS([struct stat.st_atimespec]) AC_CHECK_MEMBERS([struct stat.st_atimensec]) @@ -1983,6 +1986,8 @@ AC_CHECK_MEMBERS([struct stat.st_ctim]) AC_CHECK_MEMBERS([struct stat.st_ctimespec]) AC_CHECK_MEMBERS([struct stat.st_ctimensec]) AC_CHECK_MEMBERS([struct stat.st_birthtimespec]) +AS_IF([test "x$ac_cv_member_struct_stat_st_birthtimespec" != xyes], + [AC_CHECK_MEMBERS([struct statx.stx_btime])]) AC_CHECK_TYPES([struct timeval], [], [], [@%:@ifdef HAVE_TIME_H @%:@include <time.h> @@ -2023,61 +2028,15 @@ AC_CHECK_TYPES([struct timezone], [], [], [@%:@ifdef HAVE_TIME_H @%:@ include <sys/time.h> @%:@endif]) -AC_CHECK_TYPES([clockid_t], [], [], [@%:@ifdef HAVE_TIME_H -@%:@ include <time.h> -@%:@endif -@%:@ifdef HAVE_SYS_TIME_H -@%:@ include <sys/time.h> -@%:@endif]) - AC_CACHE_VAL([rb_cv_large_fd_select], - [AC_CHECK_TYPE(fd_mask, [rb_cv_large_fd_select=yes], [rb_cv_large_fd_select=no], [@%:@ifdef HAVE_SYS_SELECT_H + [AC_CHECK_TYPE(fd_mask, [rb_cv_large_fd_select=yes], [rb_cv_large_fd_select=no], [AC_INCLUDES_DEFAULT([]) +@%:@ifdef HAVE_SYS_SELECT_H @%:@ include <sys/select.h> @%:@endif])]) AS_IF([test "$rb_cv_large_fd_select" = yes], [ AC_DEFINE(HAVE_RB_FD_INIT, 1) ]) -dnl RUBY_DEFINT TYPENAME, SIZE, [UNSIGNED], [INCLUDES = DEFAULT-INCLUDES] -AC_DEFUN([RUBY_DEFINT], [dnl -AS_VAR_PUSHDEF([cond], [rb_defint_cond])dnl -AS_VAR_PUSHDEF([type], [rb_defint_type])dnl -AC_CACHE_CHECK([for $1], [rb_cv_type_$1], -[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT([$4]) -typedef $1 t; int s = sizeof(t) == 42;])], - [rb_cv_type_$1=yes], - [AS_CASE([m4_bmatch([$2], [^[1-9][0-9]*$], $2, [$ac_cv_sizeof_]AS_TR_SH($2))], - ["1"], [ rb_cv_type_$1="m4_if([$3], [], [signed ], [$3 ])char"], - ["$ac_cv_sizeof_short"], [ rb_cv_type_$1="m4_if([$3], [], [], [$3 ])short"], - ["$ac_cv_sizeof_int"], [ rb_cv_type_$1="m4_if([$3], [], [], [$3 ])int"], - ["$ac_cv_sizeof_long"], [ rb_cv_type_$1="m4_if([$3], [], [], [$3 ])long"], - ["$ac_cv_sizeof_long_long"], [ rb_cv_type_$1="m4_if([$3], [], [], [$3 ])long long"], - ["${ac_cv_sizeof___int64@%:@*:}"], [ rb_cv_type_$1="m4_if([$3], [], [], [$3 ])__int64"], - ["${ac_cv_sizeof___int128@%:@*:}"], [ rb_cv_type_$1="m4_if([$3], [], [], [$3 ])__int128"], - [ rb_cv_type_$1=no])])]) -AS_IF([test "${rb_cv_type_$1}" != no], [ - type="${rb_cv_type_$1@%:@@%:@unsigned }" - AS_IF([test "$type" != yes && eval 'test -n "${ac_cv_sizeof_'$type'+set}"'], [ - eval cond='"${ac_cv_sizeof_'$type'}"' - AS_CASE([$cond], [*:*], [ - cond=AS_TR_CPP($type) - echo "@%:@if defined SIZEOF_"$cond" && SIZEOF_"$cond" > 0" >> confdefs.h - ], [cond=]) - ], [cond=]) - AC_DEFINE([HAVE_]AS_TR_CPP($1), 1) - AS_IF([test "${rb_cv_type_$1}" = yes], [ - m4_bmatch([$2], [^[1-9][0-9]*$], [AC_CHECK_SIZEOF([$1], 0, [AC_INCLUDES_DEFAULT([$4])])], - [RUBY_CHECK_SIZEOF([$1], [$2], [], [AC_INCLUDES_DEFAULT([$4])])]) - ], [ - AC_DEFINE_UNQUOTED($1, [$rb_cv_type_$1]) - AC_DEFINE_UNQUOTED([SIZEOF_]AS_TR_CPP($1), [SIZEOF_]AS_TR_CPP([$type])) - ]) - test -n "$cond" && echo "@%:@endif /* $cond */" >> confdefs.h -]) -AS_VAR_POPDEF([cond])dnl -AS_VAR_POPDEF([type])dnl -]) - RUBY_DEFINT(int8_t, 1) RUBY_DEFINT(uint8_t, 1, unsigned) RUBY_DEFINT(int16_t, 2) @@ -2090,52 +2049,29 @@ RUBY_DEFINT(int128_t, 16) RUBY_DEFINT(uint128_t, 16, unsigned) RUBY_DEFINT(intptr_t, void*) RUBY_DEFINT(uintptr_t, void*, unsigned) +AS_IF([test "x$rb_cv_type_intptr_t" != xno], [ + RUBY_CHECK_PRINTF_PREFIX(intptr_t, '' ll I64 l, PTR) +]) RUBY_DEFINT(ssize_t, size_t, [], [@%:@include <sys/types.h>]) dnl may differ from int, so not use AC_TYPE_SSIZE_T. +AS_IF([test "x$rb_cv_type_int64_t" != xno], [ + RUBY_CHECK_PRINTF_PREFIX(int64_t, ll I64 l, 64) +]) AC_CACHE_CHECK(for stack end address, rb_cv_stack_end_address, [rb_cv_stack_end_address=no - AC_TRY_LINK( - [extern void *__libc_stack_end;], - [if (!__libc_stack_end) return 1;], + AC_LINK_IFELSE([AC_LANG_PROGRAM( + [[extern void *__libc_stack_end;]], + [[if (!__libc_stack_end) return 1;]])], [rb_cv_stack_end_address="__libc_stack_end"]) ]) AS_IF([test $rb_cv_stack_end_address != no], [ AC_DEFINE_UNQUOTED(STACK_END_ADDRESS, $rb_cv_stack_end_address) ]) -# posix_memalign(memptr, alignment, size) implemented for OpenBSD 4.8 doesn't work if alignment > MALLOC_PAGESIZE. -# [ruby-core:42158] https://bugs.ruby-lang.org/issues/5901 -# OpenBSD 5.2 fixed the problem. (src/lib/libc/stdlib/malloc.c:1.142) -# MirOS #10semel has the problem but fixed in the repository. (src/lib/libc/stdlib/malloc.c:1.9) -AS_CASE(["$target_os"], -[openbsd*|mirbsd*], [ - AC_CACHE_CHECK(for heap align log on openbsd, rb_cv_page_size_log, - [rb_cv_page_size_log=no - for page_log in 12 13; do - AC_TRY_RUN([ -#include <math.h> -#include <unistd.h> - -int -main() { - if ((int)log2((double)sysconf(_SC_PAGESIZE)) != $page_log) return 1; - return 0; -} - ], - rb_cv_page_size_log="$page_log"; break) - done]) - AS_IF([test $rb_cv_page_size_log != no], [ - AC_DEFINE_UNQUOTED(HEAP_ALIGN_LOG, $rb_cv_page_size_log) - ], [ - AC_DEFINE_UNQUOTED(HEAP_ALIGN_LOG, 12) - ]) -]) - dnl Checks for library functions. AC_TYPE_GETGROUPS -AC_TYPE_SIGNAL AS_CASE(["${target_cpu}-${target_os}:${target_archs}"], -[powerpc-darwin*], [ +[powerpc*-darwin*], [ AC_LIBSOURCES(alloca.c) AC_SUBST([ALLOCA], [\${LIBOBJDIR}alloca.${ac_objext}]) AC_DEFINE(C_ALLOCA) @@ -2144,8 +2080,8 @@ AS_CASE(["${target_cpu}-${target_os}:${target_archs}"], [universal-darwin*:*ppc*], [ AC_LIBSOURCES(alloca.c) AC_SUBST([ALLOCA], [\${LIBOBJDIR}alloca.${ac_objext}]) - RUBY_DEFINE_IF([defined __powerpc__], C_ALLOCA, 1) - RUBY_DEFINE_IF([defined __powerpc__], alloca, alloca) + RUBY_DEFINE_IF([defined __POWERPC__], C_ALLOCA, 1) # Darwin defines __POWERPC__ for ppc and ppc64 both + RUBY_DEFINE_IF([defined __POWERPC__], alloca, alloca) ], [ AC_FUNC_ALLOCA @@ -2153,14 +2089,14 @@ AS_CASE(["${target_cpu}-${target_os}:${target_archs}"], AS_IF([test "x$ALLOCA" = "x"], [ AC_CACHE_CHECK([for dynamic size alloca], rb_cv_dynamic_alloca, [ for chk in ok __chkstk; do - AC_TRY_LINK([ + AC_LINK_IFELSE([AC_LANG_PROGRAM([[ @%:@ifdef HAVE_ALLOCA_H @%:@include <alloca.h> @%:@endif void $chk() {} int dynamic_alloca_test; - int dynamic_alloca_result;], - [dynamic_alloca_result = alloca(dynamic_alloca_test) != 0;], + int dynamic_alloca_result;]], + [[dynamic_alloca_result = alloca(dynamic_alloca_test) != 0;]])], [rb_cv_dynamic_alloca=$chk; break]) done]) AS_IF([test "x$rb_cv_dynamic_alloca" = "x__chkstk"], [ @@ -2173,43 +2109,30 @@ AS_IF([test "x$ALLOCA" = "x"], [ ]) AC_FUNC_MEMCMP -# http://sources.redhat.com/ml/libc-hacker/2005-08/msg00008.html -# Debian GNU/Linux Etch's libc6.1 2.3.6.ds1-13etch5 has this problem. -# Debian GNU/Linux Lenny's libc6.1 2.7-10 has no problem. -AC_CACHE_CHECK(for broken erfc of glibc-2.3.6 on IA64, rb_cv_broken_glibc_ia64_erfc, - [AC_TRY_RUN([ -#include <math.h> -int -main() -{ - erfc(10000.0); - return 0; -} -], - rb_cv_broken_glibc_ia64_erfc=no, - rb_cv_broken_glibc_ia64_erfc=yes, - rb_cv_broken_glibc_ia64_erfc=no)]) -AS_CASE([$rb_cv_broken_glibc_ia64_erfc],[yes],[ac_cv_func_erf=no]) - AS_CASE(["$target_os"],[freebsd*],[ AC_DEFINE(BROKEN_CLOSE) AC_REPLACE_FUNCS(close) ]) +# dup and dup2 are always available except for WASI +AS_CASE(["$target_os"], + [wasi*], [], + [ + RUBY_REQUIRE_FUNCS(dup dup2) + ] +) + AC_REPLACE_FUNCS(acosh) AC_REPLACE_FUNCS(cbrt) AC_REPLACE_FUNCS(crypt) -AC_REPLACE_FUNCS(dup2) AC_REPLACE_FUNCS(erf) AC_REPLACE_FUNCS(explicit_bzero) AC_REPLACE_FUNCS(ffs) -AC_REPLACE_FUNCS(finite) AC_REPLACE_FUNCS(flock) AC_REPLACE_FUNCS(hypot) -AC_REPLACE_FUNCS(isinf) -AC_REPLACE_FUNCS(isnan) AC_REPLACE_FUNCS(lgamma_r) AC_REPLACE_FUNCS(memmove) +AC_REPLACE_FUNCS(nan) AC_REPLACE_FUNCS(nextafter) AC_REPLACE_FUNCS(setproctitle) AC_REPLACE_FUNCS(strchr) @@ -2219,52 +2142,16 @@ AC_REPLACE_FUNCS(strlcpy) AC_REPLACE_FUNCS(strstr) AC_REPLACE_FUNCS(tgamma) +AC_DEFINE(HAVE_ISFINITE) # C99; backward compatibility + # for missing/setproctitle.c AS_CASE(["$target_os"], [aix* | k*bsd*-gnu | kopensolaris*-gnu | linux* | darwin*], [AC_DEFINE(SPT_TYPE,SPT_REUSEARGV)], -[hpux*], [AC_DEFINE(SPT_TYPE,SPT_PSTAT) ], []) AC_CHECK_HEADERS(sys/pstat.h) -AC_CACHE_CHECK(for signbit, rb_cv_have_signbit, - [AC_TRY_LINK([ -#include <math.h> -], [int v = signbit(-0.0);], - rb_cv_have_signbit=yes, - rb_cv_have_signbit=no)]) -AS_IF([test "$rb_cv_have_signbit" = yes], [ - AC_DEFINE(HAVE_SIGNBIT) -], [ - AC_LIBOBJ([signbit]) -]) - -AC_CACHE_CHECK(for broken memmem, rb_cv_broken_memmem, [ - AC_TRY_RUN([ -@%:@include <string.h> - -int -main(int argc, char **argv) -{ - const char *str = "hogefugafoobar"; - const char *rs = "foo"; - const char *empty = ""; - char *p; - - p = memmem(str, strlen(str), rs, strlen(rs)); - if (p == str+8) { - p = memmem(str, strlen(str), empty, strlen(empty)); - if (p == str) - return 0; - } - return 1; -} - ], - rb_cv_broken_memmem=no, - rb_cv_broken_memmem=yes, - rb_cv_broken_memmem=yes) -]) -test x"$rb_cv_broken_memmem" = xyes && ac_cv_func_memmem=no +AC_DEFINE(HAVE_SIGNBIT) # C99; backward compatibility AC_FUNC_FORK @@ -2274,9 +2161,13 @@ AC_CHECK_FUNCS(_longjmp) # used for AC_ARG_WITH(setjmp-type) test x$ac_cv_func__longjmp = xno && ac_cv_func__setjmp=no AC_CHECK_FUNCS(arc4random_buf) AC_CHECK_FUNCS(atan2l atan2f) +AC_CHECK_DECLS(atomic_signal_fence, [], [], [@%:@include <stdatomic.h>]) +AC_CHECK_FUNCS(chmod) +AC_CHECK_FUNCS(chown) AC_CHECK_FUNCS(chroot) AC_CHECK_FUNCS(chsize) AC_CHECK_FUNCS(clock_gettime) +AC_CHECK_FUNCS(copy_file_range) AC_CHECK_FUNCS(cosh) AC_CHECK_FUNCS(crypt_r) AC_CHECK_FUNCS(daemon) @@ -2284,10 +2175,17 @@ AC_CHECK_FUNCS(dirfd) AC_CHECK_FUNCS(dl_iterate_phdr) AC_CHECK_FUNCS(dlopen) AC_CHECK_FUNCS(dladdr) -AC_CHECK_FUNCS(dup) AC_CHECK_FUNCS(dup3) AC_CHECK_FUNCS(eaccess) AC_CHECK_FUNCS(endgrent) +AC_CHECK_FUNCS(eventfd) +AC_CHECK_FUNCS(execl) +AC_CHECK_FUNCS(execle) +AC_CHECK_FUNCS(execv) +AC_CHECK_FUNCS(execve) +AC_CHECK_FUNCS(explicit_memset) +AC_CHECK_FUNCS(fcopyfile) +AC_CHECK_FUNCS(fchdir) AC_CHECK_FUNCS(fchmod) AC_CHECK_FUNCS(fchown) AC_CHECK_FUNCS(fcntl) @@ -2301,25 +2199,38 @@ AC_CHECK_FUNCS(ftruncate) AC_CHECK_FUNCS(ftruncate64) # used for Win32 platform AC_CHECK_FUNCS(getattrlist) AC_CHECK_FUNCS(getcwd) +AC_CHECK_FUNCS(getegid) +AC_CHECK_FUNCS(getentropy) +AC_CHECK_FUNCS(geteuid) +AC_CHECK_FUNCS(getgid) AC_CHECK_FUNCS(getgidx) AC_CHECK_FUNCS(getgrnam) AC_CHECK_FUNCS(getgrnam_r) AC_CHECK_FUNCS(getgroups) +AC_CHECK_FUNCS(getlogin) +AC_CHECK_FUNCS(getlogin_r) AC_CHECK_FUNCS(getpgid) AC_CHECK_FUNCS(getpgrp) +AC_CHECK_FUNCS(getppid) AC_CHECK_FUNCS(getpriority) +AC_CHECK_FUNCS(getpwnam) AC_CHECK_FUNCS(getpwnam_r) +AC_CHECK_FUNCS(getpwuid) +AC_CHECK_FUNCS(getpwuid_r) +AC_CHECK_FUNCS(getrandom) AC_CHECK_FUNCS(getresgid) AC_CHECK_FUNCS(getresuid) AC_CHECK_FUNCS(getrlimit) AC_CHECK_FUNCS(getsid) AC_CHECK_FUNCS(gettimeofday) # for making ac_cv_func_gettimeofday +AC_CHECK_FUNCS(getuid) AC_CHECK_FUNCS(getuidx) AC_CHECK_FUNCS(gmtime_r) AC_CHECK_FUNCS(initgroups) AC_CHECK_FUNCS(ioctl) AC_CHECK_FUNCS(isfinite) AC_CHECK_FUNCS(issetugid) +AC_CHECK_FUNCS(kill) AC_CHECK_FUNCS(killpg) AC_CHECK_FUNCS(lchmod) AC_CHECK_FUNCS(lchown) @@ -2328,8 +2239,10 @@ AC_CHECK_FUNCS(llabs) AC_CHECK_FUNCS(lockf) AC_CHECK_FUNCS(log2) AC_CHECK_FUNCS(lstat) +AC_CHECK_FUNCS(lutimes) AC_CHECK_FUNCS(malloc_usable_size) AC_CHECK_FUNCS(malloc_size) +AC_CHECK_FUNCS(malloc_trim) AC_CHECK_FUNCS(mblen) AC_CHECK_FUNCS(memalign) AC_CHECK_FUNCS(memset_s) @@ -2339,10 +2252,16 @@ AC_CHECK_FUNCS(memmem) AC_CHECK_FUNCS(mkfifo) AC_CHECK_FUNCS(mknod) AC_CHECK_FUNCS(mktime) +AC_CHECK_FUNCS(mmap) +AC_CHECK_FUNCS(mremap) AC_CHECK_FUNCS(openat) +AC_CHECK_FUNCS(pclose) +AC_CHECK_FUNCS(pipe) AC_CHECK_FUNCS(pipe2) AC_CHECK_FUNCS(poll) +AC_CHECK_FUNCS(popen) AC_CHECK_FUNCS(posix_fadvise) +AC_CHECK_FUNCS(posix_madvise) AC_CHECK_FUNCS(posix_memalign) AC_CHECK_FUNCS(ppoll) AC_CHECK_FUNCS(pread) @@ -2350,6 +2269,7 @@ AC_CHECK_FUNCS(pwrite) AC_CHECK_FUNCS(qsort_r) AC_CHECK_FUNCS(qsort_s) AC_CHECK_FUNCS(readlink) +AC_CHECK_FUNCS(realpath) AC_CHECK_FUNCS(round) AC_CHECK_FUNCS(sched_getaffinity) AC_CHECK_FUNCS(seekdir) @@ -2376,28 +2296,34 @@ AC_CHECK_FUNCS(sigaction) AC_CHECK_FUNCS(sigaltstack) AC_CHECK_FUNCS(sigprocmask) AC_CHECK_FUNCS(sinh) +AC_CHECK_FUNCS(snprintf) AC_CHECK_FUNCS(spawnv) AC_CHECK_FUNCS(symlink) AC_CHECK_FUNCS(syscall) AC_CHECK_FUNCS(sysconf) +AC_CHECK_FUNCS(system) AC_CHECK_FUNCS(tanh) AC_CHECK_FUNCS(telldir) AC_CHECK_FUNCS(timegm) AC_CHECK_FUNCS(times) AC_CHECK_FUNCS(truncate) AC_CHECK_FUNCS(truncate64) # used for Win32 +AC_CHECK_FUNCS(tzset) +AC_CHECK_FUNCS(umask) AC_CHECK_FUNCS(unsetenv) AC_CHECK_FUNCS(utimensat) AC_CHECK_FUNCS(utimes) AC_CHECK_FUNCS(wait4) AC_CHECK_FUNCS(waitpid) +AC_CHECK_FUNCS(__cospi) +AC_CHECK_FUNCS(__sinpi) -AS_IF([test "$ac_cv_func_memset_s" = yes], - [RUBY_DEFINE_IF([!defined __STDC_WANT_LIB_EXT1__], [__STDC_WANT_LIB_EXT1__], 1)]) +AS_IF([test "x$ac_cv_member_struct_statx_stx_btime" = xyes], + [AC_CHECK_FUNCS(statx)]) AS_IF([test "$ac_cv_func_getcwd" = yes], [ AC_CACHE_CHECK(if getcwd allocates buffer if NULL is given, [rb_cv_getcwd_malloc], - [AC_TRY_RUN([ + [AC_RUN_IFELSE([AC_LANG_SOURCE([[ @%:@include <stddef.h> @%:@include <stdio.h> @%:@ifdef HAVE_UNISTD_H @@ -2416,11 +2342,11 @@ main(int argc, char **argv) if (!getcwd(NULL, 0)) return EXIT_FAILURE; return EXIT_SUCCESS; } -], +]])], rb_cv_getcwd_malloc=yes, rb_cv_getcwd_malloc=no, AS_CASE($target_os, - [linux*|darwin*|*bsd|cygwin*|mingw*|mswin*], + [linux*|darwin*|*bsd|cygwin*|msys*|mingw*|mswin*], [rb_cv_getcwd_malloc=yes], [rb_cv_getcwd_malloc=no]))]) AS_IF([test "$rb_cv_getcwd_malloc" = no], [AC_DEFINE(NO_GETCWD_MALLOC, 1)]) @@ -2432,15 +2358,8 @@ AS_IF([test "$ac_cv_func_crypt_r:$ac_cv_header_crypt_h" = yes:yes], [AC_CHECK_MEMBERS([struct crypt_data.initialized], [], [], [AC_INCLUDES_DEFAULT([@%:@include <crypt.h>])])]) -AC_DEFUN([RUBY_CHECK_BUILTIN_FUNC], [dnl -AC_CACHE_CHECK([for $1], AS_TR_SH(rb_cv_builtin_$1), - [AC_LINK_IFELSE( - [AC_LANG_PROGRAM([int foo;], [$2;])], - [AS_TR_SH(rb_cv_builtin_$1)=yes], - [AS_TR_SH(rb_cv_builtin_$1)=no])]) -AS_IF([test "${AS_TR_SH(rb_cv_builtin_$1)}" != no], [ - AC_DEFINE(AS_TR_CPP(HAVE_BUILTIN_$1)) -])]) +RUBY_CHECK_BUILTIN_FUNC(__builtin_alloca_with_align, [__builtin_alloca_with_align(1, 4096)]) +RUBY_CHECK_BUILTIN_FUNC(__builtin_assume_aligned, [__builtin_assume_aligned((void*)32, 32)]) RUBY_CHECK_BUILTIN_FUNC(__builtin_bswap16, [__builtin_bswap16(0)]) RUBY_CHECK_BUILTIN_FUNC(__builtin_bswap32, [__builtin_bswap32(0)]) RUBY_CHECK_BUILTIN_FUNC(__builtin_bswap64, [__builtin_bswap64(0)]) @@ -2451,10 +2370,6 @@ RUBY_CHECK_BUILTIN_FUNC(__builtin_clzl, [__builtin_clzl(0)]) RUBY_CHECK_BUILTIN_FUNC(__builtin_clzll, [__builtin_clzll(0)]) RUBY_CHECK_BUILTIN_FUNC(__builtin_ctz, [__builtin_ctz(0)]) RUBY_CHECK_BUILTIN_FUNC(__builtin_ctzll, [__builtin_ctzll(0)]) -RUBY_CHECK_BUILTIN_FUNC(__builtin_add_overflow, [int x;__builtin_add_overflow(0,0,&x)]) -RUBY_CHECK_BUILTIN_FUNC(__builtin_sub_overflow, [int x;__builtin_sub_overflow(0,0,&x)]) -RUBY_CHECK_BUILTIN_FUNC(__builtin_mul_overflow, [int x;__builtin_mul_overflow(0,0,&x)]) -RUBY_CHECK_BUILTIN_FUNC(__builtin_mul_overflow_p, [__builtin_mul_overflow_p(0,0,(int)0)]) RUBY_CHECK_BUILTIN_FUNC(__builtin_constant_p, [__builtin_constant_p(0)]) RUBY_CHECK_BUILTIN_FUNC(__builtin_choose_expr, [ [int x[__extension__(__builtin_choose_expr(1, 1, -1))]]; @@ -2467,24 +2382,30 @@ AS_IF([test x$rb_cv_builtin___builtin_choose_expr = xyes], [ ]) ]) RUBY_CHECK_BUILTIN_FUNC(__builtin_types_compatible_p, [__builtin_types_compatible_p(int, int)]) +RUBY_CHECK_BUILTIN_FUNC(__builtin_trap, [__builtin_trap()]) +RUBY_CHECK_BUILTIN_FUNC(__builtin_expect, [__builtin_expect(0, 0)]) + +RUBY_CHECK_BUILTIN_OVERFLOW(add) +RUBY_CHECK_BUILTIN_OVERFLOW(sub) +RUBY_CHECK_BUILTIN_OVERFLOW(mul) AS_IF([test "$ac_cv_func_qsort_r" != no], [ AC_CACHE_CHECK(whether qsort_r is GNU version, rb_cv_gnu_qsort_r, - [AC_TRY_COMPILE([ + [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ @%:@include <stdlib.h> -void qsort_r(void *base, size_t nmemb, size_t size, +void (qsort_r)(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *, void *), void *arg); -],[ ], +]], [[ ]])], [rb_cv_gnu_qsort_r=yes], [rb_cv_gnu_qsort_r=no]) ]) AC_CACHE_CHECK(whether qsort_r is BSD version, rb_cv_bsd_qsort_r, - [AC_TRY_COMPILE([ + [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ @%:@include <stdlib.h> -void qsort_r(void *base, size_t nmemb, size_t size, +void (qsort_r)(void *base, size_t nmemb, size_t size, void *arg, int (*compar)(void *, const void *, const void *)); -],[ ], +]], [[ ]])], [rb_cv_bsd_qsort_r=yes], [rb_cv_bsd_qsort_r=no]) ]) @@ -2499,7 +2420,7 @@ void qsort_r(void *base, size_t nmemb, size_t size, AC_CACHE_CHECK(whether atan2 handles Inf as C99, rb_cv_atan2_inf_c99, [ AS_IF([test $ac_cv_func_atan2f:$ac_cv_func_atan2l = yes:yes], [ - AC_TRY_RUN([ + AC_RUN_IFELSE([AC_LANG_SOURCE([[ @%:@include <math.h> @%:@ifdef HAVE_UNISTD_H @%:@include <unistd.h> @@ -2517,7 +2438,7 @@ main(int argc, char **argv) if (fabs(atan2(INFINITY, INFINITY) - M_PI_4) <= 0.01) return EXIT_SUCCESS; return EXIT_FAILURE; } -], +]])], [rb_cv_atan2_inf_c99=yes], [rb_cv_atan2_inf_c99=no], [AS_CASE($target_os, [mingw*|mswin*], [rb_cv_atan2_inf_c99=no], [rb_cv_atan2_inf_c99=yes])] @@ -2529,119 +2450,32 @@ AS_IF([test "x$rb_cv_atan2_inf_c99" = xyes], [AC_DEFINE(ATAN2_INF_C99)]) # Some platform need -lrt for clock_gettime, but the other don't. AS_IF([test x"$ac_cv_func_clock_gettime" != xyes], [ # glibc 2.17 moves clock_* functions from librt to the main C library. - # http://sourceware.org/ml/libc-announce/2012/msg00001.html + # https://sourceware.org/legacy-ml/libc-announce/2012/msg00001.html AC_CHECK_LIB(rt, clock_gettime) AS_IF([test x"$ac_cv_lib_rt_clock_gettime" = xyes], [ AC_DEFINE(HAVE_CLOCK_GETTIME, 1) ]) ]) AC_CHECK_FUNCS(clock_getres) # clock_getres should be tested after clock_gettime test including librt test. +AC_CHECK_LIB([rt], [timer_create]) +AC_CHECK_LIB([rt], [timer_settime]) +AS_IF([test x"$ac_cv_lib_rt_timer_create" = xyes], [ + AC_DEFINE(HAVE_TIMER_CREATE, 1) +]) +AS_IF([test x"$ac_cv_lib_rt_timer_settime" = xyes], [ + AC_DEFINE(HAVE_TIMER_SETTIME, 1) +]) AC_CACHE_CHECK(for unsetenv returns a value, rb_cv_unsetenv_return_value, - [AC_TRY_COMPILE([ + [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #include <stdlib.h> -], [int v = unsetenv("foo");], +]], [[int v = unsetenv("foo");]])], rb_cv_unsetenv_return_value=yes, rb_cv_unsetenv_return_value=no)]) AS_IF([test "$rb_cv_unsetenv_return_value" = no], [ AC_DEFINE(VOID_UNSETENV) ]) -# used for AC_ARG_WITH(setjmp-type) -AC_DEFUN([RUBY_CHECK_SETJMP], [ -AC_CACHE_CHECK([for ]$1[ as a macro or function], ac_cv_func_$1, - [AC_TRY_COMPILE([ -@%:@include <setjmp.h> -]AC_INCLUDES_DEFAULT([$3])[ -@%:@define JMPARGS_1 env -@%:@define JMPARGS_2 env,1 -@%:@define JMPARGS JMPARGS_]m4_ifval($2,2,1)[ -], - m4_ifval($2,$2,jmp_buf)[ env; $1(JMPARGS);], - ac_cv_func_$1=yes, - ac_cv_func_$1=no)] -) -AS_IF([test "$ac_cv_func_]$1[" = yes], [AC_DEFINE([HAVE_]AS_TR_CPP($1), 1)]) -]) - -AC_DEFUN([RUBY_CHECK_BUILTIN_SETJMP], [ -AS_IF([test x"${ac_cv_func___builtin_setjmp}" = xyes], [ - unset ac_cv_func___builtin_setjmp -]) -AC_CACHE_CHECK(for __builtin_setjmp, ac_cv_func___builtin_setjmp, - [ - ac_cv_func___builtin_setjmp=no - for cast in "" "(void **)"; do - RUBY_WERROR_FLAG( - [AC_TRY_LINK([@%:@include <setjmp.h> - @%:@include <stdio.h> - jmp_buf jb; - @%:@ifdef NORETURN - NORETURN(void t(void)); - @%:@endif - void t(void) {__builtin_longjmp($cast jb, 1);} - int jump(void) {(void)(__builtin_setjmp($cast jb) ? 1 : 0); return 0;}], - [ - void (*volatile f)(void) = t; - if (!jump()) printf("%d\n", f != 0); - ], - [ac_cv_func___builtin_setjmp="yes with cast ($cast)"]) - ]) - test "$ac_cv_func___builtin_setjmp" = no || break - done]) -]) - -AC_DEFUN([RUBY_SETJMP_TYPE], [ -RUBY_CHECK_BUILTIN_SETJMP -RUBY_CHECK_SETJMP(_setjmpex, [], [@%:@include <setjmpex.h>]) -RUBY_CHECK_SETJMP(_setjmp) -RUBY_CHECK_SETJMP(sigsetjmp, [sigjmp_buf]) -AC_MSG_CHECKING(for setjmp type) -setjmp_suffix= -unset setjmp_sigmask -AC_ARG_WITH(setjmp-type, - AS_HELP_STRING([--with-setjmp-type], [select setjmp type]), - [ - AS_CASE([$withval], - [__builtin_setjmp], [setjmp=__builtin_setjmp], - [_setjmp], [ setjmp_prefix=_], - [sigsetjmp,*], [ setjmp_prefix=sig setjmp_sigmask=`expr "$withval" : 'sigsetjmp\(,.*\)'`], - [sigsetjmp], [ setjmp_prefix=sig], - [setjmp], [ setjmp_prefix=], - [setjmpex], [ setjmp_prefix= setjmp_suffix=ex], - [''], [ unset setjmp_prefix], - [ AC_MSG_ERROR(invalid setjmp type: $withval)])], [unset setjmp_prefix]) -setjmp_cast= -AS_IF([test ${setjmp_prefix+set}], [ - AS_IF([test "${setjmp_prefix}" && eval test '$ac_cv_func_'${setjmp_prefix}setjmp${setjmp_suffix} = no], [ - AC_MSG_ERROR(${setjmp_prefix}setjmp${setjmp_suffix} is not available) - ]) -], [{ AS_CASE("$ac_cv_func___builtin_setjmp", [yes*], [true], [false]) }], [ - setjmp_cast=`expr "$ac_cv_func___builtin_setjmp" : "yes with cast (\(.*\))"` - setjmp_prefix=__builtin_ - setjmp_suffix= -], [test "$ac_cv_header_setjmpex_h:$ac_cv_func__setjmpex" = yes:yes], [ - setjmp_prefix= - setjmp_suffix=ex -], [test "$ac_cv_func__setjmp" = yes], [ - setjmp_prefix=_ - setjmp_suffix= -], [test "$ac_cv_func_sigsetjmp" = yes], [ - AS_CASE([$target_os],[solaris*|cygwin*],[setjmp_prefix=],[setjmp_prefix=sig]) - setjmp_suffix= -], [ - setjmp_prefix= - setjmp_suffix= -]) -AS_IF([test x$setjmp_prefix:$setjmp_sigmask = xsig:], [ - setjmp_sigmask=,0 -]) -AC_MSG_RESULT(${setjmp_prefix}setjmp${setjmp_suffix}${setjmp_cast:+\($setjmp_cast\)}${setjmp_sigmask}) -AC_DEFINE_UNQUOTED([RUBY_SETJMP(env)], [${setjmp_prefix}setjmp${setjmp_suffix}($setjmp_cast(env)${setjmp_sigmask})]) -AC_DEFINE_UNQUOTED([RUBY_LONGJMP(env,val)], [${setjmp_prefix}longjmp($setjmp_cast(env),val)]) -AC_DEFINE_UNQUOTED(RUBY_JMP_BUF, ${setjmp_sigmask+${setjmp_prefix}}jmp_buf) -AS_IF([test x$setjmp_suffix = xex], [AC_DEFINE_UNQUOTED(RUBY_USE_SETJMPEX, 1)]) -]) # End of setjmp check. AC_ARG_ENABLE(setreuid, @@ -2653,21 +2487,21 @@ AS_IF([test "$use_setreuid" = yes], [ ]) AC_STRUCT_TIMEZONE AC_CACHE_CHECK(for struct tm.tm_gmtoff, rb_cv_member_struct_tm_tm_gmtoff, - [AC_TRY_COMPILE([ + [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ @%:@define _BSD_SOURCE @%:@define _DEFAULT_SOURCE @%:@include <time.h> - ], - [struct tm t; t.tm_gmtoff = 3600;], + ]], + [[struct tm t; t.tm_gmtoff = 3600;]])], [rb_cv_member_struct_tm_tm_gmtoff=yes], [rb_cv_member_struct_tm_tm_gmtoff=no])]) AS_IF([test "$rb_cv_member_struct_tm_tm_gmtoff" = yes], [ AC_DEFINE(HAVE_STRUCT_TM_TM_GMTOFF) ]) AC_CACHE_CHECK(for external int daylight, rb_cv_have_daylight, - [AC_TRY_LINK([#include <time.h> - int i;], - [i = daylight;], + [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <time.h> + int i;]], + [[i = daylight;]])], rb_cv_have_daylight=yes, rb_cv_have_daylight=no)]) AS_IF([test "$rb_cv_have_daylight" = yes], [ @@ -2675,14 +2509,12 @@ AS_IF([test "$rb_cv_have_daylight" = yes], [ ]) AC_CACHE_CHECK(for negative time_t for gmtime(3), rb_cv_negative_time_t, - [AC_TRY_RUN([ + [AC_RUN_IFELSE([AC_LANG_SOURCE([[ #include <stdlib.h> #include <time.h> void -check(tm, y, m, d, h, s) - struct tm *tm; - int y, m, d, h, s; +check(struct tm *tm, int y, int m, int d, int h, int s) { if (!tm || tm->tm_year != y || @@ -2705,7 +2537,7 @@ main() check(gmtime(&t), 1, 12, 13, 20, 52); return 0; } -], +]])], rb_cv_negative_time_t=yes, rb_cv_negative_time_t=no, rb_cv_negative_time_t=yes)]) @@ -2714,9 +2546,9 @@ AS_IF([test "$rb_cv_negative_time_t" = yes], [ ]) # [ruby-dev:40910] overflow of time on FreeBSD -# http://www.freebsd.org/cgi/query-pr.cgi?pr=145341 +# https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=145341 AC_CACHE_CHECK(for localtime(3) overflow correctly, rb_cv_localtime_overflow, - [AC_TRY_RUN([ + [AC_RUN_IFELSE([AC_LANG_SOURCE([[ #include <stdlib.h> #include <time.h> @@ -2748,7 +2580,7 @@ main() check(t); return 0; } -], +]])], rb_cv_localtime_overflow=yes, rb_cv_localtime_overflow=no, rb_cv_localtime_overflow=no)]) @@ -2761,13 +2593,12 @@ AS_IF([test "$ac_cv_func_sigprocmask" = yes && test "$ac_cv_func_sigaction" = ye ], [ AC_CHECK_FUNCS(sigsetmask) AC_CACHE_CHECK(for BSD signal semantics, rb_cv_bsd_signal, - [AC_TRY_RUN([ + [AC_RUN_IFELSE([AC_LANG_SOURCE([[ #include <stdio.h> #include <signal.h> void -sig_handler(dummy) - int dummy; +sig_handler(int dummy) { } @@ -2779,7 +2610,7 @@ main() kill(getpid(), SIGINT); return 0; } -], +]])], rb_cv_bsd_signal=yes, rb_cv_bsd_signal=no, rb_cv_bsd_signal=$ac_cv_func_sigsetmask)]) @@ -2793,7 +2624,7 @@ AC_CHECK_TYPES([sig_t],[],[],[@%:@include <signal.h>]) AS_IF([test "$ac_cv_func_getpgid" = no], [ # AC_FUNC_GETPGRP fails when cross-compiling with old autoconf. # autoconf is changed between 2.52d and 2.52f? - # http://lists.gnu.org/archive/html/bug-gnu-utils/2001-09/msg00181.html + # https://lists.gnu.org/archive/html/bug-gnu-utils/2001-09/msg00181.html # "autoconf cleanup for AC_FUNC_GETPGRP and GETPGRP_VOID" AC_FUNC_GETPGRP ]) @@ -2812,21 +2643,6 @@ AS_IF([test x"$ac_cv_func_dirfd" = xno], [ ])]) ]) -AS_IF([test x"$target_cpu" = xia64], [ - AC_LIBOBJ([ia64]) - AC_CACHE_CHECK(for __libc_ia64_register_backing_store_base, - rb_cv___libc_ia64_register_backing_store_base, - [rb_cv___libc_ia64_register_backing_store_base=no - AC_TRY_LINK( - [extern unsigned long __libc_ia64_register_backing_store_base;], - [unsigned long p = __libc_ia64_register_backing_store_base; - printf("%ld\n", p);], - [rb_cv___libc_ia64_register_backing_store_base=yes])]) - AS_IF([test $rb_cv___libc_ia64_register_backing_store_base = yes], [ - AC_DEFINE(HAVE___LIBC_IA64_REGISTER_BACKING_STORE_BASE) - ]) -]) - AC_CACHE_CHECK(whether right shift preserve sign bit, rb_cv_rshift_sign, [AC_COMPILE_IFELSE([AC_LANG_BOOL_COMPILE_TRY([], [(-1==(-1>>1))])], rb_cv_rshift_sign=yes, @@ -2837,55 +2653,55 @@ AS_IF([test "$rb_cv_rshift_sign" = yes], [ AC_DEFINE(RSHIFT(x,y), (((x)<0) ? ~((~(x))>>(int)(y)) : (x)>>(int)(y))) ]) -AS_IF([test x"$ac_cv_func_gettimeofday" != xyes], [ - AC_MSG_ERROR(gettimeofday() must exist) +AS_IF([test "$ac_cv_func_copy_file_range" = no], [ + AC_CACHE_CHECK([for copy_file_range], + rb_cv_use_copy_file_range, + [AC_RUN_IFELSE([AC_LANG_SOURCE([[ +#include <sys/types.h> +#include <sys/stat.h> +#include <sys/syscall.h> +#include <fcntl.h> +#include <unistd.h> + +#ifndef O_TMPFILE + #define O_TMPFILE __O_TMPFILE +#endif + +int +main() +{ +#ifdef __NR_copy_file_range + int ret, fd_in, fd_out; + fd_in = open("/tmp", O_TMPFILE|O_RDWR, S_IRUSR); + fd_out = open("/tmp", O_TMPFILE|O_WRONLY, S_IWUSR); + ret = syscall(__NR_copy_file_range, fd_in, NULL, fd_out, NULL, 0, 0); + close(fd_in); + close(fd_out); + if (ret == -1) { return 1; } + return 0; +#else + return 1; +#endif +} + ]])], + [rb_cv_use_copy_file_range=yes], + [rb_cv_use_copy_file_range=no], + [rb_cv_use_copy_file_range=no])]) +]) +AS_CASE(["$ac_cv_func_copy_file_range:$rb_cv_use_copy_file_range"], [*yes*], [ + AC_DEFINE(USE_COPY_FILE_RANGE) +]) + +AS_CASE(["$ac_cv_func_gettimeofday:$ac_cv_func_clock_gettime"], +[*yes*], [], +[ + AC_MSG_ERROR(clock_gettime() or gettimeofday() must exist) ]) AS_IF([test "$ac_cv_func_sysconf" = yes], [ - AC_DEFUN([RUBY_CHECK_SYSCONF], [dnl - AC_CACHE_CHECK([whether _SC_$1 is supported], rb_cv_have_sc_[]m4_tolower($1), - [AC_TRY_COMPILE([#include <unistd.h> - ], - [_SC_$1 >= 0], - rb_cv_have_sc_[]m4_tolower($1)=yes, - rb_cv_have_sc_[]m4_tolower($1)=no) - ]) - AS_IF([test "$rb_cv_have_sc_[]m4_tolower($1)" = yes], [ - AC_DEFINE(HAVE__SC_$1) - ]) - ]) RUBY_CHECK_SYSCONF(CLK_TCK) ]) -AC_DEFUN([RUBY_STACK_GROW_DIRECTION], [ - AS_VAR_PUSHDEF([stack_grow_dir], [rb_cv_stack_grow_dir_$1]) - AC_CACHE_CHECK(stack growing direction on $1, stack_grow_dir, [ -AS_CASE(["$1"], -[m68*|x86*|x64|i?86|ia64|ppc*|sparc*|alpha*], [ $2=-1], -[hppa*], [ $2=+1], -[ - AC_TRY_RUN([ -/* recurse to get rid of inlining */ -static int -stack_growup_p(addr, n) - volatile int *addr, n; -{ - volatile int end; - if (n > 0) - return *addr = stack_growup_p(addr, n - 1); - else - return (&end > addr); -} -int main() -{ - int x; - return stack_growup_p(&x, 10); -} -], $2=-1, $2=+1, $2=0) - ]) -eval stack_grow_dir=\$$2]) -eval $2=\$stack_grow_dir -AS_VAR_POPDEF([stack_grow_dir])]) AS_IF([test "${universal_binary-no}" = yes ], [ archflagpat=`eval echo '"'"${ARCH_FLAG}"'"' | sed 's/[[][|.*]]/\\&/g'` save_CFLAGS="$CFLAGS" new_cflags=`echo "$CFLAGS" | sed "s|$archflagpat"'||'` @@ -2917,35 +2733,144 @@ AS_IF([test "${universal_binary-no}" = yes ], [ AC_DEFINE_UNQUOTED(STACK_GROW_DIRECTION, $dir) ]) -AS_IF([test x"$enable_pthread" = xyes], [ - for pthread_lib in thr pthread pthreads c c_r root; do - AC_CHECK_LIB($pthread_lib, pthread_kill, - rb_with_pthread=yes, rb_with_pthread=no) - AS_IF([test "$rb_with_pthread" = "yes"], [ break; fi - done - AS_IF([test x"$rb_with_pthread" = xyes], [ - AC_DEFINE(_REENTRANT) - AC_DEFINE(_THREAD_SAFE) - AC_DEFINE(HAVE_LIBPTHREAD) - AC_CHECK_HEADERS(pthread_np.h, [], [], [@%:@include <pthread.h>]) - AS_CASE([$pthread_lib], - [c], [], - [root], [], - [c_r], [MAINLIBS="-pthread $MAINLIBS"], - [AS_CASE(["$target_os"], - [openbsd*|mirbsd*], [LIBS="-pthread $LIBS"], - [LIBS="-l$pthread_lib $LIBS"])]) - ], [ - AC_MSG_WARN("Don't know how to find pthread library on your system -- thread support disabled") - ]) +AC_ARG_WITH(coroutine, + AS_HELP_STRING([--with-coroutine=IMPLEMENTATION], [specify the coroutine implementation to use]), + [coroutine_type=$withval], [coroutine_type=]) +AS_CASE([$coroutine_type], [yes|''], [ + coroutine_type= + AS_CASE(["$target_cpu-$target_os"], + [universal-darwin*], [ + coroutine_type=universal + ], + [x*64-darwin*], [ + coroutine_type=amd64 + ], + [arm64-darwin*], [ + coroutine_type=arm64 + ], + # Correct target name is powerpc*-, but Ruby seems to prefer ppc*-. + # Notice that Darwin PPC ABI differs from AIX and ELF. + # Adding PPC targets for AIX, *BSD and *Linux will require separate implementations. + [powerpc-darwin*|ppc-darwin*], [ + coroutine_type=ppc + ], + [powerpc64-darwin*|ppc64-darwin*], [ + coroutine_type=ppc64 + ], + [x*64-linux*], [ + AS_CASE(["$ac_cv_sizeof_voidp"], + [8], [ coroutine_type=amd64 ], + [4], [ coroutine_type=x86 ], + dnl unknown pointer size, bail out as no Context.h soon. + ) + ], + [*86-linux*], [ + coroutine_type=x86 + ], + [x64-mingw*], [ + coroutine_type=win64 + ], + [*86-mingw*], [ + coroutine_type=win32 + ], + [aarch64-mingw*], [ + coroutine_type=arm64 + ], + [arm*-linux*], [ + coroutine_type=arm32 + ], + [aarch64-linux*], [ + coroutine_type=arm64 + ], + [powerpc64le-linux*], [ + coroutine_type=ppc64le + ], + [riscv64-linux*], [ + coroutine_type=riscv64 + ], + [loongarch64-linux*], [ + coroutine_type=loongarch64 + ], + [x86_64-freebsd*], [ + coroutine_type=amd64 + ], + [i386-freebsd*], [ + coroutine_type=x86 + ], + [aarch64-freebsd*], [ + coroutine_type=arm64 + ], + [powerpc64-freebsd*], [ + coroutine_type=ppc64le + ], + [powerpc64le-freebsd*], [ + coroutine_type=ppc64le + ], + [x86_64-netbsd*], [ + coroutine_type=amd64 + ], + [i386-netbsd*], [ + coroutine_type=x86 + ], + [aarch64-netbsd*], [ + coroutine_type=arm64 + ], + [x86_64-openbsd*], [ + coroutine_type=amd64 + ], + [i386-openbsd*], [ + coroutine_type=x86 + ], + [aarch64-openbsd*], [ + coroutine_type=arm64 + ], + [riscv64-openbsd*], [ + coroutine_type=riscv64 + ], + [*-openbsd*], [ + coroutine_type=pthread + ], + [x86_64-dragonfly*], [ + coroutine_type=amd64 + ], + [*-haiku*], [ + coroutine_type=pthread + ], + [*-emscripten*], [ + coroutine_type=emscripten + ], + [*-wasi*], [ + coroutine_type=asyncify + ], + [ + AC_CHECK_FUNCS([getcontext swapcontext makecontext], + [coroutine_type=ucontext], + [coroutine_type=pthread; break] + ) + ] + ) + AC_MSG_CHECKING(native coroutine implementation for ${target_cpu}-${target_os}) + AC_MSG_RESULT(${coroutine_type}) +]) +COROUTINE_H=coroutine/$coroutine_type/Context.h +AS_IF([test ! -f "$srcdir/$COROUTINE_H"], + [AC_MSG_ERROR('$coroutine_type' is not supported as coroutine)]) +COROUTINE_SRC=coroutine/$coroutine_type/Context.c +AS_IF([test ! -f "$srcdir/$COROUTINE_SRC"], + [COROUTINE_SRC=coroutine/$coroutine_type/Context.'$(ASMEXT)']) +AC_DEFINE_UNQUOTED(COROUTINE_H, ["$COROUTINE_H"]) +AC_SUBST(X_COROUTINE_H, [$COROUTINE_H]) +AC_SUBST(X_COROUTINE_SRC, [$COROUTINE_SRC]) + +AS_IF([test "$THREAD_MODEL" = pthread], [ AC_CACHE_CHECK([whether pthread_t is scalar type], [rb_cv_scalar_pthread_t], [ - AC_TRY_COMPILE([ + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ @%:@include <pthread.h> - ], [ + ]], [[ pthread_t thread_id; thread_id = 0; if (!thread_id) return 0; - ], [rb_cv_scalar_pthread_t=yes], [rb_cv_scalar_pthread_t=no]) + ]])],[rb_cv_scalar_pthread_t=yes],[rb_cv_scalar_pthread_t=no]) ]) AS_IF([test x"$rb_cv_scalar_pthread_t" = xyes], [ : # RUBY_CHECK_SIZEOF(pthread_t, [void* int long], [], [@%:@include <pthread.h>]) @@ -2953,32 +2878,33 @@ AS_IF([test x"$enable_pthread" = xyes], [ AC_DEFINE(NON_SCALAR_THREAD_ID) ]) AC_CHECK_FUNCS(sched_yield pthread_attr_setinheritsched \ - pthread_attr_get_np pthread_attr_getstack pthread_attr_init \ + pthread_attr_get_np pthread_attr_getstack pthread_attr_getguardsize \ pthread_get_stackaddr_np pthread_get_stacksize_np \ thr_stksegment pthread_stackseg_np pthread_getthrds_np \ - pthread_cond_init pthread_condattr_setclock pthread_condattr_init \ - pthread_sigmask pthread_setname_np pthread_set_name_np) + pthread_condattr_setclock \ + pthread_setname_np pthread_set_name_np) + AS_CASE(["$target_os"],[emscripten*],[ac_cv_func_pthread_sigmask=no],[AC_CHECK_FUNCS(pthread_sigmask)]) AS_CASE(["$target_os"],[aix*],[ac_cv_func_pthread_getattr_np=no],[AC_CHECK_FUNCS(pthread_getattr_np)]) set_current_thread_name= AS_IF([test "$ac_cv_func_pthread_setname_np" = yes], [ AC_CACHE_CHECK([arguments of pthread_setname_np], [rb_cv_func_pthread_setname_np_arguments], [rb_cv_func_pthread_setname_np_arguments= # Linux,AIX, (pthread_self(), name) - # NetBSD (pthread_self(), name, \"%s\") + # NetBSD (pthread_self(), \"%s\", name) # Darwin (name) for mac in \ "(pthread_self(), name)" \ - "(pthread_self(), name, \"%s\")" \ + "(pthread_self(), \"%s\", name)" \ "(name)" \ ; do - AC_TRY_COMPILE([ + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ @%:@include <pthread.h> @%:@ifdef HAVE_PTHREAD_NP_H @%:@include <pthread_np.h> @%:@endif @%:@define SET_THREAD_NAME(name) pthread_setname_np${mac} - ], - [if (SET_THREAD_NAME("conftest")) return 1;], + ]], + [[if (SET_THREAD_NAME("conftest")) return 1;]])], [rb_cv_func_pthread_setname_np_arguments="${mac}" break]) done @@ -2998,12 +2924,28 @@ AS_IF([test x"$enable_pthread" = xyes], [ AC_DEFINE_UNQUOTED(SET_ANOTHER_THREAD_NAME(thid,name), $set_another_thread_name) ]) ]) + + AC_CACHE_CHECK([for thread-local storage specifier], [rb_cv_tls_specifier], + rb_cv_tls_specifier=none + RUBY_WERROR_FLAG([ + for attr in \ + _Thread_local \ + __thread \ + ; do + AC_LINK_IFELSE([AC_LANG_PROGRAM([[$attr int conftest;]])], + [rb_cv_tls_specifier=$attr; break]) + done + ]) + ) + AS_IF([test x"${rb_cv_tls_specifier}" != xnone], + [AC_DEFINE_UNQUOTED(RB_THREAD_LOCAL_SPECIFIER, ${rb_cv_tls_specifier})] + ) ]) AS_IF([test x"$ac_cv_header_ucontext_h" = xno], [ AC_CACHE_CHECK([if signal.h defines ucontext_t], [rb_cv_ucontext_in_signal_h], - [AC_TRY_COMPILE([@%:@include <signal.h>], - [size_t size = sizeof(ucontext_t);], + [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include <signal.h>]], + [[size_t size = sizeof(ucontext_t);]])], [rb_cv_ucontext_in_signal_h=yes], [rb_cv_ucontext_in_signal_h=no])]) AS_IF([test x"$rb_cv_ucontext_in_signal_h" = xyes], [ AC_DEFINE_UNQUOTED(UCONTEXT_IN_SIGNAL_H, 1) @@ -3011,28 +2953,28 @@ AS_IF([test x"$ac_cv_header_ucontext_h" = xno], [ ]) AS_IF([test x"$ac_cv_header_ucontext_h" = xyes -o x"$rb_cv_ucontext_in_signal_h" = xyes], [ AC_CACHE_CHECK([if mcontext_t is a pointer], [rb_cv_mcontext_t_ptr], - [AC_TRY_COMPILE([ + [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ @%:@include <signal.h> @%:@ifdef HAVE_UCONTEXT_H @%:@include <ucontext.h> @%:@endif mcontext_t test(mcontext_t mc) {return mc+1;} - ], - [test(0);], + ]], + [[test(0);]])], [rb_cv_mcontext_t_ptr=yes], [rb_cv_mcontext_t_ptr=no])]) AS_IF([test x"$rb_cv_mcontext_t_ptr" = xyes], [ AC_DEFINE_UNQUOTED(DEFINE_MCONTEXT_PTR(mc, uc), mcontext_t mc = (uc)->uc_mcontext) ], [ AC_DEFINE_UNQUOTED(DEFINE_MCONTEXT_PTR(mc, uc), mcontext_t *mc = &(uc)->uc_mcontext) ]) - AS_IF([test x"$rb_with_pthread" = xyes], [ + AS_IF([test x"$THREAD_MODEL" = xpthread], [ AC_CHECK_FUNCS(getcontext setcontext) ]) ]) -AS_IF([test "$ac_cv_func_fork_works" = "yes" -a "$rb_with_pthread" = "yes"], [ +AS_IF([test "$ac_cv_func_fork_works" = "yes" -a x"$THREAD_MODEL" = xpthread], [ AC_CACHE_CHECK([if fork works with pthread], rb_cv_fork_with_pthread, - [AC_TRY_RUN([ + [AC_RUN_IFELSE([AC_LANG_SOURCE([[ #include <stdlib.h> #include <unistd.h> #include <pthread.h> @@ -3088,51 +3030,88 @@ main(int argc, char *argv[]) } return EXIT_SUCCESS; -}], +}]])], rb_cv_fork_with_pthread=yes, rb_cv_fork_with_pthread=no, rb_cv_fork_with_pthread=yes)]) test x$rb_cv_fork_with_pthread = xyes || AC_DEFINE(CANNOT_FORK_WITH_PTHREAD) ]) +AC_CHECK_HEADERS([sys/user.h]) +AS_IF([test "x$ac_cv_func_mmap" = xyes], [ + AC_CACHE_CHECK([whether PAGE_SIZE is compile-time const], rb_cv_const_page_size, + [malloc_headers=`sed -n '/MALLOC_HEADERS_BEGIN/,/MALLOC_HEADERS_END/p' ${srcdir}/gc.c` + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[$malloc_headers + typedef char conftest_page[PAGE_SIZE]; + ]], [[]])], + [rb_cv_const_page_size=yes], + [rb_cv_const_page_size=no])]) +]) +AS_IF([test "x$rb_cv_const_page_size" = xyes], + [AC_DEFINE(HAVE_CONST_PAGE_SIZE, 1)], + [AC_DEFINE(HAVE_CONST_PAGE_SIZE, 0)] +) + +AS_IF([test "x$ac_cv_func_ioctl" = xyes], [ + AC_CACHE_CHECK([ioctl request type], rb_cv_ioctl_request_type, + [rb_cv_ioctl_request_type=no + dnl corresponding NUM2IOCTLREQ needs to be defined + for type in "unsigned long:ULONG_MAX" int:INT_MAX; do + max=`echo $type | sed 's/.*://'` + type=`echo $type | sed 's/:.*//'` + RUBY_WERROR_FLAG([ + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + @%:@include <limits.h> + @%:@include <sys/types.h> + @%:@if defined(HAVE_SYS_IOCTL_H) && !defined(_WIN32) + @%:@include <sys/ioctl.h> + @%:@endif + ]], [[ + $type req = $max; + if (ioctl(0, req)) {/* do nothing*/}; + ]])], + [rb_cv_ioctl_request_type="$type"]) + ]) + test "x$rb_cv_ioctl_request_type" = xno || break + done]) + AS_CASE(["$rb_cv_ioctl_request_type"], [no|int], [], + ["unsigned long"], [ + AC_DEFINE_UNQUOTED(IOCTL_REQ_TYPE, [$rb_cv_ioctl_request_type]) + AC_DEFINE_UNQUOTED(NUM2IOCTLREQ(num), [NUM2ULONG(num)]) + ]) +]) } -{ # runtime section -dnl wheather use dln_a_out or not +[begin]_group "runtime section" && { +dnl whether use dln_a_out or not AC_ARG_WITH(dln-a-out, - AS_HELP_STRING([--with-dln-a-out], [use dln_a_out if possible]), + AS_HELP_STRING([--with-dln-a-out], [dln_a_out is deprecated]), [ AS_CASE([$withval], [yes], [ - AS_IF([test "$enable_shared" = yes], [ - AC_MSG_ERROR(dln_a_out can not make shared library) - ]) - with_dln_a_out=yes], - [ - with_dln_a_out=no])], [with_dln_a_out=no]) - -AC_CACHE_CHECK(whether ELF binaries are produced, rb_cv_binary_elf, -[AC_TRY_LINK([],[], [ -AS_CASE(["`head -1 conftest$EXEEXT | tr -dc '\177ELF' | tr '\177' .`"], -[.ELF*], [rb_cv_binary_elf=yes], [rb_cv_binary_elf=no])], -rb_cv_binary_elf=no)]) + AC_MSG_ERROR(dln_a_out no longer supported) + ]) +]) AS_IF([test "$rb_cv_binary_elf" = yes], [ AC_DEFINE(USE_ELF) - AS_IF([test "$with_dln_a_out" = yes], [ - AC_MSG_ERROR(dln_a_out does not work with ELF) - ]) AC_CHECK_HEADERS([elf.h elf_abi.h]) AS_IF([test $ac_cv_header_elf_h = yes -o $ac_cv_header_elf_abi_h = yes], [ AC_LIBOBJ([addr2line]) + AC_CHECK_LIB([z], [uncompress]) ]) ]) +AC_CHECK_HEADERS([mach-o/loader.h]) +AS_IF([test "$ac_cv_header_mach_o_loader_h" = yes], [ + AC_LIBOBJ([addr2line]) +]) + AS_CASE(["$target_os"], [linux* | gnu* | k*bsd*-gnu | bsdi* | kopensolaris*-gnu], [ AS_IF([test "$rb_cv_binary_elf" = no], [ - with_dln_a_out=yes + AC_MSG_ERROR(Not ELF) ], [ LDFLAGS="$LDFLAGS -rdynamic" ])]) @@ -3146,13 +3125,12 @@ AC_SUBST(CCDLFLAGS)dnl AC_SUBST(LDSHARED)dnl AC_SUBST(LDSHAREDXX)dnl AC_SUBST(DLEXT)dnl -AC_SUBST(DLEXT2)dnl AC_SUBST(LIBEXT)dnl AC_SUBST(ASMEXT, S)dnl STATIC= -AS_IF([test "$with_dln_a_out" != yes], [ +: "dlopen" && { rb_cv_dlopen=unknown AC_MSG_CHECKING(whether OS depend dynamic link works) AS_IF([test "$GCC" = yes], [ @@ -3166,30 +3144,37 @@ AS_IF([test "$with_dln_a_out" != yes], [ # mkmf.rb's have_header() to fail if the desired resource happens to be # installed in the /usr/local tree. RUBY_APPEND_OPTION(CCDLFLAGS, -fno-common)], - [bsdi*|cygwin*|mingw*|aix*|interix*], [ ], + [bsdi*|cygwin*|msys*|mingw*|aix*|interix*], [ ], [ RUBY_APPEND_OPTION(CCDLFLAGS, -fPIC)]) ], [ AS_CASE(["$target_os"], - [hpux*], [CCDLFLAGS="$CCDLFLAGS +Z"], [solaris*|irix*], [CCDLFLAGS="$CCDLFLAGS -KPIC"], [sunos*], [CCDLFLAGS="$CCDLFLAGS -PIC"], [esix*|uxpds*], [CCDLFLAGS="$CCDLFLAGS -KPIC"], [: ${CCDLFLAGS=""}]) ]) +} +EXTSTATIC= +AC_SUBST(EXTSTATIC)dnl +AC_ARG_WITH(static-linked-ext, + AS_HELP_STRING([--with-static-linked-ext], [link external modules statically]), + [AS_CASE([$withval],[yes],[STATIC=;EXTSTATIC=static],[no],[],[EXTSTATIC="$withval"])]) +AS_CASE([",$EXTSTATIC,"], [,static,|*,enc,*], [ + ENCOBJS='enc/encinit.$(OBJEXT) enc/libenc.$(LIBEXT) enc/libtrans.$(LIBEXT)' + EXTOBJS='ext/extinit.$(OBJEXT)' + AC_DEFINE_UNQUOTED(EXTSTATIC, 1) + AC_SUBST(ENCSTATIC, static) +], [ + ENCOBJS='dmyenc.$(OBJEXT)' + EXTOBJS='dmyext.$(OBJEXT)' +]) +AC_SUBST(ENCOBJS) +AC_SUBST(EXTOBJS) - AC_ARG_ENABLE(rpath, - AS_HELP_STRING([--enable-rpath], [embed run path into extension libraries. - enabled by default on ELF platforms]), - [enable_rpath=$enableval], [enable_rpath="$rb_cv_binary_elf"]) - - AS_CASE(["$target_os"], - [hpux*], [ DLDFLAGS="$DLDFLAGS -E" - : ${LDSHARED='$(LD) -b'} - XLDFLAGS="$XLDFLAGS -Wl,-E" - : ${LIBPATHENV=SHLIB_PATH} - rb_cv_dlopen=yes], +: "rpath" && { + AS_CASE(["$target_os"], [solaris*], [ AS_IF([test "$GCC" = yes], [ : ${LDSHARED='$(CC) -shared'} AS_IF([test "$rb_cv_prog_gnu_ld" = yes], [ @@ -3229,7 +3214,6 @@ AS_IF([test "$with_dln_a_out" != yes], [ rb_cv_dlopen=yes], [interix*], [ : ${LDSHARED='$(CC) -shared'} XLDFLAGS="$XLDFLAGS -Wl,-E" - LIBPATHFLAG=" -L%1\$-s" rb_cv_dlopen=yes], [freebsd*|dragonfly*], [ : ${LDSHARED='$(CC) -shared'} @@ -3246,25 +3230,38 @@ AS_IF([test "$with_dln_a_out" != yes], [ ]) rb_cv_dlopen=yes], [darwin*], [ : ${LDSHARED='$(CC) -dynamic -bundle'} + : ${DLDSHARED='$(CC) -dynamiclib'} : ${LDFLAGS=""} : ${LIBPATHENV=DYLD_LIBRARY_PATH} : ${PRELOADENV=DYLD_INSERT_LIBRARIES} + AS_IF([test x"$enable_shared" = xyes], [ + # Resolve symbols from libruby.dylib in $(LIBS) when --enable-shared + ], [test "x$EXTSTATIC" = x], [ + # When building exts as bundles, a mach-o bundle needs to know its loader + # program to bind symbols from the ruby executable + EXTDLDFLAGS="-bundle_loader '\$(BUILTRUBY)'" + ]) rb_cv_dlopen=yes], [aix*], [ : ${LDSHARED='$(CC)'} - LDSHARED="$LDSHARED ${linker_flag}-G" + AS_IF([test "$GCC" = yes], [ + LDSHARED="$LDSHARED ${linker_flag}-G -shared" + ], [ + LDSHARED="$LDSHARED ${linker_flag}-G" + ]) EXTDLDFLAGS='-e$(TARGET_ENTRY)' XLDFLAGS="${linker_flag}"'-bE:$(ARCHFILE)'" ${linker_flag}-brtl" XLDFLAGS="$XLDFLAGS ${linker_flag}-blibpath:${prefix}/lib:${LIBPATH:-/usr/lib:/lib}" : ${ARCHFILE="ruby.imp"} - TRY_LINK='$(CC) $(LDFLAGS) -oconftest $(INCFLAGS) -I$(hdrdir) $(CPPFLAGS)' - TRY_LINK="$TRY_LINK"' $(CFLAGS) $(src) $(LIBPATH) $(LOCAL_LIBS) $(LIBS)' + TRY_LINK='$(CC) -oconftest $(INCFLAGS) -I$(hdrdir) $(CPPFLAGS)' + TRY_LINK="$TRY_LINK"' $(CFLAGS) $(src) $(LIBPATH) $(LDFLAGS) $(LOCAL_LIBS) $(LIBS)' : ${LIBPATHENV=LIBPATH} + : ${PRELOADENV=LDR_PRELOAD} rb_cv_dlopen=yes], [nto-qnx*], [ DLDFLAGS="$DLDFLAGS -L/lib -L/usr/lib -L/usr/local/lib" : ${LDSHARED='$(LD) -Bshareable -x'} LDFLAGS="$LDFLAGS -L/lib -L/usr/lib -L/usr/local/lib" rb_cv_dlopen=yes], - [cygwin*|mingw*], [ + [cygwin*|msys*|mingw*], [ : ${LDSHARED='$(CC) -shared'} XLDFLAGS="$XLDFLAGS -Wl,--stack,0x00200000,--enable-auto-import" DLDFLAGS="${DLDFLAGS} -Wl,--enable-auto-image-base,--enable-auto-import" @@ -3274,31 +3271,38 @@ AS_IF([test "$with_dln_a_out" != yes], [ [hiuxmpp], [ : ${LDSHARED='$(LD) -r'}], [atheos*], [ : ${LDSHARED='$(CC) -shared'} rb_cv_dlopen=yes], + [wasi*], [ : ${LDSHARED='$(LD) -shared -Xlinker --export-dynamic'}], [ : ${LDSHARED='$(LD)'}]) - AC_MSG_RESULT($rb_cv_dlopen) + AC_MSG_RESULT($rb_cv_dlopen) +} - AS_IF([test "$rb_cv_dlopen" = yes], [ +AS_IF([test "$rb_cv_dlopen" = yes], [ AS_CASE(["$target_os"], - [darwin*], [ + [darwin*], [ + AC_SUBST(ADDITIONAL_DLDFLAGS, "") for flag in \ - "-undefined dynamic_lookup" \ "-multiply_defined suppress" \ + "-undefined dynamic_lookup" \ ; do - test "x${linker_flag}" = x || flag="${linker_flag}`echo ${flag} | tr ' ' ,`" - RUBY_TRY_LDFLAGS([$flag], [], [flag=]) - AS_IF([test "x$flag" != x], [ - RUBY_APPEND_OPTIONS(DLDFLAGS, [$flag]) - ]) + test "x${linker_flag}" = x || flag="${linker_flag}`echo ${flag} | tr ' ' ,`" + RUBY_TRY_LDFLAGS([$flag], [], [flag=]) + AS_IF([test x"$flag" = x], [continue]) + + AC_MSG_CHECKING([whether $flag is accepted for bundle]) + : > conftest.c + AS_IF([${LDSHARED%%'$(CC)'*}$CC${LDSHARED@%:@*'$(CC)'} -o conftest.bundle $flag conftest.c >/dev/null 2>conftest.err && + test ! -s conftest.err], [ + AC_MSG_RESULT([yes]) + RUBY_APPEND_OPTIONS(DLDFLAGS, [$flag]) + ], [ + AC_MSG_RESULT([no]) + RUBY_APPEND_OPTIONS(ADDITIONAL_DLDFLAGS, [$flag]) + ]) + rm -fr conftest.* done - ]) - ]) - - AS_IF([test "$enable_rpath:${RPATHFLAG}" = yes:], [ - AS_IF([test "x$rpathflag" != x], [ - RPATHFLAG=" ${rpathflag}%1\$-s" - ]) - ]) + ]) ]) + AS_IF([test "${LDSHAREDXX}" = ""], [ AS_CASE(["${LDSHARED}"], [*'$(CC)'*], [ @@ -3313,7 +3317,6 @@ AS_IF([test "${LDSHAREDXX}" = ""], [ [ld" "*], [ ]) ]) -AS_CASE([${RPATHFLAG}],[*'%1$'*],[: ${LIBPATHFLAG=' -L%1$-s'}],[: ${LIBPATHFLAG=' -L%s'}]) AC_SUBST(LINK_SO) AC_SUBST(LIBPATHFLAG) @@ -3322,23 +3325,6 @@ AC_SUBST(LIBPATHENV, "${LIBPATHENV-LD_LIBRARY_PATH}") AC_SUBST(PRELOADENV, "${PRELOADENV-LD_PRELOAD}") AC_SUBST(TRY_LINK) -AS_IF([test "x$OPT_DIR" != x], [ - pat=`echo "${LDFLAGS_OPTDIR}" | sed ['s/[][\\.*|]/\\\\&/']` - LDFLAGS=`echo "${LDFLAGS}" | sed "s| ${pat}||"` - val=`IFS="$PATH_SEPARATOR" - for dir in $OPT_DIR; do - echo x ${LIBPATHFLAG} ${RPATHFLAG} | - sed "s/^x *//;s${IFS}"'%1\\$-s'"${IFS}${dir}/lib${IFS}g;s${IFS}%s${IFS}${dir}/lib${IFS}g" - done | tr '\012' ' ' | sed 's/ *$//'` - AS_IF([test x"$val" != x], [ - test x"${LDFLAGS}" = x || LDFLAGS="$LDFLAGS " - LDFLAGS="$LDFLAGS$val" - test x"${DLDFLAGS}" = x || DLDFLAGS="$DLDFLAGS " - DLDFLAGS="$DLDFLAGS$val" - ]) - LDFLAGS_OPTDIR="$val" -]) - AS_CASE(["$target_os"], [freebsd*], [ AC_CHECK_LIB([procstat], [procstat_open_sysctl]) @@ -3348,10 +3334,20 @@ AS_CASE(["$target_os"], ]) AS_CASE(["$target_cpu-$target_os"], [*-darwin*], [ + AC_CHECK_HEADERS([libproc.h]) AC_CHECK_HEADERS([execinfo.h]) AS_IF([test "x$ac_cv_header_execinfo_h" = xyes], [ AC_CHECK_LIB([execinfo], [backtrace]) AC_CHECK_HEADERS([libunwind.h]) + + AC_CHECK_HEADERS([mach/task.h mach/mach_init.h mach/mach_port.h]) + AS_IF([ test \ + "x${ac_cv_header_mach_task_h}" = xyes -a \ + "x${ac_cv_header_mach_mach_init_h}" = xyes -a \ + "x${ac_cv_header_mach_mach_port_h}" = xyes \ + ], [ + AC_DEFINE([HAVE_MACH_TASK_EXCEPTION_PORTS], [1]) + ]) ])], [*-freebsd*|x86_64-netbsd*], [ AC_CHECK_HEADERS([execinfo.h]) @@ -3363,7 +3359,7 @@ AC_CHECK_FUNCS(backtrace) AS_IF([test "x$ac_cv_func_backtrace" = xyes], [ AC_CACHE_CHECK(for broken backtrace, rb_cv_broken_backtrace, - [AC_TRY_RUN([ + [AC_RUN_IFELSE([AC_LANG_SOURCE([[ #include <unistd.h> #include <stdio.h> #include <stdlib.h> @@ -3372,6 +3368,7 @@ AS_IF([test "x$ac_cv_func_backtrace" = xyes], [ #include <signal.h> #include <execinfo.h> +]`grep '^@%:@ *define *RUBY_SIGALTSTACK_SIZE' ${srcdir}/signal.c`[ #define TRACE_SIZE 256 void sigsegv(int signum, siginfo_t *info, void *ctx){ @@ -3389,18 +3386,19 @@ main(void) { volatile int *a = NULL; stack_t ss; - ss.ss_sp = malloc(SIGSTKSZ); + struct sigaction sa; + + ss.ss_sp = malloc(RUBY_SIGALTSTACK_SIZE); if (ss.ss_sp == NULL) { fprintf(stderr, "cannot allocate memory for sigaltstack\n"); return EXIT_FAILURE; } - ss.ss_size = SIGSTKSZ; + ss.ss_size = RUBY_SIGALTSTACK_SIZE; ss.ss_flags = 0; if (sigaltstack(&ss, NULL) == -1) { fprintf(stderr, "sigaltstack failed\n"); return EXIT_FAILURE; } - struct sigaction sa; memset(&sa, 0, sizeof(struct sigaction)); sigemptyset(&sa.sa_mask); sa.sa_sigaction = sigsegv; @@ -3410,7 +3408,7 @@ main(void) a[0] = 1; return EXIT_SUCCESS; } -], +]])], rb_cv_broken_backtrace=no, rb_cv_broken_backtrace=yes, rb_cv_broken_backtrace=no)]) @@ -3425,49 +3423,20 @@ AC_ARG_WITH(valgrind, AS_IF([test x$with_valgrind != xno], [AC_CHECK_HEADERS(valgrind/memcheck.h)]) -dln_a_out_works=no -AS_IF([test "$ac_cv_header_a_out_h" = yes], [ - AS_IF([test "$with_dln_a_out" = yes || test "$rb_cv_dlopen" = unknown], [ - cat confdefs.h > config.h - AC_CACHE_CHECK(whether matz's dln works, rb_cv_dln_a_out, - [AC_TRY_COMPILE([ -#define USE_DLN_A_OUT -#include "dln.c" -], - [], - rb_cv_dln_a_out=yes, - rb_cv_dln_a_out=no)]) - AS_IF([test "$rb_cv_dln_a_out" = yes], [ - dln_a_out_works=yes - AC_DEFINE(USE_DLN_A_OUT) - ]) - ]) -]) - -AS_IF([test "$dln_a_out_works" = yes], [ - AS_IF([test "$GCC" = yes], [ - STATIC=-static - ], [ - STATIC=-Bstatic - ]) - DLEXT=so - CCDLFLAGS= -], [ +: "dlext & soext" && { AS_CASE(["$target_os"], - [hpux*], [ - DLEXT=sl], [darwin*], [ SOEXT=dylib DLEXT=bundle], - [cygwin*|mingw*|*djgpp*], [ + [cygwin*|msys*|mingw*|*djgpp*], [ LOAD_RELATIVE=1 SOEXT=dll DLEXT=so], [ DLEXT=so]) -]) : ${SOEXT="${DLEXT}"} AC_SUBST(SOEXT) + AS_IF([test "$rb_cv_dlopen:$load_relative" = yes:yes], [ AS_IF([test "$ac_cv_func_dladdr" = yes], [ LOAD_RELATIVE=1 @@ -3481,47 +3450,35 @@ AS_IF([test x"$LOAD_RELATIVE" = x1], [ len=2 # .rb n=`expr "$DLEXT" : '.*'`; test "$n" -gt "$len" && len=$n -n=`expr "$DLEXT2" : '.*'`; test "$n" -gt "$len" && len=$n AC_DEFINE_UNQUOTED(DLEXT_MAXLEN, `expr $len + 1`) test ".$DLEXT" = "." || AC_DEFINE_UNQUOTED(DLEXT, ".$DLEXT") -test ".$DLEXT2" = "." || AC_DEFINE_UNQUOTED(DLEXT2, ".$DLEXT2") AC_SUBST(DLEXT) -AS_IF([test "$with_dln_a_out" = yes], [ - STRIP=true -], [ - AC_CHECK_TOOL(STRIP, strip, :)dnl -]) +AC_DEFINE_UNQUOTED(SOEXT, ".$SOEXT") +} -AS_CASE(["$target_os"], - [linux* | gnu* | k*bsd*-gnu | kopensolaris*-gnu], [ - STRIP="$STRIP -S -x"], - [darwin*], [ - STRIP="$STRIP -A -n"]) +: "strip" && { + AC_MSG_CHECKING([for $STRIP flags]) + AC_LINK_IFELSE([AC_LANG_PROGRAM], [AS_IF( + ["${STRIP}" -A -n conftest$ac_exeext 2>/dev/null], [ + AC_MSG_RESULT([-A -n]) + STRIP="${STRIP} -A -n" + ], + ["${STRIP}" -S -x conftest$ac_exeext 2>/dev/null], [ + AC_MSG_RESULT([-S -x]) + STRIP="${STRIP} -S -x" + ], [ + AC_MSG_RESULT([none needed]) + ]) + ]) +} AC_ARG_WITH(ext, - AC_HELP_STRING([--with-ext=EXTS], + AS_HELP_STRING([--with-ext=EXTS], [pass to --with-ext option of extmk.rb])) AC_ARG_WITH(out-ext, - AC_HELP_STRING([--with-out-ext=EXTS], + AS_HELP_STRING([--with-out-ext=EXTS], [pass to --without-ext option of extmk.rb])) -EXTSTATIC= -AC_SUBST(EXTSTATIC)dnl -AC_ARG_WITH(static-linked-ext, - AS_HELP_STRING([--with-static-linked-ext], [link external modules statically]), - [AS_CASE([$withval],[yes],[STATIC=;EXTSTATIC=static],[no],[],[EXTSTATIC="$withval"])]) -AS_CASE([",$EXTSTATIC,"], [,static,|*,enc,*], [ - ENCOBJS='enc/encinit.$(OBJEXT) enc/libenc.$(LIBEXT) enc/libtrans.$(LIBEXT)' - EXTOBJS='ext/extinit.$(OBJEXT)' - AC_DEFINE_UNQUOTED(EXTSTATIC, 1) - AC_SUBST(ENCSTATIC, static) -], [ - ENCOBJS='dmyenc.$(OBJEXT)' - EXTOBJS='dmyext.$(OBJEXT)' -]) -AC_SUBST(ENCOBJS) -AC_SUBST(EXTOBJS) - AC_ARG_WITH(setup, AS_HELP_STRING([--with-setup=SETUP], [use extension libraries setup]), [setup=$withval]) @@ -3564,7 +3521,7 @@ AS_IF([test x"${exec_prefix}" != xNONE], [ RUBY_EXEC_PREFIX=$ac_default_prefix ]) pat=`echo "${RUBY_EXEC_PREFIX}" | tr -c '\012' .`'\(.*\)' -for var in bindir libdir rubylibprefix; do +for var in bindir includedir libdir rubylibprefix; do eval val='"$'$var'"' AS_CASE(["$val"], ["${RUBY_EXEC_PREFIX}"*], [val='${exec_prefix}'"`expr \"$val\" : \"$pat\"`"]) eval $var='"$val"' @@ -3572,7 +3529,7 @@ done BTESTRUBY='$(MINIRUBY)' AS_IF([test x"$cross_compiling" = xyes], [ - test x"$MINIRUBY" = x && MINIRUBY="${RUBY-$BASERUBY} -I`$CHDIR .; pwd` "-r'$(arch)-fake' + test x"$MINIRUBY" = x && MINIRUBY="${RUBY-$BASERUBY} -I${ac_abs_builddir-.} "-r'$(arch)-fake' XRUBY_LIBDIR=`${RUBY-$BASERUBY} -rrbconfig -e ['puts RbConfig::CONFIG["libdir"]']` XRUBY_RUBYLIBDIR=`${RUBY-$BASERUBY} -rrbconfig -e ['puts RbConfig::CONFIG["rubylibdir"]']` XRUBY_RUBYHDRDIR=`${RUBY-$BASERUBY} -rrbconfig -e ['puts RbConfig::CONFIG["rubyhdrdir"]']` @@ -3580,20 +3537,23 @@ AS_IF([test x"$cross_compiling" = xyes], [ AC_SUBST(XRUBY_RUBYLIBDIR) AC_SUBST(XRUBY_RUBYHDRDIR) PREP='$(arch)-fake.rb' - RUNRUBY_COMMAND='$(MINIRUBY) -I`cd $(srcdir)/lib; pwd`' + AS_CASE(["$enable_shared:$EXTSTATIC:$target_os"], [no::darwin*], [ + # darwin target requires miniruby for linking ext bundles + PREP="$PREP"' miniruby$(EXEEXT)' + ]) + RUNRUBY_COMMAND='$(MINIRUBY) -I`$(CHDIR) $(srcdir)/lib; pwd`' RUNRUBY='$(RUNRUBY_COMMAND)' XRUBY='$(MINIRUBY)' - BOOTSTRAPRUBY='$(BASERUBY)' TEST_RUNNABLE=no CROSS_COMPILING=yes + AC_DEFINE(CROSS_COMPILING, 1) ], [ MINIRUBY='./miniruby$(EXEEXT) -I$(srcdir)/lib -I.' MINIRUBY="$MINIRUBY"' -I$(EXTOUT)/common' PREP='miniruby$(EXEEXT)' - RUNRUBY_COMMAND='$(MINIRUBY) $(srcdir)/tool/runruby.rb --extout=$(EXTOUT) $(RUNRUBYOPT)' + RUNRUBY_COMMAND='$(MINIRUBY) $(tooldir)/runruby.rb --extout=$(EXTOUT) $(RUNRUBYOPT)' RUNRUBY='$(RUNRUBY_COMMAND) --' XRUBY='$(RUNRUBY)' - BOOTSTRAPRUBY='$(MINIRUBY)' TEST_RUNNABLE=yes CROSS_COMPILING=no ]) @@ -3605,27 +3565,26 @@ AC_SUBST(PREP) AC_SUBST(RUNRUBY_COMMAND) AC_SUBST(RUNRUBY) AC_SUBST(XRUBY) -AC_SUBST(BOOTSTRAPRUBY) AC_SUBST(EXTOUT, [${EXTOUT=.ext}]) -])RSTMAKEFILE="" LIBRUBY_A='lib$(RUBY_SO_NAME)-static.a' LIBRUBY='$(LIBRUBY_A)' LIBRUBYARG_STATIC='-l$(RUBY_SO_NAME)-static' LIBRUBYARG='$(LIBRUBYARG_STATIC)' -SOLIBS= +SOLIBS='$(MAINLIBS)' AS_CASE(["$target_os"], - [cygwin*|mingw*|haiku*|darwin*], [ + [cygwin*|msys*|mingw*|haiku*|darwin*], [ : ${DLDLIBS=""} ], [ - DLDLIBS="$DLDLIBS -lc" + DLDLIBS="${DLDLIBS:+$DLDLIBS }-lc" ]) AC_ARG_ENABLE(multiarch, AS_HELP_STRING([--enable-multiarch], [enable multiarch compatible directories]), - [multiarch=], [unset multiarch]) + [AS_CASE([$enableval], [no], [unset multiarch], [multiarch=])], + [unset multiarch]) AS_IF([test ${multiarch+set}], [ AC_DEFINE(ENABLE_MULTIARCH) ]) @@ -3641,21 +3600,21 @@ AC_ARG_WITH(soname, [ AS_CASE(["$target_os"], [darwin*], [ - RUBY_SO_NAME='$(RUBY_BASE_NAME).$(RUBY_PROGRAM_VERSION)' + RUBY_SO_NAME='$(RUBY_BASE_NAME).$(RUBY_API_VERSION)' ], [cygwin*], [ RUBY_SO_NAME='$(RUBY_BASE_NAME)$(MAJOR)$(MINOR)0' ], [mingw*], [ RUBY_SO_NAME="${rb_cv_msvcrt}"'-$(RUBY_BASE_NAME)$(MAJOR)$(MINOR)0' - AS_IF([test x"${target_cpu}" != xi386], [ + AS_IF([test x"${target_cpu}" != xi386 || test x"${rb_cv_msvcrt}" != xmsvcrt], [ RUBY_SO_NAME="${target_cpu}-${RUBY_SO_NAME}" ]) ], [RUBY_SO_NAME='$(RUBY_BASE_NAME)']) ]) -LIBRUBY_LDSHARED=$LDSHARED +LIBRUBY_LDSHARED=${DLDSHARED=${LDSHARED}} LIBRUBY_DLDFLAGS=$DLDFLAGS LIBRUBY_SO='lib$(RUBY_SO_NAME).$(SOEXT).$(RUBY_PROGRAM_VERSION)' LIBRUBY_SONAME='lib$(RUBY_SO_NAME).$(SOEXT).$(RUBY_API_VERSION)' @@ -3674,9 +3633,6 @@ AS_CASE("$enable_shared", [yes], [ LIBRUBY_RELATIVE=no test -z "$CCDLFLAGS" || CFLAGS="$CFLAGS $CCDLFLAGS" ENABLE_SHARED=yes - AS_IF([test "$rb_cv_binary_elf" = yes], [ - SOLIBS='$(LIBS)' - ]) # libdir can be overridden in config.site file (on OpenSUSE at least). libdir_basename=lib @@ -3686,6 +3642,17 @@ AS_CASE("$enable_shared", [yes], [ AC_DEFINE_UNQUOTED(LIBDIR_BASENAME, ["${libdir_basename}"]) libdir_basename="${libdir_basename}"${multiarch+'/${arch}'} + # Debian bullseye reportedly has its ld(1) patched, which breaks + # --enable-shared --with-jemalloc combination. We might have to deal with + # the ld(1) change sooner or later, but in the meantime let us force it + # the old way. + # + # See https://github.com/ruby/ruby/pull/4627 + RUBY_TRY_LDFLAGS([${linker_flag}--no-as-needed], [no_as_needed=yes], [no_as_needed=no]) + AS_IF([test "$no_as_needed" = yes], [ + RUBY_APPEND_OPTIONS(LDFLAGS, [${linker_flag}--no-as-needed]) + ]) + AS_CASE(["$target_os"], [freebsd*|dragonfly*], [], [ @@ -3697,6 +3664,7 @@ AS_CASE("$enable_shared", [yes], [ ]) ]) + relative_libprefix="/../${multiarch+../}${libdir_basename}" AS_CASE(["$target_os"], [sunos4*], [ LIBRUBY_ALIASES='$(LIBRUBY_SONAME) lib$(RUBY_SO_NAME).$(SOEXT)' @@ -3705,22 +3673,24 @@ AS_CASE("$enable_shared", [yes], [ RUBY_APPEND_OPTIONS(LIBRUBY_DLDFLAGS, ['-Wl,-soname,$(LIBRUBY_SONAME)' "$LDFLAGS_OPTDIR"]) LIBRUBY_ALIASES='$(LIBRUBY_SONAME) lib$(RUBY_SO_NAME).$(SOEXT)' AS_IF([test "$load_relative" = yes], [ - libprefix="'\$\${ORIGIN}/../${libdir_basename}'" + libprefix="'\$\${ORIGIN}${relative_libprefix}'" LIBRUBY_RPATHFLAGS="-Wl,-rpath,${libprefix}" LIBRUBY_RELATIVE=yes ]) ], [freebsd*|dragonfly*], [ - SOLIBS='$(LIBS)' LIBRUBY_SO='lib$(RUBY_SO_NAME).$(SOEXT).$(MAJOR)$(MINOR)' LIBRUBY_SONAME='$(LIBRUBY_SO)' AS_IF([test "$rb_cv_binary_elf" != "yes" ], [ LIBRUBY_SO="$LIBRUBY_SO.\$(TEENY)" LIBRUBY_ALIASES='' + ], [test "$load_relative" = yes], [ + libprefix="'\$\$ORIGIN${relative_libprefix}'" + LIBRUBY_RPATHFLAGS="-Wl,-rpath,${libprefix}" + LIBRUBY_RELATIVE=yes ]) ], [netbsd*], [ - SOLIBS='$(LIBS)' LIBRUBY_SONAME='lib$(RUBY_SO_NAME).$(SOEXT).$(MAJOR)$(MINOR)' LIBRUBY_SO="${LIBRUBY_SONAME}"'.$(TEENY)' RUBY_APPEND_OPTIONS(LIBRUBY_DLDFLAGS, ['-Wl,-soname,$(LIBRUBY_SONAME)' "$LDFLAGS_OPTDIR"]) @@ -3731,34 +3701,32 @@ AS_CASE("$enable_shared", [yes], [ ]) ], [openbsd*|mirbsd*], [ - SOLIBS='$(LIBS)' LIBRUBY_SO='lib$(RUBY_SO_NAME).$(SOEXT).$(MAJOR).'`expr ${MINOR} \* 10 + ${TEENY}` ], [solaris*], [ - SOLIBS='$(LIBS)' LIBRUBY_SO='lib$(RUBY_SO_NAME).$(SOEXT).$(MAJOR)' LIBRUBY_SONAME='lib$(RUBY_SO_NAME).$(SOEXT).$(RUBY_PROGRAM_VERSION)' LIBRUBY_ALIASES='$(LIBRUBY_SONAME) lib$(RUBY_SO_NAME).$(SOEXT)' - AS_IF([test "$GCC" = yes], [ - LIBRUBY_DLDFLAGS="$DLDFLAGS "'-Wl,-h,$(@F)' + RUBY_APPEND_OPTIONS(LIBRUBY_DLDFLAGS, ["${linker_flag}-h${linker_flag:+,}"'$(@F)']) + AS_IF([test "$load_relative" = yes], [ + libprefix="'\$\$ORIGIN${relative_libprefix}'" + LIBRUBY_RPATHFLAGS="-R${libprefix}" + LIBRUBY_RELATIVE=yes ], [ - LIBRUBY_DLDFLAGS="$DLDFLAGS "'-h $(@F)' + LIBRUBY_RPATHFLAGS='-R${libdir}' ]) - XLDFLAGS="$XLDFLAGS "'-R${libdir}' - ], - [hpux*], [ - XLDFLAGS="$XLDFLAGS "'-Wl,+s,+b,$(libdir)' - LIBRUBY_ALIASES='$(LIBRUBY_SONAME) lib$(RUBY_SO_NAME).$(SOEXT)' ], [aix*], [ RUBY_APPEND_OPTIONS(LIBRUBY_DLDFLAGS, ["${linker_flag}-bnoentry" "$XLDFLAGS" "$LDFLAGS_OPTDIR"]) LIBRUBYARG_SHARED='-L${libdir} -l${RUBY_SO_NAME}' - SOLIBS='-lm -lc' + LIBS="$LIBS -lm -lc" ], [darwin*], [ - LIBRUBY_LDSHARED='$(CC) -dynamiclib' + LIBRUBY_SO='lib$(RUBY_SO_NAME).$(SOEXT)' + LIBRUBY_SONAME='$(LIBRUBY_SO)' + LIBRUBY_ALIASES='lib$(RUBY_INSTALL_NAME).$(SOEXT)' AS_IF([test "$load_relative" = yes], [ - libprefix="@executable_path/../${libdir_basename}" + libprefix="@executable_path${relative_libprefix}" LIBRUBY_RELATIVE=yes ]) LIBRUBY_DLDFLAGS="$LIBRUBY_DLDFLAGS -install_name ${libprefix}"'/$(LIBRUBY_SONAME)' @@ -3766,19 +3734,16 @@ AS_CASE("$enable_shared", [yes], [ LIBRUBY_DLDFLAGS="$LIBRUBY_DLDFLAGS "'-current_version $(RUBY_PROGRAM_VERSION)' AS_IF([test "$visibility_option" = ld], [ LIBRUBY_DLDFLAGS="$LIBRUBY_DLDFLAGS "'-Wl,-unexported_symbol,_Init_*' + LIBRUBY_DLDFLAGS="$LIBRUBY_DLDFLAGS "'-Wl,-unexported_symbol,_InitVM_*' LIBRUBY_DLDFLAGS="$LIBRUBY_DLDFLAGS "'-Wl,-unexported_symbol,_ruby_static_id_*' LIBRUBY_DLDFLAGS="$LIBRUBY_DLDFLAGS "'-Wl,-unexported_symbol,*_threadptr_*' ]) LIBRUBY_DLDFLAGS="$LIBRUBY_DLDFLAGS "' $(XLDFLAGS)' - LIBRUBY_SO='lib$(RUBY_SO_NAME).$(SOEXT)' - LIBRUBY_SONAME='lib$(RUBY_BASE_NAME).$(RUBY_API_VERSION).$(SOEXT)' - LIBRUBY_ALIASES='$(LIBRUBY_SONAME) lib$(RUBY_INSTALL_NAME).$(SOEXT)' - SOLIBS='$(LIBS)' ], [interix*], [ LIBRUBYARG_SHARED='-L. -L${libdir} -l$(RUBY_SO_NAME)' ], - [mingw*|cygwin*|mswin*], [ + [cygwin*|msys*|mingw*|mswin*], [ LIBRUBY_RELATIVE=yes ]) ], [ @@ -3810,16 +3775,16 @@ AS_CASE("$enable_shared", [yes], [ ]) ]) AS_IF([test "$enable_rpath" = yes], [ - test -z "$LIBRUBY_RPATHFLAGS" || LIBRUBY_RPATHFLAGS="$LIBRUBY_RPATHFLAGS " - rpathflag="${RPATHFLAG}" - AS_CASE(["${cross_compiling}${load_relative}"], [*yes*], [], [rpathflag="$RPATHFLAG$LIBPATHFLAG"]) + AS_CASE(["${cross_compiling}${load_relative}"], + [*yes*], [rpathflag="${RPATHFLAG}"], + [rpathflag="$RPATHFLAG${LIBPATHFLAG:+${RPATHFLAG:+ }$LIBPATHFLAG}"]) rpathflag=`IFS="$PATH_SEPARATOR" echo x "$rpathflag" | sed "s/^x *//;s${IFS}"'%1\\$-s'"${IFS}${libprefix}${IFS}g;s${IFS}%s${IFS}${libprefix}${IFS}g" ` - LIBRUBY_RPATHFLAGS="$LIBRUBY_RPATHFLAGS${rpathflag}" - LIBRUBYARG_SHARED="$LIBRUBY_RPATHFLAGS $LIBRUBYARG_SHARED" - LIBRUBYARG_STATIC="$LIBRUBY_RPATHFLAGS $LIBRUBYARG_STATIC" + LIBRUBY_RPATHFLAGS="${LIBRUBY_RPATHFLAGS:+$LIBRUBY_RPATHFLAGS }${rpathflag}" + LIBRUBYARG_SHARED="${LIBRUBY_RPATHFLAGS:+$LIBRUBY_RPATHFLAGS }$LIBRUBYARG_SHARED" + LIBRUBYARG_STATIC="${LIBRUBY_RPATHFLAGS:+$LIBRUBY_RPATHFLAGS }$LIBRUBYARG_STATIC" ]) AC_SUBST(LIBRUBY_RELATIVE) @@ -3837,7 +3802,7 @@ AS_CASE("$cross_compiling:${LIBPATHENV}", [yes:* | no:], [], [ AC_MSG_CHECKING(whether wrapper for $LIBPATHENV is needed) AS_IF([env ${LIBPATHENV}=/lib /bin/sh -c ': ${'${LIBPATHENV}'?}' 2>/dev/null], [AC_MSG_RESULT(no)], - [PREP="$PREP"' exe/$(PROGRAM)' + [AC_SUBST(XRUBY_LIBPATHENV_WRAPPER, 'exe/$(PROGRAM)') AC_MSG_RESULT(yes)] ) ]) @@ -3855,6 +3820,9 @@ AS_CASE(["${enable_dtrace}"], ], [ rb_cv_dtrace_available=no ]) +AS_CASE(["$target_os"],[freebsd*],[ + rb_cv_dtrace_available=no + ]) AS_IF([test "${enable_dtrace}" = yes], [dnl AS_IF([test -z "$DTRACE"], [dnl AC_MSG_ERROR([dtrace(1) is missing]) @@ -3893,32 +3861,45 @@ AC_ARG_ENABLE(gcov, AS_HELP_STRING([--enable-gcov], [enable coverage measurement by gcov]), [gcov=yes]) AS_IF([test x"$gcov" = xyes], [ - CFLAGS="$CFLAGS -coverage" + CFLAGS="$CFLAGS -coverage -fprofile-update=atomic" LDFLAGS="$LDFLAGS -coverage" ]) RUBY_SETJMP_TYPE +RUBY_MODULAR_GC } -{ # build section +[begin]_group "installation section" && { dnl build rdoc index if requested RDOCTARGET="" CAPITARGET="" AC_ARG_ENABLE(install-doc, AS_HELP_STRING([--disable-install-doc], [do not install either rdoc indexes or C API documents during install]), [install_doc=$enableval], [install_doc=yes]) +AC_ARG_WITH(rdoc, + AS_HELP_STRING([--with-rdoc=ri,html], [comma/space separated list of RDoc formats to install]), + [install_rdoc=`echo ,$withval, | sed 'y/,/ /;s/ ri / rdoc /;s/^ *//;s/ *$//'`], [ AC_ARG_ENABLE(install-rdoc, AS_HELP_STRING([--disable-install-rdoc], [do not install rdoc indexes during install]), [install_rdoc=$enableval], [install_rdoc=yes]) +]) AC_ARG_ENABLE(install-capi, AS_HELP_STRING([--disable-install-capi], [do not install C API documents during install]), [install_capi=$enableval], [install_capi=no]) AS_IF([test "$install_doc" != no], [ - AS_IF([test "$install_rdoc" != no], [ + AS_CASE(["$install_rdoc"], + [yes], [ RDOCTARGET="rdoc" - ], [ + ], + [all], [ + RDOCTARGET="rdoc html" + ], + [no|''], [ RDOCTARGET="nodoc" + ], + [ + RDOCTARGET="$install_rdoc" ]) AS_IF([test "$install_capi" != no -a -n "$DOXYGEN"], [ CAPITARGET="capi" @@ -3938,17 +3919,250 @@ AC_SUBST(INSTALLDOC) AC_ARG_ENABLE(install-static-library, AS_HELP_STRING([--disable-install-static-library], [do not install static ruby library]), - [INSTALL_STATIC_LIBRARY=$enableval], + [INSTALL_STATIC_LIBRARY=$enableval + AS_IF([test x"$enable_shared" = xno -a x"$INSTALL_STATIC_LIBRARY" = xno], + [AC_MSG_ERROR([must install either static or shared library])], + [])], AS_IF([test x"$enable_shared" = xyes], [INSTALL_STATIC_LIBRARY=no], [INSTALL_STATIC_LIBRARY=yes])) AC_SUBST(INSTALL_STATIC_LIBRARY) +} -AS_IF([test "$rb_with_pthread" = "yes"], [ - THREAD_MODEL=pthread +[begin]_group "JIT section" && { +AC_CHECK_PROG(RUSTC, [rustc], [rustc], [no]) dnl no ac_tool_prefix + +dnl check if rustc is recent enough to build YJIT (rustc >= 1.58.0) +JIT_RUSTC_OK=no +JIT_TARGET_ARCH= +AS_IF([test "$RUSTC" != "no"], + AC_MSG_CHECKING([whether ${RUSTC} works for YJIT]) + AS_CASE(["$target_cpu"], + [arm64|aarch64], [JIT_TARGET_ARCH=aarch64], + [x86_64], [JIT_TARGET_ARCH=x86_64], + ) + dnl Fails in case rustc target doesn't match ruby target. + dnl Can happen on Rosetta, for example. + AS_IF([echo "#[cfg(target_arch = \"$JIT_TARGET_ARCH\")] fn main() { let x = 1; format!(\"{x}\"); }" | + $RUSTC - --emit asm=/dev/null 2>/dev/null], + [JIT_RUSTC_OK=yes] + ) + AC_MSG_RESULT($JIT_RUSTC_OK) +) + +dnl check if we can build YJIT/ZJIT on this target platform +dnl we can't easily cross-compile with rustc so we don't support that +JIT_TARGET_OK=no +AS_IF([test "$cross_compiling" = no], + AS_CASE(["$target_cpu-$target_os"], + [*android*], [ + JIT_TARGET_OK=no + ], + [arm64-darwin*|aarch64-darwin*|x86_64-darwin*], [ + JIT_TARGET_OK=yes + ], + [arm64-*linux*|aarch64-*linux*|x86_64-*linux*], [ + JIT_TARGET_OK=yes + ], + [arm64-*bsd*|aarch64-*bsd*|x86_64-*bsd*], [ + JIT_TARGET_OK=yes + ] + ) +) + +dnl build YJIT in release mode if rustc >= 1.58.0 is present and we are on a supported platform +AC_ARG_ENABLE(yjit, + AS_HELP_STRING([--enable-yjit], + [enable in-process JIT compiler that requires Rust build tools. enabled by default on supported platforms if rustc 1.58.0+ is available]), + [YJIT_SUPPORT=$enableval], + [AS_CASE(["$JIT_TARGET_OK:$JIT_RUSTC_OK"], + [yes:yes], [ + YJIT_SUPPORT=yes + ], + [YJIT_SUPPORT=no] + )] +) + +dnl build ZJIT in release mode if rustc >= 1.85.0 is present and we are on a supported platform +ZJIT_SUPPORT=no +AC_ARG_ENABLE(zjit, + AS_HELP_STRING([--enable-zjit], + [enable experimental JIT compiler that requires Rust build tools. enabled by default on supported platforms if rustc 1.85.0+ is available]), + [ZJIT_SUPPORT=$enableval], + [AS_CASE(["$JIT_TARGET_OK"], + [yes], [ + rb_zjit_build_possible=no + AC_MSG_CHECKING([prerequisites for ZJIT])dnl only checked when --enable-zjit is not specified + # Fails in case rustc target doesn't match ruby target. Can happen on Rosetta, for example. + # 1.85.0 is the first stable version that supports the 2024 edition. + AS_IF([test "$RUSTC" != "no" && echo "#[cfg(target_arch = \"$JIT_TARGET_ARCH\")] fn main() {}" | + $RUSTC - --edition=2024 --emit asm=/dev/null 2>/dev/null], + AS_IF([test "$gnumake" = "yes"], [ + rb_zjit_build_possible=yes + ]) + ) + AC_MSG_RESULT($rb_zjit_build_possible) + ZJIT_SUPPORT=$rb_zjit_build_possible + ] + )] +) + +CARGO_BUILD_ARGS= +YJIT_LIBS= +JIT_CARGO_SUPPORT=no +AS_CASE(["${YJIT_SUPPORT}"], +[yes|dev|stats|dev_nodebug], [ + AS_IF([test x"$RUSTC" = "xno"], + AC_MSG_ERROR([rustc is required. Installation instructions available at https://www.rust-lang.org/tools/install]) + ) + + AS_CASE(["${YJIT_SUPPORT}"], + [yes], [ + ], + [dev], [ + rb_cargo_features='disasm,runtime_checks' + JIT_CARGO_SUPPORT=dev + AC_DEFINE(RUBY_DEBUG, 1) + ], + [dev_nodebug], [ + rb_cargo_features='disasm' + JIT_CARGO_SUPPORT=dev_nodebug + AC_DEFINE(YJIT_STATS, 1) + ], + [stats], [ + JIT_CARGO_SUPPORT=stats + AC_DEFINE(YJIT_STATS, 1) + ]) + + YJIT_LIBS="target/release/libyjit.a" + RUST_LIB='$(YJIT_LIBS)' + YJIT_OBJ='yjit.$(OBJEXT)' + JIT_OBJ='jit.$(OBJEXT)' + AS_IF([test x"$YJIT_SUPPORT" != "xyes" ], [ + AC_DEFINE_UNQUOTED(YJIT_SUPPORT, [$YJIT_SUPPORT]) + ]) + AC_DEFINE(USE_YJIT, 1) +], [ + AC_DEFINE(USE_YJIT, 0) +]) + +ZJIT_LIBS= +AS_CASE(["${ZJIT_SUPPORT}"], +[yes|dev|dev_nodebug|stats], [ + AS_IF([test x"$RUSTC" = "xno"], + AC_MSG_ERROR([rustc is required. Installation instructions available at https://www.rust-lang.org/tools/install]) + ) + + AS_CASE(["${ZJIT_SUPPORT}"], + [yes], [ + ], + [dev], [ + rb_cargo_features="$rb_cargo_features,disasm,runtime_checks" + JIT_CARGO_SUPPORT=dev + AC_DEFINE(RUBY_DEBUG, 1) + ], + [dev_nodebug], [ + rb_cargo_features="$rb_cargo_features,disasm" + JIT_CARGO_SUPPORT=dev_nodebug + AC_DEFINE(ZJIT_STATS, 1) + ], + [stats], [ + JIT_CARGO_SUPPORT=stats + AC_DEFINE(ZJIT_STATS, 1) + ]) + + ZJIT_LIBS="target/release/libzjit.a" + RUST_LIB='$(ZJIT_LIBS)' + ZJIT_OBJ='zjit.$(OBJEXT)' + JIT_OBJ='jit.$(OBJEXT)' + AS_IF([test x"$ZJIT_SUPPORT" != "xyes" ], [ + AC_DEFINE_UNQUOTED(ZJIT_SUPPORT, [$ZJIT_SUPPORT]) + ]) + AC_DEFINE(USE_ZJIT, 1) +], [ + AC_DEFINE(USE_ZJIT, 0) +]) + +RUSTC_FLAGS='-g -C lto=thin -C opt-level=3 -C overflow-checks=on' +AS_IF([test -n "${rustc_flags}"], [ + RUSTC_FLAGS="${RUSTC_FLAGS} ${rustc_flags}" +]) + +JIT_RUST_FLAGS='--crate-type=staticlib --cfg feature=\"stats_allocator\"' +RLIB_DIR= +AS_CASE(["$JIT_CARGO_SUPPORT:$YJIT_SUPPORT:$ZJIT_SUPPORT"], +[no:yes:yes], [ # release build of YJIT+ZJIT + YJIT_LIBS= + ZJIT_LIBS= + JIT_RUST_FLAGS="--crate-type=rlib" + RLIB_DIR="target/release" + RUST_LIB="target/release/libruby.a" +], +[no:*], [], +[ # JIT_CARGO_SUPPORT not "no" -- cargo required. + AC_CHECK_TOOL(CARGO, [cargo], [no]) + AS_IF([test x"$CARGO" = "xno"], + AC_MSG_ERROR([this build configuration requires cargo. Installation instructions available at https://www.rust-lang.org/tools/install])) + + YJIT_LIBS= + ZJIT_LIBS= + + # There's more processing below to get the feature set for the + # top-level crate, so capture at this point for feature set of + # just the zjit crate. + ZJIT_TEST_FEATURES="${rb_cargo_features}" + + AS_IF([test x"${YJIT_SUPPORT}" != x"no"], [ + rb_cargo_features="$rb_cargo_features,yjit" + ]) + AS_IF([test x"${ZJIT_SUPPORT}" != x"no"], [ + AC_SUBST(ZJIT_TEST_FEATURES) + rb_cargo_features="$rb_cargo_features,zjit" + ]) + # if YJIT and ZJIT release mode + AS_IF([test "${YJIT_SUPPORT}:${ZJIT_SUPPORT}" = "yes:yes"], [ + JIT_CARGO_SUPPORT=release + ]) + CARGO_BUILD_ARGS="--profile ${JIT_CARGO_SUPPORT} --features ${rb_cargo_features}" + AS_IF([test "${JIT_CARGO_SUPPORT}" = "dev"], [ + RUST_LIB="target/debug/libruby.a" + ], [ + RUST_LIB="target/${JIT_CARGO_SUPPORT}/libruby.a" + ]) ]) + +# In case either we're linking rust code +AS_IF([test -n "$RUST_LIB"], [ + AS_CASE(["$target_os"],[openbsd*],[ + # Link libc++abi (which requires libpthread) for _Unwind_* functions needed by rust stdlib + LDFLAGS="$LDFLAGS -lpthread -lc++abi" + ]) + + # absolute path to stop the "target" dir in src dir from interfering through VPATH + RUST_LIB="$(pwd)/${RUST_LIB}" +]) + +dnl These variables end up in ::RbConfig::CONFIG +AC_SUBST(RUSTC)dnl Rust compiler command +AC_SUBST(JIT_RUST_FLAGS)dnl the common rustc flags for JIT crates such as zjit +AC_SUBST(RUSTC_FLAGS)dnl user-configurable rustc compiler flags +AC_SUBST(CARGO)dnl Cargo command for Rust builds +AC_SUBST(CARGO_BUILD_ARGS)dnl for selecting Rust build profiles +AC_SUBST(YJIT_SUPPORT)dnl what flavor of YJIT the Ruby build includes +AC_SUBST(YJIT_LIBS)dnl the .a library of YJIT +AC_SUBST(YJIT_OBJ)dnl for optionally building the C parts of YJIT +AC_SUBST(ZJIT_SUPPORT)dnl what flavor of ZJIT the Ruby build includes +AC_SUBST(ZJIT_LIBS)dnl path to the .a library of ZJIT +AC_SUBST(ZJIT_OBJ)dnl for optionally building the C parts of ZJIT +AC_SUBST(JIT_OBJ)dnl for optionally building C glue code for Rust FFI +AC_SUBST(RUST_LIB)dnl path to the rust .a library that contains either or both JITs +AC_SUBST(RLIB_DIR)dnl subpath of build directory for .rlib files +AC_SUBST(JIT_CARGO_SUPPORT)dnl "no" or the cargo profile of the rust code +} + +[begin]_group "build section" && { AC_CACHE_CHECK([for prefix of external symbols], rb_cv_symbol_prefix, [ - AC_TRY_COMPILE([extern void conftest_external(void) {}], [], [ + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[extern void conftest_external(void) {}]], [[]])],[ rb_cv_symbol_prefix=`$NM conftest.$ac_objext | sed -n ['/.*T[ ]\([^ ]*\)conftest_external.*/!d;s//\1/p;q']` ], @@ -3957,9 +4171,28 @@ AC_CACHE_CHECK([for prefix of external symbols], rb_cv_symbol_prefix, [ ]) SYMBOL_PREFIX="$rb_cv_symbol_prefix" test "x$SYMBOL_PREFIX" = xNONE && SYMBOL_PREFIX='' + +AS_IF([test x"$SOEXT" = xdll], [ + # DLL on Windows is managed by win32/mkexports.rb +], [test x"$enable_shared" = xyes], [ + AC_CACHE_CHECK([for default symbols in empty shared library], rb_cv_symbols_in_emptylib, [ + save_CC="$CC" + eval CC=\"`printf "%s" "${DLDSHARED}" | sed ['s/\$(CC)/${CC}/']`\" + AC_LINK_IFELSE([AC_LANG_PROGRAM()],[ + rb_cv_symbols_in_emptylib=`$NM -Pgp conftest$ac_exeext | + sed ["/ [A-TV-Z] .*/!d;s///;s/^${SYMBOL_PREFIX}//;/^main$/d"]` + ]) + set dummy ${rb_cv_symbols_in_emptylib} + shift + rb_cv_symbols_in_emptylib="$*" + CC="$save_CC" + ]) +]) +AC_SUBST(XSYMBOLS_IN_EMPTYLIB, "${rb_cv_symbols_in_emptylib}") + DLNOBJ=dln.o AC_ARG_ENABLE(dln, - AC_HELP_STRING([--disable-dln], [disable dynamic link feature]), + AS_HELP_STRING([--disable-dln], [disable dynamic link feature]), [test "$enableval" = yes || DLNOBJ=dmydln.o]) AC_SUBST(DLNOBJ) MINIDLNOBJ=dmydln.o @@ -3971,9 +4204,32 @@ AS_CASE(["$target_os"], RUBY_APPEND_OPTION(CFLAGS, -pipe) ], [darwin*], [ - RUBY_APPEND_OPTION(CFLAGS, -pipe) - RUBY_APPEND_OPTION(XLDFLAGS, [-framework Foundation]) - RUBY_APPEND_OPTION(LIBRUBYARG_STATIC, [-framework Foundation]) + RUBY_TRY_CFLAGS(-pipe, [pipe_opt=yes], [pipe_opt=no]) + AS_IF([test $pipe_opt = yes], [RUBY_APPEND_OPTION(CFLAGS, -pipe)]) + AC_MSG_CHECKING([whether Security framework is needed]) + AC_COMPILE_IFELSE([ + AC_LANG_BOOL_COMPILE_TRY([ +@%:@include <AvailabilityMacros.h> +enum { + least = MAC_OS_X_VERSION_10_7, /* just fail if undefined */ + required = MAC_OS_X_VERSION_MIN_REQUIRED, + upper /* bigger than MIN_REQUIRED, or */ +@%:@ifdef MAC_OS_X_VERSION_10_10 + = MAC_OS_X_VERSION_10_10 +@%:@endif +};], + [required >= least && required < upper])], + [dnl + AC_MSG_RESULT(yes) + RUBY_APPEND_OPTION(XLDFLAGS, [-framework Security]) + RUBY_APPEND_OPTION(LIBRUBYARG_STATIC, [-framework Security]) + ],dnl + [dnl + AC_MSG_RESULT(no) + ]dnl + ) + RUBY_APPEND_OPTION(XLDFLAGS, [-framework CoreFoundation]) + RUBY_APPEND_OPTION(LIBRUBYARG_STATIC, [-framework CoreFoundation]) ], [osf*], [ AS_IF([test "$GCC" != "yes" ], [ @@ -3990,8 +4246,8 @@ AS_CASE(["$target_os"], CFLAGS="$CFLAGS -std" ]) ], - [cygwin*|mingw*], [ - LIBRUBY_DLDFLAGS="${DLDFLAGS}"' -Wl,--out-implib=$(LIBRUBY)' + [cygwin*|msys*|mingw*], [ + LIBRUBY_DLDFLAGS="${LIBRUBY_DLDFLAGS}"' -Wl,--out-implib=$(LIBRUBY)' AS_CASE(["$target_os"], [cygwin*], [ AS_IF([test x"$enable_shared" = xyes], [ @@ -4002,21 +4258,19 @@ AS_CASE(["$target_os"], [mingw*], [ AS_IF([test x"$enable_shared" = xyes], [ LIBRUBY_SO='$(RUBY_SO_NAME)'.dll + LIBRUBY_SONAME='' LIBRUBY_DLDFLAGS="${LIBRUBY_DLDFLAGS}"' $(RUBYDEF)' ]) EXPORT_PREFIX=' ' - DLDFLAGS="${DLDFLAGS}"' $(DEFFILE)' + EXTDLDFLAGS='$(DEFFILE)' AC_LIBOBJ([win32/win32]) AC_LIBOBJ([win32/file]) COMMON_LIBS=m # COMMON_MACROS="WIN32_LEAN_AND_MEAN=" COMMON_HEADERS="winsock2.h windows.h" - THREAD_MODEL=win32 PLATFORM_DIR=win32 ]) LIBRUBY_ALIASES='' - FIRSTMAKEFILE=GNUmakefile:cygwin/GNUmakefile.in - SOLIBS='$(LIBS)' AS_IF([test x"$enable_shared" = xyes], [ LIBRUBY='lib$(RUBY_SO_NAME).dll.a' ], [ @@ -4025,40 +4279,23 @@ AS_CASE(["$target_os"], LIBRUBYARG='-l$(RUBY_SO_NAME)' ]) ], - [hpux*], [ - AS_CASE(["$YACC"],[*yacc*], [ - XCFLAGS="$XCFLAGS -DYYMAXDEPTH=300" - YACC="$YACC -Nl40000 -Nm40000" - ]) + [wasi*], [ + AC_LIBOBJ([wasm/missing]) + AC_LIBOBJ([wasm/runtime]) + AC_LIBOBJ([wasm/fiber]) + AC_LIBOBJ([wasm/machine]) + AC_LIBOBJ([wasm/setjmp]) + AC_LIBOBJ([wasm/machine_core]) + AC_LIBOBJ([wasm/setjmp_core]) + PLATFORM_DIR=wasm ]) MINIOBJS="$MINIDLNOBJ" -AS_CASE(["$THREAD_MODEL"], -[pthread], [AC_CHECK_HEADERS(pthread.h)], -[win32], [], -[""], [AC_MSG_ERROR(thread model is missing)], - [AC_MSG_ERROR(unknown thread model $THREAD_MODEL)]) - AC_ARG_ENABLE(debug-env, AS_HELP_STRING([--enable-debug-env], [enable RUBY_DEBUG environment variable]), [AC_SUBST(ENABLE_DEBUG_ENV, yes)]) -AS_CASE(["$FIRSTMAKEFILE"], [*GNUmakefile:*], [gnumake=yes], [ - AC_MSG_CHECKING([if ${MAKE-make} is GNU make]) - mkdir conftest.dir - echo "all:; @echo yes" > conftest.dir/GNUmakefile - echo "all:; @echo no" > conftest.dir/Makefile - gnumake=`(cd conftest.dir; ${MAKE-make})` - rm -fr conftest.dir - AS_CASE(["$gnumake"], - [*yes*], [ - FIRSTMAKEFILE=GNUmakefile:template/GNUmakefile.in - gnumake=yes], - [ - gnumake=no]) - AC_MSG_RESULT($gnumake) -]) AS_IF([test "$gnumake" = yes], [ NULLCMD=: ], [ AC_MSG_CHECKING([for safe null command for ${MAKE-make}]) mkdir conftest.dir @@ -4084,13 +4321,12 @@ AS_IF([test "${universal_binary-no}" = yes ], [ AC_CACHE_CHECK([for architecture macros], rb_cv_architecture_macros, [ mv confdefs.h confdefs1.h : > confdefs.h - AC_TRY_COMPILE([@%:@if defined __`echo ${universal_archnames} | + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@if defined __`echo ${universal_archnames} | sed 's/=[^ ]*//g;s/ /__ || defined __/g'`__ @%:@else @%:@error >>>>>><<<<<< -@%:@endif], [], -[ +@%:@endif]], [[]])],[ rb_cv_architecture_macros=yes mv -f confdefs1.h confdefs.h ], [ @@ -4103,21 +4339,31 @@ AS_IF([test "${universal_binary-no}" = yes ], [ CFLAGS="$new_cflags -arch $archs" archs="__${archs}__" AC_MSG_CHECKING([for macro ${archs} on ${cpu}]) - AC_TRY_COMPILE([@%:@ifndef ${archs} + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@ifndef ${archs} @%:@error -@%:@endif], [], [AC_MSG_RESULT([yes])], [AC_MSG_RESULT([no])]) +@%:@endif]], [[]])], + [AC_MSG_RESULT([yes])], [AC_MSG_RESULT([no])]) done mv -f confdefs1.h confdefs.h AC_MSG_ERROR([failed]) ])]) AC_CACHE_CHECK(whether __ARCHITECTURE__ is available, rb_cv_architecture_available, - AC_TRY_COMPILE([@%:@include <stdio.h> - const char arch[[]] = __ARCHITECTURE__;], [puts(arch);], + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include <stdio.h> + const char arch[[]] = __ARCHITECTURE__;]], [[puts(arch);]])], [rb_cv_architecture_available=yes], [rb_cv_architecture_available=no])) ]) +} + +[end]_group -CPPFLAGS="$CPPFLAGS "'$(DEFS)' -test -z "$CPPFLAGS" || CPPFLAGS="$CPPFLAGS "; CPPFLAGS="$CPPFLAGS"'${cppflags}' +MAINLIBS="$LIBS" +LIBS=$ORIG_LIBS +AS_IF([test -n "${LIBS}"], [ + libspat=`echo "${LIBS}" | sed 's/[[][|.*$^]]/\\&/g;s/^ */ /;s/^ *$/ /'` + MAINFLAGS=`echo " $MAINLIBS " | sed "s|$libspat"'||;s/^ *//;s/ *$//'` +]) +LIBRUBYARG_STATIC="${LIBRUBYARG_STATIC} \$(MAINLIBS)" +CPPFLAGS="$CPPFLAGS "'$(DEFS) ${cppflags}' AS_IF([test -n "${cflags+set}"], [ cflagspat=`eval echo '"'"${cflags}"'"' | sed 's/[[][|.*]]/\\&/g;s/^ */ /;s/^ *$/ /'` CFLAGS=`echo " $CFLAGS " | sed "s|$cflagspat"'|${cflags}|;s/^ *//;s/ *$//'` @@ -4132,14 +4378,34 @@ AS_IF([test "${ARCH_FLAG}"], [ CXXFLAGS=`echo "$CXXFLAGS" | sed "s| *$archflagpat"'||'` LDFLAGS=`echo "$LDFLAGS" | sed "s| *$archflagpat"'||'` ]) +AS_CASE([" $rb_cv_warnflags "], [*" -Wshorten-64-to-32 "*|*" -Werror=shorten-64-to-32 "*], [ + voidp_ll= + AS_CASE([$ac_cv_sizeof_voidp], + [SIZEOF_LONG_LONG], [voidp_ll=true], + [@<:@0-9@:>@*], [ + AS_IF([test $ac_cv_sizeof_voidp -gt $ac_cv_sizeof_long], [voidp_ll=true]) + ]) + AS_IF([test "$voidp_ll"], [ + # Disable the shorten-64-to-32 warning for now, because it currently + # generates a lot of warnings on platforms where `sizeof(void*)` is + # larger than `sizeof(long)`. + # + # TODO: Replace `long` with `ptrdiff_t` or something in the all sources. + rb_cv_warnflags=`echo "$rb_cv_warnflags" | + sed -e 's/ -W\(shorten-64-to-32 \)/ -Wno-\1/' \ + -e 's/ -Werror=\(shorten-64-to-32 \)/ -Wno-\1/'` + ]) +]) +rb_cv_warnflags=`echo "$rb_cv_warnflags" | sed 's/^ *//;s/ *$//'` warnflags="$rb_cv_warnflags" AC_SUBST(cppflags)dnl -AC_SUBST(cflags, ["${orig_cflags:+$orig_cflags }"'${optflags} ${debugflags} ${warnflags}'])dnl -AC_SUBST(cxxflags, ["${orig_cxxflags:+$orig_cxxflags }"'${optflags} ${debugflags} ${warnflags}'])dnl +AC_SUBST(cflags, ['${hardenflags} '"${orig_cflags:+$orig_cflags }"' ${optflags} ${debugflags} ${warnflags}'])dnl +AC_SUBST(cxxflags)dnl AC_SUBST(optflags)dnl AC_SUBST(debugflags)dnl AC_SUBST(warnflags)dnl AC_SUBST(strict_warnflags)dnl +AC_SUBST(hardenflags)dnl AC_SUBST(XCFLAGS)dnl AC_SUBST(XLDFLAGS)dnl AC_SUBST(EXTLDFLAGS)dnl @@ -4160,6 +4426,7 @@ AC_SUBST(LIBRUBYARG_STATIC) AC_SUBST(LIBRUBYARG_SHARED) AC_SUBST(SOLIBS) AC_SUBST(DLDLIBS) +AC_SUBST(DLDSHARED) AC_SUBST(ENABLE_SHARED) AC_SUBST(MAINLIBS) AC_SUBST(COMMON_LIBS) @@ -4169,6 +4436,7 @@ AC_SUBST(EXPORT_PREFIX) AC_SUBST(SYMBOL_PREFIX) AC_SUBST(MINIOBJS) AC_SUBST(THREAD_MODEL) +AC_SUBST(COROUTINE_TYPE, ${coroutine_type}) AC_SUBST(PLATFORM_DIR) firstmf=`echo $FIRSTMAKEFILE | sed 's/:.*//'` @@ -4187,7 +4455,7 @@ test "$program_suffix" != NONE && RUBY_INSTALL_NAME="${ri_prefix}"'$(RUBY_BASE_NAME)'"${ri_suffix}" AS_CASE(["$target_os"], - [cygwin*|mingw*], [ + [cygwin*|msys*|mingw*], [ RUBYW_INSTALL_NAME="${ri_prefix}"'$(RUBYW_BASE_NAME)'"${ri_suffix}" rubyw_install_name='$(RUBYW_INSTALL_NAME)' ]) @@ -4229,6 +4497,7 @@ AS_CASE(["$ruby_version"], AS_IF([test ${RUBY_LIB_VERSION_STYLE+set}], [ { echo "#define RUBY_LIB_VERSION_STYLE $RUBY_LIB_VERSION_STYLE" + echo '@%:@include "confdefs.h"' echo '#define STRINGIZE(x) x' test -f revision.h -o -f "${srcdir}/revision.h" || echo '#define RUBY_REVISION 0' echo '#include "version.h"' @@ -4303,7 +4572,7 @@ AS_IF([test "${universal_binary-no}" = yes ], [ for archs in ${universal_archnames}; do cpu=`echo $archs | sed 's/.*=//'` archs=`echo $archs | sed 's/=.*//'` - RUBY_DEFINE_IF([defined __${archs}__], RUBY_PLATFORM_CPU, ["${cpu}"]) + RUBY_DEFINE_IF([defined __${archs}__ &&! defined RUBY_PLATFORM_CPU], RUBY_PLATFORM_CPU, ["${cpu}"]) done ]) ints='long int short' @@ -4311,11 +4580,19 @@ AS_IF([test "${universal_binary-no}" = yes ], [ AC_SUBST(UNIVERSAL_ARCHNAMES, "${universal_archnames}") AC_SUBST(UNIVERSAL_INTS, "${ints}") AC_DEFINE_UNQUOTED(RUBY_PLATFORM_OS, "${target_os}") - AC_DEFINE_UNQUOTED(RUBY_ARCH, "universal-"RUBY_PLATFORM_OS) - AC_DEFINE_UNQUOTED(RUBY_PLATFORM, "universal."RUBY_PLATFORM_CPU"-"RUBY_PLATFORM_OS) + AC_DEFINE_UNQUOTED(RUBY_ARCH, "universal-" RUBY_PLATFORM_OS) + AC_DEFINE_UNQUOTED(RUBY_PLATFORM, "universal." RUBY_PLATFORM_CPU "-" RUBY_PLATFORM_OS) ], [ - arch="${target_cpu}-${target_os}" + AS_IF([test "${target_os}-${rb_cv_msvcrt}" = "mingw32-ucrt" ], [ + arch="${target_cpu}-mingw-ucrt" + ], [ + arch="${target_cpu}-${target_os}" + ]) AC_DEFINE_UNQUOTED(RUBY_PLATFORM, "$arch") + + AS_IF([test "$arch" = "s390x-linux"], [ + AC_DEFINE_UNQUOTED(USE_MN_THREADS, 0) + ]) ]) unset sitearch @@ -4396,17 +4673,37 @@ AS_IF([test -z "$MANTYPE"], [ ]) AC_SUBST(MANTYPE) +MKMF_VERBOSE=0 +AC_ARG_ENABLE(mkmf-verbose, + AS_HELP_STRING([--enable-mkmf-verbose], [enable verbose in mkmf]), + [MKMF_VERBOSE=1], + [MKMF_VERBOSE=0]) +AC_SUBST(MKMF_VERBOSE) + AC_ARG_ENABLE(rubygems, AS_HELP_STRING([--disable-rubygems], [disable rubygems by default]), [enable_rubygems="$enableval"], [enable_rubygems=yes]) AS_IF([test x"$enable_rubygems" = xno], [ - AC_DEFINE(DISABLE_RUBYGEMS, 1) - USE_RUBYGEMS=NO + USE_RUBYGEMS=no ], [ - USE_RUBYGEMS=YES + USE_RUBYGEMS=yes ]) AC_SUBST(USE_RUBYGEMS) +m4_define(available_parsers, [parse.y, prism]) +AC_ARG_WITH(parser, + AS_HELP_STRING([--with-parser=PARSER], + [specify default parser; PARSER is one of ]m4_join([, ],available_parsers)), + [], [with_parser=prism]) +AS_CASE([$with_parser], +m4_foreach(parser, [available_parsers], + parser[,][AC_DEFINE_UNQUOTED(RB_DEFAULT_PARSER, RB_DEFAULT_PARSER_[]AS_TR_CPP(parser)),]) + [AC_MSG_ERROR([Unknown parser: $with_parser])] +) + +# Use the ruby allocator for prism. See prism/defines.h +RUBY_APPEND_OPTIONS(XCFLAGS, -DPRISM_XALLOCATOR) + arch_hdrdir="${EXTOUT}/include/${arch}/ruby" AS_MKDIR_P("${arch_hdrdir}") config_h="${arch_hdrdir}/config.h" @@ -4414,13 +4711,13 @@ guard=INCLUDE_RUBY_CONFIG_H { echo "#ifndef $guard" echo "#define $guard 1" - grep -v "^#define PACKAGE_" confdefs.h + sed "/^@%:@define PACKAGE_/d;s/ *$//" confdefs.h echo "#endif /* $guard */" } | tr -d '\015' | ( AS_IF([test "x$CONFIGURE_TTY" = xyes], [color=--color], [color=]) - exec ${srcdir}/tool/ifchange $color "${config_h}" - -) || AC_MSG_ERROR([failed to create ${config_h}]) + exec ${SHELL} ${tooldir}/ifchange $color "${config_h}" - +) >&AS_MESSAGE_FD || AC_MSG_ERROR([failed to create ${config_h}]) tr -d '\015' < largefile.h > confdefs.h rm largefile.h @@ -4447,64 +4744,73 @@ PACKAGE=$RUBY_BASE_NAME AC_SUBST(PACKAGE) AS_MESSAGE([$PACKAGE library version = $ruby_version]) +AS_IF([test x"$CC_WRAPPER" != x], [ + CC='$(CC_WRAPPER) '"${CC@%:@$CC_WRAPPER }" + CPP='$(CC_WRAPPER) '"${CPP@%:@$CC_WRAPPER }" + XCC_WRAPPER="$CC_WRAPPER" +]) +AC_SUBST(CC_WRAPPER, '') +AC_SUBST(XCC_WRAPPER) + AS_CASE([" $CPP "], [*" $CC "*], [CPP=`echo " $CPP " | sed "s| $CC |"' $(CC) |;s/^ *//;s/ *$//'`]) +AS_IF([test ! -f "$srcdir/revision.h"], [ + AS_IF([test "x$HAVE_BASERUBY" = xyes], [ + ${BASERUBY} -C "$srcdir" tool/file2lastrev.rb -q --revision.h > "$srcdir/revision.h" + ], [ + touch "$srcdir/revision.h" + ]) +]) + AS_IF([test x"$firstmf" != x], [ AC_CONFIG_FILES($firstmf:$firsttmpl, [], [firstmf="$firstmf" firsttmpl="$firsttmpl"]) ]) -AC_CONFIG_FILES(Makefile, [ +AC_CONFIG_FILES(Makefile:template/Makefile.in, [ tmpmk=confmk$$.tmp { AS_IF([test ${VCS+set}], [ : - ], [svn info "$srcdir" > /dev/null 2>&1], [ - VCS='svn' ], [git_dir=`$GIT --work-tree="$srcdir" --git-dir="$srcdir/.git" rev-parse --git-dir 2>/dev/null`], [ - AS_IF([test -d "$git_dir/svn"], [ - VCS='$(GIT) svn' - ], [ - VCS='$(GIT)' - ]) + VCS='$(GIT)' ], [ VCS='echo cannot' ]) AS_CASE("$VCS", - [svn], [VCSUP='$(VCS) up $(SVNUPOPTIONS)'], - ['$(GIT) svn'], [VCSUP='$(VCS) rebase $(GITSVNREBASEOPTIONS)'], - ['$(GIT)'|git], [VCSUP='$(VCS) pull $(GITPULLOPTIONS)'], + ['$(GIT)'|git], [VCSUP='$(VCS) pull --rebase $(GITPULLOPTIONS)'], [VCSUP='$(VCS)']) - sed -n \ - -e '[/^@%:@define \(RUBY_RELEASE_[A-Z]*\) \([0-9][0-9]*\)/]{' \ - -e 's//\1 = \2/' \ - -e '[s/ \([0-9]\)$/ 0\1/]' \ - -e p \ - -e '}' "$srcdir/version.h" + for f in "$srcdir/version.h" "$srcdir/revision.h"; do + test -f "$f" || continue + sed -n \ + -e '[/^@%:@define \(RUBY_RELEASE_[A-Z]*\) \([0-9][0-9]*\)/]{' \ + -e 's//\1 = \2/' \ + -e '[s/ \([0-9]\)$/ 0\1/]' \ + -e p \ + -e '}' "$f" + done sed '/^MISSING/s/\$U\././g;/^VCS *=/s#@VCS@#'"$VCS"'#;/^VCSUP *=/s#@VCSUP@#'"$VCSUP"'#' Makefile echo; test x"$EXEEXT" = x || echo 'miniruby: miniruby$(EXEEXT)' AS_IF([test "$gnumake" != yes], [ - echo ['$(MKFILES): $(srcdir)/common.mk'] - sed ['s/{\$([^(){}]*)[^{}]*}//g'] ${srcdir}/common.mk + # extract NMake-style include list + set = `sed -n 's/^!include *//p' ${srcdir}/common.mk` + echo common_mk_includes "@S|@*" # generate the macro assignment + shift + common_mk_includes="`echo \"@S|@*\" | sed 's|\$(srcdir)|.|g'`" + (PWD= cd ${srcdir} && sed -f tool/prereq.status common.mk ${common_mk_includes}) + AS_IF([test "$YJIT_SUPPORT" = yes], [ + cat ${srcdir}/yjit/not_gmake.mk + echo ['$(MKFILES): ${srcdir}/yjit/not_gmake.mk'] + ]) ], [ echo 'distclean-local::; @$(RM) GNUmakefile uncommon.mk' ]) - } > $tmpmk && AS_IF([! grep '^ruby:' $tmpmk > /dev/null], [ - AS_IF([test "${gnumake}" = yes], [ - tmpgmk=confgmk$$.tmp - { - echo "include $tmpmk" - echo "-include uncommon.mk" - } > $tmpgmk - ], [ - tmpgmk=$tmpmk - ]) && - test -z "`${MAKE-make} -f $tmpgmk info-program | grep '^PROGRAM=ruby$'`" && - echo 'ruby: $(PROGRAM);' >> $tmpmk - test "$tmpmk" = "$tmpgmk" || rm -f "$tmpgmk" - ]) && mv -f $tmpmk Makefile], -[EXEEXT='$EXEEXT' gnumake='$gnumake' GIT='$GIT']) + + echo; echo '$(srcdir)/$(CONFIGURE):RUBY_M4_INCLUDED \ + $(empty)' + } > $tmpmk && mv -f $tmpmk Makefile], +[EXEEXT='$EXEEXT' MAKE='${MAKE-make}' gnumake='$gnumake' GIT='$GIT' YJIT_SUPPORT='$YJIT_SUPPORT']) AC_ARG_WITH([ruby-pc], - AC_HELP_STRING([--with-ruby-pc=FILENAME], [pc file basename]), + AS_HELP_STRING([--with-ruby-pc=FILENAME], [pc file basename]), [ruby_pc="$withval"], [ruby_pc="${RUBY_BASE_NAME}-${MAJOR}.${MINOR}.pc"]) AC_SUBST(ruby_pc) @@ -4515,41 +4821,35 @@ AC_ARG_WITH(destdir, [DESTDIR="$withval"]) AC_SUBST(DESTDIR) -AC_CONFIG_FILES($ruby_pc:template/ruby.pc.in, - [ - AS_IF([sed ['s/\$(\([A-Za-z_][A-Za-z0-9_]*\))/${\1}/g;s/@[A-Za-z_][A-Za-z0-9_]*@//'] $ruby_pc > ruby.tmp.pc && - { - test -z "$PKG_CONFIG" || - PKG_CONFIG_PATH=. $PKG_CONFIG --print-errors ruby.tmp - }], - [ - mv -f ruby.tmp.pc $ruby_pc - ], [ - exit 1 - ]) - ], - [ruby_pc='$ruby_pc' PKG_CONFIG='$PKG_CONFIG']) +AS_IF([test "x$load_relative:$DESTDIR" = xyes:], [ + AS_IF([test "x$prefix" = xNONE], [DESTDIR="$ac_default_prefix"], [DESTDIR="$prefix"]) + prefix=/. +]) AC_OUTPUT } -} +AS_IF([test "$silent" = yes], [], [ AS_IF([${FOLD+:} false], [], [ AS_IF([test "`echo abcdefg hijklmno | fold -s -w10 | sed 1d`" = hijklmno], [FOLD="fold"], [FOLD=]) ]) +fold_width=`expr $COLUMNS - 30 2>/dev/null` || fold_width=50 AS_REQUIRE_SHELL_FN([config_summary], [AS_FUNCTION_DESCRIBE([config_summary], [NAME, VAL], [configuration summary])], [AS_IF([test -z "$2"], [], [ AS_ECHO_N([" * $1: "]) | dd bs=1 count=26 2>/dev/null AS_IF([test "$FOLD"], [ - echo "$2" | fold -s -w50 | + echo "$2" | fold -s -w$fold_width | sed '1!s/^/ /;$!s/$/\\/' ], [echo "$2"]) ])] ) +AS_IF([test $install_doc = yes], + [DOCTARGETS=`echo " $RDOCTARGET $CAPITARGET " | sed 's/ nodoc //g;s/^ *//;s/ *$//'`], + [DOCTARGETS=no]) echo "---" -echo "Configuration summary for $RUBY_BASE_NAME version $RUBY_PROGRAM_VERSION" +echo "Configuration summary for $RUBY_BASE_NAME version $MAJOR.$MINOR.$TEENY" echo "" config_summary "Installation prefix" "$prefix" config_summary "exec prefix" "$exec_prefix" @@ -4562,19 +4862,28 @@ config_summary "site libraries path" "$rubysitearchprefix" config_summary "vendor path" "$vendordir" config_summary "target OS" "$target_os" config_summary "compiler" "$CC" -config_summary "with pthread" "$enable_pthread" +config_summary "with thread" "$THREAD_MODEL" +config_summary "with coroutine" "$coroutine_type" +config_summary "with modular GC" "$modular_gc_summary" config_summary "enable shared libs" "$ENABLE_SHARED" config_summary "dynamic library ext" "$DLEXT" config_summary "CFLAGS" "$cflags" config_summary "CPPFLAGS" "$cppflags" config_summary "LDFLAGS" "$LDFLAGS" +config_summary "DLDFLAGS" "$DLDFLAGS" config_summary "optflags" "$optflags" config_summary "debugflags" "$debugflags" config_summary "warnflags" "$warnflags" +config_summary "hardenflags" "$hardenflags" config_summary "strip command" "$STRIP" -config_summary "install doc" "$install_doc" +config_summary "install doc" "$DOCTARGETS" +config_summary "YJIT support" "$YJIT_SUPPORT" +config_summary "ZJIT support" "$ZJIT_SUPPORT" +config_summary "RUSTC_FLAGS" "$RUSTC_FLAGS" config_summary "man page type" "$MANTYPE" config_summary "search path" "$search_path" config_summary "static-linked-ext" ${EXTSTATIC:+"yes"} +config_summary "BASERUBY -v" "$BASERUBY_VERSION" echo "" echo "---" +]) |
