Plasma GitLab Archive
Projects Blog Knowledge

#! /bin/sh

# $Id: configure,v 3.18 2005-10-31 13:28:55 stolpmann Exp $

#--- Options ---
# value -1: off by command line ("forced")
# value 0: off by default
# value 1: on by default
# value 2: on by command line ("forced")
# defaults:

set_defaults () {
    enable_findlib=1
    with_wdialog_p4=0
    with_wdialog_perlguts=0
#    with_wd_debugger=1
    with_wd_xmlcompiler=1
    with_perl=0
    with_wd_session_daemon=1
    with_wd_inmemory_session=1
}
set_defaults

version="2.1.3"
exec_suffix=""

ehelp_findlib="Enable/disable installation as findlib package"
whelp_wd_session_daemon="Include/omit the session state daemon"
whelp_wd_inmemory_session="Include/omit support for in-memory sessions"
whelp_wdialog_p4="Include/omit wdialog syntax extensions (camlp4)"
whelp_wdialog_perlguts="Include/omit library for interfacing Perl"
#whelp_wd_debugger="Inlude/omit wdialog debugger"
whelp_wd_xmlcompiler="Include/omit wdialog XML tree compiler"
whelp_perl="Include/omit Perl bindings"

# Which options exist? eoptions for enable/disable, woptions for with/without:
eoptions="findlib"
woptions="wdialog_p4 wdialog_perlguts wd_xmlcompiler perl \
wd_session_daemon wd_inmemory_session"
# NOT YET: wd_debugger

# Directories to include. The notation +package is allowed.
incdirs=""

# Directory where to install the library:
libdir=`ocamlc -where`/wdialog

# Directory for libraries needed for Perl bindings:
perl_libdir=/usr/local/libexec/wdialog

# Packages to include anyway: (extended later)
requires="pxp-engine netstring unix pcre netcgi2"
libs_cma="unix.cma pcre.cma netstring.cma netcgi.cma pxp_engine.cma"

# For the META file of wdialog only:
requires_wdialog="$requires"

check_library () {
    # $1: the name of the library (findlib)
    # $2: a typical file in $incdirs
    if [ "$enable_findlib" -gt 0 ]; then
	ocamlfind query "$1" >/dev/null 2>/dev/null
	return
    else
	stdlib=`ocamlc -where`
	for dir in $incdirs; do
	    case "$dir" in
		+*)
		    dir=`echo "$dir" | sed -e "s|^\+|$stdlib/|"` ;;
	    esac
	    if [ -f "$dir/$2" ]; then
		return 0
	    fi
	done
	return 1   # not found
    fi
}


check_library_version () {
    # $1: the name of the library (findlib)
    # $2: A regexp (egrep) for the version string
    # $3: a typical file in $incdirs
    if [ "$enable_findlib" -gt 0 ]; then
	v=`ocamlfind query -format '%v' "$1"`
	echo "$v" | egrep -e "$2" >/dev/null
	# return exit code of grep
	return
    else
	stdlib=`ocamlc -where`
	for dir in $incdirs; do
	    case "$dir" in
		+*)
		    dir=`echo "$dir" | sed -e "s|^\+|$stdlib/|"` ;;
	    esac
	    if [ -f "$dir/$3" ]; then
		return 0
	    fi
	done
	return 1   # not found
    fi
}


# Split $PATH into words:
oldifs="$IFS"
IFS="   :"
spacepath=`echo $PATH`
IFS="$oldifs"


get_path () {
    for d in $spacepath; do
        if test -x "$d/$1"; then
            echo "$d/$1"
            return
        fi
    done
}


print_options () {
	for opt in $eoptions; do
		e="o=\$enable_$opt"
		eval "$e"
		uopt=`echo $opt | sed -e 's/_/-/g'`
		if [ $o -gt 0 ]; then
			echo "    -enable-$uopt"
		else
			echo "    -disable-$uopt"
		fi
	done
	for opt in $woptions; 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 [ "$enable_findlib" -le 0 ]; then
	    if [ -n "$incdirs" ]; then
		echo "    -I $incdirs"
	    fi
	    if [ -n "$libdir" ]; then
		echo "    -libdir $libdir"
	    fi
	fi
	if [ "$with_perl" -gt 0 -o "$with_wdialog_perlguts" -gt 0 ]; then
	    echo "    -perl-libdir $perl_libdir"
	fi
}


usage () {
	set_defaults
	cat <<_EOF_ >&2
usage: ./configure [ options ]

_EOF_
	for opt in $eoptions; do
		e="help=\$ehelp_$opt"
		eval "$e"
		uopt=`echo $opt | sed -e 's/_/-/g'`
		echo "-enable-$uopt:" >&2
		echo "-disable-$uopt:" >&2
		echo "        $help" >&2
	done
	for opt in $woptions; do
		e="help=\$whelp_$opt"
		eval "$e"
		uopt=`echo $opt | sed -e 's/_/-/g'`
		echo "-with-$uopt:" >&2
		echo "-without-$uopt:" >&2
		echo "        $help" >&2
	done
	cat <<_EOF_ >&2
-I dir
        Add directory to include path (only if -disable-findlib)
-libdir dir
	Install the library into this directory (only if -disable-findlib)
-ocamltree dir
	The (already configured) OCaml source tree can be found here (for -with-perl)
-perl-libdir dir
        Install libs for the Perl bindings here (for -with-perl & -with-wdialog-perlguts)

Defaults are:

_EOF_
	print_options >&2
	exit 1
}


check_eopt () {
	for x in $eoptions; do
		if [ "$x" = "$1" ]; then
			return 0
		fi
	done
	echo "Unknown option: $1" >&2
	exit 1
}


check_wopt () {
	for x in $woptions; do
		if [ "$x" = "$1" ]; then
			return 0
		fi
	done
	echo "Unknown option: $1" >&2
	exit 1
}


echo "Welcome to WDialog version $version" >&2
while [ "$#" -gt 0 ]; do
	case "$1" in
		-enable-*)
			opt=`echo "$1" | sed -e 's/-enable-//' -e 's/-/_/g'`
			check_eopt "$opt"
			eval "enable_$opt=2"
			shift
			;;
		-disable-*)
			opt=`echo "$1" | sed -e 's/-disable-//' -e 's/-/_/g'`
			check_eopt "$opt"
			eval "enable_$opt=-1"
			shift
			;;
		-with-*)
			opt=`echo "$1" | sed -e 's/-with-//' -e 's/-/_/g'`
			check_wopt "$opt"
			eval "with_$opt=2"
			shift
			;;
		-without-*)
			opt=`echo "$1" | sed -e 's/-without-//' -e 's/-/_/g'`
			check_wopt "$opt"
			eval "with_$opt=-1"
			shift
			;;
		-I|-include|-incdir)
		        incdirs="$incdirs $2"
			shift; shift
			;;
		-ocamltree)
			ocamltree="$2"
			shift; shift
			;;
		-perl-libdir)
			perl_libdir="$2"
			shift; shift
			;;
		-version)
			echo "$version"
			exit 0
			;;
		*)
			usage
	esac
done

######################################################################
# Check ocaml

printf "%s" "Checking for ocaml... "
if ocamlc; then
    echo "found"
else
    echo "not found"
    echo "Sorry, it is not possible to build WDialog without the Objective Caml compiler"
    echo "Get it from: http://caml.inria.fr"
    exit 1
fi

printf "%s" "Checking the version of ocaml... "

ov=`ocamlc -v | head -n 1`

case "$ov" in
    *\ version\ 1*|*\ version\ 2*|*\ version\ 3\.0[0-3]*)
   	echo "too old"
	exit 1
	;;
    *\ version\ 3\.0[46789]*)
	echo "good"
	;;
    *)
	echo "not recognized (newer than 3.09?) - trying to continue"
	;;
esac


######################################################################
# Check ocamlfind

if [ "$enable_findlib" -gt 0 ]; then
    printf "%s" "Checking for findlib... "
    if ocamlfind query stdlib >/dev/null 2>/dev/null; then
	echo "found"
    else
	echo "not found"
	enable_findlib=0
	if [ "$enable_findlib" -eq 2 ]; then
	    echo "Sorry, findlib cannot be found."
	    echo "Make sure that ocamlfind is in your PATH, or download findlib"
	    echo "from www.ocaml-programming.de"
	    exit 1
	fi
    fi
fi

######################################################################
# Check that options are sane

# -with-perl implies -with-wdialog-perlguts:

if [ "$with_perl" -gt 0 ]; then
    if [ "$with_wdialog_perlguts" -le 0 ]; then
	# Not possible. Try to correct.
	# Try to set netstring to 1:
	if [ "$with_wdialog_perlguts" -eq 0 ]; then
	    with_wdialog_perlguts=1
	elif [ "$with_perl" -eq 1 ]; then
	    with_perl=0
	else
	    echo "Sorry, it is not possible to build Perl bindings but omit perlguts support."
	    exit 1
	fi
    fi
fi

######################################################################
# Check that pcre is available:

if true; then
    printf "%s" "Checking for PCRE... "
    if check_library pcre pcre.cmi; then
	echo "found"
    else
	echo "not found"
	echo "Sorry, installation is not possible without PCRE."
	echo "Get the PCRE library from:"
	echo "http://miss.wu-wien.ac.at/~mottl/ocaml_sources/"
	exit 1
    fi
fi

######################################################################
# Check that netstring is available (and the right version):

if true; then
    printf "%s" "Checking for netstring... "
    if check_library netstring netstring.cma; then
	echo "found"
	printf "%s" "Checking whether netstring version >= 0.92... "
	if check_library_version netstring '(0\.9[2-9]+)|([1-9].+)' netmime.mli; then
	    echo "good"
	else
	    echo "Your netstring version seems to be too old."
	    echo "You need at least netstring 0.92 (contained in ocamlnet-0.92), available from"
	    echo "http://sourceforge.net/projects/ocamlnet"
	    exit 1
	fi
    else
	echo "not found"
	echo "Sorry, installation is not possible without netstring."
	echo "Get the ocamlnet library (containing netstring) from:"
	echo "http://sourceforge.net/projects/ocamlnet"
	exit 1
    fi
fi

######################################################################
# Check that cgi is available (and the right version):

if true; then
    printf "%s" "Checking for netcgi2... "
    if check_library netcgi2 netcgi_common.mli; then
	echo "found"
    else
	echo "not found"
	echo "Sorry, installation is not possible without cgi."
	echo "Get the ocamlnet library (containing cgi)"
	exit 1
    fi
fi

######################################################################
# Check that pxp is available (and the right version):

if true; then
    printf "%s" "Checking for PXP... "
    if check_library pxp-engine pxp_types.mli; then
	echo "found"
	printf "%s" "Checking whether PXP version >= 1.1.3... "
	if check_library_version pxp-engine '(1\.1\.[3-9].*)|(1\.2.*)|([2-9].*)' pxp_types.mli; then
	    echo "good"
	else
	    echo "Your PXP version seems to be too old."
	    echo "You need at least PXP 1.1.3, available from"
	    echo "http://www.ocaml-programming.de"
	    exit 1
	fi
    else
	echo "not found"
	echo "Sorry, installation is not possible without PXP."
	echo "Get the PXP parser from:"
	echo "http://www.ocaml-programming.de"
	exit 1
    fi
fi

if true; then
    printf "%s" "Checking for PXP lexer (wlex)... "
    if check_library pxp-wlex pxp_wlex_link.cmi; then
	requires="$requires pxp-wlex"
	requires_wdialog="$requires_wdialog pxp-wlex"
	libs_cma="$libs_cma pxp_wlex.cma"
	echo "found"
    else
	echo "not found"
	printf "%s" "Checking for PXP lexer (ISO-8859-1)... "
	if check_library pxp-lex-iso88591 pxp_lex_link_iso88591.cmi; then
	    echo "found"
	    requires="$requires pxp-lex-iso88591"
	    requires_wdialog="$requires_wdialog pxp-lex-iso88591"
	    libs_cma="$libs_cma pxp_lex_iso88591.cma"
	else
	    echo "not found"
	    echo "Sorry, the lexer for ISO-8859-1 is missing"
	    exit 1
	fi

	printf  "%s" "Checking for PXP lexer (ulex)... "
	if check_library pxp-ulex-utf8 pxp_ulex_link_utf8.cmi; then
	    requires="$requires pxp-ulex-utf8"
	    requires_wdialog="$requires_wdialog pxp-ulex-utf8"
	    libs_cma="$libs_cma pxp_ulex_utf8.cma"
	    echo "found"
	else
	    echo "not found"
	    printf "%s" "Checking for PXP lexer (lex UTF-8)... "
	    if check_library pxp-lex-utf8 pxp_lex_link_utf8.cmi; then
		echo "found"
		requires="$requires pxp-lex-utf8"
		requires_wdialog="$requires_wdialog pxp-lex-utf8"
		libs_cma="$libs_cma pxp_lex_utf8.cma"
	    else
		echo "not found"
		echo "Sorry, the lexer for UTF-8 is missing"
		exit 1
	    fi
	fi
    fi
fi

######################################################################
# Check for ulex (now needed for core Wdialog!)

printf "%s" "Checking for ulex... "
if check_library ulex ulexing.cmi; then
    echo "found"
else
    echo "not found"
    echo "Sorry, you need ulex to build wdialog!"
    exit 1
fi

######################################################################
# Check for wd-session-daemon and rpc, inifiles

if [ $with_wd_session_daemon -gt 0 ]; then
    printf "%s" "Checking for RPC... "
    if check_library rpc rpc.cmi; then
	echo "found"
	requires="$requires rpc"
	libs_cma="$libs_cma rpc.cma"
	# but requires_wdialog is not extended
    else
	echo "not found"
	echo "Sorry, you need RPC for the wd-session-daemon"
	exit 1
    fi

    printf "%s" "Checking for Inifiles... "
    if check_library inifiles inifiles.cmi; then
	echo "found"
	requires="$requires inifiles"
	libs_cma="$libs_cma inifiles.cma"
	# but requires_wdialog is not extended
    else
	echo "not found"
	echo "Sorry, you need Inifiles for the wd-session-daemon"
	exit 1
    fi
fi

######################################################################
# Check the name of the findlib loader for scripts

printf "%s" "Checking the name of the findlib loader... "
rm -rf ocaml-findlib
stdlib=`ocamlc -where`
if [ -f "$stdlib/topfind" ]; then
    echo "<stdlib>/topfind"
    ln -s "$stdlib/topfind" ocaml-findlib
else
    if [ -f "$stdlib/findlib" ]; then
	echo "<stdlib>/findlib"
	ln -s "$stdlib/findlib" ocaml-findlib
    else
	if [ -f "$stdlib/ocamlfind" ]; then         # debian
	    echo "<stdlib>/ocamlfind"
	    ln -s "$stdlib/ocamlfind" ocaml-findlib
	else
	    echo "not found"
	    echo "Sorry, cannot find the findlib loader. Something is wrong"
	    echo "with your installation."
	    exit 1
	fi
    fi
fi

printf "%s" "Checking whether the findlib loader works... "
cat <<'EOF' >.testscript
#use "./ocaml-findlib";;
EOF

ocaml .testscript >.testout 2>&1
if [ -s .testout ]; then
    echo "no"
    echo "Sorry, something is wrong with your installation."
    exit 1
else
    echo "yes"
fi

######################################################################
# Check whether we need a toploop, and create it if so

printf "%s" "Checking whether we need a custom toploop for scripts... "
cat <<'EOF' >.testscript
#use "topfind";;
#require "pxp";;
EOF

ocaml .testscript >.testout 2>&1
if [ -s .testout ]; then
    printf "%s" "yes, creating it... "
    rm -f ocaml-toploop
    ocamlfind ocamlmktop -o ocaml-toploop -custom -package pxp,findlib -linkpkg ||
        exit
    echo "done"
else
    echo "no, not necessary"
    rm -f ocaml-toploop
    ln -s `get_path ocaml` ocaml-toploop
fi


######################################################################
# Check perl

if [ $with_perl -gt 0 ]; then
    printf "%s" "Checking for perl... "

    if [ "$enable_findlib" -le 0 ]; then
	echo "error"
	echo "Sorry, you need findlib to build the Perl bindings"
	exit 1
    fi

    if perl -v >/dev/null 2>/dev/null; then
	echo "found"
    else
	echo "not found"
	echo "Sorry, cannot build Perl bindings without a Perl installation"
	exit 1
    fi

    # Do we have camlidl?

    printf "%s" "Checking for camlidl... "
    f=0
    if camlidl; then
	if check_library camlidl com.cmi; then
	    f=1
	fi
    fi
    if [ $f -gt 0 ]; then
	echo "found"
    else
	echo "not found"
	echo "Sorry, cannot build Perl bindings without camlidl"
	echo "Get it from http://caml.inria.fr"
	exit 1
    fi

    # Check whether the necessary libraries can be dynamically loaded:
    printf "%s" "Checking whether libraries can be loaded... "
    cat <<'EOF' >.testscript
#use "topfind";;
#require "unix";;
#require "pcre";;
#require "camlidl";;
EOF
    ocaml .testscript >.testout 2>&1
    if [ -s .testout ]; then
        echo "no"
	echo "Error: Cannot load some critical libraries dynamically"
	echo "Look at .testscript and .testout for debugging"
	exit 1
    else
	echo "passes"
    fi

    # Check OS

    printf "%s" "Checking whether operating system is supported... "

    case `uname` in
	Linux)
	    echo "yes"
	    ;;
	*)
	    echo "unknown"
	    echo "WARNING! Building the Perl bindings has not been tested for your"
	    echo "operating system. It might work nevertheless, so I am trying..."
	    ;;
    esac

    # Is -ocamltree set?

    printf "%s" "Checking whether O'Caml source tree is available... "

    if [ -z "$ocamltree" ]; then
	echo "no"
	echo "You must set the option -ocamltree to build the Perl bindings"
	exit 1
    fi
    if [ ! -d "$ocamltree" ]; then
	echo "no"
	echo "Not found, or not a directory: $ocamltree"
	exit 1
    fi
    if [ ! -f "$ocamltree/byterun/interp.c" ]; then
	echo "no"
        echo "The directory $ocamltree seems not to be the source ocaml tree"
	exit 1
    fi
    if [ ! -f "$ocamltree/config/Makefile" -o \
	 ! -f "$ocamltree/config/s.h" -o \
	 ! -f "$ocamltree/config/m.h" ]; then
	echo "unconfigured"
        echo "The ocaml source tree is not configured. Go to $ocamltree"
	echo "and configure it"
	exit 1
    fi
    echo "passes"

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="wdialog"
for opt in $woptions; do
	e="o=\$with_$opt"
	eval "$e"
	if [ $o -gt 0 ]; then
		uopt=`echo "$opt" | sed -e 's/_/-/g'`
		case "$uopt" in
		    perl) uopt="ocamlrun-dso UI";;
		esac
		pkglist="$pkglist $uopt"
	fi
done

#if [ -z "$pkglist" ]; then
#    echo "Sorry, it is necessary that you want at least one package to be"
#    echo "built."
#    exit 1
#fi

#echo "Packages: $pkglist"

######################################################################
# Write META

for pkg in $pkglist; do
	echo "Writing src/$pkg/META"
	sed -e "s/@VERSION@/$version/g" \
	    -e "s/@REQUIRES@/$requires_wdialog/g" \
    	    src/$pkg/META.in >src/$pkg/META
done

######################################################################
# Write Makefile.conf

includes=""
if [ -n "$incdirs" ]; then
    for d in $incdirs; do
	includes="$includes -I $d"
     done
fi

instmethod="conventional"
useocamlfind=""
if [ "$enable_findlib" -gt 0 ]; then
    instmethod="findlib"
    useocamlfind='$(OCAMLFIND)'
    includes="$includes -package \"\$(REQUIRES)\""
fi

echo "Writing Makefile.conf"
cat <<_EOF_ >Makefile.conf
# The version
VERSION = $version

# The packages to build in the right order:
PKGLIST = $pkglist

# Whether the OS needs an .exe suffix for executables:
EXEC_SUFFIX = $exec_suffix

# Required packages (findlib):
REQUIRES = $requires

# Included directories (-I dir, or -I +pkg, or -package pkg):
INCLUDES = $includes

# Archives to link into executables (non-findlib):
LIBS_CMA = $libs_cma

# Additional options only for ocamlc:
OCAMLC_OPTIONS =

# Additional options only for ocamlopt:
OCAMLOPT_OPTIONS =

# Where wdialog is to be installed (non-findlib):
LIBDIR = $libdir

# Method of installation:
INSTMETHOD = $instmethod

# Method of compilation:
# Either "" (non-findlib), or "\$(OCAMLFIND)"
USE_OCAMLFIND = $useocamlfind

# Where to find the ocaml sources: (only -with-perl)
OCAMLTREE = $ocamltree

# Where to install libs only used for the Perl bindings:
PERL_LIBDIR = $perl_libdir

_EOF_

######################################################################
# Finish

echo
echo "Please check Makefile.conf."
echo
echo "You can now compile WDialog 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(s)."

if [ $with_perl -gt 0 ]; then
    echo
    echo 'Important note regarding the Perl bindings:'
    echo 'These must be compiled and installed in a second step.'
    echo 'So first do "make all; make opt; make install" to'
    echo 'build the base system, then continue with the Perl'
    echo 'bindings by running "make perlapi; make install-perlapi".'
fi


This web site is published by Informatikbüro Gerd Stolpmann
Powered by Caml