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$ )
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:
                          https://github.com/jimjag/dmake/archive/v4.13.1/dmake-4.13.1.tar.gz
                          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(unit-tests,
[  --disable-unit-tests    Disables default unit tests (eg. unit tests using Google test, ...).
],,enable_unit_tests=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 AOO
],,)
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         AOO 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.
],,enable_epm="yes")
AC_ARG_WITH(epm,
[  --with-epm		  Decides which EPM to use. Default is to use
			  the one installed on the system if one is there. 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 source code. For example:
                            https://github.com/jimjag/epm/archive/v5.0.0/epm-5.0.0.tar.gz
                          Version 5.0.0 or later is required.
],[  EPM_URL="$withval"
])
AC_ARG_WITH(package-format,
[  --with-package-format   specify package format(s) for AOO installsets.
                          Default is "normal" one of the OS/Distribution.

                          Usage: --with-package-format="foo bar"
],,)
AC_ARG_ENABLE(odk,
[  --disable-odk           AOO includes an ODK, office development kit
                          which some packagers may want 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(win64,
[  --enable-win64          Enable building 64 bit OpenOffice on 64 bit Windows, (as
                          opposed to 32 bit OpenOffice that is usually built there).
                          This is a temporary option during the transition,
                          as 64 bit OpenOffice doesn't fully build on Windows yet.
],,enable_win64=no)
AC_ARG_ENABLE(win-x64-shellext,
[  --enable-win-x64-shellext    Enable the build/usage of Windows 64bit shell extensions.
                          These extensions are used for the system integration on
			  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=no)
AC_ARG_ENABLE(gio,
[  --enable-gio            Determines whether to use the GIO support
],,enable_gio=yes)
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(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 separated 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 separated 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-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,
[  --enable-beanshell     Enable 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(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-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(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 Apache 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(hamcrest-core,
[  --with-hamcrest-core    Specifies the hamcrest-core jar file to use for
                          JUnit-based tests.  --without-junit disables those
                          tests.  Not relevant in the --without-java or
                          --without-junit cases, and only needed for JUnit
                          >= 4.11.
],,with_hamcrest_core=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 https://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.png
],,)
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.png
],,)
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(nasm-home,
[  --with-nasm-home        For Windows users, please supply the path for the
                          nasm.exe assembler.

                          Usage: --with-nasm-home=<path to nasm.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 https://www.apache.org/legal/3party.html#category-b):
                          MPL (hunspell, hyphen, nss, saxon, rhino),
                          CPL (silgraphite), CPL/EPL (CoinMP), 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(macosx-target,
[  --macosx-target            The minimal macOS/OSX deployment and build target

                              Usage: --with-macosx-target=10.9
],with_macosx_target=$withval,with_macosx_target=10.9)
AC_ARG_WITH(macosx-sdk,
[  --macosx-sdk            The macOS SDK to build against

                              Usage: --with-macosx-sdk=10.11
                              (or full path: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk)
],with_macosx_sdk=$withval,)
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.ac
dnl ===================================================================
AC_MSG_CHECKING([whether configure is up-to-date])
if test "configure" -ot "configure.ac"; 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
if test -z "$GREP"; then
GREP=$EGREP
fi
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
		SDKROOT="`xcrun --sdk macosx --show-sdk-path`"
		if test ! -n "$CC"; then
		   CC="`xcrun -f clang` -arch x86_64"
		fi
		if test ! -n "$CXX"; then
		   CXX="`xcrun -f clang++` -std=c++11 -stdlib=libc++ -arch x86_64"
		fi
		# Don't use OSVERSION until we know no conflicts result from it
		_darwin_version="`uname -r | $AWK -F . '{ print $1 }'`"
		# FIXME: Assumes 10.x, breaks w/ Big Sur
		_osx_version="10.`expr $_darwin_version - 4`"
		AC_MSG_NOTICE([Detected Darwin version: $_darwin_version ($_osx_version)])
		;;
	os2*)
		test_x=no
		test_cups=no
        	test_randr=no
		test_gtk=no
		test_freetype=no
        	test_gstreamer=no
		test_cairo=yes
		_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)

   dnl ===================================================================
   dnl Set the BUILD_WIN64 variable.
   dnl ===================================================================
   AC_MSG_CHECKING([whether to build 64 bit OpenOffice on 64 bit Windows])
   if test "$build_cpu" = "x86_64" ; then
      if test "x$enable_win64" != "xno" ; then
         BUILD_WIN64="TRUE"
         AC_MSG_RESULT([yes])
         OOWINTOOL="./oowintool"
      else
         BUILD_WIN64=""
         AC_MSG_RESULT([no])
         OOWINTOOL="./oowintool --aoo32-on-win64"
      fi
   else
      if test "x$enable_win64" != "xno" ; then
         AC_MSG_ERROR([the --enable-win64 option can only be used on an AMD64 CPU])
      fi
      BUILD_WIN64=""
      AC_MSG_RESULT([no])
      OOWINTOOL="./oowintool"
   fi
   AC_SUBST(BUILD_WIN64)
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 explicitly])
   echo "Turning warnings to errors has no effect in modules or on platforms where it has been disabled explicitly" >> 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 libraries: nss, hunspell, hyphen, saxon,
# rhino, silgraphite.

# 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)
#   graphite (silgraphite)
if test "$enable_category_b" = "yes"; then
   ENABLE_CATEGORY_B=YES
   enable_nss_module="yes"
   enable_hunspell="yes"
   enable_hyphen="yes"
   enable_saxon="yes"
   enable_javascript="yes"
   enable_graphite="yes"
   enable_coinmp="yes"
   enable_category_b_fonts="yes"

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

   AC_MSG_RESULT([no: disabled modules nss, hunspell, hyphen, saxon, rhino, 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)

dnl ===================================================================
dnl Unit Tests
dnl ===================================================================
AC_MSG_CHECKING([whether to enable unit tests])
if test "$enable_unit_tests" = "yes" -o "$enable_unit_tests" = "TRUE"; then
   ENABLE_UNIT_TESTS="YES"
   BUILD_TYPE="$BUILD_TYPE GTEST"
   AC_MSG_RESULT([yes])
else
   ENABLE_UNIT_TESTS=""
   AC_MSG_RESULT([no])
fi
AC_SUBST(ENABLE_UNIT_TESTS)

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-registered
#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 AOO.
dnl ===================================================================
if test "$_os" = "WINNT" ; then
   AC_MSG_CHECKING([for cygwin gcc/g++])
   if which gcc > /dev/null && which g++ > /dev/null ; then
      AC_MSG_RESULT([found])
   else
      AC_MSG_ERROR([cygwin gcc and g++ are needed, please install them.])
   fi
fi


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

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

save_CC=$CC
save_CXX=$CXX

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

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

COMPATH=`dirname "$CC"`
if test "$COMPATH" = "." ; then
    AC_PATH_PROGS(COMPATH, $CC)
    dnl double square bracket to get single because of M4 quote...
    COMPATH=`echo $COMPATH | $SED "s@/[[^/:]]*\\\$@@"`;
fi
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     https://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;
              use Digest::SHA;
              use Digest::MD5;
              use LWP::Protocol::https;'>/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
    if ! `$PERL -e 'use Digest::SHA;'>/dev/null 2>&1`; then
       missing_perl_modules="$missing_perl_modules Digest::SHA"
    fi
    if ! `$PERL -e 'use Digest::MD5;'>/dev/null 2>&1`; then
       missing_perl_modules="$missing_perl_modules Digest::MD5"
    fi
    if ! `$PERL -e 'use LWP::Protocol::https;'>/dev/null 2>&1`; then
       missing_perl_modules="$missing_perl_modules LWP::Protocol::https"
    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])
		case "$build_cpu" in
		  i?86)
		    cl_subdirectory="bin"
		    ;;
		  x86_64)
		    if test "$BUILD_WIN64" = "TRUE" ; then
		      cl_subdirectory="bin/amd64"
		    else
		      cl_subdirectory="bin"
		    fi
		    ;;
		  *)
		    AC_MSG_ERROR([Unknown/unsupported Windows CPU $build_cpu.])
		    ;;
		esac
   		if test -x "$with_cl_home/$cl_subdirectory/cl.exe"; then
   			CC="$with_cl_home/$cl_subdirectory/cl.exe"
			COMPATH="$with_cl_home"
			# This gives us a posix path with 8.3 filename restrictions
			CC=`cygpath -d "$CC"`
			CC=`cygpath -u "$CC"`
			COMPATH=`cygpath -d "$COMPATH"`
			COMPATH=`cygpath -u "$COMPATH"`
			# Remove /cl.exe from CC case insensitive
			AC_MSG_RESULT([found ($CC)])
			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.])
		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 Compiler detection, logic from setsoenv.in
case "$build_os" in
	*cygwin*)
		if test "$WITH_MINGWIN" = "yes"; then
			COM="GCC";
		else
			COM="MSC";
		fi;;
	os2*)
		COM="GCC";;
	netbsd | kfreebsd* | freebsd* | linux* | darwin* )
		if $CC --version 2>&1 | $GREP clang > /dev/null ; then
			COM="CLANG";
		else
			COM="GCC";
		fi;;
	solaris*)
		case "$CC" in
			*gcc*)	COM="GCC";;
			*)	COM="C52";;
		esac;;
	osf | aix*)
		COM="CXX";;
	*) AC_MSG_ERROR([Unable to decipher compiler for $build_os]);;
esac
AC_SUBST(COM)

dnl  Decode the compiler version. Logic from main/solenv/inc/tg_compv.mk.
case $COM in
	GCC)
		CCVER=`${CC} -dumpfullversion -dumpversion 2>&1`;
		CCNUMVER=`echo ${CCVER} | $AWK -v num=true -f ${_solenv}/bin/getcompver.awk`;
		if test "${CCNUMVER}" -ge 000300000001; then
			COMID="gcc3";
			COMNAME="gcc3";
		elif test "${CCNUMVER}" -ge 000300000001; then
			COMID="GCC";
			COMNAME="gcc2";
		else
			AC_MSG_ERROR([gcc too old]);
		fi
		;;
	CLANG)
		CCVER=`${CC} --version 2>&1 | head -n1 | sed -e"s/.*version //" -e"s/ .*//"`;
		CCNUMVER=`echo ${CCVER} | $AWK -v num=true -f ${_solenv}/bin/getcompver.awk`;
		# The version in tg_compv.mk for darwin does not look correct
		# CCNUMVER = `echo ${CCVER} | sed -e"s/\.//";
		case "$build_os" in
 			darwin*) # Mac OS X
 				COMID="s5abi";
 				COMNAME="s5abi";
 				;;
 			*)
 				COMID="gcc3";
 				COMNAME="gcc3";
 				;;
 		esac
		;;
	MSC)
		CCVER=`${CC} 2>&1 | $AWK -f ${_solenv}/bin/getcompver.awk`;
		CCNUMVER=`${CC} 2>&1 | $AWK -v num=true -f ${_solenv}/bin/getcompver.awk`;
		if test "${CCNUMVER}" -ge 001200000000; then
			COMID="MSC";
			case "$build_cpu" in
			  i?86)
			    COMNAME="msci";
			    ;;
			  x86_64)
			    if test "$BUILD_WIN64" = "TRUE" ; then
			      COMNAME="mscx";
			    else
			      COMNAME="msci";
			    fi
			    ;;
			  *)
			    AC_MSG_ERROR([Unknown/unsupported Windows CPU $build_cpu.])
			    ;;
			esac
		else
			AC_MSG_ERROR([MSC compiler too old]);
		fi
		;;
	C55 | C54 | C52 | C40 | sunpro)
		CCVER=`${CC} -V 2>&1 | $AWK -f ${_solenv}/bin/getcompver.awk`;
		CCNUMVER=`${CC} -V 2>&1 | $AWK -v num=true -f ${_solenv}/bin/getcompver.awk`;
		if test "${CCNUMVER}" -ge 00050002; then
			COMID="C52";
			COMNAME="sunpro5";
		else
			AC_MSG_ERROR([Sun compiler too old]);
		fi
		;;
	*)
		AC_MSG_ERROR([Unable to detect compiler version]);;
esac
AC_SUBST(CCVER)
AC_SUBST(CCNUMVER)
AC_SUBST(COMID)
AC_SUBST(COMNAME)

if test "$_os" = "FreeBSD"; then
    FBSD_GCC_RPATH=
    if test "$COM" = "GCC"; then
        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(FBSD_GCC_RPATH)
fi

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++ compiler has a bug which prevents Apache OpenOffice from being compiled correctly - please check https://gcc.gnu.org/ml/gcc-patches/2004-07/msg00968.html for details.])], [AC_MSG_RESULT([no])])
   fi
fi

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

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

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

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

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

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

dnl ===================================================================
dnl Checks for what the default STL should be
dnl ===================================================================
   AC_MSG_CHECKING([what the default STL should be])
   DEFAULT_TO_STLPORT="no"
if test "$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 (EPM) (https://jimjag.github.io/epm/) and/or specify the path to the right epm (--with-epm). Or specify an URL to an epm-5.0.0 (or later) 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 --version | $GREP "ESP Package Manager" >/dev/null 2>/dev/null; then
               AC_MSG_RESULT([yes])
            else
	            AC_MSG_ERROR([no. Install ESP Package Manager (https://jimjag.github.io/epm/) and/or specify the path to the right epm (--with-epm). Or specify an URL to an epm-5.0.0 (or later) 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 --version | $GREP 'ESP Package Manager' | cut -d' ' -f5 | $SED -e s/v//`
	         if test "`echo $EPM_VERSION | cut -d'.' -f1`" -ge "5"; then
               AC_MSG_RESULT([OK, >= 5.0])
               BUILD_EPM=NO
	         else
               AC_MSG_ERROR([too old. EPM >= 5.0.0 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 architecture/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
AOO 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
      AC_PATH_PROG(FAKEROOT, fakeroot, no)
      if test "$FAKEROOT" = "no"; then
         AC_MSG_ERROR([fakeroot needed for deb creation. Install fakeroot.])
      fi
   fi
   if echo "$PKGFORMAT" | $EGREP osx 2>&1 >/dev/null; then
      if test "$_os" = "Darwin"; then
         if test "$_osxpkgbuild" = "no"; 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
         fi
      else
         AC_MSG_ERROR([PackageMaker needed to build OSX packages and you are not on OSX...])
       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(FAKEROOT)
   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 https://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 https://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 MINGWSTRIP=false; else MINGWSTRIP=$(basename $(echo $WITH_MINGWIN | $SED -e s/g++/strip/ | $SED -e s/c++/strip/)); fi
      else
         AC_CHECK_TOOL(MINGWSTRIP, `echo $WITH_MINGWIN | $SED -e s/g++/strip/ | $SED -e s/c++/strip/`, false)
      fi
      if test "$MINGWSTRIP" = "false"; then
         AC_MSG_ERROR(MinGW32 binutils needed. Install them.)
      fi
      AC_LANG_PUSH([C++])
      save_CXX=$CXX
      save_CXXCPP=$CXXCPP
      CXX=$MINGWCXX
      CXXCPP="$MINGWCXX -E"
      save_CXXFLAGS=$CXXFLAGS
      save_CPPFLAGS=$CPPFLAGS
      CXXFLAGS="$CXXFLAGS -I$JAVA_HOME/include"
      CPPFLAGS="$CPPFLAGS -I$JAVA_HOME/include"
      # LIBS contains -lcrypt etc due to the 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 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 deployment target
dnl ===================================================================
if test  "$_os" = "Darwin"; then
   sdk_target=$with_macosx_target
   AC_MSG_CHECKING([checking SDK compatibility with OSX $sdk_target])

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

   if test "$sdk_minor" -lt "9"; then
      AC_MSG_ERROR([SDK version < 10.9 is not longer supported])
   else
      MACOSX_DEPLOYMENT_TARGET=$sdk_target
      sdk_path=$with_macosx_sdk
      if test -z "$sdk_path"; then
          dnl --macosx-sdk not used (or blank): We look for the SDK
          dnl Why not MacOSX10.9.sdk? It lacks Python.h (!?)
          dnl First look for macOS10.x SDKs (Up thru Xcode 12.1)
          sdk_found=`xcodebuild -showsdks | $EGREP "sdk macosx10.(10|11|12|13|14|15)" | sed -e "s/.*sdk //" | tail -n1`
          dnl If not found, look for macOS11.x SDKs (Xcode 12.2 and later)
          if test -z "$sdk_found"; then
             sdk_found=`xcodebuild -showsdks | $EGREP "sdk macosx11.(0|1)" | sed -e "s/.*sdk //" | tail -n1`
          fi
          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`
      elif test ! -d "$sdk_path"; then
          sdk_found=`xcodebuild -showsdks | $EGREP "sdk macosx${sdk_path}" | sed -e "s/.*sdk //" | tail -n1`
          if test -z "$sdk_found"; then
             AC_MSG_ERROR([SDK macosx${sdk_path} not found by xcodebuild])
          else
             AC_MSG_RESULT([SDK $sdk_found])
          fi
          sdk_path=`xcodebuild -version -sdk ${sdk_found} Path`
      fi
      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
      SDKROOT=$sdk_path
   fi

fi
AC_SUBST(MACOSX_DEPLOYMENT_TARGET)
AC_SUBST(MACOSX_SDK_PATH)
AC_SUBST(SDKROOT)


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'));"`
   PKG_CHECK_MODULES(PYTHON, python-$python_version, PYTHON_PC="TRUE", PYTHON_PC="" )
   if test "$PYTHON_PC" != "TRUE"; then
       PYTHON_CFLAGS="-I$python_include"
       PYTHON_LIBS="-lpython$python_version"
   fi
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 AOO 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 whether 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 https://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/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 ===================================================================
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])
    if test "$_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 different 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)])
		AC_MSG_CHECKING([whether NSIS version is >= 3.*])
		nsis_version_string=`"$NSIS_PATH/makensis.exe" /VERSION | $SED -e s/^v//i`
        nsis_version_major=`echo $nsis_version_string | cut -d. -f1`
		nsis_version_minor=`echo $nsis_version_string | cut -d. -f2`
		if test "$nsis_version_major" -ge "3"; then
			AC_MSG_RESULT([found NSIS $nsis_version_major.$nsis_version_minor >= 3.*])
			AC_MSG_CHECKING([whether NSIS was compiled with Unicode support])
			if echo `"$NSIS_PATH/makensis.exe" /HDRINFO` | $EGREP  "\bNSIS_UNICODE_MAKENSIS\b" 2>&1 >/dev/null; then
				AC_MSG_RESULT([NSIS version compiled with Unicode support.])
			else
				NSIS_PATH=""
				AC_MSG_WARN([NSIS version compiled without Unicode support, no self contained installer will be build.])
			fi
		else
			NSIS_PATH=""
			AC_MSG_WARN([NSIS version found is < 3.*, no self contained installer will be build.])
		fi
    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 nasm.exe assembler path
dnl ***************************************
if test "$_os" = "WINNT" -a "$WITH_MINGWIN" != "yes" -a "$SYSTEM_OPENSSL" = "NO"; then
  AC_MSG_CHECKING([nasm.exe assembler path])
  if test -n "$with_nasm_home"; then
    with_nasm_home=`cygpath -u "$with_nasm_home"`
  fi
  if test ! -x "$with_nasm_home/nasm.exe"; then
    AC_PATH_PROG(NASM_EXE, nasm.exe)
    if test -z "$NASM_EXE"; then
      with_nasm_home="NO_NASM_HOME"
      AC_MSG_ERROR([NASM is required to build on Windows, please install or use --with-nasm-home],,)
    else
      with_nasm_home="NASM_IN_PATH"
    fi
  fi
  AC_MSG_RESULT([$NASM_HOME])
else
  with_nasm_home="NO_NASM_HOME"
fi
NASM_HOME="$with_nasm_home"
AC_SUBST(NASM_HOME)

dnl ===================================================================
dnl testing handle deprecated unzip switch
dnl ===================================================================
if test -z "$with_zip_home"; then
	with_zip_home="$with_unzip_home"
fi
dnl ===================================================================
dnl Zip will be found where you tell me to find it
dnl ===================================================================
if test -n "$with_zip_home" ; then
    if test "$_os" = "WINNT"; then
        with_zip_home=`cygpath -u "$with_zip_home"`
    fi
    ZIP="$with_zip_home/zip"
    UNZIP="$with_zip_home/unzip"
    ZIP_HOME="$with_zip_home"
else
    AC_PATH_PROG(ZIP, zip)
    AC_PATH_PROG(UNZIP, unzip)
    ZIP_HOME=`dirname "$ZIP"`
fi
dnl ===================================================================
dnl Zip must be available or else it is an error, all platforms
dnl ===================================================================
if test -z "$ZIP" -o -z "$UNZIP"; then
    AC_MSG_ERROR([Zip/Unzip are required to build, please install or use --with-zip-home],,)
fi
if "$ZIP" -FS < /dev/null 2>&1 | $EGREP "no such option: S" > /dev/null; then
    AC_MSG_ERROR([Zip version 3.0 or newer is required to build, please install or use --with-zip-home],,)
fi

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

dnl ===================================================================
dnl Windows builds need dbghelp.dll in external/dbghelp/
dnl ===================================================================
if test "$_os" = "WINNT"; then
   AC_MSG_CHECKING([for dbghelp.dll])
   if test -x ./external/dbghelp/dbghelp.dll; then
      AC_MSG_RESULT([found and executable])
   else
      AC_MSG_ERROR([dbghelp.dll is missing in external/dbghelp/.
Get it from the Microsoft site and put it into external/dbghelp.
(Note: Microsoft seems to enjoy changing the exact location of this file. You
may have to search Microsoft's website.) Last time it was seen at:
<https://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 https://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 https://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:
<https://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:
<https://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-1.0 gstreamer-video-1.0,,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 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 Report
# Builder use commons-logging, while the non-optional PostgreSQL
# connector uses commons-lang.
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 -z $COMMONS_LANG_JAR; then
    AC_CHECK_FILE(/usr/share/java/commons-lang3-3.3.jar,
      [ COMMONS_LANG_JAR=/usr/share/java/commons-lang3-3.3.jar ],
      [
        AC_CHECK_FILE(/usr/share/java/commons-lang.jar,
          [ COMMONS_LANG_JAR=/usr/share/java/commons-lang.jar ],
          [AC_MSG_ERROR(commons-lang.jar replacement not found.)]
        )
      ]
    )
  else
    AC_CHECK_FILE($COMMONS_LANG_JAR, [],
         [AC_MSG_ERROR(commons-lang.jar not found.)], [])
  fi
  AC_MSG_CHECKING([whether commons-lang is version 3.x])
  export COMMONS_LANG_JAR
  if $PERL -e 'use Archive::Zip;
      my $file = "$ENV{'COMMONS_LANG_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 Apache Commons Lang 3.x])
  fi

  if test "$ENABLE_MEDIAWIKI" = "YES"; then
    if test -z $COMMONS_CODEC_JAR; then
      AC_CHECK_FILE(/usr/share/java/commons-codec-1.9.jar,
        [ COMMONS_CODEC_JAR=/usr/share/java/commons-codec-1.9.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_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.3.jar,
        [ COMMONS_LOGGING_JAR=/usr/share/java/commons-logging-1.1.3.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
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 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, [apache-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, [apache-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.9.1
# update for more extensions...
if test "$ENABLE_MEDIAWIKI" = "YES"; then
  ant_minver=1.9.1
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=
JUNIT_NEEDS_HAMCREST=
if test "$SOLAR_JAVA" != "" && test "$with_junit" != "no"; then
    AC_MSG_CHECKING([for JUnit])
    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/local/share/java/classes/junit4.jar; then
              OOO_JUNIT_JAR=/usr/local/share/java/classes/junit4.jar
           else
              if test -e /usr/share/lib/java/junit.jar; then
                 OOO_JUNIT_JAR=/usr/share/lib/java/junit.jar
              else
                 if test -e /usr/share/local/lib/java/junit.jar; then
                    OOO_JUNIT_JAR=/usr/share/local/lib/java/junit.jar
                 else
                    if test -e /usr/share/java/junit.jar; then
                       OOO_JUNIT_JAR=/usr/share/java/junit.jar
                    else
                       if test -e /usr/local/share/java/classes/junit.jar; then
                          OOO_JUNIT_JAR=/usr/local/share/java/classes/junit.jar
                       fi
                    fi
                 fi
              fi
           fi
        fi
    else
        OOO_JUNIT_JAR=$with_junit
    fi
    if test -e "$OOO_JUNIT_JAR"; then
        AC_MSG_RESULT([yes])
    else
        AC_MSG_ERROR([cannot find JUnit 4 jar; please install one in the default
locations (/usr/share/java or /usr/local/share/java/classes), specify its pathname via
--with-junit=..., or disable it via --without-junit.])
    fi
    if test "$_os" = "WINNT"; then
        OOO_JUNIT_JAR=`cygpath -m "$OOO_JUNIT_JAR"`
    fi
    AC_MSG_CHECKING([whether JUnit is version 4.x])
    export OOO_JUNIT_JAR
    if $PERL -e 'use Archive::Zip;
        my $file = "$ENV{'OOO_JUNIT_JAR'}";
        my $zip = Archive::Zip->new( $file );
        my $mf = $zip->contents ( "META-INF/MANIFEST.MF" );
        if ( $mf =~ m/Implementation-Version: 4.12*/ ) {
            exit 0;
        } elsif ( $mf =~ m/Implementation-Version: 4.11*/ ) {
            exit 0;
        } elsif ( $mf =~ m/Bundle-Version: 4.12*/ ) {
            exit 0;
        } elsif ( $mf =~ m/Bundle-Version: 4.11*/ ) {
            exit 0;
        } else {
            exit 1;
        }'; then
        AC_MSG_RESULT([yes, but Hamcrest Core is mandatory with this JUnit version (>= 4.11)])
        JUNIT_NEEDS_HAMCREST=yes
    elif $PERL -e 'use Archive::Zip;
        my $file = "$ENV{'OOO_JUNIT_JAR'}";
        my $zip = Archive::Zip->new( $file );
        my $mf = $zip->contents ( "META-INF/MANIFEST.MF" );
        if ( $mf =~ m/Implementation-Version: 4.*/ ) {
            exit 0;
        } elsif ( $mf =~ m/Bundle-Version: 4.*/ ) {
        } else {
            exit 1;
        }'; then
        AC_MSG_RESULT([yes])
    else
        AC_MSG_ERROR([no, your JUnit version is too old, you need JUnit 4.x])
    fi
fi
AC_SUBST(OOO_JUNIT_JAR)

HAMCREST_CORE_JAR=
if test "$SOLAR_JAVA" != "" && test "$with_hamcrest_core" != "no"; then
    AC_MSG_CHECKING([for hamcrest-core])
    if test "$with_hamcrest_core" = "yes"; then
        if test "$HAMCREST_CORE_JAR" = "" && test -e /usr/share/java/hamcrest-core-1.3.jar; then
            HAMCREST_CORE_JAR=/usr/share/java/hamcrest-core-1.3.jar
        fi
        if test "$HAMCREST_CORE_JAR" = "" && test -e /usr/local/share/java/classes/hamcrest-core-1.3.jar; then
            HAMCREST_CORE_JAR=/usr/local/share/java/classes/hamcrest-core-1.3.jar
        fi
        if test "$HAMCREST_CORE_JAR" = "" && test -e /usr/share/lib/java/hamcrest-core.jar; then
            HAMCREST_CORE_JAR=/usr/share/lib/java/hamcrest-core.jar
        fi
        if test "$HAMCREST_CORE_JAR" = "" && test -e /usr/local/share/lib/java/hamcrest-core.jar; then
            HAMCREST_CORE_JAR=/usr/local/share/lib/java/hamcrest-core.jar
        fi
        if test "$HAMCREST_CORE_JAR" = "" && test -e /usr/share/java/hamcrest-core.jar; then
            HAMCREST_CORE_JAR=/usr/share/java/hamcrest-core.jar
        fi
        if test "$HAMCREST_CORE_JAR" = "" && test -e /usr/local/share/java/classes/hamcrest-core.jar; then
            HAMCREST_CORE_JAR=/usr/local/share/java/classes/hamcrest-core.jar
        fi
        # Sometimes the "-core-" part is missing...
        if test "$HAMCREST_CORE_JAR" = "" && test -e /usr/share/java/hamcrest1.3.jar; then
            HAMCREST_CORE_JAR=/usr/share/java/hamcrest1.3.jar
        fi
        if test "$HAMCREST_CORE_JAR" = "" && test -e /usr/local/share/java/classes/hamcrest1.3.jar; then
            HAMCREST_CORE_JAR=/usr/local/share/java/classes/hamcrest1.3.jar
        fi
        if test "$HAMCREST_CORE_JAR" = "" && test -e /usr/share/lib/java/hamcrest.jar; then
            HAMCREST_CORE_JAR=/usr/share/lib/java/hamcrest.jar
        fi
        if test "$HAMCREST_CORE_JAR" = "" && test -e /usr/local/share/lib/java/hamcrest.jar; then
            HAMCREST_CORE_JAR=/usr/local/share/lib/java/hamcrest.jar
        fi
        if test "$HAMCREST_CORE_JAR" = "" && test -e /usr/share/java/hamcrest.jar; then
            HAMCREST_CORE_JAR=/usr/share/java/hamcrest.jar
        fi
        if test "$HAMCREST_CORE_JAR" = "" && test -e /usr/local/share/java/classes/hamcrest.jar; then
            HAMCREST_CORE_JAR=/usr/local/share/java/classes/hamcrest.jar
        fi
    else
        HAMCREST_CORE_JAR=$with_hamcrest_core
    fi
    if test -e "$HAMCREST_CORE_JAR"; then
        AC_MSG_RESULT([yes])
        if test "$_os" = "WINNT"; then
            HAMCREST_CORE_JAR=`cygpath -m "$HAMCREST_CORE_JAR"`
        fi
    else
        if test "$JUNIT_NEEDS_HAMCREST" = "yes"; then
            AC_MSG_ERROR([cannot find hamcrest-core jar; please install one in the
default locations (/usr/share/java or /usr/local/share/java/classes), specify its
pathname via --with-hamcrest-core=..., or disable
it via --without-hamcrest-core or --without-junit])
        else
            AC_MSG_RESULT([no, skipping])
        fi
    fi
else
    if test "$JUNIT_NEEDS_HAMCREST" = "yes"; then
        AC_MSG_ERROR([JUnit needs Hamcrest but Hamcrest disabled.])
    fi
fi
AC_SUBST(HAMCREST_CORE_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
         *.png) ;;
         *)     bitmap= ; AC_MSG_WARN([Intro bitmaps should be .png 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
         *.png) ;;
         *)     bitmap= ; AC_MSG_WARN([About bitmaps should be .png 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 AOOs 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


