[Mono-list] Building mono on Win32 with ICU
George Kodinov
gkodinov@openlinksw.co.uk
Tue, 04 Nov 2003 14:34:00 +0200
This is a multi-part message in MIME format.
--------------040505050400040509030602
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
Hi again,
I've managed to fool mono on win32 to compile w/ ICU the following way :
- I've got the latest ICU Win32 binary from
(ftp://www-126.ibm.com/pub/icu/2.6.1/icu-2.6.1-Win32_msvc6.zip).
- I've got the latest ICU source from
(ftp://www-126.ibm.com/pub/icu/2.6.1/icu-2.6.1.zip).
- Installed the binary zip at c:\icu
- Unsing the ICU's 'configure' script I've produced a proto icu-config
for CygWin
- Changed the names and the location of the ICU libraries from their
cygwin names to the Win32 native names. This way I got the attached
icu-config.
- Copied the so produced icu-config to c:\icu\bin and added c:\icu\bin
to the PATH
- run the mono-build-win32.sh - it detected and compiled the ICU support
just fine.
For anybody interested I'm attaching the modified icu-config. Just get
the Win32 binary achive, unzip it to c:\icu, add the icu-config to
c:\icu\bin and add the c:\icu\bin to your PATH.
It proves handy to copy the three ICU dlls referenced (icudt26l.dll,
icuuc26.dll and icuin26.dll) to install\lib (next to the glib dlls) so
you can safely remove the icu installation.
Best Regards,
George Kodinov
George Kodinov wrote:
> Hi,
>
> I've noted that the Win32 build script is not adding the ICU to the mix.
> Does anyone have some experience on building Mono with ICU on windows ?
> Does it worth trying at all ?
>
> Best Regards,
> George Kodinov
> _______________________________________________
> Mono-list maillist - Mono-list@lists.ximian.com
> http://lists.ximian.com/mailman/listinfo/mono-list
--------------040505050400040509030602
Content-Type: text/plain;
name="icu-config"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
filename="icu-config"
#!/bin/sh
## -*-sh-*-
#set -x
# BEGIN of icu-config-top
#******************************************************************************
# Copyright (C) 1999-2002, International Business Machines
# Corporation and others. All Rights Reserved.
# $Revision: 1.1 $
#******************************************************************************
# This script is designed to aid configuration of ICU.
# rpath links a library search path right into the binaries.
### END of icu-config-top
## Zero out prefix.
execprefix=
prefix=
loaddefs()
{
# Following from ./config/mh-cygwin
# Generated automatically from Makefile.inc.in by configure.
## -*-makefile-*-
#******************************************************************************
# Copyright (C) 1999-2003, International Business Machines
# Corporation and others. All Rights Reserved.
# $Revision: 1.35 $
#******************************************************************************
# This Makefile.inc is designed to be included into projects which make use
# of the ICU.
# CONTENTS OF THIS FILE
# 1). Base configuration information and linkage
# 2). Variables giving access to ICU tools
# 3). Host information
# 4). Compiler flags and settings
# 5). Data Packaging directives
# 6). Include of platform make fragment (mh-* file)
##################################################################
#
# *1* base configuration information and linkage
#
##################################################################
# The PREFIX is the base of where ICU is installed.
# Inside this directory you should find bin, lib, include/unicode,
# etc. If ICU is not installed in this directory, you must change the
# following line. There should exist ${prefix}/include/unicode/utypes.h
# for example.
default_prefix="c:/icu"
if [ "x${prefix}" = "x" ]; then prefix="$default_prefix"; fi
exec_prefix="${prefix}"
libdir="${exec_prefix}/bin"
libexecdir="${exec_prefix}/libexec"
bindir="${exec_prefix}/bin"
datadir="${prefix}/share"
sbindir="${exec_prefix}/sbin"
# about the ICU version
VERSION="2.6.1"
UNICODE_VERSION="4"
# The prefix for ICU libraries, normally 'icu'
ICUPREFIX="icu"
PACKAGE="icu"
LIBICU="${ICUPREFIX}"
# Suffix at the end of libraries. Usually empty.
ICULIBSUFFIX="26"
# ICULIBSUFFIX_VERSION is non-empty if it is to contain a library
# version. For example, if it is 21, it means libraries are named
# libicuuc21.so for example.
# rpath links a library search path right into the binaries.
## mh-files MUST NOT override RPATHLDFLAGS unless they provide
## equivalent '#SH#' lines for icu-config fixup
default_ENABLE_RPATH="NO"
if [ "x${ENABLE_RPATH}" = "x" ]; then ENABLE_RPATH="$default_ENABLE_RPATH"; fi
RPATHLDFLAGS="${LD_RPATH}${LD_RPATH_PRE}${libdir}"
# icu-config version of above 'if':
case "$ENABLE_RPATH" in
[yY]*)
ENABLE_RPATH=YES
RPATHLDFLAGS="${LD_RPATH}${LD_RPATH_PRE}${libdir}"
;;
[nN]*)
ENABLE_RPATH=NO
RPATHLDFLAGS=""
;;
*)
echo $0: Unknown --enable-rpath value ${ENABLE_RPATH} 1>&2
exit 3
;;
esac
### To link your application with ICU:
# 1. use LDFLAGS, CFLAGS, etc from above
# 2. link with ${ICULIBS}
# 3. optionally, add one or more of:
# - ${ICULIBS_I18N} - i18n library, formatting, etc.
# - ${ICULIBS_LAYOUT} - ICU layout library.
# - ${ICULIBS_USTDIO} - ICU stdio equivalent library
ICULIBS_COMMON="-l${ICUPREFIX}uc${ICULIBSUFFIX}${ICULIBSUFFIX_VERSION}"
ICULIBS_DATA="-l${ICUPREFIX}dt${ICULIBSUFFIX}${ICULIBSUFFIX_VERSION}l"
ICULIBS_I18N="-l${ICUPREFIX}in${ICULIBSUFFIX}${ICULIBSUFFIX_VERSION}"
ICULIBS_TOOLUTIL="-l${ICUPREFIX}toolutil${ICULIBSUFFIX}${ICULIBSUFFIX_VERSION}"
ICULIBS_CTESTFW="-l${ICUPREFIX}ctestfw${ICULIBSUFFIX}${ICULIBSUFFIX_VERSION}"
ICULIBS_USTDIO="-licuio${ICULIBSUFFIX}${ICULIBSUFFIX_VERSION}"
ICULIBS_OBSOLETE="-l${ICUPREFIX}obsolete${ICULIBSUFFIX}${ICULIBSUFFIX_VERSION}"
ICULIBS_LAYOUT="-l${ICUPREFIX}le${ICULIBSUFFIX}${ICULIBSUFFIX_VERSION}"
ICULIBS_LAYOUTEX="-l${ICUPREFIX}lx${ICULIBSUFFIX}${ICULIBSUFFIX_VERSION}"
ICULIBS_BASE="${LIBS} -L${libdir}"
# for icu-config to test with
ICULIBS_COMMON_LIB_NAME="${LIBICU}uc${ICULIBSUFFIX}${ICULIBSUFFIX_VERSION}.${SO}"
# ICULIBS is the set of libraries your application should link
# with usually. Many applications will want to add ${ICULIBS_I18N} as well.
ICULIBS="${ICULIBS_BASE} ${ICULIBS_I18N} ${ICULIBS_COMMON} ${ICULIBS_DATA} "
#ICULIBS="${ICULIBS_BASE} ${ICULIBS_COMMON} ${ICULIBS_DATA} "
##################################################################
#
# *2* access to ICU tools
#
##################################################################
# Environment variable to set a runtime search path
# (Overridden when necessary in -mh files)
LDLIBRARYPATH_ENVVAR="LD_LIBRARY_PATH"
# Access to important ICU tools.
# Use as follows: ${INVOKE} ${GENRB} arguments ..
INVOKE="${LDLIBRARYPATH_ENVVAR}=${libdir}:$$${LDLIBRARYPATH_ENVVAR} ${LEAK_CHECKER}"
GENCCODE="${sbindir}/genccode"
GENCMN="${sbindir}/gencmn"
GENRB="${bindir}/genrb"
PKGDATA="${bindir}/pkgdata"
##################################################################
#
# *3* Information about the host
#
##################################################################
# Information about the host that 'configure' was run on.
host="i686-pc-cygwin"
host_alias="i686-pc-cygwin"
host_cpu="i686"
host_vendor="pc"
host_os="cygwin"
# Our platform canonical name (as determined by configure)
# this is a #define value (i.e. U_XXXX or XXXX)
platform="U_CYGWIN"
##################################################################
#
# *4* compiler flags and misc. options
#
##################################################################
AIX_SHLIB="makeC++SharedLib_r"
AR="/usr/bin/ar"
CC="gcc -mno-cygwin"
CFLAGS="-g ${THREADSCFLAGS} "
CPP="cpp -P -C"
CPPFLAGS="${THREADSCPPFLAGS} ${LIBCPPFLAGS} -I${prefix}/include"
CXX="c++ -mno-cygwin"
CXXFLAGS="-g ${THREADSCXXFLAGS} "
DEFAULT_MODE="dll"
DEFS="-DHAVE_CONFIG_H "
FFLAGS=""
INSTALL="/usr/bin/install -c"
INSTALL_DATA="${INSTALL} -m 644"
INSTALL_PROGRAM="${INSTALL}"
INSTALL_SCRIPT="${INSTALL_PROGRAM}"
LDFLAGS="${RPATHLDFLAGS}"
LIBS="-lpthread -lm "
LIB_M=""
LIB_VERSION="26.1"
LIB_VERSION_MAJOR="26"
MKINSTALLDIRS="${SHELL} ${pkgdatadir}/mkinstalldirs"
RANLIB="ranlib"
RMV="rm -rf"
SHELL="/bin/sh"
SHLIB_c="${CC} ${DEFS} ${CPPFLAGS} ${CFLAGS} ${LDFLAGS} -shared"
SHLIB_cc="${CXX} ${DEFS} ${CPPFLAGS} ${CXXFLAGS} ${LDFLAGS} -shared"
U_IS_BIG_ENDIAN="0"
includedir="${prefix}/include"
infodir="${prefix}/info"
ld_rpath_suf=""
localstatedir="${prefix}/var"
mandir="${prefix}/man"
oldincludedir="/usr/include"
program_transform_name="s,x,x,"
sharedstatedir="${prefix}/com"
sysconfdir="${prefix}/etc"
INSTALL_L="${INSTALL_DATA}"
##################################################################
#
# *5* packaging options and directories
#
##################################################################
pkgdatadir="${datadir}/${PACKAGE}${ICULIBSUFFIX}/${VERSION}"
pkglibdir="${libdir}/${PACKAGE}${ICULIBSUFFIX}/${VERSION}"
# The basename of the ICU data file (i.e. icudt21b )
ICUDATA_NAME="icudt26l"
# Defaults for pkgdata's mode and directories
# The default data dir changes depending on what packaging mode
# is being used
PKGDATA_MODE="dll"
ICUDATA_DIR="${pkgdatadir}"
ICUPKGDATA_DIR="${ICUDATA_DIR}"
ICUDATA_DIR="${pkgdatadir}"
ICUPKGDATA_DIR="${libdir}"
ICUDATA_DIR="${pkglibdir}"
ICUPKGDATA_DIR="${ICUDATA_DIR}"
##################################################################
#
# *6* Inclusion of platform make fragment (mh-* file)
#
##################################################################
# The mh- file ("make fragment") for the platform is included here.
# It may override the above settings.
# It is put last so that the mh-file can override anything.
## -*-makefile-*-
## Cygwin-specific setup
## Copyright (c) 2001-2003, International Business Machines Corporation and
## others. All Rights Reserved.
##
## $Id: mh-cygwin,v 1.13 2003/08/08 23:53:43 grhoten-oss Exp $
## Commands to generate dependency files
GEN_DEPS_c="${CC} -E -MM ${DEFS} ${CPPFLAGS}"
GEN_DEPS_cc="${CXX} -E -MM ${DEFS} ${CPPFLAGS}"
## Flags for position independent code
SHAREDLIBCFLAGS=""
SHAREDLIBCXXFLAGS=""
SHAREDLIBCPPFLAGS="-DPIC"
## Additional flags when building libraries and with threads
LIBCPPFLAGS="-D_REENTRANT"
THREADSCPPFLAGS="-D_REENTRANT"
## Commands to make a shared library
SHLIB_c="${CC} ${DEFS} ${CPPFLAGS} ${CFLAGS} ${LDFLAGS} -shared"
SHLIB_cc="${CXX} ${DEFS} ${CPPFLAGS} ${CXXFLAGS} ${LDFLAGS} -shared"
## Compiler switch to embed a runtime search path
LD_RPATH=""
LD_RPATH_PRE="-Wl,-rpath,"
## Compiler switch to embed a library name
LD_SONAME="-Wl,-soname -Wl,${MIDDLE_SO_TARGET}"
## Shared object suffix
SO="dll"
## Non-shared intermediate object suffix
STATIC_O="o"
#LIBICU = ${ICUPREFIX}
## Link commands to link to ICU libs
LIBICUDT="-L${top_builddir}/stubdata/ -l${ICUPREFIX}data${ICULIBSUFFIX}${SO_TARGET_VERSION_MAJOR}"
LIBICUUC="-L${top_builddir}/common/ -l${ICUPREFIX}uc${ICULIBSUFFIX}${SO_TARGET_VERSION_MAJOR}"
LIBICUI18N="-L${top_builddir}/i18n/ -l${ICUPREFIX}i18n${ICULIBSUFFIX}${SO_TARGET_VERSION_MAJOR}"
LIBICULE="-L${top_builddir}/layout/ -l${ICUPREFIX}le${ICULIBSUFFIX}${SO_TARGET_VERSION_MAJOR}"
LIBICULX="-L${top_builddir}/layoutex/ -l${ICUPREFIX}lx${ICULIBSUFFIX}${SO_TARGET_VERSION_MAJOR}"
LIBCTESTFW="-L${top_builddir}/tools/ctestfw/ -l${ICUPREFIX}ctestfw${ICULIBSUFFIX}${SO_TARGET_VERSION_MAJOR}"
LIBICUTOOLUTIL="-L${top_builddir}/tools/toolutil/ -l${ICUPREFIX}toolutil${ICULIBSUFFIX}${SO_TARGET_VERSION_MAJOR}"
LIBUSTDIO="-L${top_builddir}/extra/ustdio/ -l${ICUPREFIX}io${ICULIBSUFFIX}${SO_TARGET_VERSION_MAJOR}"
## Compilation rules
## Dependency rules
## Versioned target for a shared library.
## FINAL_SO_TARGET= ${basename $(SO_TARGET})${SO_TARGET_VERSION}${ICULIBSUFFIX}.${SO}
## MIDDLE_SO_TARGET= ${basename $(SO_TARGET})${SO_TARGET_VERSION_MAJOR}${ICULIBSUFFIX}.${SO}
## Versioned libraries rules
## Bind internal references
# LDflags that pkgdata will use
BIR_LDFLAGS="-Wl,-Bsymbolic"
# CPPflags for genccode/gencmn
BIR_CPPFLAGS="-DU_HAVE_BIND_INTERNAL_REFERENCES"
# Dependencies [i.e. map files] for the final library
BIR_DEPS=""
# Environment variable to set a runtime search path
LDLIBRARYPATH_ENVVAR="PATH"
## End Cygwin-specific setup
## -*-sh-*-
## BEGIN of icu-config-bottom. $Revision: 1.9 $
## Copyright (c) 2002-2003, International Business Machines Corporation and
## others. All Rights Reserved.
ICUUC_FILE=${libdir}/${ICULIBS_COMMON_LIB_NAME}
# echo ENABLE RPATH $ENABLE_RPATH and RPATHLDFLAGS=${RPATH_LDFLAGS}
if [ "x$PKGDATA_MODE" = "x" ]; then
PKGDATA_MODE=dll
fi
}
## The actual code of icu-config goes here.
ME=`basename $0`
allflags()
{
echo " --bindir Print binary directory path (bin)"
echo " --cc Print C compiler used [CC]"
echo " --cflags Print C compiler flags [CFLAGS]"
echo " --cflags-dynamic Print additional C flags for"
echo " building shared libraries."
echo " --cppflags Print C Preprocessor flags [CPPFLAGS]"
echo " --cppflags-dynamic Print additional C Preprocessor flags for"
echo " building shared libraries."
echo " --cppflags-searchpath Print only -I include directives (-Iinclude)"
echo " --cxx Print C++ compiler used [CXX]"
echo " --cxxflags Print C++ compiler flags [CXXFLAGS]"
echo " --cxxflags-dynamic Print additional C++ flags for"
echo " building shared libraries."
echo " --detect-prefix Attempt to detect prefix based on PATH"
echo " --exec-prefix Print prefix for executables (/bin)"
echo " --exists Return with 0 status if ICU exists else fail"
echo " --help, -?, --usage Print this message"
echo " --icudata Print shortname of ICU data file (icudt21l)"
echo " --icudata-install-dir Print path to install data to - use as --install option to pkgdata(1)"
echo " --icudata-mode Print default ICU pkgdata mode (dll) - use as --mode option to pkgdata(1)."
echo " --icudatadir Print path to packaged archive data. Can set as [ICU_DATA]"
echo " --invoke Print commands to invoke an ICU program"
echo " --invoke=<prog> Print commands to invoke an ICU program named <prog> (ex: genrb)"
echo " --ldflags Print -L search path and -l libraries to link with ICU [LDFLAGS]. This is for the data, uc (common), and i18n libraries only. "
echo " --ldflags-layout Print ICU layout engine link directive. Use in addition to --ldflags"
echo " --ldflags-libsonly Same as --ldflags, but only the -l directives"
echo " --ldflags-searchpath Print only -L (search path) directive"
echo " --ldflags-system Print only system libs ICU links with (-lpthread, -lm)"
echo " --ldflags-ustdio Print ICU ustdio link directive. Use in addition to --ldflags "
echo " --ldflags-obsolete Print ICU obsolete link directive. Use in addition to --ldflags. (requires icuapps/obsolete to be built and installed.) "
echo " --mandir Print manpage (man) path"
echo " --prefix Print PREFIX to icu install (/usr/local)"
echo " --prefix=XXX Set prefix to XXX for remainder of command"
echo " --sbindir Print system binary path (sbin) "
echo " --shared-datadir Print shared data (share) path. This is NOT the ICU data dir."
echo " --shlib-c Print the command to compile and build C shared libraries with ICU"
echo " --shlib-cc Print the command to compile and build C++ shared libraries with ICU"
echo " --sysconfdir Print system config (etc) path"
echo " --unicode-version Print version of Unicode data used in ICU ($UNICODE_VERSION)"
echo " --version Print ICU version ($VERSION)"
echo " --incfile Print path to Makefile.inc (for -O option of pkgdata)"
}
## Print the normal usage message
shortusage()
{
echo "usage: ${ME} " `allflags | cut -c-25 | sed -e 's%.*%[ & ]%'`
}
usage()
{
echo "${ME}: icu-config: ICU configuration helper script"
echo
echo "The most commonly used options will be --cflags, --cxxflags, --cppflags, and --ldflags."
echo 'Example (in make): CPFLAGS=$(shell icu-config --cppflags)'
echo ' LDFLAGS=$(shell icu-config --ldflags)'
echo " (etc).."
echo
echo "Usage:"
allflags
echo
echo " [Brackets] show MAKE variable equivalents, (parenthesis) show example output"
echo
echo "Copyright (c) 2002, International Business Machines Corporation and others. All Rights Reserved."
}
## Check the sanity of current variables
sanity()
{
if [ ! -f ${ICUUC_FILE} ];
then
echo "### $ME: Can't find ${ICUUC_FILE} - ICU prefix is wrong." 1>&2
echo "### Try the --prefix= or --exec-prefix= options " 1>&2
echo "### or --detect-prefix"
echo "### $ME: Exitting." 1>&2
exit 2
fi
}
## Main starts here.
if [ $# -lt 1 ]; then
shortusage
exit 1
fi
# Load our variables from autoconf
# ALWAYS load twice because of dependencies
loaddefs
loaddefs
sanity
while [ $# -gt 0 ];
do
arg="$1"
var=`echo $arg | sed -e 's/^[^=]*=//'`
# echo "### processing $arg" 1>&2
case "$arg" in
# undocumented.
--debug)
set -x
;;
--so)
echo $SO
;;
--bindir)
echo $bindir
;;
--libdir)
echo $libdir
;;
--exists)
sanity
;;
--sbindir)
echo $sbindir
;;
--invoke=*)
QUOT="'"
CMD="${var}"
# If it's not a locally executable command (1st choice) then
# search for it in the ICU directories.
if [ ! -x ${CMD} ]; then
if [ -x ${bindir}/${var} ]; then
CMD="${bindir}/${var}"
fi
if [ -x ${sbindir}/${var} ]; then
CMD="${sbindir}/${var}"
fi
fi
echo "env ${QUOT}${LDLIBRARYPATH_ENVVAR}=${libdir}:"'${'"${LDLIBRARYPATH_ENVVAR}"'}'${QUOT} ${CMD}
;;
--invoke)
QUOT="'"
echo "env ${QUOT}${LDLIBRARYPATH_ENVVAR}=${libdir}:"'${'"${LDLIBRARYPATH_ENVVAR}"'}'${QUOT}
;;
--cflags)
echo $CFLAGS
;;
--cc)
echo $CC
;;
--cxx)
echo $CXX
;;
--cxxflags)
echo $CXXFLAGS
;;
--cppflags)
# Don't echo the -I. - it's unneeded.
echo $CPPFLAGS | sed -e 's/-I. //'
;;
--cppflags-searchpath)
echo -I${prefix}/include
;;
--cppflags-dynamic)
echo $SHAREDLIBCPPFLAGS
;;
--cxxflags-dynamic)
echo $SHAREDLIBCXXFLAGS
;;
--cflags-dynamic)
echo $SHAREDLIBCFLAGS
;;
--ldflags-system)
echo $LIBS
;;
--ldflags)
echo $LDFLAGS $ICULIBS $LIBS
# $RPATH_LDFLAGS
;;
--ldflags-libsonly)
echo $ICULIBS_I18N $ICULIBS_COMMON $ICULIBS_DATA
;;
--ldflags-ustdio)
echo $ICULIBS_USTDIO
;;
--ldflags-obsolete)
echo $ICULIBS_OBSOLETE
;;
--ldflags-toolutil)
echo $ICULIBS_TOOLUTIL
;;
--ldflags-layout)
echo $ICULIBS_LAYOUT $ICULIBS_LAYOUTEX
;;
--ldflags-searchpath)
echo -L${libdir}
;;
--detect-prefix)
HERE=`echo $0 | sed -e "s/$ME//g"`
if [ -f $HERE/../lib/${ICULIBS_COMMON_LIB_NAME} ]; then
prefix=$HERE/..
echo "## Using --prefix=${prefix}" 1>&2
fi
loaddefs
loaddefs
sanity
;;
--exec-prefix)
echo $exec_prefix
;;
--prefix)
echo $prefix
;;
--prefix=*)
prefix=$var
loaddefs
loaddefs
sanity
;;
--sysconfdir)
echo $sysconfdir
;;
--mandir)
echo $mandir
;;
--shared-datadir)
echo $datadir
;;
--incfile)
echo $pkglibdir/Makefile.inc
;;
--icudata)
echo $ICUDATA_NAME
;;
--icudata-mode)
echo $PKGDATA_MODE
;;
--icudata-install-dir)
case "$PKGDATA_MODE" in
common)
echo "$pkgdatadir"
;;
dll)
echo "$libdir"
;;
*)
echo "## ${ME} Unknown pkgdata mode $PKGDATA_MODE" 1>&2
exit 4
;;
esac
;;
--icudatadir)
echo $pkgdatadir
;;
--shlib-c)
echo $SHLIB_c
;;
--shlib-cc)
echo $SHLIB_cc
;;
--version)
echo $VERSION
;;
--unicode-version)
echo $UNICODE_VERSION
;;
--help)
usage
exit 0
;;
--usage)
usage
exit 0
;;
# --enable-rpath=*)
# ENABLE_RPATH=$var
# loaddefs
# ;;
-?)
usage
exit 0
;;
*)
echo ${ME}: ERROR Unknown Option $arg 1>&2
echo 1>&2
shortusage 1>&2
echo "### $ME: Exitting." 1>&2
exit 1;
;;
esac
shift
done
# Check once before we quit (will check last used prefix)
sanity
## END of icu-config-bottom
exit 0
# Rebuilt on Tue Nov 4 12:14:40 FLEST 2003
--------------040505050400040509030602--