From: brian donovan <lists@lophty.com>
To: ekot@narod.ru, caml-list@inria.fr
Subject: Solved ! ... Re: [Caml-list] Building findlib/OCamlfind on Win32 system
Date: Tue, 11 May 2004 01:27:05 +0800 [thread overview]
Message-ID: <409FBB69.3090107@lophty.com> (raw)
In-Reply-To: <409FA788.2000106@narod.ru>
[-- Attachment #1: Type: text/plain, Size: 3559 bytes --]
Thank you !
I apologize - I had stupidly forgotten to start a new console
window after changing the value of $OCAMLLIB (through
Start>Settings>Control Panel> System>Advanced : Environment Variables;
System Variables), so it was still using the path with the
wrong-direction slashes. Following your advice (my OCaml install is in
C:\ocaml3.0.7 and echoing $OCAMLLIB at a bash prompt now gives me
C:/ocaml3.0.7/lib), findlib 1.0.7 works (afaict) perfectly - ocamlfind
list gives output, ocamlfind query <packagename> does as well, etc.
Although it's now clear that your patch + advice worked, I'm
including the patched configure script (attached) and my $PATH var value
(below) just in case you can use the data. May I suggest that you share
your patch and instructions with Gerd Stolpmann of
<http://www.ocaml-programming.de> (email <gerd(at)gerd-stolpmann.de>)?
I think he'd be grateful, as would any other poor souls who want to get
findlib working on Win32*.
* The MinGW installer, by default (at least on my system), tries to
place OCaml under the Program Files hierarchy and uses \'s in the value
for $OCAMLLIB. Because many, but not all, other Win32 ports of Unix
tools advise users to avoid spaces in file paths, I went ahead and
placed OCaml at a location with a space-free path, but I wouldn't have
otherwise known to change the slashes in $OCAMLLIB's value.
$PATH :
C:\cygwin\bin;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;C:\Program
Files\Common Files\Adaptec
Shared\System;c:\matlab6p5\bin\win32;C:\Program
Files\cvsnt;C:\ocaml3.0.7\bin
Thanks again
Eugene Kotlyarov wrote:
> brian donovan wrote:
>
>> Thanks for your help. The patch that you attached to your email
>> works on the configure script for findlib 1.0.4 (current version),
>> but not on the configure script for findlib 0.8.1 - is it intended as
>> a patch for 1.0.4? If, so that's great. :) In your advice, I have #1
>
> Yes this patch is only for 1.0.4
>
>> and #2 covered, the patch, as I said, is applied to v1.0.4's
>> configure script with no problems, but I hit a snag when I try to
>> configure. ./configure and ./configure -mspath both generate an
>> endless scroll of "dirname : too few arguments" error messages that
>> only stops when I quit the console window.
>
> This is very strange.
> Can you send me resulting configure script and output of the
> echo $PATH
> command
>
> Also one thing you may try is to find following functions in configure
> script and change comments like shown below. This also requires you to
> have 'which' command, there is package with such name in cygwin
>
> in_path () {
> # # Does $1 exist in $PATH?
> # IFS=":"
> # for d in $PATH; do
> # if test -x "$d/$1"; then
> # IFS="$oldifs"
> # return 0
> # fi
> # done
> # IFS="$oldifs"
> # return 1
> #--- The following is not portable enough:
> if test -x `type -p ls`; then
> # type -p works!
> type -p $1 >/dev/null
> else
> # use 'which' instead
> p=`which $1`
> test -x "$p"
> fi
> }
>
> get_path () {
> # IFS=":"
> # for d in $PATH; do
> # if test -x "$d/$1"; then
> # IFS="$oldifs"
> # echo "$d/$1"
> # return
> # fi
> # done
> # IFS="$oldifs"
> #--- The following is not portable enough:
> if test -x `type -p ls`; then
> # type -p works!
> type -p $1
> else
> # use 'which' instead
> p=`which $1`
> test -x "$p" && echo $p
> fi
> }
>
>
>
[-- Attachment #2: configure --]
[-- Type: text/plain, Size: 10526 bytes --]
#! /bin/sh
# $Id: configure 70 2004-04-04 10:48:18Z gerd $
# ----------------------------------------------------------------------
#
# Some functions
#set -x
version="1.0.4"
# Remember the old IFS value:
oldifs="$IFS"
in_path () {
# Does $1 exist in $PATH?
IFS=":"
for d in $PATH; do
if test -x "$d/$1"; then
IFS="$oldifs"
return 0
fi
done
IFS="$oldifs"
return 1
#--- The following is not portable enough:
# if test -x `type -p ls`; then
# # type -p works!
# type -p $1 >/dev/null
# else
# # use 'which' instead
# p=`which $1`
# test -x "$p"
# fi
}
get_path () {
IFS=":"
for d in $PATH; do
if test -x "$d/$1"; then
IFS="$oldifs"
echo "$d/$1"
return
fi
done
IFS="$oldifs"
#--- The following is not portable enough:
# if test -x `type -p ls`; then
# # type -p works!
# type -p $1
# else
# # use 'which' instead
# p=`which $1`
# test -x "$p" && echo $p
# fi
}
get_stdlib () {
# Older versions of ocamlc do not accept -where, so there is a fallback
# method:
ocamlc -where 2>/dev/null || {
ocamlc -v | sed -n -e "/Standard library directory/s/.*: \(.*\)/\1/p"; }
}
get_lib () {
# $1: name of a library to search for
# $2...: places to test
libname="$1"
while [ "$#" != "0" ]; do
if [ -f "$1/lib${libname}.so" -o -f "$1/lib${libname}.a" ]; then
echo "$1"
return 0
fi
shift
done
return 1
}
get_lib_file () {
# $1: name of library without "lib" and suffix
# $2: directory
# returns full path of library
if [ -f "$2/lib$1.so" ]; then
echo "$2/lib$1.so"
elif [ -f "$2/lib$1.a" ]; then
echo "$2/lib$1.a"
else
echo ""
fi
}
apply_cygpath () {
v=$1
eval "p=\"\$$v\""
p="`cygpath -w -s \"$p\"`"
p="`cygpath -u \"$p\"`"
eval "$v=\"$p\""
}
apply_mspath () {
v=$1
eval "p=\"\$$v\""
p="`cygpath -m -l \"$p\"`"
eval "$v=\"$p\""
}
######################################################################
# Here the main program begins:
######################################################################
# Interpret the command line
ocamlfind_bin=""
ocamlfind_man=""
ocaml_sitelib=""
ocamlfind_config=""
use_cygpath=0
use_mspath=0
with_toolbox=0
with_topfind=1
while [ "$#" != "0" ]; do
case "$1" in
-bindir) ocamlfind_bin=$2
shift 2
;;
-mandir) ocamlfind_man=$2
shift 2
;;
-sitelib) ocaml_sitelib=$2
shift 2
;;
-config) ocamlfind_config=$2
shift 2
;;
-cygpath) use_cygpath=1
shift
;;
-mspath) use_mspath=1
shift
;;
-with-toolbox) with_toolbox=1
shift
;;
-no-topfind) with_topfind=0
shift
;;
-version)
echo "$version"
exit 0
;;
-h|-help|--help) echo "usage: configure [options]" 1>&2
echo " -bindir path where binaries are installed" 1>&2
echo " -mandir path where manual pages are installed" 1>&2
echo " -sitelib path set the location of the site-specific packages" 1>&2
echo " -config path set the location of the configuration file" 1>&2
echo " -cygpath fix paths for cygwin environment" 1>&2
echo " -mspath fix paths for MSVC environment" 1>&2
echo " -with-toolbox also build the toolbox" 1>&2
echo " -no-topfind don't install topfind script into stdlib directory" 1>&2
exit
;;
*) echo "configure: run 'configure -h' to get help" 1>&2
exit 1
;;
esac
done
echo "Welcome to findlib version $version"
echo "Configuring core..."
#######################################################################
# inspect the system
# Some standard Unix tools must be available:
for tool in sed awk ocamlc uname rm make cat m4 dirname basename; do
if in_path $tool; then true; else
echo "configure: $tool not in PATH; this is required" 1>&2
exit 1
fi
done
# Find out standard library location
ocaml_core_stdlib=`get_stdlib`
if [ ! -d "$ocaml_core_stdlib" ]; then
echo "configure: cannot determine ocaml's standard library directory" 1>&2
exit 1
fi
if [ ${use_cygpath} -gt 0 ]; then
echo "Applying cygpath..."
apply_cygpath ocaml_core_stdlib
fi
# Set site-lib directory:
if [ -z "$ocaml_sitelib" ]; then
case "$ocaml_core_stdlib" in
/opt/*) ocaml_sitelib=`dirname ${ocaml_core_stdlib}`/site-lib
;;
*) ocaml_sitelib="${ocaml_core_stdlib}/site-lib"
;;
esac
fi
# Find out the directory where ocamlc is:
ocamlc=`get_path ocamlc`
ocaml_core_bin=`dirname ${ocamlc}`
# Set the directory of ocamlfind:
test -n "$ocamlfind_bin" || ocamlfind_bin="$ocaml_core_bin"
# Find the directory for the manual:
# Fallback:
ocaml_core_man=/usr/local/man
d="$ocaml_core_bin"
while [ "$d" != '/' ]; do
f=0
if [ -d "$d/man/man1" ]; then
if [ -f "$d/man/man1/ocamlc.1" -o \
-f "$d/man/man1/ocamlc.1.gz" -o \
-f "$d/man/man1/ocamlc.1.Z" ]; then
f=1
fi
else
if [ -d "$d/man/mann" ]; then
if [ -f "$d/man/mann/ocamlc.n" -o \
-f "$d/man/mann/ocamlc.n.gz" -o \
-f "$d/man/mann/ocamlc.n.Z" ]; then
f=1
fi
fi
fi
if [ "$f" = "1" ]; then
ocaml_core_man="$d/man"
d="/"
else
d=`dirname $d`
fi
done
# Set the directory for ocamlfind's manuals:
test -n "$ocamlfind_man" || ocamlfind_man="$ocaml_core_man"
# Guess the right directory for the configuration file:
if [ -z "${ocamlfind_config}" ]; then
d="$ocaml_core_bin"
case "$d" in
*/bin)
ocamlfind_config=`dirname $d`/etc/findlib.conf
;;
*)
ocamlfind_config=/usr/local/etc/findlib.conf
# Fallback value
;;
esac
fi
######################################################################
# Test the threading model
echo "Testing threading model..."
if ocamlc -vmthread >/dev/null 2>/dev/null; then
:
else
echo "The -vmthread switch is not supported: Your ocaml version is too old!"
exit 1
fi
rm -f itest-aux/simple
ocamlc -custom -thread -o itest-aux/simple unix.cma threads.cma itest-aux/simple_threads.ml \
>itest-aux/err.out 2>&1
output=`cat itest-aux/err.out`
if [ -z "$output" ]; then
ocaml_threads="posix"
else
ocaml_threads="vm"
fi
######################################################################
# Does this version of OCaml support autolinking?
# Works for O'Caml >= 3.00 on. Because findlib can only be compiled
# with these O'Caml versions, we can safely assume that autolinking
# is enabled.
ocaml_autolink="true"
######################################################################
# Configure libraries
echo "Configuring libraries..."
# Check whether Bigarray is present.
lbigarray=bigarray
# always
# Check whether labltk is present.
if [ -f "${ocaml_core_stdlib}/labltk/labltk.cma" ]; then
llabltk=labltk
echo "labltk: found"
else
llabltk=''
echo "labltk: not present"
if [ $with_toolbox -gt 0 ]; then
echo "Sorry, toolbox requires labltk - omitting toolbox."
fi
with_toolbox=0
fi
# Check on camlp4:
if in_path camlp4; then
lcamlp4=camlp4
camlp4_dir=`camlp4 -where`
camlp4_version=`camlp4 -v 2>&1`
echo "camlp4: found"
else
lcamlp4=''
echo "camlp4: not present"
fi
# Generate the META files now.
l="dbm dynlink graphics num num-top str threads unix stdlib bigarray $llabltk $lcamlp4"
for dir in site-lib-src/*; do
# We do not really know if $dir is a directory.
rm -f $dir/META
done
for lib in $l; do
if=""
if [ -f site-lib-src/$lib/interfaces.out ]; then
if=`cat site-lib-src/$lib/interfaces.out`
fi
m4 -Dos=$os \
"-Dtype_of_threads=${ocaml_threads}" \
"-Dcamlp4_dir=${camlp4_dir}" \
"-Dcamlp4_version=${camlp4_version}" \
"-Dinterfaces=${if}" \
"-Dfindlib_version=${version}" \
site-lib-src/$lib/META.in >site-lib-src/$lib/META
echo "Configuration for $lib written to site-lib-src/$lib/META"
done
for part in `cd src; echo *`; do
if [ -f "src/$part/META.in" ]; then
sed -e "s/@VERSION@/$version/g" src/$part/META.in >src/$part/META
fi
done
# Finally a check for Cygwin:
exec_suffix=
case `uname` in
CYGWIN*)
exec_suffix=.exe
echo "Cygwin found; using .exe as suffix for binaries"
;;
*)
true ;;
esac
######################################################################
# Write Makefile.config
parts="findlib"
if [ $with_toolbox -gt 0 ]; then
parts="$parts findlib-toolbox"
fi
if [ ${use_mspath} -gt 0 ]; then
echo "Applying mspath..."
apply_mspath ocaml_core_bin
apply_mspath ocamlfind_bin
apply_mspath ocamlfind_config
fi
echo "# Makefile.config written by configure" >Makefile.config
echo "OCAML_CORE_STDLIB=${ocaml_core_stdlib}" >>Makefile.config
echo "OCAML_CORE_BIN=${ocaml_core_bin}" >>Makefile.config
echo "OCAML_CORE_MAN=${ocaml_core_man}" >>Makefile.config
echo "OCAML_SITELIB=${ocaml_sitelib}" >>Makefile.config
echo "OCAML_THREADS=${ocaml_threads}" >>Makefile.config
echo "OCAMLFIND_BIN=${ocamlfind_bin}" >>Makefile.config
echo "OCAMLFIND_MAN=${ocamlfind_man}" >>Makefile.config
echo "OCAMLFIND_CONF=${ocamlfind_config}" >>Makefile.config
echo "OCAML_AUTOLINK=${ocaml_autolink}" >>Makefile.config
echo "EXEC_SUFFIX=${exec_suffix}" >>Makefile.config
echo "PARTS=${parts}" >>Makefile.config
echo "INSTALL_TOPFIND=${with_topfind}" >>Makefile.config
# All OK
echo
echo "About the OCAML core installation:"
echo " Standard library: ${ocaml_core_stdlib}"
echo " Binaries: ${ocaml_core_bin}"
echo " Manual pages: ${ocaml_core_man}"
echo " Multi-threading type: ${ocaml_threads}"
echo "The directory of site-specific packages will be"
echo " site-lib: ${ocaml_sitelib}"
echo "The configuration file is written to:"
echo " findlib config file: ${ocamlfind_config}"
echo "Software will be installed:"
echo " Libraries: in <site-lib>/findlib"
echo " Binaries: ${ocamlfind_bin}"
echo " Manual pages: ${ocamlfind_man}"
if [ $with_topfind -gt 0 ]; then
echo " topfind script: ${ocaml_core_stdlib}"
else
echo " topfind script: omitted"
fi
if [ $with_toolbox -gt 0 ]; then
echo "Toolbox: yes"
else
echo "Toolbox: no"
fi
echo
echo "Configuration has been written to Makefile.config"
echo
echo "You can now do 'make all', and optionally 'make opt', to build ocamlfind."
prev parent reply other threads:[~2004-05-10 17:27 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-05-10 5:59 brian donovan
2004-05-10 8:21 ` Yutaka OIWA
2004-05-10 17:42 ` Solved! ... " brian donovan
2004-05-10 18:17 ` Yutaka OIWA
2004-05-10 11:22 ` Eugene Kotlyarov
[not found] ` <409F825B.4050006@lophty.com>
[not found] ` <409FA788.2000106@narod.ru>
2004-05-10 17:27 ` brian donovan [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=409FBB69.3090107@lophty.com \
--to=lists@lophty.com \
--cc=caml-list@inria.fr \
--cc=ekot@narod.ru \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox