#! /bin/sh netsys_link_options="" have_posix_shm=0 have_posix_sem_anon=0 have_posix_sem_named=0 have_posix_fadvise=0 have_posix_fallocate=0 have_posix_memalign=0 have_posix_pthread=0 have_printexc_register_printer=0 have_printexc_register_printer_bool=false code_printexc_register_printer='()' have_ocaml_fancy_page_tables=0 have_new_modify=0 have_syslog=0 have_at=0 have_fchdir=0 have_fdopendir=0 support_outofheap=0 win32=0 stdlib=`ocamlc -where` rm -f config.h ulimit -c 0 # no coredumps ###################################################################### # Programs linked with ocamlc have more libraries linked in by default. # Because of this, we use ocamlopt if available. call_ocamlc () { if ocamlopt; then if [ -z "$opts" ]; then echo '$' ocamlopt "$@" ocamlopt "$@" else echo '$' ocamlopt "$@" -cclib "$opts" ocamlopt "$@" -cclib "$opts" fi else if [ -z "$opts" ]; then echo '$' ocamlc -custom "$@" ocamlc -custom "$@" else echo '$' ocamlc -custom "$@" -cclib "$opts" ocamlc -custom "$@" -cclib "$opts" fi fi } compile () { # arg 1: name of test. There must be a test program configtests/<name>.c # var "cclib": optional params for -cclib. It is first tried to link # with only $netsys_link_options, and if this does not work, $cclib # is prepended compiles=0 new_link_opts="" opts="" if [ -n "$netsys_link_options" ]; then opts="$netsys_link_options" fi rm -f configtests/"$1.err" if ( cd configtests; call_ocamlc -o "$1" "$1.c" main.ml ) \ >> configtests/"$1.err" 2>&1 then compiles=1 else if [ -n "$cclib" ]; then if [ -n "$netsys_link_options" -o -n "$cclib" ]; then opts="$cclib $netsys_link_options" fi if ( cd configtests; call_ocamlc -o "$1" "$1.c" main.ml ) \ >> configtests/"$1.err" 2>&1 then compiles=1 new_link_opts="$cclib" fi fi fi if [ $compiles -gt 0 ]; then echo "ocamlc: compiles OK" >> configtests/"$1.err" echo '$' "./$1" >> configtests/"$1.err" # NB. We need sh here to prevent that messages like # "Segmentation fault" appear on the terminal. if ( cd configtests; exec >> "$1.err" 2>&1; sh -c "./$1" ) then echo "program executes successfully" >> configtests/"$1.err" if [ -n "$new_link_opts" ]; then netsys_link_options="$new_link_opts $netsys_link_options" fi return 0 fi fi return 1 } compile_emit () { # arg 1: name of test. There must be a test program configtests/<name>.c # arg 2: name of symbol for config.h if compile "$1"; then echo "found" echo "#define $2" >>config.h return 0 else echo "not found" echo "#undef $2" >>config.h return 1 fi } ###################################################################### printf "Checking for win32... " system=`ocamlc -config | grep system | sed -e 's/system: //'` case "$system" in mingw*|msvc*) echo "yes" win32=1 netsys_link_options="$netsys_link_options -lws2_32" ;; *) echo "no" ;; esac ###################################################################### rm -f configtests/printexc_register_printer.err printf "Checking whether Ocaml has Printexc.register_printer... " if ( cd configtests; ocamlc -c printexc_register_printer.ml ) \ >>configtests/printexc_register_printer.err 2>&1 then have_printexc_register_printer=1 have_printexc_register_printer_bool=true code_printexc_register_printer='Printexc.register_printer f' fi if [ $have_printexc_register_printer -gt 0 ]; then echo "found" else echo "not found" fi ###################################################################### printf "Checking for POSIX pthread... " # Following test is stolen from Ocaml's configure script: posix_pthr_link_options="" case `uname -s` in SunOS) posix_pthr_link_options="-lpthread -lposix4" ;; FreeBSD) posix_pthr_link_options="-pthread" ;; OpenBSD) posix_pthr_link_options="-pthread" ;; *) posix_pthr_link_options="-lpthread" ;; esac cclib="$posix_pthr_link_options" compile_emit posix_pthread HAVE_PTHREAD ###################################################################### printf "Checking whether Ocaml has fancy page tables... " cclib="" compile_emit ocaml_fancy_page_tables FANCY_PAGE_TABLES ###################################################################### printf "Checking on new implementation of caml_modify... " # assume this from ocaml-4.01 on case `ocamlc -version` in [123].*) : ;; 4.00*) : ;; *) have_new_modify=1 ;; esac if [ $have_new_modify -gt 0 ]; then echo "#define HAVE_NEW_MODIFY" >> config.h echo "found" else echo "#undef HAVE_NEW_MODIFY" >> config.h echo "not found" fi have_weak_modify=0 if [ $have_new_modify -gt 0 ]; then printf "Checking whether new caml_modify can be overridden... " cclib="" compile_emit weak_modify WEAK_MODIFY have_weak_modify=$(( 1 - $? )) fi printf "Checking whether out-of-heap values are supported and mutable... " if [ $have_new_modify -gt 0 ]; then support_outofheap=$have_weak_modify else support_outofheap=1 fi if [ $support_outofheap -gt 0 ]; then echo "yes" def_ooh_object="netsys_c_outofheap.o" else echo "no" def_ooh_object="" fi ###################################################################### printf "Checking for POSIX shared memory... " cclib="-lrt" compile_emit posix_shm HAVE_POSIX_SHM ###################################################################### if [ $win32 -gt 0 ]; then # For some strange reason the test does not work on win32. So # force to skip this. echo "#undef HAVE_POSIX_SEM_ANON" >> config.h echo "#undef HAVE_POSIX_SEM_NAMED" >> config.h else printf "Checking for POSIX semaphores (anonymous)... " cclib="-lrt" compile_emit posix_sem_anon HAVE_POSIX_SEM_ANON printf "Checking for POSIX semaphores (named)... " cclib="-lrt" compile_emit posix_sem_named HAVE_POSIX_SEM_NAMED fi ###################################################################### printf "Checking for POSIX spawn... " cclib="" compile_emit posix_spawn HAVE_POSIX_SPAWN ###################################################################### printf "Checking for POSIX fadvise... " cclib="" compile_emit posix_fadvise HAVE_POSIX_FADVISE ###################################################################### printf "Checking for POSIX fallocate... " cclib="" compile_emit posix_fallocate HAVE_POSIX_FALLOCATE ###################################################################### printf "Checking for POSIX memalign... " cclib="" compile_emit posix_memalign HAVE_POSIX_MEMALIGN ###################################################################### printf "Checking for syslog... " cclib="" compile_emit syslog HAVE_SYSLOG ###################################################################### printf "Checking for POSIX functions like openat... " cclib="" compile_emit atfunctions HAVE_AT ###################################################################### # OS X 10.10 does not have mkfifoat but the other "at" functions exist printf "Checking for POSIX function mkfifoat... " cclib="" compile_emit atfuns_mkfifoat HAVE_MKFIFOAT ###################################################################### printf "Checking for fchdir... " cclib="" compile_emit fchdir HAVE_FCHDIR ###################################################################### printf "Checking for fdopendir... " cclib="" compile_emit fdopendir HAVE_FDOPENDIR ###################################################################### printf "Checking for realpath... " cclib="" compile_emit realpath HAVE_REALPATH ###################################################################### printf "Checking for grantpt (System V style PTYs)... " cclib="" compile_emit grantpt HAVE_PTY ###################################################################### printf "Checking for posix_openpt (System V style PTYs)... " cclib="" compile_emit posix_openpt HAVE_PTY_OPENPT ###################################################################### printf "Checking for initgroups..." cclib="" compile_emit initgroups HAVE_INITGROUPS ###################################################################### printf "Checking for POSIX clocks..." cclib="" compile_emit clock_gettime HAVE_CLOCK ###################################################################### printf "Checking for POSIX timers..." cclib="-lrt" compile_emit timer_create HAVE_POSIX_TIMER ###################################################################### printf "Checking for eventfd (Linux)..." cclib="" compile_emit eventfd HAVE_EVENTFD ###################################################################### printf "Checking for timerfd (Linux)..." cclib="" compile_emit timerfd HAVE_TIMERFD ###################################################################### printf "Checking for epoll (Linux)..." cclib="" compile_emit epoll_create HAVE_EPOLL ###################################################################### printf "Checking for compare_and_swap (GCC)..." cclib="" compile_emit gcc_compare_and_swap HAVE_GCC_COMPARE_AND_SWAP ###################################################################### printf "Checking for GPROF... " if [ -f $stdlib/std_exit.p.cmx ]; then echo "found" def_have_gprof="#define HAVE_GPROF" else echo "not found" def_have_gprof="#undef HAVE_GPROF" fi ###################################################################### # # Locales: We use nl_langinfo which is not available on Win32. # So we just assume we have locales on all other platforms. if [ $win32 -gt 0 ]; then def_have_locale="#undef HAVE_LOCALE" else def_have_locale="#define HAVE_LOCALE" fi ###################################################################### printf "Checking for O_SHARE_DELETE... " mkdir -p tmp cat <<_EOF_ >tmp/t.ml let x = Unix.O_SHARE_DELETE;; _EOF_ def_o_share_delete="-D NO_O_SHARE_DELETE" if ocaml unix.cma tmp/t.ml >/dev/null 2>/dev/null; then echo "yes" def_o_share_delete="-D HAVE_O_SHARE_DELETE" else echo "no" fi ###################################################################### printf "Checking for O_CLOEXEC... " mkdir -p tmp cat <<_EOF_ >tmp/t.ml let x = Unix.O_CLOEXEC;; _EOF_ def_o_cloexec="-D NO_O_CLOEXEC" if ocaml unix.cma tmp/t.ml >/dev/null 2>/dev/null; then echo "yes" def_o_cloexec="-D HAVE_O_CLOEXEC" else echo "no" fi ###################################################################### cat <<EOF >Makefile.conf NETSYS_LINK_OPTIONS = $netsys_link_options DEF_O_SHARE_DELETE = $def_o_share_delete DEF_O_CLOEXEC = $def_o_cloexec OOH_OBJECT = $def_ooh_object EOF cat <<EOF >>config.h $def_have_gprof $def_have_locale EOF cat <<EOF >netsys_conf.ml (* This file is written by netsys/configure *) let have_printexc_register_printer = $have_printexc_register_printer_bool let printexc_register_printer f = $code_printexc_register_printer EOF exit 0