#!/bin/sh # # Copyright 2009-2024 # Kaz Kylheku # Vancouver, Canada # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, this # list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # The #!/bin/sh might be some legacy piece of junk, not even up to 1990 POSIX.2 # spec. So the first step is to look for a better shell in some known places # and re-execute ourselves with that interpreter, unless there is evidence we # are already running in a usable shell. # while true ; do # we have already recursed into a desired shell if test "x$txr_shell" != x ; then break fi # If PS4 is set to "+ ", we are probably running on a good shell: GNU # Bash sets it like this, as does late-model Ash, Dash, Korn Shell 93, # and the XPG shell on Solaris 10. Zsh sets PS4 to "+ " this in its # POSIX mode, which handles our script, but to some other value in its # regular mode which doesn't handle our script. if test "x$PS4" = "x+ " ; then break fi # Slow path: find a suitable shell. # First choice is $CONFIG_SHELL, a convention from GNU Autoconf. for shell in "$CONFIG_SHELL" \ /bin/bash /usr/bin/bash /usr/local/bin/bash \ /bin/dash /usr/bin/dash /usr/local/bin/dash \ /bin/ksh /usr/bin/ksh /usr/local/bin/ksh \ /usr/xpg4/bin/sh do if test -x "$shell" ; then txr_shell=$shell break fi done if test "x$txr_shell" = x ; then echo "No known modern shell found; sticking with this one." break; fi # we export txr_shell because it acts as a flag indicating the recursed case export txr_shell echo "Re-executing using $txr_shell" exec "$txr_shell" $0 ${@+"$@"} break done set -u if [ -n "${txr_shell+y}" ] ; then printf "Now running in %s shell\n" $txr_shell else printf "Running in original shell.\n" fi # # Save command line in a way that can be re-run. # cmdline= for arg in "$0" ${@+"$@"} ; do [ -n "$cmdline" ] && cmdline="$cmdline " case $arg in *"'"* ) case $arg in *[\"\$\\]* ) cmdline="$cmdline'$(printf "%s" "$arg" | sed -e "s/'/'\\\\''/g")'" ;; * ) cmdline="$cmdline\"$arg\"" ;; esac ;; *'"'* | *['$*?[(){};&|<>#']* | '~'* ) cmdline="$cmdline'$arg'" ;; *' '* | *' '* ) cmdline="$cmdline\"$arg\"" ;; * ) cmdline="$cmdline$arg" ;; esac done # # Use the POSIX locale to suppress monkey business in the utilities # export LC_ALL="C" export LANG="C" # # Establish default values for any variables that are not specified # on the command line. The default derivations from prefix are in # Make syntax. They go verbatim into the generated config.make. # This way they can be overridden more flexibly at make time. # # # non-config # help= # # config # build_in_srcdir= prefix='/usr/local' install_prefix= bindir='bin' datadir='share/txr' mandir='share/man' maintainer= parallelmake= parallelmake_given= make= cross= compiler_prefix= ccname='$(CC)' cc='$(cross)$(compiler_prefix)$(ccname)' gcc_version= broken128= do_nopie=y cplusplus= intptr= exe= tool_prefix= lexname_given= lexname= lex_given= lex='$(cross)$(tool_prefix)$(lexname)' yaccname_given= yaccname='' # test tries $(YACC) first yacc='$(cross)$(tool_prefix)$(yaccname)' yacc_given= nm='$(cross)$(tool_prefix)nm' opt_flags='-O2 -fno-stack-protector' lang_flags='-D_XOPEN_SOURCE=700 -D_POSIX_C_SOURCE=200112 -D_GNU_SOURCE' diag_flags="-Wall -Wextra -Werror=implicit-function-declaration \ -Werror=missing-prototypes -Werror=strict-prototypes \ -Werror=old-style-definition" diag_flags_given= debug_flags=-g debug_only_flags=-DTXR_DEBUG debug_also= inline= platform_cflags= remove_flags= lex_dbg_flags= conf_ldflags= conf_ldlibs= platform_ldflags= platform_ldlibs= txr_dbg_opts=--gc-debug valgrind= extra_debugging= debug_support=y have_zlib= big_time= big_time_given= gen_gc=y small_mem= full_repl=y have_dbl_decimal_dig= have_unistd= have_sys_stat= have_sys_types= have_sys_time= have_strerror_r= have_makedev= have_syslog= have_glob= have_ftw= have_windows_h= have_windres= have_posix_sigs= have_sockets= have_git= have_ubsan= have_pwuid= have_grgid= have_alloca= have_termios= have_winsize= termios_define= have_pkgconfig= have_malloc_usable_size= libffi_cflags= darwin_target= solaris_target= build_id= android_target= nan_boxing= nan_boxing_given= # # Parse configuration variables # while [ $# -gt 0 ] ; do case $1 in --no-* | --no_* ) var=${1#--no?} val= ;; --*=* ) var=${1%%=*} var=${var#--} val=${1#*=} ;; --*= ) var=${1%%=*} var=${var#--} val= ;; --* ) var=${1#--} val=y ;; *=* ) var=${1%%=*} val=${1#*=} ;; *= ) var=${1%%=*} val= ;; * ) printf "$0: '$1' doesn't look like a configuration variable assignment\n" printf "$0: use --help to get help\n" exit 1 esac var=$(echo "$var" | tr - _) if ! echo $var | grep -q -E '^[A-Za-z_][A-Za-z0-9_]*$' ; then printf "$0: '$var' isn't a proper configuration variable name\n" exit 1 fi eval "var_exists=\${$var+y}" if [ "$var_exists" != y ] ; then printf "$0: nonexistent option: '%s'\n" "$1" exit 1 fi eval "$var='$(printf "%s" "$val" | sed -e "s/'/'\\\\''/g")'" eval "var_given_exists=\${${var}_given+y}" if [ "$var_given_exists" = y ] ; then eval "${var}_given=y" fi shift done # # If --help was given (or --help= or help=) then # print help and exit. The termination status is failed, to indicate # that configuration was not done. # if [ -n "$help" ] ; then cat < reconfigure < /dev/null) || true set -- $output if [ $# -lt 3 ] || [ $1 != "GNU" -o $2 != "Make" ] ; then continue fi break done fi if [ $# -lt 3 ] ; then printf "missing\n" exit 1 fi make_version=$3 save_ifs=$IFS ; IFS=. ; set -- $make_version ; IFS=$save_ifs if [ $1 -lt 3 -o \( $1 -eq 3 -a $2 -lt 81 \) ] ; then printf "too old (%s found, 3.81 or newer needed)\n" $make_version exit 1 else printf "yes (%s found)\n" $make_version fi # # Verify sanity of --prefix and other directories. # printf "Checking installation paths:\n" for name in bindir datadir mandir; do eval path="\$install_prefix\$prefix/\${$name}" printf "\$(install_prefix)\$(prefix)/\$%s=%s ... " $name "$path" test_access=y case "$path" in " "* | *" "* | *" " ) printf "incorrect (contains spaces)\n" exit 1 ;; -* ) printf "incorrect (resembles a command option)\n" exit 1 ;; *'$('* ) # It's a make expression; can't test it test_access= ;; /* ) ;; * ) printf "incorrect (must be absolute path)\n" exit 1 ;; esac if [ $test_access ] ; then test_prefix=$path while true ; do if [ -e $test_prefix ] ; then if [ ! -d $test_prefix ] ; then printf "incorrect ('%s' is not a directory)!\n" $test_prefix exit 1 fi if [ ! -w $test_prefix ] ; then printf "okay\n (but no write access to '%s'\n" $test_prefix printf " so '$make install' will require root privileges)\n" else printf "okay\n" fi break fi test_prefix=$(dirname $test_prefix) done else printf "okay\n (make variable derivation)\n" fi done # # First, we have to figure out whether we are configured straight # in the source directory, or whether we are in a separate build directory. # In the latter case, we set up a symbolic link to the Makefile. # source_dir="$(dirname $0)" # # If building in a separate directory, establish top_srcdir as # an absolute path to the source directory, with a trailing slash. # Otherwise top_srcdir is blank. # if [ "$source_dir" = "." ] ; then top_srcdir="" else top_srcdir="$(cd "$source_dir" ; pwd -P)"/ fi printf "Checking source directory \"%s\" ... " "$top_srcdir" lndir() { fromdir=$1 todir=${2%/} abs=${fromdir%${fromdir#/}} find "$fromdir" \( -type f -o -type d \) | while read frompath ; do topath=${frompath#$fromdir} topath=${topath#/} [ -n "$topath" ] || topath="." if [ -f "$frompath" ] ; then if [ $abs ] ; then ln -sf "$frompath" "$todir/$topath" else old_IFS=$IFS IFS=/ set -- $todir/$topath IFS=$old_IFS dots="" while [ $# -gt 0 ] ; do [ $1 = "." ] || dots="$dots../" shift done rm -f "$todir/$topath" ln -sf "$dots$frompath" "$todir/$topath" fi else mkdir -p "$todir/$topath" fi done } inode() { set -- $(ls -idL "$1") printf "%s\n" "$1" } case "$top_srcdir" in " "* | *" "* | *" " ) printf "bad (contains spaces)\n" exit 1 ;; * ) printf "okay\n" ;; esac if [ $(inode "$source_dir") != $(inode ".") ] ; then for x in Makefile ; do printf "Symlinking %s -> $source_dir/%s\n" $x $x ln -sf "$source_dir/$x" . done for x in stdlib tests; do printf "Tree symlinking %s -> $source_dir/%s\n" $x $x lndir $source_dir/$x $x done else printf "** Note: it's recommended to build in a separate directory\n" build_in_srcdir=y fi printf "Are we using a C++ compiler ... " case $ccname in *'++' | *'$(CXX)' ) cplusplus=y ;; esac case $cc in *'++' | '$(CXX)' ) cplusplus=y ;; esac if [ $cplusplus ] ; then printf "yes\n" set -- $diag_flags diag_flags='' for flag in "$@" ; do case $flag in *=declaration-after-statement | \ *=implicit-function-declaration | \ *=missing-prototypes | \ *=old-style-* | \ *=strict-prototypes ) continue ;; esac diag_flags="$diag_flags $flag" done diag_flags=${diag_flags# } lang_flags="-std=c++98 $lang_flags" else printf "no\n" if [ $maintainer ] ; then lang_flags="-ansi $lang_flags" else lang_flags="-std=c99 $lang_flags" fi fi gen_config_make() { cat > config.make < config.h /* * Header file automatically generated by $0. * Tweaking this file may seem like a good temporary workaround * to some problem but you probably should fix the script * to do the job. In any case, be aware that you will lose your * changes if you re-run $0. */ ! # # Perform a configure test. # Arguments are passed through to make # conftest() { rm -f ${exe-"conftest conftest.exe"} ${exe+"conftest$exe"} $make conftest ${@+"$@"} > conftest.err 2>&1 && [ -x conftest ] } # # Like conftest but make only .o # conftest_o() { rm -f conftest.o $make conftest.o ${@+"$@"} > conftest.err 2>&1 } # # Check for git because we use it out of the Makefile # But this is pointless if we have no git repo. # "have_git" means we have a repo, and git. # if [ -d $top_srcdir.git ] ; then printf "Checking whether we have git ... " if git --version > /dev/null 2> /dev/null ; then have_git=y printf "yes\n" else printf "missing\n" fi fi # # Check C compiler sanity # printf "Checking whether your C compiler can make a simple executable ... " cat > conftest.c < int main(void) { printf("Hello, world!\n"); return 0; } ! if ! conftest ; then printf "failed\n" printf "Checking whether the failure is due to a requirement to use C99 ... " if conftest EXTRA_FLAGS=-std=c99 ; then printf "yes\n" lang_flags="$(echo "$lang_flags" | sed -e 's/-ansi/-std=c99/')" else printf "no\n\n" printf "Errors from compilation: \n\n" cat conftest.err exit 1 fi else printf "okay\n" fi if ! [ $diag_flags_given ] ; then for opt in -Werror=vla -Werror=declaration-after-statement ; do printf "Checking for %s ... " $opt if conftest EXTRA_FLAGS="-Werror $opt" ; then printf "yes\n" diag_flags="$diag_flags $opt" else printf "no\n" fi done fi printf "Checking compiler version for various workarounds ... " output=$($make conftest.ccver) set -- $output if [ "$1" = "gcc" ] ; then gcc_version=$3 save_ifs=$IFS ; IFS=. ; set -- $gcc_version ; IFS=$save_ifs if [ $1 -lt 4 ] || [ $1 -eq 4 -a $2 -le 3 ] ; then broken128=y fi [ $1 -lt 5 ] && do_nopie= elif [ "$1" = "clang" -o "$2" = "clang" ] ; then do_nopie= fi printf "done\n" printf "Checking whether executables require an .exe suffix ... " if ls conftest.exe > /dev/null 2>&1 ; then echo "yes" exe=.exe else echo "no" fi rm -f conftest$exe printf "Checking for disabling source code quoting in compiler errors ... " cat > conftest.c < int main(void) { ! if ! conftest && grep -q -E '^ +\^' conftest.err ; then cat > conftest.c < int main(void) { return 0; } ! opt=-fno-diagnostics-show-caret if conftest EXTRA_FLAGS=$opt ; then printf "needed\n" diag_flags="$diag_flags $opt" else printf "unable\n" fi else printf "no need\n" fi # # Check for annoying clashes from non-conforming BSD-derived systems that don't # honor Unix/POSIX feature selection macros! # printf "Checking for name clashes caused by nonconforming toolchains ... " for ident in trunc floorf random longlong_t mergesort ; do cat > conftest.c < #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include struct txr_foo { int txr; } $ident; int $ident(void); int main(void) { return 0; } ! if ! conftest ; then printf "#define %s txr_%s\n" $ident $ident >> config.h have_unistd=y fi done printf "done\n" # # Check for idiotic behavior: extensions in C header files controlled # by __STRICT_ANSI__ rather than things like __POSIX_SOURCE. # printf "Checking for proper support for feature-test macros ... " cat > conftest.c < int main(void) { return fileno(stdin); } ! if conftest EXTRA_FLAGS=-Werror ; then printf "yes\n" else printf "no\n" lang_flags="$lang_flags -U__STRICT_ANSI__" printf "Regenerating config.make ... " gen_config_make printf "done\n" fi printf "Checking for undefined behavior sanitizer (\"ubsan\") being in effect ... " cat > conftest.c < int main(void) { return 0; } ! if conftest ; then if strings conftest | grep -q -i ubsan ; then printf "yes\n" printf "#define HAVE_UBSAN 1\n" >> config.h have_ubsan=y else printf "no\n" fi else printf "failed\n" fi # # Detect Apple environment. We need _DARWIN_C_SOURCE. # printf "Checking for Apple environment ... " if [ "$($make conftest.darwin)" = "yes" ] ; then printf "yes\n" darwin_target=y lang_flags="$lang_flags -D_DARWIN_C_SOURCE" printf "Regenerating config.make ... " gen_config_make printf "done\n" else printf "no\n" fi if ! [ $darwin_target ] ; then printf "Checking for Android environment ... " if [ "$($make conftest.android)" = "yes" ] ; then printf "yes\n" android_target=y lang_flags="$lang_flags --target=aarch64-unknown-linux-android26 -D_BSD_SOURCE" printf "Regenerating config.make ... " gen_config_make printf "done\n" else printf "no\n" fi fi # # Detect stupid FreeBSD problem: no defined way to reveal # traditional BSD functions if Unix compliance is selected with # _XOPEN_SOURCE. Heaven help these troglodytes. # printf "Detecting what symbol reveals BSD functions ... " cat > conftest.c < #include int main(int argc, char **argv) { int (*pdaemon)(int, int) = &daemon; } ! if conftest ; then printf "none needed\n" else for flag in _DEFAULT_SOURCE _BSD_SOURCE __BSD_VISIBLE _GNU_SOURCE _X_OOPS; do if [ $flag = _X_OOPS ] ; then printf "failed\n" break fi if conftest EXTRA_FLAGS=-D$flag ; then printf "%s\n" $flag lang_flags="$lang_flags -D$flag" gen_config_make break fi done fi if [ $do_nopie ] ; then printf "Checking how to disable PIE ... " nopie_flags= for flag in -nopie -no-pie ; do if conftest EXTRA_FLAGS=$flag && ! grep -q option conftest.err ; then nopie_flags=" $flag" break fi done for flag in -fnopie -fno-pie ; do if conftest EXTRA_FLAGS="$flag$nopie_flags" && ! grep -q option conftest.err ; then nopie_flags="$nopie_flags $flag" break fi done if [ -n "$nopie_flags" ]; then printf "%s\n" "$nopie_flags" opt_flags="$opt_flags$nopie_flags" else printf "n/a\n" fi fi # # Check for annoying warnings from ctype.h macros # printf "Checking for annoying warnings from macros ... " cat > conftest.c < int main(void) { char x = '3'; return isdigit(x); } ! if conftest EXTRA_FLAGS=-Werror ; then printf "absent\n" else printf "present\n" cat >> config.h < conftest.c <> config.h printf "#define LONGLONG_TYPE \"%s\"\n" "$longlong" >> config.h printf "typedef $longlong longlong_t;\n" >> config.h else printf "none\n" fi printf "Checking what C type we have for unsigned integers wider than \"long\" ... " ulonglong= for try_type in uint64 __uint64 "unsigned long long" ; do cat > conftest.c <> config.h printf "typedef $ulonglong ulonglong_t;\n" >> config.h else printf "none\n" fi printf "Checking what C type we have for integers wider than \"long long\" ... " superlong= if [ -z "$broken128" ] ; then for try_type in int128 int128_t __int128 __int128_t ; do cat > conftest.c < conftest.c <> config.h printf "typedef $superlong superlong_t;\n" >> config.h printf "typedef $superulong superulong_t;\n" >> config.h fi printf "Checking what C integer type can hold a pointer ... " if [ -z "$intptr" ] ; then cat > conftest.c < #include #include "config.h" #define D(N, Z) ((N) ? (N) + '0' : Z) #define UD(S) D((S) / 10, ' ') #define LD(S) D((S) % 10, '0') #define DEC(S) { UD(S), LD(S) } struct sizes { char h_BYTE[32], s_BYTE[2]; #if HAVE_SUPERLONG_T char h_SUPERLONG[32], s_SUPERLONG[2]; #endif #if HAVE_LONGLONG_T char h_LONGLONG[32], s_LONGLONG[2]; #endif char h_PTR[32], s_PTR[2]; char h_LONG[32], s_LONG[2]; char h_INT[32], s_INT[2]; char h_SHORT[32], s_SHORT[2]; char h_WCHAR[32], s_WCHAR[2]; char nl[2]; } foo = { "\nSIZEOF_BYTE=", DEC(CHAR_BIT), #if HAVE_SUPERLONG_T "\nSIZEOF_SUPERLONG_T=", DEC(sizeof (superlong_t)), #endif #if HAVE_LONGLONG_T "\nSIZEOF_LONGLONG_T=", DEC(sizeof (longlong_t)), #endif "\nSIZEOF_PTR=", DEC(sizeof (char *)), "\nSIZEOF_LONG=", DEC(sizeof (long)), "\nSIZEOF_INT=", DEC(sizeof (int)), "\nSIZEOF_SHORT=", DEC(sizeof (short)), "\nSIZEOF_WCHAR_T=", DEC(sizeof (wchar_t)), "\n" }; ! if ! conftest_o ; then printf "failed\n\n" printf "Errors from compilation: \n\n" cat conftest.err exit 1 fi eval $(tr '\0' ' ' < conftest.o | grep SIZEOF | sed -e 's/ *//') tr '\0' ' ' < conftest.o | grep SIZEOF | sed -e 's/= */ /' -e 's/^/#define /' >> config.h if [ $SIZEOF_PTR -eq 0 -o $SIZEOF_BYTE -eq 0 ] ; then printf "failed\n" exit 1 fi if [ $SIZEOF_PTR -eq $SIZEOF_SHORT ] ; then intptr="short" elif [ $SIZEOF_PTR -eq $SIZEOF_INT ] ; then intptr="int" elif [ $SIZEOF_PTR -eq $SIZEOF_LONG ] ; then intptr="long" elif [ $SIZEOF_PTR -eq $SIZEOF_LONGLONG_T ] ; then intptr="longlong_t" fi if [ -z "$intptr" ] ; then printf "failed\n" exit 1 fi fi printf '"%s"\n' "$intptr" printf "typedef $intptr int_ptr_t;\n" >> config.h printf "typedef unsigned $intptr uint_ptr_t;\n" >> config.h printf "#define INTPTR_TYPE \"%s\"\n" "$intptr" >> config.h intptr_max_expr="((((convert(int_ptr_t, 1) << $((SIZEOF_PTR * SIZEOF_BYTE - 2))) - 1) << 1) + 1)" printf "#define INT_PTR_MAX %s\n" "$intptr_max_expr" >> config.h printf "#define INT_PTR_MIN (-INT_PTR_MAX-1)\n" >> config.h printf "#define UINT_PTR_MAX (convert(uint_ptr_t, -1))\n" >> config.h double_intptr_max_expr="((((convert(double_intptr_t, 1) << $((2 * SIZEOF_PTR * SIZEOF_BYTE - 2))) - 1) << 1) + 1)" printf "#define SIZEOF_DOUBLE_INTPTR (2*SIZEOF_PTR)\n" >> config.h printf "#define DOUBLE_INTPTR_MAX %s\n" "$double_intptr_max_expr" >> config.h printf "#define DOUBLE_INTPTR_MIN (-DOUBLE_INTPTR_MAX-1)\n" >> config.h printf "#define DOUBLE_UINTPTR_MAX (convert(double_uintptr_t, -1))\n" >> config.h if [ -n "$longlong" ] && [ $SIZEOF_LONGLONG_T -eq $(( 2 * SIZEOF_PTR )) ] then printf "#define HAVE_DOUBLE_INTPTR_T 1\n" >> config.h printf "typedef longlong_t double_intptr_t;\n" >> config.h printf "typedef ulonglong_t double_uintptr_t;\n" >> config.h elif [ -n "$superlong" ] && [ $SIZEOF_SUPERLONG_T -eq $(( 2 * SIZEOF_PTR )) ] then printf "#define HAVE_DOUBLE_INTPTR_T 1\n" >> config.h printf "typedef superlong_t double_intptr_t;\n" >> config.h printf "typedef superulong_t double_uintptr_t;\n" >> config.h fi if ! [ $nan_boxing_given ] ; then printf "Checking whether to use NaN boxing ... " if [ $SIZEOF_PTR -eq 8 ] ; then nan_boxing=y printf "yes\n" else printf "no\n" fi fi if [ -n "$nan_boxing" ] ; then if [ $SIZEOF_PTR -ne 8 ] ; then printf "Warning: NaN boxing disabled: it requires 64 bit pointers\n" else printf "#define CONFIG_NAN_BOXING 1\n" >> config.h if [ -n "$android_target" ] ; then printf "#define CONFIG_NAN_BOXING_STRIP_TAG 1\n" >> config.h fi fi fi printf "Checking for intmax_t ... " cat > conftest.c < int main(void) { intmax_t i = 0; untmax_t u = 0; return (uintmax_t) i + u; } ! if conftest ; then printf "yes\n" printf "#define HAVE_INTMAX_T 1\n" >> config.h else printf "no\n" fi # # Endianness. # printf "Checking target machine endianness ... " cat > conftest.c <> config.h elif strings conftest.o | grep -q 'LISPUNIXCOREDWIM' ; then printf "big\n"; printf "#define HAVE_LITTLE_ENDIAN 0\n" >> config.h else printf "failed\n" exit 1 fi fi # # Inline functions # printf "Checking how to declare inline functions ... " if [ -z "$inline" ] ; then for inline in \ "${cplusplus:+inline}" "static inline" \ "static __inline__" "static" do cat > conftest1.c < conftest2.c < conftest.err 2>&1 || ! [ -x conftest2 ] ; then continue fi break done fi printf '"%s"\n' "$inline" printf "#define INLINE $inline\n" >> config.h # # DBL_DECIMAL_DIG # printf "Checking for DBL_DECIMAL_DIG ... " for try_sym in DBL_DECIMAL_DIG __DBL_DECIMAL_DIG__ ; do cat > conftest.c < #ifndef $try_sym #error $try_sym not defined #else int main(void) { return 0; } #endif ! if conftest ; then printf "yes (%s)\n" $try_sym printf "#define FLO_MAX_DIG $try_sym\n" >> config.h have_dbl_decimal_dig=y break fi done if ! [ $have_dbl_decimal_dig ] ; then printf "no\n" printf "#define FLO_MAX_DIG (DBL_DIG + 2)\n" >> config.h fi # # Rounding mode control. # printf "Checking for fesetround and fegetround ... " cat > conftest.c < int main(void) { int mode = fegetround(); fesetround(FE_TONEAREST); fesetround(FE_DOWNWARD); fesetround(FE_UPWARD); fesetround(FE_TOWARDZERO); return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_ROUNDING_CTL_H 1\n" >> config.h else printf "no\n" fi printf "Checking for fpclassify ... " cat > conftest.c < int main(void) { double x = 3.14; switch (fpclassify(x)) { case FP_ZERO: case FP_NORMAL: case FP_SUBNORMAL: case FP_INFINITE: case FP_NAN: default: break; } return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_FPCLASSIFY 1\n" >> config.h else printf "no\n" fi # # Valgrind # if [ -n "$valgrind" ] ; then printf "Checking valgrind API availability ... " cat > conftest.c < #ifdef VALGRIND_DO_CLIENT_REQUEST int main(void) { return 0; } #else syntax error #endif ! if ! conftest ; then printf "failed\n\n" printf "Errors from compilation: \n\n" cat conftest.err exit 1 fi printf "okay\n" printf "#define HAVE_VALGRIND 1\n" >> config.h fi # # Lex and Yacc tests # if [ $maintainer ] ; then printf "Checking for lex ... " if [ -z "$lex_given" -a -z "$lexname_given" ] ; then for lexname in '$(LEX)' "lex" "flex" "" ; do rm -f lex.yy.c if $make lexname="$lexname" lex.yy.c > /dev/null 2>&1; then break; fi done if [ -z "$lexname" ] ; then printf "not found\n" exit 1 fi else rm -f lex.yy.c if ! $make lexname="$lexname" lex.yy.c > /dev/null 2>&1; then printf "error\n\n" printf 'values --lexname="%s" --lex="%s" are not working\n\n' "$lexname" "$lex" printf 'A GNU Flex compatible lex is required\n\n' exit 1 fi fi rm -f lex.yy.c printf '"%s"\n' "$lexname" printf "Checking for yacc program ... " if [ -z "$yacc_given" -a -z "$yaccname_given" ] ; then for yaccname in '$(YACC)' "yacc" "byacc" "bison -y" "" ; do yaccpath=$($make yaccname="$yaccname" conftest.yacc) if command -v $yaccpath > /dev/null ; then break; fi done if [ -z "$yaccname" ] ; then printf "not found\n" exit 1 fi printf '"%s" (path "%s")\n' "$yaccname" "$yaccpath" else yaccpath=$($make conftest.yacc) case $yaccpath in *bison ) printf "error\n\n" printf "GNU Bison needs -y to behave like yacc\n\n" printf "This needs to be specified in the --yaccname or --yacc option\n\n" exit 1 ;; * ) if ! command -v $yaccpath > /dev/null ; then printf "not found\n\n" exit 1 fi printf "given\n" ;; esac fi printf "Checking if yacc program is GNU Bison ... " gen_config_make bison_version="$($make conftest.yacc-version | grep -E '[Bb]ison')" || true if [ -n "$bison_version" ] ; then set -- $bison_version printf "yes (%s)\n" "$4" save_ifs=$IFS ; IFS=. ; set -- $4 ; IFS=$save_ifs if [ "$1.$2" != "2.5" ] ; then echo "GNU Bison 2.5 is required" exit 1 fi else printf "no\n" fi fi # # Check for parallel build # if [ $maintainer ] && ! [ $parallelmake_given ] ; then parallelmake=y fi # # sys/wait.h # printf "Checking whether we have ... " cat > conftest.c < int main(void) { return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_SYS_WAIT 1\n" >> config.h else printf "no\n" fi # # sys/stat.h # printf "Checking whether we have ... " cat > conftest.c < struct stat s; int main(void) { return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_SYS_STAT 1\n" >> config.h have_sys_stat=y else printf "no\n" fi if [ "$have_sys_stat" ] ; then printf "Checking for sub-second resolution time in struct stat ... " cat > conftest.c < struct stat s; int main(void) { return s.st_mtim.tv_nsec != 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_STAT_NSEC 1\n" >> config.h else printf "no\n" fi fi # # utime, utimes, utimensat and futimens # printf "Checking for utime ... " cat > conftest.c < int main(void) { struct utimbuf utb; int res = utime("path", &utb); return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_UTIME 1\n" >> config.h else printf "no\n" fi printf "Checking for utimes ... " cat > conftest.c < int main(void) { struct timeval tv[2]; int res = utimes("path", tv); return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_UTIMES 1\n" >> config.h else printf "no\n" fi printf "Checking for futimes ... " cat > conftest.c < int main(void) { struct timeval tv[2]; int res = futimes(42, tv); return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_FUTIMES 1\n" >> config.h else printf "no\n" fi printf "Checking for lutimes ... " cat > conftest.c < int main(void) { struct timeval tv[2]; int res = lutimes("path", tv); return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_LUTIMES 1\n" >> config.h else printf "no\n" fi printf "Checking for utimensat and futimens ... " cat > conftest.c < #include int main(void) { struct timespec ts[2]; int resu = utimensat(AT_FDCWD, "path", ts, AT_SYMLINK_NOFOLLOW); int resf = futimens(0, ts); return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_FUTIMENS 1\n" >> config.h else printf "no\n" fi printf "#define HAVE_FILE_STAMP_CHANGE " >> config.h printf "(HAVE_UTIMES || HAVE_FUTIMES || HAVE_FUTIMENS)\n" >> config.h # # environ # printf "Checking whether we have environ ... " cat > conftest.c < int main(void) { extern char **environ; puts(environ[0]); return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_ENVIRON 1\n" >> config.h else printf "no\n" fi # # GetEnvironmentStrings # printf "Checking whether we have GetEnvironmentStrings ... " cat > conftest.c < int main(void) { WCHAR *ptr = GetEnvironmentStringsW(); return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_GETENVIRONMENTSTRINGS 1\n" >> config.h have_windows_h=y else printf "no\n" fi # # fork, pipe, exec, waitpid. # printf "Checking for POSIX fork/pipe/exec/waitpid ... " cat > conftest.c < #endif #include #include int main(int argc, char **argv) { int status, fd[2]; pid_t p = fork(); int res = pipe(fd); (void) execvp(argv[0], argv); (void) waitpid(p, &status, 0); (void) res; return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_FORK_STUFF 1\n" >> config.h have_unistd=y have_sys_types=y else printf "no\n" fi printf "Checking for POSIX getppid ... " cat > conftest.c < #include int main(int argc, char **argv) { pid_t p = getppid(); return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_GETPPID 1\n" >> config.h have_unistd=y have_sys_types=y else printf "no\n" fi # # errno stuff # printf "Checking for strerror_r ... " for type in int 'char *' ; do cat > conftest.c < int main(int argc, char **argv) { $type (*fp)(int, char *, size_t) = strerror_r; return 0; } ! if conftest EXTRA_FLAGS=-Werror=incompatible-pointer-types ; then if [ "$type" = int ] ; then printf "yes (POSIX)\n" printf "#define HAVE_STRERROR_POSIX 1\n" >> config.h else printf "yes (GNU)\n" printf "#define HAVE_STRERROR_GNU 1\n" >> config.h fi have_strerror_r=y break fi done [ $have_strerror_r ] || printf "no\n" # # fcntl # printf "Checking for POSIX fcntl ... " cat > conftest.c < int main(int argc, char **argv) { int err = fcntl(0, F_SETFD, FD_CLOEXEC); return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_FCNTL 1\n" >> config.h else printf "no\n" fi # # poll # printf "Checking for poll ... " cat > conftest.c < #include "config.h" int main(int argc, char **argv) { static struct pollfd fds[42]; nfds_t n = 42; int err = poll(fds, 42, 1000); return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_POLL 1\n" >> config.h else printf "no\n" fi # # Check for fields inside struct tm # printf "Detecting timezone fields in struct tm ... " for try_field in tm_gmtoff __tm_gmtoff ; do cat > conftest.c < int x = sizeof ((struct tm *) 0)->$try_field; ! if conftest_o ; then printf "#define HAVE_TM_GMTOFF 1\n" >> config.h printf "#define TM_GMTOFF %s\n" $try_field >> config.h break fi done for try_field in tm_zone __tm_zone ; do cat > conftest.c < int x = sizeof ((struct tm *) 0)->$try_field; ! if conftest_o ; then printf "#define HAVE_TM_ZONE 1\n" >> config.h printf "#define TM_ZONE %s\n" $try_field >> config.h break fi done printf "done\n" printf "Checking for timegm function ... " cat > conftest.c < int main(void) { time_t (*ptgm)(struct tm *) = &timegm; return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_TIMEGM 1\n" >> config.h else printf "no\n" fi printf "Checking for setenv and unsetenv functions ... " cat > conftest.c < int main(void) { setenv("TERM", "foo", 1); unsetenv("TERM"); return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_SETENV 1\n" >> config.h else printf "no\n" fi printf "Checking for tzset function ... " cat > conftest.c < int main(void) { tzset(); return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_TZSET 1\n" >> config.h else printf "no\n" fi printf "Checking for localtime_r and gmtime_r functions ... " cat > conftest.c < int main(int argc, char **argv) { struct tm stm; time_t t; localtime_r(&t, &stm); gmtime_r(&t, &stm); return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_GMTIME_R 1\n" >> config.h have_unistd=y else printf "no\n" fi printf "Checking for strptime function ... " cat > conftest.c < int main(int argc, char **argv) { struct tm stm = { 0 }; strptime("2016-08-20 00:00:00", "%Y-%m-%d %H:%M:%S", &stm); return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_STRPTIME 1\n" >> config.h else printf "no\n" fi printf "Checking for POSIX sleep function ... " cat > conftest.c < int main(int argc, char **argv) { sleep(42); return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_POSIX_SLEEP 1\n" >> config.h have_unistd=y else printf "no\n" fi printf "Checking for POSIX usleep function ... " cat > conftest.c < int main(int argc, char **argv) { usleep(42); return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_POSIX_USLEEP 1\n" >> config.h have_unistd=y else printf "no\n" fi printf "Checking for POSIX nanosleep function ... " cat > conftest.c < int main(int argc, char **argv) { struct timespec ts; nanosleep(&ts, &ts); return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_POSIX_NANOSLEEP 1\n" >> config.h have_unistd=y else printf "no\n" fi printf "Checking for BSD daemon function ... " cat > conftest.c < #include int main(int argc, char **argv) { int (*pdaemon)(int, int) = &daemon; } ! if conftest ; then printf "yes\n" printf "#define HAVE_DAEMON 1\n" >> config.h have_unistd=y else printf "no\n" fi printf "Checking for isatty function ... " cat > conftest.c < int main(void) { isatty(0); return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_ISATTY 1\n" >> config.h have_unistd=y else printf "no\n" fi printf "Checking for syslog ... " cat > conftest.c < int main(void) { openlog("foo", LOG_CONS, LOG_DAEMON); syslog(LOG_EMERG, "bar %d\n", 3); setlogmask(0); closelog(); return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_SYSLOG 1\n" >> config.h have_syslog=y else printf "no\n" fi printf "Checking for reasonably modern POSIX signal handling ... " cat > conftest.c < #include int main(void) { sigjmp_buf jb; static struct sigaction olda, newa; static sigset_t olds, news; sigaction(0, &newa, &olda); sigprocmask(SIG_BLOCK, &news, &olds); if (!sigsetjmp(jb, 1)) siglongjmp(jb, 1); return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_POSIX_SIGS 1\n" >> config.h have_posix_sigs=y else printf "no\n" fi printf "Checking for sigaltstack ... " cat > conftest.c < #include int main(void) { stack_t ss; ss.ss_sp = malloc(SIGSTKSZ); ss.ss_size = SIGSTKSZ; ss.ss_flags = 0; return sigaltstack(&ss, 0); } ! if conftest ; then printf "yes\n" printf "#define HAVE_SIGALTSTACK 1\n" >> config.h else printf "no\n" fi printf "Checking for strsignal ... " cat > conftest.c < #include int main(void) { const char *s = strsignal(SIGABRT); return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_STRSIGNAL 1\n" >> config.h else printf "no\n" fi printf "Checking for setitimer/getitimer ... " cat > conftest.c < int main(void) { struct itimerval itv, itv2; int err; err = getitimer(ITIMER_REAL, &itv); err = getitimer(ITIMER_VIRTUAL, &itv); err = setitimer(ITIMER_VIRTUAL, &itv, &itv2); return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_ITIMER 1\n" >> config.h have_sys_time=y else printf "no\n" fi printf "Checking for makedev ... " for try_header in sysmacros types ; do cat > conftest.c < int main(void) { int d = makedev(1, 2); int j = major(d); int n = minor(d); return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_MAKEDEV 1\n" >> config.h case $try_header in sysmacros ) printf "#define HAVE_SYS_SYSMACROS_H 1\n" >> config.h ;; types ) have_sys_types=y ;; esac have_makedev=y break fi done if [ -z "$have_makedev" ] ; then printf "no\n" fi printf "Checking for link, symlink and readlink ... " cat > conftest.c < int main(void) { int e1 = symlink("a", "b"); int e2 = link("c", "d"); char buf[256]; ssize_t foo = readlink("e", buf, sizeof buf); return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_SYMLINK 1\n" >> config.h have_unistd=y else printf "no\n" fi printf "Checking for linkat ... " cat > conftest.c < #include int main(void) { int e1 = linkat(AT_FDCWD, "foo", AT_FDCWD, "bar", AT_SYMLINK_FOLLOW); return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_LINKAT 1\n" >> config.h have_unistd=y else printf "no\n" fi printf "Checking for POSIX mkdir ... " cat > conftest.c < #if HAVE_WINDOWS_H #include #endif int main(void) { int e = mkdir("a", 0); return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_MKDIR 1\n" >> config.h else printf "no\n" fi printf "Checking for mknod ... " cat > conftest.c < #if HAVE_SYS_STAT #include #endif int main(void) { int e = mknod("a", 0, 0); return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_MKNOD 1\n" >> config.h have_unistd=y else printf "no\n" fi printf "Checking for mkfifo ... " cat > conftest.c < #endif int main(void) { int e = mkfifo("a", 0); return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_MKFIFO 1\n" >> config.h else printf "no\n" fi printf "Checking for chmod/fchmod ... " cat > conftest.c < int main(void) { int r0 = chmod("a", S_IWUSR); int r1 = fchmod(4, S_IWUSR); return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_CHMOD 1\n" >> config.h else printf "no\n" fi printf "Checking for chown/fchown/lchown ... " cat > conftest.c < int main(void) { int r0 = chown("a", 0, 0); int r1 = fchown(4, 0, 0); int r2 = lchown("a", 0, 0); return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_CHOWN 1\n" >> config.h else printf "no\n" fi printf "Checking for pipe ... " cat > conftest.c < int main(void) { int p[2]; int r = pipe(p); return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_PIPE 1\n" >> config.h else printf "no\n" fi printf "Checking for ftruncate ... " cat > conftest.c < int main(void) { int e = ftruncate(0, 42); return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_FTRUNCATE 1\n" >> config.h else printf "no\n" fi printf "Checking for _wspawnvp ... " cat > conftest.c < #include int main(int argc, char **argv) { wchar_t *wargv[] = { L"foo", L"bar", 0 }; int r = _wspawnvp(_P_WAIT, L"foo", wargv); return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_WSPAWN 1\n" >> config.h else printf "no\n" fi printf "Checking for spawnvp ... " cat > conftest.c < int main(int argc, char **argv) { int r = spawnvp(_P_WAIT, "foo", argv); return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_SPAWN 1\n" >> config.h else printf "no\n" fi printf "Checking for chsize ... " cat > conftest.c < int main(void) { int e = chsize(0, 42); return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_CHSIZE 1\n" >> config.h else printf "no\n" fi printf "Checking for fchdir ... " cat > conftest.c < int main(void) { int e = fchdir(1); return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_FCHDIR 1\n" >> config.h else printf "no\n" fi printf "Checking for log2 ... " cat > conftest.c < int main(void) { double x = log2(42.0); return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_LOG2 1\n" >> config.h else printf "no\n" fi printf "Checking for round ... " cat > conftest.c < int main(void) { double x = round(0.5); return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_ROUND 1\n" >> config.h else printf "no\n" fi printf "Checking for hyperbolic functions (sinh, ...) ... " cat > conftest.c < int main(void) { double a = cosh(0.5); double b = sinh(0.5); double c = tanh(0.5); double d = acosh(0.5); double e = asinh(0.5); double f = atanh(0.5); return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_HYPERBOLICS 1\n" >> config.h else printf "no\n" fi for fun in cbrt erf erfc exp10 exp2 expm1 \ gamma j0 j1 lgamma log1p logb \ nearbyint pow10 rint significand tgamma y0 y1 do printf "Checking for %s function ... " $fun cat > conftest.c < int main(void) { double a = $fun(0.5); return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_%s 1\n" $(echo $fun | tr '[a-z]' '[A-Z]') >> config.h else printf "no\n" fi done for fun in copysign drem fdim fmax fmin \ frexp hypot jn ldexp modf \ nextafter nexttoward remainder scalb scalbln yn do printf "Checking for %s function ... " $fun cat > conftest.c < int main(void) { double a = $fun(0.5, 0.5); return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_%s 1\n" $(echo $fun | tr '[a-z]' '[A-Z]') >> config.h else printf "no\n" fi done printf "Checking for glob ... " cat > conftest.c < static int errfunc(const char *path, int err) { return 0; } int main(void) { glob_t gl; int result = glob("*", GLOB_ERR, errfunc, &gl); globfree(&gl); return result; } ! if conftest ; then printf "yes\n" printf "#define HAVE_GLOB 1\n" >> config.h have_glob=y else printf "no\n" fi printf "Checking for nftw ... " cat > conftest.c < #include static int callback(const char *fpath, const struct stat *sb, int tflag, struct FTW *ftwbuf) { switch (tflag) { case FTW_D: case FTW_DP: case FTW_NS: case FTW_SLN: break; } return 0; } int main(int argc, char *argv[]) { int flags = FTW_DEPTH | FTW_PHYS; int res = nftw(argv[1], callback, 20, flags); return (res == -1) ? EXIT_FAILURE : 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_FTW 1\n" >> config.h have_ftw=y else printf "no\n" fi printf "Checking for fnmatch ... " cat > conftest.c < int main(int argc, char *argv[]) { int res = fnmatch("*.txr", "foo.txr", FNM_PATHNAME); return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_FNMATCH 1\n" >> config.h have_ftw=y else printf "no\n" fi printf "Checking for windres ... " if output=$(windres -V 2> /dev/null) ; then printf "yes\n" have_windres=y else printf "no\n" fi printf "Checking for POSIX geteuid function family ... " cat > conftest.c < #include int main(int argc, char **argv) { uid_t u = getuid(); uid_t e = geteuid(); gid_t g = getgid(); gid_t h = getegid(); setuid(u); seteuid(e); setgid(g); setegid(h); getgroups(0, NULL); return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_GETEUID 1\n" >> config.h have_unistd=y have_sys_types=y else printf "no\n" fi printf "Checking for {set,get}res{uid,gid} ... " cat > conftest.c < #include int main(int argc, char **argv) { uid_t ur, ue, us; gid_t gr, ge, gs; int gur = getresuid(&ur, &ue, &us); int ggr = getresgid(&gr, &ge, &gs); int sur = setresuid(0, 0, 0); int sgr = setresgid(0, 0, 0); return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_SETRESUID 1\n" >> config.h have_unistd=y have_sys_types=y else printf "no\n" fi printf "Checking for setgroups ... " cat > conftest.c < #include #include int main(int argc, char **argv) { int res = setgroups(0, 0); return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_SETGROUPS 1\n" >> config.h have_unistd=y elif conftest EXTRA_FLAGS=-D__EXTENSIONS__=1 ; then printf "yes\n" printf "#define HAVE_SETGROUPS 1\n" >> config.h lang_flags="$lang_flags -D__EXTENSIONS__=1" # Solaris buggery gen_config_make have_unistd=y have_sys_types=y solaris_target=y else printf "no\n" fi printf "Checking for old school getpwent, getpwuid and getpwnam ... " cat > conftest.c < #include int main(void) { struct passwd *p = getpwent(); struct passwd *q = getpwnam("root"); struct passwd *r = getpwuid(0); setpwent(); endpwent(); return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_PWUID 1\n" >> config.h have_pwuid=y have_sys_types=y else printf "no\n" fi if [ "$have_pwuid" ]; then printf "Checking for getpwent_r, getpwuid_r, and getpwnam_r ... " cat > conftest.c < #include int main(void) { struct passwd pw; struct passwd *p; char buf[1024]; int r0 = getpwent_r(&pw, buf, sizeof buf, &p); int r1 = getpwuid_r(0, &pw, buf, sizeof buf, &p); int r2 = getpwnam_r("root", &pw, buf, sizeof buf, &p); return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_PWUID_R 1\n" >> config.h else printf "no\n" fi fi printf "Checking for old school getgrent, getgrgid and getgrnam ... " cat > conftest.c < #include int main(void) { struct group *g = getgrent(); struct group *h = getgrnam("root"); struct group *i = getgrgid(0); setgrent(); endgrent(); return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_GRGID 1\n" >> config.h have_grgid=y else printf "no\n" fi if [ "$have_grgid" ]; then printf "Checking for getgrgid_r and getgrnam_r ... " cat > conftest.c < #include int main(void) { struct group gr; struct group *g; char buf[1024]; int r1 = getgrgid_r(0, &gr, buf, sizeof buf, &g); int r2 = getgrnam_r("root", &gr, buf, sizeof buf, &g); return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_GRGID_R 1\n" >> config.h else printf "no\n" fi fi printf "Checking for crypt ... " cat > conftest.c < int main(void) { char *c = crypt("foo", "bar"); return 0; } ! for try_lcrypt in "" "-lcrypt" "no" ; do if [ "$try_lcrypt" = "no" ] ; then printf "no\n" break fi if conftest EXTRA_LDLIBS=$try_lcrypt; then printf "yes\n" printf "#define HAVE_CRYPT 1\n" >> config.h if [ -n "$try_lcrypt" ] ; then conf_ldlibs="${conf_ldlibs:+"$conf_ldlibs "}-lcrypt" fi break; fi done printf "Checking for crypt_r ... " cat > conftest.c < int main(void) { static struct crypt_data cd; char *c = crypt_r("foo", "bar", &cd); return 0; } ! for try_lcrypt in "" "-lcrypt" "no" ; do if [ "$try_lcrypt" = "no" ] ; then printf "no\n" break fi if conftest EXTRA_LDLIBS=$try_lcrypt; then printf "yes\n" printf "#define HAVE_CRYPT_R 1\n" >> config.h if [ -n "$try_lcrypt" ] ; then conf_ldlibs="${conf_ldlibs:+"$conf_ldlibs "}-lcrypt" fi break; fi done printf "Checking for alloca ... " for try_header in stdlib alloca malloc ; do cat > conftest.c < int main(int argc, char **argv) { void *bytes = alloca(42); return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_ALLOCA_%s 1\n" $try_header >> config.h have_alloca=y break; fi done if [ -z "$have_alloca" ] ; then printf "no\n" printf "TXR requires the alloca function.\n" exit 1 fi printf "Checking for malloc-with-alignment function ... " while true ; do cat > conftest.c < int main(void) { void *bytes = memalign(16, 42); return 0; } ! if conftest ; then printf "memalign\n" printf "#define HAVE_MEMALIGN 1\n" >> config.h break; fi cat > conftest.c < int main(void) { void *bytes = memalign(16, 42); return 0; } ! if conftest ; then printf "memalign\n" printf "#define HAVE_MEMALIGN 1\n" >> config.h printf "#define HAVE_MALLOC_H 1\n" >> config.h break; fi cat > conftest.c < int main(void) { void *bytes; int res = posix_memalign(&bytes, 16, 42); return 0; } ! if conftest ; then printf "posix_memalign\n" printf "#define HAVE_POSIX_MEMALIGN 1\n" >> config.h break; fi printf "none\n" break done printf "Checking for malloc_usable_size ... " for header in stdlib malloc malloc_np ; do cat > conftest.c < int main(int argc, char **argv) { void *p = malloc(42); size_t s = malloc_usable_size(p); return 0; } ! if conftest ; then printf "yes (<%s.h>)\n" $header printf "#define HAVE_MALLOC_USABLE_SIZE 1\n" >> config.h if [ $header != stdlib ] ; then header=$(printf "%s" $header | tr '[a-z]' '[A-Z]') printf "#define HAVE_%s_H 1\n" $header >> config.h fi have_malloc_usable_size=y break fi done [ "$have_malloc_usable_size" ] || printf "no\n" printf "Checking for termios ... " cat > conftest.c < int main(int argc, char **argv) { struct termios t; return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_TERMIOS 1\n" >> config.h have_termios=y else printf "no\n" full_repl= fi printf "Checking for struct winsize ... " for termios_define in NOTHING __EXTENSIONS__ ; do cat > conftest.c < #include int main(int argc, char **argv) { struct winsize ws; return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_WINSIZE 1\n" >> config.h have_winsize=y if [ "$termios_define" = __EXTENSIONS__ ] ; then solaris_target=y fi break; fi done if [ -z "$have_winsize" ] ; then printf "no\n" fi printf "Checking for mkstemp ... " cat > conftest.c < int main(int argc, char **argv) { char templ[] = "abcXXXXXX"; int fd = mkstemp(templ); return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_MKSTEMP 1\n" >> config.h else printf "no\n" fi printf "Checking for mkdtemp ... " cat > conftest.c < int main(int argc, char **argv) { char templ[] = "abcXXXXXX"; char *s = mkdtemp(templ); return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_MKDTEMP 1\n" >> config.h else printf "no\n" fi printf "Checking for mkstemps ... " cat > conftest.c < int main(int argc, char **argv) { char templ[] = "abcXXXXXX.xyz"; int fd = mkstemps(templ, 4); return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_MKSTEMPS 1\n" >> config.h else printf "no\n" fi # # Low stack size on Windows fails the man or boy test case. # printf "Do we need to set stack size ... " if uname -a | grep -q -E 'MINGW|CYGWIN' ; then conf_ldflags="-Wl,--stack,16777216${conf_ldflags:+" $conf_ldflags"}" printf "yes\n" else printf "no\n" fi # # Do we have fseeko and ftello? # printf "Checking for fseeko and ftello ... " cat > conftest.c < #include int main(int argc, char **argv) { int res = fseeko(stdin, 0, SEEK_CUR); off_t pos = ftello(stdin); return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_FSEEKO 1\n" >> config.h have_sys_types=y elif conftest EXTRA_FLAGS=-D_LARGEFILE_SOURCE ; then printf "yes\n" printf "#define HAVE_FSEEKO 1\n" >> config.h lang_flags="$lang_flags -D_LARGEFILE_SOURCE" have_sys_types=y else printf "no\n" fi printf "Checking how to enable 64 bit off_t and time_t ..." file_offset_only_define=none time_bits_only_define=none file_offset_define=none time_bits_define=none # We have a nested loop over pairs of options for off_t and time_t # because in Glibc, they are not independent. _TIME_BITS=64 cannot # be enabled if _FILE_OFFSET_BITS=64 isn't. for try_f in NOTHING _LARGE_FILES=1 _FILE_OFFSET_BITS=64; do for try_t in NOTHING _TIME_BITS=64; do cat > conftest.c < #include #include #define D(N, Z) ((N) ? (N) + '0' : Z) #define UD(S) D((S) / 10, ' ') #define LD(S) D((S) % 10, '0') #define DEC(S) { UD(S), LD(S) } struct sizes { char h_BYTE[32], s_BYTE[2]; char h_OFF_T[32], s_OFF_T[2]; char h_TIME_T[32], s_TIME_T[2]; char nl[2]; } foo = { "\nSIZEOF_BYTE=", DEC(CHAR_BIT), "\nSIZEOF_OFF_T=", DEC(sizeof (off_t)), "\nSIZEOF_TIME_T=", DEC(sizeof (time_t)), "\n" }; ! if ! conftest_o EXTRA_FLAGS="-D$try_f -D$try_t" ; then continue fi eval $(tr '\0' ' ' < conftest.o | grep SIZEOF | sed -e 's/ *//') if [ $SIZEOF_OFF_T -eq 0 -o $SIZEOF_BYTE -eq 0 ] ; then printf " failed\n" exit 1 fi # Regardless of what happens with time_t, if we detect the # enabling of 64 bit off_t, we record then in the # file_offset_only_define variable, and keep going. if [ "$file_offset_only_define" = none ] ; then if [ $(( SIZEOF_BYTE * SIZEOF_OFF_T )) -eq 64 ] ; then if [ $try_f = NOTHING ] ; then file_offset_only_define= else file_offset_only_define=$try_f fi fi fi # Regardless of what happens with off_t, if we detect the # enabling of 64 bit time_t, we record then in the # time_bits_only_define variable, and keep going. if [ "$time_bits_only_define" = none ] ; then if [ $(( SIZEOF_BYTE * SIZEOF_TIME_T )) -eq 64 ] ; then if [ $try_t = NOTHING ] ; then time_bits_only_define= else time_bits_only_define=$try_t fi fi fi # If we get a combination of options (or lack thereof) that results in # both 64 bit off_t and time_t, then we record those and are done. if [ $(( SIZEOF_BYTE * SIZEOF_OFF_T )) -eq 64 ] && \ [ $(( SIZEOF_BYTE * SIZEOF_TIME_T )) -eq 64 ] then if [ $try_f = NOTHING ] ; then file_offset_define= else file_offset_define=$try_f fi if [ $try_t = NOTHING ] ; then time_bits_define= else time_bits_define=$try_t fi break fi done done # If 64 bit time_t was not detected, here we check whether we did # detect 64 bit off_t in above loop; and copy that auxiliary variable. if [ "$time_bits_define" = none -a -n "$file_offset_only_define" ] ; then file_offset_define=$file_offset_only_define fi # Vice versa, if 64 bit off_t was not detected, here we check whether we did # detect 64 bit time_t in above loop; and copy that auxiliary variable. if [ "$file_offset_define" = none -a -n "$time_bits_only_define" ] ; then time_bits_define=$time_bits_only_define fi case "$time_bits_define" in none ) if [ "$big_time" ] ; then printf "\n$0: --big-time specified, yet no way to enable 64 bit time_t found\n" exit 1 fi ;; "" ) if [ $big_time_given ] && [ -z "$big_time" ] ; then printf "\n$0: --no-big-time specified, yet time_t is 64 bits in this system\n" exit 1 fi ;; * ) if [ -n "$big_time_given" ] ; then printf "\n$0: this system has a 32 bit time_t that can be overriden to 64\n" printf "$0: specify --big-time to do this, or --no-big-time not to do it\n" exit 1 else if [ -z "$big_time" ]; then printf " (%s disabled by --no-big-time)" "$time_bits_define" time_bits_define= fi fi ;; esac if [ "$file_offset_define" = none ] ; then printf " (no 64 bit off_t)" elif [ -n "$file_offset_define" ] ; then printf -- " -D%s" "$file_offset_define" printf "#define CONFIG_LARGE_FILE_OFFSET 1\n" >> config.h lang_flags="$lang_flags -D$file_offset_define" fi if [ "$time_bits_define" = none ] ; then printf " (no 64 bit time_t)" elif [ -n "$time_bits_define" ] ; then printf -- " -D%s" "$time_bits_define" lang_flags="$lang_flags -D$time_bits_define" fi printf "\n" printf "Checking for socket API ... " cat > conftest.c < #include #include #include #include int main(int argc, char **argv) { static struct sockaddr_in in_addr; static struct sockaddr_un un_addr; static char buf[256]; socklen_t len; int s = socket(AF_INET, SOCK_STREAM, 0); int e0 = bind(s, (struct sockaddr *) &in_addr, sizeof in_addr); int e1 = listen(s, 42); int e3 = connect(s, (struct sockaddr *) &un_addr, sizeof un_addr); int e4 = send(s, buf, sizeof buf, 0); int e5 = sendto(s, buf, sizeof buf, 0, (struct sockaddr *) &un_addr, sizeof un_addr); int e6 = recv(s, buf, sizeof buf, 0); int e7 = (len = sizeof in_addr, recvfrom(s, buf, sizeof buf, 0, (struct sockaddr *) &in_addr, &len)); int e8 = shutdown(s, 0); in_addr_t ia = inet_addr("10.0.0.1"); return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_SOCKETS 1\n" >> config.h have_sockets=y have_sys_types=y elif conftest EXTRA_LDLIBS="-lsocket -lnsl" ; then printf "yes\n" printf "#define HAVE_SOCKETS 1\n" >> config.h have_sockets=y have_sys_types=y conf_ldlibs="${conf_ldlibs:+"$conf_ldlibs "}-lsocket -lnsl" printf "Need libs for sockets: regenerating config.make ... " gen_config_make printf "done\n" else printf "no\n" fi if [ $have_sockets ] ; then printf "Checking for select ... " cat > conftest.c < #include int main(int argc, char **argv) { fd_set rfds; int res; FD_ZERO(&rfds); FD_SET(0, &rfds); res = res = select(1, &rfds, 0, 0, 0); return 0; } ! if conftest; then printf "yes\n" printf "#define HAVE_SELECT 1\n" >> config.h have_sys_time=y else printf "no\n" fi fi printf "Checking for getaddrinfo ... " cat > conftest.c < #include #include int main(void) { struct addrinfo hints; struct addrinfo *ptr; int res = getaddrinfo("node", "serv", &hints, &ptr); freeaddrinfo(ptr); puts(gai_strerror(res)); return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_GETADDRINFO 1\n" >> config.h else printf "no\n" fi printf "Checking for uname ... " cat > conftest.c < #include int main(void) { struct utsname utn; if (uname(&utn) == 0) printf("%s:%s:%s:%s:%s\n", utn.sysname, utn.nodename, utn.release, utn.version, utn.machine); return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_UNAME 1\n" >> config.h else printf "no\n" fi printf "Checking for domainname in struct utsname ... " cat > conftest.c < #include int main(void) { struct utsname utn; if (uname(&utn) == 0) printf("%s\n", utn.domainname); return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_UTSNAME_DOMAINNAME 1\n" >> config.h else printf "no\n" fi printf "Checking for dlopen ... " cat > conftest.c < int main(void) { void *lib = dlopen("foo.so", 0); void *sym = dlsym(lib, "bar"); #if TEST_DLVSYM void *vsym = dlvsym(lib, "bar", "1"); #endif dlclose(lib); return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_DLOPEN 1\n" >> config.h elif conftest EXTRA_LDLIBS=-ldl ; then printf "yes\n" printf "#define HAVE_DLOPEN 1\n" >> config.h conf_ldlibs="${conf_ldlibs:+"$conf_ldlibs "}-ldl" else printf "no\n" fi printf "Checking for dlvsym ... " if conftest CONF_LDLIBS="$conf_ldlibs" EXTRA_FLAGS=-DTEST_DLVSYM=1 ; then printf "yes\n" printf "#define HAVE_DLVSYM 1\n" >> config.h else printf "no\n" fi printf "Checking for pkg-config ... " if pkg-config --version > /dev/null 2>&1 ; then printf "present\n" have_pkgconfig=y else printf "absent\n" fi printf "Checking for libffi ... " cat > conftest.c < #include int main(void) { ffi_cif cif; ffi_type *args[1]; void *values[1]; char *s; args[0] = &ffi_type_pointer; values[0] = &s; return ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, &ffi_type_sint, args) != FFI_OK; } ! if conftest ; then printf "yes\n" printf "#define HAVE_LIBFFI 1\n" >> config.h elif conftest EXTRA_LDLIBS=-lffi ; then printf "yes\n" printf "#define HAVE_LIBFFI 1\n" >> config.h conf_ldlibs="${conf_ldlibs:+"$conf_ldlibs "}-lffi" elif [ -n "$have_pkgconfig" ] && pkg-config --exists libffi ; then libffi_cflags=$(pkg-config --cflags libffi) libffi_ldlibs=$(pkg-config --libs-only-l libffi) libffi_ldflags=$(pkg-config --libs-only-L libffi) if conftest EXTRA_FLAGS="$libffi_cflags" EXTRA_LDFLAGS="$libffi_ldflags" \ EXTRA_LDLIBS="$libffi_ldlibs"; then printf "yes\n" printf "#define HAVE_LIBFFI 1\n" >> config.h conf_ldlibs="${conf_ldlibs:+"$conf_ldlibs "}$libffi_ldlibs" conf_ldflags="${conf_ldflags:+"$conf_ldflags "}$libffi_ldflags" else printf "no\n" libffi_cflags= fi else printf "no\n" fi printf "Checking for clockid_t ... " cat > conftest.c < int main(void) { clockid_t cid = 0; return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_CLOCKID_T 1\n" >> config.h have_sys_types=y else printf "no\n" fi printf "Checking for clock_gettime ... " cat > conftest.c < int main(void) { struct timespec ts; (void) clock_gettime(CLOCK_REALTIME, &ts); return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_CLOCK_GETTIME 1\n" >> config.h have_sys_types=y else printf "no\n" fi printf "Checking for loff_t ... " cat > conftest.c < int main(void) { loff_t lo = 0; return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_LOFF_T 1\n" >> config.h have_sys_types=y else printf "no\n" fi printf "Checking for realpath ... " cat > conftest.c < int main(void) { char *rp = realpath("/var/lib", 0); return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_REALPATH 1\n" >> config.h else printf "no\n" fi printf "Checking for getexecname ... " cat > conftest.c < int main(void) { const char *rp = getexecname(); return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_GETEXECNAME 1\n" >> config.h else printf "no\n" fi printf "Checking for getrlimit ... " cat > conftest.c < int main(void) { struct rlimit rl; int res = getrlimit(RLIMIT_STACK, &rl); return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_RLIMIT 1\n" >> config.h else printf "no\n" fi if [ $solaris_target ] ; then cat >> config.h < #ifdef __sun__ #ifdef __cplusplus extern "C" #endif int madvise(void *addr, size_t len, int behav); #endif ! fi printf "Checking for mmap ... " cat > conftest.c < #include #include #include "config.h" int main(void) { size_t pgsz = sysconf(_SC_PAGE_SIZE); void *addr = mmap(0, pgsz, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_SHARED, -1, 0); if (addr == MAP_FAILED) return EXIT_FAILURE; mprotect(addr, pgsz, PROT_WRITE); madvise(addr, pgsz, MADV_SEQUENTIAL); msync(addr, pgsz, MS_SYNC); munmap(addr, pgsz); return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_MMAP 1\n" >> config.h else printf "no\n" fi printf "Checking for zlib ... " cat > conftest.c < int main(void) { gzFile gf = gzopen("foo.gz", "r"); gzclose(gf); return 0; } ! if conftest ; then printf "yes\n" printf "#define HAVE_ZLIB 1\n" >> config.h have_zlib=y elif conftest EXTRA_LDLIBS="-lz" ; then printf "yes\n" printf "#define HAVE_ZLIB 1\n" >> config.h conf_ldlibs="${conf_ldlibs:+"$conf_ldlibs "}-lz" have_zlib=y else printf "no\n" fi # # Dependent variables # if [ -n "$have_unistd" ] ; then printf "#define HAVE_UNISTD_H 1\n" >> config.h fi if [ -n "$have_sys_types" ] ; then printf "#define HAVE_SYS_TYPES_H 1\n" >> config.h fi if [ -n "$have_sys_time" ] ; then printf "#define HAVE_SYS_TIME 1\n" >> config.h fi if [ -n "$have_windows_h" ] ; then printf "#define HAVE_WINDOWS_H 1\n" >> config.h fi # # Extra debugging. # if [ -n "$extra_debugging" ] ; then printf "Configuring extra debugging, as requested ...\n" printf "#define CONFIG_EXTRA_DEBUGGING 1\n" >> config.h fi # # Clean up # $make conftest.clean # # Some final blurbs into config.h # [ -n "$debug_support" ] && printf "#define CONFIG_DEBUG_SUPPORT 1\n" >> config.h [ -n "$gen_gc" ] && printf "#define CONFIG_GEN_GC 1\n" >> config.h [ "$small_mem" ] && printf "#define CONFIG_SMALL_MEM 1\n" >> config.h [ "$full_repl" ] && cat >> config.h < reconfigure <