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 OpenLDAP
],,)
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
],,)
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           AOO 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://epm.sourcearchive.com/downloads/3.7-1/epm_3.7.orig.tar.gz
                          or
                            http://www.msweet.org/files/project2/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(win-x64-shellext,
[  --enable-win-x64-shellext    Enable the build/usage of Windows 64bit shell extensions.
                          These extension are used for the system integration on a 
			  Windows 64bit systems. For example supporting the search 
			  in ODF files with the standard Windows search feature.
],,)
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(nss-module,
[  --disable-nss-module    Whether to use the NSS module that is used for xml-security    
],,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(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 
                          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-nss,
[  --with-system-nss       Use NSS 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(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(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         Only building --without-stlport is supported.
], WITH_STLPORT=$withval , WITH_STLPORT=no)
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

# get info about the system provided release/version details
head /etc/*-release
uname -a

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
		if test ! -n "$CC"; then
		   CC="`xcrun -f clang` -arch x86_64"
		fi
		if test ! -n "$CXX"; then
		   CXX="`xcrun -f clang++` -arch x86_64 -std=c++11"
		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

if test "$_os" = "WINNT"; then
   dnl ===================================================================
   dnl Set the BUILD_X64 variable. 
   dnl ===================================================================
   AC_MSG_CHECKING([whether to build/use the Windows 64bit shell extensions])
   if test "$enable_win_x64_shellext" = "" -o "$enable_win_x64_shellext" = "no"; then
      BUILD_X64=""
      AC_MSG_RESULT([no])
   else
      BUILD_X64="TRUE"
      AC_MSG_RESULT([yes])
   fi
   AC_SUBST(BUILD_X64)
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 category-B librariets: 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):
#   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 nss, hunspell, hyphen, saxon, rhino, beanshell, graphite, coinmp to be built])
else
   # Disable libaries.
   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 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)

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

if test "$_os" = "FreeBSD"; then
    FBSD_GCC_RPATH=
    if $CC --version 2>&1 | grep clang > /dev/null ; then
        COM_IS=CLANG
    else
        COM_IS=GCC
        rpath=`$CC --print-file-name libstdc++.so`
        rpath=`realpath $rpath`
        rpath=`dirname $rpath`
	if test "$rpath" != "/usr/lib" ; then
            FBSD_GCC_RPATH="-Wl,-rpath=$rpath"
	fi
    fi
    AC_SUBST(COM_IS)
    AC_SUBST(FBSD_GCC_RPATH)
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
CC_PATH="$COMPATH/"
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" ; then
         AC_MSG_RESULT([implicitly using CC=$CC])
   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])
DMAKE="no"
# Override system dmake if --with-dmake-path or --with-dmake-url is used.
if test -z "$with_dmake_path" && test -z "$with_dmake_url"; then
   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
   fi
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. Use --with-dmake-url to supply an URL; run configure with the --help option for a list of possible URLs.])
       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 }'`

   AC_MSG_RESULT([checked (g++ $_gpp_version)])

   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.
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 Testing for required  Solaris and SunStudio compiler patches...
dnl **************************************************************
dnl Check whether the OS is SunOS.
if test "$_os" = "SunOS"; then
   _temp=`showrev -p | $AWK -F" " '{ print $2 }'` 
   if test "$_os_release" = "7"; then
      dnl ***************
      dnl patch 106327-06
      dnl ***************
      AC_MSG_CHECKING([for patch 106327-06 or greater])
      _patch=`echo $_temp | $AWK '/106327-06/ { print "found" }'`
      _patch="false"
      for i in $_temp
      do
         _patch_major=`echo $i | $AWK -F"-" '{ print $1 }'`
         if test "$_patch_major" = "106327"; then
            _patch_rev=`echo $i | $AWK -F"-" '{ print $2 }'`
            if test "$_patch_rev" -ge "6"; then
               _patch="found"
            fi
        fi
      done
      if test "$_patch" = "found"; then
         AC_MSG_RESULT([found])
      else
         AC_MSG_WARN([patch 106327-06 not found, please install compiler patch 106327-06 or greater])
         echo "patch 106327-06 not found, please install compiler patch 106327-06 or greater" >> warn
      fi
      dnl ***************
      dnl patch 106950-11
      dnl ***************
      AC_MSG_CHECKING([for patch 106950-11 or greater])
      _patch=`echo $_temp | $AWK '/106950-11/ { print "found" }'`
      _patch="false"
      for i in $_temp
      do
         _patch_major=`echo $i | $AWK -F"-" '{ print $1 }'`
         if test "$_patch_major" = "106950"; then
            _patch_rev=`echo $i | $AWK -F"-" '{ print $2 }'`
            if test "$_patch_rev" -ge "11"; then
               _patch="found"
            fi
         fi
      done
      if test "$_patch" = "found"; then
         AC_MSG_RESULT([found])
      else
         AC_MSG_WARN([patch 106950-11 not found, please install linker patch 106950-11 or greater])
         echo "patch 106950-11 not found, please install linker patch 106950-11 or greater" >> warn
      fi
   else
      if test "$_os_release" = "6"; then
         dnl ***************
         dnl patch 105591-09
         dnl ***************
         AC_MSG_CHECKING([for patch 105591-09 or greater])
         _patch=`echo $_temp | $AWK '/105591-09/ { print "found" }'`
         _patch="false"
         for i in $_temp
         do
            _patch_major=`echo $i | $AWK -F"-" '{ print $1 }'`
            if test "$_patch_major" = "105591"; then
               _patch_rev=`echo $i | $AWK -F"-" '{ print $2 }'`
               if test "$_patch_rev" -ge "9"; then
                  _patch="found"
               fi
           fi
         done
         if test "$_patch" = "found"; then
            AC_MSG_RESULT([found])
         else
            AC_MSG_WARN([patch 105591-09 not found, please install compiler patch 105591-09 or greater])
            echo "patch 105591-09 not found, please install compiler patch 105591-09 or greater" >> warn
         fi
         dnl ***************
         dnl patch 107733-08
         dnl ***************
         AC_MSG_CHECKING([for patch 107733-08 or greater])
         _patch=`echo $_temp | $AWK '/107733-08/ { print "found" }'`
         _patch="false"
         for i in $_temp
         do
            _patch_major=`echo $i | $AWK -F"-" '{ print $1 }'`
            if test "$_patch_major" = "107733"; then
               _patch_rev=`echo $i | $AWK -F"-" '{ print $2 }'`
               if test "$_patch_rev" -ge "8"; then
                  _patch="found"
               fi
           fi
         done
         if test "$_patch" = "found"; then
            AC_MSG_RESULT([found])
         else
            AC_MSG_WARN([patch 107733-06 not found, please install linker patch 107733-08 or greater])
            echo "patch 107733-06 not found, please install linker patch 107733-08 or greater" >> warn
         fi
      fi
   fi
fi

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 "$WITH_STLPORT" != "no"; then
   AC_MSG_ERROR([Option --with-stlport is no longer available.])
else
   USE_SYSTEM_STL="YES"
fi

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 false ; then # TODO: update TR1 compliant STLs
if test "$USE_SYSTEM_STL" = "YES"; then
   AC_MSG_CHECKING([system stl sanity])
   AC_LANG_PUSH([C++])

   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
fi # endof TODO: update TR1 compliant STLs

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
         JAVAIFLAGS=""
   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

      # Override system epm and --with-epm if --with-epm-url is used.
      if test -n "$with_epm_url" ; then
         # At this moment we can not verify the URL or the content that we want to download.
       	 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 (http://www.msweet.org/projects.php?Z2) 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); run configure with the --help option for a list of possible URLs.])
	 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 (http://www.msweet.org/projects.php?Z2) 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); run configure with the --help option for a list of possible URLs.])
            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 using your browser or a command equivalent to:
         wget -O external/unowinreg/unowinreg.dll http://www.openoffice.org/tools/unowinreg_prebuild/680/unowinreg.dll])
      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 MINGSTRIP=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 Checks for a MacOS platform SDK compatible with an OSX 10.7 deployment target
dnl ===================================================================
if test  "$_os" = "Darwin"; then
   sdk_target=10.7
   AC_MSG_CHECKING([checking SDK compatiblity with OSX $sdk_target])

   sdk_minor=`echo $sdk_target | cut -d"." -f2`

   if test "$sdk_minor" -lt "7"; then
      AC_MSG_ERROR([SDK version < 10.7 is not longer supported])
   else
      MACOSX_DEPLOYMENT_TARGET=$sdk_target

      sdk_found=`xcodebuild -showsdks | egrep "sdk macosx10.(7|8|9|10)" | sed -e "s/.*sdk //" | tail -n1`
      if test -z "$sdk_found"; then
         AC_MSG_ERROR([No SDK with OSX $sdk_target compatibility found])
      else
         AC_MSG_RESULT([yes, by using SDK $sdk_found])
      fi

      sdk_path=`xcodebuild -version -sdk ${sdk_found} Path`
      AC_MSG_CHECKING([for $sdk_path])
      if test -d "$sdk_path"; then
         AC_MSG_RESULT([yes])
      else
         AC_MSG_ERROR([not found!])
      fi

      MACOSX_SDK_PATH=$sdk_path
   fi

fi
AC_SUBST(MACOSX_DEPLOYMENT_TARGET)
AC_SUBST(MACOSX_SDK_PATH)


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

   _python="/Library/Frameworks/Python.framework/Versions/Current/bin/python" 
   if test ! -f $_python; then
   	  _python="/usr/bin/python"
   fi
   AC_MSG_RESULT([compiling against system python ($_python)])

   _python_hexversion=`$_python -c "import sys; print(sys.hexversion);"`
 
   dnl hex version of Python 2.7.1 = 34013680
   if test $_python_hexversion -ge 34013680 ; then
   	  _python_version=`$_python -c "import sys; print sys.version;" | head -c 3`
      AC_MSG_RESULT([compiling against system python (version $_python_version)])

	  _python_ver=`$_python -c "import distutils.sysconfig; print(distutils.sysconfig.get_config_var('VERSION'));"`
	  
	  if test -d "/Library/Frameworks/Python.framework/Versions/$_python_ver/include/python$_python_ver"; then
	  	 PYTHON_CFLAGS="-I/Library/Frameworks/Python.framework/Versions/$_python_ver/include/python$_python_ver"
         elif test -d "$MACOSX_SDK_PATH/usr/include/python$_python_ver"; then
             PYTHON_CFLAGS="-I$MACOSX_SDK_PATH/usr/include/python$_python_ver"
	  else
             PYTHON_CFLAGS="-I$MACOSX_SDK_PATH/System/Library/Frameworks/Python.framework/Versions/$_python_ver/include/python$_python_ver"
	  fi
   else
		AC_MSG_ERROR([Python 2.7.1 or higher is required])
   fi

   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.7])

   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.9.4.jar, 
            [ LUCENE_CORE_JAR=/usr/share/java/lucene-core-2.9.4.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 -n "$with_system_serf" -o -n "$with_system_libs" && \
  test "$with_system_serf" != "no"; 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)

AC_MSG_CHECKING([whether to build XML Security support])
if test "$enable_nss_module" = "no"; then
   AC_MSG_RESULT([no, since 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 "$with_openldap" = "yes"; then
      AC_MSG_RESULT([yes])
      WITH_LDAP=YES
   else
      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 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)], [])
   fi
fi
AC_SUBST(WITH_LDAP)
AC_SUBST(WITH_OPENLDAP)

AC_MSG_CHECKING([whether to build the internal 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!
  It is required for NSS that is needed for AOO's security facilities.
  Either disable NSS using the option --disable-nss-module
  or use the --with-mozilla-build option after installing the tool 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

AC_SUBST(ENABLE_NSS_MODULE)
AC_SUBST(MOZILLABUILD)
AC_SUBST(MOZ_INC)

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)

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 nss
dnl ===================================================================
AC_MSG_CHECKING([which libnss to use])
if test -n "$with_system_nss" -o -n "$with_system_libs" && test "$with_system_nss" != "no"; then
    AC_MSG_RESULT([external])
    PKG_CHECK_MODULES( NSS, nss )
    SYSTEM_NSS=YES
else
    AC_MSG_RESULT([internal])
    SYSTEM_NSS=NO
    BUILD_TYPE="$BUILD_TYPE NSS"
fi
AC_SUBST(SYSTEM_NSS)
AC_SUBST(NSS_CFLAGS)
AC_SUBST(NSS_LIBS)

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
    elif echo $PSDK_HOME | grep "v7.0" >/dev/null 2>/dev/null; then
        AC_MSG_RESULT([Found Windows SDK 7.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
	    ATL_LIB_X64=$COMPATH/atlmfc/lib/amd64
        else
            ATL_LIB=`cygpath -u "$with_atl_lib_dir"`
            ATL_LIB_X64=$ATL_LIB/../amd64
        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/\/$//'`
        ATL_LIB_X64=`echo $ATL_LIB_X64 | $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=
            ATL_LIB_X64=
            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"`
            ATL_LIB_X64=`cygpath -dm "$ATL_LIB_X64"`
            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(ATL_LIB_X64)
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

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 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)

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.6.jar, 
          [ COMMONS_CODEC_JAR=/usr/share/java/commons-codec-1.6.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.4.jar, 
          [ COMMONS_LANG_JAR=/usr/share/java/commons-lang-2.4.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)

if test "$_os" = "FreeBSD"; then
    LIBINTL_PREFIX=
    for dir in $CPPFLAGS; do
      if dir=`expr -- $dir : '-I\(.*\)'`; then
        if test -f "$dir/libintl.h" ; then
          LIBINTL_PREFIX=`dirname $dir`
        fi
      fi
    done
    AC_SUBST(LIBINTL_PREFIX)
fi

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_SUBST(CC_PATH)

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   
