dnl * *************************************************************
dnl *  
dnl *  Licensed to the Apache Software Foundation (ASF) under one
dnl *  or more contributor license agreements.  See the NOTICE file
dnl *  distributed with this work for additional information
dnl *  regarding copyright ownership.  The ASF licenses this file
dnl *  to you under the Apache License, Version 2.0 (the
dnl *  "License"); you may not use this file except in compliance
dnl *  with the License.  You may obtain a copy of the License at
dnl *  
dnl *    http://www.apache.org/licenses/LICENSE-2.0
dnl *  
dnl *  Unless required by applicable law or agreed to in writing,
dnl *  software distributed under the License is distributed on an
dnl *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
dnl *  KIND, either express or implied.  See the License for the
dnl *  specific language governing permissions and limitations
dnl *  under the License.
dnl *  
dnl * *************************************************************
AC_REVISION( $Revision: 1.290 $ )
AC_PREREQ(2.50)
AC_INIT()
echo "$@" >config.parms
AC_ARG_WITH(dmake-path,
[  --with-dmake-path=<PATH TO EXECUTABLE>   Specify the location of dmake ],
[  DMAKE_PATH="$withval"
])
AC_ARG_WITH(dmake-url,
[  --with-dmake-url=<URL>   Specify the location of downloadable dmake source code. For example:
                          http://dmake.apache-extras.org.codespot.com/files/dmake-4.12.tar.bz2
                          Note that dmake is under GPL license.],
[  DMAKE_URL="$withval"
])
AC_ARG_WITH(packager-list,
[  --with-packager-list=<PATH TO PACK LIST>   Specify a file to drive the packaging process.
                          The file must follow the format explained in
                          instsetoo_native/util/pack.lst
],,)
AC_ARG_WITH(gnu-patch,
[  --with-gnu-patch        Specify location of GNU patch on Solaris or FreeBSD
],,)
AC_ARG_WITH(gnu-cp,
[  --with-gnu-cp           Specify location of GNU cp on Solaris
],,)
AC_ARG_WITH(gperf,
[  --with-gperf           Specify location of gperf on Solaris or FreeBSD
],,)
AC_ARG_ENABLE(graphite,
[  --enable-graphite       Enables the compilation of Graphite smart font rendering
],,)
AC_ARG_WITH(system-graphite,
[  --with-system-graphite    use graphite library already installed on system
],,)
AC_ARG_WITH(system-apache-commons,
[  --with-system-apache-commons    use apache-commons jar files already installed on system
],,)
AC_ARG_ENABLE(online-update,
[  --disable-online-update Disables the Online Update feature.
],,enable_online_update=yes)
AC_ARG_ENABLE(ldap,
[  --disable-ldap          Disables the use of LDAP backend via Netscape/Mozilla
                          or OpenLDAP LDAP SDK
],,)
AC_ARG_ENABLE(fetch-external,
[  --disable-fetch-external Disables fetching external tarballs from web sources.
],,)
AC_ARG_WITH(external-tar,
[  --with-external-tar=<TARFILE PATH>   Specify path to tarfiles manually ],
[ TARFILE_LOCATION="$withval"
])
AC_ARG_WITH(openldap,
[  --with-openldap         Enables the use of the OpenLDAP LDAP SDK instead
                          of the Netscape/Mozilla one
],,)
AC_ARG_ENABLE(lockdown,
[  --enable-lockdown       Enables the gconf integration work in OOo
],,)
AC_ARG_ENABLE(vba,
[  --disable-vba           disables the vba compatibility feature
],,)
AC_ARG_WITH(vba-package-format,
[  --with-vba-package-format   specify package format for vba compatibility api.
                          Specifying  "builtin" means the api component and 
                          associated type library are  part of the installation set.
                          Specifying "extn" creates an uno extension that is
                          part of the installation set ( located in the program 
                          directory ) that MUST be optionly registered using
                          either the unopkg executeable or the extension manager
                          gui.
                         
                          Note: "builtin" is the default, "extn" can cause
                          problems.
                          Usage: --with-vba-package-format="builtin" or
                                 --with-vba-package-format="extn"
],,)              
AC_ARG_ENABLE(pch,
[  --enable-pch            EXPERIMENTAL: Enables precompiled header support for C++.
],,)
AC_ARG_WITH(fonts,
[  --without-fonts         OOo includes some third-party fonts to provide a reliable
                          basis for help content, templates, samples, etc.
                          When these fonts are already known to be available on the
                          system then you should use this option.
],,)
AC_ARG_WITH(ppds,
[  --without-ppds          Removes Postscript Printer definition files from
                          Apache Openoffice installation set, for people building
                          for specific distributions where PPDs are known to be
                          already available (every recent distro with CUPS
                          backend)
],,)
AC_ARG_WITH(afms,
[  --without-afms          Removes bitmap font files from Apache Openoffice
                          installation set, for people building for specific
                          distributions where AFM files or TrueType Fonts
                          are known to be available.
],,)
AC_ARG_ENABLE(epm,
[  --disable-epm           OO.o includes self-packaging code, that requires
                          epm, however epm is useless for large scale
                          package building.
],,enable_epm="yes")
AC_ARG_WITH(epm,
[  --with-epm		  Decides which epm to use. Default is to use
			  the one from the system if one is built. When
			  either this is not there or you say =internal
			  epm will be built.
],,)
AC_ARG_WITH(epm-url,
[  --with-epm-url=<URL>    Specify the location of downloadable epm 3.7 source code. For example:
                          http://ftp.easysw.com/pub/epm/3.7/epm-3.7-source.tar.gz
                          Note that epm is under GPL license.],
[  EPM_URL="$withval"
])
AC_ARG_WITH(package-format,
[  --with-package-format   specify package format(s) for OOo installsets.
                          Default is "normal" one of the OS/Distribution.

                          Usage: --with-package-format="foo bar"
],,)                   
AC_ARG_ENABLE(odk,
[  --disable-odk           OO.o includes an ODK, office development kit
                          which some packagers may with to build without
],,enable_odk="yes")
AC_ARG_ENABLE(mathmldtd,
[  --disable-mathmldtd     disable mathmldtd
                          (useful for distributions that want to avoid packaging
                          it)
],,enable_mathmldtd="yes")
AC_ARG_ENABLE(evolution2,
[  --enable-evolution2     Allows the built-in evolution 2 addressbook
                          connectivity build to be enabled.
],,)
AC_ARG_WITH(system-stdlibs,
[  --with-system-stdlibs   use libstdc++/libgcc_s already on system
],,)
AC_ARG_ENABLE(cups,
[  --disable-cups          disable CUPS support (for printing on UNIX)
],,enable_cups=yes)
AC_ARG_ENABLE(fontconfig,
[  --disable-fontconfig    disable support for the fontconfig library
],,enable_fontconfig=yes)
AC_ARG_ENABLE(directx,
[  --disable-directx       Remove DirectX implementation for the new XCanvas
                          interface. The DirectX support requires more stuff
                          installed on Windows to compile.
                          (DirectX SDK, GDI+ libs)
],,enable_directx=yes)
AC_ARG_ENABLE(activex,
[  --disable-activex       Disable the use of ActiveX for windows build.
                          This switch is mandatory when using VC++ 2005/2008 Express.
                          Alternatively you can use the Windows Driver Kit (WDK) and
                          configure with the following switches:
                          --with-atl-include-dir=$WDK_HOME\inc\atl71
                          --with-atl-lib-dir=$WDK_HOME\lib\ATL\i386
                          --with-mfc-include-dir=$WDK_HOME\inc\mfc42
                          --with-mfc-lib-dir=$WDK_HOME\lib\Mfc\i386
],,)

AC_ARG_ENABLE(atl,
[  --disable-atl          Disable the use of ATL for windows build.
                          This switch is mandatory when using VC++ 2005/2008 Express.
                          Alternatively you can use the Windows Driver Kit (WDK) and
                          configure with the following switches:
                          --with-atl-include-dir=$WDK_HOME\inc\atl71
                          --with-atl-lib-dir=$WDK_HOME\lib\ATL\i386
                          --with-mfc-include-dir=$WDK_HOME\inc\mfc42
                          --with-mfc-lib-dir=$WDK_HOME\lib\Mfc\i386
],,)

AC_ARG_WITH(atl-include-dir,
[  --with-atl-include-dir      Path to ATL include directory for windows build.
                          This switch is mandatory when using VC++ 2008 Express
                          and configuring with ATL/ActiveX enabled.
                          You can use the Windows Driver Kit (WDK) and
                          configure with the following switch:
                          --with-atl-include-dir=$WDK_HOME\inc\atl71
],,)

AC_ARG_WITH(atl-lib-dir,
[  --with-atl-lib-dir          Path to ATL libraries directory for windows build.
                          This switch is mandatory when using VC++ 2008 Express
                          and configuring with ATL/ActiveX enabled.
                          You can use the Windows Driver Kit (WDK) and
                          configure with the following switch:
                          --with-atl-lib-dir=$WDK_HOME\lib\ATL\i386
],,)

AC_ARG_WITH(mfc-include-dir,
[  --with-mfc-include-dir       Path to MFC include directory for windows build.
                          This switch is mandatory when using VC++ 2008 Express
                          and configuring with ATL/ActiveX enabled.
                          You can use the Windows Driver Kit (WDK) and
                          configure with the following switch:
                          --with-mfc-include-dir=$WDK_HOME\inc\mfc42
],,)

AC_ARG_WITH(mfc-lib-dir,
[  --with-mfc-lib-dir          Path to MFC libraries directory for windows build.
                          This switch is mandatory when using VC++ 2008 Express
                          and configuring with ATL/ActiveX enabled.
                          You can use the Windows Driver Kit (WDK) and
                          configure with the following switch:
                          --with-mfc-lib-dir=$WDK_HOME\lib\Mfc\i386
],,)


AC_ARG_ENABLE(symbols,
[  --enable-symbols        Include debugging symbols in output.
                          WARNING - a complete build needs 8 Gb of space and
                          takes much longer. (enables -g compiler flag)

                          --enable-symbols=SMALL sets the gcc -g1 setting
                          which is smaller.

                          Enabling symbols disables the stripping of the solver
                          (--disable-strip-solver).
],,)
AC_ARG_ENABLE(strip-solver,
[  --disable-strip-solver  Disable the stripping of the solver.
                          By default the solver is stripped unless a build with
                          debugging symbols (--enable-symbols) is requested.

                          This switch allows to override this setting.
],,)
AC_ARG_ENABLE(werror,
[  --enable-werror         Turn warnings to errors. (Has no effect in modules
                          where the treating of warnings as errors is disabled
                          explicitly)
],,)
AC_ARG_ENABLE(debug,
[  --enable-debug          Include debugging symbols from --enable-symbols
                          plus extra debugging code.  Extra large build!
                          (enables -g compiler flag and dmake debug=true)
],,)
AC_ARG_ENABLE(dbgutil,
[  --enable-dbgutil        Include additional debugging utilities, such as
                          assertions, object counting, etc. Larger build.
                          Independent from --enable-debug
],,)
AC_ARG_ENABLE(crashdump,
[  --enable-crashdump      Enable the crashdump feature code.
],,)
AC_ARG_ENABLE(cl-standard,
[  --enable-cl-standard    For Microsoft C/C++ compiler users, use non-optimizing
                          standard compiler. ( This just disables optimization
                          options and therefore removes a lot of warnings when
                          using the cheaper standard compiler. )
],,)
AC_ARG_ENABLE(gtk,
[  --disable-gtk           Determines whether to use Gtk+ vclplug on platforms
                          where Gtk+ is available.
],,enable_gtk=yes)
AC_ARG_ENABLE(gstreamer,
[  --enable-gstreamer      Determines whether to use the GStreamer media
                          backend on platforms where GStreamer is available.
],,enable_gstreamer=no)
AC_ARG_ENABLE(systray,
[  --disable-systray       Determines whether to build the systray quickstarter.
],,enable_systray=yes)
AC_ARG_ENABLE(cairo,
[  --enable-cairo          Determines whether to use Cairo library on
                          platforms where Cairo is available.
],,enable_cairo=no)
AC_ARG_WITH(system-cairo,
[  --with-system-cairo      Use Cairo libraries already on system
],,)
AC_ARG_ENABLE(cairo-canvas,
[  --disable-cairo-canvas  Determines whether to build the Cairo canvas on
                          platforms where Cairo is available.
],,enable_cairo_canvas=yes)
AC_ARG_ENABLE(opengl,
[  --enable-opengl         Determines whether to build the OpenGL 3D slide 
                          transitions component
],,enable_opengl=no)
AC_ARG_ENABLE(dbus,
[  --enable-dbus           Determines whether to enable presentation mode 
                          screensaver control under GNOME via DBUS 
],,enable_dbus=no)
AC_ARG_ENABLE(gconf,
[  --disable-gconf         Determines whether to use the GConf support
],,enable_gconf=yes)
AC_ARG_ENABLE(gnome-vfs,
[  --disable-gnome-vfs     Determines whether to use the Gnome Virtual Filing
                          System on platforms where that VFS is available
],,enable_gnome_vfs=yes)
AC_ARG_ENABLE(gio,
[  --enable-gio            Determines whether to use the GIO support
],,enable_gio=no)
AC_ARG_ENABLE(static-gtk,
[  --enable-static-gtk     Modules that are linked against gtk libraries use
                          the static libraries instead of the dynamic ones. 
                          (enables -Bstatic linker flag for gtk libraries)
],,)
AC_ARG_ENABLE(layout,
[  --enable-layout         Enable the compilation and use of layout dialogs
],,)
AC_ARG_ENABLE(mozilla,
[  --disable-mozilla       OO.o usually includes a strangely hacked up mozilla
                          binary for your platform, to build without this
                          version, use this option.
],,enable_mozilla="yes")
AC_ARG_ENABLE(build-mozilla,
[  --disable-build-mozilla Use this option if you do not want to build the
                          mozilla components from the mozilla source code but
                          take precompiled zips
],,)
AC_ARG_WITH(mozilla-version,
[  --with-mozilla-version  Choose which version of mozilla to use while building
                          mozilla. Default: 1.7.5.
                          Note that not all versions are supported.
],,)
AC_ARG_WITH(mozilla-toolkit,
[  --with-mozilla-toolkit  Choose which GUI toolkit to use while building mozilla
                          components. Default: gtk2
],,)
AC_ARG_WITH(system-mozilla,
[  --with-system-mozilla   Use mozilla already on system. Note that some
                          components cannot be built against a contemporary
                          mozilla. The flavour used can be specified by
                          --with-system-mozilla=<flavour>. Supported are:
                          libxul (default), xulrunner, firefox, seamonkey,
                          mozilla
], WITH_SYSTEM_MOZILLA=$withval, WITH_SYSTEM_MOZILLA=no)
AC_ARG_ENABLE(nss_module,
[  --disable-nss-module    Whether to use provided NSS module     
],,enable_nss_module=yes)
AC_ARG_ENABLE(kde,
[  --enable-kde            Determines whether to use Qt/KDE vclplug on platforms
                          where Qt and KDE are available.
],,)
AC_ARG_ENABLE(kdeab,
[  --disable-kdeab         Disable the KDE address book support
],,if test "$enable_kde" = "yes"; then enable_kdeab=yes; fi)
AC_ARG_ENABLE(kde4,
[  --enable-kde4            Determines whether to use Qt4/KDE4 vclplug on platforms
                          where Qt4 and KDE4 are available. May be used with --enable-kde 
                          if you want to support both KDE3 and KDE4.
],,)
AC_ARG_ENABLE(binfilter,
[  --enable-binfilter      Enable legacy binary file formats filters
],,enable_binfilter=yes)
AC_ARG_ENABLE(rpath,
[  --disable-rpath         Disable the use of relative paths in shared libraries
],,)
AC_ARG_ENABLE(pam,
[  --disable-pam           Disable pam support.
],,)
AC_ARG_ENABLE(pam-link,
[  --enable-pam-link       link with libpam instead of dynamically open it
],,)
AC_ARG_ENABLE(crypt-link,
[  --disable-crypt-link    disable linking with libcrypt instead of dynamically
                          open it (needed for ancient GNU/Linux distributions
                          without crypt()/libcrypt)
],,enable_crypt_link=yes)
AC_ARG_ENABLE(xrender-link,
[  --enable-xrender-link   link with libXrender instead of dynamically open it
],,)
AC_ARG_ENABLE(randr,
[  --disable-randr         disable RandR support in the vcl project
],,enable_randr=yes)
AC_ARG_ENABLE(randr-link,
[  --disable-randr-link    disable linking with libXrandr, instead dynamically 
                           open it at runtime
],,enable_randr_link=yes)
AC_ARG_WITH(bundled-extension-blobs,
[  --with-bundled-extension-blobs Whitespace seperated list of files in the tarball directory
                          that are to be bundled as-is for installation as extensions
                          at the first program start. Make sure to only bundle extensions
                          which can be installed without requiring a license dialog
                          and comply with their distribution requirements by updating the
                          files LICENSE_aggregated and NOTICE_aggregated accordingly
],,)
#AC_ARG_WITH(bundled-prereg-extensions,
#[  --with-bundled-prereg-extensions Whitespace seperated list of files in the tarball directory that
#                          are to be bundled as pre-registered extensions. Make sure to only bundle
#                          extensions which can be installed without requiring a license dialog
#],,)
AC_ARG_ENABLE(bundled-dictionaries,
[  --enable-bundled-dictionaries  Download dictionaries (spelling, hyphenation, thesaurus)
                           according to main/extensions.lst and bundle them. Make sure to
                           comply with their distribution requirements and update the
                           files LICENSE_aggregated and NOTICE_aggregated accordingly
],,enable_bundled_dictionaries=no)

# Remove the following switches when not in release mode.
AC_ARG_WITH(system-dicts,
[  --with-system-dicts    Use dictionaries from system paths- Specify
                         them via --with-{dict,hyph,thes}-path=/path
                        if you want to override the default ones
],,)
AC_ARG_WITH(external-dict-dir,
[  --with-external-dict-dir Specify external dictionary dir
],,)
AC_ARG_WITH(external-hyph-dir,
[  --with-external-hyph-dir Specify external hyphenation pattern dir
],,)
AC_ARG_WITH(external-thes-dir,
[  --with-external-thes-dir Specify external thesaurus dir
],,)
# End of remove.


AC_ARG_WITH(system-libs,
[  --with-system-libs      Use libs already on system -- enables all
                          --with-system-* flags except mozilla and
                          odbc/sane/xrender-header(s)
],,)
AC_ARG_WITH(system-headers,
[  --with-system-headers   Use headers already on system -- enables all
                          --with-system-* flags for external packages
                          whose headers are the only entities used i.e.
                          boost/vigra/odbc/sane/xrender-header(s)
],,)
AC_ARG_WITH(system-jars,
[  --without-system-jars   When building with --with-system-libs, also the
                          needed jars are expected on the system. Use this to
                          disable that. 
                          (except for the db case where --with-system-db
                          *has to* imply using the db.jar from there, too)
],,)
AC_ARG_WITH(system-zlib,
[  --with-system-zlib      Use zlib already on system
],,)
AC_ARG_WITH(system-openssl,
[  --with-system-openssl   Use OpenSSL already on system
],,)
AC_ARG_WITH(system-jpeg,
[  --with-system-jpeg      Use jpeg already on system
],,)
AC_ARG_WITH(system-expat,
[  --with-system-expat     Use expat already on system
],,)
AC_ARG_WITH(system-libwpd,
[  --with-system-libwpd    Use libwpd already on system
],,)
AC_ARG_WITH(system-libxml,
[  --with-system-libxml    Use libxml already on system
],,)
AC_ARG_WITH(system-python,
[  --with-system-python    Use python already on system
],,)
AC_ARG_WITH(system-icu,
[  --with-system-icu       Use icu already on system
],,)
AC_ARG_WITH(system-poppler,
[  --with-system-poppler   Use poppler already on system
],,)
AC_ARG_WITH(system-lucene,
[  --with-system-lucene    Use lucene already on system
],,)
AC_ARG_WITH(lucene-core-jar,
[  --with-lucene-core-jar=JARFILE   Specify path to jarfile manually ],
[ LUCENE_CORE_JAR="$withval"
])
AC_ARG_WITH(lucene-analyzers-jar,
[  --with-lucene-analyzers-jar=JARFILE   Specify path to jarfile manually ],
[ LUCENE_ANALYZERS_JAR="$withval"
])
AC_ARG_ENABLE(mysql-connector,
[  --enable-mysql-connector     enables the build of the MySQL Connector/OOo extension.
                                This requires access to the MySQL Connector/C (aka libmysql) to be given, too, with
                                either the --with-system-mysql or --with-libmysql-path option.
],,)
AC_ARG_WITH(system-mysql,
[  --with-system-mysql          Use MySQL libraries already on system, for building the MySQL Connector/OOo extension.
                                Requires MYSQLCONFIG to point to the mysql_config executable.
],,)
AC_ARG_WITH(libmysql-path,
[  --with-libmysql-path         Use Connector/C (libmysql) installation for building the MySQL Connector/OOo extension.

                                Usage: --with-libmysql-path=<absolute path to your Connector/C installation>
],,)
AC_ARG_WITH(system-mysql-cppconn,
[  --with-system-mysql-cppconn  Use MySQL C++ Connector libraries already on system
],,)
AC_ARG_WITH(system-hsqldb,
[  --with-system-hsqldb    Use hsqldb already on system
],,)
AC_ARG_WITH(hsqldb-jar,
[  --with-hsqldb-jar=JARFILE   Specify path to jarfile manually ],
[ HSQLDB_JAR="$withval"
])
AC_ARG_WITH(system-beanshell,
[  --with-system-beanshell Use beanshell already on system (default)
],,)
AC_ARG_ENABLE(beanshell,
[  --disable-beanshell     Disable the use of beanshell.
],,)
AC_ARG_WITH(beanshell-jar,
[  --with-beanshell-jar=JARFILE   Specify path to jarfile manually ],
[ BSH_JAR="$withval"
])
AC_ARG_ENABLE(minimizer,
[  --enable-minimizer          enables the build of the Presentation Minimizer extension
],,)
AC_ARG_ENABLE(presenter-console,
[  --enable-presenter-console          enables the build of the Presenter Console extension
],,)
AC_ARG_ENABLE(pdfimport,
[  --enable-pdfimport          enables the build of the PDF Import extension
],,)
AC_ARG_ENABLE(wiki-publisher,
[  --enable-wiki-publisher      enables the build of the Wiki Publisher extension
],,)
AC_ARG_WITH(commons-codec-jar,
[  --with-commons-codec-jar=JARFILE   Specify path to jarfile manually ],
[ COMMONS_CODEC_JAR="$withval"
])
AC_ARG_WITH(commons-lang-jar,
[  --with-commons-lang-jar=JARFILE   Specify path to jarfile manually ],
[ COMMONS_LANG_JAR="$withval"
])
AC_ARG_WITH(commons-httpclient-jar,
[  --with-commons-httpclient-jar=JARFILE   Specify path to jarfile manually ],
[ COMMONS_HTTPCLIENT_JAR="$withval"
])
AC_ARG_WITH(commons-logging-jar,
[  --with-commons-logging-jar=JARFILE   Specify path to jarfile manually ],
[ COMMONS_LOGGING_JAR="$withval"
])
AC_ARG_WITH(servlet-api-jar,
[  --servlet-api-jar=JARFILE   Specify path to jarfile manually ],
[ SERVLETAPI_JAR="$withval"
])
AC_ARG_ENABLE(report-builder,
[  --enable-report-builder  enables the build of the Report Builder extension
],,)
AC_ARG_WITH(sac-jar,
[  --with-sac-jar=JARFILE   Specify path to jarfile manually (for Report Builder extension) ],
[ SAC_JAR="$withval"
])
AC_ARG_WITH(libxml-jar,
[  --with-libxml-jar=JARFILE   Specify path to jarfile manually (for Report Builder extension) ],
[ LIBXML_JAR="$withval"
])
AC_ARG_WITH(flute-jar,
[  --with-flute-jar=JARFILE   Specify path to jarfile manually (for Report Builder extension) ],
[ FLUTE_JAR="$withval"
])
AC_ARG_WITH(jfreereport-jar,
[  --with-jfreereport-jar=JARFILE   Specify path to jarfile manually (for Report Builder extension) ],
[ JFREEREPORT_JAR="$withval"
])
AC_ARG_WITH(liblayout-jar,
[  --with-liblayout-jar=JARFILE   Specify path to jarfile manually (for Report Builder extension) ],
[ LIBLAYOUT_JAR="$withval"
])
AC_ARG_WITH(libloader-jar,
[  --with-libloader-jar=JARFILE   Specify path to jarfile manually (for Report Builder extension) ],
[ LIBLOADER_JAR="$withval"
])
AC_ARG_WITH(libloader-jar,
[  --with-libloader-jar=JARFILE   Specify path to jarfile manually (for Report Builder extension) ],
[ LIBLOADER_JAR="$withval"
])
AC_ARG_WITH(libformula-jar,
[  --with-libformula-jar=JARFILE   Specify path to jarfile manually (for Report Builder extension) ],
[ LIBFORMULA_JAR="$withval"
])
AC_ARG_WITH(librepository-jar,
[  --with-librepository-jar=JARFILE   Specify path to jarfile manually (for Report Builder extension) ],
[ LIBREPOSITORY_JAR="$withval"
])
AC_ARG_WITH(libfonts-jar,
[  --with-libfonts-jar=JARFILE   Specify path to jarfile manually (for Report Builder extension) ],
[ LIBFONTS_JAR="$withval"
])
AC_ARG_WITH(libserializer-jar,
[  --with-libserializer-jar=JARFILE   Specify path to jarfile manually (for Report Builder extension) ],
[ LIBSERIALIZER_JAR="$withval"
])
AC_ARG_WITH(libbase-jar,
[  --with-libbase-jar=JARFILE   Specify path to jarfile manually (for Report Builder extension) ],
[ LIBBASE_JAR="$withval"
])
AC_ARG_WITH(system-saxon,
[  --with-system-saxon     Use saxon already on system (default)
],,)
AC_ARG_ENABLE(saxon,
[  --disable-saxon         Disable use of saxon
],,)
AC_ARG_WITH(saxon-jar,
[  --with-saxon-jar=JARFILE   Specify path to jarfile manually. This implies --with-system-saxon ],
[ SAXON_JAR="$withval"
])
AC_ARG_WITH(system-libxslt,
[  --with-system-libxslt   Use libxslt already on system
],,)
AC_ARG_WITH(system-odbc,
[  --with-system-odbc-headers     Use the odbc headers already on system
],,)
AC_ARG_WITH(system-sane,
[  --with-system-sane-header      Use sane.h already on system
],,)
AC_ARG_WITH(system-xrender,
[  --with-system-xrender-headers  Use XRender headers already on system
],,)
AC_ARG_WITH(system-curl,
[  --with-system-curl      Use curl already on system
],,)
AC_ARG_WITH(system-boost,
[  --with-system-boost     Use boost already on system
],,)
AC_ARG_WITH(system-mdds,
[  --with-system-mdds      Use mdds already on system
],,)
AC_ARG_WITH(system-vigra,
[  --with-system-vigra     Use vigra already on system
],,)
AC_ARG_ENABLE(Xaw,
[  --disable-Xaw           Disables the use of Xaw for the Netscape/Mozilla
                           plugin
],,)
AC_ARG_ENABLE(hunspell,
[  --enable-hunspell       Determines whether to enable the Hunspell library.
                          If enabled, the library will be built unless you
                          specify --with-system-hunspell to use the library
                          already present on your system.
                          If disabled, the Spell Checking component will also
                          be disabled.
                          (Default: hunspell disabled)
],,enable_hunspell=no)
AC_ARG_WITH(system-hunspell,
[  --with-system-hunspell  Use libhunspell already on system
],,)
AC_ARG_WITH(system-mythes,
[  --with-system-mythes    Use mythes already on system
],,)
AC_ARG_ENABLE(hyphen,
[  --enable-hyphen         Determines whether to enable the Hyphen library.
                          If enabled, the library will be built unless you
                          specify --with-system-hyphen to use the library
                          already present on your system.
                          If disabled, the Hyphenator component will also
                          be disabled.
                          (Default: hyphen disabled)
],,enable_hyphen=no)
AC_ARG_WITH(system-hyphen,
[  --with-system-hyphen    Use libhypeh already on system
],,)
AC_ARG_WITH(system-libtextcat,
[  --with-system-libtextcat      Use libtextcat already on system
],,)
AC_ARG_WITH(external-libtextcat-data,
[  --with-system-libtextcat-data Use libtextcat data already on system
],,)
AC_ARG_WITH(system-cppunit,
[  --with-system-cppunit         Use cppunit already on system
],,)
AC_ARG_WITH(system-redland,
[  --with-system-redland   Use redland library already on system
],,)
AC_ARG_WITH(stlport,
[  --with-stlport         The location that STLport is installed in. The STL
                          header files are assumed to be in
                          stlport-home/stlport and the STLPort library in
                          stlport-home/lib.

                          Usage: --with-stlport=<absolute path to stlport home>

                          Warning: disabling using --without-stlport or 
                          enabling using --with-stlport on a platform that
                          defaults to the opposite will break ABI compatibility
], WITH_STLPORT=$withval , WITH_STLPORT=auto)
AC_ARG_WITH(jdk-home,
[  --with-jdk-home         if you have installed JDK 1.3 or later on your system
                          please supply the path here.
                          Note that this is not the location of the Java binary
                          but the location of the entire distribution.
 
                          Usage: --with-jdk-home=<absolute path to JDK home>
],,)
AC_ARG_WITH(gxx_include_path,
[  --with-gxx-include-path if you want to override the autodetected g++ include
                          path.
 
                          Usage: --with-gxx-include-path=<absolute path to g++ include dir>
],,)
AC_ARG_WITH(java,
[  --with-java             Build with[[out]] Java support.  If you use
                          --without-java/--with-java=no then the build will have
                          no support for Java components, applets, accessibility
                          or XML filters. 
], if test "$withval" = "yes"; then WITH_JAVA=java; else WITH_JAVA=$withval; fi, WITH_JAVA=java)
AC_ARG_ENABLE(gcjaot,
[  --enable-gcjaot         Build with[[out]] using Ahead of Time java compilation
                          support to speed up buildsi by compiling the jars also
                          to native code..
                          --enable-gcjaot is only known to work with bytecode
                          created with gcj or ecj
],,)
AC_ARG_WITH(ant-home,
[  --with-ant-home         If you have installed Jakarta Ant on your system,
                          please supply the path here.
                          Note that this is not the location of the Ant binary
                          but the location of the entire distribution.
 
                          Usage: --with-ant-home=<absolute path to Ant home>
],,)
AC_ARG_WITH(junit,
[  --with-junit            Specifies the JUnit 4 jar file to use for JUnit-based
                          tests.  --without-junit disables those tests.  Not
                          relevant in the --without-java case.

                          Usage: --with-junit=<absolute path to JUnit 4 jar>
],,with_junit=yes)
AC_ARG_WITH(perl-home,
[  --with-perl-home        If you have installed the Perl 5 Distribution, on your
                          system, please supply the path here.
                          Note that this is not the location of the Perl binary
                          but the location of the entire distribution.
 
                          Usage: --with-perl-home=<absolute path to Perl 5 home>
],,)
AC_ARG_WITH(cl-home,
[  --with-cl-home          For Windows NT users, please supply the path
                          for the Microsoft C/C++ compiler. 
                          Note that this is not the location of the compiler
                          binary but the location of the entire distribution.
 
                          Usage: --with-cl-home=<absolute path to Microsoft C/C++ compiler home>
],,)
AC_ARG_WITH(mspdb-path,
[  --with-mspdb-path       For Microsoft C/C++ compiler users, please supply the
                          path pointing to the mspdb71.dll (.NET 2003).
 
                          Usage: --with-mspdb-path=<absolute path to mspdb71.dll>
],,)
AC_ARG_WITH(midl-path,
[  --with-midl-path        For Microsoft C/C++ .NET compiler users, please supply
                          the path pointing to the midl.exe.
 
                          Usage: --with-midl-path=<absolute path to midl.exe>
],,)
AC_ARG_WITH(csc-path,
[  --with-csc-path         For Microsoft C/C++ .NET compiler users, please supply
                          the path pointing to the csc.exe.
 
                          Usage: --with-csc-path=<absolute path to csc.exe>
],,)
AC_ARG_WITH(nsis-path,
[  --with-nsis-path        For Windows users, please supply the path to the
                          "Nullsoft Scriptable Install System" (NSIS). If NSIS
                          is found in the path or this option is supplied a self
                          contained executable installer for Apache OpenOffice
                          will be created.

                          Usage: --with-nsis-path=<absolute path to nsis.exe>
],,)
AC_ARG_WITH(frame-home,
[  --with-frame-home       For Microsoft C/C++ .NET compiler users, please supply
                          the path pointing to lib/mscoree.lib, usually
                          something like:
                          "/cygdrive/c/Program Files/Microsoft Visual Studio .NET/FrameworkSDK"

                          MS Visual Toolkit compiler users, please supply the
                          path pointing to lib/msvcrt.lib, usually something
                          like:
                          "/cygdrive/c/Program Files/Microsoft Visual Studio .NET 2003/Vc7"

                          Usage: --with-frame-home=<absolute path to Framework SDK [[home]]>
],,)
AC_ARG_WITH(psdk-home,
[  --with-psdk-home        For Windows users, please supply the path to the
                          Microsoft Platform SDK.
 
                          Usage: --with-psdk-home=<absolute path to Microsoft Platform SDK>
],,)
AC_ARG_WITH(directx-home,
[  --with-directx-home     For Windows users, please supply the path to the
                          Microsoft DirectX SDK.
 
                          Usage: --with-directx-home=<absolute path to Microsoft DirectX SDK>
],,)
AC_ARG_WITH(mozilla-build,
[  --with-mozilla-build    For Windows users, please supply the path to the
                          mozilla build tools.
 
                          Usage: --with-mozilla-build=<absolute path to mozilla build tools>

						  At the moment of this writing, an installer for the mozilla build tools
						  can be obtained from http://ftp.mozilla.org/pub/mozilla.org/mozilla/libraries/win32.
],[MOZILLABUILD=$withval],)
AC_ARG_WITH(local-solenv,
[  --with-local-solenv     If you have solenv in a location other than ./solenv,
                          please supply the path here.
 
                          Usage: --with-local-solenv=<absolute path to solenv>
],,)
AC_ARG_WITH(local-solver,
[  --with-local-solver     if you have solver in a location other than ./solver,
                          please supply the path here.
 
                          Usage: --with-local-solver=<absolute path to solver>
],,)
AC_ARG_ENABLE(javascript,
[  --disable-javascript    Disables support for JavaScript macros.
],,)
AC_ARG_WITH(system-apr,
[  --with-system-apr       Use apr library already installed on the system
],,)
AC_ARG_WITH(system-apr-util,
[  --with-system-apr-util  Use apr-util library already installed on the system
],,)
AC_ARG_WITH(system-serf,
[  --with-system-serf      Use serf library already installed on the system
],,)
AC_ARG_WITH(system-coinmp,
[  --with-system-coinmp    Use CoinMP library already installed on the system
],,)
AC_ARG_ENABLE(coinmp,
[  --disable-coinmp        Do not use CoinMP as the Calc solver.
],,)
AC_ARG_ENABLE(check-only,
[  --enable-check-only     Use this option option if you just want to check your
                          environment.  This option stops the generation of an 
                          ????env.set
 
                          Usage: --enable-check-only=yes
],,)
AC_ARG_ENABLE(ccache-skip,
[[  --enable-ccache-skip    [default=auto] allow the use of --ccache-skip to 
                          escape compiler flags that would otherwise prevent 
                          caching of the result (currently used on Mac only)
                          NOTE: requires patched version because of a bug in
                          ccache (see issue 104567 for details and patch) 
                          explicitly enable if your version of ccache does not 
                          identify as version 2.4_OOo
]],,enable_ccache_skip=auto)
AC_ARG_WITH(lang,
[  --with-lang             Use this option to build Apache OpenOffice with
                          additional language support. English (US) is always
                          included by default. Separate multiple languages with
                          space. For all languages, use --with-lang=ALL.

                          Usage: --with-lang="es sw tu cs sk"
],,)
AC_ARG_WITH(poor-help-localizations,
[  --with-poor-help-localizations
                           Use this option to specify which languages have
                          unusable help localizations. Separate multiple
                          languages with space.

                          Usage: --with-poor-help-localizations="af ar be-BY ca"
],,)
AC_ARG_WITH(dict,
[  --with-dict             Use this option to build Apache OpenOffice with
                          dictionary support. ALL dictionaries are always
                          included by default unless overridden with
                          this option. Separate multiple dictionaries with
                          commas. For all dictionaries, use --with-dict=ALL.

                          Usage: --with-dict=ENGB,ENUS,ITIT
],,)
AC_ARG_WITH(intro-bitmaps,
[  --with-intro-bitmaps    Prefer the specified intro bitmaps over the
                          the default one.  Can be more than one (separated by
                          commas), the order means priority of fallback if the
                          first does not exist (in the installed tree).

                          Usage: --with-intro-bitmaps=/path/my_ooo_intro.bmp
],,)
AC_ARG_WITH(about-bitmaps,
[  --with-about-bitmaps    Similarly to --with-intro-bitmaps, this allows
                          specification of bitmaps for the About box.

                          Usage: --with-about-bitmaps=/path/my_ooo_about.bmp
],,)
AC_ARG_WITH(vendor,
[  --with-vendor           Set vendor of the build.

                          Usage: --with-vendor="John the Builder"
],,)
AC_ARG_WITH(unix-wrapper,
[  --with-unix-wrapper    Redefines the name of the UNIX wrapper that will be used
                          in the desktop files and in the desktop-integration RPMs.

                          Usage: --with-unix-wrapper=ooffice
],,)
AC_ARG_WITH(asm-home,
[  --with-asm-home         For Windows users, please supply the path for the
                          ml.exe assembler.

                          Usage: --with-asm-home=<path to ml.exe directory>
],,)
AC_ARG_WITH(os-version,
[  --with-os-version       For FreeBSD users, use this option option to override
                          the detected OSVERSION.

                          Usage: --with-os-version=<OSVERSION>
],,)
AC_ARG_WITH(unzip-home,
[  --with-unzip-home       Deprecated: use --with-zip-home instead],,)
AC_ARG_WITH(zip-home,
[  --with-zip-home         If you use a non standard zip, for example windows
                          please supply the path for zip

                          Usage: --with-zip-home=<path to zip executable>
],,)
AC_ARG_WITH(mingwin,
[  --with-mingwin          For Windows users, use the mingwin32 compiler within
                          cygwin environment

                          Usage: --with-mingwin=yes

                          For !Windows use, use the mingw32 C++ compiler to
                          (re-) build unowinreg.dll. Specify the MinGW C++
                          Compilers name.

                          Usage: --with-mingwin=i586-mingw32msvc-g++
],WITH_MINGWIN=$withval,WITH_MINGWIN=0)
AC_ARG_WITH(build-version,
[  --with-build-version    Allows the builder to add a custom version tag
                          that will appear in the Help/About box for QA
                          purposes.

                          Usage: --with-build-version="Built by Jim"
],with_build_version=$withval)
AC_ARG_WITH(alloc,
[  --with-alloc            Define which allocator to build with
                          (choices are oo, system, tcmalloc, jemalloc)

                          Note that on FreeBSD/NetBSD system==jemalloc
],,)
AC_ARG_ENABLE(verbose,
[  --enable-verbose        Increase build verbosity.
  --disable-verbose       Decrease build verbosity.
],,)
AC_ARG_ENABLE(dependency-tracking,
[  --disable-dependency-tracking  Disables generation of dependency information.
],,)
AC_ARG_ENABLE(category-b,
[  --enable-category-b     Activate components under a category B license 
                          (see http://www.apache.org/legal/3party.html#category-b):
                          MPL (seamonkey, hunspell, hyphen, nss, saxon, rhino),
                          CPL (silgraphite), CPL/EPL (CoinMP), SPL (beanshell),
                          OFL (fonts).
                          Flags for individual libraries override this one.
],,)
AC_ARG_WITH(arm-target,
[  --arm-target            The minimal targeted arm processor
                              used for the build environment.
                              Cases :
                                arm-target < 6 : armv4t compatibility
                                arm-target = 6 : exact armv6 compatibility
                                arm-target > 6 : armv7-a compatibility

                              Usage: --with-arm-target=7
],with_arm_target=$withval,with_arm_target=4)
AC_ARG_WITH(rat-scan,
[  --with-rat-scan         Scan source code for license headers.
                          Use as --with-rat-scan to automatically download pre-built Rat binaries.
                          Alternatively use as --with-rat-scan=<path-to-rat-direcetory> to use
                          a separately installed library.
],with_rat_scan=$withval,)

BUILD_TYPE="OOo"
ADDITIONAL_REPOSITORIES="../ext_libraries"
SCPDEFS=""

dnl ===================================================================
dnl Check configure script vs. configure.in
dnl ===================================================================
AC_MSG_CHECKING([whether configure is up-to-date])
if test "configure" -ot "configure.in"; then
   AC_MSG_RESULT([no])
   AC_MSG_ERROR([configure is not up-to-date, run autoconf first!])
else
   AC_MSG_RESULT([yes])
fi
dnl ===================================================================
dnl Message.
dnl ===================================================================
echo "********************************************************************"
echo "*                                                                  *"
echo "*   Apache OpenOffice build configuration.                         *"
echo "*                                                                  *"
echo "*   The configure process checks your platform to see whether      *"
echo "*   you can build Apache OpenOffice on it.                         *"
echo "*   This process checks all pre-requisites and generates a file    *"
echo "*   containing the necessary environment variables.                *"
echo "*   Source this file after configure has ended successfully.       *"
echo "*                                                                  *"
echo "*   Warnings that are generated during the configure process       *"
echo "*   must be taken into account since it can be a reason for        *"
echo "*   an unsuccessful build of Apache OpenOffice.                    *"
echo "*                                                                  *"
echo "********************************************************************"
echo ""
echo "********************************************************************"
echo "*                                                                  *"
echo "*   Checking the platform pre-requisites.                          *"
echo "*                                                                  *"
echo "********************************************************************"
echo ""
dnl ===================================================================
dnl Configure pre-requisites.
dnl ===================================================================
cat /dev/null > warn

AC_PROG_EGREP
AC_PROG_AWK
AC_PATH_PROG( AWK, $AWK)
if test -z "$AWK"; then
   AC_MSG_ERROR([install awk to run this script])
fi

AC_PATH_PROGS(SED, sed )
if test -z "$SED"; then
   AC_MSG_ERROR([install sed to run this script])
fi

AC_MSG_CHECKING([for solenv environment])
if test -z "$with_local_solenv"; then
   LOCAL_SOLENV="DEFAULT"
   AC_MSG_RESULT([default])
else
   LOCAL_SOLENV=$with_local_solenv
   AC_MSG_RESULT([$with_local_solenv])
fi
AC_SUBST(LOCAL_SOLENV)

if test "$LOCAL_SOLENV" = "DEFAULT"; then 
  _solenv="./solenv"
else
  _solenv="$LOCAL_SOLENV"
fi
AC_SUBST(_solenv)

if test -e $_solenv/inc/minor.mk; then
   # Get UPD number from ./solenv/inc/minor.mk
   UPD="`grep RSCVERSION= $_solenv/inc/minor.mk | $AWK -F"=" '{ print $2 }'`"
   AC_SUBST(UPD)
   SOURCEVERSION="`grep SOURCEVERSION= $_solenv/inc/minor.mk | $AWK -F"=" '{ print $2 }'`"
   AC_SUBST(SOURCEVERSION)
else
   AC_MSG_ERROR([$_solenv/inc/minor.mk missing but needed for architecture/os detecion and proper environment script generation...])
fi


dnl ==================================================================
dnl Checks for custom pack.lst
dnl ==================================================================
AC_MSG_CHECKING([for custom pack.lst])
CUSTOM_PACK_LIST=
USE_PACKAGER=
if test -n "$with_packager_list" ; then
    if test -e $with_packager_list; then
      CUSTOM_PACK_LIST=$with_packager_list
      USE_PACKAGER=YES
    fi
fi
if test -n "$CUSTOM_PACK_LIST"; then
   AC_MSG_RESULT([$CUSTOM_PACK_LIST])
else
   AC_MSG_RESULT([no])
fi
AC_SUBST(CUSTOM_PACK_LIST)
AC_SUBST(USE_PACKAGER)


dnl ===================================================================
dnl Checks for the operating system and processor.
dnl ===================================================================
AC_CANONICAL_SYSTEM
if test "$build" != "$host" -o "$build" != "$target" \
  -o "$host" != "$target"; then
	AC_MSG_WARN([cross-compiling by any means is not supported (yet)!])
	echo "cross-compiling by any means is not supported (yet)!" >> warn
fi

if echo "$build_os" | grep cygwin; then
   AC_MSG_CHECKING([Cygwin version])
   CygwinVer=`uname -r`
   AC_MSG_RESULT([$CygwinVer])
   if test "`echo $CygwinVer | $AWK -F . '{ print $1$2 }'`" -lt "15"; then
      AC_MSG_ERROR([You need at least Cygwin V1.5.x])
   fi
else
   CygwinVer="false"
fi

dnl ===================================================================
dnl The following is a list of supported systems.
dnl Sequential to keep the logic very simple
dnl These values may be checked and reset later.
dnl ===================================================================
case "$build_os" in
	solaris*)
		test_gtk=yes
		test_cairo=yes
		test_kde=yes
		test_cups=yes
        	test_randr=yes
		test_freetype=yes
        	test_gstreamer=yes
		_os=SunOS
		AC_PATH_PROG( GNUTAR, gtar,,$PATH:/usr/sfw/bin)
		if test -z "$GNUTAR"; then
			AC_MSG_ERROR([gtar (gnu tar) not found but needed. Install it (SUN Freeware package).])
		fi
		AC_SUBST(GNUTAR)

		dnl ===========================================================
		dnl check whether we're using solaris 6,7,8 - sparc or intel.
		dnl ===========================================================
   		AC_MSG_CHECKING([the Solaris operating system release])
   		_os_release=`echo $build_os | $SED -e s/solaris2\.//`
		if test "$_os_release" -lt "6"; then
      			AC_MSG_ERROR([use solaris >= 6 to build Apache OpenOffice])
   		else
      			AC_MSG_RESULT([ok ($_os_release)])
   		fi

   		dnl check whether we're using a sparc or i386 processor
   		AC_MSG_CHECKING([the processor type])
   		if test "$build_cpu" = "sparc" -o "$build_cpu" = "i386"; then
      			AC_MSG_RESULT([ok ($build_cpu)])
   		else
      			AC_MSG_ERROR([only sparc and i386 processors are supported])
   		fi
		;;
	linux-gnu*|k*bsd*-gnu*)
		test_gtk=yes
		test_cairo=yes
		test_kde=yes
		test_kde4=yes
		test_cups=yes
        	test_randr=yes
		test_freetype=yes
        	test_gstreamer=yes
        	_os=Linux	
		;;
	gnu)
		test_cups=no
		_os=GNU
		;;
	cygwin*) # Windows
		test_cups=no
		test_cairo=yes
		test_freetype=no
        	test_gstreamer=no
		_os=WINNT
		;;
	darwin*) # Mac OS X
		test_cups=yes
		test_gtk=yes
		test_cairo=yes
        	test_randr=no
		test_freetype=no
        	test_gstreamer=no
		_os=Darwin
      		if test "$enable_systray" = "yes" && test "$enable_gtk" != "no"; then
         	   AC_MSG_WARN([Disabling gtk-quickstarter - not supported on Mac. Use --disable-systray])
         	   echo "Disabling gtk-quickstarter - not supported on Mac. Use --disable-systray" >>warn
         	   enable_systray=no
      		fi
		;;
	os2*)
		test_x=no
		test_cups=no
        	test_randr=no
		test_gtk=no
		test_freetype=no
        	test_gstreamer=no
		_os=OS2
		;;
	freebsd*)
		test_gtk=yes
		test_cairo=yes
		test_kde=yes
		test_kde4=yes
		test_cups=yes
        	test_randr=yes
		test_freetype=yes
        	test_gstreamer=yes
		AC_MSG_CHECKING([the FreeBSD operating system release])
		if test -n "$with_os_version"; then
			OSVERSION="$with_os_version"
		else
			OSVERSION=`/sbin/sysctl -n kern.osreldate`
		fi
		AC_MSG_RESULT([found OSVERSION=$OSVERSION])
		AC_MSG_CHECKING([which thread library to use])
		if test "$OSVERSION" -lt "500016"; then
			PTHREAD_CFLAGS="-D_THREAD_SAFE"
			PTHREAD_LIBS="-pthread"
		elif test "$OSVERSION" -lt "502102"; then
			PTHREAD_CFLAGS="-D_THREAD_SAFE"
			PTHREAD_LIBS="-lc_r"
		else 
			PTHREAD_CFLAGS=""
			PTHREAD_LIBS="-pthread"
		fi
		AC_MSG_RESULT([$PTHREAD_LIBS])
		_os=FreeBSD
		;;
	osf)
		test_cups=no
        	test_randr=no
		_os=OSF1
		;;
	netbsd)
		test_gtk=yes
		test_cairo=yes
		test_kde=yes
		test_kde4=yes
		test_cups=no
        	test_randr=yes
		test_freetype=yes
        	test_gstreamer=yes
		PTHREAD_CFLAGS="-pthread"
		PTHREAD_LIBS="-pthread -lpthread"
		_os=NetBSD
		;;
	aix*)
		test_cups=no
        	test_randr=no
		test_freetype=yes
        	test_gstreamer=yes
	   	PTHREAD_LIBS=-pthread
		echo "AIX is an alpha port --- Use at own risk" >> warn
		_os=AIX
		;;
   *)
   AC_MSG_ERROR([$_os operating system is not suitable to build Apache OpenOffice!])
   ;;
esac

AC_SUBST(OSVERSION)
AC_SUBST(PTHREAD_CFLAGS)
AC_SUBST(PTHREAD_LIBS)


dnl Ensure pkg-config is initialized before any possible use
PKG_PROG_PKG_CONFIG


dnl ===================================================================
dnl Set the ENABLE_CRASHDUMP variable.
dnl ===================================================================
AC_MSG_CHECKING([whether to enable crashdump feature])
if test "$enable_crashdump" = "yes"; then
   ENABLE_CRASHDUMP="TRUE"
   BUILD_TYPE="$BUILD_TYPE CRASHREP"
   AC_MSG_RESULT([yes])
else
   ENABLE_CRASHDUMP=""
   AC_MSG_RESULT([no])
fi
AC_SUBST(ENABLE_CRASHDUMP)

if test "$_os" = "WINNT"; then
   BUILD_TYPE="$BUILD_TYPE TWAIN"
fi

if test "$_os" = "WINNT"; then
   dnl ===================================================================
   dnl Set the VC_STANDARD variable.
   dnl ===================================================================
   AC_MSG_CHECKING([whether to use the standard non-optimizing compiler])
   if test "$enable_cl_standard" = "" -o "$enable_cl_standard" = "no"; then
      VC_STANDARD=""
      AC_MSG_RESULT([no])
   else
      VC_STANDARD="TRUE"
      AC_MSG_RESULT([yes])
   fi
   AC_SUBST(VC_STANDARD)
fi

dnl ===================================================================
dnl Set the ENABLE_WERROR variable. (Activate --enable-werror)
dnl ===================================================================
AC_MSG_CHECKING([whether to turn warnings to errors])
if test -n "$enable_werror" && test "$enable_werror" != "no"; then
   ENABLE_WERROR="TRUE"
   AC_MSG_RESULT([yes])
   AC_MSG_WARN([Turning warnings to errors has no effect in modules or])
   AC_MSG_WARN([on platforms where it has been disabled explicitely])
   echo "Turning warnings to errors has no effect in modules or on platforms where it has been disabled explicitely" >> warn
else
   ENABLE_WERROR="FALSE"
   AC_MSG_RESULT([no])
fi
AC_SUBST(ENABLE_WERROR)

dnl ===================================================================
dnl Set the ENABLE_DEBUG variable. (Activate --enable-symbols)
dnl ===================================================================
AC_MSG_CHECKING([whether to do a debug build])
if test -n "$enable_debug" && test "$enable_debug" != "no"; then
   ENABLE_DEBUG="TRUE"
   if test -z "$enable_symbols"; then
      enable_symbols="yes"
   fi
   AC_MSG_RESULT([yes])
else
   ENABLE_DEBUG="FALSE"
   AC_MSG_RESULT([no])
fi
AC_SUBST(ENABLE_DEBUG)

dnl ===================================================================
dnl Set the ENABLE_DBGUTIL variable
dnl ===================================================================
AC_MSG_CHECKING([whether to build with additional debug utilities])
if test -n "$enable_dbgutil" && test "$enable_dbgutil" != "no"; then
   PROEXT=""
   PRODUCT=""
   PROFULLSWITCH=""
   AC_MSG_RESULT([yes])
else
   PRODUCT="full"
   PROFULLSWITCH="product=full"
   PROEXT=".pro"
   AC_MSG_RESULT([no, full product build])
fi
AC_SUBST(PRODUCT)
AC_SUBST(PROFULLSWITCH)
AC_SUBST(PROEXT)

dnl ===================================================================
dnl First setting is whether to include symbols into final build.
dnl ===================================================================
AC_MSG_CHECKING([whether to include symbols into final build])
if test -n "$enable_symbols" && test "$enable_symbols" != "no"; then
	if test "$enable_symbols" = "yes" -o "$enable_symbols" = "TRUE"; then
		ENABLE_SYMBOLS="TRUE"
		AC_MSG_RESULT([yes])
	else
		if test "$enable_symbols" = "SMALL" -o "$enable_symbols" = "small"; then
			ENABLE_SYMBOLS="SMALL"
			AC_MSG_RESULT([yes, small ones])
		else if test "$enable_symbols" != "no" ; then
			     echo enable symbols is: $enable_symbols
			     AC_MSG_ERROR([--enable-symbols only accepts yes, TRUE or SMALL as parameter.])
           	     else
              		     ENABLE_SYMBOLS=
		     fi
		fi
	fi
else
   ENABLE_SYMBOLS=
   AC_MSG_RESULT([no])
fi
AC_SUBST(ENABLE_SYMBOLS)

dnl ===================================================================
dnl Determine if the solver is to be stripped or not.
dnl ===================================================================
AC_MSG_CHECKING([whether to strip the solver or not.])
if test -n "$enable_strip_solver"; then
   if test "$enable_strip_solver" = "yes"; then
      DISABLE_STRIP=
   else if test "$enable_strip_solver" = "no"; then
           DISABLE_STRIP="TRUE"
        else
           AC_MSG_ERROR([--disable-strip-solver only accepts yes or no as parameter.])
        fi
   fi
else
   if test -n "$ENABLE_SYMBOLS"; then
      DISABLE_STRIP="TRUE"
   else
      DISABLE_STRIP=
   fi
fi
if test -z "$DISABLE_STRIP"; then
   AC_MSG_RESULT([yes])
else
   AC_MSG_RESULT([no])
fi
AC_SUBST(DISABLE_STRIP)

dnl ===================================================================
dnl Build options
dnl ===================================================================

# Disable or enable libraries seamonkey, nss, hunspell, hyphen, saxon,
# rhino, silgraphite, beanshell.

# Note that further below they may be enabled or disabled again by
# more specific options.

ENABLE_CATEGORY_B=

AC_MSG_CHECKING([whether to enable category B components])
# Category B modules (libraries):
#   moz (seamonkey)
#   nss (nss)
#   hunspell (hunspell)
#   hyphen (hyphen)
#   saxon (saxon)
#   rhino (rhino)
#   beanshell (beanshell)
#   graphite (silgraphite)
if test "$enable_category_b" = "yes"; then
   ENABLE_CATEGORY_B=YES
   enable_hunspell="yes"
   enable_hyphen="yes"
   enable_saxon="yes"
   enable_javascript="yes"
   enable_beanshell="yes"
   enable_graphite="yes"
   enable_coinmp="yes"
   enable_category_b_fonts="yes"

   AC_MSG_RESULT([yes: allow modules moz, nss, hunspell, hyphen, saxon, rhino, beanshell, graphite, coinmp to be built])
else
   # Disable libaries.
   enable_mozilla="no"
   enable_nss_module="no"
   enable_hunspell="no"
   enable_hyphen="no"
   enable_saxon="no"
   enable_javascript="no"
   enable_beanshell="no"
   enable_graphite="no"
   enable_coinmp="no"
   enable_category_b_fonts="no"

   AC_MSG_RESULT([no: disabled modules moz, nss, hunspell, hyphen, saxon, rhino, beanshell, graphite, coinmp])
fi
AC_SUBST(ENABLE_CATEGORY_B)

# gstreamer is used only via pre-installed libraries: not a problem

dnl ===================================================================
dnl Online Update
dnl ===================================================================
AC_MSG_CHECKING([whether to enable the Online Update support])
if test "$enable_online_update" = "yes" -o "$enable_online_update" = "TRUE"; then
   ENABLE_ONLINE_UPDATE="YES"
   SCPDEFS="$SCPDEFS -DENABLE_ONLINE_UPDATE"
   AC_MSG_RESULT([yes])
else
   ENABLE_ONLINE_UPDATE=""
   AC_MSG_RESULT([no])
fi
AC_SUBST(ENABLE_ONLINE_UPDATE)


AC_MSG_CHECKING([whether to enable native CUPS support])
if test "$test_cups" = "yes" -a \( "$enable_cups" = "yes" -o "$enable_cups" = "TRUE" \) ; then
   ENABLE_CUPS="TRUE"
   AC_MSG_RESULT([yes])
else
   ENABLE_CUPS=""
   AC_MSG_RESULT([no])
fi
AC_SUBST(ENABLE_CUPS)

AC_MSG_CHECKING([whether to enable fontconfig support])
if test "$_os" != "WINNT" -a "$_os" != "Darwin" -a \( "$enable_fontconfig" = "yes" -o "$enable_fontconfig" = "TRUE" \); then
   ENABLE_FONTCONFIG="TRUE"
   AC_MSG_RESULT([yes])
else
   ENABLE_FONTCONFIG=""
   AC_MSG_RESULT([no])
fi
AC_SUBST(ENABLE_FONTCONFIG)

dnl ===================================================================
dnl find external tarballs.
dnl ===================================================================
if test -z $TARFILE_LOCATION; then
   TARFILE_LOCATION="DEFAULT"
fi
AC_SUBST(TARFILE_LOCATION)

if test -z "$enable_fetch_external" || test "$enable_fetch_external" = "yes" \
   && test -z "$with_system_libs" -a "$with_system_jars" != "no"; then
   DO_FETCH_TARBALLS="yes"
fi
AC_SUBST(DO_FETCH_TARBALLS)

dnl ===================================================================
dnl Disable legacy binary file formats filters
dnl ===================================================================
AC_MSG_CHECKING([whether to enable filters for legacy binary file formats (StarOffice 5.2)])
if test "$enable_binfilter" = "yes"; then
   WITH_BINFILTER="YES"
   BUILD_TYPE="$BUILD_TYPE BINFILTER"
   AC_MSG_RESULT([yes])
else
   WITH_BINFILTER="NO"
   AC_MSG_RESULT([no])
fi
AC_SUBST(WITH_BINFILTER)

if test "$_os" = "WINNT"; then
   AC_MSG_CHECKING([whether to use DirectX])
   ENABLE_DIRECT_DRAW=""
   if test "$enable_directx" = "yes" -o "$enable_directx" = "TRUE" -o "$enable_directx" = ""; then
      ENABLE_DIRECTX="TRUE"
      AC_MSG_RESULT([yes])
   else
      ENABLE_DIRECTX=""
      AC_MSG_RESULT([no])
   fi
   AC_SUBST(ENABLE_DIRECTX)

   AC_MSG_CHECKING([whether to use ActiveX])
   if test "$enable_activex" = "yes" -o "$enable_activex" = "TRUE" -o "$enable_activex" = ""; then
      DISABLE_ACTIVEX=""
      AC_MSG_RESULT([yes])
   else
      DISABLE_ACTIVEX="TRUE"
      AC_MSG_RESULT([no])
   fi

   AC_MSG_CHECKING([whether to use ATL])
   if test "$enable_atl" = "yes" -o "$enable_atl" = "TRUE" -o "$enable_atl" = ""; then
      DISABLE_ATL=""
      AC_MSG_RESULT([yes])
   else
      DISABLE_ATL="TRUE"
      dnl ActiveX depends on ATL, it should be disabled
      DISABLE_ACTIVEX="TRUE"
      AC_MSG_RESULT([no])
   fi

   AC_SUBST(DISABLE_ATL)
   AC_SUBST(DISABLE_ACTIVEX)

fi

dnl ===================================================================
dnl Disable rpath in shared libraries?
dnl ===================================================================
AC_MSG_CHECKING([whether to use RPATH in shared libraries])
if test "$enable_rpath" = "no"; then
   ENABLE_RPATH="no"
else
   ENABLE_RPATH="yes"
fi
AC_MSG_RESULT([$ENABLE_RPATH])
AC_SUBST(ENABLE_RPATH)

dnl ===================================================================
dnl Check extensions to be bundled as literal blobs
dnl ===================================================================
if test -n "$with_bundled_extension_blobs"; then
	BUNDLED_EXTENSION_BLOBS="$with_bundled_extension_blobs"
else
	BUNDLED_EXTENSION_BLOBS=
fi
AC_SUBST(BUNDLED_EXTENSION_BLOBS)

#dnl ===================================================================
#dnl Check extensions that are to be bundled as pre-registerd
#dnl ===================================================================
if test -n "$with_bundled_prereg_extensions"; then
	BUNDLED_PREREG_EXTENSIONS="$with_bundled_prereg_extensions"
else
	BUNDLED_PREREG_EXTENSIONS=
fi
AC_SUBST(BUNDLED_PREREG_EXTENSIONS)

dnl ===================================================================
dnl Configure system provided dictionary/hyphenation/thesaurus
dnl ===================================================================
  AC_MSG_CHECKING([whether to use dicts from external paths])
  if test -n "$with_system_dicts" -a "$with_system_dicts" = "yes"; then
	AC_MSG_RESULT([yes])
	SYSTEM_DICTS=YES
	AC_MSG_CHECKING([for spelling dictionary directory])
	if test -n "$with_external_dict_dir"; then
		DICT_SYSTEM_DIR=file://$with_external_dict_dir
	else
		DICT_SYSTEM_DIR=file:///usr/share/hunspell
	fi
	AC_MSG_RESULT([$DICT_SYSTEM_DIR])
	AC_MSG_CHECKING([for hyphenation patterns directory])
	if test -n "$with_external_hyph_dir"; then
		HYPH_SYSTEM_DIR=file://$with_external_hyph_dir
	else
		HYPH_SYSTEM_DIR=file:///usr/share/hyphen
	fi
	AC_MSG_RESULT([$HYPH_SYSTEM_DIR])
	AC_MSG_CHECKING([for thesaurus directory])
	if test -n "$with_external_thes_dir"; then
		THES_SYSTEM_DIR=file://$with_external_thes_dir
	else
		THES_SYSTEM_DIR=file:///usr/share/mythes
	fi
	AC_MSG_RESULT([$THES_SYSTEM_DIR])
  else
  	AC_MSG_RESULT([no])
  	SYSTEM_DICTS=NO
  fi
AC_SUBST(SYSTEM_DICTS)
AC_SUBST(DICT_SYSTEM_DIR)
AC_SUBST(HYPH_SYSTEM_DIR)
AC_SUBST(THES_SYSTEM_DIR)

if test $_os = "WINNT"; then
   AC_MSG_CHECKING([Windows build environment sanity])
   dnl ===================================================================
   dnl Sanity check! Native windows programs cannot use cygwin symlinks!
   dnl ===================================================================
   dnl As long as awk instead of $AWK is used somewhere in the sources,
   dnl check for $AWK and awk. $AWK is pointing to gawk in cygwin.
      if test -L $AWK -o -L `which awk` -o -L `which tar` -o -L `which gunzip` ; then
         AC_MSG_ERROR([$AWK, awk, tar or gunzip is a cygwin symlink!
Native windows programs cannot use cygwin symlinks. Remove the symbolic
link, and copy the program to the name of the link.])
      fi
   dnl ===================================================================
   dnl Another sanity check! More a band-aid. winenv.* adds guw.exe to
   dnl CC and CXX but the configure checks here assume that guw.exe
   dnl (if needed at all) is not yet present.
   dnl ===================================================================
   CC=`echo $CC | $SED "s/^guw.exe //"`
   CXX=`echo $CXX | $SED "s/^guw.exe //"`
   dnl ===================================================================
   dnl If $CC is set to a MinGW compiler, e.g. "gcc -mno-cygwin" enable
   dnl $WITH_MINGWIN
   dnl ===================================================================
      if test -n "$CC";then
         if test "`$CC -dumpmachine 2>/dev/null | $SED -e 's/^.*-//'`" = "mingw32"; then
            WITH_MINGWIN="yes"
         fi
      fi
   dnl ===================================================================
   if test "$WITH_MINGWIN" = "yes" ; then
      if test -z "$CC"; then
         CC="gcc -mno-cygwin"
         CXX="g++ -mno-cygwin"
      fi
   fi
   AC_MSG_RESULT([ok])
fi
AC_SUBST(WITH_MINGWIN)

dnl ===================================================================
dnl Extra check for Windows. cygwin builds need gcc to build dmake
dnl and g++ to build guw.exe although MS cl (or MinGW) is used to
dnl build OOo.
dnl ===================================================================
if test "$_os" = "WINNT" ; then
   AC_MSG_CHECKING([for cygwin gcc/g++])
   if which gcc > /dev/null && which g++ > /dev/null ; then
      AC_MSG_RESULT([found])
   else
      AC_MSG_ERROR([cygwin gcc and g++ are needed, please install them.])
   fi
fi


dnl ===================================================================
dnl Check whether the bash shell can be used.
dnl ===================================================================
AC_PATH_PROG(SHELLPATH, bash)
if test -z "$SHELLPATH"; then
   AC_MSG_ERROR([bash not found in \$PATH])
else
   SHELLPATH=`echo $SHELLPATH | $SED -n "s/\/bash$//p"`
fi
AC_SUBST(SHELLPATH)

dnl ===================================================================
dnl  Checks for c compiler,
dnl  The check for the c++ compiler is later on.
dnl ===================================================================
AC_MSG_CHECKING([gcc home])
if test -z "$with_gcc_home"; then
	GCC_HOME=`which gcc | $SED -e s,/bin/gcc,,`
else	
	GCC_HOME="$with_gcc_home"
fi
AC_MSG_RESULT($GCC_HOME)
AC_SUBST(GCC_HOME)

save_CC=$CC
save_CXX=$CXX

if test -n "$with_gcc_home"; then
   if test -z "$CC"; then
      CC="$with_gcc_home/bin/gcc"
   fi
fi

dnl The following checks for gcc, cc and then cl (if it weren't guarded for win32)
if test "$_os" != "WINNT" -o "$WITH_MINGWIN" = "yes"; then
   AC_PROG_CC
fi

COMPATH=`dirname "$CC"`
if test "$COMPATH" = "." ; then
    AC_PATH_PROGS(COMPATH, $CC)
    dnl double square bracket to get single because of M4 quote...
    COMPATH=`echo $COMPATH | $SED "s@/[[^/:]]*\\\$@@"`;
fi
COMPATH=`echo $COMPATH | $SED "s@/[[Bb]][[Ii]][[Nn]]\\\$@@"`;

dnl ===================================================================
dnl  Test the gcc version,  3 is OK
dnl ===================================================================
GCCVER=20995
if test \( "$_os" != "WINNT" -o "$WITH_MINGWIN" = "yes" \) -a "$GCC" = "yes"; then
    AC_MSG_CHECKING([the GNU gcc compiler version])
   _gcc_version=`$CC -dumpversion`
   _gcc_major=`echo $_gcc_version | $AWK -F. '{ print \$1 }'`
   GCCVER=`echo $_gcc_version | $AWK -F. '{ print \$1*10000+\$2*100+\$3 }'`

   if test "$_gcc_major" -lt "3"; then
      AC_MSG_ERROR([found version "$_gcc_version", use version 3+ of the gcc compiler])
   else
      if test "$GCCVER" -eq "030203"; then
	    if test "$ENABLE_SYMBOLS" = "SMALL"; then
           AC_MSG_ERROR([version "$_gcc_version" gives internal error with small.])
	    fi
      fi
   fi
   if test "$_os" = "Darwin" -a "$GCCVER" -ge "040100" ; then
      if test -z "$save_CC" -a -x "$GCC_HOME/bin/gcc-4.0" ; then
         export CC=$GCC_HOME/bin/gcc-4.0
          dnl  export CC to have it available in set_soenv -> config.guess
         GCCVER2=`"$CC" -dumpversion | $AWK -F. '{ print \$1*10000+\$2*100+\$3 }'`
         if test "$GCCVER2" -ge "040000" -a "$GCCVER2" -lt "040100" ; then
            GCCVER=$GCCVER2
         fi
      fi
      if test "$GCCVER" -ge "040100" ; then
         AC_MSG_ERROR([You need to use the gcc-4.0 compiler (gcc $_gcc_version won't work with the MacOSX10.4u.sdk) - set CC accordingly])
      else
         AC_MSG_RESULT([implicitly using CC=$CC])
      fi
   else
      AC_MSG_RESULT([checked (gcc $_gcc_version)])
   fi
   if test "$_os" = "SunOS"; then
      AC_MSG_CHECKING([gcc linker])
      if $CC -Wl,--version 2>&1 |head -n 1| grep -v GNU > /dev/null;then
          AC_MSG_ERROR([failed (not GNU ld). Use GNU ld instead of Sun ld on Solaris])
      fi
      AC_MSG_RESULT([ok (GNU ld)])
   fi
fi 
AC_SUBST(GCCVER)

HAVE_LD_BSYMBOLIC_FUNCTIONS=
if test "$GCC" = "yes"; then
   AC_MSG_CHECKING( for -Bsymbolic-functions linker support )
   bsymbolic_functions_ldflags_save=$LDFLAGS
   LDFLAGS="$LDFLAGS -Wl,-Bsymbolic-functions -Wl,--dynamic-list-cpp-new -Wl,--dynamic-list-cpp-typeinfo"
   AC_LINK_IFELSE([AC_LANG_PROGRAM([
   #include <stdio.h>
   ],[
    printf ("hello world\n");
   ])], HAVE_LD_BSYMBOLIC_FUNCTIONS=TRUE, [])
   if test "z$HAVE_LD_BSYMBOLIC_FUNCTIONS" = "zTRUE"; then
     AC_MSG_RESULT( found )
   else
     AC_MSG_RESULT( not found )
   fi
   LDFLAGS=$bsymbolic_functions_ldflags_save
fi
AC_SUBST(HAVE_LD_BSYMBOLIC_FUNCTIONS)

dnl ===================================================================
dnl Set the ENABLE_PCH variable. (Activate --enable-pch)
dnl ===================================================================
AC_MSG_CHECKING([whether to enable pch feature])
if test -n "$enable_pch" && test "$enable_pch" != "no"; then
   if test "$_os" = "WINNT" -a "$WITH_MINGWIN" != "yes"; then
	   ENABLE_PCH="TRUE"
	   AC_MSG_RESULT([yes])
dnl There is no PCH support in GCC versions prior to this
   elif test "$GCC" = "yes" -a "$GCCVER" -gt "030400"; then
	   ENABLE_PCH="TRUE"
	   AC_MSG_RESULT([yes])
   else
	   ENABLE_PCH=""
	   AC_MSG_WARN([Precompiled header not yet supported for your platform/compiler])
   fi
else
   ENABLE_PCH=""
   AC_MSG_RESULT([no])
fi
AC_SUBST(ENABLE_PCH)

dnl ===================================================================
dnl Search all the common names for GNU make
dnl ===================================================================
AC_MSG_CHECKING([for GNU make])
for a in "$MAKE" $GNUMAKE make gmake gnumake; do
      $a --version 2> /dev/null | grep GNU  2>&1 > /dev/null
      if test $? -eq 0;  then
           GNUMAKE=$a
           break
      fi
done
AC_MSG_RESULT($GNUMAKE)
if test -z "$GNUMAKE"; then
    AC_MSG_ERROR([not found. install GNU make.])
fi

AC_MSG_CHECKING([the GNU make version])
_make_version=`$GNUMAKE --version | grep GNU | $SED -e 's@^[[^0-9]]*@@' -e 's@ .*@@' -e 's@,.*@@'`;
_make_longver=`echo $_make_version | $AWK -F. '{ print \$1*10000+\$2*100+\$3 }'`
if test "$_make_longver" -ge "038100" ; then
   AC_MSG_RESULT([$GNUMAKE $_make_version])
else
   AC_MSG_ERROR([failed ($GNUMAKE version >= 3.81 needed])
fi
AC_SUBST(GNUMAKE)

dnl ===================================================================
dnl Search for a pre-installed dmake
dnl ===================================================================
AC_MSG_CHECKING([for dmake])
AC_PATH_PROG(DMAKE, dmake, no)
IS_SYSTEM_DMAKE=NO
if test "$DMAKE" != "no"; then
   AC_MSG_RESULT([using system dmake])
   DMAKE_PATH="$DMAKE"
   IS_SYSTEM_DMAKE=YES
elif test -n "$with_dmake_path" ; then
   # Did not find pre-installed dmake.
   # Is it at a nonstandard location provided by --with-dmake-path ?
   AC_MSG_NOTICE([looking for dmake at $DMAKE_PATH])
   if test -x "$with_dmake_path" ; then
      AC_MSG_RESULT([using user provided dmake])
      DMAKE=$with_dmake_path
   fi
fi

DMAKE_URL=
if test "$DMAKE" = "no"; then
    AC_MSG_NOTICE([no system or user-provided dmake found])
    # Check if a URL was supplied from which we can download the source and compile it.
    if test -n "$with_dmake_url" ; then
       # At this moment we can not verify the URL or the content that we want to download.
       # Neither can we apply the test below for ruling out that it is the SunStudio dmake.
       DMAKE_URL=$with_dmake_url
       AC_MSG_RESULT([dmake will be downloaded and compiled in bootstrap])
       DMAKE=
    else
       AC_MSG_ERROR([no URL for dmake source code specified, either.])
       BUILD_DMAKE=YES
    fi
else
    AC_MSG_CHECKING([whether the found dmake is the right dmake])
    # we need to find out whether that dmake we found is "our" dmake
    # or the dmake from Sun's SunStudio Compiler which is something
    # different
    # This test _should_ work because the one accepts -V (ours) and one
    # (the other) not...
    $DMAKE -V 2>/dev/null | grep -E 'dmake(.exe)? .* Version .*' >/dev/null
    if test $? -eq 0; then 
       BUILD_DMAKE=NO
       AC_MSG_RESULT([yes])
       AC_MSG_CHECKING([the dmake version])
       DMAKE_VERSION=`$DMAKE -V | $AWK '$3 == "Version" {print $4}'`
       if test "`echo $DMAKE_VERSION | cut -d'.' -f1`" -gt "4"; then
          AC_MSG_RESULT([OK, >= 4.11])
       elif test "`echo $DMAKE_VERSION | cut -d'.' -f1`" = "4" && \
	        test "`echo $DMAKE_VERSION | cut -d'.' -f2`" -ge "11"; then
          AC_MSG_RESULT([OK, >= 4.11])
       else
          AC_MSG_ERROR([too old. >= 4.11 is needed])
          DMAKE=no
       fi
    else
       AC_MSG_WARN([no])
       DMAKE=no
    fi
fi
if test "$DMAKE" = "no"; then
   AC_MSG_ERROR([please use --with-dmake-path or --with-dmake-url to specify dmake executable or source])
fi
AC_SUBST(DMAKE_URL)
AC_SUBST(DMAKE_PATH)
AC_SUBST(IS_SYSTEM_DMAKE)


dnl ===================================================================
dnl Search all the common names for GNU or BSD tar
dnl ===================================================================
AC_MSG_CHECKING([for GNU or compatible BSD tar])
for a in $GNUTAR gtar gnutar bsdtar tar; do
      $a --version 2> /dev/null | egrep "GNU|libarchive"  2>&1 > /dev/null
      if test $? -eq 0;  then
           GNUTAR=$a
           break
      fi
done
AC_MSG_RESULT($GNUTAR)
if test -z "$GNUTAR"; then
    AC_MSG_ERROR([not found. install GNU tar.])
fi

AC_SUBST(GNUTAR)

dnl ===================================================================
dnl  Test the solaris compiler version
dnl ===================================================================
if test "$_os" = "SunOS"; then
   if test "$CC" = "cc"; then
      AC_PATH_PROGS(_cc, cc)
      COMPATH=`echo $_cc | $SED -n "s/\/bin\/cc//p"`
      AC_MSG_CHECKING([the SunStudio C/C++ compiler version])
      dnl cc -V outputs to standard error!!!!
      _sunstudio_string=`$CC -V 2>&1 | grep '^cc' | sed -e 's/.* C //'`
      _sunstudio_version=`echo $_sunstudio_string | $AWK '{ print $1 }'`
      _sunstudio_major=`echo $_sunstudio_version | $AWK -F. '{ print $1 }'` 
      if test "$_sunstudio_major" != "5"; then
         AC_MSG_ERROR([found version "$_sunstudio_version", use version 5.5, 5.7, 5.8 or 5.9 of the SunStudio C/C++ compiler])
      else
         _sunstudio_minor=`echo $_sunstudio_version | $AWK -F. '{ if ($2 == 5) print "true"; else if ($2 == 7) print "true"; else if ($2 == 8) print "true"; else if ($2 == 9) print "true"; else print "false" }'` 
         if test "$_sunstudio_minor" = "false"; then
            AC_MSG_ERROR([found version "$_sunstudio_version", use version 5.5, 5.7, 5.8 or 5.9 of the SunStudio C/C++ compiler])
         else
            dnl compiler will do
            AC_MSG_RESULT([checked])
         fi
      fi
   fi
fi

if test "$GCC" = "yes"; then
   AC_MSG_CHECKING( for --hash-style=both linker support )
   hash_style_ldflags_save=$LDFLAGS
   LDFLAGS="$LDFLAGS -Wl,--hash-style=both"
   AC_LINK_IFELSE([AC_LANG_PROGRAM([
   #include <stdio.h>
   ],[
    printf ("hello world\n");
   ])], HAVE_LD_HASH_STYLE=TRUE, HAVE_LD_HASH_STYLE=FALSE)
   if test "z$HAVE_LD_HASH_STYLE" = "zTRUE"; then
     AC_MSG_RESULT( found )
   else
     AC_MSG_RESULT( not found )
   fi
   LDFLAGS=$hash_style_ldflags_save
fi
AC_SUBST(HAVE_LD_HASH_STYLE)

dnl ===================================================================
dnl  Test the Compaq compiler for OSF1
dnl ===================================================================
if test "$_os" = "OSF1"; then
   if test "$CC" = "cc"; then
      AC_PATH_PROGS(_cc, cc)
      COMPATH=`echo $_cc | $SED -n "s/\/bin\/cc//p"`
      AC_MSG_WARN([******* $_cc , $COMPATH])
      AC_MSG_CHECKING([the Compaq C compiler version])
      dnl cc -V outputs to standard error!!!!
      _compaqc_version=`$CC -V 2>&1 | $AWK '{ print $3 }'`
      _compaqc_major=`echo $_compaqc_version | $AWK -F. '{ print $1 }'`
      if test "$_compaqc_major" != "T6"; then
         AC_MSG_ERROR([found version "$_compaqc_version", use version 6 of the Compaq C compiler])
      else
         dnl compiler will do
         AC_MSG_RESULT([checked])
      fi
   fi
fi

dnl ===================================================================
dnl Check whether there's a Perl version available.
dnl ===================================================================
if test -z "$with_perl_home"; then
   AC_PATH_PROG(PERL, perl)
else
   if test "$_os" = "WINNT"; then
      with_perl_home=`cygpath -u "$with_perl_home"`
   fi
   _perl_path="$with_perl_home/bin/perl"
   if test -x "$_perl_path"; then
      PERL=$_perl_path
   else
      AC_MSG_ERROR([$_perl_path not found])
   fi
fi

dnl ===================================================================
dnl Testing for Perl version 5 or greater.
dnl $] is the perl version variable, it is returned as an integer
dnl ===================================================================
if test "$PERL"; then
   AC_MSG_CHECKING([the Perl version])
   ${PERL} -e "exit($]);"
   _perl_version=$?
   if test "$_perl_version" -lt 5; then
      AC_MSG_ERROR([found Perl version "$_perl_version", use version 5 of Perl])
   fi 
   AC_MSG_RESULT([checked (perl $_perl_version)])
else
   AC_MSG_ERROR([Perl not found, install version 5 of Perl])
fi
AC_SUBST(PERL)

dnl ===================================================================
dnl Testing for required Perl modules
dnl The list of required Perl modules is documented here:
dnl     http://wiki.openoffice.org/wiki/Documentation/Building_Guide_AOO#General_Build_Requirements
dnl ===================================================================
AC_MSG_CHECKING([for required Perl modules])
if `$PERL -e 'use Archive::Zip; use LWP::UserAgent; use XML::Parser;'>/dev/null 2>&1`; then
	AC_MSG_RESULT([all modules found])
else
    # Find out which modules are missing.
    missing_perl_modules=
    if ! `$PERL -e 'use Archive::Zip;'>/dev/null 2>&1`; then
       missing_perl_modules=Archive::Zip
    fi
    if ! `$PERL -e 'use LWP::UserAgent;'>/dev/null 2>&1`; then
       missing_perl_modules="$missing_perl_modules LWP::UserAgent"
    fi
    if ! `$PERL -e 'use XML::Parser;'>/dev/null 2>&1`; then
       missing_perl_modules="$missing_perl_modules XML::Parser"
    fi
	AC_MSG_ERROR([
    The missing Perl modules are: $missing_perl_modules
    Install them as superuser/administrator with "cpan -i $missing_perl_modules"])
fi

dnl ===================================================================
dnl  Check which Microsoft C/C++ or MinGW compiler is used for WINNT
dnl ===================================================================
if test "$_os" = "WINNT"; then
	if test "$WITH_MINGWIN" != "yes"; then
		AC_MSG_CHECKING([for friendly registry keys])
		# VS.Net 2003, VS.Net 2005
		if test -z "$with_cl_home"; then
			vctest=`./oowintool --msvc-productdir`;
			if test -x "$vctest/bin/cl.exe"; then
				with_cl_home=$vctest;
			fi
		else
			with_cl_home=`cygpath -u "$with_cl_home"`
		fi
		AC_MSG_RESULT([done])

		dnl ===========================================================
		dnl  Check for mspdb71.dll/mspdb80.dll
		dnl ===========================================================
		dnl  .NET 2003/5/8 Compiler
		if test -n "$with_mspdb_path";then
			with_mspdb_path=`cygpath -u "$with_mspdb_path"`
		fi
		if test -e "$with_mspdb_path/mspdb71.dll" -o -e "$with_mspdb_path/mspdb80.dll"; then
			MSPDB_PATH="$with_mspdb_path"
		fi
		dnl .NET 2003 case
		if test -z "$MSPDB_PATH" -a -e "$with_cl_home/../Common7/IDE/mspdb71.dll"; then
			MSPDB_PATH="$with_cl_home/../Common7/IDE"
		fi
		dnl .NET 2005/2008 case
		if test -z "$MSPDB_PATH" -a -e "$with_cl_home/../Common7/IDE/mspdb80.dll"; then
			MSPDB_PATH="$with_cl_home/../Common7/IDE"
		fi
		dnl Windows SDK 6.0 case
		if test -z "$MSPDB_PATH" -a -e "$with_cl_home/bin/mspdb80.dll"; then
			MSPDB_PATH="$with_cl_home/bin"
		fi

		if test -z "$MSPDB_PATH";then
			dnl AC_PATH_PROG only checks if MSPDB_PATH is still empty
			AC_PATH_PROG(MSPDB_PATH, mspdb80.dll)
			AC_PATH_PROG(MSPDB_PATH, mspdb71.dll)
			MSPDB_PATH=`dirname "$MSPDB_PATH"`
		fi

		if test -z "$MSPDB_PATH"; then
			AC_MSG_ERROR([You need a mspdb71.dll/mspdb80.dll, make sure it's in the path or use --with-mspdb-path])
		fi
		MSPDB_PATH=`cygpath -d "$MSPDB_PATH"`
		MSPDB_PATH=`cygpath -u "$MSPDB_PATH"`
		dnl The path needs to be added before cl is called
		PATH="$MSPDB_PATH:$PATH"

		AC_MSG_CHECKING([the Microsoft C/C++ Compiler])
   		if test -x "$with_cl_home/bin/cl.exe"; then
   			CC="$with_cl_home/bin/cl.exe"
   		else
   			AC_PATH_PROG(CC, cl.exe)
   		fi
  		if test -e "$CC"; then
			# This gives us a posix path with 8.3 filename restrictions
			CC=`cygpath -d "$CC"`
			CC=`cygpath -u "$CC"`
			# Remove /cl.exe from CC case insensitive
			AC_MSG_RESULT([found ($CC)])
			COMPATH=`echo $CC | $SED 's@\/[[Bb]][[Ii]][[Nn]]\/[[cC]][[lL]]\.[[eE]][[xX]][[eE]]@@'`
			export INCLUDE=`cygpath -d "$COMPATH/Include"`
			dnl  Check which Microsoft C/C++ compiler is found
			AC_MSG_CHECKING([the Version of Microsoft C/C++ Compiler])
dnl      The following find microsoft, matches nn.nn.nnnn then pulls numbers out.         
			CCTXTVER=`$CC 2>&1 | head -n1`
			CCNUMVER=`echo $CCTXTVER | $AWK "/Microsoft/ && /..\\...\\...../ {
							x = match( \\\$0, /..\\...\\...../ )
							CCversion = substr( \\\$0, RSTART, RLENGTH)
							tokencount = split (CCversion,vertoken,\".\")
							for ( i = 1 ; i <= tokencount ; i++ ) {
								printf (\"%04d\",vertoken[[i]] )
							}
							}"`
			AC_MSG_RESULT([found Compiler version $CCNUMVER in \"$CCTXTVER\"])
			if test "$CCNUMVER" -ge "001500000000"; then
				COMEX=12
				MSVSVER=2008
				AC_MSG_RESULT([found .NET 2008 / VS 9.0.])
			else
				AC_MSG_ERROR([Compiler too old. Use Microsoft C/C++ .NET 2008.])
			fi
		else
			AC_MSG_ERROR([Microsoft C/C++ Compiler not found. Use --with-cl-home or set path to cl.exe.])
		fi
	else
		AC_MSG_CHECKING([the Mingwin32 C++ Compiler])
		if test `$CC -dumpmachine | $SED -e 's/^.*-//'` = "mingw32"; then
			AC_MSG_RESULT([found.])
			if $CC -dumpspecs | grep -q "mno-cygwin"; then
				USE_MINGW="cygwin"
			else
				USE_MINGW="pure-mingw"
			fi
		else
			AC_MSG_ERROR([Mingwin32 C++ Compiler not found.])
		fi
	fi
fi
AC_SUBST(COMEX)
AC_SUBST(MSPDB_PATH)
AC_SUBST(USE_MINGW)

dnl ===================================================================
dnl  .NET needs special treatment
dnl ===================================================================
if test "$_os" = "WINNT"; then
if test "$WITH_MINGWIN" = "yes" || test "$COMEX" -ge "10"; then
	dnl Check midl.exe
	AC_PATH_PROG(MIDL_PATH, midl.exe)
	if test -n "$MIDL_PATH";then
		MIDL_PATH=`dirname "$MIDL_PATH"`
	fi
	if test -n "$with_midl_path";then
		with_midl_path=`cygpath -u "$with_midl_path"`
	fi
	if test -x "$with_midl_path/midl.exe"; then
		MIDL_PATH="$with_midl_path"
	fi
	if test -z "$MIDL_PATH" -a -e "$with_cl_home/../Common7/Tools/Bin/midl.exe"; then
		MIDL_PATH="$with_cl_home/../Common7/Tools/Bin"
	fi
	if test -z "$MIDL_PATH" ; then
      vstest=`./oowintool --msvs-productdir`;
      if test -x "$vstest/Common7/Tools/Bin/midl.exe" ; then
		  MIDL_PATH="$vstest/Common7/Tools/Bin"
      fi
	fi
	if test -z "$MIDL_PATH" ; then
		psdktest=`./oowintool --psdk-home`
		if test -x "$psdktest/Bin/midl.exe" ; then
			MIDL_PATH="$psdktest/Bin"
		fi
	fi
	if test ! -x "$MIDL_PATH/midl.exe"; then
		AC_MSG_ERROR([midl.exe not found. Make sure it's in the path or use --with-midl-path])
	fi
	# Convert to posix path with 8.3 filename restrictions ( No spaces )
	MIDL_PATH=`cygpath -d "$MIDL_PATH"`
	MIDL_PATH=`cygpath -u "$MIDL_PATH"`

	dnl Check csc.exe
	AC_PATH_PROG(CSC_PATH, csc.exe)
	if test -n "$CSC_PATH";then
		CSC_PATH=`dirname "$CSC_PATH"`
	fi
	if test -n "$with_csc_path";then
		with_csc_path=`cygpath -u "$with_csc_path"`
	fi
	if test -x "$with_csc_path/csc.exe"; then
		CSC_PATH="$with_csc_path"
	else
	   csctest=`./oowintool --csc-compilerdir`;
	   if test -x "$csctest/csc.exe"; then
	      CSC_PATH="$csctest"
	   fi
	fi
	if test ! -x "$CSC_PATH/csc.exe"; then
		AC_MSG_ERROR([csc.exe not found. Make sure it's in the path or use --with-csc-path])
	fi
	# Convert to posix path with 8.3 filename restrictions ( No spaces )
	CSC_PATH=`cygpath -d "$CSC_PATH"`
	CSC_PATH=`cygpath -u "$CSC_PATH"`

    dnl Check mscoree.lib / .NET Frameworks dir
    dnl For VS2003/2005 $with_frame_home has to point to the directory with lib/mscoree.lib.
       AC_MSG_CHECKING(.NET Framework)
	    if test -n "$with_frame_home"; then
		with_frame_home=`cygpath -u "$with_frame_home"`
	    fi
	    if test -f "$with_frame_home/lib/mscoree.lib"; then
		    FRAME_HOME="$with_frame_home"
	    fi
	    if test -z "$FRAME_HOME" -a -e "$with_cl_home/../SDK/v1.1/lib/mscoree.lib"; then
		    FRAME_HOME="$with_cl_home/../SDK/v1.1"
	    fi
	    if test -z "$FRAME_HOME" ; then
          frametest=`./oowintool --dotnetsdk-dir`
          if test -f "$frametest/lib/mscoree.lib"; then
             FRAME_HOME="$frametest"
          else
             frametest=`./oowintool --psdk-home`
             if test -f "$frametest/lib/mscoree.lib"; then
                FRAME_HOME="$frametest"
             fi
          fi
	    fi
	    if test ! -f "$FRAME_HOME/lib/mscoree.lib"; then
		AC_MSG_ERROR([mscoree.lib (.NET Framework) not found. Make sure you use --with-frame-home])
	    fi
	    AC_MSG_RESULT(found)
	# Convert to posix path with 8.3 filename restrictions ( No spaces )
	FRAME_HOME=`cygpath -d "$FRAME_HOME"`
	FRAME_HOME=`cygpath -u "$FRAME_HOME"`
fi
AC_SUBST(MIDL_PATH)
AC_SUBST(CSC_PATH)
AC_SUBST(FRAME_HOME)
fi

dnl ===================================================================
dnl Check if stdc headers are available excluding windows.
dnl ===================================================================
if test "$_os" != "WINNT" -o "$WITH_MINGWIN" = "yes"; then
   AC_HEADER_STDC
fi

dnl ===================================================================
dnl Find pre-processors.
dnl ===================================================================
if test "$_os" != "WINNT" -o "$WITH_MINGWIN" = "yes"; then
   AC_PROG_CXXCPP

dnl Check whether there's a C pre-processor.
dnl ===================================================================
dnl When using SunStudio compiler, there is a bug with the cc
dnl preprocessor, so use CC preprocessor as the cc preprocessor
dnl See Issuezilla #445.
dnl ===================================================================
   if test "$_os" = "SunOS"; then
      CPP=$CXXCPP
   else
      AC_PROG_CPP
   fi
fi

AC_CHECK_SIZEOF(long)
SIZEOF_LONG=$ac_cv_sizeof_long
AC_SUBST(SIZEOF_LONG)
AC_C_BIGENDIAN
WORDS_BIGENDIAN=$ac_cv_c_bigendian
AC_SUBST(WORDS_BIGENDIAN)

dnl Check for large file support
AC_SYS_LARGEFILE
if test -n "$ac_cv_sys_file_offset_bits"; then
   LFS_CFLAGS="-D_FILE_OFFSET_BITS=$ac_cv_sys_file_offset_bits"
fi
if test -n "$ac_cv_sys_large_files" && test "$ac_cv_sys_large_files" != "no"; then
   LFS_CFLAGS="$LFS_CFLAGS -D_LARGE_FILES"
fi
AC_SUBST(LFS_CFLAGS)

dnl ===================================================================
dnl Check if valgrind.h is available 
dnl ===================================================================
if test -n "$enable_dbgutil" && test "$enable_dbgutil" != "no"; then
   dnl Test $prefix (currently only testing for /usr and /usr/local)
   dnl so that VALGRIND_CFLAGS = -I$prefix/include/valgrind
   VALGRIND_CFLAGS=""
   prev_cppflags=$CPPFLAGS
   if test -z "$VALGRIND_CFLAGS"; then
      CPPFLAGS="-I/usr/include/valgrind"
      AC_CHECK_HEADER([valgrind.h], [VALGRIND_CFLAGS=$CPPFLAGS], [unset ac_cv_header_valgrind_h])
   fi
   if test -z "$VALGRIND_CFLAGS"; then
      CPPFLAGS="-I/usr/local/include/valgrind"
      AC_CHECK_HEADER([valgrind.h], [VALGRIND_CFLAGS=$CPPFLAGS], [])
   fi
   if test -n "$VALGRIND_CFLAGS"; then
      CPPFLAGS=$VALGRIND_CFLAGS
      AC_CHECK_HEADER([memcheck.h], [], [VALGRIND_CFLAGS=""])
   fi
   CPPFLAGS=$prev_cppflags
fi
AC_SUBST([VALGRIND_CFLAGS])

dnl ===================================================================
dnl Check if cups/cups.h is available 
dnl ===================================================================
if test "$test_cups" = "yes" -a "$ENABLE_CUPS" = "TRUE" ; then
    AC_CHECK_HEADER(cups/cups.h, [],
                    [AC_MSG_ERROR([cups/cups.h could not be found. libcupsys2-dev or cups???-devel missing?])], [])
fi

dnl ===================================================================
dnl Check if PAM/pam_appl.h is available on Linux or FreeBSD
dnl ===================================================================
if test "$_os" = "Linux" -o "$_os" = "FreeBSD" -o "$_os" = "GNU"; then
  AC_MSG_CHECKING([whether to enable pam support])
  if test -z "$enable_pam" || test "$enable_pam" != "no"; then
    AC_MSG_RESULT([yes])
    PAM=YES
    AC_CHECK_HEADER(security/pam_appl.h, [],
                    [AC_MSG_ERROR([pam_appl.h could not be found. libpam-dev or pam-devel missing?])], [])
    AC_MSG_CHECKING([whether to link to libpam])
    if test -n "$enable_pam_link" -a "$enable_pam_link" != "no"; then
      AC_MSG_RESULT([yes])
      PAM_LINK=YES
      AC_CHECK_LIB(pam, pam_start, [],
          [AC_MSG_ERROR(libpam not found or functional)], [])
    else
      AC_MSG_RESULT([no, dynamically open it])
      PAM_LINK=NO
    fi
  else
    AC_MSG_RESULT([no])
    PAM=NO
    PAM_LINK=NO
    dnl check getspnam_r for needed args (4 or 5)
    AX_FUNC_WHICH_GETSPNAM_R
  fi
fi
AC_SUBST(PAM)
AC_SUBST(NEW_SHADOW_API)
AC_SUBST(PAM_LINK)

if test "$_os" = "Linux"; then
    AC_MSG_CHECKING([whether to link to libcrypt])
    if test -n "$enable_crypt_link" -a "$enable_crypt_link" != "no"; then
        AC_MSG_RESULT([yes])
        CRYPT_LINK=YES
        AC_CHECK_LIB(crypt, crypt, [],
            [AC_MSG_ERROR(libcrypt not found or functional)], [])
    else
        AC_MSG_RESULT([no, dynamically open it])
        CRYPT_LINK=NO
    fi
fi
AC_SUBST(CRYPT_LINK)

dnl ===================================================================
dnl Testing for c++ compiler and version...
dnl ===================================================================
if test -n "$with_gcc_home"; then
   if test -z "$CXX"; then
      CXX="$with_gcc_home/bin/g++"
   fi
fi

if test "$_os" = "WINNT" -a "$WITH_MINGWIN" != "yes"; then
   if test -e "$CC"; then
      CXX="$CC"
   fi
fi

dnl Autoconf 2.53 can do this test for cl.exe, 2.13 can't!
if test "$_os" != "WINNT" -o "$WITH_MINGWIN" = "yes"; then
   AC_PROG_CXX
fi

dnl check if we are using a buggy version of g++ (currently 3.4.0, 3.4.1 and trunk)
if test "$GXX" = "yes"; then
   AC_MSG_CHECKING([the GNU C++ compiler version])

   _gpp_version=`$CXX -dumpversion`
   _gpp_majmin=`echo $_gpp_version | $AWK -F. '{ print \$1*100+\$2 }'`

   if test "$_os" = "Darwin" -a "$_gpp_majmin" -ge "401" ; then
      if test -z "$save_CXX" -a -x "$GCC_HOME/bin/g++-4.0" ; then
         CXX=$GCC_HOME/bin/g++-4.0
         _gpp_majmin_2=`"$CXX" -dumpversion | $AWK -F. '{ print \$1*100+\$2 }'`
         if test "$_gpp_majmin_2" -ge "400" -a "$_gpp_majmin_2" -lt "401" ; then
            _gpp_majmin=$_gpp_majmin_2
         fi
      fi
      if test "$_gpp_majmin" -ge "401" ; then
         AC_MSG_ERROR([You need to use the g++-4.0 compiler (g++ $_gpp_version won't work with the MacOSX10.4u.sdk) - set CXX accordingly])
      else
         AC_MSG_RESULT([implicitly using CXX=$CXX])
      fi
   else
      AC_MSG_RESULT([checked (g++ $_gpp_version)])
   fi

   if test "$_gpp_majmin" = "304"; then
      AC_MSG_CHECKING([whether $CXX has the enum bug])
AC_TRY_RUN([
extern "C" void abort (void);
extern "C" void exit (int status);

enum E { E0, E1, E2, E3, E4, E5 };

void
test (enum E e)
{
  if (e == E2 || e == E3 || e == E1)
  exit (1);
}

int
main (void)
{
  test (E4);
  test (E5);
  test (E0);
  return 0;
}
],[AC_MSG_ERROR([your version of the GNU C++ compile has a bug which prevents Apache OpenOffice from being compiled correctly - please check http://gcc.gnu.org/ml/gcc-patches/2004-07/msg00968.html for details.])], [AC_MSG_RESULT([no])])
   fi
fi

dnl ===================================================================
dnl Set the gcc/gxx include directories
dnl ===================================================================
# Removed the special FreeBSD treatment. The problem was that with_gxx_include_path
# often contains an i386 which is expanded as a macro. Solved in stlport.
if test "$GXX" = "yes"; then
   AC_MSG_CHECKING([for g++ include path])
   if test -z "$with_gxx_include_path"; then
      with_gxx_include_path=`echo "#include <cstring>" | $CXX -E -xc++ - | $SED -n '/.*1*"\(.*\)\/cstring".*/s//\1/p' | head -n 1`
      if test "$with_gxx_include_path" = "/usr/libexec/(null)/include"; then
          with_gxx_include_path="/usr/include"
      fi
      if test "$WITH_MINGWIN" = "yes"; then
         with_gxx_include_path=`cygpath -d "$with_gxx_include_path"`
         with_gxx_include_path=`cygpath -u "$with_gxx_include_path"`
      fi
      if echo $with_gxx_include_path | grep -q linux; then
         # workaround for Mandriva - issue 100049
         with_gxx_include_path=`cd $with_gxx_include_path && pwd`
      fi
   fi
fi
dnl This is the original code...
dnl with_gxx_include_path=`$CXX -print-search-dirs | grep instal |$AWK '{ print \$2 }'`/include 
if test -z "$with_gxx_include_path"; then
   with_gxx_include_path="NO_GXX_INCLUDE"
   AC_MSG_RESULT([no g++ includes])
else
   AC_MSG_RESULT([$with_gxx_include_path])
fi
GXX_INCLUDE_PATH="$with_gxx_include_path"
AC_SUBST(GXX_INCLUDE_PATH)

dnl ===================================================================
dnl Set the mingw runtime library include directories
dnl ===================================================================
if test "$WITH_MINGWIN" = "yes"; then
   AC_MSG_CHECKING([for mingwin runtime include path])
   cat >conftest.$ac_ext <<_ACEOF
#include <stddef.h>
#include <bits/c++config.h>
_ACEOF
   _mingw_lib_include_path=`$CXX -E -xc++ conftest.$ac_ext | $SED -n -e '/.*1*"\(.*\)\/stddef.h".*/s//\1/p' -e '/.*1*"\(.*\)\/bits\/c++config.h".*/s//\1/p' | sort -u | xargs echo`
   rm conftest.$ac_ext
   if test -n "$_mingw_lib_include_path"; then
      _temp=""
      for a in $_mingw_lib_include_path
         do
            a=`cygpath -d "$a"`
            _temp="$_temp "`cygpath -u "$a"`
         done
      _mingw_lib_include_path=$_temp
   fi
   if test -z "$_mingw_lib_include_path"; then
      _mingw_lib_include_path="NO_LIB_INCLUDE"
      AC_MSG_RESULT([no mingwin runtime includes])
   else
      AC_MSG_RESULT([$_mingw_lib_include_path])
   fi
  MINGW_LIB_INCLUDE_PATH="$_mingw_lib_include_path"
  AC_SUBST(MINGW_LIB_INCLUDE_PATH)
dnl mingw gcc 4.4.0 needs backward in include path to use hash_set/hash_map
   AC_MSG_CHECKING([for mingwin c++ backward include path])
   cat >conftest.$ac_ext <<_ACEOF
#include <hash_set>
_ACEOF
   _mingw_backward_include_path=`$CXX -E -xc++ -Wno-deprecated conftest.$ac_ext 2>&5| $SED -n -e '/.*1*"\(.*\)\/hash_set".*/s//\1/p' | sort -u | xargs echo`
   rm conftest.$ac_ext
   if test -n "$_mingw_backward_include_path"; then
      _mingw_backward_include_path=`cygpath -d $_mingw_backward_include_path`
      _mingw_backward_include_path=`cygpath -u $_mingw_backward_include_path`
      AC_MSG_RESULT([$_mingw_backward_include_path])
   else
      _mingw_backward_include_path="NO_BACKWARD_INCLUDE"
      AC_MSG_RESULT([no mingwin c++ backward includes])
   fi
  MINGW_BACKWARD_INCLUDE_PATH="$_mingw_backward_include_path"
  AC_SUBST(MINGW_BACKWARD_INCLUDE_PATH)
  mingw_crtbegin=`$CC -print-file-name=crtbegin.o`
  MINGW_CLIB_DIR=`dirname $mingw_crtbegin`
  AC_MSG_CHECKING([whether to use dynamic libgcc])
  if test -e "$MINGW_CLIB_DIR/libgcc_s.a"; then
    AC_MSG_CHECKING([dynamic libgcc name])
    MINGW_GCCDLL_pattern=`nm $MINGW_CLIB_DIR/libgcc_s.a | sed -ne 's@.* _libgcc\(.*\)_dll_iname@libgcc\1.dll@p' | uniq | sed -e 's@_@?@g'`
    MINGW_GCCDLL=`cd $COMPATH/bin && ls $MINGW_GCCDLL_pattern 2>/dev/null`
    if test -n "$MINGW_GCCDLL"; then
        MINGW_SHARED_GCCLIB=YES
        AC_MSG_RESULT([use $MINGW_GCCDLL])
    else
        AC_MSG_RESULT([no])
    fi
  else
    AC_MSG_RESULT([no])
  fi
  if test -e "$MINGW_CLIB_DIR/libgcc_eh.a"; then
      MINGW_GCCLIB_EH=YES
  fi
  AC_MSG_CHECKING([whether to use dynamic libstdc++])
  MINGW_SHARED_LIBSTDCPP=
  if test -e "$MINGW_CLIB_DIR/libstdc++_s.a" ; then
    MINGW_SHARED_LIBSTDCPP=stdc++_s
  fi
  if test -e "$MINGW_CLIB_DIR/libstdc++.dll.a" ; then
    MINGW_SHARED_LIBSTDCPP=stdc++.dll
  fi
  if test -n "$MINGW_SHARED_LIBSTDCPP" ; then
    AC_MSG_CHECKING([dynamic libstdc++ name])
    MINGW_GXXDLL_pattern=`nm $MINGW_CLIB_DIR/lib$MINGW_SHARED_LIBSTDCPP.a | sed -ne 's@.* _libstdc__\(.*\)_dll_iname@libstdc++\1.dll@p' | uniq | sed -e 's@_@?@g'`
    MINGW_GXXDLL=`cd $COMPATH/bin && ls $MINGW_GXXDLL_pattern 2>/dev/null`
    if test -n "$MINGW_GXXDLL"; then
        MINGW_SHARED_LIBSTDCPP=-l$MINGW_SHARED_LIBSTDCPP
        MINGW_SHARED_GXXLIB=YES
        AC_MSG_RESULT([use $MINGW_GXXDLL])
    else
        MINGW_SHARED_LIBSTDCPP=
        AC_MSG_RESULT([no])
    fi
  else
    AC_MSG_RESULT([no])
  fi
  MINGW_CLIB_DIR=`cygpath $MINGW_CLIB_DIR`
  AC_SUBST(MINGW_CLIB_DIR)
  AC_SUBST(MINGW_SHARED_GCCLIB)
  AC_SUBST(MINGW_GCCLIB_EH)
  AC_SUBST(MINGW_SHARED_GXXLIB)
  AC_SUBST(MINGW_SHARED_LIBSTDCPP)
  AC_SUBST(MINGW_GCCDLL)
  AC_SUBST(MINGW_GXXDLL)
fi

dnl ===================================================================
dnl Extra checking for the SUN OS compiler
dnl ===================================================================
if test "$_os" = "SunOS"; then
   dnl SunStudio C++ compiler packaged with SunStudio C compiler
   if test "$CC" = "cc"; then
   AC_MSG_CHECKING([SunStudio C++ Compiler])
      if test "$CXX" != "CC"; then
         AC_MSG_WARN([SunStudio C++ was not found])
         echo "SunStudio C++ was not found" >> warn
      else
         AC_MSG_RESULT([checked]) 
      fi
   fi 
fi
dnl ===================================================================
dnl Extra checking for the OSF compiler
dnl ===================================================================
if test "$_os" = "OSF1"; then
   AC_MSG_CHECKING([Compaq C++ compiler version])
   dnl cxx -V outputs to standard error!!!!
   _compaqcxx_version=`$CXX -V 2>&1 | $AWK '{ print $3 }'`
   _compaqcxx_major=`echo $_compaqcxx_version | $AWK -F. '{ print $1 }'`
   if test "$_compaqcxx_major" != "V6"; then
      AC_MSG_WARN([found version "$_compaqc_version", use version 6 of the Compaq C++ compiler])
      echo "found version $_compaqc_version, use version 6 of the Compaq C++ compiler" >> warn
   else
      dnl compiler will do
      AC_MSG_RESULT([checked])
   fi
fi

dnl *************************************************************
dnl Testing for exception handling - dwarf2 or sjlj exceptions...
dnl *************************************************************
AC_MSG_CHECKING([exception type])
AC_LANG_PUSH([C++])
if test "$WITH_MINGWIN" = "yes"; then
  AC_TRY_LINK(
	[#include <iostream>

extern "C" void _Unwind_SjLj_RaiseException(void) __attribute__ ((__noreturn__));

	],
	[_Unwind_SjLj_RaiseException() ],
	[exceptions_type="sjlj"],
	[exceptions_type="dwarf2"]
  )
fi

AC_MSG_RESULT($exceptions_type)
AC_LANG_POP([C++])
EXCEPTIONS="$exceptions_type"
AC_SUBST(EXCEPTIONS)

dnl ===================================================================
dnl Checks for what the default STL should be
dnl ===================================================================
   AC_MSG_CHECKING([what the default STL should be])
   DEFAULT_TO_STLPORT="no"
   if test "$_os" = "Linux"; then
     case "$build_cpu" in
       i?86)
	 case "$build_os" in k*bsd*-gnu*)
	 	DEFAULT_TO_STLPORT="no"
		;;
	 *) 
         	DEFAULT_TO_STLPORT="yes"
		;;
	  esac
         ;;
       *)
         DEFAULT_TO_STLPORT="no"
         ;;
     esac
   elif test "$_os" = "SunOS"; then
      DEFAULT_TO_STLPORT="yes"
   elif test "$_os" = "WINNT" -a "$WITH_MINGWIN" != "yes"; then
      DEFAULT_TO_STLPORT="yes"
   elif test "$_os" = "OS2"; then
      DEFAULT_TO_STLPORT="yes" 
   elif test "$_os" = "FreeBSD"; then
      DEFAULT_TO_STLPORT="yes"
   fi
   if test "$DEFAULT_TO_STLPORT" = "yes"; then
      AC_MSG_RESULT([stlport])
   else
      AC_MSG_RESULT([system])
   fi
   if test "$WITH_STLPORT" = "auto"; then
      WITH_STLPORT=$DEFAULT_TO_STLPORT
   fi

dnl ===================================================================
dnl Checks for STLPORT
dnl ===================================================================
   AC_MSG_CHECKING([for STL providing headers])
   STLPORT4=""
   USE_SYSTEM_STL=""
   if test "$WITH_STLPORT" = "yes"; then
      AC_MSG_RESULT([using internal stlport.])
      if test "$DEFAULT_TO_STLPORT" != "yes"; then
         AC_MSG_WARN([using stlport. Warning, breaks your ABI compatibility!])
         echo "using stlport. Warning: breaks your ABI compatibility!" >>warn
      fi
   elif test "$WITH_STLPORT" = "no"; then
      AC_MSG_RESULT([using system STL])
      USE_SYSTEM_STL="YES"
      if test "$DEFAULT_TO_STLPORT" != "no"; then
         AC_MSG_WARN([using system STL. Warning, breaks your ABI compatibility!])
         echo "using system STL. Warning: breaks your ABI compatibility!" >>warn
      fi
   else
      STLPORT4=$WITH_STLPORT
      if test "$_os" != "WINNT" -o "$WITH_MINGWIN" = "yes"; then
         AC_TRY_CPP($STLPORT4/stlport/hash_map, AC_MSG_RESULT([checked.]), AC_MSG_ERROR([STLport headers not found.]))
      else
         dnl AC_TRY_CPP doesn't work for MSVC because C++ preprocessor is not found by autoconf.
         if test -f "$STLPORT4/stlport/hash_map"; then
            AC_MSG_RESULT([checked.])
         else
            AC_MSG_ERROR([STLport headers not found.])
         fi
      fi
      if test "$_os" != "WINNT" -o "$WITH_MINGWIN" = "yes"; then
         AC_MSG_CHECKING([for STLport libraries])
         if test "$_os" = "SunOS"; then
		      if test -f "$STLPORT4/lib/libstlport_sunpro.so"; then
			      AC_MSG_RESULT([checked])
		      elif test -f "$STLPORT4/lib/libstlport.so"; then
			      AC_MSG_RESULT([checked])
			      STLPORT_VER=500
		      else
			      AC_MSG_ERROR([STLport libraries not found])
		      fi
	      elif test "$_os" = "Darwin"; then
		      if test -f "$STLPORT4/lib/libstlport_gcc.dylib"; then
			      AC_MSG_RESULT([checked])
		      elif test -f "$STLPORT4/lib/libstlport.dylib"; then
			      AC_MSG_RESULT([checked])
			      STLPORT_VER=500
		      else
			      AC_MSG_ERROR([STLport libraries not found])
		      fi
		   else
			   if test -f "$STLPORT4/lib/libstlport_gcc.so"; then
				   AC_MSG_RESULT([checked])
			   elif test -f "$STLPORT4/lib/libstlport.so"; then
				   AC_MSG_RESULT([checked])
				   STLPORT_VER=500
			   else
				   AC_MSG_ERROR([STLport libraries not found])
			   fi
		   fi
	   fi
      if test "$DEFAULT_TO_STLPORT" != "yes"; then
         AC_MSG_WARN([using stlport. Warning: breaks your ABI compatibility!])
         echo "using stlport. Warning: breaks your ABI compatibility!" >>warn
      fi
   fi

if test -z "$STLPORT4"; then
  STLPORT4="NO_STLPORT4"
fi
if test -z "$STLPORT_VER"; then
  STLPORT_VER=400
fi
AC_SUBST(STLPORT4)
AC_SUBST(STLPORT_VER)
AC_SUBST(USE_SYSTEM_STL)

dnl ===================================================================
dnl visibility feature
dnl ===================================================================
if test "$GCC" = "yes"; then
   AC_MSG_CHECKING([whether $CC supports -fvisibility=hidden])
   save_CFLAGS=$CFLAGS
   CFLAGS="$CFLAGS -fvisibility=hidden"
   AC_TRY_LINK([], [ return 0; ], [ HAVE_GCC_VISIBILITY_FEATURE=TRUE ], [])
   CFLAGS=$save_CFLAGS
   if test "$HAVE_GCC_VISIBILITY_FEATURE" = "TRUE"; then
      AC_MSG_RESULT([yes])
   else
      AC_MSG_RESULT([no])
   fi
fi

# ===================================================================
# use --ccache-skip?
# ===================================================================
dnl used to escape compiler options for ccache that otherwise prevent 
dnl caching of the results (like "-x objective-c++" for Mac)
AC_MSG_CHECKING([whether we are allowed and able to use --ccache-skip])
if test "$_os" != "Darwin" ; then
   AC_MSG_RESULT([only used on Mac currently, skipping])
elif test "$enable_ccache_skip" = "no" ; then
   AC_MSG_RESULT([no - diabled explicitly])
elif test "$enable_ccache_skip" = "yes" ; then
   AC_MSG_RESULT([yes - enabled explicitly, skipping checks])
   AC_SUBST([USE_CCACHE], [YES])
elif test "$enable_ccache_skip" = "auto" ; then
   # checking for ccache presence/version
   AC_MSG_RESULT([probing...])
   AC_PATH_PROG([CCACHE],[ccache],[not_found])
   if test "$CCACHE" = "not_found" ; then
      AC_MSG_NOTICE([not enabling --ccache-skip (ccache not found)])
   else
      # check ccache version 
      AC_MSG_CHECKING([whether version of ccache is suitable])
      CCACHE_VERSION=`"$CCACHE" -V | "$AWK" '/^ccache version/{print $3}'`
      if test "$CCACHE_VERSION" = "2.4_OOo"; then
         AC_MSG_RESULT([yes])
         AC_MSG_CHECKING([whether ccache is actually used for the build])
         AC_LANG_PUSH([C++])
         save_CXXFLAGS=$CXXFLAGS
         CXXFLAGS="$CXXFLAGS --ccache-skip -O2"
         dnl an empty program will do, we're checking the compiler flags
         AC_COMPILE_IFELSE([AC_LANG_PROGRAM([],[])], 
            [use_ccache=yes], [use_ccache=no])
         if test $use_ccache = yes ; then
            AC_MSG_RESULT([yes, will enable --ccache-skip])
            AC_SUBST([USE_CCACHE], [YES])
         else
            AC_MSG_RESULT([no, will not enable --ccache-skip])
         fi
         CXXFLAGS=$save_CXXFLAGS
         AC_LANG_POP([C++])
      else
         AC_MSG_RESULT([no])
         AC_MSG_NOTICE([ccache version $CCACHE_VERSION not accepted. See description for --enable-ccache-skip])
      fi
   fi
else
   AC_MSG_ERROR([invalid option to --enable-ccache-skip. Valid values are "auto", "yes" and "no"])
fi

dnl ===================================================================
dnl system stl sanity tests
dnl ===================================================================
if test "$USE_SYSTEM_STL" = "YES"; then
   AC_MSG_CHECKING([if hash_map will be in __gnu_cxx namespace])
   AC_LANG_PUSH([C++])

   AC_TRY_COMPILE([#include <ext/hash_map>
using namespace __gnu_cxx;
],[hash_map<int, int> t; return 0;],
  ac_cv_cxx_have_ext_hash_map=yes, ac_cv_cxx_have_ext_hash_map=no)

   if test "$ac_cv_cxx_have_ext_hash_map" = "no"; then
      AC_MSG_ERROR([Can't find hash_map. Try with --with-stlport])
   else
      AC_MSG_RESULT([$ac_cv_cxx_have_ext_hash_map])
   fi

   if test "$HAVE_GCC_VISIBILITY_FEATURE" = "TRUE"; then
      AC_MSG_CHECKING([if STL headers are visibility safe])
      AC_EGREP_HEADER(visibility push, string, stlvisok=yes, stlvisok=no)
      AC_MSG_RESULT([$stlvisok])
      if test "$stlvisok" = "no"; then
         AC_MSG_WARN([Your gcc STL headers are not visibility safe. Disabling visibility])
         echo "Your gcc STL headers are not visibility safe. Disabling visibility" >> warn
         unset HAVE_GCC_VISIBILITY_FEATURE
      fi
   fi

   if test "$HAVE_GCC_VISIBILITY_FEATURE" = "TRUE"; then
      sharedlink_ldflags_save=$LDFLAGS
      LDFLAGS="$LDFLAGS -fvisibility-inlines-hidden -fpic -shared"

      AC_MSG_CHECKING([if gcc is -fvisibility-inlines-hidden safe with STL headers])
      AC_TRY_LINK([#include <sstream>
using namespace std;
],[istringstream strm( "test" ); return 0;],
      $EGREP -q  unresolvable conftest.err;
      if test $? -eq 0; then gccvisok=no; else gccvisok=yes; fi, 
      gccvisok=no)
      AC_MSG_RESULT([$gccvisok])
      if test "$gccvisok" = "no"; then
         AC_MSG_WARN([Your gcc is not -fvisibility-inlines-hidden safe. Disabling visibility])
         echo "Your gcc is not -fvisibility-inlines-hidden safe. Disabling visibility" >> warn
         unset HAVE_GCC_VISIBILITY_FEATURE
      fi

      LDFLAGS=$sharedlink_ldflags_save
   fi

   if test "$HAVE_GCC_VISIBILITY_FEATURE" = "TRUE"; then
      AC_MSG_CHECKING([if gcc has a visibility bug with class-level attributes (GCC bug 26905)])
      cat >visibility.cxx <<_ACEOF
#pragma GCC visibility push(hidden)
struct __attribute__ ((visibility ("default"))) TestStruct {
  static void Init();
};
__attribute__ ((visibility ("default"))) void TestFunc() {
  TestStruct::Init();
}
_ACEOF
      if ! $CXX $CXXFLAGS $CPPFLAGS -fpic -S visibility.cxx 2>/dev/null > /dev/null; then
         gccvisbroken=yes
      else
         case "$build_cpu" in
            i?86|x86_64)
               if $EGREP -q '@PLT' visibility.s; then
                  gccvisbroken=no
               else 
                  gccvisbroken=yes
               fi
               ;;
            *)
               gccvisbroken=no
               ;;
         esac
      fi
      rm -f visibility.s visibility.cxx

      AC_MSG_RESULT([$gccvisbroken])
      if test "$gccvisbroken" = "yes"; then
         AC_MSG_WARN([Your gcc is not -fvisibility=hidden safe. Disabling visibility])
         echo "Your gcc is not -fvisibility=hidden safe. Disabling visibility" >> warn
         unset HAVE_GCC_VISIBILITY_FEATURE
      fi
   fi

   AC_LANG_POP([C++])
fi

AC_SUBST(HAVE_GCC_VISIBILITY_FEATURE)

dnl ===================================================================
dnl allocator
dnl ===================================================================
AC_MSG_CHECKING([which memory allocator to use])
if test "$with_alloc" = "system"; then
    AC_MSG_RESULT([system])
    ALLOC="SYS_ALLOC";
    AC_CHECK_FUNCS([malloc realloc calloc free])
fi
if test "$with_alloc" = "tcmalloc"; then
    AC_MSG_RESULT(tcmalloc)
    if ! echo $build_cpu | grep -E 'i[[3456]]86' 2>/dev/null >/dev/null; then
        AC_MSG_ERROR([tcmalloc only available/usable on ix86])
    fi
    AC_CHECK_LIB(tcmalloc, malloc, [],
        [AC_MSG_ERROR(tcmalloc not found or functional. Install the Google Profiling Tools)], [])
    ALLOC="TCMALLOC";
fi
if test "$with_alloc" = "jemalloc"; then
  if test "$_os" != "FreeBSD" -o "$_os" != "NetBSD"; then
    AC_MSG_RESULT(jemalloc)
    save_CFLAGS=$CFLAGS
    CFLAGS="$CFLAGS -pthread"
    AC_CHECK_LIB(jemalloc, malloc, [],
        [AC_MSG_ERROR(jemalloc not found or functional. Install the jemalloc allocator.)], [])
    ALLOC="JEMALLOC";
    CFLAGS=$save_CFLAGS
  else
    AC_MSG_RESULT([system])
    ALLOC="SYS_ALLOC";
    AC_CHECK_FUNCS([malloc realloc calloc free])
  fi
fi
if test "$with_alloc" = "internal" -o -z "$with_alloc"; then
   AC_MSG_RESULT([internal])
fi
AC_SUBST(ALLOC)

dnl ===================================================================
dnl Custom build version
dnl ===================================================================

AC_MSG_CHECKING([whether to add custom build version])
if test "z$with_build_version" != "z"; then
   BUILD_VER_STRING=$with_build_version
   AC_MSG_RESULT([yes, $BUILD_VER_STRING])
else
   BUILD_VER_STRING=
   AC_MSG_RESULT([no])
fi
AC_SUBST(BUILD_VER_STRING)

dnl ===================================================================
dnl Java support enable
dnl ===================================================================
AC_MSG_CHECKING([whether to build with Java support])
if test "$WITH_JAVA" != "no"; then
   AC_MSG_RESULT([yes])
   SOLAR_JAVA="TRUE"
else
   AC_MSG_RESULT([no])
   SOLAR_JAVA=""

   AC_MSG_WARN([building without java will mean some features will not be available])
   echo "building without java will mean some features will not be available" >>warn
fi
AC_SUBST(SOLAR_JAVA)

if test "$_os" = "Linux" && test "$build_cpu" = "powerpc"; then
   # IBMs JDK needs this...
   JITC_PROCESSOR_TYPE=6
   export JITC_PROCESSOR_TYPE
fi

if test "$_os" = "WINNT"; then
   if test -z "$with_jdk_home"; then
      _jdk_home=`./oowintool --jdk-home`
       if test -d "$_jdk_home"; then
          with_jdk_home="$_jdk_home"
       fi
   else
      with_jdk_home=`cygpath -u "$with_jdk_home"`
   fi
fi

dnl ===================================================================
dnl Checks for java
dnl ===================================================================
if test "$SOLAR_JAVA" != ""; then
   JAVA_HOME=; export JAVA_HOME
   if test -z "$with_jdk_home"; then
      AC_PATH_PROG(JAVAINTERPRETER, $WITH_JAVA)
   else
      _java_path="$with_jdk_home/bin/$WITH_JAVA"
      dnl Check if there is a java interpreter at all.
      if test -x "$_java_path"; then
         JAVAINTERPRETER=$_java_path
      else
         AC_MSG_ERROR([$_java_path not found, please use --with-jdk-home])
      fi
   fi
   if test "$_os" = "WINNT"; then
      if test x`echo "$JAVAINTERPRETER" | grep -i '\.exe$'` = x; then
          JAVAINTERPRETER="${JAVAINTERPRETER}.exe"
      fi
      JAVAINTERPRETER=`cygpath -d "$JAVAINTERPRETER"`
      JAVAINTERPRETER=`cygpath -u "$JAVAINTERPRETER"`
   elif test "$_os" = "Darwin"; then
      dnl HACK:  There currently is only a 32 bit version of OOo for Mac OS X,
      dnl and Tiger java complains about -d32 while Snow Leopard java needs it
      dnl to run in 32 bit mode and be able to load OOo jnilibs:
      AC_MSG_CHECKING([whether to pass -d32 to Java interpreter])
      if "$JAVAINTERPRETER" -d32 >&5 2>&5; then
         AC_MSG_RESULT([yes])
         JAVAIFLAGS=-d32
      else
         AC_MSG_RESULT([no])
      fi
   fi
fi

dnl ===================================================================
dnl Checks for JDK.
dnl ===================================================================
if test "$SOLAR_JAVA" != ""; then
   _gij_longver=0
   AC_MSG_CHECKING([the installed JDK])
   if test -n "$JAVAINTERPRETER"; then
      dnl java -version sends output to stderr!
      if test `$JAVAINTERPRETER -version 2>&1 | grep -c "Kaffe"` -gt 0; then
         AC_MSG_ERROR([No valid check available. Please check the block for your desired java in configure.in])
#        dnl Kaffe specific tests
#        KAFFE_VER=`$JAVAINTERPRETER -version 2>&1 | $EGREP "  Version:" | $SED -r "s/.*  Version: ([[0-9\.]]*).*/\1/"`
#        if test -z "$KAFFE_VER"; then
#          AC_MSG_ERROR([looks like Kaffe but version detection failed])
#        fi
#        _kaffe_ver=`echo "$KAFFE_VER" | $AWK -F. '{ print (($1 * 100) + $2) * 100 + $3;}'`
#        if test "$_kaffe_ver" -lt 10100; then
#           AC_MSG_ERROR([Kaffe is too old ($KAFFE_VER - $_kaffe_ver), you need at least 1.1.0])
#        fi
#        JDK=kaffe
#        
#        dnl TODO: define some project exclusion variables
#        
#        AC_MSG_RESULT([checked (Kaffe $KAFFE_VER)])
#        AC_MSG_WARN([EXPERIMENTAL: Kaffe is not a full JDK replacement - some projects will fail to compile])
#        echo "EXPERIMENTAL: Kaffe is not a full JDK replacement - some projects will fail to compile" >>warn
#        JAVA_HOME=`echo $JAVAINTERPRETER | $SED -n "s,//*bin//*java,,p"`
      elif test `$JAVAINTERPRETER --version 2>&1 | grep -c "GNU libgcj"` -gt 0; then
        JDK=gcj
        AC_MSG_RESULT([checked (gcj)]) 
        _gij_version=`$JAVAINTERPRETER --version | grep GNU | $SED -e 's@^[[^0-9]]*@@' -e 's@ .*@@' -e 's@,.*@@'`;
        _gij_longver=`echo $_gij_version | $AWK -F. '{ print \$1*10000+\$2*100+\$3 }'`

      elif test `$JAVAINTERPRETER -version 2>&1 | awk '{ print }' | grep -c "BEA"` -gt 0; then
         AC_MSG_ERROR([No valid check available. Please check the block for your desired java in configure.in])
#        JDK=bea
#
#        dnl BEA JDK specific tests
#        _jdk=`$JAVAINTERPRETER -version 2>&1 | $AWK -F'"' '{ print \$2 }' | $SED s/[[-A-Za-z]]*//`
#        _jdk_ver=`echo "$_jdk" | $AWK -F. '{ print (($1 * 100) + $2) * 100 + $3;}'`
#
#        if test "$_jdk_ver" -lt 10500; then
#          AC_MSG_ERROR([JDK is too old, you need at least BEA JDK 1.5.0])
#        fi
#
#        AC_MSG_RESULT([checked (BEA JDK $_jdk)])
#
#        if test "$with_jdk_home" = ""; then
#             AC_MSG_ERROR([In order to successfully build Apache OpenOffice using the BEA JDK,
#you must use the "--with-jdk-home" configure option explicitly])
#        fi
#
#        AC_MSG_WARN([A bug in certain BEA JREs can prevent you from successfully compiling some modules])
#        echo "A bug in certain BEA JREs can prevent you from successfully compiling some modules" >>warn
#
#        JAVA_HOME=$with_jdk_home
#
      elif test `$JAVAINTERPRETER -version 2>&1 | awk '{ print }' | grep -c "IBM"` -gt 0; then
        JDK=ibm

        dnl IBM JDK specific tests
        _jdk=`$JAVAINTERPRETER -version 2>&1 | $AWK -F'"' '{ print \$2 }' | $SED s/[[-A-Za-z]]*//`
        _jdk_ver=`echo "$_jdk" | $AWK -F. '{ print (($1 * 100) + $2) * 100 + $3;}'`
   
        if test "$_jdk_ver" -lt 10500; then
             AC_MSG_ERROR([IBM JDK is too old, you need at least 1.5])
        fi

        AC_MSG_RESULT([checked (IBM JDK $_jdk)])

        if test "$with_jdk_home" = ""; then
             AC_MSG_ERROR([In order to successfully build Apache OpenOffice using the IBM JDK,
you must use the "--with-jdk-home" configure option explicitly])
        fi

        JAVA_HOME=$with_jdk_home
	
      else	
        JDK=sun

        dnl SUN JDK specific tests
        _jdk=`$JAVAINTERPRETER -version 2>&1 | $AWK -F'"' '{ print \$2 }' | $SED s/[[-A-Za-z]]*//`
        _jdk_ver=`echo "$_jdk" | $AWK -F. '{ print (($1 * 100) + $2) * 100 + $3;}'`
   
        if test "$_jdk_ver" -lt 10500; then
             AC_MSG_ERROR([JDK is too old, you need at least 1.5])
        fi
        AC_MSG_RESULT([checked (JDK $_jdk)])
        JAVA_HOME=`echo $JAVAINTERPRETER | $SED -n "s,//*bin//*java,,p"`
        if test "$_os" = "WINNT"; then
          JAVA_HOME=`echo $JAVA_HOME | $SED "s,\.[[eE]][[xX]][[eE]]$,,"`
        fi
        if test "$_os" = "OS2"; then
          JAVA_HOME=`echo $JAVA_HOME | $SED "s,\.[[eE]][[xX]][[eE]]$,,"`
        fi
      fi
   else
      AC_MSG_ERROR([JAVA not found. You need at least jdk-1.5, or gcj-4])
   fi
else
   dnl Java disabled
   JAVA_HOME=NO_JAVA_HOME ; export JAVA_HOME
fi

dnl ===================================================================
dnl Checks for javac
dnl ===================================================================
if test "$SOLAR_JAVA" != ""; then
    if test "$JDK" = "gcj"; then 
        javacompiler=`echo $WITH_JAVA | $SED -e "s/gij/gcj/g" | $SED -e "s/java/javac/g"`
    else
        javacompiler="javac"
    fi
    if test "$_os" = "OS2"; then
      if test x`echo "$javacompiler" | grep -i '\.exe$'` = x; then
          javacompiler="${javacompiler}.exe"
      fi
    fi
    if test -z "$with_jdk_home"; then
        AC_PATH_PROG(JAVACOMPILER, $javacompiler)
    else
        _javac_path="$with_jdk_home/bin/$javacompiler"
        dnl Check if there is a java compiler at all.
        if test -x "$_javac_path"; then
            JAVACOMPILER=$_javac_path
        fi
    fi
    if test -z "$JAVACOMPILER"; then
      AC_MSG_ERROR([$javacompiler not found, please use --with-jdk-home])
    fi
    if test "$_os" = "WINNT"; then
       if test x`echo "$JAVACOMPILER" | grep -i '\.exe$'` = x; then
          JAVACOMPILER="${JAVACOMPILER}.exe"
       fi
       JAVACOMPILER=`cygpath -d "$JAVACOMPILER"`
       JAVACOMPILER=`cygpath -u "$JAVACOMPILER"`
    fi
    if test "$_os" = "OS2"; then
       if test x`echo "$JAVACOMPILER" | grep -i '\.exe$'` = x; then
          JAVACOMPILER="${JAVACOMPILER}.exe"
       fi
    fi

    if test `$JAVACOMPILER -version 2>&1 | grep -c "Eclipse Java Compiler"` -gt 0; then
        AC_MSG_CHECKING([re-checking JDK])
        JDK=gcj
        AC_MSG_RESULT([checked (ecj)])
        #TODO: what's to do here? some switch to do 1.5 compiling?
        JAVAFLAGS="-source 1.5 -target 1.5"
        _gij_longver="40200"
    fi
fi

JAVACISGCJ=""
dnl ===================================================================
dnl Checks that javac is gcj
dnl ===================================================================
if test "$SOLAR_JAVA" != ""; then
    if test `$JAVACOMPILER --version 2>&1 | grep -c "GCC"` -gt 0; then
        JAVACISGCJ="yes"
    fi
fi
AC_SUBST(JAVACISGCJ)

dnl ===================================================================
dnl Checks for javadoc
dnl ===================================================================
if test "$SOLAR_JAVA" != ""; then
    if test -z "$with_jdk_home"; then
        AC_PATH_PROG(JAVADOC, javadoc)
    else
        _javadoc_path="$with_jdk_home/bin/javadoc"
        if test "$_os" = "OS2"; then
          if test x`echo "$_javadoc_path" | grep -i '\.exe$'` = x; then
              _javadoc_path="${_javadoc_path}.exe"
          fi
        fi
        dnl Check if there is a javadoc at all.
        if test -x "$_javadoc_path"; then
            JAVADOC=$_javadoc_path
        else
            AC_PATH_PROG(JAVADOC, javadoc)
        fi
    fi
    if test -z "$JAVADOC"; then
      AC_MSG_ERROR([$_javadoc_path not found, please use --with-jdk-home])
    fi
    if test "$_os" = "WINNT"; then
        if test x`echo "$JAVADOC" | grep -i '\.exe$'` = x; then
            JAVADOC="${JAVADOC}.exe"
        fi
        JAVADOC=`cygpath -d "$JAVADOC"`
        JAVADOC=`cygpath -u "$JAVADOC"`
    fi
    if test "$_os" = "OS2"; then
        if test x`echo "$JAVADOC" | grep -i '\.exe$'` = x; then
            JAVADOC="${JAVADOC}.exe"
        fi
    fi
fi

if test "$SOLAR_JAVA" != ""; then
    dnl first check if we have been asked to autodetect JAVA_HOME with a recent gij
    if test "$JDK" = "gcj" -a -z "$JAVA_HOME"; then
      if test "x$with_jdk_home" = "x" -a "$_gij_longver" -ge "40200"; then
        cat > findhome.java <<_ACEOF
[import java.io.File;

class findhome
{
    public static void main(String args[])
    {
        String jrelocation = System.getProperty("java.home");
        File jre = new File(jrelocation);
        System.out.println(jre.getParent());
    }
}]
_ACEOF
        AC_MSG_CHECKING([if javac works])
        javac_cmd="$JAVACOMPILER findhome.java 1>&2"
        AC_TRY_EVAL(javac_cmd)
        if test $? = 0 && test -f ./findhome.class ; then
          AC_MSG_RESULT([javac works])
        else
          echo "configure: javac test failed" >&5
          cat findhome.java >&5
          AC_MSG_ERROR([javac does not work - java projects will not build!])
        fi

        AC_MSG_CHECKING([if gij knows its java.home])
        JAVA_HOME=`$JAVAINTERPRETER findhome`
        if test $? = 0 && test "$JAVA_HOME" != "" ; then
          AC_MSG_RESULT([$JAVA_HOME])
        else
          echo "configure: java test failed" >&5
          cat findhome.java >&5
          AC_MSG_ERROR([gij does not know its java.home - use --with-jdk-home])
        fi
      else
        JAVA_HOME=`echo $JAVAINTERPRETER | $SED -n "s,//*bin//*$WITH_JAVA,,p"`
      fi
    fi

    dnl second sanity check JAVA_HOME if possible
    if test "$JDK" != "gcj" -o "$_gij_longver" -ge "40200"; then
      # check if JAVA_HOME was (maybe incorrectly?) set automatically to /usr
      if test "$JAVA_HOME" = "/usr" -a "x$with_jdk_home" = "x"; then
         javac_link_f=`readlink -f "$JAVACOMPILER" 2>/dev/null`
         if test $? == 0 && test "$JAVACOMPILER" != "$javac_link_f"; then
          # try to recover first by looking whether we have a alternatives 
          # system as in Debian or newer SuSEs where following /usr/bin/javac
          # over /etc/alternatives/javac leads to the right bindir where we
          # just need to strip a bit away to get a valid JAVA_HOME
          # Solaris 11 is even worse, because target is relative, so use -f
            JAVA_HOME="$javac_link_f"
         elif readlink $JAVACOMPILER >/dev/null 2>/dev/null; then
          # Darwin readlink(1) is so primitive it doesn't even support -f
          # maybe only one level of symlink (e.g. on Mac)
            JAVA_HOME=`readlink $JAVACOMPILER`
         else
          # else warn
          AC_MSG_WARN([JAVA_HOME is set to /usr - this is very likely to be incorrect])
          AC_MSG_WARN([if this is the case, please inform the correct JAVA_HOME with --with-jdk-home])
          echo "JAVA_HOME is set to /usr - this is very likely to be incorrect" >> warn
          echo "if this is the case, please inform the correct JAVA_HOME with --with-jdk-home" >> warn
          fi
         dnl now that we have the path to the real javac, make a JAVA_HOME out of it..
         if test "$JAVA_HOME" != "/usr"; then
            if test "$_os" = "Darwin"; then
               dnl Leopard returns a non-suitable path with readlink - points to "Current" only
               JAVA_HOME=$(echo $JAVA_HOME | $SED -e s,/Current/Commands/javac$,/CurrentJDK/Home,)
               dnl Tiger already returns a JDK path..
               JAVA_HOME=$(echo $JAVA_HOME | $SED -e s,/CurrentJDK/Commands/javac$,/CurrentJDK/Home,)
            else
               JAVA_HOME=$(echo $JAVA_HOME | $SED -e s,/bin/javac$,,)
            fi
         fi
      fi
      # now check if $JAVA_HOME is really valid
      if test "$_os" = "Darwin"; then
         if test ! -f "$JAVA_HOME/lib/jvm.cfg" -a "x$with_jdk_home" = "x"; then
            JAVA_HOME_OK="NO"
         fi
      elif test ! -d "$JAVA_HOME/jre" -a "x$with_jdk_home" = "x"; then
         JAVA_HOME_OK="NO"
      fi
      if test "$JAVA_HOME_OK" = "NO"; then
         AC_MSG_WARN([JAVA_HOME was not explicitly informed with --with-jdk-home. the configure script])
         AC_MSG_WARN([attempted to find JAVA_HOME automatically, but apparently it failed])
         AC_MSG_WARN([in case JAVA_HOME is incorrectly set, some projects with not be built correctly])
         echo "JAVA_HOME was not explicitly informed with --with-jdk-home. the configure script" >> warn
         echo "attempted to find JAVA_HOME automatically, but apparently it failed" >> warn
         echo "in case JAVA_HOME is incorrectly set, some projects with not be built correctly" >> warn
#         if test "$JDK" = "gcj"; then
#             echo "e.g. install java-1.4.2-gcj-compat-devel and use --with-jdk-home=/usr/lib/jvm/java-1.4.2-gcj" >> warn
#         fi
      fi
    fi
fi

AWTLIB=
if test "$SOLAR_JAVA" != ""; then
   AC_MSG_CHECKING([for jawt lib name])
   if test "$JDK" = "gcj"; then 
      save_CFLAGS=$CFLAGS
      save_LDFLAGS=$LDFLAGS
      CFLAGS="$CFLAGS -I$JAVA_HOME/include"
      LDFLAGS="$LDFLAGS -L$JAVA_HOME/lib -lgcj"
      exec 6>/dev/null # no output
      AC_CHECK_HEADER(jni.h, [],
                    [AC_MSG_ERROR([jni.h could not be found. Mismatch between gcc and libgcj or libgcj-devel missing?])], [])
      AC_CHECK_LIB(gcjawt, JAWT_GetAWT, [ AWTLIB="-lgcjawt -lgcj"] )
      exec 6>&1 # output on again
      CFLAGS=$save_CFLAGS
      LDFLAGS=$save_LDFLAGS
   fi
   # IBM SDK 1.5.0-sr5 includes libjawt.so with unresolved symbols.
   # A workaround is to link also against libpmawt.so
   if test "$JDK" = "ibm" ; then
      save_CFLAGS=$CFLAGS
      save_LDFLAGS=$LDFLAGS
      save_LD_LIBRARY_PATH=$LD_LIBRARY_PATH
      CFLAGS="$CFLAGS -I$JAVA_HOME/include"
      LDFLAGS="$LDFLAGS -L$JAVA_HOME/jre/bin"
      LD_LIBRARY_PATH=$JAVA_HOME/jre/bin:$JAVA_HOME/jre/bin/classic:$JAVA_HOME/jre/bin/xawt:$LD_LIBRARY_PATH
      export LD_LIBRARY_PATH
      exec 6>/dev/null # no output
      AC_CHECK_HEADER(jni.h, [],
                    [AC_MSG_ERROR([jni.h could not be found.])], [])
      AC_CHECK_LIB(jawt, JAWT_GetAWT, [ AWTLIB="-ljawt"] )
      if test -z "$AWTLIB"; then
         LDFLAGS="$LDFLAGS -L$JAVA_HOME/jre/bin/xawt -ljawt"
         AC_CHECK_LIB(mawt, JAWT_GetAWT, [ AWTLIB="-L$JAVA_HOME/jre/bin/xawt -ljawt -lmawt"])
      fi
      exec 6>&1 # output on again
      CFLAGS=$save_CFLAGS
      LDFLAGS=$save_LDFLAGS
      LD_LIBRARY_PATH=$save_LD_LIBRARY_PATH
   fi
   if test -z "$AWTLIB"; then
      AWTLIB=-ljawt
   fi
   AC_MSG_RESULT([$AWTLIB])
   AC_SUBST(AWTLIB)
fi

dnl ===================================================================
dnl Check for optional gcj for AOT
dnl ===================================================================
if test "$SOLAR_JAVA" != ""; then
  AC_MSG_CHECKING([whether to enable gcj aot compilation])
  if test -n "$enable_gcjaot" && test "$enable_gcjaot" != "no"; then
     AC_MSG_RESULT([yes])
     if test `echo $WITH_JAVA | grep -c "gij"` -eq 0; then
        gcjaot="gcj"
     else
        gcjaot=`echo $WITH_JAVA | $SED -e "s/gij/gcj/g"`
     fi
     AC_MSG_RESULT([$gcjaot])
     if test -n "$with_jdk_home"; then
        _javac_path="$with_jdk_home/bin/$gcjaot"
        dnl Check if there is a gcj at all.
        if test -x "$_javac_path"; then
           JAVAAOTCOMPILER=$_javac_path
        fi
     fi
     if test -z "$JAVAAOTCOMPILER"; then
        AC_PATH_PROG(JAVAAOTCOMPILER, $gcjaot)
     fi
     if test -z "$JAVAAOTCOMPILER"; then
        AC_MSG_WARN([$gcjaot not found, please use --with-jdk-home])
     fi
  else
     AC_MSG_RESULT([no])
  fi
fi

AC_SUBST(JAVA_HOME)
AC_SUBST(JDK)
AC_SUBST(JAVAFLAGS)
AC_SUBST(JAVAINTERPRETER)
AC_SUBST(JAVAIFLAGS)
AC_SUBST(JAVACOMPILER)
AC_SUBST(JAVAAOTCOMPILER)
AC_SUBST(JAVADOC)

dnl ===================================================================
dnl Checks for specific files.
dnl ===================================================================

dnl ===================================================================
dnl Checks for programs.
dnl ===================================================================

AC_MSG_CHECKING([whether to enable EPM for packing])
if test "$enable_epm" = "yes"; then
   AC_MSG_RESULT([yes])
   dnl ===================================================================
   dnl Check for epm - not needed for windows
   dnl ===================================================================
   if test "$_os" != "WINNT"; then
      if test -n "$with_epm"; then
	      EPM=$with_epm
      else
         AC_PATH_PROG(EPM, epm, no)
      fi

      if test "$EPM" = "no" && test -n "$with_epm_url" ; then
         # At this moment we can not verify the URL or the content that we want to download.
      	 # Neither can we apply the test below for ruling out that it is the SunStudio dmake.
       	 EPM_URL=$with_epm_url
       	 AC_MSG_RESULT([epm will be downloaded and compiled in bootstrap])
       	 EPM=
         echo "EPM will be built."
         BUILD_EPM=YES
         BUILD_TYPE="$BUILD_TYPE EPM"
      else
         if test "$EPM" = "no" ; then
	    AC_MSG_ERROR([no. Install ESP Package Manager (www.easysw.com/epm) and/or specify the path to the right epm (--with-epm). Or specify an Url to an epm-3.7 source package (--with-epm-url)])
	 else
	    # Gentoo has some epm which is something different...
            AC_MSG_CHECKING([whether the found epm is the right epm])
            if $EPM | grep "ESP Package Manager" >/dev/null 2>/dev/null; then
               AC_MSG_RESULT([yes])
            else
	       AC_MSG_ERROR([no. Install ESP Package Manager (www.easysw.com/epm) and/or specify the path to the right epm])
            fi
            AC_MSG_CHECKING([epm version])
            EPM_VERSION=`$EPM | grep 'ESP Package Manager' | cut -d' ' -f4 | $SED -e s/v//`
	    if test "`echo $EPM_VERSION | cut -d'.' -f1`" -gt "3" || \
	       	    test "`echo $EPM_VERSION | cut -d'.' -f1`" -eq "3" -a "`echo $EPM_VERSION | cut -d'.' -f2`" -ge "7"; then
               AC_MSG_RESULT([OK, >= 3.7])
               BUILD_EPM=NO
	       if test "$_os" = "Darwin"; then
                  AC_MSG_CHECKING([which PackageMaker EPM thinks to use])
        	  _pm=`strings $EPM | grep PackageMaker | cut -d" " -f1`
        	  if test "$_pm" = "/Developer/Applications/PackageMaker.app/Contents/MacOS/PackageMaker"; then
          	     AC_MSG_ERROR([$_pm; PackageMaker expected in wrong path. Either patch your epm with the right path (/Developer/Applications/Utilities/PackageMaker.app/Contents/MacOS/PackageMaker)])
        	  elif test "$_pm" = "/Developer/Applications/Utilities/PackageMaker.app/Contents/MacOS/PackageMaker"; then
          	     AC_MSG_RESULT([$_pm, ok])
        	  else # we never should get here, but go safe
		     AC_MSG_ERROR([$_pm; PackageMaker expected in unknown path. Either patch your epm with the right path (/Developer/Applications/Utilities/PackageMaker.app/Contents/MacOS/PackageMaker)])
		  fi
	       fi
	    else
               AC_MSG_ERROR([too old. epm >= 3.7 is required.])
	    fi
      	 fi
      fi
   fi

   # test which package format to use
   AC_MSG_CHECKING([which package format to use])

   # defaults
   case "$_os" in
	OS2)
		PKGFORMAT=native
		;;
	Darwin)
		PKGFORMAT=dmg
		;;
	SunOS)
		PKGFORMAT=pkg
		;;
	Linux)
      # if building on Debian, default should be deb...
      if test -e /etc/debian_version; then
         PKGFORMAT=deb
      else
         PKGFORMAT=rpm
      fi
		;;
	AIX)
		PKGFORMAT=aix
		;;
	*BSD)
		PKGFORMAT=bsd
		;;
	OSF1)
		PKGFORMAT=setld
		;;
    WINNT)
        PKGFORMAT=msi
        ;;
	# we never should get here since we check the arciecture/os at the beginning,
	# but go sure...
	*)
		AC_MSG_ERROR([unknown system])
   esac
   if test -n "$with_package_format"; then
	for i in $with_package_format; do 
		case "$i" in
			aix | bsd | deb | inst | tardist | osx | pkg | rpm | setld | native | portable | archive | dmg | installed | msi)
			;;
		*)
			AC_MSG_ERROR([unsupported format $i. Supported by EPM are:
aix - AIX software distribution
bsd - FreeBSD, NetBSD, or OpenBSD software distribution
depot or swinstall - HP-UX software distribution
deb - Debian software distribution
inst or tardist - IRIX software distribution
osx - MacOS X software distribution
pkg - Solaris software distribution
rpm - RedHat software distribution
setld - Tru64 (setld) software distribution
native - "Native" software distribution for the platform
portable - Portable software distribution
OOo additionally supports:
archive - .tar.gz or .zip
dmg - Mac OS X .dmg
installed - installation tree
msi - Windows .msi
			]) 
			;;
		esac
	done
	PKGFORMAT="$with_package_format"
   fi
   AC_MSG_RESULT([$PKGFORMAT])
   if echo "$PKGFORMAT" | $EGREP rpm 2>&1 >/dev/null; then
      AC_MSG_CHECKING([for rpm])
      for a in "$RPM" rpmbuild rpm; do
         $a --usage >/dev/null 2> /dev/null
         if test $? -eq 0; then
            RPM=$a
            break
         else
            $a --version >/dev/null 2> /dev/null
            if test $? -eq 0; then
               RPM=$a
               break
            fi 
         fi
       done
       if test -z "$RPM" ; then
          AC_MSG_ERROR([not found])
       elif "$RPM" --usage 2>&1 | $EGREP -- -bb >/dev/null; then
          RPM_PATH=`which $RPM`
          AC_MSG_RESULT([$RPM_PATH])
       else
          AC_MSG_ERROR([cannot build packages. Try installing rpmbuild.])
       fi
   fi
   if echo "$PKGFORMAT" | $EGREP deb 2>&1 >/dev/null; then
      AC_PATH_PROG(DPKG, dpkg, no)
      if test "$DPKG" = "no"; then
         AC_MSG_ERROR([dpkg needed for deb creation. Install dpkg.])
      fi
   fi
   if echo "$PKGFORMAT" | $EGREP osx 2>&1 >/dev/null; then
      if test "$_os" = "Darwin"; then
         AC_MSG_CHECKING([for PackageMaker availability])
         if ! test -x /Developer/Applications/Utilities/PackageMaker.app/Contents/MacOS/PackageMaker; then
            AC_MSG_ERROR([not installed. Please install Apples Dev Tools])
         else
            AC_MSG_RESULT([ok])
         fi
      else
         AC_MSG_ERROR([PackageMaker needed to build OSX packages and you are not on OSX...])
       fi
   fi
   if echo "$PKGFORMAT" | $EGREP rpm 2>&1 >/dev/null || \
      echo "$PKGFORMAT" | $EGREP pkg 2>&1 >/dev/null; then
      	if test "$EPM" != "no" && test "$EPM" != "internal"; then
           if test "`echo $EPM_VERSION | cut -d'.' -f1`" -lt "4"; then
               AC_MSG_CHECKING([whether epm is patched for OOos needs])
               if grep "Patched for Apache OpenOffice" $EPM >/dev/null 2>/dev/null; then
                  AC_MSG_RESULT([yes])
               else
                  AC_MSG_RESULT([no])
                  if echo "$PKGFORMAT" | grep -q rpm; then
                      _pt="rpm"
                      AC_MSG_WARN([the rpms will need to be installed with --nodeps])
                      echo "the rpms will need to be installed with --nodeps" >> warn
                  else
                      _pt="pkg"
                  fi
                  AC_MSG_WARN([the ${_pt}s will not be relocateable])
                  echo "the ${_pt}s will not be relocateable" >> warn
                  AC_MSG_WARN([if you want to make sure installation without --nodeps and
                  relocation will work, you need to patch your epm with the
                  patch in epm/epm-3.7.patch or build with
                  --with-epm=internal which will build a suitable epm])
               fi
           fi
        fi
   fi
   if echo "$PKGFORMAT" | $EGREP pkg 2>&1 >/dev/null; then
      AC_PATH_PROG(PKGMK, pkgmk, no)
      if test "$PKGMK" = "no"; then
         AC_MSG_ERROR([pkgmk needed for Solaris pkg creation. Install it.])
      fi
   fi
   AC_SUBST(RPM)
   AC_SUBST(DPKG)
   AC_SUBST(PKGMK)
else
   AC_MSG_RESULT([no])
   BUILD_EPM=NO
   EPM=NO
   PKGFORMAT=native
fi
AC_SUBST(BUILD_EPM)
AC_SUBST(EPM_URL)
AC_SUBST(EPM)
AC_SUBST(PKGFORMAT)

dnl ===================================================================
dnl Check for gperf
dnl ===================================================================
AC_PATH_PROG(GPERF, gperf)
if test -z "$with_gperf"; then
    AC_PATH_PROG(GPERF, gperf)
    if test -z "$GPERF"; then
       AC_MSG_ERROR([gperf not found but needed. Install it and/or specify --with-gperf=/path/to/it.])
    fi
else
  if test -x "$with_gperf"; then
    GPERF=$with_gperf
  else
    AC_MSG_ERROR([--with-gperf did not point to an executable])
  fi
fi
AC_MSG_CHECKING([gperf version])
if test "`$GPERF --version | $EGREP ^GNU\ gperf | $AWK '{ print $3 }' | cut -d. -f1`" -ge "3"; then
	AC_MSG_RESULT([OK])
   GPERF=$GPERF
else
	AC_MSG_ERROR([too old, you need at least 3.0.0])
fi
AC_SUBST(GPERF)

dnl ===================================================================
dnl Check for building stax
dnl ===================================================================
AC_MSG_CHECKING([whether to build the stax])
if test -f "./stax/download/stax-1.2.0.jar"; then
   BUILD_STAX=NO
   AC_MSG_RESULT([no, will use the prebuilt stax/download/stax-1.2.0.jar])
else
   BUILD_STAX=YES
   AC_MSG_RESULT([yes])
fi
AC_SUBST(BUILD_STAX)

dnl ===================================================================
dnl Check for building ODK
dnl ===================================================================
AC_MSG_CHECKING([whether to build the ODK])
if test "z$enable_odk" = "z" -o "$enable_odk" != "no"; then
   AC_MSG_RESULT([yes])
   if test "$WITH_JAVA" != "no"; then
   AC_MSG_CHECKING([for external/unowinreg/unowinreg.dll])
   if ! test -f "./external/unowinreg/unowinreg.dll"; then
      HAVE_UNOWINREG_DLL=no
   else
      HAVE_UNOWINREG_DLL=yes
   fi
   if test "$HAVE_UNOWINREG_DLL" = "yes"; then
      AC_MSG_RESULT([found])
      BUILD_UNOWINREG=NO
   else
      if test "$_os" = "WINNT"; then
         AC_MSG_RESULT([not found, will be built])
      else
         AC_MSG_WARN([not found, will be cross-built using mingw32])
      fi
      BUILD_UNOWINREG=YES
   fi
   if test "$_os" != "WINNT" && test "$BUILD_UNOWINREG" = "YES"; then
      if test -z "$WITH_MINGWIN" || test "$WITH_MINGWIN" = "0"; then
         AC_MSG_ERROR([for rebuilding unowinreg.dll you need the mingw32 C++ compiler.
         Specify mingw32 g++ executable name with --with-mingwin.
         Or use prebuilt one from http://tools.openoffice.org/unowinreg_prebuild/680/ and
         put it into external/unowinreg])
      fi
      if echo "$WITH_MINGWIN" | $EGREP -q "/"; then
         if ! test -x "$WITH_MINGWIN"; then MINGWCXX=false; else MINGWCXX=`basename $WITH_MINGWIN`; fi
      else
         AC_CHECK_TOOL(MINGWCXX, $WITH_MINGWIN, false)
      fi
      if test "$MINGWCXX" = "false"; then
         AC_MSG_ERROR(specified MinGW32 C++ cross-compiler not found. Install it or correct name.)
      fi
      AC_MSG_CHECKING(whether we are using the MinGW32 cross C++ compiler)
      if ! echo "`$MINGWCXX -dumpmachine`" | grep -q mingw32; then
         AC_MSG_ERROR(no)
      else
         AC_MSG_RESULT(yes)
      fi
      if echo "$WITH_MINGWIN" | $EGREP -q "/"; then
         if ! test -x "`echo $WITH_MINGWIN | $SED -e s/g++/strip/ | $SED -e s/c++/strip/`"; then MINGWSTRIP=false; else MINGWSTRIP=$(basename $(echo $WITH_MINGWIN | $SED -e s/g++/strip/ | $SED -e s/c++/strip/)); fi
      else
         AC_CHECK_TOOL(MINGWSTRIP, `echo $WITH_MINGWIN | $SED -e s/g++/strip/ | $SED -e s/c++/strip/`, false)
      fi
      if test "$MINGWSTRIP" = "false"; then
         AC_MSG_ERROR(MinGW32 binutils needed. Install them.)
      fi
      AC_LANG_PUSH([C++])
      save_CXX=$CXX
      save_CXXCPP=$CXXCPP
      CXX=$MINGWCXX
      CXXCPP="$MINGWCXX -E"
      save_CXXFLAGS=$CXXFLAGS
      save_CPPFLAGS=$CPPFLAGS
      CXXFLAGS="$CXXFLAGS -I$JAVA_HOME/include"
      CPPFLAGS="$CPPFLAGS -I$JAVA_HOME/include"
      # LIBS contains -lcrypt etc due to teh AC_CHECK_LIBS which obviously
      # do not make sense here (and 'd make the check fail)
      save_LIBS=$LIBS
      LIBS=""
      AC_HAVE_LIBRARY(kernel32)
      AC_HAVE_LIBRARY(advapi32)
      AC_CHECK_HEADER(windows.h, [], [AC_MSG_ERROR([windows.h missing])])
      CXXFLAGS=$save_CXXFLAGS
      CPPFLAGS=$save_CPPFLAGS
      CXX=$save_CXX
      CXXCPP=$save_CXXCPP
      LIBS=$save_LIBS
      AC_LANG_POP([C++])
      fi
   fi
   BUILD_TYPE="$BUILD_TYPE ODK"
else
   AC_MSG_RESULT([no])
   BUILD_UNOWINREG=NO
fi
AC_SUBST(BUILD_UNOWINREG)
AC_SUBST(MINGWCXX)
AC_SUBST(MINGWSTRIP)

dnl ===================================================================
dnl Check for system stdlibs
dnl ===================================================================
AC_MSG_CHECKING([whether to provide libstdc++/libgcc_s in the installset])
if test -n "$with_system_stdlibs" -o -n "$with_system_libs" && \
   test "$with_system_stdlibs" != "no"; then
   AC_MSG_RESULT([no])
   SYSTEM_STDLIBS=YES
else
   AC_MSG_RESULT([yes])
   SYSTEM_STDLIBS=NO
fi
AC_SUBST(SYSTEM_STDLIBS)

dnl ===================================================================
dnl Check for system zlib
dnl ===================================================================
if test "$_os" = "Darwin" && test "$with_system_zlib" != "no"; then
   with_system_zlib=yes
fi
AC_MSG_CHECKING([which zlib to use])
if test -n "$with_system_zlib" -o -n "$with_system_libs" && \
	test "$with_system_zlib" != "no"; then
    AC_MSG_RESULT([external])
    SYSTEM_ZLIB=YES
    AC_CHECK_HEADER(zlib.h, [],
        [AC_MSG_ERROR(zlib.h not found. install zlib)], [])
    AC_CHECK_LIB(z, deflate, [ ZLIB=-lz ],
        [AC_MSG_ERROR(zlib not found or functional)], [])
else
    AC_MSG_RESULT([internal])
    SYSTEM_ZLIB=NO
    BUILD_TYPE="$BUILD_TYPE ZLIB"
fi
AC_SUBST(SYSTEM_ZLIB)

dnl ===================================================================
dnl Check for system jpeg
dnl ===================================================================
AC_MSG_CHECKING([which jpeg to use])
if test -n "$with_system_jpeg" -o -n "$with_system_libs" && \
	test "$with_system_jpeg" != "no"; then
    AC_MSG_RESULT([external])
    SYSTEM_JPEG=YES
    AC_CHECK_HEADER(jpeglib.h, [],
        [AC_MSG_ERROR(jpeg.h not found. install libjpeg)], [])
    AC_CHECK_LIB(jpeg, jpeg_resync_to_restart, [ JPEG3RDLIB=-ljpeg ],
	[AC_MSG_CHECKING(jpeg library not found or fuctional)], [])
else
    AC_MSG_RESULT([internal])
    SYSTEM_JPEG=NO
    BUILD_TYPE="$BUILD_TYPE JPEG"
fi
AC_SUBST(SYSTEM_JPEG)

dnl ===================================================================
dnl Check for system expat
dnl ===================================================================
AC_MSG_CHECKING([which expat to use])
if test -n "$with_system_expat" -o -n "$with_system_libs" && \
	test "$with_system_expat" != "no"; then
    AC_MSG_RESULT([external])
    SYSTEM_EXPAT=YES
    AC_CHECK_HEADER(expat.h, [],
        [AC_MSG_ERROR(expat.h not found. install expat)], [])
    AC_CHECK_LIB(expat, XML_ParserCreate, [],
	[AC_MSG_RESULT(expat library not found or functional.)], [])
else
    AC_MSG_RESULT([internal])
    SYSTEM_EXPAT=NO
    BUILD_TYPE="$BUILD_TYPE EXPAT"
fi
AC_SUBST(SYSTEM_EXPAT)

dnl ===================================================================
dnl Check for system libwpd
dnl ===================================================================
AC_MSG_CHECKING([which libwpd to use])
if test -n "$with_system_libwpd" -o -n "$with_system_libs" && \
        test "$with_system_libwpd" != "no"; then
    AC_MSG_RESULT([external])
    SYSTEM_LIBWPD=YES
    PKG_CHECK_MODULES( LIBWPD, libwpd-0.8 )
else
    AC_MSG_RESULT([no])
    SYSTEM_LIBWPD=
fi
AC_SUBST(SYSTEM_LIBWPD)
AC_SUBST(LIBWPD_CFLAGS)
AC_SUBST(LIBWPD_LIBS)

dnl ===================================================================
dnl Check for system cppunit
dnl ===================================================================
WITH_CPPUNIT=
AC_MSG_CHECKING([which cppunit to use])
if test -n "$with_system_cppunit" -o -n "$with_system_libs" && \
        test "$with_system_cppunit" != "no"; then
    SYSTEM_CPPUNIT=YES
    # might work for earlier, too but go sure:
    PKG_CHECK_MODULES( CPPUNIT, 
                       cppunit >= 1.12.0,
                       WITH_CPPUNIT="YES",
                       WITH_CPPUNIT=")
    if test -n "$WITH_CPPUNIT"; then
       AC_MSG_RESULT([found system cppunit $CPPUNIT])
    else
       AC_MSG_WARN([dit not find system cppunit version 1.12.0 or later])
    fi

else
    AC_MSG_WARN([not using cppunit])
    SYSTEM_CPPUNIT=NO
fi
AC_SUBST(SYSTEM_CPPUNIT)
AC_SUBST(CPPUNIT_CFLAGS)
AC_SUBST(CPPUNIT_LIBS)
AC_SUBST(WITH_CPPUNIT)

dnl ===================================================================
dnl Check whether freetype is available
dnl ===================================================================
if test  "$test_freetype" = "yes"; then
   AC_MSG_CHECKING([whether freetype is available])
	PKG_CHECK_MODULES( FREETYPE, freetype2 >= 2.0 )
fi
AC_SUBST(FREETYPE_CFLAGS)
AC_SUBST(FREETYPE_LIBS)

dnl ===================================================================
dnl Check whether freetype2 supports emboldening
dnl ===================================================================
if test  "$test_freetype" = "yes"; then
    save_CPPFLAGS="$CPPFLAGS"
    save_LDFLAGS="$LDFLAGS"
    save_LIBS="$LIBS"
    CPPFLAGS="$CPPFLAGS $FREETYPE_CFLAGS"
    LDFLAGS="$LDFLAGS $FREETYPE_LIBS"
    AC_CHECK_LIB(freetype, FT_GlyphSlot_Embolden,
                 [USE_FT_EMBOLDEN="YES"], [USE_FT_EMBOLDEN="NO"], [])
    LDFLAGS="$save_LDFLAGS"
    CPPFLAGS="$save_CPPFLAGS"
    LIBS="$save_LIBS"
fi
AC_SUBST(USE_FT_EMBOLDEN)

if test -n "$with_system_libxslt" -o -n "$with_system_libs" && \
   test "$with_system_libxslt" != "no"; then
    if test -z "$with_system_libxml" -a -z "$with_system_libs" || \
      test "$with_system_libxml" = "no"; then
      # somehow AC_MSG_WARN won't work...
       echo "to prevent incompatibilities between internal libxml2 and libxslt, the office will be build with system-libxml"
       echo "to prevent incompatibilities between internal libxml2 and libxslt, the office will be build with system-libxml" >> warn
       with_system_libxml=yes
    fi
fi
if test -n "$with_system_libxml" -o -n "$with_system_libs" && \
   test "$with_system_libxml" != "no"; then
    if test -z "$with_system_libxslt" -a -z "$with_system_libs" || \
      test "$with_system_libxslt" = "no"; then
      # somehow AC_MSG_WARN won't work...
       echo "to prevent incompatibilities between internal libxslt and libxml2, the office will be build with system-libxslt"
       echo "to prevent incompatibilities between internal libxslt and libxml2, the office will be build with system-libxslt" >> warn
       with_system_libxslt=yes
    fi
fi

dnl ===================================================================
dnl Check for system libxslt
dnl ===================================================================
AC_MSG_CHECKING([which libxslt to use])
if test -n "$with_system_libxslt" -o -n "$with_system_libs" -o \
       "$_os" = "Darwin" && \
   test "$with_system_libxslt" != "no"; then
   AC_MSG_RESULT([external])
   SYSTEM_LIBXSLT=YES

	if test "$_os" != "Darwin"; then
		PKG_CHECK_MODULES(LIBXSLT, libxslt)
	else
		LIBXSLT_CFLAGS=`xslt-config --cflags`
		LIBXSLT_LIBS=`xslt-config --libs`
	fi

   dnl Check for xsltproc
   AC_PATH_PROG(XSLTPROC, xsltproc, no)
   if test "$XSLTPROC" = "no"; then
      AC_MSG_ERROR([xsltproc is required])
   fi
else
   AC_MSG_RESULT([internal])
   SYSTEM_LIBXSLT=NO
   BUILD_TYPE="$BUILD_TYPE LIBXSLT"
fi
AC_SUBST(SYSTEM_LIBXSLT)
AC_SUBST(LIBXSLT_CFLAGS)
AC_SUBST(LIBXSLT_LIBS)


dnl ===================================================================
dnl Check for system libxml
dnl ===================================================================
AC_MSG_CHECKING([which libxml to use])
if test -n "$with_system_libxml" -o -n "$with_system_libs" -o \
            "$_os" = "Darwin" && \
	test "$with_system_libxml" != "no"; then
    AC_MSG_RESULT([external])
    SYSTEM_LIBXML=YES
    BUILD_TYPE="$BUILD_TYPE LIBXMLSEC"

	if test "$_os" != "Darwin"; then
		PKG_CHECK_MODULES(LIBXML, libxml-2.0 >= 2.0)
	else
		LIBXML_CFLAGS=`xml2-config --cflags`
		LIBXML_LIBS=`xml2-config --libs`
	fi
else
    AC_MSG_RESULT([internal])
    SYSTEM_LIBXML=NO
    BUILD_TYPE="$BUILD_TYPE LIBXML2 LIBXMLSEC"
fi
AC_SUBST(SYSTEM_LIBXML)
AC_SUBST(LIBXML_CFLAGS)
AC_SUBST(LIBXML_LIBS)

dnl ===================================================================
dnl Check for system python
dnl ===================================================================
AC_MSG_CHECKING([which python to use])
if test "$_os" = "Darwin" && test "$with_system_python" != "no"; then
   with_system_python=yes
   AC_MSG_RESULT([compiling against MacOSX10.4u.sdk (python version 2.3)])
   PYTHON_CFLAGS="-I/Developer/SDKs/MacOSX10.4u.sdk/System/Library/Frameworks/Python.framework/Versions/2.3/include/python2.3"
   PYTHON_LIBS="-framework Python"
elif test -n "$with_system_python" -o -n "$with_system_libs" && \
	test "$with_system_python" != "no"; then
   with_system_python=yes
   AC_MSG_RESULT([external])
   AM_PATH_PYTHON([2.3])

   python_include=`$PYTHON -c "import distutils.sysconfig; print(distutils.sysconfig.get_config_var('INCLUDEPY'));"`
   python_version=`$PYTHON -c "import distutils.sysconfig; print(distutils.sysconfig.get_config_var('VERSION'));"`
   PYTHON_CFLAGS="-I$python_include"
   PYTHON_LIBS="-lpython$python_version"
fi
if test "$with_system_python" = "yes" ; then
   SYSTEM_PYTHON=YES
   dnl check if the headers really work:
   save_CPPFLAGS="$CPPFLAGS"
   CPPFLAGS="$CPPFLAGS $PYTHON_CFLAGS"
   AC_CHECK_HEADER(Python.h, [],
       [AC_MSG_ERROR(Python headers not found)], [])
   CPPFLAGS="$save_CPPFLAGS"
else
   SYSTEM_PYTHON=NO
   BUILD_TYPE="$BUILD_TYPE PYTHON"
   AC_MSG_RESULT([internal])
   # Embedded python dies without Home set
   if test "z$HOME" = "z"; then
      export HOME="";
   fi
   # bz2 tarball and bzip2 is not standard
   if test -z "$BZIP2"; then
	AC_PATH_PROG( BZIP2, bzip2)
	if test -z "$BZIP2"; then
   		AC_MSG_ERROR([the internal Python module has a .tar.bz2. You need bzip2])
   	fi
   fi
fi
AC_SUBST(SYSTEM_PYTHON)
AC_SUBST(PYTHON_CFLAGS)
AC_SUBST(PYTHON_LIBS)
HOME=`echo $HOME | sed 's:\\\\:/:g'`
AC_SUBST(HOME)

dnl ===================================================================
dnl Check for system lucene
dnl ===================================================================
AC_MSG_CHECKING([which lucene to use])
if test -n "$with_system_lucene" -o -n "$with_system_libs" && \
       test "$with_system_lucene" != "no" && test "$with_system_jars" != "no"; then
        AC_MSG_RESULT([external])
        SYSTEM_LUCENE=YES
        if test -z $LUCENE_CORE_JAR; then
          AC_CHECK_FILE(/usr/share/java/lucene-core-2.3.jar, 
            [ LUCENE_CORE_JAR=/usr/share/java/lucene-core-2.3.jar ],
            [
              AC_CHECK_FILE(/usr/share/java/lucene-core.jar, 
                [ LUCENE_CORE_JAR=/usr/share/java/lucene-core.jar ],
                [ AC_CHECK_FILE(/usr/share/java/lucene.jar, 
                   [ LUCENE_CORE_JAR=/usr/share/java/lucene.jar ],
                   [ AC_MSG_ERROR(lucene-core.jar replacement not found)]
                  )
                ]
              )
            ]
          )
        else
          AC_CHECK_FILE($LUCENE_CORE_JAR, [],
               [AC_MSG_ERROR(lucene-core.jar not found.)], [])
        fi

        if test -z $LUCENE_ANALYZERS_JAR; then
          AC_CHECK_FILE(/usr/share/java/lucene-analyzers-2.3.jar, 
            [ LUCENE_ANALYZERS_JAR=/usr/share/java/lucene-analyzers-2.3.jar ],
            [
              AC_CHECK_FILE(/usr/share/java/lucene-contrib/lucene-analyzers.jar, 
                [ LUCENE_ANALYZERS_JAR=/usr/share/java/lucene-contrib/lucene-analyzers.jar ],
                [ AC_MSG_ERROR(lucene-analyzers.jar replacement not found.)]
              )
            ]
          )
        else
          AC_CHECK_FILE($LUCENE_CORE_JAR, [],
               [ AC_MSG_ERROR(lucene-analyzers.jar not found.)], [])
        fi
        AC_MSG_CHECKING([whether lucene is version 2.x])
        export LUCENE_CORE_JAR
        if $PERL -e 'use Archive::Zip;
            my $file = "$ENV{'LUCENE_CORE_JAR'}";
            my $zip = Archive::Zip->new( $file );
            my $mf = $zip->contents ( "META-INF/MANIFEST.MF" );
            if ( $mf =~ m/Specification-Version: 2.*/ ) {
                exit 0;
            } else {
                exit 1;
            }'; then
            AC_MSG_RESULT([yes])
         else
            AC_MSG_RESULT([no])
            AC_MSG_CHECKING([whether lucene is version 3.x])

            if $PERL -e 'use Archive::Zip;
                my $file = "$ENV{'LUCENE_CORE_JAR'}";
                my $zip = Archive::Zip->new( $file );
                my $mf = $zip->contents ( "META-INF/MANIFEST.MF" );
                if ( $mf =~ m/Specification-Version: 3.*/ ) {
                    exit 0;
                } else {
                    exit 1;
                }'; then
                AC_MSG_RESULT([yes])
             else
                AC_MSG_ERROR([no, you need lucene 2 or 3])
             fi
         fi

else
    AC_MSG_RESULT([internal])
    SYSTEM_LUCENE=NO
    BUILD_TYPE="$BUILD_TYPE LUCENE"
fi
AC_SUBST(SYSTEM_LUCENE)
AC_SUBST(LUCENE_CORE_JAR)
AC_SUBST(LUCENE_ANALYZERS_JAR)

AC_MSG_CHECKING([whether to build the MySQL Connector extension])
if test -n "$enable_mysql_connector" -a "$enable_mysql_connector" != "no"; then
  AC_MSG_RESULT([yes])
  ENABLE_MYSQLC=YES
  AC_MSG_CHECKING([for mysqlc module])
  if test -d mysqlc; then
   AC_MSG_RESULT([OK])
  else
   AC_MSG_ERROR([not existing. get it (did you get the -extensions tarball?)])
  fi
  BUILD_TYPE="$BUILD_TYPE MYSQLC"
else
  AC_MSG_RESULT([no])
  ENABLE_MYSQLC=NO
fi
AC_SUBST(ENABLE_MYSQLC)

if test "$ENABLE_MYSQLC" = "YES"; then
dnl ===================================================================
dnl Check for system MySQL
dnl ===================================================================
AC_MSG_CHECKING([for mysql pre-requisites])
if test -n "$with_system_mysql" -o -n "$with_system_libs" && \
       test "$with_system_mysql" != "no" && test "$with_system_libs" != "no"; then
	AC_MSG_RESULT([external MySQL])
	SYSTEM_MYSQL=YES
	AC_PATH_PROG( MYSQLCONFIG, mysql_config)
	AC_MSG_CHECKING([MySQL version])
	if test -z "$MYSQLCONFIG" -o ! -x "$MYSQLCONFIG" ; then
		AC_MSG_ERROR([can not find/execute mysql_config]);
	fi
	MYSQL_VERSION=`$MYSQLCONFIG --version` 
	MYSQL_MAJOR=`$MYSQLCONFIG --version | cut -d"." -f1`
	if test "$MYSQL_MAJOR" -ge "5"; then
		AC_MSG_RESULT([OK])
	else
		AC_MSG_ERROR([too old, use 5.0.x or 5.1.x])
	fi
	AC_MSG_CHECKING([for MySQL Client library])
	MYSQL_INC=`$MYSQLCONFIG --include` 
	MYSQL_LIB=`$MYSQLCONFIG --libs`
	MYSQL_DEFINES=`$MYSQLCONFIG --cflags | sed -e s,$MYSQL_INC,,`
	AC_MSG_RESULT([includes $MYSQL_INC, libraries $MYSQL_LIB])
else
    SYSTEM_MYSQL=NO
    if test -n "$with_libmysql_path"; then
        AC_MSG_RESULT([external Connector/C (libmysql)])
        LIBMYSQL=libmysql.so
        if test "$_os" = "Darwin"; then
            LIBMYSQL=libmysql.dylib
        elif test "$_os" = "WINNT"; then
            LIBMYSQL=libmysql.dll
        fi
        AC_MSG_CHECKING([for $LIBMYSQL])
        if test -e "$with_libmysql_path/lib/$LIBMYSQL"; then
            AC_MSG_RESULT([found.])
            LIBMYSQL_PATH=$with_libmysql_path
        else
            AC_MSG_ERROR([not found. Please specify proper path in --with-libmysql-path.])
        fi
    else
        AC_MSG_ERROR([not given. Please specify either --with-system-mysql or --with-libmysql-path])
    fi
fi
AC_SUBST(SYSTEM_MYSQL)
AC_SUBST(MYSQL_INC)
AC_SUBST(MYSQL_LIB)
AC_SUBST(MYSQL_DEFINES)
AC_SUBST(LIBMYSQL_PATH)

AC_LANG_PUSH([C++])
dnl ===================================================================
dnl Check for system MySQL C++ Connector
dnl ===================================================================
# FIXME!
# who thought this too-generic cppconn dir was a good idea?
AC_MSG_CHECKING([MySQL Connector/C++])
if test -n "$with_system_mysql_cppconn" -o -n "$with_system_libs" && \
		test "$with_system_mysql_cppconn" != "no" && test "$with_system_libs" != "no"; then
	AC_MSG_RESULT([external])
	SYSTEM_MYSQL_CPPCONN=YES
        AC_LANG_PUSH([C++])
	AC_CHECK_HEADER(mysql_driver.h, [],
					[AC_MSG_ERROR(mysql_driver.h not found. install MySQL C++ Connectivity)], [])
	AC_CHECK_LIB(mysqlcppconn, main, [],
					[AC_MSG_ERROR(MySQL C++ Connectivity lib not found or functional)], [])
   AC_MSG_CHECKING([version])
      AC_TRY_RUN([
#include <mysql_driver.h>

int main(int argc, char **argv) {
	sql::Driver *driver;
	driver = get_driver_instance();
	if (driver->getMajorVersion() > 1 || \
	   (driver->getMajorVersion() == 1 && driver->getMinorVersion() > 0) || \
	   (driver->getMajorVersion() == 1 && driver->getMinorVersion() == 0 && driver->getPatchVersion() >= 6)) 
        return 0;
      else
        return 1;
}
      ], [AC_MSG_RESULT(OK)], [AC_MSG_ERROR([not suitable, we need >= 1.0.6])])
        AC_LANG_POP([C++])

else
	AC_MSG_RESULT([no])
	SYSTEM_MYSQL_CPPCONN=
fi
AC_LANG_POP([C++])
AC_SUBST(SYSTEM_MYSQL_CPPCONN)
fi

dnl ===================================================================
dnl Check for system hsqldb
dnl ===================================================================
AC_MSG_CHECKING([which hsqldb to use])
if test -n "$with_system_hsqldb" -o -n "$with_system_libs" && \
       test "$with_system_hsqldb" != "no" && test "$with_system_jars" != "no"; then
        AC_MSG_RESULT([external])
        SYSTEM_HSQLDB=YES
        if test -z $HSQLDB_JAR; then
               HSQLDB_JAR=/usr/share/java/hsqldb.jar
        fi
        AC_CHECK_FILE($HSQLDB_JAR, [],
               [AC_MSG_ERROR(hsqldb.jar not found.)], [])
        AC_MSG_CHECKING([whether hsqldb is 1.8.0.x])
        export HSQLDB_JAR
        if $PERL -e 'use Archive::Zip;
            my $file = "$ENV{'HSQLDB_JAR'}";
            my $zip = Archive::Zip->new( $file );
            my $mf = $zip->contents ( "META-INF/MANIFEST.MF" );
            if ( $mf =~ m/Specification-Version: 1.8.*/ ) {
               push @l, split(/\n/, $mf);
               foreach my $line (@l) {
                  if ($line =~ m/Specification-Version:/) {
                      ($t, $version) = split (/:/,$line);
                      $version =~ s/^\s//;
                      ($a, $b, $c, $d) = split (/\./,$version);
                      if ($c == "0" && $d > "8")  {
                          exit 0;
                      } else {
                          exit 1;
                      }
                  }
               }
            } else {
                exit 1;
            }'; then
            AC_MSG_RESULT([yes])
         else
            AC_MSG_ERROR([no, you need hsqldb >= 1.8.0.9 but < 1.8.1])
         fi
else
    AC_MSG_RESULT([internal])
    SYSTEM_HSQLDB=NO
    BUILD_TYPE="$BUILD_TYPE HSQLDB"
fi
AC_SUBST(SYSTEM_HSQLDB)
AC_SUBST(HSQLDB_JAR)

dnl ===================================================================
dnl Check for system beanshell
dnl ===================================================================
ENABLE_BEANSHELL=YES
AC_MSG_CHECKING([which beanshell to use])
if test -n "$with_system_beanshell" -o -n "$with_system_libs" && \
       test "$with_system_beanshell" != "no" && test "$with_system_jars" != "no"; then
        AC_MSG_RESULT([external])
        SYSTEM_BSH=YES
        if test -z $BSH_JAR; then
               BSH_JAR=/usr/share/java/bsh.jar
        fi
        AC_CHECK_FILE($BSH_JAR, [],
               [AC_MSG_ERROR(bsh.jar not found.)], [])
elif test "x$enable_beanshell" = "xyes"; then
    AC_MSG_RESULT([internal])
    SYSTEM_BSH=NO
    BUILD_TYPE="$BUILD_TYPE BSH"
else
    AC_MSG_RESULT([none (disabled)])
    SYSTEM_BSH=NO
    ENABLE_BEANSHELL=NO
fi
AC_SUBST(SYSTEM_BSH)
AC_SUBST(BSH_JAR)
AC_SUBST(ENABLE_BEANSHELL)


dnl ===================================================================
dnl Check for saxon.  It can come from two different places:
dnl - pre-installed on the system.  This is checked when the --with-system-saxon
dnl   option is given to configure.
dnl   The exact place can be specified with the --with-saxon-jar=<path> option.
dnl - From the saxon tar ball in ext_sources/.  This is used when --enable-saxon
dnl   is given to configure but not any of --with-system-saxon or --with-saxon-jar.
dnl ===================================================================
DISABLE_SAXON=
AC_MSG_CHECKING([which saxon to use])
if test -n "$with_system_saxon" -o -n "$with_system_libs" && \
       test "$with_system_saxon" != "no" && test "$with_system_jars" != "no"; then
        AC_MSG_RESULT([external])
        SYSTEM_SAXON=YES
        if test -z $SAXON_JAR; then
          AC_CHECK_FILE(/usr/share/java/saxon9.jar, 
            [ SAXON_JAR=/usr/share/java/saxon9.jar ],
            [
              AC_CHECK_FILE(/usr/share/java/saxon.jar, 
                [ SAXON_JAR=/usr/share/java/saxon.jar ],
                [ AC_CHECK_FILE(/usr/share/java/saxon9.jar,
                    [ SAXON_JAR=/usr/share/java/saxon9.jar ],
                    [ AC_MSG_ERROR(saxon.jar replacement not found)]
                  )
                ]
              )
            ]
          )
        else
          AC_CHECK_FILE($SAXON_JAR, [],
               [AC_MSG_ERROR(saxon.jar replacement not found.)], [])
        fi
        if test -n "$SERIALIZER_JAR"; then
          AC_CHECK_FILE($SERIALIZER_JAR, [],
               [AC_MSG_ERROR(serializer.jar not found.)], [])
          AC_SUBST(SERIALIZER_JAR)
        fi

dnl Saxon comes in two practically available versions, the out-of-date saxonb which
dnl supports the java extensions that OOo uses, and the up-to-date saxon he 
dnl "home edition" version, which is crippled to not support those java extensions.
dnl And as an aside the he one also needs to be tweaked to include 
dnl a META-INF/services to broadcast that it supports the jaxp transform factory

        AC_MSG_CHECKING([if saxon works])
        cat > saxontest.java <<_ACEOF
[import javax.xml.transform.TransformerFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.stream.StreamSource;
import java.io.*;

import net.sf.saxon.FeatureKeys;

class saxontest {
    public static void main(String[] args) {
      System.setProperty("javax.xml.transform.TransformerFactory",
        "net.sf.saxon.TransformerFactoryImpl");
      try {
        TransformerFactory tfactory = TransformerFactory.newInstance();
	// some external saxons (Debian, Ubuntu, ...) have this disabled
	// per default
	tfactory.setAttribute(FeatureKeys.ALLOW_EXTERNAL_FUNCTIONS, new Boolean(true));
        System.out.println("TransformerFactory is" +
          tfactory.getClass().getName());
        Transformer transformer = tfactory.newTransformer(
          new StreamSource(new File(args[0])));
      } catch(Exception e){
        e.printStackTrace(System.err);
        System.exit(-1);
      }
      System.exit(0);
    }
}
]
_ACEOF
        cat > saxontest.xsl<<_ACEOF
[<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:template match="/">
  <xsl:value-of select="math:sqrt(1)" xmlns:math="java:java.lang.Math"/>
 </xsl:template>
</xsl:stylesheet>
]
_ACEOF
        javac_cmd="$JAVACOMPILER -cp $SAXON_JAR saxontest.java 1>&2"
        AC_TRY_EVAL(javac_cmd)
        if test $? = 0 && test -f ./saxontest.class ; then
            java_cmd="$JAVAINTERPRETER -cp $SAXON_JAR:. saxontest saxontest.xsl 1>&2"
            AC_TRY_EVAL(java_cmd)
            if test $? = 0; then
              AC_MSG_RESULT([yes])
            else
              cat saxontest.java >&5
              AC_MSG_RESULT([no])
              AC_MSG_ERROR([Non-functional saxon jar, e.g. crippled saxon-he instead of saxonb])
            fi
        else
          AC_MSG_RESULT([no])
          cat saxontest.java >&5
          AC_MSG_ERROR([saxontest could not be compiled, non-functional saxon jar])
        fi
elif test "x$enable_saxon" = "xyes"; then
    AC_MSG_RESULT([internal])
    SYSTEM_SAXON=NO
    BUILD_TYPE="$BUILD_TYPE SAXON"
else
    AC_MSG_RESULT([none (disabled)])
    SYSTEM_SAXON=NO
    DISABLE_SAXON=YES
fi
AC_SUBST(SYSTEM_SAXON)
AC_SUBST(SAXON_JAR)
AC_SUBST(DISABLE_SAXON)


dnl ===================================================================
dnl Check for rhino
dnl ===================================================================
ENABLE_JAVASCRIPT=
AC_MSG_CHECKING([whether to enable support for JavaScript])
if test "x$enable_javascript" = "xyes"; then
   BUILD_TYPE="$BUILD_TYPE RHINO"
   AC_MSG_RESULT([yes])
   ENABLE_JAVASCRIPT=YES
else
   AC_MSG_RESULT([no])
   ENABLE_JAVASCRIPT=NO
fi
AC_SUBST(ENABLE_JAVASCRIPT)


dnl ===================================================================
dnl Check for system apr
dnl ===================================================================
SYSTEM_APR=NO
APR_CFLAGS=
APR_LIBS=
AC_MSG_CHECKING([which libapr to use])
if test "x$with_system_apr" = "xyes" -o -n "$with_system_libs"; then
    AC_MSG_RESULT([system])
    PKG_CHECK_MODULES([APR], [apr-1 >= 1.0])
    SYSTEM_APR=YES
else
    AC_MSG_RESULT([internal])
    SYSTEM_APR=NO
    BUILD_TYPE="$BUILD_TYPE APR"
fi
AC_SUBST(SYSTEM_APR)
AC_SUBST(APR_CFLAGS)
AC_SUBST(APR_LIBS)


dnl ===================================================================
dnl Check for system apr-util
dnl ===================================================================
SYSTEM_APR_UTIL=NO
APR_UTIL_CFLAGS=
APR_UTIL_LIBS=
AC_MSG_CHECKING([which libapr-util to use])
if test "x$with_system_apr_util" = "xyes" -o -n "$with_system_libs"; then
    AC_MSG_RESULT([system])
    PKG_CHECK_MODULES([APR_UTIL], [apr-util-1 >= 1.0])
    SYSTEM_APR_UTIL=YES
else
    AC_MSG_RESULT([internal])
    SYSTEM_APR_UTIL=NO
    BUILD_TYPE="$BUILD_TYPE APR_UTIL"
fi
AC_SUBST(SYSTEM_APR_UTIL)
AC_SUBST(APR_UTIL_CFLAGS)
AC_SUBST(APR_UTIL_LIBS)


dnl ===================================================================
dnl Check for system serf
dnl ===================================================================
SYSTEM_SERF=NO
SERF_CFLAGS=
SERF_LIBS=
AC_MSG_CHECKING([which libserf to use])
if test "x$with_system_serf" = "xyes" -o -n "$with_system_libs"; then
    AC_MSG_RESULT([system])
    PKG_CHECK_MODULES([SERF], [serf-1 >= 1.1])
    SYSTEM_SERF=YES
else
    AC_MSG_RESULT([internal])
    SYSTEM_SERF=NO
    BUILD_TYPE="$BUILD_TYPE SERF"
fi
AC_SUBST(SYSTEM_SERF)
AC_SUBST(SERF_CFLAGS)
AC_SUBST(SERF_LIBS)


dnl ===================================================================
dnl Check for CoinMP
dnl ===================================================================
ENABLE_COINMP=
SYSTEM_COINMP=NO
COINMP_CFLAGS=
COINMP_LIBS=
AC_MSG_CHECKING([whether to enable support for CoinMP])
if test "x$enable_coinmp" = "xyes"; then
    BUILD_TYPE="$BUILD_TYPE COINMP"
    AC_MSG_RESULT([yes])
    ENABLE_COINMP=YES

    dnl Check wether to use system or internal CoinMP
    AC_MSG_CHECKING([which coinmp to use])
    if test "x$with_system_coinmp" = "xyes" -o -n "$with_system_libs"; then
        AC_MSG_RESULT([system])
	PKG_CHECK_MODULES([COINMP], [coinmp])
        SYSTEM_COINMP=YES
        # some systems need this. Like Ubuntu....
        AC_CHECK_LIB(m, floor)
        AC_CHECK_LIB(dl, dlopen)
    else
        AC_MSG_RESULT([internal])
        SYSTEM_COINMP=NO
        BUILD_TYPE="$BUILD_TYPE COINMP"
    fi
else
    AC_MSG_RESULT([no])
    ENABLE_COINMP=NO
fi
AC_SUBST(ENABLE_COINMP)
AC_SUBST(SYSTEM_COINMP)
AC_SUBST(COINMP_CFLAGS)
AC_SUBST(COINMP_LIBS)


dnl ===================================================================
dnl Check for system curl
dnl ===================================================================
if test "$_os" = "Darwin" && test "$with_system_curl" != "no"; then
   with_system_curl=yes
fi
AC_MSG_CHECKING([which curl to use])
if test -n "$with_system_curl" -o -n "$with_system_libs" && \
	test "$with_system_curl" != "no"; then
   AC_MSG_RESULT([external])
   SYSTEM_CURL=YES

   AC_PATH_PROG( CURLCONFIG, curl-config)
   if test -z "$CURLCONFIG"; then
      AC_MSG_ERROR([install curl to run this script])
   fi

   # check curl version
   AC_MSG_CHECKING([whether curl is >= 7.13.1])
   if test "`$CURLCONFIG --version | $AWK -F' ' '{print $2}' | $AWK -F. '{ print $1 }'`" -gt "7" -a \
	"`$CURLCONFIG --version | $AWK -F' ' '{print $2}' | $AWK -F. '{ print $2 }'`" -gt "13" -a \
	"`$CURLCONFIG --version | $AWK -F' ' '{print $2}' | $AWK -F. '{ print $3 }'`" -gt "1"; then 
      AC_MSG_ERROR([no, you need at least curl 7.13,1])
   else
      AC_MSG_RESULT([yes])
   fi
   CURL_LIBS=`$CURLCONFIG --libs`
   CURL_CFLAGS=`$CURLCONFIG --cflags`
else
   AC_MSG_RESULT([internal])
   SYSTEM_CURL=NO
   BUILD_TYPE="$BUILD_TYPE CURL"
fi
AC_SUBST(SYSTEM_CURL)
AC_SUBST(CURL_CFLAGS)
AC_SUBST(CURL_LIBS)

dnl ===================================================================
dnl Check for system mdds
dnl ===================================================================
AC_MSG_CHECKING([which mdds to use])
if test -n "$with_system_mdds" -o -n "$with_system_headers" && \
	test "$with_system_mdds" != "no"; then
    AC_MSG_RESULT([external])
    SYSTEM_MDDS=YES
    AC_LANG_PUSH([C++])
    AC_CHECK_HEADER(mdds/flat_segment_tree.hpp, [],
        [AC_MSG_ERROR(mdds/flat_segment_tree.hpp not found. install mdds)], [])
    AC_LANG_POP([C++])
else
   AC_MSG_RESULT([internal])
   BUILD_TYPE="$BUILD_TYPE MDDS"
   SYSTEM_MDDS=NO
fi
AC_SUBST(SYSTEM_MDDS)

dnl ===================================================================
dnl Check for system boost
dnl ===================================================================
AC_MSG_CHECKING([which boost to use])
if test -n "$with_system_boost" -o -n "$with_system_headers" && \
	test "$with_system_boost" != "no"; then
   AC_MSG_RESULT([external])
   SYSTEM_BOOST=YES
   AC_LANG_PUSH([C++])
   AC_CHECK_HEADER(boost/shared_ptr.hpp, [],
       [AC_MSG_ERROR(boost/shared_ptr.hpp not found. install boost)], [])
   AC_CHECK_HEADER(boost/spirit/include/classic_core.hpp, [],
       [AC_MSG_ERROR(boost/spirit/include/classic_core.hpp not found. install boost >= 1.36)], [])
   AC_CHECK_HEADER(boost/function.hpp, [],
       [AC_MSG_ERROR(boost/function.hpp not found. install boost)], [])

   save_CXXFLAGS=$CXXFLAGS
   CXXFLAGS="$CXXFLAGS -fno-exceptions"
   AC_MSG_CHECKING([whether boost/function.hpp compiles with -fno-exceptions])
   AC_TRY_COMPILE([#include <boost/function.hpp>
], [],
   ac_cv_cxx_boost_no_exceptons_broken=no, ac_cv_cxx_boost_no_exceptons_broken=yes)

   if test "$ac_cv_cxx_boost_no_exceptons_broken" = "yes"; then
	AC_MSG_ERROR([no, see https://bugzilla.redhat.com/show_bug.cgi?id=477131])
   else
  	AC_MSG_RESULT([yes])
   fi
   CXXFLAGS=$save_CXXFLAGS
   AC_LANG_POP([C++])
else
   AC_MSG_RESULT([internal])
   BUILD_TYPE="$BUILD_TYPE BOOST"
   SYSTEM_BOOST=NO
fi
AC_SUBST(SYSTEM_BOOST)

dnl ===================================================================
dnl Check for system vigra
dnl ===================================================================
AC_MSG_CHECKING([which vigra to use])
if test -n "$with_system_vigra" -o -n "$with_system_headers" && \
	test "$with_system_vigra" != "no"; then
   AC_MSG_RESULT([external])
   SYSTEM_VIGRA=YES
   AC_LANG_PUSH([C++])
   AC_CHECK_HEADER(vigra/copyimage.hxx, [],
       [AC_MSG_ERROR(vigra/copyimage.hxx not found. install vigra)], [])
   AC_LANG_POP([C++])
else
   AC_MSG_RESULT([internal])
   BUILD_TYPE="$BUILD_TYPE VIGRA"
   SYSTEM_VIGRA=NO
fi
AC_SUBST(SYSTEM_VIGRA)

dnl ===================================================================
dnl Check for system odbc
dnl ===================================================================
AC_MSG_CHECKING([which odbc headers to use])
if test -n "$with_system_odbc_headers" -o -n "$with_system_headers" && \
	test "$with_system_odbc_headers" != "no"; then
   AC_MSG_RESULT([external])
   SYSTEM_ODBC_HEADERS=YES

   AC_CHECK_HEADER(sqlext.h, [],
      [AC_MSG_ERROR(odbc not found. install odbc)], [])
else
   AC_MSG_RESULT([internal])
   SYSTEM_ODBC_HEADERS=NO
   BUILD_TYPE="$BUILD_TYPE UNIXODBC"
fi
AC_SUBST(SYSTEM_ODBC_HEADERS)

WITH_MOZILLA=NO
AC_MSG_CHECKING([whether to enable build of Mozilla/Mozilla NSS-using components])
if test "$enable_mozilla" = "no"; then
   AC_MSG_RESULT([no])
   WITH_MOZILLA=NO
   ENABLE_NSS_MODULE=NO
else
   AC_MSG_RESULT([yes])
   WITH_MOZILLA=YES
fi

AC_MSG_CHECKING([whether to build Mozilla addressbook connectivity])
if test "$enable_mozilla" = "no"; then
   AC_MSG_RESULT([no])
elif test "$with_system_mozilla" = "yes"; then
   AC_MSG_RESULT([no, not possible with system-mozilla])
else
   AC_MSG_RESULT([yes])
fi

AC_MSG_CHECKING([whether to build XML Security support])
if test "$enable_mozilla" = "no"; then
   AC_MSG_RESULT([no, since Mozilla (NSS) disabled but needed])
else
   AC_MSG_RESULT([yes])
fi

AC_MSG_CHECKING([whether to build LDAP configuration backend])
if test -z "$enable_ldap" || test "$enable_ldap" = "yes"; then
   if test "$enable_mozilla" = "yes" || test "$with_openldap" = "yes"; then
      AC_MSG_RESULT([yes])
      WITH_LDAP=YES
   else
      AC_MSG_RESULT([no. Either Mozilla or OpenLDAP needed])
      WITH_LDAP=NO
   fi
else
   AC_MSG_RESULT([no])
   WITH_LDAP=NO
fi

if test "$WITH_LDAP" = "YES"; then
   dnl ===================================================================
   dnl Test whether we want to use the Mozilla or the OpenLDAP LDAP SDK
   dnl ===================================================================
   AC_MSG_CHECKING([which LDAP SDK to use])
   if test -n "$with_openldap" && test "$with_openldap" != "no"; then
  	   AC_MSG_RESULT([OpenLDAP])
	   WITH_OPENLDAP=YES
	   AC_CHECK_HEADERS(ldap.h, [],
		   [AC_MSG_ERROR(ldap.h not found. install openldap libs)], [])
	   AC_CHECK_LIB(ldap, ldap_simple_bind_s, [],
		   [AC_MSG_ERROR(openldap lib not found or functional)], [])
	   # rumours say that OpenLDAP doesn't have that function. I looked and
	   # it has it. Test for it to be sure
         AC_CHECK_LIB(ldap, ldap_set_option, [],
                [AC_MSG_ERROR(openldap lib not found or functional)], [])
   else
	   AC_MSG_RESULT([Netscape/Mozilla])
	   # TODO. Actually do a sanity check and check for
	   # LDAP_OPT_SIZELIMIT and LDAP_X_OPT_CONNECT_TIMEOUT 
	   WITH_OPENLDAP=NO
   fi
fi
AC_SUBST(WITH_LDAP)
AC_SUBST(WITH_OPENLDAP)

dnl ===================================================================
dnl Check for system mozilla
dnl ===================================================================
AC_MSG_CHECKING([which mozilla to use])
if test -n "$with_system_mozilla" && test "$with_system_mozilla" != "no"; then
    AC_MSG_RESULT([external])
    SYSTEM_MOZILLA=YES
    ENABLE_NSS_MODULE=NO
    enable_nss_module=no
    AC_MSG_CHECKING([which Mozilla flavour to use])
    if test -n "$with_system_mozilla" && test "$with_system_mozilla" = "libxul"; then
      MOZ_FLAVOUR=libxul
    elif test -n "$with_system_mozilla" && test "$with_system_mozilla" = "xulrunner"; then
      MOZ_FLAVOUR=xulrunner
    elif test -n "$with_system_mozilla" && test "$with_system_mozilla" = "seamonkey"; then
      MOZ_FLAVOUR=seamonkey
    elif test -n "$with_system_mozilla" && test "$with_system_mozilla" = "firefox"; then
      MOZ_FLAVOUR=firefox
    elif test -n "$with_system_mozilla" && test "$with_system_mozilla" = "mozilla"; then
      MOZ_FLAVOUR=mozilla
    else
      MOZ_FLAVOUR=libxul
    fi
    tmp=`echo $MOZ_FLAVOUR | $PERL -e 'print ucfirst(<STDIN>);'`
    AC_MSG_RESULT($tmp)

    PKG_CHECK_MODULES( MOZ_NSS, nss, STANDALONENSS="TRUE", STANDALONENSS="" )
    if test -z "$STANDALONENSS"; then
        PKG_CHECK_MODULES( MOZ_NSS, $MOZ_FLAVOUR-nss )
    else
        NSS_LIB="-L`$PKG_CONFIG --variable=libdir nss`"
        AC_SUBST(NSS_LIB)
    fi

    if $PKG_CONFIG --exists nspr ; then
      PKG_CHECK_MODULES( MOZ_NSPR, nspr )
      NSPR_LIB="-L`$PKG_CONFIG --variable=libdir nspr`"
      AC_SUBST(NSPR_LIB)
    else
      PKG_CHECK_MODULES( MOZ_NSPR, $MOZ_FLAVOUR-nspr )
    fi

    if test "$MOZ_FLAVOUR" != "libxul"; then
      PKG_CHECK_MODULES( MOZILLAXPCOM, $MOZ_FLAVOUR-xpcom, HASXPCOM="TRUE", HASXPCOM="" )
      MOZ_INC=`$PKG_CONFIG --variable=includedir $MOZ_FLAVOUR-xpcom`
      MOZ_LIB=`$PKG_CONFIG --variable=libdir $MOZ_FLAVOUR-xpcom`
    fi

    if test -z "$HASXPCOM"; then
      PKG_CHECK_MODULES( MOZILLAXPCOM, libxul )
      MOZ_INC=`$PKG_CONFIG --variable=includedir libxul`
      MOZ_LIB=`$PKG_CONFIG --variable=libdir libxul`
      if ! test -e "$MOZ_LIB/libxul.so"; then
         MOZ_LIB=`$PKG_CONFIG --variable=sdkdir libxul`
         if test -e "$MOZ_LIB/sdk/lib/libxul.so"; then
            MOZ_LIB="$MOZ_LIB/sdk/lib"
         fi
      fi
    fi

    save_CPPFLAGS="$CPPFLAGS"
    save_LDFLAGS="$LDFLAGS"
    save_LIBS="$LIBS"
    CPPFLAGS="$CPPFLAGS $MOZ_NSS_CFLAGS"
    LDFLAGS="$LDFLAGS $MOZ_NSS_LIBS"
    AC_CHECK_LIB(nss3, PK11_GetCertFromPrivateKey, [], 
      [AC_MSG_ERROR(PK11_GetCertFromPrivateKey missing but needed.
See https://bugzilla.mozilla.org/show_bug.cgi?id=262274.
Fixed since nss 3.9.3 (contained by e.g. mozilla >= 1.7.5))], [])
    LDFLAGS="$save_LDFLAGS"
    CPPFLAGS="$save_CPPFLAGS"
    LIBS="$save_LIBS"

    MOZ_LIB_XPCOM=$MOZILLAXPCOM_LIBS
    if test "$WITH_LDAP" != "NO" && test "$WITH_OPENLDAP" != "YES"; then
      AC_MSG_CHECKING([whether $tmp was compiled with --enable-ldap])
      if test -d "$MOZ_INC/ldap"; then
         AC_MSG_RESULT([yes])
         MOZ_LDAP_CFLAGS="-I$MOZ_INC"
      else
        AC_MSG_ERROR([no.
Could not find LDAP header include files in $MOZ_INC/ldap.
Please recompile $tmp with --enable-ldap or use --with-openldap.])
      fi
    fi

    #e.g. http://fedoraproject.org/wiki/Releases/FeatureXULRunnerAPIChanges
    #the plugin pkg-config etc. reverts to "mozilla-plugin" with libxul
    if test "$MOZ_FLAVOUR" = "libxul"; then
        MOZ_FLAVOUR="mozilla"
    fi

elif test "$enable_mozilla" = "no"; then
    AC_MSG_RESULT([none])
    WITH_MOZILLA=NO
    ENABLE_NSS_MODULE=NO
    enable_nss_module=no
else
    AC_MSG_RESULT([internal])
    SYSTEM_MOZILLA=NO
    BUILD_TYPE="$BUILD_TYPE MOZ"
    WITH_MOZILLA=YES
if test -z "$with_mozilla_version"; then
   MOZILLA_VERSION=
else
   AC_MSG_CHECKING([which mozilla version to build])
   MOZILLA_VERSION=$with_mozilla_version
   enable_build_mozilla=1
   AC_MSG_RESULT([$MOZILLA_VERSION])
fi

AC_SUBST(MOZILLA_VERSION)
AC_SUBST(WITH_MOZILLA)

AC_MSG_CHECKING([for toolkit mozilla should use])
if test -z "$with_mozilla_toolkit"; then
   if test "$_os" != "WINNT" ; then
      if test "$_os" = "Darwin" ; then
         MOZILLA_TOOLKIT=mac  
         AC_MSG_RESULT([mac])
      else
         MOZILLA_TOOLKIT=gtk2
         AC_MSG_RESULT([gtk2])
      fi
   fi
else
   MOZILLA_TOOLKIT=$with_mozilla_toolkit
   enable_build_mozilla=1
   AC_MSG_RESULT([$MOZILLA_TOOLKIT])
fi
#if test "$_os" = "Darwin" && test "$MOZILLA_TOOLKIT" != "gtk2"; then
#   #only gtk2 toolkit supported - xlib or cocoa nees glib1 and libIDL1 - the latter is not
#   #available using fink, mac (carbon) doesn't work because xcode installs conflicting headers
#   AC_MSG_ERROR([Only gtk2 toolkit supported on Mac, sorry.])
#fi

AC_SUBST(MOZILLA_TOOLKIT)

# default to enabling build mozilla
if test "$enable_build_mozilla" != "no"; then
      enable_build_mozilla=yes
else
      enable_build_mozilla=
fi

AC_MSG_CHECKING([whether to build Mozilla/SeaMonkey])
if test -n "$enable_build_mozilla"; then
   BUILD_MOZAB="TRUE"
   AC_MSG_RESULT([yes])
else
   BUILD_MOZAB=""	
   AC_MSG_RESULT([no])
fi

AC_MSG_CHECKING([whether to build provided NSS module])
if test "$enable_nss_module" != "no"; then
   ENABLE_NSS_MODULE="YES"
   BUILD_TYPE="$BUILD_TYPE NSS"
   AC_MSG_RESULT([yes])
   if test "$_os" = "WINNT"; then
      AC_MSG_CHECKING([for Mozilla build tooling])
      if test -z "$MOZILLABUILD" ; then
AC_MSG_ERROR([Mozilla build tooling not found.
Use the --with-mozilla-build option after installling the tools obtained
from http://ftp.mozilla.org/pub/mozilla.org/mozilla/libraries/win32])
      else
         if test \( "$WITH_MINGWIN" = "yes" \) ; then
            if test ! -d "$MOZILLABUILD" ; then
AC_MSG_ERROR([Mozilla build tooling incomplete!])
            else
               AC_MSG_RESULT([ok])
            fi
         else
            if test ! -d "$MOZILLABUILD/moztools" \
               -o ! -d "$MOZILLABUILD/msys" ; then
AC_MSG_ERROR([Mozilla build tooling incomplete!])
            else
               AC_MSG_RESULT([ok])
            fi
         fi
      fi
   fi
else
   ENABLE_NSS_MODULE="NO"
   AC_MSG_RESULT([no])
fi

if test "$BUILD_MOZAB" = "TRUE"; then
  if test "$_os" = "WINNT"; then
    if test "$WITH_MINGWIN" != "yes"; then
      # compiling with MSVC. Only supported platform here is MSVS2005 at the moment.
      if test "$MSVSVER" != "2005"; then
        AC_MSG_ERROR([Building SeaMonkey is supported with Microsoft Visual Studio .NET 2005 only.])
      fi
    else
      AC_MSG_WARN([Building SeaMonkey with mingwin is not tested, and likely to break.])
      echo "Building SeaMonkey with mingwin is not tested, and likely to break." >> warn
    fi
  fi

   if test -z "$MOZILLA_VERSION"; then
      MOZILLA_VERSION=1.1.14
   fi
   if test "$_os" = "WINNT"; then
      AC_MSG_CHECKING([for moztools binaries])
      if test ! -e "$TARFILE_LOCATION/vc8-moztools.zip" ; then
        AC_MSG_ERROR([The following file is missing in $TARFILE_LOCATION: vc8-moztools.zip
(from ftp://ftp.mozilla.org/pub/mozilla.org/mozilla/libraries/win32/historic/vc8/)])
      else
         AC_MSG_RESULT([ok])
      fi
   elif test "$_os" = "Darwin"; then
      if test "$MOZILLA_TOOLKIT" = "gtk2"; then
         AC_MSG_NOTICE([checking whether mozilla can be built...])
         PKG_CHECK_MODULES(MOZGTK2, gtk+-2.0 >= 2.4 libIDL-2.0 >= 0.8, AC_MSG_NOTICE([OK - can build mozilla]), AC_MSG_ERROR([Prerequisites to build mozilla not met. Either use the precompiled mozilla binaries or install the missing packages]))
      else
         PKG_CHECK_MODULES(MOZLIBREQ, libIDL-2.0 >= 0.6.3,  MOZIDL="TRUE", MOZIDL="")
         if test -z "$MOZIDL"; then
            AC_MSG_ERROR([libIDL 0.6.3 or newer is needed to build mozilla with mac toolkit.])
         fi
      fi
   else
      # Generic Unix/Linux section
      if test "$MOZILLA_TOOLKIT" = "gtk2"; then
         PKG_CHECK_MODULES(MOZLIBREQ, gtk+-2.0, MOZGTK="TRUE", MOZGTK="")
         if test -z "$MOZGTK"; then
            AC_MSG_ERROR([GTK2 is needed to build mozilla.])
         fi
         PKG_CHECK_MODULES(MOZLIBREQ, libIDL-2.0 >= 0.8.0, MOZIDL="TRUE", MOZIDL="")
         if test -z "$MOZIDL"; then
            AC_MSG_ERROR([libIDL >= 0.8.0 is needed when using GTK2 to build mozilla.])
         fi 
      else
         PKG_CHECK_MODULES(MOZLIBREQ, gtk+ >= 1.2.3, MOZGTK="TRUE", MOZGTK="")
         if test -z "$MOZGTK"; then
            AC_MSG_ERROR([gtk 1.2 is needed when not using GTK2 to build mozilla.])
         fi
         PKG_CHECK_MODULES(MOZLIBREQ, libidl >= 0.6.3 libidl <= 0.6.8, MOZIDL="TRUE", MOZIDL="")
         if test -z "$MOZIDL"; then
            AC_MSG_ERROR([libIDL 0.6.3 - 0.6.8 is needed when not using GTK2 to build mozilla.])
         fi
      fi
   fi
fi

AC_SUBST(BUILD_MOZAB)

fi
AC_SUBST(ENABLE_NSS_MODULE)
AC_SUBST(MOZILLABUILD)
AC_SUBST(SYSTEM_MOZILLA)
AC_SUBST(MOZ_FLAVOUR)
AC_SUBST(MOZ_INC)
AC_SUBST(MOZ_LIB)
AC_SUBST(MOZ_LIB_XPCOM)
AC_SUBST(MOZ_NSPR_CFLAGS)
AC_SUBST(MOZ_NSS_CFLAGS)
AC_SUBST(MOZ_LDAP_CFLAGS)

dnl ===================================================================
dnl Check for system sane
dnl ===================================================================
AC_MSG_CHECKING([which sane header to use])
if test -n "$with_system_sane_header" -o -n "$with_system_headers" && \
	test "$with_system_sane_header" != "no"; then
   AC_MSG_RESULT([external])
   SYSTEM_SANE_HEADER=YES
   AC_CHECK_HEADER(sane/sane.h, [],
      [AC_MSG_ERROR(sane not found. install sane)], [])
else
   AC_MSG_RESULT([internal])
   SYSTEM_SANE_HEADER=NO
   BUILD_TYPE="$BUILD_TYPE SANE"
fi
AC_SUBST(SYSTEM_SANE_HEADER)

dnl ===================================================================
dnl Check for system icu
dnl ===================================================================
AC_MSG_CHECKING([which icu to use])
if test -n "$with_system_icu" -o -n "$with_system_libs" && \
	test "$with_system_icu" != "no"; then
   AC_MSG_RESULT([external])
   SYSTEM_ICU=YES
   AC_LANG_PUSH([C++])
   AC_MSG_CHECKING([for unicode/rbbi.h])
   AC_TRY_CPP(unicode/rbbi.h, AC_MSG_RESULT([checked.]), AC_MSG_ERROR([icu headers not found.]))
   AC_LANG_POP([C++])
   AC_PATH_PROG(SYSTEM_GENBRK, genbrk, [], [$PATH:/usr/sbin:/sbin])
   if test -z "$SYSTEM_GENBRK"; then
      AC_MSG_ERROR([\"genbrk\" not found in \$PATH, install the icu development tool \"genbrk"\])
   fi
   AC_PATH_PROG(SYSTEM_GENCCODE, genccode, [], [$PATH:/usr/sbin:/sbin])
   if test -z "$SYSTEM_GENCCODE"; then
      AC_MSG_ERROR([\"genccode\" not found in \$PATH, install the icu development tool \"genccode"\])
   fi
   AC_PATH_PROG(SYSTEM_GENCMN, gencmn, [], [$PATH:/usr/sbin:/sbin])
   if test -z "$SYSTEM_GENCMN"; then
      AC_MSG_ERROR([\"gencmn\" not found in \$PATH, install the icu development tool \"gencmn"\])
   fi

   AC_PATH_PROG( ICUCONFIG, icu-config)
   AC_MSG_CHECKING([ICU version])
   if test "$_os" = "OS2"; then
      ICU_MAJOR=4
   else
      ICU_VERSION=`$ICUCONFIG --version`
      ICU_MAJOR=`$ICUCONFIG --version | cut -d"." -f1`
      ICU_MINOR=`$ICUCONFIG --version | cut -d"." -f2`
      ICU_MICRO=`$ICUCONFIG --version | cut -d"." -f3`
   fi

   if test "$ICU_MAJOR" -ge "4"; then
      AC_MSG_RESULT([OK])
   else
      AC_MSG_ERROR([not suitable, only >= 4.0 supported currently])
   fi

else
    AC_MSG_RESULT([internal])
    SYSTEM_ICU=NO
    BUILD_TYPE="$BUILD_TYPE ICU"
fi
AC_SUBST(SYSTEM_ICU)
AC_SUBST(SYSTEM_GENBRK)
AC_SUBST(SYSTEM_GENCCODE)
AC_SUBST(SYSTEM_GENCMN)
AC_SUBST(ICU_MAJOR)
AC_SUBST(ICU_MINOR)
AC_SUBST(ICU_MICRO)

dnl ===================================================================
dnl Graphite
dnl ===================================================================

ENABLE_GRAPHITE="FALSE"
AC_MSG_CHECKING([whether to enable graphite support])
if test "x$enable_graphite" = "xyes" -a \( "$_os" = "WINNT" -o "$_os" = "Linux" -o "$_os" = "FreeBSD" \) ; then
    AC_MSG_RESULT([yes])
    ENABLE_GRAPHITE="TRUE"
    AC_MSG_CHECKING([which graphite to use])
    if test -n "$with_system_graphite" -o -n "$with_system_libs" && \
        test "$with_system_graphite" != "no"; then
        AC_MSG_RESULT([external])
        SYSTEM_GRAPHITE=YES
        PKG_CHECK_MODULES( GRAPHITE, silgraphite )
    else
        AC_MSG_RESULT([internal])
        SYSTEM_GRAPHITE=NO
        BUILD_TYPE="$BUILD_TYPE GRAPHITE"
    fi
else
   AC_MSG_RESULT([no])
   ENABLE_GRAPHITE="FALSE"
fi
AC_SUBST(ENABLE_GRAPHITE)
AC_SUBST(SYSTEM_GRAPHITE)
AC_SUBST(GRAPHITE_LIBS)
AC_SUBST(GRAPHITE_CFLAGS)

dnl ===================================================================
dnl Checks for libraries.
dnl ===================================================================
dnl Check for Mac OS X native GUI, which may is now required; the X11 build is no longer supported
dnl See if we have the AppKit framework for building with Quartz graphics.

if test  "$_os" = "Darwin"; then
   if test "x$with_x" = "xyes"; then
      AC_MSG_ERROR([X11 build is no longer supported on MacOSX, please use the native aqua build])
   else
      AC_MSG_CHECKING([for /System/Library/Frameworks/AppKit.framework])
      if test -d "/System/Library/Frameworks/AppKit.framework/"; then
         AC_MSG_RESULT([yes])
         x_includes="no_x_includes"
         x_libraries="no_x_libraries"
         dnl disable some things used on other Unix versions but not on the aqua build
         enable_gtk=no
         enable_cups=no
         ENABLE_CUPS=""
         AC_SUBST(ENABLE_CUPS)
      else
         AC_MSG_ERROR([No AppKit.framewrok found])
      fi
   fi
fi

dnl ***************************************
dnl testing for X libraries and includes...
dnl ***************************************
if test "$_os" = "Darwin" -a "x$x_includes" = "xno_x_includes"; then
   echo "Do Nothing for _os = Darwin"
   dnl Mac OS X using Aqua graphics. Don't check for X11.
   :
elif test "$_os" = "OS2" ; then
   echo "Do Nothing for _os = OS2. Don't check for X11."
   dnl OS/2 uses native graphics. Don't check for X11.
   :
elif test "$_os" != "WINNT" ; then
   AC_PATH_X
   AC_PATH_XTRA
   CPPFLAGS="$CPPFLAGS $X_CFLAGS"

   if test "x$x_includes" = "x"; then
     x_includes="default_x_includes"
   fi
   if test "x$x_libraries" = "x"; then
     x_libraries="default_x_libraries"
   fi
   dnl The variables $x_libraries and $x_includes are set.
   if test -z "$x_libraries"; then
      AC_MSG_ERROR([No X libraries found]) # Exit
   fi
   if test -z "$x_includes"; then
      AC_MSG_ERROR([No X includes found]) # Exit
   fi
   CFLAGS=$X_CFLAGS
   LDFLAGS="$X_LDFLAGS $X_LIBS"
   AC_CHECK_LIB(X11, XOpenDisplay, x_libs="-lX11 $X_EXTRA_LIBS", [AC_MSG_ERROR([X Development libraries not found])])
   dnl Check if the XauDisposeAuth symbol is provided by libXau.
   AC_CHECK_LIB(Xau, XauDisposeAuth, XAU_LIBS="-lXau", [])
else
   x_includes="no_x_includes"
   x_libraries="no_x_libraries"
fi
if test -z "$x_includes"; then
   x_includes="no_x_includes"
fi
if test -z "$x_libraries"; then
   x_libraries="no_x_libraries"
fi
if test "$x_includes" = "default_x_includes"; then
   XINC="/usr/include"
else
   XINC="$x_includes"
fi
AC_SUBST(XINC)
if test "$x_libraries" = "default_x_libraries"; then
   XLIB=`$PKG_CONFIG --variable=libdir x11`
   if test "x$XLIB" = x; then
         XLIB="/usr/lib"
   fi
else
   XLIB="$x_libraries"
fi
AC_SUBST(XLIB)
AC_SUBST(XAU_LIBS)

if test "$_os" != "WINNT" -a "$_os" != "OS2" -a "$_os" != "Darwin"; then
   dnl ===================================================================
   dnl Check for using Xaw
   dnl ===================================================================
   AC_MSG_CHECKING([whether to use Xaw])
   if test "$enable_Xaw" = "no"; then
       DISABLE_XAW=TRUE
       AC_MSG_RESULT([no])
       AC_CHECK_HEADERS(X11/Composite.h,[],[AC_MSG_ERROR([Xt include headers not found])],
         [#include <X11/Intrinsic.h>])
   else
       AC_MSG_RESULT([yes])
       AC_CHECK_HEADERS(X11/Xaw/Label.h,[],[AC_MSG_ERROR([Xaw include headers not found])],
         [#include <X11/Intrinsic.h>])
       AC_CHECK_LIB(Xaw, main, [],
           [AC_MSG_ERROR(Xaw library not found or functional)], [])
   fi
fi
AC_SUBST(DISABLE_XAW)



dnl ===================================================================
dnl Check if fontconfig/fontconfig.h is available 
dnl ===================================================================
if test "$ENABLE_FONTCONFIG" = "TRUE" ; then
    AC_CHECK_HEADER(fontconfig/fontconfig.h, [],
                    [AC_MSG_ERROR([fontconfig/fontconfig.h could not be found. libfontconfig1-dev or fontconfig???-devel missing?])], [])
    AC_MSG_CHECKING([whether fontconfig is >= 2.2.0])
    AC_TRY_RUN([
#include <fontconfig/fontconfig.h>

int main(int argc, char **argv) {
	if(FC_MAJOR > 2 || (FC_MAJOR == 2 && FC_MINOR >= 2)) return 0;
	else return 1;
}
], [AC_MSG_RESULT([yes])], [AC_MSG_ERROR([no, fontconfig >= 2.2.0 needed])])
fi

dnl ===================================================================
dnl Check for system Xrender
dnl ===================================================================
AC_MSG_CHECKING([whether to link to Xrender])
if test -n "$enable_xrender_link" -a "$enable_xrender_link" != "no"; then
   AC_MSG_RESULT([yes])
   XRENDER_LINK=YES
   with_system_xrender_headers=yes
else
   AC_MSG_RESULT([no, dynamically open it])
   XRENDER_LINK=NO
fi
AC_MSG_CHECKING([which Xrender headers to use])
if test -n "$with_system_xrender_headers" -o -n "$with_system_headers" && \
	test "$with_system_xrender_headers" != "no"; then
   AC_MSG_RESULT([external])
   SYSTEM_XRENDER_HEADERS=YES
   AC_CHECK_HEADER(X11/extensions/Xrender.h, [],
      [AC_MSG_ERROR(Xrender not found. install X)], [])
else
   AC_MSG_RESULT([internal])
   SYSTEM_XRENDER_HEADERS=NO
   BUILD_TYPE="$BUILD_TYPE X11_EXTENSIONS"
fi
if test "$XRENDER_LINK" = "YES"; then
   AC_CHECK_LIB(Xrender, XRenderQueryVersion, [],
      [AC_MSG_ERROR(libXrender not found or functional)], [])
fi
AC_SUBST(SYSTEM_XRENDER_HEADERS)
AC_SUBST(XRENDER_LINK)

dnl ===================================================================
dnl Check for XRandr
dnl ===================================================================
AC_MSG_CHECKING([whether to enable RandR support])
if test "$test_randr" = "yes" -a \( "$enable_randr" = "yes" -o "$enable_randr" = "TRUE" \) ; then
   if test -z "$enable_randr_link" -o "$enable_randr_link" = "no"; then
	  XRANDR_DLOPEN="TRUE"
	  AC_MSG_RESULT([resorting to dlopen libXrandr at runtime])
   else
	  XRANDR_DLOPEN="FALSE"
      PKG_CHECK_MODULES(XRANDR, xrandr >= 1.2, ENABLE_RANDR="TRUE", ENABLE_RANDR="")
      if test "$ENABLE_RANDR" != "TRUE"; then
         AC_CHECK_HEADER(X11/extensions/Xrandr.h, [],
                        [AC_MSG_ERROR([X11/extensions/Xrandr.h could not be found. X11 dev missing?])], [])
         XRANDR_CFLAGS=" "
         AC_CHECK_LIB(Xrandr, XRRQueryExtension, [],
              [ AC_MSG_ERROR(libXrandr not found or functional) ], [])
         XRANDR_LIBS="-lXrandr "
         ENABLE_RANDR="TRUE"
	     AC_MSG_RESULT([enabling RandR support])
      fi
   fi
else
   ENABLE_RANDR=""
   AC_MSG_RESULT([no])
fi
AC_SUBST(XRANDR_DLOPEN)
AC_SUBST(XRANDR_CFLAGS)
AC_SUBST(XRANDR_LIBS)
AC_SUBST(ENABLE_RANDR)

dnl ===================================================================
dnl Check for system openssl
dnl ===================================================================
if test "$_os" = "Darwin" && test "$with_system_openssl" != "no"; then
   with_system_openssl=yes
fi
AC_MSG_CHECKING([which libssl to use])
if test -n "$with_system_openssl" -o -n "$with_system_libs" && \
        test "$with_system_openssl" != "no"; then
    AC_MSG_RESULT([external])
    # Mac OS builds should get out without extra stuff is the Mac porters'
    # wish. And pkg-config is although Xcode ships a .pc for openssl
    if test "$_os" = "Darwin" -o "$_os" = "FreeBSD"; then
        OPENSSL_CFLAGS=
        OPENSSL_LIBS="-lssl -lcrypto"
    else
    	PKG_CHECK_MODULES( OPENSSL, openssl )
    fi
    SYSTEM_OPENSSL=YES
else
    AC_MSG_RESULT([internal])
    SYSTEM_OPENSSL=NO
    BUILD_TYPE="$BUILD_TYPE OPENSSL"
fi
AC_SUBST(SYSTEM_OPENSSL)
AC_SUBST(OPENSSL_CFLAGS)
AC_SUBST(OPENSSL_LIBS)

dnl ===================================================================
dnl Check for system redland
dnl ===================================================================
AC_MSG_CHECKING([which redland library to use])
if test -n "$with_system_redland" -o -n "$with_system_libs" && \
	test "$with_system_redland" != "no"; then
	AC_MSG_RESULT([external])
	SYSTEM_REDLAND=YES
   dnl versions before 1.0.8 write RDF/XML that is useless for ODF (@xml:base)
   PKG_CHECK_MODULES(REDLAND, redland >= 1.0.8)
else
	AC_MSG_RESULT([internal])
	BUILD_TYPE="$BUILD_TYPE REDLAND"
	SYSTEM_REDLAND=NO
fi
AC_SUBST(SYSTEM_REDLAND)
AC_SUBST(REDLAND_CFLAGS)
AC_SUBST(REDLAND_LIBS)

dnl ===================================================================
dnl Check for hunspell
dnl ===================================================================
AC_MSG_CHECKING([whether to build the Spell Checking component])
ENABLE_HUNSPELL=

if test "x$enable_hunspell" != "xno" ; then
    AC_MSG_CHECKING([which libhunspell to use])
    if test -n "$with_system_hunspell" -o -n "$with_system_libs" && \
        test "$with_system_hunspell" != "no"; then
        AC_MSG_RESULT([external])
        SYSTEM_HUNSPELL=YES
        AC_LANG_PUSH([C++])
        PKG_CHECK_MODULES(HUNSPELL, hunspell, HUNSPELL_PC="TRUE", HUNSPELL_PC="" )
        if test "$HUNSPELL_PC" != "TRUE"; then
            AC_CHECK_HEADER(hunspell.hxx, [],
            [AC_CHECK_HEADER(hunspell/hunspell.hxx, [ HUNSPELL_CFLAGS=-I/usr/include/hunspell ],
                [AC_MSG_ERROR(hunspell headers not found.)], [])
             ], [])
            AC_CHECK_LIB(hunspell, main, [],
            [ AC_MSG_ERROR(hunspell library not found.) ], [])
            HUNSPELL_LIBS=-lhunspell
        fi
        AC_LANG_POP([C++])
    else
        AC_MSG_RESULT([internal])
        SYSTEM_HUNSPELL=NO
        BUILD_TYPE="$BUILD_TYPE HUNSPELL"
    fi
    ENABLE_HUNSPELL=YES
    AC_SUBST(SYSTEM_HUNSPELL)
    AC_SUBST(HUNSPELL_CFLAGS)
    AC_SUBST(HUNSPELL_LIBS)
else
    AC_MSG_RESULT([no])
fi
AC_SUBST(ENABLE_HUNSPELL)

dnl ===================================================================
dnl Checking for libhyphen
dnl ===================================================================
AC_MSG_CHECKING([whether to build the Hyphenator component])
ENABLE_HYPHEN=

if test "x$enable_hyphen" != "xno" ; then
    AC_MSG_CHECKING([which libhyphen to use])
    if test -n "$with_system_hyphen" -o -n "$with_system_libs" && \
        test "$with_system_hyphen" != "no"; then
        AC_MSG_RESULT([external])
        SYSTEM_HYPH=YES
        AC_CHECK_HEADER(hyphen.h, [],
        [ AC_MSG_ERROR(libhyphen headers not found.)], [])
        AC_CHECK_MEMBER(struct _HyphenDict.cset, [],
        [ AC_MSG_ERROR(no. You are sure you have libhyphen headers?)],
        [#include <hyphen.h>])
        AC_CHECK_LIB(hyphen, hnj_hyphen_hyphenate2, [HYPHEN_LIB=-lhyphen],
            [ AC_MSG_ERROR(libhyphen not found or too old.)], [])
        if test -z "$HYPHEN_LIB"; then
        AC_CHECK_LIB(hyph, hnj_hyphen_hyphenate2, [HYPHEN_LIB=-lhyph],
            [ AC_MSG_ERROR(libhyphen not found or too old.)], [])
        fi
        if test -z "$HYPHEN_LIB"; then
        AC_CHECK_LIB(hnj, hnj_hyphen_hyphenate2, [HYPHEN_LIB=-lhnj],
            [ AC_MSG_ERROR(libhyphen not found or too old.)], [])
        fi
    else
        AC_MSG_RESULT([internal])
        SYSTEM_HYPH=NO
        BUILD_TYPE="$BUILD_TYPE HYPHEN"
    fi
    ENABLE_HYPHEN=YES
    AC_SUBST(SYSTEM_HYPH)
    AC_SUBST(HYPHEN_LIB)
else
    AC_MSG_RESULT([no])
fi
AC_SUBST(ENABLE_HYPHEN)


#dnl ===================================================================
#dnl Check whether we are allowed to bundle dictionaries and whether
#dnl hunspell is available.
#dnl ===================================================================
ENABLE_BUNDLED_DICTIONARIES=
if test "x$enable_bundled_dictionaries" != "xno" -a "x$ENABLE_HUNSPELL" = "xYES"; then
   ENABLE_BUNDLED_DICTIONARIES=YES
fi
AC_SUBST(ENABLE_BUNDLED_DICTIONARIES)



dnl ===================================================================
dnl Checking for mythes
dnl ===================================================================
AC_MSG_CHECKING([which mythes to use])
if test -n "$with_system_mythes" -o -n "$with_system_libs" && \
   test "$with_system_mythes" != "no"; then
    AC_MSG_RESULT([external])
    SYSTEM_MYTHES=YES
    AC_LANG_PUSH([C++])
    PKG_CHECK_MODULES(MYTHES, mythes, MYTHES_PKGCONFIG=yes, MYTHES_PKGCONFIG=no)
    if test "$MYTHES_PKGCONFIG" = "no"; then
        AC_CHECK_HEADER(mythes.hxx, [],
            [ AC_MSG_ERROR(mythes.hxx headers not found.)], [])
        AC_CHECK_LIB(mythes-1.2, main, [],
            [ MYTHES_FOUND=no], [])
 	if test "$MYTHES_FOUND" = "no"; then
            AC_CHECK_LIB(mythes, main, [MYTHES_FOUND=yes],
                [ MYTHES_FOUND=no], [])
	fi
	if test "$MYTHES_FOUND" = "no"; then
		AC_MSG_ERROR([mythes library not found!.])
	fi
    fi
    AC_LANG_POP([C++])
else
    AC_MSG_RESULT([internal])
    SYSTEM_MYTHES=NO
    BUILD_TYPE="$BUILD_TYPE MYTHES"
fi
AC_SUBST(SYSTEM_MYTHES)
AC_SUBST(MYTHES_CFLAGS)
AC_SUBST(MYTHES_LIBS)


dnl ===================================================================
dnl Checking for libtextcat
dnl ===================================================================
AC_MSG_CHECKING([which libtextcat to use])
if test -n "$with_system_libtextcat" && test "$with_system_libtextcat" != "no"; then
    AC_MSG_RESULT([external])
    SYSTEM_LIBTEXTCAT=YES
    AC_CHECK_HEADER(libtextcat/textcat.h, [],
       [ AC_MSG_ERROR(libtextcat headers not found.)], [])
    AC_CHECK_LIB(textcat, special_textcat_Init, ,
        [ AC_MSG_ERROR(libtextcat library not found or not suitable. libtextcat typically needs to be patched)], [])
else
    AC_MSG_RESULT([internal])
    SYSTEM_LIBTEXTCAT=NO
    BUILD_TYPE="$BUILD_TYPE LIBTEXTCAT"
fi
AC_SUBST(SYSTEM_LIBTEXTCAT)

AC_MSG_CHECKING([which libtextcat data directory to use])
if test -n "$with_system_libtextcat_data" && test "$with_system_libtextcat_data" != "no"; then
    if test "$with_system_libtextcat_data" = "yes"; then
        SYSTEM_LIBTEXTCAT_DATA=file:///usr/share/libtextcat
    else
        SYSTEM_LIBTEXTCAT_DATA=file://$with_system_libtextcat_data
    fi
    AC_MSG_RESULT([$SYSTEM_LIBTEXTCAT_DATA])
else
    AC_MSG_RESULT([internal])
    BUILD_TYPE="$BUILD_TYPE LIBTEXTCATDATA"
fi
AC_SUBST(SYSTEM_LIBTEXTCAT_DATA)

dnl ***************************************
dnl testing libc version for Linux...
dnl ***************************************
if test "$_os" = "Linux"; then
   AC_MSG_CHECKING([whether libc is >= 2.1.1])
   exec 6>/dev/null # no output
   AC_CHECK_LIB(c, gnu_get_libc_version, HAVE_LIBC=yes; export HAVE_LIBC)
   exec 6>&1 # output on again
   if test "$HAVE_LIBC"; then
      AC_MSG_RESULT([yes])
   else
      AC_MSG_ERROR([no, upgrade libc])
   fi
fi

if test "$_os" != "WNT"; then
  AC_CHECK_FUNCS(getopt, HAVE_GETOPT=YES, [HAVE_GETOPT=NO])
  AC_CHECK_FUNCS(readdir_r, HAVE_READDIR_R=YES, [HAVE_READDIR_R=NO])
  if test "$HAVE_GETOPT" = "YES" -a "$HAVE_READDIR_R" = "YES"; then
	SYSTEM_LIBC=YES
  fi
else
  HAVE_GETOPT=NO
  HAVE_READDIR_R=NO
  SYSTEM_LIBC=YES
fi
AC_SUBST(HAVE_GETOPT)
AC_SUBST(HAVE_READDIR_R)
AC_SUBST(SYSTEM_LIBC)

dnl =========================================
dnl Check for the Microsoft Platform SDK.
dnl =========================================
dnl FIXME: I don't know yet if PSDK works with MinGW, keep it until I know better,
dnl and add "-a \( "$WITH_MINGWIN" != "yes" \)" then
if test \( "$_os" = "WINNT" \) ; then
	AC_MSG_CHECKING([for PSDK files])
	if test -z "$with_psdk_home"; then
		# This first line will detect a February 2003 Microsoft Platform SDK
		PSDK_HOME=`./oowintool --psdk-home`
        # But there might be also an April 2005 PSDK, unfortunately MS changed
        # the registry entry. (we prefer the old version!?)
        if test -z "$PSDK_HOME"; then
          PSDK_HOME=`cat /proc/registry/HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/MicrosoftSDK/InstalledSDKs/*/Install\ Dir 2> /dev/null | tr '\000' '\n' | head -n 1`
        fi
            # normalize if found
            if test -n "$PSDK_HOME"; then
              PSDK_HOME=`cygpath -d "$PSDK_HOME"`
              PSDK_HOME=`cygpath -u "$PSDK_HOME"`
           fi
	else
           PSDK_HOME=`cygpath -u "$with_psdk_home"`
	fi
        # Remove a possible trailing backslash
        PSDK_HOME=`echo $PSDK_HOME | $SED 's/\/$//'`
    # Problem with current PSDK (iz 49865)
    if test -f "$PSDK_HOME/Lib/libcp.lib"; then
        AC_MSG_ERROR([

Some modules do not build correctly with MS Platform SDK - April 2005
Edition if the library ($PSDK_HOME/Lib/libcp.lib) is found.
Remove/rename/backup that file and restart configure. Details about this
problem can be found in issue 49856.])
    fi
# WIndows SDK has different headers
	if test \( -f "$PSDK_HOME/Include/adoint.h" \) \
		 -a \( -f "$PSDK_HOME/Include/SqlUcode.h" \) \
		 -a \( -f "$PSDK_HOME/Include/usp10.h" \); then
		HAVE_PSDK_H="yes"
	else
		HAVE_PSDK_H="no"
	fi
	if test -f "$PSDK_HOME/lib/unicows.lib"; then
		HAVE_PSDK_LIB="yes"
	else
		HAVE_PSDK_LIB="no"
	fi
    if test "$HAVE_PSDK_H" = "no" -o "$HAVE_PSDK_LIB" = "no"; then
        AC_MSG_ERROR([Some (all?) PSDK files not found, please check if all needed Platform SDKs
are installed or use --with-psdk-home .])
    fi
    if test ! -x "$PSDK_HOME/bin/msiinfo.exe" \
         -o ! -x "$PSDK_HOME/bin/msidb.exe" \
         -o ! -x "$PSDK_HOME/bin/uuidgen.exe" \
         -o ! -x "$PSDK_HOME/bin/msitran.exe" ; then
        AC_MSG_ERROR([Some (all) files of the Windows Installer SDK are missing, please install.])
    fi
    AC_MSG_RESULT([SDK files found ...)])
dnl Check if this is the right SDK.
    if echo $PSDK_HOME | grep "v6.1" >/dev/null 2>/dev/null; then
        AC_MSG_RESULT([Found Windows SDK 6.1 ($PSDK_HOME)])
        WINDOWS_VISTA_PSDK=TRUE
    elif echo $PSDK_HOME | grep "v6.0" >/dev/null 2>/dev/null; then
        AC_MSG_RESULT([Found Windows SDK 6.0 ($PSDK_HOME)])
        WINDOWS_VISTA_PSDK=TRUE
    else
        AC_MSG_RESULT([Found Legacy Windows Platform SDK ($PSDK_HOME)])
    fi
fi
AC_SUBST(PSDK_HOME)
AC_SUBST(WINDOWS_VISTA_PSDK)

dnl =========================================
dnl Check for the Microsoft DirectX SDK.
dnl =========================================
if test \( "$_os" = "WINNT" \) ; then
    AC_MSG_CHECKING([for DirectX SDK files])
    if test -z "$with_directx_home"; then
        dnl A standard installation of the DirectX SDK sets $DXSDK_DIR
        if test -n "$DXSDK_DIR"; then
            DIRECTXSDK_HOME=`cygpath -d "$DXSDK_DIR"`
            DIRECTXSDK_HOME=`cygpath -u "$DIRECTXSDK_HOME"`
        fi
        # At this point $DIRECTXSDK_HOME might still be undefined. This will lead to
        # the "DirectX SDK files not found" error later
    else
	DIRECTXSDK_HOME=`cygpath -u "$with_directx_home"`
    fi
    # Remove a possible trailing backslash
    DIRECTXSDK_HOME=`echo $DIRECTXSDK_HOME | $SED 's/\/$//'`

    if test -f "$DIRECTXSDK_HOME/Include/ddraw.h" ; then
        HAVE_DIRECTDRAW_H="yes"
    else
        HAVE_DIRECTDRAW_H="no"
    fi
    if test -f "$DIRECTXSDK_HOME/Include/d3d9.h" ; then
        HAVE_DIRECTXSDK_H="yes"
    else
        HAVE_DIRECTXSDK_H="no"
    fi

    # MS changed the location of the libraries with dec 2004 directx sdk
    if test -d "$DIRECTXSDK_HOME/lib/x86" ; then
        DIRECTXSDK_LIB="$DIRECTXSDK_HOME/lib/x86"
    else
        DIRECTXSDK_LIB="$DIRECTXSDK_HOME/lib"
    fi
    if test -f "$DIRECTXSDK_LIB/ddraw.lib" ; then
        HAVE_DIRECTDRAW_LIB="yes"
    else
        HAVE_DIRECTDRAW_LIB="no"
    fi
    if test -f "$DIRECTXSDK_LIB/d3d9.lib" ; then
        HAVE_DIRECTXSDK_LIB="yes"
    else
        HAVE_DIRECTXSDK_LIB="no"
    fi

    if test "$HAVE_DIRECTDRAW_H" = "yes" -a "$HAVE_DIRECTDRAW_LIB" = "yes" ; then
       ENABLE_DIRECT_DRAW="TRUE"
    fi
    if test "$HAVE_DIRECTXSDK_H" = "yes" -a "$HAVE_DIRECTXSDK_LIB" = "yes" ; then
       HAVE_DIRECTXSDK="yes"
    else
       HAVE_DIRECTXSDK="no"
    fi

    if test -n "$ENABLE_DIRECTX"; then
	    if test "$HAVE_DIRECTDRAW" = "yes" -o "$HAVE_DIRECTXSDK" = "yes" ; then
		    AC_MSG_RESULT([found])
	    else
		    AC_MSG_ERROR([DirectX SDK files not found, please use --with-directx-home or --disable-directx.])
	    fi
    else
		DIRECTXSDK_HOME=""
		AC_MSG_RESULT([disabled])
    fi
fi
AC_SUBST(ENABLE_DIRECT_DRAW)
AC_SUBST(DIRECTXSDK_HOME)
AC_SUBST(DIRECTXSDK_LIB)


dnl ============================================
dnl Check for ATL and MFC
dnl ============================================
if test \( "$_os" = "WINNT" \) ; then
    AC_MSG_CHECKING([for ATL and MFC])
    if test "$DISABLE_ATL" = "TRUE"; then
        AC_MSG_RESULT([ATL is disabled, nothing to check])
    else
        AC_MSG_NOTICE([testing ATL/MFC libs and includes])
        if test -z "$with_atl_include_dir"; then
            ATL_INCLUDE=$COMPATH/atlmfc/include
        else
            ATL_INCLUDE=`cygpath -u "$with_atl_include_dir"`
        fi
        if test -z "$with_atl_lib_dir"; then
            ATL_LIB=$COMPATH/atlmfc/lib
        else
            ATL_LIB=`cygpath -u "$with_atl_lib_dir"`
        fi
        if test -z "$with_mfc_include_dir"; then
            MFC_INCLUDE=$COMPATH/atlmfc/include
        else
            MFC_INCLUDE=`cygpath -u "$with_mfc_include_dir"`
        fi
        if test -z "$with_mfc_lib_dir"; then
            MFC_LIB=$COMPATH/atlmfc/lib
        else
            MFC_LIB=`cygpath -u "$with_mfc_lib_dir"`
        fi

        ATL_INCLUDE=`echo $ATL_INCLUDE | $SED 's/\/$//'`
        ATL_LIB=`echo $ATL_LIB | $SED 's/\/$//'`
        MFC_INCLUDE=`echo $MFC_INCLUDE | $SED 's/\/$//'`
        MFC_LIB=`echo $MFC_LIB | $SED 's/\/$//'`

        AC_MSG_NOTICE([looking for atlbase.h in "$ATL_INCLUDE"])
        if test -f "$ATL_INCLUDE/atlbase.h"; then
            HAVE_ATL_H="yes"
        else
            HAVE_ATL_H="no"
        fi
        AC_MSG_NOTICE([found atlbase.h in "$ATL_INCLUDE"? "$HAVE_ATL_H"])

        AC_MSG_NOTICE([looking for afx.h in "$MFC_INCLUDE"])
        if test -f "$MFC_INCLUDE/afx.h"; then
            HAVE_MFC_H="yes"
        else
            HAVE_MFC_H="no"
        fi
        AC_MSG_NOTICE([found afx.h in "$MFC_INCLUDE"? "$HAVE_MFC_H"])

        AC_MSG_NOTICE([looking for atls.lib in "$ATL_LIB"])
        if test -f "$ATL_LIB/atls.lib"; then
            HAVE_ATL_LIB="yes"
            AC_MSG_NOTICE([looking for atlthunk.lib in "$ATL_LIB"])
            if test -f "$ATL_LIB/atlthunk.lib"; then
                HAVE_ATLTHUNK="YES"
            else
                HAVE_ATLTHUNK="NO"
            fi
            AC_MSG_NOTICE([found atlthunk.lib in "$ATL_LIB"? "$HAVE_ATLTHUNK"])
        else
            HAVE_ATL_LIB="no"
        fi
        AC_MSG_NOTICE([found atls.lib in "$ATL_LIB"? "$HAVE_ATL_LIB"])

        dnl TODO check also MFC libraries, they seem to have diferent names
        dnl mfc42.lib mfc90.lib
        if test -d "$MFC_LIB"; then
            HAVE_MFC_LIB="yes"
        else
            HAVE_MFC_LIB="no"
        fi

        if test "$HAVE_ATL_H" = "no" -o "$HAVE_MFC_H" = "no" -o "$HAVE_ATL_LIB" = "no" -o "$HAVE_MFC_LIB" = "no"; then
            ATL_INCLUDE=
            ATL_LIB=
            MFC_INCLUDE=
            MFC_LIB=
            HAVE_ATL_LIB=
            dnl TODO shouldn't this be an error?
            DISABLE_ACTIVEX="TRUE"
            DISABLE_ATL="TRUE"
            AC_MSG_RESULT([ATL/MFC disabled])
        else
            ATL_INCLUDE=`cygpath -dm "$ATL_INCLUDE"`
            ATL_LIB=`cygpath -dm "$ATL_LIB"`
            MFC_INCLUDE=`cygpath -dm "$MFC_INCLUDE"`
            MFC_LIB=`cygpath -dm "$MFC_LIB"`
            AC_MSG_RESULT([ATL/MFC enabled])
        fi
    fi
fi
AC_SUBST(ATL_INCLUDE)
AC_SUBST(ATL_LIB)
AC_SUBST(HAVE_ATLTHUNK)
AC_SUBST(MFC_INCLUDE)
AC_SUBST(MFC_LIB)


dnl ============================================
dnl Check for Nullsoft Scriptable Install System
dnl ============================================
NSIS_PATH=""
if test "$_os" = "WINNT" ; then
    AC_MSG_CHECKING([for NSIS])
    AC_PATH_PROG(NSIS_PATH, nsis.exe)
    if test -n "$NSIS_PATH"; then
        NSIS_PATH=`dirname "$NSIS_PATH"`
    fi
    if test -n "$with_nsis_path"; then
        with_nsis_path=`cygpath -u "$with_nsis_path"`
    fi
    if test -e "$with_nsis_path/nsis.exe"; then
        NSIS_PATH="$with_nsis_path"
    fi
    nsistest=`./oowintool --nsis-dir`;
    if test -x "$nsistest/nsis.exe"; then
        NSIS_PATH="$nsistest"
    fi
    if test -z "$NSIS_PATH"; then
        AC_MSG_WARN([NSIS not found, no self contained installer will be build.])
        echo "NSIS not found, no self contained installer will be build." >> warn
    else
        NSIS_PATH=`cygpath -d "$NSIS_PATH"`
        NSIS_PATH=`cygpath -u "$NSIS_PATH"`
        AC_MSG_RESULT([found ($NSIS_PATH)])
    fi
fi
AC_SUBST(NSIS_PATH)

dnl ***************************************
dnl testing bison and flex exist
dnl ***************************************
AC_PATH_PROG(BISON, bison)
if test -z "$BISON"; then
   AC_MSG_ERROR([no bison found in \$PATH, install bison])
else
   AC_MSG_CHECKING([the bison version])
   _bison_version=`$BISON --version | grep GNU | $SED -e 's@^[[^0-9]]*@@' -e 's@ .*@@' -e 's@,.*@@'`;
    _bison_longver=`echo $_bison_version | $AWK -F. '{ print \$1*1000+\$2}'`
    # Accept newer than 1.875 or older(equal) than 1.75
    if test "$_bison_longver" -ge 1875 -o "$_bison_longver" -le 1075; then
       if test "$_bison_version" = "1.875" ; then
          AC_MSG_WARN([suspect ($BISON $_bison_version)])
          echo "Suspect ($BISON $_bison_version) suggest upgrade" >> warn
       else
          AC_MSG_RESULT([checked ($BISON $_bison_version)])
       fi
    else
       AC_MSG_ERROR([failed ($BISON $_bison_version need 1.875+ (or 1.75 and older))])
    fi
fi
AC_PATH_PROG(FLEX, flex)
if test -z "$FLEX"; then
   AC_MSG_ERROR([no flex found in \$PATH, install flex])
fi
dnl ***************************************
dnl testing that patch exists
dnl ***************************************
AC_PATH_PROG(PATCH, patch)
if test -z "$PATCH"; then
   AC_MSG_ERROR([\"patch\" not found in \$PATH, install the development tool named\"patch"\])
fi

dnl On Solaris, FreeBSD or MacOS X, check if --with-gnu-patch was used
if test "$_os" = "SunOS" -o "$_os" = "FreeBSD" -o "$_os" = "Darwin"; then
   if test -z "$with_gnu_patch"; then
      GNUPATCH=$PATCH
   else
      if test -x "$with_gnu_patch"; then
	      GNUPATCH=$with_gnu_patch
      else
         AC_MSG_ERROR([--with-gnu-patch did not point to an executable])
      fi
   fi

   AC_MSG_CHECKING([whether $GNUPATCH is GNU patch])
   if $GNUPATCH --version | grep "Free Software Foundation" >/dev/null 2>/dev/null; then
	   AC_MSG_RESULT([yes])
   else
      AC_MSG_ERROR([no, GNU patch needed. install or specify with --with-gnu-patch=/path/to/it])
   fi
fi

dnl We also need to check for --with-gnu-cp

if test -z "$with_gnu_cp"; then
   # check the place where the GNU stuff is hidden on Solaris...
   if test -x /usr/gnu/bin/cp; then
      GNUCP=/usr/gnu/bin/cp
   else
      AC_PATH_PROGS(GNUCP, gnucp cp)
   fi
   if test -z $GNUCP; then
      AC_MSG_ERROR([Neither gnucp nor cp found. Install GNU cp and/or specify --with-gnu-cp=/path/to/it])
   fi
else
   if test -x "$with_gnu_cp"; then
      GNUCP=$with_gnu_cp
   else
      AC_MSG_ERROR([--with-gnu-cp did not point to an executable])
   fi
fi

AC_MSG_CHECKING([whether $GNUCP is GNU cp from coreutils with preserve= support])
if $GNUCP --version 2>/dev/null | grep "coreutils" >/dev/null 2>/dev/null; then
   AC_MSG_RESULT([yes])
else
   AC_MSG_RESULT([no])
   GNUCP=''
fi

if test -z "$GNUCP"; then
   if test "$_os" = "SunOS"; then
      AC_MSG_ERROR([no, GNU cp from coreutils is needed. install or specify with --with-gnu-cp=/path/to/it])
   else
      AC_MSG_RESULT([no GNU cp from coreutils found - using the system's cp command])
   fi
fi

AC_SUBST(GNUPATCH)
AC_SUBST(GNUCP)

dnl ***************************************
dnl testing bash tools path on Windows
dnl ***************************************
if test "$_os" = "WINNT"; then
    CYGWIN_PATH=""
    AC_PATH_PROG(CYGWIN_PATH, bash)
    CYGWIN_PATH=`dirname "$CYGWIN_PATH"`
fi
if test -z "$CYGWIN_PATH"; then
   CYGWIN_PATH="NO_CYGWIN"
fi
AC_SUBST(CYGWIN_PATH)

dnl ***************************************
dnl testing ml.exe assembler path
dnl ***************************************
if test "$_os" = "WINNT" -a "$WITH_MINGWIN" != "yes"; then
  AC_MSG_CHECKING([ml.exe assembler path])
  if test -n "$with_asm_home"; then
    with_asm_home=`cygpath -u "$with_asm_home"`
  fi
  if test ! -x "$with_asm_home/ml.exe"; then
    AC_PATH_PROG(ML_EXE, ml.exe)
    if test -z "$ML_EXE"; then
      if test -x "$with_cl_home/bin/ml.exe"; then
        with_asm_home=$with_cl_home/bin
        AC_MSG_RESULT([found ($with_asm_home)])
      else
        AC_MSG_ERROR([Configure did not find ml.exe assembler.])
      fi
    else
       with_asm_home="ASM_IN_PATH"
    fi
  fi
  AC_MSG_RESULT([$ASM_HOME])
else
  with_asm_home="NO_ASM_HOME"
fi
ASM_HOME="$with_asm_home"
AC_SUBST(ASM_HOME)
 
dnl ===================================================================
dnl testing handle deprecated unzip switch
dnl ===================================================================
if test -z "$with_zip_home"; then
	with_zip_home="$with_unzip_home"
fi
dnl ===================================================================
dnl Zip will be found where you tell me to find it
dnl ===================================================================
if test -n "$with_zip_home" ; then
    if test "$_os" = "WINNT"; then
        with_zip_home=`cygpath -u "$with_zip_home"`
    fi
    ZIP="$with_zip_home/zip"
    UNZIP="$with_zip_home/unzip"
    ZIP_HOME="$with_zip_home"
else
    AC_PATH_PROG(ZIP, zip)
    AC_PATH_PROG(UNZIP, unzip)
    ZIP_HOME=`dirname "$ZIP"`
fi
dnl ===================================================================
dnl Zip must be available or else it is an error, all platforms
dnl ===================================================================
if test -z "$ZIP" -o -z "$UNZIP"; then
    AC_MSG_ERROR([Zip/Unzip are required to build, please install or use --with-zip-home],,)
fi
if "$ZIP" -FS < /dev/null 2>&1 | $EGREP "no such option: S" > /dev/null; then
    AC_MSG_ERROR([Zip version 3.0 or newer is required to build, please install or use --with-zip-home],,)
fi

dnl ===================================================================
dnl Zip must be a specific type for different build types.
dnl ===================================================================
if test "$_os" = "WINNT"; then
    if test -n "`$ZIP -h | grep -i WinNT`" ; then
AC_MSG_ERROR([$ZIP found in the path is not the required cygwin version of Info-ZIPs zip.exe.])
    fi
fi
AC_SUBST(ZIP_HOME)

dnl ===================================================================
dnl Windows builds need dbghelp.dll in external/dbghelp/
dnl ===================================================================
if test "$_os" = "WINNT"; then
   AC_MSG_CHECKING([for dbghelp.dll])
   if test -x ./external/dbghelp/dbghelp.dll; then
      AC_MSG_RESULT([found and executable])
   else
      AC_MSG_ERROR([dbghelp.dll is missing in external/dbghelp/.
Get it from the Microsoft site and put it into external/dbghelp.
(Note: Microsoft seems to enjoy changing the exact location of this file. You
may have to search Microsoft's website.) Last time it was seen at:
<http://www.microsoft.com/downloads/release.asp?releaseid=30682>.])
   fi
fi

dnl ===================================================================
dnl Windows builds need vcredist_x*.exe in external/vcredist/
dnl ===================================================================
WITH_VC_REDIST=""

if test "$_os" = "WINNT"; then
   AC_MSG_CHECKING([for vcredist_x86.exe])
   if test -x ./external/vcredist/vcredist_x86.exe; then
      AC_MSG_RESULT([found and executable])
   else
      AC_MSG_ERROR([ vcredist_x86.exe is missing in external/vcredist/.
Get it from the Microsoft site and put it into external/vcredist. You can try 
to download it from http://www.microsoft.com/download/en/search.aspx?q=redistributable%20package.])
   fi
   AC_MSG_CHECKING([for vcredist_x64.exe])
   if test -x ./external/vcredist/vcredist_x64.exe; then
      AC_MSG_RESULT([found and executable])
   else
      AC_MSG_ERROR([ vcredist_x64.exe is missing in external/vcredist/.
Get it from the Microsoft site and put it into external/vcredist. You can try 
to download it from http://www.microsoft.com/download/en/search.aspx?q=redistributable%20package.])
   fi
   WITH_VC_REDIST=YES
   AC_SUBST(WITH_VC_REDIST)
fi

dnl ===================================================================
dnl Windows builds - use oowintool to copy CRT dlls and manifest
dnl ===================================================================
if test "$_os" = "WINNT" -a "$WITH_MINGWIN" != "yes"; then
       if ./oowintool --msvc-copy-dlls ./external/msvcp ; then
          :
       else
          AC_MSG_ERROR([oowintool failed to copy CRT])
       fi
fi

dnl ===================================================================
dnl Windows builds need gdiplus.dll in external/gdiplus/
dnl ===================================================================
if test "$_os" = "WINNT"; then
   AC_MSG_CHECKING([for gdiplus.dll])
   if test -x ./external/gdiplus/gdiplus.dll; then
      AC_MSG_RESULT([found and executable])
   else
      AC_MSG_ERROR([gdiplus.dll is missing in external/gdiplus/.
Get it from the Microsoft site and put it into external/gdiplus.
You may have to search Microsoft's website. Last time it was seen at:
<http://www.microsoft.com/downloads/details.aspx?familyid=6A63AB9C-DF12-4D41-933C-BE590FEAA05A&displaylang=en>.])
   fi
fi

dnl ===================================================================
dnl Windows builds need msvcr100.dll in external/msvcp100/
dnl ===================================================================
if test "$_os" = "WINNT"; then
   AC_MSG_CHECKING([for msvcr100.dll])
   if test -x ./external/msvcp100/msvcr100.dll; then
      AC_MSG_RESULT([found and executable])
   else
      AC_MSG_ERROR([msvcr100.dll is missing in external/msvcp100/.
Get it from the Microsoft Visual C++ 2010 Redistributable Package (x86),
from the Microsoft site and put it into external/msvcp100.
You may have to search Microsoft's website. Last time it was seen at:
<http://www.microsoft.com/en-us/download/search.aspx?q=Microsoft+Visual+C%2b%2b+2010+Redistributable>.])
   fi
fi

dnl ===================================================================
dnl Test which vclplugs have to be built.
dnl ===================================================================
AC_MSG_CHECKING([which VCLplugs shall be built])
ENABLE_GTK=""
if test "x$enable_gtk" = "xyes"; then
    ENABLE_GTK="TRUE"
    R="gtk"
fi
AC_SUBST(ENABLE_GTK)

ENABLE_KDE=""
if test "x$enable_kde" = "xyes"; then
    ENABLE_KDE="TRUE"
    R="$R kde"
fi
AC_SUBST(ENABLE_KDE)

ENABLE_KDE4=""
if test "x$enable_kde4" = "xyes"; then
    ENABLE_KDE4="TRUE"
    R="$R kde4"
fi
AC_SUBST(ENABLE_KDE4)

if test -z "$R"; then
	AC_MSG_RESULT([none])
else
	AC_MSG_RESULT([$R])
fi

dnl ===================================================================
dnl GCONF check
dnl ===================================================================

ENABLE_GCONF=""
AC_MSG_CHECKING([whether to enable GConf support])
if test "$_os" != "WINNT" -a "$_os" != "Darwin" -a "$_os" != "OS2" -a "$enable_gconf" = "yes"; then
    ENABLE_GCONF="TRUE"
    AC_MSG_RESULT([yes])
    PKG_CHECK_MODULES( GCONF, gconf-2.0 )
else
    AC_MSG_RESULT([no])
fi
AC_SUBST(ENABLE_GCONF)

dnl ===================================================================
dnl Gnome VFS check
dnl ===================================================================

ENABLE_GNOMEVFS=""
AC_MSG_CHECKING([whether to enable GNOME VFS support])
if test "$_os" != "WINNT" -a "$_os" != "Darwin" -a "$enable_gnome_vfs" = "yes"; then
    ENABLE_GNOMEVFS="TRUE"
    AC_MSG_RESULT([yes])
    PKG_CHECK_MODULES( GNOMEVFS, gnome-vfs-2.0 >= 2.6.0 )
    if test "$ENABLE_GCONF" != "TRUE"; then
        PKG_CHECK_MODULES( GCONF, gconf-2.0 )
    fi
else
    AC_MSG_RESULT([no])
fi
AC_SUBST(ENABLE_GNOMEVFS)

dnl ===================================================================
dnl Check whether the gtk 2.0 libraries are available.
dnl ===================================================================

GTK_CFLAGS=""
GTK_LIBS=""
ENABLE_SYSTRAY_GTK=""
ENABLE_DBUS=""
if test  "$test_gtk" = "yes"; then

   if test "$ENABLE_GTK" = "TRUE" ; then
      PKG_CHECK_MODULES(GTK, gtk+-2.0 >= 2.4 gdk-pixbuf-xlib-2.0 >= 2.2 ,,AC_MSG_ERROR([requirements to build the gtk-plugin not met. Use --disable-gtk or install the missing packages]))
      PKG_CHECK_MODULES(GTHREAD, gthread-2.0,,AC_MSG_ERROR([requirements to build the gtk-plugin not met. Use --disable-gtk or install the missing packages]))
      BUILD_TYPE="$BUILD_TYPE GTK"

      if test "x$enable_systray" = "xyes"; then
         PKG_CHECK_MODULES(GTK_2_10,gtk+-2.0 >= 2.10.0,
                           [ENABLE_SYSTRAY_GTK="TRUE"
                            BUILD_TYPE="$BUILD_TYPE SYSTRAY_GTK"],
                           [ENABLE_SYSTRAY_GTK=""])
      fi

      AC_MSG_CHECKING([whether to enable DBUS support])
      if test "$_os" != "WINNT" -a "$_os" != "Darwin" -a "$enable_dbus" = "yes"; then
          ENABLE_DBUS="TRUE"
          AC_MSG_RESULT([yes])
          PKG_CHECK_MODULES( DBUS, dbus-glib-1 >= 0.70 )
      else
          AC_MSG_RESULT([no])
      fi

      AC_MSG_CHECKING([whether to enable GIO support])
      if test "$_os" != "WINNT" -a "$_os" != "Darwin" -a "$enable_gio" = "yes"; then
          if test "$ENABLE_GNOMEVFS" = "TRUE" ; then
             AC_MSG_ERROR([please use --enable-gio only together with --disable-gnome-vfs.])
          fi
          ENABLE_GIO="TRUE"
          AC_MSG_RESULT([yes])
          PKG_CHECK_MODULES( GIO, gio-2.0 )
      else
          AC_MSG_RESULT([no])
      fi

   fi

fi
AC_SUBST(ENABLE_GIO)
AC_SUBST(ENABLE_DBUS)
AC_SUBST(ENABLE_SYSTRAY_GTK)
AC_SUBST(GTK_CFLAGS)
AC_SUBST(GTK_LIBS)
AC_SUBST(GTHREAD_CFLAGS)
AC_SUBST(GTHREAD_LIBS)

dnl ===================================================================
dnl Check whether the GStreamer libraries are available.
dnl ===================================================================

GSTREAMER_CFLAGS=""
GSTREAMER_LIBS=""
ENABLE_GSTREAMER=""

if test "$test_gstreamer" = "yes"; then
    AC_MSG_CHECKING([whether to build the GStreamer media backend])
    if test "x$enable_gstreamer" != "xno" ; then
        PKG_CHECK_MODULES( GSTREAMER, gtk+-2.0 >= 2.4 gthread-2.0 gstreamer-0.10 gstreamer-interfaces-0.10 ,,AC_MSG_ERROR([requirements to build the GStreamer media backend not met. Do not use --enable-gstreamer or install the missing packages]))
        ENABLE_GSTREAMER="TRUE"
        AC_MSG_RESULT([yes])
    else
        AC_MSG_RESULT([no])
    fi
fi
AC_SUBST(ENABLE_GSTREAMER)
AC_SUBST(GSTREAMER_CFLAGS)
AC_SUBST(GSTREAMER_LIBS)

dnl ===================================================================
dnl Check the ARM target
dnl ===================================================================

if test "$_os" = "Linux" && echo "$build_cpu" | $GREP -q arm; then
    # default value
    ARM_TARGET=ARMV4T
    AC_MSG_CHECKING([which ARM processor optimization to use])
    if test "$with_arm_target" -lt "6"; then
	ARM_TARGET=ARMV4T
    elif test "$with_arm_target" = "6"; then
	ARM_TARGET=ARMV6
    elif test "$with_arm_target" -gt "6"; then
	ARM_TARGET=ARMV7
    fi
    AC_MSG_RESULT([$ARM_TARGET])
    AC_SUBST(ARM_TARGET)
fi

dnl ===================================================================
dnl Check whether the Cairo libraries are available.
dnl ===================================================================

ENABLE_CAIRO=""
BUILD_PIXMAN=""
SYSTEM_CAIRO=""

if test  "$test_cairo" = "yes"; then

    AC_MSG_CHECKING([whether to use cairo])
    if test "x$enable_cairo" != "xno" ; then
        ENABLE_CAIRO="TRUE"
	AC_MSG_RESULT([yes])
        AC_MSG_CHECKING([which cairo to use])
        if test -n "$with_system_cairo" -o -n "$with_system_libs" && \
           test "$with_system_cairo" != "no"; then
           AC_MSG_RESULT([external])
           SYSTEM_CAIRO=YES
	   
           PKG_CHECK_MODULES( CAIRO, cairo >= 1.0.2 )
	   if test "$_os" != "WINNT" -a "$_os" != "Darwin" -a "$ENABLE_FONTCONFIG" != "TRUE" ; then
	      AC_MSG_ERROR([Cairo library requires fontconfig.])
	   fi
           if test "$with_system_xrender_headers" = "yes"; then
              AC_MSG_CHECKING([whether Xrender.h defines PictStandardA8])
              AC_TRY_RUN([
#include <X11/extensions/Xrender.h>

int main(int argc, char **argv) {
#ifdef PictStandardA8
      return 0;
#else
      return 1;
#endif
}
               ], [AC_MSG_RESULT([yes])], [AC_MSG_ERROR([no, X headers too old.])])
           fi
        else
           BUILD_TYPE="$BUILD_TYPE CAIRO"
	   dnl === compiler fails on pixman with 64bit architectures...===
	   if test "$build_cpu" != "x86_64"; then
	      BUILD_PIXMAN=YES
	   fi
           AC_MSG_RESULT([internal])	   
        fi
    else
	   AC_MSG_RESULT([no])
    fi
fi

AC_SUBST(ENABLE_CAIRO)
AC_SUBST(BUILD_PIXMAN)
AC_SUBST(SYSTEM_CAIRO)
AC_SUBST(CAIRO_CFLAGS)
AC_SUBST(CAIRO_LIBS)

ENABLE_CAIRO_CANVAS="FALSE"
if test "$enable_cairo_canvas" = "yes" -a "$ENABLE_CAIRO" = "TRUE" ; then
   ENABLE_CAIRO_CANVAS="TRUE"
fi
AC_SUBST(ENABLE_CAIRO_CANVAS)

dnl ===================================================================
dnl Check whether the OpenGL libraries are available
dnl ===================================================================

AC_MSG_CHECKING([whether to build the OpenGL Transitions component])
ENABLE_OPENGL=

if test "x$enable_opengl" != "xno" ; then
   AC_MSG_RESULT([yes])
   AC_CHECK_HEADER(GL/gl.h, [],
                   [AC_MSG_ERROR([OpenGL headers not found])], [])
   AC_CHECK_LIB(GL, main, [],
     [AC_MSG_ERROR(libGL not installed or functional)], [])
   AC_CHECK_LIB(GLU, main, [],
     [AC_MSG_ERROR(libGLU not installed or functional)], [])
   ENABLE_OPENGL=TRUE
else
   AC_MSG_RESULT([no])
fi

AC_SUBST(ENABLE_OPENGL)

AC_MSG_CHECKING([whether to build the Presentation Minimizer extension])
if test -n "$enable_minimizer" -a "$enable_minimizer" != "no"; then
   AC_MSG_RESULT([yes])
   ENABLE_MINIMIZER=YES
else
   AC_MSG_RESULT([no])
   ENABLE_MINIMIZER=NO
fi
AC_SUBST(ENABLE_MINIMIZER)

AC_MSG_CHECKING([whether to build the Presenter Screen extension])
if test -n "$enable_presenter_console" -a "$enable_presenter_screen" != "no"; then
   AC_MSG_RESULT([yes])
   ENABLE_PRESENTER_SCREEN=YES
else
   AC_MSG_RESULT([no])
   ENABLE_PRESENTER_SCREEN=NO
fi
AC_SUBST(ENABLE_PRESENTER_SCREEN)

AC_MSG_CHECKING([whether to build the PDF Import extension])
if test -n "$enable_pdfimport" -a "$enable_pdfimport" != "no"; then
  AC_MSG_RESULT([yes])
  ENABLE_PDFIMPORT=YES

  dnl ===================================================================
  dnl Check for system poppler
  dnl ===================================================================
  AC_MSG_CHECKING([whether to use system pdf backend])
  if test -n "$with_system_poppler" -o -n "$with_system_libs" && \
       test "$with_system_poppler" != "no"; then
      AC_MSG_RESULT([external])
      SYSTEM_POPPLER=YES
      PKG_CHECK_MODULES( POPPLER, poppler >= 0.8.0 )
  else
      AC_MSG_RESULT([no])
      SYSTEM_POPPLER=NO
      ENABLE_PDFIMPORT=NO
  fi
else
   AC_MSG_RESULT([no])
   ENABLE_PDFIMPORT=NO
fi
AC_SUBST(ENABLE_PDFIMPORT)
AC_SUBST(SYSTEM_POPPLER)
AC_SUBST(POPPLER_CFLAGS)
AC_SUBST(POPPLER_LIBS)

if test "$ENABLE_PRESENTER_SCREEN" = "YES" -o "$ENABLE_MINIMIZER" = "YES" -o "$ENABLE_PDFIMPORT" = "YES"; then
  AC_MSG_CHECKING([for sdext module])
  if test -d ./sdext; then
   AC_MSG_RESULT([OK])
  else
   AC_MSG_ERROR([not existing. get it (did you get the -extensions tarball?)])
  fi
  BUILD_TYPE="$BUILD_TYPE SDEXT"
fi

AC_MSG_CHECKING([whether to build the Wiki Publisher extension])
if test -n "$enable_wiki_publisher" -a "$enable_wiki_publisher" != "no" && test  "$WITH_JAVA" != "no"; then
  AC_MSG_RESULT([yes])
  AC_MSG_CHECKING([for swext module])
  if test -d ./swext; then
   AC_MSG_RESULT([OK])
  else
   AC_MSG_ERROR([not existing. get it (did you get the -extensions tarball?)])
  fi
  ENABLE_MEDIAWIKI=YES
  BUILD_TYPE="$BUILD_TYPE SWEXT"
else
  AC_MSG_RESULT([no])
  ENABLE_MEDIAWIKI=NO
fi
AC_SUBST(ENABLE_MEDIAWIKI)

if test "$ENABLE_MEDIAWIKI" = "YES"; then
  AC_MSG_CHECKING([which Servlet API Jar to use])
  if test -n "$with_system_servlet_api"; then
    AC_MSG_RESULT([external])
    SYSTEM_SERVLETAPI=YES
      if test -z "$SERVLETAPI_JAR"; then
	SERVLETAPI_JAR=/usr/share/java/servlet-api.jar
      fi
      AC_CHECK_FILE($SERVLETAPI_JAR, [],
             [AC_MSG_ERROR(servlet-api.jar not found.)], [])
  else
    AC_MSG_RESULT([internal])
    SYSTEM_SERVLETAPI=NO
    BUILD_TYPE="$BUILD_TYPE TOMCAT"
  fi
fi
AC_SUBST(SYSTEM_SERVLETAPI)
AC_SUBST(SERVLETAPI_JAR)

AC_MSG_CHECKING([whether to build the Report Builder extension])
if test -n "$enable_report_builder" -a "$enable_report_builder" != "no" && test "$WITH_JAVA" != "no"; then
  AC_MSG_RESULT([yes])
  ENABLE_REPORTBUILDER=YES
  SYSTEM_JFREEREPORT=YES
  AC_MSG_CHECKING([for reportbuilder module])
  if test -d ./reportbuilder; then
    AC_MSG_RESULT([OK])
  else
    AC_MSG_ERROR([not existing. get it (did you get the -extensions tarball?)])
  fi
  AC_MSG_CHECKING([which jfreereport libs to use (for Report Builder extension)])
  AC_MSG_RESULT([external])
  if test -z $SAC_JAR; then
         SAC_JAR=/usr/share/java/sac.jar
  fi
  AC_CHECK_FILE($SAC_JAR, [],
         [AC_MSG_ERROR(sac.jar not found.)], [])

  if test -z $LIBXML_JAR; then
    AC_CHECK_FILE(/usr/share/java/libxml-1.0.0.jar, 
      [ LIBXML_JAR=/usr/share/java/libxml-1.0.0.jar ],
      [
        AC_CHECK_FILE(/usr/share/java/libxml.jar, 
          [ LIBXML_JAR=/usr/share/java/libxml.jar ],
          [AC_MSG_ERROR(libxml.jar replacement not found.)]
        )
      ]
    )
  else
    AC_CHECK_FILE($LIBXML_JAR, [],
         [AC_MSG_ERROR(libxml.jar not found.)], [])
  fi

  if test -z $FLUTE_JAR; then
    AC_CHECK_FILE(/usr/share/java/flute-1.3.0.jar, 
      [ FLUTE_JAR=/usr/share/java/flute-1.3.0.jar ],
      [
        AC_CHECK_FILE(/usr/share/java/flute.jar, 
          [ FLUTE_JAR=/usr/share/java/flute.jar ],
          [ AC_MSG_ERROR(flute-1.3.0.jar replacement not found.)]
        )
      ]
    )
  else
    AC_CHECK_FILE($FLUTE_JAR, [],
         [AC_MSG_ERROR(flute-1.3.0.jar not found.)], [])
  fi

  if test -z $JFREEREPORT_JAR; then
    AC_CHECK_FILE(/usr/share/java/flow-engine-0.9.2.jar, 
      [ JFREEREPORT_JAR=/usr/share/java/flow-engine-0.9.2.jar ],
      [
        AC_CHECK_FILE(/usr/share/java/flow-engine.jar, 
          [ JFREEREPORT_JAR=/usr/share/java/flow-engine.jar ],
          [AC_MSG_ERROR(jfreereport.jar replacement not found.)]
        )
      ]
    )
  else
    AC_CHECK_FILE($JFREEREPORT_JAR, [],
         [AC_MSG_ERROR(jfreereport.jar not found.)], [])
  fi

  if test -z $LIBLAYOUT_JAR; then
    AC_CHECK_FILE(/usr/share/java/liblayout-0.2.9.jar, 
      [ LIBLAYOUT_JAR=/usr/share/java/liblayout-0.2.9.jar ],
      [
        AC_CHECK_FILE(/usr/share/java/liblayout.jar, 
          [ LIBLAYOUT_JAR=/usr/share/java/liblayout.jar ],
          [AC_MSG_ERROR(liblayout.jar replacement not found.)]
        )
      ]
    )
  else
    AC_CHECK_FILE($LIBLAYOUT_JAR, [],
         [AC_MSG_ERROR(liblayout.jar not found.)], [])
  fi

  if test -z $LIBLOADER_JAR; then
    AC_CHECK_FILE(/usr/share/java/libloader-1.0.0.jar, 
      [ LIBLOADER_JAR=/usr/share/java/libloader-1.0.0.jar ],
      [
        AC_CHECK_FILE(/usr/share/java/libloader.jar, 
          [ LIBLOADER_JAR=/usr/share/java/libloader.jar ],
          [AC_MSG_ERROR(libloader.jar replacement not found.)]
        )
      ]
    )
  else
    AC_CHECK_FILE($LIBLOADER_JAR, [],
         [AC_MSG_ERROR(libloader.jar not found.)], [])
  fi

  if test -z $LIBFORMULA_JAR; then
    AC_CHECK_FILE(/usr/share/java/libformula-0.2.0.jar, 
      [ LIBFORMULA_JAR=/usr/share/java/libformula-0.2.0.jar ],
      [
        AC_CHECK_FILE(/usr/share/java/libformula.jar, 
          [ LIBFORMULA_JAR=/usr/share/java/libformula.jar ],
          [AC_MSG_ERROR(libformula.jar replacement not found.)]
        )
      ]
    )
  else
    AC_CHECK_FILE($LIBFORMULA_JAR, [],
         [AC_MSG_ERROR(libformula.jar not found.)], [])
  fi

  if test -z $LIBREPOSITORY_JAR; then
    AC_CHECK_FILE(/usr/share/java/librepository-1.0.0.jar, 
      [ LIBREPOSITORY_JAR=/usr/share/java/librepository-1.0.0.jar ],
      [
        AC_CHECK_FILE(/usr/share/java/librepository.jar, 
          [ LIBREPOSITORY_JAR=/usr/share/java/librepository.jar ],
          [AC_MSG_ERROR(librepository.jar replacement not found.)]
        )
      ]
    )
  else
    AC_CHECK_FILE($LIBREPOSITORY_JAR, [],
         [AC_MSG_ERROR(librepository.jar not found.)], [])
  fi

  if test -z $LIBFONTS_JAR; then
    AC_CHECK_FILE(/usr/share/java/libfonts-1.0.0.jar, 
      [ LIBFONTS_JAR=/usr/share/java/libfonts-1.0.0.jar ],
      [
        AC_CHECK_FILE(/usr/share/java/libfonts.jar, 
          [ LIBFONTS_JAR=/usr/share/java/libfonts.jar ],
          [AC_MSG_ERROR(libfonts.jar replacement not found.)]
        )
      ]
    )
  else
    AC_CHECK_FILE($LIBFONTS_JAR, [],
         [AC_MSG_ERROR(libfonts.jar not found.)], [])
  fi

  if test -z $LIBSERIALIZER_JAR; then
    AC_CHECK_FILE(/usr/share/java/libserializer-1.0.0.jar, 
      [ LIBSERIALIZER_JAR=/usr/share/java/libserializer-1.0.0.jar ],
      [
        AC_CHECK_FILE(/usr/share/java/libserializer.jar, 
          [ LIBSERIALIZER_JAR=/usr/share/java/libserializer.jar ],
          [AC_MSG_ERROR(libserializer.jar replacement not found.)]
        )
      ]
    )
  else
    AC_CHECK_FILE($LIBSERIALIZER_JAR, [],
         [AC_MSG_ERROR(libserializer.jar not found.)], [])
  fi


  if test -z $LIBBASE_JAR; then
    AC_CHECK_FILE(/usr/share/java/libbase-1.0.0.jar, 
      [ LIBBASE_JAR=/usr/share/java/libbase-1.0.0.jar ],
      [
        AC_CHECK_FILE(/usr/share/java/libbase.jar, 
          [ LIBBASE_JAR=/usr/share/java/libbase.jar ],
          [AC_MSG_ERROR(libbase.jar replacement not found.)]
        )
      ]
    )
  else
    AC_CHECK_FILE($LIBBASE_JAR, [],
         [AC_MSG_ERROR(libbase.jar not found.)], [])
  fi
  BUILD_TYPE="$BUILD_TYPE REPORTBUILDER"
else
  AC_MSG_RESULT([no])
  ENABLE_REPORTBUILDER=NO
fi
AC_SUBST(ENABLE_REPORTBUILDER)
AC_SUBST(SYSTEM_JFREEREPORT)
AC_SUBST(SAC_JAR)
AC_SUBST(LIBXML_JAR)
AC_SUBST(FLUTE_JAR)
AC_SUBST(JFREEREPORT_JAR)
AC_SUBST(LIBBASE_JAR)
AC_SUBST(LIBLAYOUT_JAR)
AC_SUBST(LIBLOADER_JAR)
AC_SUBST(LIBFORMULA_JAR)
AC_SUBST(LIBREPOSITORY_JAR)
AC_SUBST(LIBFONTS_JAR)
AC_SUBST(LIBSERIALIZER_JAR)

# this has to be here because both the wiki publisher and the SRB use
# commons-logging
if test "$ENABLE_MEDIAWIKI" = "YES" -o "$ENABLE_REPORTBUILDER" = "YES"; then
  AC_MSG_CHECKING([which Apache commons-* libs to use])
  if test "$with_system_apache_commons" = "yes"; then
    SYSTEM_APACHE_COMMONS=YES
    AC_MSG_RESULT([external])
    if test "$ENABLE_MEDIAWIKI" = "YES"; then
      if test -z $COMMONS_CODEC_JAR; then
        AC_CHECK_FILE(/usr/share/java/commons-codec-1.3.jar, 
          [ COMMONS_CODEC_JAR=/usr/share/java/commons-codec-1.3.jar ],
          [
            AC_CHECK_FILE(/usr/share/java/commons-codec.jar, 
              [ COMMONS_CODEC_JAR=/usr/share/java/commons-codec.jar ],
              [AC_MSG_ERROR(commons-codec.jar replacement not found.)]
            )
          ]
        )
      else
        AC_CHECK_FILE($COMMONS_CODEC_JAR, [],
             [AC_MSG_ERROR(commons-codec.jar not found.)], [])
      fi

      if test -z $COMMONS_LANG_JAR; then
        AC_CHECK_FILE(/usr/share/java/commons-lang-2.3.jar, 
          [ COMMONS_LANG_JAR=/usr/share/java/commons-lang-2.3.jar ],
          [
            AC_CHECK_FILE(/usr/share/java/commons-lang.jar, 
              [ COMMONS_LANG_JAR=/usr/share/java/commons-lang.jar ],
              [AC_MSG_ERROR(commons-lang.jar replacement not found.)]
            )
          ]
        )
      else
        AC_CHECK_FILE($COMMONS_LANG_JAR, [],
             [AC_MSG_ERROR(commons-lang.jar not found.)], [])
      fi

      if test -z $COMMONS_HTTPCLIENT_JAR; then
        AC_CHECK_FILE(/usr/share/java/commons-httpclient-3.1.jar, 
          [ COMMONS_HTTPCLIENT_JAR=/usr/share/java/commons-httpclient-3.1.jar ],
          [
            AC_CHECK_FILE(/usr/share/java/commons-httpclient.jar, 
              [ COMMONS_HTTPCLIENT_JAR=/usr/share/java/commons-httpclient.jar ],
              [AC_MSG_ERROR(commons-httpclient.jar replacement not found.)]
            )
          ]
        )
      else
        AC_CHECK_FILE($COMMONS_HTTPCLIENT_JAR, [],
             [AC_MSG_ERROR(commons-httpclient.jar not found.)], [])
      fi
    fi
    if test "$ENABLE_MEDIAWIKI" = "YES" -o "$ENABLE_REPORTBUILDER" = "YES"; then
      if test -z $COMMONS_LOGGING_JAR; then
        AC_CHECK_FILE(/usr/share/java/commons-logging-1.1.1.jar, 
          [ COMMONS_LOGGING_JAR=/usr/share/java/commons-logging-1.1.1.jar ],
          [
            AC_CHECK_FILE(/usr/share/java/commons-logging.jar, 
              [ COMMONS_LOGGING_JAR=/usr/share/java/commons-logging.jar ],
              [AC_MSG_ERROR(commons-logging.jar replacement not found.)]
            )
          ]
        )
      else
        AC_CHECK_FILE($COMMONS_LOGGING_JAR, [],
             [AC_MSG_ERROR(commons-logging.jar not found.)], [])
      fi
    fi
  else
    AC_MSG_RESULT([internal])
    SYSTEM_APACHE_COMMONS=NO
    BUILD_TYPE="$BUILD_TYPE APACHE_COMMONS TOMCAT"
  fi
fi
AC_SUBST(SYSTEM_APACHE_COMMONS)
AC_SUBST(COMMONS_CODEC_JAR)
AC_SUBST(COMMONS_LANG_JAR)
AC_SUBST(COMMONS_HTTPCLIENT_JAR)
AC_SUBST(COMMONS_LOGGING_JAR)

dnl ===================================================================
dnl Check whether the Qt and KDE libraries are available.
dnl ===================================================================

KDE_CFLAGS=""
KDE_LIBS=""
MOC="moc"
if test "$test_kde" = "yes" -a "$ENABLE_KDE" = "TRUE" ; then
    dnl Search paths for Qt and KDE
    if test "$build_cpu" != "x86_64" ; then
        qt_incdirs="$QTINC /usr/local/qt/include /usr/include/qt /usr/include /usr/X11R6/include/X11/qt /usr/X11R6/include/qt /usr/lib/qt3/include /usr/lib/qt/include /usr/share/qt3/include $x_includes"
        qt_libdirs="$QTLIB /usr/local/qt/lib /usr/lib/qt /usr/lib /usr/X11R6/lib/X11/qt /usr/X11R6/lib/qt /usr/lib/qt3/lib /usr/lib/qt/lib /usr/share/qt3/lib $x_libraries"
    else
        qt_incdirs="$QTINC /usr/local/qt/include /usr/include/qt /usr/include /usr/X11R6/include/X11/qt /usr/X11R6/include/qt /usr/lib64/qt3/include /usr/lib64/qt/include /usr/share/qt3/include /usr/lib/qt3/include /usr/lib/qt/include $x_includes"
        qt_libdirs="$QTLIB /usr/local/qt/lib64 /usr/lib64/qt /usr/lib64 /usr/X11R6/lib64/X11/qt /usr/X11R6/lib64/qt /usr/lib64/qt3/lib64 /usr/lib64/qt/lib64 /usr/share/qt3/lib64 /usr/local/qt/lib /usr/lib/qt /usr/lib /usr/X11R6/lib/X11/qt /usr/X11R6/lib/qt /usr/lib/qt3/lib /usr/lib/qt/lib /usr/share/qt3/lib $x_libraries"
    fi
    if test -n "$QTDIR" ; then
        qt_incdirs="$QTDIR/include $qt_incdirs"
        if test "$build_cpu" != "x86_64" ; then
            qt_libdirs="$QTDIR/lib $qt_libdirs"
        else
            qt_libdirs="$QTDIR/lib64 $QTDIR/lib $qt_libdirs"
        fi
    fi
    if test "$build_cpu" != "x86_64" ; then
        kde_incdirs="/usr/lib/kde/include /usr/local/kde/include /usr/local/include /usr/kde/include /usr/include/kde /opt/kde3/include /opt/kde/include $x_includes"
        kde_libdirs="/usr/lib/kde/lib /usr/local/kde/lib /usr/kde/lib /usr/lib/kde /usr/lib/kde3 /usr/X11R6/lib /usr/local/lib /opt/kde3/lib /opt/kde/lib /usr/X11R6/kde/lib /usr/lib $x_libraries"
    else
        kde_incdirs="/usr/lib64/kde/include /usr/lib/kde/include /usr/local/kde/include /usr/local/include /usr/kde/include /usr/include/kde /opt/kde3/include /opt/kde/include $x_includes"
        kde_libdirs="/usr/lib64/kde/lib64 /usr/local/kde/lib64 /usr/kde/lib64 /usr/lib64/kde /usr/lib64/kde3 /usr/X11R6/lib64 /usr/local/lib64 /opt/kde3/lib64 /opt/kde/lib64 /usr/X11R6/kde/lib64 /usr/lib/kde/lib /usr/local/kde/lib /usr/kde/lib /usr/lib/kde /usr/lib/kde3 /usr/lib /usr/X11R6/lib /usr/local/lib /opt/kde3/lib /opt/kde/lib /usr/X11R6/kde/lib /usr/lib64 $x_libraries"
    fi
    if test -n "$KDEDIR" ; then
        kde_incdirs="$KDEDIR/include $kde_incdirs"
        if test "$build_cpu" != "x86_64" ; then
            kde_libdirs="$KDEDIR/lib $kde_libdirs"
        else
            kde_libdirs="$KDEDIR/lib64 $KDEDIR/lib $kde_libdirs"
        fi
    fi

    dnl What to test
    qt_test_include="qstyle.h"
    qt_test_library="libqt-mt.so"
    kde_test_include="ksharedptr.h"
    kde_test_library="libkdeui.so"

    dnl Check for Qt headers
    AC_MSG_CHECKING([for Qt headers])
    qt_incdir="no"
    for kde_check in $qt_incdirs ; do
        if test -r "$kde_check/$qt_test_include" ; then
            qt_incdir="$kde_check"
            break
        fi
    done
    AC_MSG_RESULT([$qt_incdir])
    if test "x$qt_incdir" = "xno" ; then
        AC_MSG_ERROR([Qt headers not found.  Please specify the root of
your Qt installation by exporting QTDIR before running "configure".])
    fi

    dnl Check for Qt libraries
    AC_MSG_CHECKING([for Qt libraries])
    qt_libdir="no"
    for qt_check in $qt_libdirs ; do
        if test -r "$qt_check/$qt_test_library" ; then
            qt_libdir="$qt_check"
            break
        fi
    done
    AC_MSG_RESULT([$qt_libdir])
    if test "x$qt_libdir" = "xno" ; then
        AC_MSG_ERROR([Qt libraries not found.  Please specify the root of
your Qt installation by exporting QTDIR before running "configure".])
    fi

    dnl Check for Meta Object Compiler
    AC_PATH_PROG( MOC, moc, no, [$QTDIR/bin:$PATH] )
    if test "$MOC" = "no" ; then
        AC_MSG_ERROR([Qt Meta Object Compiler not found.  Please specify
the root of your Qt installation by exporting QTDIR before running "configure".])
    fi

    dnl Check for KDE headers
    AC_MSG_CHECKING([for KDE headers])
    kde_incdir="no"
    for kde_check in $kde_incdirs ; do
        if test -r "$kde_check/$kde_test_include" ; then
            kde_incdir="$kde_check"
            break
        fi
    done
    AC_MSG_RESULT([$kde_incdir])
    if test "x$kde_incdir" = "xno" ; then
        AC_MSG_ERROR([KDE headers not found.  Please specify the root of
your KDE installation by exporting KDEDIR before running "configure".])
    fi

    dnl Check for KDE libraries
    AC_MSG_CHECKING([for KDE libraries])
    kde_libdir="no"
    for kde_check in $kde_libdirs ; do
        if test -r "$kde_check/$kde_test_library" ; then
            kde_libdir="$kde_check"
            break
        fi
    done
    AC_MSG_RESULT([$kde_libdir])
    if test "x$kde_libdir" = "xno" ; then
        AC_MSG_ERROR([KDE libraries not found.  Please specify the root of
your KDE installation by exporting KDEDIR before running "configure".])
    fi

    dnl Set the variables
    KDE_CFLAGS="-I$qt_incdir -I$kde_incdir -DQT_CLEAN_NAMESPACE -DQT_THREAD_SUPPORT"
    KDE_LIBS="-L$kde_libdir -L$qt_libdir -lkdeui -lkdecore -lqt-mt"
fi
AC_SUBST(KDE_CFLAGS)
AC_SUBST(KDE_LIBS)
AC_SUBST(MOC)

dnl ===================================================================
dnl KDE4 Integration
dnl ===================================================================

KDE4_CFLAGS=""
KDE4_LIBS=""
MOC4="moc"
if test "$test_kde4" = "yes" -a "$ENABLE_KDE4" = "TRUE" ; then
   qt_incdirs="$QT4INC $QT4DIR /usr/include/qt4 /usr/include $x_includes"
   qt_libdirs="$QT4LIB /usr/lib $x_libraries"
   
   kde_incdirs="/usr/include /usr/include/kde4 $x_includes"
   kde_libdirs="/usr/lib /usr/lib/kde4 /usr/lib/kde4/devel $x_libraries"
   
   if test "$build_cpu" = "x86_64" ; then
      qt_libdirs="$qt_libdirs /usr/lib64/qt4 /usr/lib64/qt /usr/lib64"
      kde_libdirs="$kde_libdirs /usr/lib64 /usr/lib64/kde4 /usr/lib64/kde4/devel"
   fi

   if test -n "$KDE4DIR" ; then
      kde_incdirs="$KDE4DIR/include $kde_incdirs"
      if test "$build_cpu" != "x86_64" ; then
         kde_libdirs="$KDE4DIR/lib $kde_libdirs"
      else
         kde_libdirs="$KDE4DIR/lib64 $KDE4DIR/lib $kde_libdirs"
      fi
   fi

   qt_test_include="Qt/qobject.h"
   qt_test_library="libQtCore.so"
   kde_test_include="ksharedptr.h"
   kde_test_library="libkdeui.so"
   
   AC_MSG_CHECKING([for Qt4 headers])
   qt_header_dir="no"
   for inc_dir in $qt_incdirs ; do
      if test -r "$inc_dir/$qt_test_include" ; then
         qt_header_dir="$inc_dir"
         break
      fi
   done
   
   AC_MSG_RESULT([$qt_header_dir])
   if test "x$qt_header_dir" = "xno" ; then
      AC_MSG_ERROR([Qt4 headers not found.  Please specify the root of your Qt4 installation by exporting QT4DIR before running "configure".])
   fi
   
   AC_MSG_CHECKING([for Qt4 libraries])
   qt_lib_dir="no"
   for lib_dir in $qt_libdirs ; do
      if test -r "$lib_dir/$qt_test_library" ; then
         qt_lib_dir="$lib_dir"
         break
      fi
   done
   
   AC_MSG_RESULT([$qt_lib_dir])
   
   if test "x$qt_lib_dir" = "xno" ; then
      AC_MSG_ERROR([Qt4 libraries not found.  Please specify the root of your Qt4 installation by exporting QT4DIR before running "configure".])
   fi

   dnl Check for Meta Object Compiler
   AC_PATH_PROG( MOCQT4, moc-qt4, no, [$QT4DIR/bin:$PATH] )
   MOC4="$MOCQT4"
   if test "$MOC4" = "no" ; then
      AC_PATH_PROG( MOC4, moc, no, [$PATH:$QT4DIR/bin] )
      if test "$MOC4" = "no" ; then
         AC_MSG_ERROR([Qt Meta Object Compiler not found.  Please specify the root of your Qt installation by exporting QT4DIR before running "configure".])
      fi
   fi

   dnl Check for KDE4 headers
   AC_MSG_CHECKING([for KDE4 headers])
   kde_incdir="no"
   for kde_check in $kde_incdirs ; do
      if test -r "$kde_check/$kde_test_include" ; then
         kde_incdir="$kde_check"
         break
      fi
   done
   AC_MSG_RESULT([$kde_incdir])
   if test "x$kde_incdir" = "xno" ; then
      AC_MSG_ERROR([KDE4 headers not found.  Please specify the root of your KDE4 installation by exporting KDE4DIR before running "configure".])
   fi

   dnl Check for KDE4 libraries
   AC_MSG_CHECKING([for KDE4 libraries])
   kde_libdir="no"
   for kde_check in $kde_libdirs ; do
      if test -r "$kde_check/$kde_test_library" ; then
         kde_libdir="$kde_check"
         break
      fi
   done
   
   AC_MSG_RESULT([$kde_libdir])
   if test "x$kde_libdir" = "xno" ; then
      AC_MSG_ERROR([KDE4 libraries not found.  Please specify the root of your KDE4 installation by exporting KDE4DIR before running "configure".])
   fi

   KDE4_CFLAGS="`pkg-config --cflags QtCore` `pkg-config --cflags QtGui` -I$kde_incdir -DQT_CLEAN_NAMESPACE -DQT_THREAD_SUPPORT"
   KDE4_LIBS="-L$kde_libdir -L$qt_lib_dir -lkdeui -lkdecore -lQtCore -lQtGui"
fi
AC_SUBST(KDE4_CFLAGS)
AC_SUBST(KDE4_LIBS)
AC_SUBST(MOC4)

dnl ===================================================================
dnl Test for the enabling the lockdown pieces
dnl ===================================================================
AC_MSG_CHECKING([whether to enable the lockdown pieces])
ENABLE_LOCKDOWN=""
if test -n "$enable_lockdown" && test "$enable_lockdown" != "no"; then
  ENABLE_LOCKDOWN=YES
  AC_MSG_RESULT([yes])
else
  AC_MSG_RESULT([no])
fi
AC_SUBST(ENABLE_LOCKDOWN)

dnl ===================================================================
dnl Test whether to include Evolution 2 support
dnl ===================================================================
AC_MSG_CHECKING([whether to enable evolution 2 support])
if test "$enable_evolution2" = "yes" -o "$enable_evolution2" = "TRUE"; then
   AC_MSG_RESULT([yes])
   PKG_CHECK_MODULES(GOBJECT, gobject-2.0)
   ENABLE_EVOAB2="TRUE"
else
   ENABLE_EVOAB2=""
   AC_MSG_RESULT([no])
fi
AC_SUBST(ENABLE_EVOAB2)
AC_SUBST(GOBJECT_CFLAGS)
AC_SUBST(GOBJECT_LIBS) 

dnl ===================================================================
dnl Test whether to include KDE AB support
dnl ===================================================================
AC_MSG_CHECKING([whether to enable KDE address book support])
if test "$enable_kdeab" = "yes" && test "$enable_kde" = "yes"; then
   AC_MSG_RESULT([yes])
   AC_LANG_PUSH([C++])
   save_CXXFLAGS=$CXXFLAGS
   CXXFLAGS="$CXXFLAGS $KDE_CFLAGS"
   AC_MSG_CHECKING([whether KDE is between 3.2 and 3.6])
       AC_TRY_RUN([
#include <kdeversion.h>

int main(int argc, char **argv) {
       if (KDE_VERSION_MAJOR == 3 && 2 <= KDE_VERSION_MINOR && KDE_VERSION_MINOR <= 6) return 0;
       else return 1;
}
       ], [AC_MSG_RESULT([yes])], [AC_MSG_ERROR([KDE version too old or too recent, please use another version of KDE or disable KDE address book support])])
   CXXFLAGS=$save_CXXFLAGS
   AC_LANG_POP([C++])
   ENABLE_KAB=TRUE
else
   AC_MSG_RESULT([no])
   ENABLE_KAB=
fi
AC_SUBST(ENABLE_KAB)

dnl ===================================================================
dnl Test whether to include MathMLDTD
dnl ===================================================================
AC_MSG_CHECKING([whether to include MathMLDTD])
if test -n "$enable_mathmldtd"; then
  if test "$enable_mathmldtd" = "no"; then
    AC_MSG_RESULT([no])
    SCPDEFS="$SCPDEFS -DWITHOUT_MATHMLDTD"
  else
    AC_MSG_RESULT([yes])
    BUILD_TYPE="$BUILD_TYPE MATHMLDTD"
  fi
else
  AC_MSG_RESULT([no])
  SCPDEFS="$SCPDEFS -DWITHOUT_MATHMLDTD"
fi

dnl ===================================================================
dnl Test whether to include category-B fonts
dnl ===================================================================
WITH_CATB_FONTS=
AC_MSG_CHECKING([whether to include category B fonts])
if test "x$enable_category_b_fonts" = "xyes" && test "x$with_fonts" != "xno"; then
   AC_MSG_RESULT([yes])
   BUILD_TYPE="$BUILD_TYPE CATB_FONTS"
   WITH_CATB_FONTS=YES
   SCPDEFS="$SCPDEFS -DWITH_CATB_FONTS"
else
   AC_MSG_RESULT([no])
   WITH_CATB_FONTS=NO
fi

dnl ===================================================================
dnl Test whether to include category-A fonts
dnl ===================================================================
WITH_CATA_FONTS=
AC_MSG_CHECKING([whether to include category A fonts])
if test "x$with_fonts" != "xno" ; then
  AC_MSG_RESULT([yes])
  WITH_CATA_FONTS=YES
  SCPDEFS="$SCPDEFS -DWITH_CATA_FONTS"
else
  AC_MSG_RESULT([no])
  WITH_CATA_FONTS=NO
  WITH_CATB_FONTS=NO
fi

WITH_FONTS=NO
AC_MSG_CHECKING([whether any fonts are included])
if test "x$WITH_CATA_FONTS" = "xYES" -o "x$WITH_CATB_FONTS" = "xYES"; then
  BUILD_TYPE="$BUILD_TYPE MORE_FONTS"
  WITH_FONTS=YES
  AC_MSG_RESULT([yes])
else
  AC_MSG_RESULT([no])
fi

AC_SUBST(WITH_CATA_FONTS)
AC_SUBST(WITH_CATB_FONTS)
AC_SUBST(WITH_FONTS)

dnl ===================================================================
dnl Test whether to include ppds
dnl ===================================================================
AC_MSG_CHECKING([whether to include PPDs])
if test "$with_ppds" != "no"; then
  AC_MSG_RESULT([yes])
else
  AC_MSG_RESULT([no])
  WITHOUT_PPDS=YES
  SCPDEFS="$SCPDEFS -DWITHOUT_PPDS"
fi
AC_SUBST(WITHOUT_PPDS)

dnl ===================================================================
dnl Test whether to include afms
dnl ===================================================================
AC_MSG_CHECKING([whether to include AFMs])
if test "$with_afms" != "no"; then
  AC_MSG_RESULT([yes])
  BUILD_TYPE="$BUILD_TYPE AFMS"
else
  AC_MSG_RESULT([no])
  WITHOUT_AFMS=YES
  SCPDEFS="$SCPDEFS -DWITHOUT_AFMS"
fi
AC_SUBST(WITHOUT_AFMS)

AC_SUBST(SCPDEFS)

AC_MSG_CHECKING([whether and how to use Xinerama])
if test "$_os" = "Darwin"; then
   USE_XINERAMA=YES
   XINERAMA_LINK=dynamic
   AC_MSG_RESULT([yes])
elif test "$_os" = "Linux" -o "$_os" = "FreeBSD"; then
   if test -e "$XLIB/libXinerama.so" -a -e "$XLIB/libXinerama.a"; then
      # we have both versions, let the user decide but use the dynamic one
      # per default
      USE_XINERAMA=YES
      if test -z "$with_static_xinerama" -o -n "$with_system_libs"; then
         XINERAMA_LINK=dynamic
      else
         XINERAMA_LINK=static
      fi
   elif test -e "$XLIB/libXinerama.so" -a ! -e "$XLIB/libXinerama.a"; then
      # we have only the dynamic version
      USE_XINERAMA=YES
      XINERAMA_LINK=dynamic
   elif test -e "$XLIB/libXinerama.a"; then
      # static version
      if echo $build_cpu | grep -E 'i[[3456]]86' 2>/dev/null >/dev/null; then
         USE_XINERAMA=YES
         XINERAMA_LINK=static
      else
         USE_XINERAMA=NO
         XINERAMA_LINK=none
      fi
   else
      # no Xinerama
      USE_XINERAMA=NO
      XINERAMA_LINK=none
   fi
   if test "$USE_XINERAMA" = "YES"; then
      AC_MSG_RESULT([yes, with $XINERAMA_LINK linking])
      AC_CHECK_HEADER(X11/extensions/Xinerama.h, [],
          [AC_MSG_ERROR(Xinerama header not found.)], [])
      XINERAMA_EXTRA_LIBS="-L$XLIB -lXext"
      if test "$_os" = "FreeBSD"; then
          XINERAMA_EXTRA_LIBS="$XINERAMA_EXTRA_LIBS -lXt"
      fi
      if test "$_os" = "Linux"; then
          XINERAMA_EXTRA_LIBS="$XINERAMA_EXTRA_LIBS -ldl"
      fi
      AC_CHECK_LIB(Xinerama, XineramaIsActive, [],
          [AC_MSG_ERROR(Xinerama not functional?)], [$XINERAMA_EXTRA_LIBS])
   else
      AC_MSG_RESULT([no, libXinerama not found or wrong architecture.])
   fi
else
   AC_MSG_RESULT([no])
fi
AC_SUBST(USE_XINERAMA)
AC_SUBST(XINERAMA_LINK)

dnl ===================================================================
dnl always rely on the system version of gdk-pixbuf
dnl ===================================================================

SYSTEM_GDKPIXBUF=YES
AC_SUBST(SYSTEM_GDKPIXBUF)

dnl ===================================================================
dnl always rely on the system version of glib
dnl ===================================================================

SYSTEM_GLIB=YES
AC_SUBST(SYSTEM_GLIB)

dnl ===================================================================
dnl always rely on the system version of gettext
dnl ===================================================================

SYSTEM_GETTEXT=YES
AC_SUBST(SYSTEM_GETTEXT)

dnl ===================================================================
dnl always rely on the system version of pango
dnl ===================================================================

SYSTEM_PANGO=YES
AC_SUBST(SYSTEM_PANGO)

dnl ===================================================================
dnl Test whether to build libpng or rely on the system version
dnl ===================================================================
AC_MSG_CHECKING([whether to build own version of libpng])

case "$_os" in
	WINNT*) # Windows
	    SYSTEM_LIBPNG=NO
	    AC_MSG_RESULT([yes])
		;;
	Darwin*)
	    SYSTEM_LIBPNG=NO
	    AC_MSG_RESULT([yes])
	    ;;
   *)
   SYSTEM_LIBPNG=YES
   AC_MSG_RESULT([no])
   ;;
esac
AC_SUBST(SYSTEM_LIBPNG)

dnl ===================================================================
dnl Test whether to build libjpeg or rely on the system version
dnl ===================================================================
dnl FIXME: this is currently because we have jpeg-6b for our filters
dnl        and jpeg-8 as dependency for librsvg
dnl        this should be unified into using only one version for both

AC_MSG_CHECKING([whether to build own version of libjpeg])

if test "$SYSTEM_JPEG" = "YES"; then
SYSTEM_LIBJPEG=YES
else
case "$_os" in
	WINNT*) # Windows
	    SYSTEM_LIBJPEG=NO
		;;
	Darwin*)
	    SYSTEM_LIBJPEG=NO
	    ;;
   *)
        SYSTEM_LIBJPEG=YES
        ;;
esac
fi

if test "$SYSTEM_LIBJPEG" = "YES"; then
   AC_MSG_RESULT([no])
else
   AC_MSG_RESULT([yes])
fi
AC_SUBST(SYSTEM_LIBJPEG)

dnl ===================================================================
dnl Test whether rat scan was requested and whether apache-rat is available
dnl ===================================================================
RAT_JAR=
AC_MSG_CHECKING([whether to trigger rat scan])
if test -z "$with_rat_scan" -o "$with_rat_scan" = "no"; then
    AC_MSG_RESULT([no])
else
    if test "$WITH_JAVA" = "no"; then
        AC_MSG_ERROR([no, java disabled, enable with --with-java])
    elif test "$enable_saxon" = "no"; then
        AC_MSG_ERROR([no, saxon disabled, enable with --enable-category-b])
    elif test "$with_rat_scan" = "yes"; then
        AC_MSG_RESULT([yes, use pre-built library])
        RAT_JAR_HOME="BUILD"
        BUILD_TYPE="$BUILD_TYPE RAT"
    else
        AC_MSG_RESULT([yes, use pre-installed library])
        AC_MSG_CHECKING([whether apache-rat is available])
        if test -d "$with_rat_scan"; then
            RAT_JAR_HOME=$with_rat_scan
        else
            AC_MSG_ERROR([$with_rat_scan is not a directory])
        fi
    fi
fi
AC_SUBST(RAT_JAR_HOME)


dnl ===================================================================
dnl Test for the presence of Ant and that it works
dnl ===================================================================

if test "$SOLAR_JAVA" != ""; then
ANT_HOME=; export ANT_HOME
WITH_ANT_HOME=; export WITH_ANT_HOME
if test -z "$with_ant_home"; then
   if test "$_os" = "OS2"; then
     AC_PATH_PROGS(ANT, ant.cmd)
   else
     AC_PATH_PROGS(ANT, [jakarta-ant ant ant.sh ant.bat ant.cmd])
   fi
else
   if test "$_os" = "WINNT"; then
      with_ant_home=`cygpath -u "$with_ant_home"`
   fi
   if test "$_os" = "OS2"; then
     AC_PATH_PROGS(ANT, ant.cmd,,$with_ant_home/bin:$PATH)
   else
     AC_PATH_PROGS(ANT, [jakarta-ant ant ant.sh ant.bat ant.cmd],,$with_ant_home/bin:$PATH)
   fi
   WITH_ANT_HOME=$with_ant_home
   ANT_HOME=$with_ant_home
fi

if test -z "$ANT"; then
  AC_MSG_ERROR([Ant not found - Make sure it's in the path or use --with-ant-home])
else
  # resolve relative or absolute symlink
  while test -h "$ANT"; do
     a_cwd=`pwd`
     a_basename=`basename "$ANT"`
     a_script=`ls -l "$ANT" | sed "s/.*${a_basename} -> //g"`
     cd "`dirname "$ANT"`"
     cd "`dirname "$a_script"`"
     ANT="`pwd`"/"`basename "$a_script"`"
     cd "$a_cwd"
  done

  if test "$_os" = "OS2"; then
    ANT_HOME=`echo $ANT | $SED -n "s/\/bin\/ant.*\$//p"`
    export ANT_HOME
  fi

  AC_MSG_CHECKING([if $ANT works])
cat > conftest.java << EOF
    public class conftest {
	int testmethod(int a, int b) {
            return a + b;
	}
    }
EOF

cat > conftest.xml << EOF
    <project name="conftest" default="conftest">
	<target name="conftest">
            <javac srcdir="." includes="conftest.java">
	    </javac>
	</target>
    </project>
EOF
  oldJAVA_HOME=$JAVA_HOME
  if test "$JAVACISGCJ" = "yes"; then
    JAVA_HOME=; export JAVA_HOME
    ant_cmd="$ANT -Dbuild.compiler=gcj -buildfile conftest.xml 1>&2"
  else
    ant_cmd="$ANT -buildfile conftest.xml 1>&2"
  fi
  AC_TRY_EVAL(ant_cmd)
  if test $? = 0 && test -f ./conftest.class ; then
    AC_MSG_RESULT([Ant works]) 
    if test -z "$WITH_ANT_HOME"; then
        ANT_HOME=`$ANT -diagnostics | $EGREP "ant.home :" | $SED -e "s#ant.home : ##g"`
        if test -z "$ANT_HOME"; then
            ANT_HOME=`echo $ANT | $SED -n "s/\/bin\/ant.*\$//p"`
        fi
    else
        ANT_HOME="$WITH_ANT_HOME"
    fi
  else
    echo "configure: Ant test failed" >&5
    cat conftest.java >&5
    cat conftest.xml >&5
    AC_MSG_WARN([Ant does not work - Some Java projects will not build!])
    ANT_HOME=""
    echo "Ant does not work - Some Java projects will not build!" >>warn
  fi
  JAVA_HOME=$oldJAVA_HOME
  rm -f conftest* core core.* *.core
fi
if test -z "$ANT_HOME"; then
   ANT_HOME="NO_ANT_HOME"
fi
AC_SUBST(ANT_HOME)

dnl Checking for ant.jar
if test "$ANT_HOME" != "NO_ANT_HOME"; then
   AC_MSG_CHECKING([Ant lib directory])
   if test -f $ANT_HOME/lib/ant.jar; then
	  ANT_LIB="$ANT_HOME/lib"
   else
      if test -f $ANT_HOME/ant.jar; then
	     ANT_LIB="$ANT_HOME"
      else
          if test -f /usr/share/java/ant.jar; then
              ANT_LIB=/usr/share/java
          else
             if test -f /usr/share/ant-core/lib/ant.jar; then
                 ANT_LIB=/usr/share/ant-core/lib
             else
                if test -f $ANT_HOME/lib/ant/ant.jar; then
                    ANT_LIB="$ANT_HOME/lib/ant"
                else
                   if test -f /usr/share/lib/ant/ant.jar; then
                       ANT_LIB=/usr/share/lib/ant
                   else
                       AC_MSG_ERROR([Ant libraries not found!])
                   fi
                fi  
             fi
          fi
      fi
   fi
   AC_MSG_RESULT([Ant lib directory found.])
fi
AC_SUBST(ANT_LIB)
fi

ant_minver=1.6.0
# update for more extensions...
if test "$ENABLE_MEDIAWIKI" = "YES"; then
  ant_minver=1.7.0
fi
ant_minminor1=`echo $ant_minver | cut -d"." -f2`

AC_MSG_CHECKING([whether ant is >= $ant_minver])
ant_version=`$ANT -version | $AWK '{ print $4; }'`
ant_version_major=`echo $ant_version | cut -d. -f1`
ant_version_minor=`echo $ant_version | cut -d. -f2`
echo "configure: ant_version $ant_version " >&5
echo "configure: ant_version_major $ant_version_major " >&5
echo "configure: ant_version_minor $ant_version_minor " >&5
if test "$ant_version_major" -ge "2"; then
   AC_MSG_RESULT([yes, $ant_version])
elif test "$ant_version_major" = "1" && test "$ant_version_minor" -ge "$ant_minminor1"; then
   AC_MSG_RESULT([yes, $ant_version])
else
   AC_MSG_ERROR([no, you need at least ant >= $ant_minver])
fi

if test "$ENABLE_MEDIAWIKI" = "YES"; then
AC_MSG_CHECKING([whether ant supports mapper type="regexp"])
rm -rf confdir
mkdir confdir
cat > conftest.java << EOF
    public class conftest {
        int testmethod(int a, int b) {
            return a + b;
        }
    }
EOF

cat > conftest.xml << EOF
    <project name="conftest" default="conftest">
        <target name="conftest" depends="copytest">
            <javac srcdir="." includes="conftest.java">
            </javac>
        </target>
        <target name="copytest">
             <copy todir="confdir">
                 <fileset dir="confdir" includes="**/*.abc" casesensitive="yes"/>
                 <filterset/>
                 <mapper type="regexp" from="^(.*[/\\])foo([/\\].*)" to="\1baa\2"/>
             </copy>
        </target>
    </project>
EOF
  if test "$JAVACISGCJ" = "yes"; then
    JAVA_HOME=; export JAVA_HOME
    ant_cmd="$ANT -Dbuild.compiler=gcj -buildfile conftest.xml 1>&2"
  else
    ant_cmd="$ANT -buildfile conftest.xml 1>&2"
  fi
  AC_TRY_EVAL(ant_cmd)
  if test $? = 0 && test -f ./conftest.class ; then
    AC_MSG_RESULT([yes]) 
    rm -rf confdir
  else
    echo "configure: Ant test failed" >&5
    cat conftest.java >&5
    cat conftest.xml >&5
    rm -rf confdir
    AC_MSG_ERROR([no. Did you install ant-apache-regexp?])
  fi
fi
rm -f conftest* core core.* *.core

OOO_JUNIT_JAR=
if test "$SOLAR_JAVA" != "" && test "$with_junit" != "no"; then
    AC_MSG_CHECKING([for JUnit 4])
    if test "$with_junit" = "yes"; then
        if test -e /usr/share/java/junit4.jar; then
            OOO_JUNIT_JAR=/usr/share/java/junit4.jar
        else
           if test -e /usr/share/lib/java/junit.jar; then
              OOO_JUNIT_JAR=/usr/share/lib/java/junit.jar
           else
              OOO_JUNIT_JAR=/usr/share/java/junit.jar
           fi
        fi
    else
        OOO_JUNIT_JAR=$with_junit
    fi
    if test "$_os" = "WINNT"; then
        OOO_JUNIT_JAR=`cygpath -m "$OOO_JUNIT_JAR"`
    fi
    "$JAVA_HOME/bin/jar" tf "$OOO_JUNIT_JAR" 2>&5 | \
        grep org/junit/Before.class > /dev/null 2>&5
    if test $? -eq 0; then
        AC_MSG_RESULT([$OOO_JUNIT_JAR])
    else
        AC_MSG_RESULT([no])
        AC_MSG_ERROR([cannot find JUnit 4 jar; please install one in the default
location (/usr/share/java), specify its pathname via
--with-junit=..., or disable it via --without-junit])
    fi
fi
AC_SUBST(OOO_JUNIT_JAR)

AC_MSG_CHECKING([which languages to be built])
WITH_LANG="$with_lang"
if test -z "$WITH_LANG"; then
   AC_MSG_RESULT([en-US])
else
   AC_MSG_RESULT([$WITH_LANG])
   ADDITIONAL_REPOSITORIES="$ADDITIONAL_REPOSITORIES ../extras"
   BUILD_TYPE="$BUILD_TYPE L10N"
fi
AC_SUBST(WITH_LANG)

AC_MSG_CHECKING([which languages have poor help localizations])
WITH_POOR_HELP_LOCALIZATIONS="$with_poor_help_localizations"
if test -z "$WITH_POOR_HELP_LOCALIZATIONS"; then
   AC_MSG_RESULT([none])
else
   AC_MSG_RESULT([$WITH_POOR_HELP_LOCALIZATIONS])
fi
AC_SUBST(WITH_POOR_HELP_LOCALIZATIONS)

AC_MSG_CHECKING([which dictionaries to include])
if test -z "$with_dict"; then
   WITH_DICT=,ALL,
   AC_MSG_RESULT([ALL])
else
   WITH_DICT=","$with_dict","
   AC_MSG_RESULT([$with_dict])
fi
AC_SUBST(WITH_DICT)

AC_MSG_CHECKING([for additional 'intro' bitmaps])
INTRO_BITMAPS=
if test -z "$with_intro_bitmaps" -o "$with_intro_bitmaps" = "no" ; then
   INTRO_BITMAPS=
   AC_MSG_RESULT([none])
else
   for bitmap in `echo $with_intro_bitmaps | tr ',' ' '` ; do
      case "$bitmap" in
         *.bmp) ;;
         *)     bitmap= ; AC_MSG_WARN([Intro bitmaps should be .bmp files!]) ;;
      esac
      if test -n "$bitmap" ; then
         INTRO_BITMAPS="$INTRO_BITMAPS $bitmap"
      fi
   done
   AC_MSG_RESULT([$INTRO_BITMAPS])
fi
AC_SUBST(INTRO_BITMAPS)

AC_MSG_CHECKING([for additional 'about' bitmaps])
ABOUT_BITMAPS=
if test -z "$with_about_bitmaps" -o "$with_about_bitmaps" = "no" ; then
   ABOUT_BITMAPS=
   AC_MSG_RESULT([none])
else
   for bitmap in `echo $with_about_bitmaps | tr ',' ' '` ; do
      case "$bitmap" in
         *.bmp) ;;
         *)     bitmap= ; AC_MSG_WARN([About bitmaps should be .bmp files!]) ;;
      esac
      if test -n "$bitmap" ; then
         ABOUT_BITMAPS="$ABOUT_BITMAPS $bitmap"
      fi
   done
   AC_MSG_RESULT([$ABOUT_BITMAPS])
fi
AC_SUBST(ABOUT_BITMAPS)

OOO_VENDOR=
AC_MSG_CHECKING([for vendor])
if test -z "$with_vendor" -o "$with_vendor" = "no" ; then
   AC_MSG_RESULT([not set])
else
   OOO_VENDOR="$with_vendor"
   AC_MSG_RESULT([$OOO_VENDOR])
fi
AC_SUBST(OOO_VENDOR)

UNIXWRAPPERNAME=
AC_MSG_CHECKING([for UNIX wrapper name])
if test -z "$with_unix_wrapper" -o "$with_unix_wrapper" = "no"  -o "$with_unix_wrapper" = "yes" ; then
   AC_MSG_RESULT([not set])
else
   UNIXWRAPPERNAME="$with_unix_wrapper"
   AC_MSG_RESULT([$UNIXWRAPPERNAME])
fi
AC_SUBST(UNIXWRAPPERNAME)

AC_MSG_CHECKING([whether to statically link to Gtk])
if test -n "$enable_static_gtk" && test "$enable_static_gtk" != "no"; then
   ENABLE_STATIC_GTK="TRUE"
   AC_MSG_RESULT([yes])
else
   ENABLE_STATIC_GTK="FALSE"	
   AC_MSG_RESULT([no])
fi
AC_SUBST(ENABLE_STATIC_GTK)

AC_MSG_CHECKING([whether to use layout dialogs])
if test -n "$enable_layout" && test "$enable_layout" != "no"; then
   ENABLE_LAYOUT="TRUE"
   AC_MSG_RESULT([yes])
else
   ENABLE_LAYOUT="FALSE"	
   AC_MSG_RESULT([no])
fi
AC_SUBST(ENABLE_LAYOUT)

# ===================================================================
# De- or increase default verbosity of build process
# ===================================================================
AC_MSG_CHECKING([build verbosity])
if test -n "$enable_verbose"; then
   if test "$enable_verbose" = "yes"; then
      VERBOSE="TRUE"
      AC_MSG_RESULT([high])
   fi
   if test "$enable_verbose" = "no"; then
      VERBOSE="FALSE"
      AC_MSG_RESULT([low])
   fi
else
   AC_MSG_RESULT([not set])
fi
AC_SUBST(VERBOSE)

dnl ===================================================================
dnl Hook up OOos nodep environmental variable to automake's equivalent
dnl --enable-dependency-tracking configure option
dnl ===================================================================
AC_MSG_CHECKING([whether to enable dependency tracking])
if test "$enable_dependency_tracking" = "no"; then
    nodep=TRUE
    AC_MSG_RESULT([no])
else
    AC_MSG_RESULT([yes])
fi
AC_SUBST(nodep)

dnl ===================================================================
dnl Setting up the environment.
dnl ===================================================================
echo "********************************************************************"
echo "*                                                                  *"
echo "*   Setting up the build environment variables.                    *"
echo "*                                                                  *"
echo "********************************************************************"

if test -z "$COMPATH"; then
   AC_MSG_ERROR([No compiler found.])
fi
AC_SUBST(COMPATH)

AC_MSG_CHECKING([solver path])
if test -z "$with_local_solver"; then
   LOCAL_SOLVER="DEFAULT"
   AC_MSG_RESULT([default])
else
   LOCAL_SOLVER=$with_local_solver
   AC_MSG_RESULT([$with_local_solver])
fi
AC_SUBST(LOCAL_SOLVER)

AC_SUBST(BUILD_TYPE)
AC_SUBST(ADDITIONAL_REPOSITORIES)

# make sure config.guess is +x; we execute config.guess, so it has to be so; 
chmod +x ./config.guess

# Create files from their *.in templates.
AC_CONFIG_FILES([set_soenv Makefile])

AC_MSG_NOTICE([writing config.status])
AC_OUTPUT

dnl Executing the set_soenv script to setup the environment variables.
chmod a+x set_soenv
if test -z "$enable_check_only"; then
   './set_soenv'
else
   echo
   echo Test Complete
   echo No environment file will be generated
   echo
   num_warnings=`wc -l warn`
   _num=`echo $num_warnings | $AWK '{ print $1 }'`
   if test $_num -gt 0; then
      echo The following warning\(s\) were generated by configure
      echo ----------------------------------------------------
      echo
      cat warn
      echo
   else
      echo There were no warnings
   fi
   echo
fi   
