#! /bin/sh # $Id$ ####################################################################### # Helpers: # Split $PATH into words: oldifs="$IFS" IFS=" :" spacepath=`echo $PATH` IFS="$oldifs" in_path () { # Does $1 exist in $PATH? for d in $spacepath; do if test -x "$d/$1"; then return 0 fi done return 1 } get_path () { for d in $spacepath; do if test -x "$d/$1"; then echo "$d/$1" return fi done } ####################################################################### # Defaults set_defaults () { with_equeue_tcl=0 with_equeue_gtk1=0 with_equeue_gtk2=0 with_shell=1 version="2.1.4" exec_suffix="" tcl_defs="" tcl_libs="" # bindir=`dirname $ocamlc` gtk2_io_add_watch_supports_lists="" } ocamlc=`get_path ocamlc` set_defaults ####################################################################### # Option parsing help_equeue_tcl="Compile/omit the equeue version for integration into TCL event loops" help_equeue_gtk1="Compile/omit the equeue version for integration into Glib/gtk1 event loops" help_equeue_gtk2="Compile/omit the equeue version for integration into Glib/gtk2 event loops" help_shell="Compile/omit the shell modules" options="equeue_tcl equeue_gtk1 equeue_gtk2 shell" print_options () { for opt in $options; do e="o=\$with_$opt" eval "$e" uopt=`echo $opt | sed -e 's/_/-/g'` if [ $o -gt 0 ]; then echo " -with-$uopt" else echo " -without-$uopt" fi done if [ $with_equeue_tcl -gt 0 ]; then echo " -equeue-tcl-defs \"$tcl_defs\"" echo " -equeue-tcl-libs \"$tcl_libs\"" fi } usage () { cat <<_EOF_ >&2 usage: ./configure [ options ] _EOF_ # echo "-bindir :" # echo " Install binaries into this directory" for opt in $options; do e="help=\$help_$opt" eval "$e" uopt=`echo $opt | sed -e 's/_/-/g'` echo "-with-$uopt:" >&2 echo "-without-$uopt:" >&2 echo " $help" >&2 done echo "-equeue-tcl-defs :" echo " Set C compiler options to find tcl.h" echo echo "-equeue-tcl-libs :" echo " Set C compiler options to link against libtcl" cat <<_EOF_ >&2 Defaults are: _EOF_ set_defaults print_options >&2 exit 1 } check_opt () { for x in $options; do if [ "$x" = "$1" ]; then return 0 fi done echo "Unknown option: $1" >&2 exit 1 } while [ "$#" -gt 0 ]; do case "$1" in -with-*) opt=`echo "$1" | sed -e 's/-with-//' -e 's/-/_/g'` check_opt "$opt" eval "with_$opt=1" shift ;; -without-*) opt=`echo "$1" | sed -e 's/-without-//' -e 's/-/_/g'` check_opt "$opt" eval "with_$opt=0" shift ;; -equeue-tcl-defs) tcl_defs="$tcl_defs $2" shift shift ;; -equeue-tcl-libs) tcl_libs="$tcl_libs $2" shift shift ;; # -bindir) # bindir="$2" # shift # shift # ;; -version*) echo "$version" exit 0 ;; *) usage esac done ###################################################################### # Check ocamlfind printf "%s" "Checking for ocamlfind... " if ocamlfind query stdlib >/dev/null 2>/dev/null; then echo "found" else echo "not found" echo "Sorry, installation is not possible without ocamlfind (findlib)!" echo "Make sure that ocamlfind is in your PATH, or download findlib" echo "from www.ocaml-programming.de" exit 1 fi ###################################################################### # Check multi-threading style echo "Checking multi-threading support: " mt_byte="" mt_native="" mt_native_p="" stdlib=`ocamlc -where` printf "%s" " for bytecode applications: " if [ -f "$stdlib/vmthreads/threads.cma" ]; then # Note: We prefer -vmthread for compilation even if systhreads are # available. This does not cause any problems, because the type of # mt is selected in the final link step of the executable, and not # important for the creation of libraries. mt_byte="-vmthread" elif [ -f "$stdlib/threads/threads.cma" ]; then mt_byte="-thread" else echo "Internal error: This library is incompatible with your version" echo "of O'Caml, as my assumptions about stdlib layout do not hold." exit 1 fi echo "$mt_byte" printf "%s" " for native code applications: " if [ -f "$stdlib/threads/threads.cmxa" ]; then mt_native="-thread" mt_native_p="yes" fi if [ -n "$mt_native" ]; then echo "$mt_native" else echo "not available" fi ###################################################################### # Check equeue-tcl-defs and -libs if [ $with_equeue_tcl -gt 0 ]; then printf "%s" "Checking switches for tcl.h... " tcl_defs_1="" for d in $tcl_defs; do tcl_defs_1="$tcl_defs_1 -ccopt '$d'" done rm -rf tmp mkdir -p tmp cat <tmp/t.c #include "tcl.h" main () { } EOF if ( cd tmp; ocamlc $tcl_defs_1 -c t.c >/dev/null 2>/dev/null ) then echo "ok" else echo "not ok" echo echo "Please check -equeue-tcl-defs!" exit 1 fi printf "%s" "Checking switches to link libtcl... " cat <tmp/t.c #include #include #include "tcl.h" do_something () { void (*x)(int); x = Tcl_Exit; exit(0); } EOF cat <tmp/t.ml exit 0 EOF if ( cd tmp ocamlc $tcl_defs_1 -c t.c >/dev/null 2>/dev/null && ocamlc -c t.ml >/dev/null 2>/dev/null && ocamlc -o t -custom t.o t.cmo -cclib "$tcl_libs" ) then if tmp/t; then echo "ok" else echo "not ok (check ldd output of tmp/t)" echo echo "Please check -equeue-tcl-libs!" exit 1 fi else echo "not ok" echo echo "Please check -equeue-tcl-libs!" exit 1 fi fi ###################################################################### # Check lablgtk if [ $with_equeue_gtk1 -gt 0 ]; then printf "%s" "Checking for lablgtk... " if ocamlfind query lablgtk >/dev/null 2>/dev/null; then echo "found" else echo "not found" with_equeue_gtk1=0 fi fi ###################################################################### # Check lablgtk2 if [ $with_equeue_gtk2 -gt 0 ]; then printf "%s" "Checking for lablgtk2... " if ocamlfind query lablgtk2 >/dev/null 2>/dev/null; then echo "found" else echo "not found" with_equeue_gtk2=0 fi fi if [ $with_equeue_gtk2 -gt 0 ]; then printf "%s" "Checking whether lablgtk2 has GMain.Io.remove... " mkdir -p tmp cat <tmp/gtk.ml let _ = GMain.Io.remove;; EOF if ocamlfind ocamlc -package lablgtk2 -c tmp/gtk.ml >/dev/null 2>/dev/null; then echo "yes" else echo "no" echo "Your version of lablgtk2 is too old!" with_equeue_gtk2=0 fi fi if [ $with_equeue_gtk2 -gt 0 ]; then printf "%s" "Checking whether lablgtk2 has GMain.Io.add_watch with list support... " mkdir -p tmp cat <<'EOF' >tmp/gtk.ml open GMain.Io let _ = (add_watch : cond:condition list -> callback:(condition list -> bool) -> ?prio:int -> channel -> id);; exit 0 EOF # Note: this newer API is never broken in the sense checked below, i.e. # such lablgtk2 versions do not exist. if ocamlfind ocamlc -package unix,lablgtk2 -linkpkg -o tmp/gtk tmp/gtk.ml >/dev/null 2>/dev/null && tmp/gtk; then echo "yes" gtk2_io_add_watch_supports_lists="-ppopt -DGTK2_IO_ADD_WATCH_SUPPORTS_LISTS" else echo "no" printf "%s" "Checking whether lablgtk2's GMain.Io.add_watch is broken... " mkdir -p tmp cat <<'EOF' >tmp/gtk.ml GMain.Main.init();; let ch = GMain.Io.channel_of_descr (Unix.stdout) in let w = GMain.Io.add_watch ~cond:`OUT ~callback:(fun () -> true) ch in (* add_watch is broken when it just returns Val_unit, and ok when it * returns a positive int *) if (Obj.magic w : int) > 0 then exit 0 else exit 1 EOF if ocamlfind ocamlc -package unix,lablgtk2 -linkpkg -o tmp/gtk tmp/gtk.ml >/dev/null 2>/dev/null && tmp/gtk; then echo "no" else echo "yes" echo "You should apply the patch-ab-ml_glib.c to lablgtk2 to fix this!" with_equeue_gtk2=0 fi fi fi ###################################################################### # Check cygwin printf "%s" "Checking for cygwin... " u=`uname` case "$u" in CYGWIN*) echo "found" exec_suffix=".exe" ;; *) echo "not found" ;; esac ###################################################################### # Summary echo echo "Effective options:" print_options echo pkglist_build="equeue" pkglist_install="equeue" if [ "$with_equeue_tcl" -gt 0 ] then pkglist_build="$pkglist_build equeue-tcl" pkglist_install="$pkglist_install equeue-tcl"; fi if [ "$with_equeue_gtk1" -gt 0 ] then pkglist_build="$pkglist_build equeue-gtk" pkglist_install="$pkglist_install equeue-gtk" rm -f src/equeue-gtk1 ln -s equeue-gtk src/equeue-gtk1 fi if [ "$with_equeue_gtk2" -gt 0 ] then pkglist_build="$pkglist_build equeue-gtk2" pkglist_install="$pkglist_install equeue-gtk2" for f in Makefile uq_gtk.ml uq_gtk.mli; do rm -f src/equeue-gtk2/$f ln -s ../equeue-gtk/$f src/equeue-gtk2 done fi if [ "$with_shell" -gt 0 ] then pkglist_build="$pkglist_build shell" pkglist_install="$pkglist_install shell"; fi ###################################################################### # Write META for pkg in $pkglist_install; do if [ -f src/$pkg/META.in ]; then echo "Writing src/$pkg/META" sed -e "s/@VERSION@/$version/g" \ src/$pkg/META.in >src/$pkg/META fi done ###################################################################### # Write Makefile.conf echo "Writing Makefile.conf" cat <<_EOF_ >Makefile.conf VERSION = $version PKGLIST_BUILD = $pkglist_build PKGLIST_INSTALL = $pkglist_install EXEC_SUFFIX = $exec_suffix MT_BYTE = $mt_byte MT_NATIVE = $mt_native MT_NATIVE_P = $mt_native_p EQUEUE_TCL_DEFS = $tcl_defs_1 EQUEUE_TCL_LIBS = $tcl_libs GTK_DEFINES = $gtk2_io_add_watch_supports_lists _EOF_ ###################################################################### # Finish echo echo "You can now compile equeue by invoking" echo " make all" echo "for the bytecode compiler, and optionally by invoking" echo " make opt" echo "for the native-code compiler (if supported on your architecture)." echo "Finally, a" echo " make install" echo "will install the package."