Search
j0ke.net Open Build Service
>
Projects
>
mozilla
>
MozillaFirefox
> gconf-backend.patch
Sign Up
|
Log In
Username
Password
Cancel
Overview
Repositories
Revisions
Requests
Users
Advanced
Attributes
Meta
File gconf-backend.patch of Package MozillaFirefox
diff --git a/mozilla/browser/installer/unix/packages-static b/mozilla/browser/installer/unix/packages-static index 65add5a..906b35f 100644 --- a/mozilla/browser/installer/unix/packages-static +++ b/mozilla/browser/installer/unix/packages-static @@ -211,6 +211,7 @@ bin/components/nsExtensionManager.js bin/components/nsUpdateService.js bin/components/extensions.xpt bin/components/update.xpt +bin/components/libsystem-pref-gconf.so bin/components/nsBookmarkTransactionManager.js bin/components/nsSessionStartup.js bin/components/nsSessionStore.js diff --git a/mozilla/browser/installer/unix/packages-static.orig b/mozilla/browser/installer/unix/packages-static.orig new file mode 100644 index 0000000..65add5a --- /dev/null +++ b/mozilla/browser/installer/unix/packages-static.orig @@ -0,0 +1,363 @@ +; Package file for Linux static Firefox build. +; +; File format: +; +; [] designates a toplevel component. Example: [xpcom] +; - in front of a file specifies it to be removed from the destination +; * wildcard support to recursively copy the entire directory +; ; file comment +; + +#filter substitution + +bin/.autoreg + +[@AB_CD@] +bin/chrome/@AB_CD@.jar +bin/chrome/@AB_CD@.manifest +bin/defaults/pref/firefox-l10n.js +bin/defaults/existing-profile-defaults.js +; If you add a new directory you must explicitly call addDirectory in ab-CD.jst +bin/browserconfig.properties +bin/old-homepage-default.properties +bin/searchplugins/* +bin/defaults/profile/bookmarks.html +bin/defaults/profile/localstore.rdf +bin/defaults/profile/prefs.js +bin/defaults/profile/search.rdf +bin/defaults/profile/mimeTypes.rdf +bin/defaults/profile/chrome/* +bin/updater.ini +bin/dictionaries/* + +[xpcom] +bin/libmozjs.so +bin/libplc4.so +bin/libplds4.so +bin/libxpcom.so +bin/libxpcom_core.so +bin/libxpistub.so +bin/libnspr4.so +bin/components/libxpinstall.so +bin/components/libjar50.so +bin/libxpcom_compat.so + +[browser] +; [Base Browser Files] +bin/firefox-bin +bin/firefox +bin/mozilla-xremote-client +bin/run-mozilla.sh +bin/plugins/libnullplugin.so +bin/res/cmessage.txt +bin/xpicleanup + +; [Components] +bin/components/accessibility.xpt +bin/components/accessibility-atk.xpt +bin/components/appshell.xpt +bin/components/appstartup.xpt +bin/components/autocomplete.xpt +bin/components/autoconfig.xpt +bin/components/bookmarks.xpt +bin/components/browsercompsbase.xpt +bin/components/browsersearch.xpt +bin/components/browser-feeds.xpt +bin/components/caps.xpt +bin/components/chardet.xpt +bin/components/chrome.xpt +bin/components/commandhandler.xpt +bin/components/commandlines.xpt +bin/components/composer.xpt +bin/components/content_base.xpt +bin/components/content_htmldoc.xpt +bin/components/content_html.xpt +bin/components/content_xmldoc.xpt +bin/components/content_xslt.xpt +bin/components/content_xtf.xpt +bin/components/cookie.xpt +bin/components/directory.xpt +bin/components/docshell.xpt +bin/components/dom.xpt +bin/components/dom_base.xpt +bin/components/dom_canvas.xpt +bin/components/dom_core.xpt +bin/components/dom_css.xpt +bin/components/dom_events.xpt +bin/components/dom_html.xpt +bin/components/dom_range.xpt +bin/components/dom_sidebar.xpt +bin/components/dom_storage.xpt +bin/components/dom_stylesheets.xpt +bin/components/dom_traversal.xpt +bin/components/dom_views.xpt +bin/components/dom_xbl.xpt +bin/components/dom_xpath.xpt +bin/components/dom_xul.xpt +bin/components/dom_loadsave.xpt +bin/components/downloads.xpt +bin/components/editor.xpt +bin/components/embed_base.xpt +bin/components/exthandler.xpt +bin/components/fastfind.xpt +bin/components/feeds.xpt +bin/components/filepicker.xpt +bin/components/find.xpt +bin/components/gfx.xpt +bin/components/helperAppDlg.xpt +bin/components/history.xpt +bin/components/htmlparser.xpt +bin/components/imglib2.xpt +; bin/components/imgicon.xpt +bin/components/intl.xpt +bin/components/jar.xpt +bin/components/jsconsole.xpt +bin/components/libjsd.so +bin/components/jsdservice.xpt +bin/components/layout_base.xpt +bin/components/layout_printing.xpt +bin/components/layout_xul_tree.xpt +bin/components/layout_xul.xpt +bin/components/inspector.xpt +bin/components/locale.xpt +bin/components/lwbrk.xpt +bin/components/microsummaries.xpt +bin/components/migration.xpt +bin/components/mimetype.xpt +bin/components/mozbrwsr.xpt +bin/components/mozfind.xpt +bin/components/necko_about.xpt +bin/components/necko_cache.xpt +bin/components/necko_cookie.xpt +bin/components/necko_data.xpt +bin/components/necko_dns.xpt +bin/components/necko_file.xpt +bin/components/necko_ftp.xpt +bin/components/necko_http.xpt +bin/components/necko_jar.xpt +bin/components/necko_res.xpt +bin/components/necko_socket.xpt +bin/components/necko_strconv.xpt +bin/components/necko_viewsource.xpt +bin/components/necko.xpt +bin/components/oji.xpt +bin/components/passwordmgr.xpt +bin/components/places.xpt +bin/components/plugin.xpt +bin/components/prefetch.xpt +bin/components/pref.xpt +bin/components/progressDlg.xpt +bin/components/proxyObjInst.xpt +bin/components/toolkitremote.xpt +bin/components/rdf.xpt +bin/components/satchel.xpt +bin/components/saxparser.xpt +bin/components/search.xpt +bin/components/shistory.xpt +bin/components/storage.xpt +bin/components/profile.xpt +bin/components/toolkitprofile.xpt +bin/components/txtsvc.xpt +bin/components/txmgr.xpt +bin/components/uconv.xpt +bin/components/unicharutil.xpt +bin/components/uriloader.xpt +bin/components/webBrowser_core.xpt +bin/components/webbrowserpersist.xpt +bin/components/webshell_idls.xpt +bin/components/websrvcs.xpt +bin/components/widget.xpt +bin/components/windowds.xpt +bin/components/windowwatcher.xpt +bin/components/xml-rpc.xpt +bin/components/xpcom_base.xpt +bin/components/xpcom_components.xpt +bin/components/xpcom_ds.xpt +bin/components/xpcom_io.xpt +bin/components/xpcom_obsolete.xpt +bin/components/xpcom_threads.xpt +bin/components/xpcom_xpti.xpt +bin/components/xpconnect.xpt +bin/components/xpinstall.xpt +bin/components/xremoteservice.xpt +bin/components/xulapp.xpt +bin/components/xuldoc.xpt +bin/components/xultmpl.xpt +bin/components/shellservice.xpt +; JavaScript components +bin/components/FeedProcessor.js +bin/components/FeedConverter.js +bin/components/FeedWriter.js +bin/components/WebContentConverter.js +bin/components/nsBrowserContentHandler.js +bin/components/nsBrowserGlue.js +bin/components/nsSetDefaultBrowser.js +bin/components/nsMicrosummaryService.js +bin/components/nsSearchService.js +bin/components/nsSearchSuggestions.js +bin/components/jsconsole-clhandler.js +bin/components/nsCloseAllWindows.js +bin/components/nsDictionary.js +bin/components/nsFilePicker.js +bin/components/nsHelperAppDlg.js +bin/components/nsInterfaceInfoToIDL.js +; bin/components/nsProgressDialog.js not needed for firefox +bin/components/nsProxyAutoConfig.js +; bin/components/nsResetPref.js not needed for firefox +bin/components/nsSidebar.js +; bin/components/nsUpdateNotifier.js not needed for firefox +bin/components/nsXmlRpcClient.js +bin/components/nsExtensionManager.js +bin/components/nsUpdateService.js +bin/components/extensions.xpt +bin/components/update.xpt +bin/components/nsBookmarkTransactionManager.js +bin/components/nsSessionStartup.js +bin/components/nsSessionStore.js +bin/components/sessionstore.xpt +bin/components/nsURLFormatter.js +bin/components/urlformatter.xpt +bin/components/nsDefaultCLH.js + +; Safe Browsing +bin/components/nsSafebrowsingApplication.js +bin/components/safebrowsing.xpt +bin/components/nsUrlClassifierListManager.js +bin/components/nsUrlClassifierLib.js +bin/components/nsUrlClassifierTable.js +bin/components/url-classifier.xpt + +; Kerberos NegotiateAuth +bin/components/libauth.so + +; GNOME hooks +bin/components/libmozgnome.so +bin/components/mozgnome.xpt + +; [Browser Chrome Files] +bin/chrome/browser.jar +bin/chrome/browser.manifest +bin/chrome/classic.jar +bin/chrome/classic.manifest +bin/extensions/{972ce4c6-7e08-4474-a285-3208198ce6fd}/install.rdf +bin/chrome/comm.jar +bin/chrome/comm.manifest +bin/chrome/toolkit.jar +bin/chrome/toolkit.manifest +bin/chrome/icons/default/default.xpm +bin/chrome/reporter.manifest +bin/chrome/reporter.jar +bin/defaults/pref/reporter.js + +; shell icons +bin/icons/*.xpm +bin/icons/*.png + +; [Default Preferences] +; All the pref files must be part of base to prevent migration bugs +bin/defaults/pref/firefox.js +bin/defaults/pref/firefox-branding.js +bin/defaults/pref/channel-prefs.js +bin/greprefs/all.js +bin/greprefs/security-prefs.js +bin/greprefs/xpinstall.js +bin/defaults/autoconfig/platform.js +bin/defaults/autoconfig/prefcalls.js + +; [Layout Engine Resources] +; Style Sheets, Graphics and other Resources used by the layout engine. +bin/res/hiddenWindow.html +bin/res/ua.css +bin/res/html.css +bin/res/quirk.css +bin/res/forms.css +bin/res/platform-forms.css +bin/res/EditorOverride.css +bin/res/table-add-column-after-active.gif +bin/res/table-add-column-after-hover.gif +bin/res/table-add-column-after.gif +bin/res/table-add-column-before-active.gif +bin/res/table-add-column-before-hover.gif +bin/res/table-add-column-before.gif +bin/res/table-add-row-after-active.gif +bin/res/table-add-row-after-hover.gif +bin/res/table-add-row-after.gif +bin/res/table-add-row-before-active.gif +bin/res/table-add-row-before-hover.gif +bin/res/table-add-row-before.gif +bin/res/table-remove-column-active.gif +bin/res/table-remove-column-hover.gif +bin/res/table-remove-column.gif +bin/res/table-remove-row-active.gif +bin/res/table-remove-row-hover.gif +bin/res/table-remove-row.gif +bin/res/arrowd.gif +bin/res/grabber.gif +bin/res/viewsource.css +bin/res/mathml.css +bin/res/arrow.gif +bin/res/loading-image.gif +bin/res/broken-image.gif +bin/res/fonts/* +bin/res/dtd/* +bin/res/html/* +bin/res/unixcharset.properties +bin/res/charsetalias.properties +bin/res/charsetData.properties +bin/res/langGroups.properties +bin/res/language.properties +bin/res/entityTables/* + +; svg +bin/res/svg.css +bin/components/dom_svg.xpt + +; spellchecker (may not be present) +bin/components/libmyspell.so +bin/components/spellchecker.xpt +bin/components/libspellchecker.so + +; [Personal Security Manager] +; +bin/libnssckbi.so +bin/components/pipboot.xpt +bin/components/pipnss.xpt +bin/components/pippki.xpt +bin/libnss3.so +bin/libsmime3.so +bin/libsoftokn3.chk +bin/libsoftokn3.so +bin/libfreebl3.chk +bin/libfreebl3.so +bin/libssl3.so +bin/chrome/pipnss.jar +bin/chrome/pippki.jar +bin/chrome/pippki.manifest + +; [Updater] +; +bin/updater + +; [Extensions] +; +bin/components/libnkgnomevfs.so +bin/components/libauth.so + +; [Additional Developer Tools] +[adt] +bin/extensions/inspector@mozilla.org/install.rdf +bin/extensions/inspector@mozilla.org/components/inspector-cmdline.js +bin/extensions/inspector@mozilla.org/chrome.manifest +bin/extensions/inspector@mozilla.org/chrome/inspector.jar +bin/extensions/inspector@mozilla.org/defaults/preferences/inspector.js + +; [Additional Browsing Enhancements] +[abe] + +[talkback] +bin/README.txt,bin/readme.txt +bin/extensions/talkback@mozilla.org/install.rdf +bin/extensions/talkback@mozilla.org/chrome.manifest +bin/extensions/talkback@mozilla.org/components/libqfaservices.so +bin/extensions/talkback@mozilla.org/components/qfaservices.xpt +bin/extensions/talkback@mozilla.org/components/talkback/* diff --git a/mozilla/config/autoconf.mk.in b/mozilla/config/autoconf.mk.in index becb493..9d6f480 100644 --- a/mozilla/config/autoconf.mk.in +++ b/mozilla/config/autoconf.mk.in @@ -226,6 +226,7 @@ MOZ_GNOMEUI_LIBS = @MOZ_GNOMEUI_LIBS@ MOZ_GNOMEVFS_CFLAGS = @MOZ_GNOMEVFS_CFLAGS@ MOZ_GNOMEVFS_LIBS = @MOZ_GNOMEVFS_LIBS@ +MOZ_ENABLE_GCONF = @MOZ_ENABLE_GCONF@ MOZ_GCONF_CFLAGS = @MOZ_GCONF_CFLAGS@ MOZ_GCONF_LIBS = @MOZ_GCONF_LIBS@ diff --git a/mozilla/configure.in b/mozilla/configure.in index 023d919..3cf3106 100644 --- a/mozilla/configure.in +++ b/mozilla/configure.in @@ -4774,6 +4774,7 @@ then ]) fi + AC_SUBST(MOZ_ENABLE_GCONF) AC_SUBST(MOZ_GCONF_CFLAGS) AC_SUBST(MOZ_GCONF_LIBS) diff --git a/mozilla/configure.in.orig b/mozilla/configure.in.orig new file mode 100644 index 0000000..023d919 --- /dev/null +++ b/mozilla/configure.in.orig @@ -0,0 +1,7647 @@ +dnl -*- Mode: Autoconf; tab-width: 4; indent-tabs-mode: nil; -*- +dnl vi: set tabstop=4 shiftwidth=4 expandtab: +dnl ***** BEGIN LICENSE BLOCK ***** +dnl Version: MPL 1.1/GPL 2.0/LGPL 2.1 +dnl +dnl The contents of this file are subject to the Mozilla Public License Version +dnl 1.1 (the "License"); you may not use this file except in compliance with +dnl the License. You may obtain a copy of the License at +dnl http://www.mozilla.org/MPL/ +dnl +dnl Software distributed under the License is distributed on an "AS IS" basis, +dnl WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +dnl for the specific language governing rights and limitations under the +dnl License. +dnl +dnl The Original Code is this file as it was released upon August 6, 1998. +dnl +dnl The Initial Developer of the Original Code is +dnl Christopher Seawood. +dnl Portions created by the Initial Developer are Copyright (C) 1998-2001 +dnl the Initial Developer. All Rights Reserved. +dnl +dnl Contributor(s): +dnl Jamie Zawinski <jwz@jwz.org> +dnl gettimeofday args check +dnl Christopher Blizzard <blizzard@appliedtheory.com> +dnl gnomefe update & enable-pthreads +dnl Ramiro Estrugo <ramiro@netscape.com> +dnl X11 makedepend support +dnl Insure support. +dnl Henry Sobotka <sobotka@axess.com> +dnl OS/2 support +dnl Dan Mosedale <dmose@mozilla.org> +dnl LDAP support +dnl Seth Spitzer <sspitzer@netscape.com> +dnl xpctools support +dnl Benjamin Smedberg <benjamin@smedbergs.us> +dnl Howard Chu <hyc@symas.com> +dnl MSYS support +dnl Mark Mentovai <mark@moxienet.com>: +dnl Mac OS X 10.4 support +dnl Giorgio Maone <g.maone@informaction.com> +dnl MSVC l10n compatible version check +dnl +dnl Alternatively, the contents of this file may be used under the terms of +dnl either the GNU General Public License Version 2 or later (the "GPL"), or +dnl the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), +dnl in which case the provisions of the GPL or the LGPL are applicable instead +dnl of those above. If you wish to allow use of your version of this file only +dnl under the terms of either the GPL or the LGPL, and not to allow others to +dnl use your version of this file under the terms of the MPL, indicate your +dnl decision by deleting the provisions above and replace them with the notice +dnl and other provisions required by the GPL or the LGPL. If you do not delete +dnl the provisions above, a recipient may use your version of this file under +dnl the terms of any one of the MPL, the GPL or the LGPL. +dnl +dnl ***** END LICENSE BLOCK ***** + +dnl Process this file with autoconf to produce a configure script. +dnl ======================================================== + +AC_PREREQ(2.13) +AC_INIT(config/config.mk) +AC_CONFIG_AUX_DIR(${srcdir}/build/autoconf) +AC_CANONICAL_SYSTEM +TARGET_CPU="${target_cpu}" +TARGET_VENDOR="${target_vendor}" +TARGET_OS="${target_os}" + +dnl ======================================================== +dnl = +dnl = Dont change the following two lines. Doing so breaks: +dnl = +dnl = CFLAGS="-foo" ./configure +dnl = +dnl ======================================================== +CFLAGS="${CFLAGS=}" +CPPFLAGS="${CPPFLAGS=}" +CXXFLAGS="${CXXFLAGS=}" +LDFLAGS="${LDFLAGS=}" +HOST_CFLAGS="${HOST_CFLAGS=}" +HOST_CXXFLAGS="${HOST_CXXFLAGS=}" +HOST_LDFLAGS="${HOST_LDFLAGS=}" + +dnl ======================================================== +dnl = Preserve certain environment flags passed to configure +dnl = We want sub projects to receive the same flags +dnl = untainted by this configure script +dnl ======================================================== +_SUBDIR_CC="$CC" +_SUBDIR_CXX="$CXX" +_SUBDIR_CFLAGS="$CFLAGS" +_SUBDIR_CPPFLAGS="$CPPFLAGS" +_SUBDIR_CXXFLAGS="$CXXFLAGS" +_SUBDIR_LDFLAGS="$LDFLAGS" +_SUBDIR_HOST_CC="$HOST_CC" +_SUBDIR_HOST_CFLAGS="$HOST_CFLAGS" +_SUBDIR_HOST_CXXFLAGS="$HOST_CXXFLAGS" +_SUBDIR_HOST_LDFLAGS="$HOST_LDFLAGS" +_SUBDIR_CONFIG_ARGS="$ac_configure_args" + +dnl Set the version number of the libs included with mozilla +dnl ======================================================== +MOZJPEG=62 +MOZPNG=10217 +MOZZLIB=1.2.3 +NSPR_VERSION=4 +NSS_VERSION=3 + +dnl Set the minimum version of toolkit libs used by mozilla +dnl ======================================================== +GLIB_VERSION=1.2.0 +GTK_VERSION=1.2.0 +LIBIDL_VERSION=0.6.3 +PERL_VERSION=5.004 +QT_VERSION=3.2.0 +QT_VERSION_NUM=320 +LIBART_VERSION=2.3.4 +CAIRO_VERSION=0.3.0 +GTK2_VERSION=1.3.7 +MAKE_VERSION=3.78 +WINDRES_VERSION=2.14.90 +W32API_VERSION=2.4 +GNOMEVFS_VERSION=2.0 +GNOMEUI_VERSION=2.2.0 +GCONF_VERSION=1.2.1 +LIBGNOME_VERSION=2.0 + +dnl Set various checks +dnl ======================================================== +MISSING_X= +AC_PROG_AWK + +dnl Initialize the Pthread test variables early so they can be +dnl overridden by each platform. +dnl ======================================================== +USE_PTHREADS= +_PTHREAD_LDFLAGS="" + +dnl Do not allow a separate objdir build if a srcdir build exists. +dnl ============================================================== +_topsrcdir=`cd \`dirname $0\`; pwd` +_objdir=`pwd` +if test "$_topsrcdir" != "$_objdir" +then + # Check for a couple representative files in the source tree + _conflict_files= + for file in $_topsrcdir/Makefile $_topsrcdir/config/autoconf.mk; do + if test -f $file; then + _conflict_files="$_conflict_files $file" + fi + done + if test "$_conflict_files"; then + echo "***" + echo "* Your source tree contains these files:" + for file in $_conflict_files; do + echo "* $file" + done + cat 1>&2 <<-EOF + * This indicates that you previously built in the source tree. + * A source tree build can confuse the separate objdir build. + * + * To clean up the source tree: + * 1. cd $_topsrcdir + * 2. gmake distclean + *** + EOF + exit 1 + break + fi +fi +MOZ_BUILD_ROOT=`pwd` + +dnl Default to MSVC for win32 +dnl ============================================================== +if test -z "$CROSS_COMPILE"; then +case "$target" in +*-cygwin*|*-mingw*|*-msvc*|*-mks*) + MAKE_VERSION=3.79 + if test -z "$CC"; then CC=cl; fi + if test -z "$CXX"; then CXX=cl; fi + if test -z "$CPP"; then CPP=cl; fi + if test -z "$LD"; then LD=link; fi + if test -z "$AS"; then AS=ml; fi + if test -z "$MIDL"; then MIDL=midl; fi + ;; +esac +fi + +COMPILE_ENVIRONMENT=1 +MOZ_ARG_ENABLE_BOOL(compile-environment, +[ --disable-compile-environment + Disable compiler/library checks.], + COMPILE_ENVIRONMENT=1, + COMPILE_ENVIRONMENT= ) + +AC_PATH_PROGS(NSINSTALL_BIN, nsinstall ) +if test -z "$COMPILE_ENVIRONMENT"; then +if test -z "$NSINSTALL_BIN" || test "$NSINSTALL_BIN" = ":"; then + AC_PATH_PROGS(PYTHON, $PYTHON python) + if test -z "$PYTHON"; then + AC_MSG_ERROR([python was not found in \$PATH]) + fi + echo PYTHON="$PYTHON" + NSINSTALL_BIN="$PYTHON \$(topsrcdir)/config/nsinstall.py" +fi +fi +AC_SUBST(NSINSTALL_BIN) + +dnl ======================================================== +dnl Checks for compilers. +dnl ======================================================== +dnl Set CROSS_COMPILE in the environment when running configure +dnl to use the cross-compile setup for now +dnl ======================================================== + +if test "$COMPILE_ENVIRONMENT"; then + +dnl Do some special WinCE toolchain stuff +case "$target" in +*wince) + echo ----------------------------------------------------------------------------- + echo Building Windows CE Shunt Library and Tool Chain + echo ----------------------------------------------------------------------------- + + echo -n "#define TOPSRCDIR \"" > $srcdir/build/wince/tools/topsrcdir.h + `$srcdir/build/cygwin-wrapper echo -n $_topsrcdir >> $srcdir/build/wince/tools/topsrcdir.h` + echo -n \" >> $srcdir/build/wince/tools/topsrcdir.h + + make -C $srcdir/build/wince/tools + echo ----------------------------------------------------------------------------- + ;; +esac + +if test -n "$CROSS_COMPILE" && test "$target" != "$host"; then + echo "cross compiling from $host to $target" + cross_compiling=yes + + _SAVE_CC="$CC" + _SAVE_CFLAGS="$CFLAGS" + _SAVE_LDFLAGS="$LDFLAGS" + + AC_MSG_CHECKING([for host c compiler]) + AC_CHECK_PROGS(HOST_CC, $HOST_CC gcc cc /usr/ucb/cc cl icc, "") + if test -z "$HOST_CC"; then + AC_MSG_ERROR([no acceptable c compiler found in \$PATH]) + fi + AC_MSG_RESULT([$HOST_CC]) + AC_MSG_CHECKING([for host c++ compiler]) + AC_CHECK_PROGS(HOST_CXX, $HOST_CXX $CCC c++ g++ gcc CC cxx cc++ cl icc, "") + if test -z "$HOST_CXX"; then + AC_MSG_ERROR([no acceptable c++ compiler found in \$PATH]) + fi + AC_MSG_RESULT([$HOST_CXX]) + + if test -z "$HOST_CFLAGS"; then + HOST_CFLAGS="$CFLAGS" + fi + if test -z "$HOST_CXXFLAGS"; then + HOST_CXXFLAGS="$CXXFLAGS" + fi + if test -z "$HOST_LDFLAGS"; then + HOST_LDFLAGS="$LDFLAGS" + fi + AC_CHECK_PROGS(HOST_RANLIB, $HOST_RANLIB ranlib, ranlib, :) + AC_CHECK_PROGS(HOST_AR, $HOST_AR ar, ar, :) + CC="$HOST_CC" + CFLAGS="$HOST_CFLAGS" + LDFLAGS="$HOST_LDFLAGS" + + AC_MSG_CHECKING([whether the host c compiler ($HOST_CC $HOST_CFLAGS $HOST_LDFLAGS) works]) + AC_TRY_COMPILE([], [return(0);], + [ac_cv_prog_hostcc_works=1 AC_MSG_RESULT([yes])], + AC_MSG_ERROR([installation or configuration problem: host compiler $HOST_CC cannot create executables.]) ) + + CC="$HOST_CXX" + CFLAGS="$HOST_CXXFLAGS" + + AC_MSG_CHECKING([whether the host c++ compiler ($HOST_CXX $HOST_CXXFLAGS $HOST_LDFLAGS) works]) + AC_TRY_COMPILE([], [return(0);], + [ac_cv_prog_hostcxx_works=1 AC_MSG_RESULT([yes])], + AC_MSG_ERROR([installation or configuration problem: host compiler $HOST_CXX cannot create executables.]) ) + + CC=$_SAVE_CC + CFLAGS=$_SAVE_CFLAGS + LDFLAGS=$_SAVE_LDFLAGS + + case "$build:$target" in + powerpc-apple-darwin8*:i?86-apple-darwin*) + dnl The Darwin cross compiler doesn't necessarily point itself at a + dnl root that has libraries for the proper architecture, it defaults + dnl to the system root. The libraries in the system root on current + dnl versions of PPC OS X 10.4 aren't fat, so these target compiler + dnl checks will fail. Fake a working SDK in that case. + _SAVE_CFLAGS=$CFLAGS + _SAVE_CXXFLAGS=$CXXLAGS + CFLAGS="-isysroot /Developer/SDKs/MacOSX10.4u.sdk $CFLAGS" + CXXFLAGS="-isysroot /Developer/SDKs/MacOSX10.4u.sdk $CXXFLAGS" + ;; + esac + + AC_CHECK_PROGS(CC, $CC "${target_alias}-gcc" "${target}-gcc", :) + unset ac_cv_prog_CC + AC_PROG_CC + AC_CHECK_PROGS(CXX, $CXX "${target_alias}-g++" "${target}-g++", :) + unset ac_cv_prog_CXX + AC_PROG_CXX + + case "$build:$target" in + powerpc-apple-darwin8*:i?86-apple-darwin*) + dnl Revert the changes made above. From this point on, the target + dnl compiler will never be used without applying the SDK to CFLAGS + dnl (see --with-macos-sdk below). + CFLAGS=$_SAVE_CFLAGS + CXXFLAGS=$_SAVE_CXXFLAGS + ;; + esac + + AC_CHECK_PROGS(RANLIB, $RANLIB "${target_alias}-ranlib" "${target}-ranlib", :) + AC_CHECK_PROGS(AR, $AR "${target_alias}-ar" "${target}-ar", :) + AC_PATH_PROGS(AS, $AS "${target_alias}-as" "${target}-as", :) + AC_CHECK_PROGS(LD, $LD "${target_alias}-ld" "${target}-ld", :) + AC_CHECK_PROGS(STRIP, $STRIP "${target_alias}-strip" "${target}-strip", :) + AC_CHECK_PROGS(WINDRES, $WINDRES "${target_alias}-windres" "${target}-windres", :) + AC_DEFINE(CROSS_COMPILE) +else + AC_PROG_CC + AC_PROG_CXX + AC_PROG_RANLIB + AC_PATH_PROGS(AS, $AS as, $CC) + AC_CHECK_PROGS(AR, ar, :) + AC_CHECK_PROGS(LD, ld, :) + AC_CHECK_PROGS(STRIP, strip, :) + AC_CHECK_PROGS(WINDRES, windres, :) + if test -z "$HOST_CC"; then + HOST_CC="$CC" + fi + if test -z "$HOST_CFLAGS"; then + HOST_CFLAGS="$CFLAGS" + fi + if test -z "$HOST_CXX"; then + HOST_CXX="$CXX" + fi + if test -z "$HOST_CXXFLAGS"; then + HOST_CXXFLAGS="$CXXFLAGS" + fi + if test -z "$HOST_LDFLAGS"; then + HOST_LDFLAGS="$LDFLAGS" + fi + if test -z "$HOST_RANLIB"; then + HOST_RANLIB="$RANLIB" + fi + if test -z "$HOST_AR"; then + HOST_AR="$AR" + fi +fi + +GNU_AS= +GNU_LD= +GNU_CC= +GNU_CXX= +CC_VERSION='N/A' +CXX_VERSION='N/A' +if test "$GCC" = "yes"; then + GNU_CC=1 + CC_VERSION=`$CC -v 2>&1 | grep 'gcc version'` +fi +if test "$GXX" = "yes"; then + GNU_CXX=1 + CXX_VERSION=`$CXX -v 2>&1 | grep 'gcc version'` +fi +if test "`echo | $AS -v 2>&1 | grep -c GNU`" != "0"; then + GNU_AS=1 +fi +if test "`echo | $LD -v 2>&1 | grep -c GNU`" != "0"; then + GNU_LD=1 +fi +if test "$GNU_CC"; then + if `$CC -print-prog-name=ld` -v 2>&1 | grep -c GNU >/dev/null; then + GCC_USE_GNU_LD=1 + fi +fi + +dnl Special win32 checks +dnl ======================================================== +case "$target" in +*-cygwin*|*-mingw*|*-msvc*|*-mks*|*-wince) + if test "$GCC" != "yes"; then + # Check to see if we are really running in a msvc environemnt + _WIN32_MSVC=1 + AC_CHECK_PROGS(MIDL, midl) + + # Make sure compilers are valid + CFLAGS="$CFLAGS -TC -nologo" + CXXFLAGS="$CXXFLAGS -TP -nologo" + AC_LANG_SAVE + AC_LANG_C + AC_TRY_COMPILE([#include <stdio.h>], + [ printf("Hello World\n"); ],, + AC_MSG_ERROR([\$(CC) test failed. You must have MS VC++ in your path to build.]) ) + + AC_LANG_CPLUSPLUS + AC_TRY_COMPILE([#include <new.h>], + [ unsigned *test = new unsigned(42); ],, + AC_MSG_ERROR([\$(CXX) test failed. You must have MS VC++ in your path to build.]) ) + AC_LANG_RESTORE + + _MSVC_VER_FILTER='s|.* \([[0-9]][[0-9]]*\.[[0-9]][[0-9]]*\.[[0-9]][[0-9]]*\).*|\1|p' + + # Determine compiler version + CC_VERSION=`"${CC}" -v 2>&1 | sed -ne "$_MSVC_VER_FILTER"` + _CC_MAJOR_VERSION=`echo ${CC_VERSION} | $AWK -F\. '{ print $1 }'` + _CC_MINOR_VERSION=`echo ${CC_VERSION} | $AWK -F\. '{ print $2 }'` + _MSC_VER=${_CC_MAJOR_VERSION}${_CC_MINOR_VERSION} + + CXX_VERSION=`"${CXX}" -v 2>&1 | sed -ne "$_MSVC_VER_FILTER"` + _CXX_MAJOR_VERSION=`echo ${CXX_VERSION} | $AWK -F\. '{ print $1 }'` + + if test "$_CC_MAJOR_VERSION" != "$_CXX_MAJOR_VERSION"; then + AC_MSG_ERROR([The major versions of \$CC and \$CXX do not match.]) + fi + if test "$_CC_MAJOR_VERSION" = "12"; then + _CC_SUITE=6 + elif test "$_CC_MAJOR_VERSION" = "13"; then + _CC_SUITE=7 + elif test "$_CC_MAJOR_VERSION" = "14"; then + _CC_SUITE=8 + else + AC_MSG_ERROR([This version of the MSVC compiler, $CC_VERSION , is unsupported.]) + fi + + # Check linker version + _LD_FULL_VERSION=`"${LD}" -v 2>&1 | sed -ne "$_MSVC_VER_FILTER"` + _LD_MAJOR_VERSION=`echo ${_LD_FULL_VERSION} | $AWK -F\. '{ print $1 }'` + if test "$_LD_MAJOR_VERSION" != "$_CC_SUITE"; then + AC_MSG_ERROR([The linker major version, $_LD_FULL_VERSION, does not match the compiler suite version, $_CC_SUITE.]) + fi + INCREMENTAL_LINKER=1 + + # Check midl version + _MIDL_FULL_VERSION=`"${MIDL}" -v 2>&1 | sed -ne "$_MSVC_VER_FILTER"` + _MIDL_MAJOR_VERSION=`echo ${_MIDL_FULL_VERSION} | $AWK -F\. '{ print $1 }'` + _MIDL_MINOR_VERSION=`echo ${_MIDL_FULL_VERSION} | $AWK -F\. '{ print $2 }'` + _MIDL_REV_VERSION=`echo ${_MIDL_FULL_VERSION} | $AWK -F\. '{ print $3 }'` + # Add flags if necessary + AC_MSG_CHECKING([for midl flags]) + if test \( "$_MIDL_MAJOR_VERSION" -gt "6" \) -o \( "$_MIDL_MAJOR_VERSION" = "6" -a "$_MIDL_MINOR_VERSION" -gt "0" \) -o \( "$_MIDL_MAJOR_VERSION" = "6" -a "$_MIDL_MINOR_VERSION" = "00" -a "$_MIDL_REV_VERSION" -gt "359" \); then + # Starting with MIDL version 6.0.359, the MIDL compiler + # generates /Oicf /robust stubs by default, which is not + # compatible with versions of Windows older than Win2k. + # This switches us back to the old behaviour. When we drop + # support for Windows older than Win2k, we should remove + # this. + MIDL_FLAGS="${MIDL_FLAGS} -no_robust" + AC_MSG_RESULT([need -no_robust]) + else + MIDL_FLAGS="${MIDL_FLAGS}" + AC_MSG_RESULT([none needed]) + fi + + unset _MSVC_VER_FILTER + + else + # Check w32api version + _W32API_MAJOR_VERSION=`echo $W32API_VERSION | $AWK -F\. '{ print $1 }'` + _W32API_MINOR_VERSION=`echo $W32API_VERSION | $AWK -F\. '{ print $2 }'` + AC_MSG_CHECKING([for w32api version >= $W32API_VERSION]) + AC_TRY_COMPILE([#include <w32api.h>], + #if (__W32API_MAJOR_VERSION < $_W32API_MAJOR_VERSION) || \ + (__W32API_MAJOR_VERSION == $_W32API_MAJOR_VERSION && \ + __W32API_MINOR_VERSION < $_W32API_MINOR_VERSION) + #error "test failed." + #endif + , [ res=yes ], [ res=no ]) + AC_MSG_RESULT([$res]) + if test "$res" != "yes"; then + AC_MSG_ERROR([w32api version $W32API_VERSION or higher required.]) + fi + # Check windres version + AC_MSG_CHECKING([for windres version >= $WINDRES_VERSION]) + _WINDRES_VERSION=`${WINDRES} --version 2>&1 | grep -i windres 2>/dev/null | $AWK '{ print $3 }'` + AC_MSG_RESULT([$_WINDRES_VERSION]) + _WINDRES_MAJOR_VERSION=`echo $_WINDRES_VERSION | $AWK -F\. '{ print $1 }'` + _WINDRES_MINOR_VERSION=`echo $_WINDRES_VERSION | $AWK -F\. '{ print $2 }'` + _WINDRES_RELEASE_VERSION=`echo $_WINDRES_VERSION | $AWK -F\. '{ print $3 }'` + WINDRES_MAJOR_VERSION=`echo $WINDRES_VERSION | $AWK -F\. '{ print $1 }'` + WINDRES_MINOR_VERSION=`echo $WINDRES_VERSION | $AWK -F\. '{ print $2 }'` + WINDRES_RELEASE_VERSION=`echo $WINDRES_VERSION | $AWK -F\. '{ print $3 }'` + if test "$_WINDRES_MAJOR_VERSION" -lt "$WINDRES_MAJOR_VERSION" -o \ + "$_WINDRES_MAJOR_VERSION" -eq "$WINDRES_MAJOR_VERSION" -a \ + "$_WINDRES_MINOR_VERSION" -lt "$WINDRES_MINOR_VERSION" -o \ + "$_WINDRES_MAJOR_VERSION" -eq "$WINDRES_MAJOR_VERSION" -a \ + "$_WINDRES_MINOR_VERSION" -eq "$WINDRES_MINOR_VERSION" -a \ + "$_WINDRES_RELEASE_VERSION" -lt "$WINDRES_RELEASE_VERSION" + then + AC_MSG_ERROR([windres version $WINDRES_VERSION or higher is required to build.]) + fi + fi # !GNU_CC + ;; +esac + +if test -n "$_WIN32_MSVC"; then + SKIP_PATH_CHECKS=1 + SKIP_COMPILER_CHECKS=1 + SKIP_LIBRARY_CHECKS=1 + AC_CHECK_HEADERS(mmintrin.h) +fi + +dnl Test breaks icc on OS/2 && MSVC +if test "$CC" != "icc" -a -z "$_WIN32_MSVC"; then + AC_PROG_CC_C_O + if grep "NO_MINUS_C_MINUS_O 1" ./confdefs.h >/dev/null; then + USING_HCC=1 + _OLDCC=$CC + _OLDCXX=$CXX + CC="${srcdir}/build/hcc '$CC'" + CXX="${srcdir}/build/hcpp '$CXX'" + fi +fi + +AC_PROG_CPP +AC_PROG_CXXCPP + +fi # COMPILE_ENVIRONMENT + +AC_SUBST(MIDL_FLAGS) +AC_SUBST(_MSC_VER) + +AC_SUBST(GNU_AS) +AC_SUBST(GNU_LD) +AC_SUBST(GNU_CC) +AC_SUBST(GNU_CXX) + +dnl ======================================================== +dnl Checks for programs. +dnl ======================================================== +AC_PROG_INSTALL +AC_PROG_LN_S +AC_PATH_PROGS(PERL, $PERL perl5 perl ) +if test -z "$PERL" || test "$PERL" = ":"; then + AC_MSG_ERROR([perl not found in \$PATH]) +fi + +AC_MSG_CHECKING([for minimum required perl version >= $PERL_VERSION]) +_perl_version=`PERL_VERSION=$PERL_VERSION $PERL -e 'print "$]"; if ($] >= $ENV{PERL_VERSION}) { exit(0); } else { exit(1); }' 2>&5` +_perl_res=$? +AC_MSG_RESULT([$_perl_version]) + +if test "$_perl_res" != 0; then + AC_MSG_ERROR([Perl $PERL_VERSION or higher is required.]) +fi + +AC_MSG_CHECKING([for full perl installation]) +_perl_archlib=`$PERL -e 'use Config; if ( -d $Config{archlib} ) { exit(0); } else { exit(1); }' 2>&5` +_perl_res=$? +if test "$_perl_res" != 0; then + AC_MSG_RESULT([no]) + AC_MSG_ERROR([Cannot find Config.pm or \$Config{archlib}. A full perl installation is required.]) +else + AC_MSG_RESULT([yes]) +fi + +AC_PATH_PROG(DOXYGEN, doxygen, :) +AC_PATH_PROG(WHOAMI, whoami, :) +AC_PATH_PROG(AUTOCONF, autoconf, :) +AC_PATH_PROG(UNZIP, unzip, :) +AC_PATH_PROGS(ZIP, zip) +if test -z "$ZIP" || test "$ZIP" = ":"; then + AC_MSG_ERROR([zip not found in \$PATH]) +fi +AC_PATH_PROG(SYSTEM_MAKEDEPEND, makedepend) +AC_PATH_PROG(XARGS, xargs) +if test -z "$XARGS" || test "$XARGS" = ":"; then + AC_MSG_ERROR([xargs not found in \$PATH .]) +fi + +if test "$COMPILE_ENVIRONMENT"; then + +dnl ======================================================== +dnl = Mac OS X toolchain support +dnl ======================================================== + +case "$target_os" in +darwin*) + dnl Current known valid versions for GCC_VERSION are 2.95.2 3.1 3.3 4.0. + dnl 4.0 identifies itself as 4.0.x, so strip the decidecimal for + dnl the environment and includedir purposes (when using an SDK, below), + dnl but remember the full version number for the libdir (SDK). + changequote(,) + GCC_VERSION_FULL=`echo $CXX_VERSION | $PERL -pe 's/^.*gcc version ([^ ]*).*/$1/'` + GCC_VERSION=`echo $GCC_VERSION_FULL | $PERL -pe '(split(/\./))[0]>=4&&s/(^\d*\.\d*).*/$1/;'` + changequote([,]) + if test "$GCC_VERSION_FULL" = "4.0.0" ; then + dnl Bug 280479, but this keeps popping up in bug 292530 too because + dnl 4.0.0/4061 is the default compiler in Tiger. + changequote(,) + GCC_BUILD=`echo $CXX_VERSION | $PERL -pe 's/^.*build ([^ )]*).*/$1/'` + changequote([,]) + if test "$GCC_BUILD" = "4061" ; then + AC_MSG_ERROR([You are attempting to use Apple gcc 4.0 build 4061. +This compiler was supplied with Xcode 2.0, and contains bugs that prevent it +from building Mozilla. +Either upgrade to Xcode 2.1 or later, or switch the system's default compiler +to gcc 3.3 by running \"sudo gcc_select 3.3\".]) + fi + fi + + dnl xcodebuild needs GCC_VERSION defined in the environment, since it + dnl doesn't respect the CC/CXX setting. With GCC_VERSION set, it will use + dnl /usr/bin/g(cc|++)-$GCC_VERSION. + AC_PATH_PROGS(PBBUILD, pbbuild xcodebuild pbxbuild) + + case "$PBBUILD" in + *xcodebuild*) + changequote(,) + XCODEBUILD_VERSION=`$PBBUILD -version 2>/dev/null | xargs | sed -e 's/.*DevToolsCore-\([0-9]*\).*/\1/'` + changequote([,]) + if test -n "$XCODEBUILD_VERSION" && test "$XCODEBUILD_VERSION" -ge 620 ; then + HAS_XCODE_2_1=1; + fi + ;; + esac + + dnl sdp was formerly in /Developer/Tools. As of Mac OS X 10.4 (Darwin 8), + dnl it has moved into /usr/bin. + AC_PATH_PROG(SDP, sdp, :, [$PATH:/usr/bin:/Developer/Tools]) + ;; +esac + +AC_SUBST(GCC_VERSION) +AC_SUBST(XCODEBUILD_VERSION) +AC_SUBST(HAS_XCODE_2_1) + +dnl The universal machinery sets UNIVERSAL_BINARY to inform packager.mk +dnl that a universal binary is being produced. +AC_SUBST(UNIVERSAL_BINARY) + +dnl ======================================================== +dnl Check for MacOS deployment target version +dnl ======================================================== + +MOZ_ARG_ENABLE_STRING(macos-target, + [ --enable-macos-target=VER (default=10.2/ppc, 10.4/x86) + Set the minimum MacOS version needed at runtime], + [_MACOSX_DEPLOYMENT_TARGET=$enableval]) + +case "$target" in +*-darwin*) + if test -n "$_MACOSX_DEPLOYMENT_TARGET" ; then + dnl Use the specified value + export MACOSX_DEPLOYMENT_TARGET=$_MACOSX_DEPLOYMENT_TARGET + elif test -z "$MACOSX_DEPLOYMENT_TARGET" ; then + dnl No value specified on the command line or in the environment, + dnl use the lesser of the application's minimum or the architecture's + dnl minimum. + case "${target_cpu}" in + powerpc*) + dnl Architecture minimum 10.1 + export MACOSX_DEPLOYMENT_TARGET=10.2 + ;; + i*86*) + dnl Architecture minimum 10.4 + export MACOSX_DEPLOYMENT_TARGET=10.4 + ;; + esac + fi + ;; +esac + +AC_SUBST(MACOSX_DEPLOYMENT_TARGET) + +dnl ======================================================== +dnl = Mac OS X SDK support +dnl ======================================================== +MACOS_SDK_DIR= +NEXT_ROOT= +MOZ_ARG_WITH_STRING(macos-sdk, +[ --with-macos-sdk=dir Location of platform SDK to use (Mac OS X only)], + MACOS_SDK_DIR=$withval) + +dnl MACOS_SDK_DIR will be set to the SDK location whenever one is in use. +dnl NEXT_ROOT will be set and exported only if it's needed. +AC_SUBST(MACOS_SDK_DIR) +AC_SUBST(NEXT_ROOT) + +if test "$MACOS_SDK_DIR"; then + dnl Sync this section with the ones in NSPR and NSS. + dnl Changes to the cross environment here need to be accounted for in + dnl the libIDL checks (below) and xpidl build. + + if test ! -d "$MACOS_SDK_DIR"; then + AC_MSG_ERROR([SDK not found. When using --with-macos-sdk, you must +specify a valid SDK. SDKs are installed when the optional cross-development +tools are selected during the Xcode/Developer Tools installation.]) + fi + + GCC_VERSION_MAJOR=`echo $GCC_VERSION_FULL | $PERL -pe 's/(^\d*).*/$1/;'` + if test "$GCC_VERSION_MAJOR" -lt "4" ; then + SDK_C_INCLUDE="-isystem ${MACOS_SDK_DIR}/usr/include/gcc/darwin/${GCC_VERSION} -isystem ${MACOS_SDK_DIR}/usr/include -F${MACOS_SDK_DIR}/System/Library/Frameworks" + if test -d "${MACOS_SDK_DIR}/Library/Frameworks" ; then + SDK_C_INCLUDE="$SDK_C_INCLUDE -F${MACOS_SDK_DIR}/Library/Frameworks" + fi + SDK_CXX_INCLUDE="-I${MACOS_SDK_DIR}/usr/include/gcc/darwin/${GCC_VERSION}/c++ -I${MACOS_SDK_DIR}/usr/include/gcc/darwin/${GCC_VERSION}/c++/ppc-darwin -I${MACOS_SDK_DIR}/usr/include/gcc/darwin/${GCC_VERSION}/c++/backward" + + CFLAGS="$CFLAGS -nostdinc ${SDK_C_INCLUDE}" + CXXFLAGS="$CXXFLAGS -nostdinc -nostdinc++ ${SDK_CXX_INCLUDE} ${SDK_C_INCLUDE}" + + dnl CPP/CXXCPP needs to be set for AC_CHECK_HEADER. + CPP="$CPP -nostdinc ${SDK_C_INCLUDE}" + CXXCPP="$CXXCPP -nostdinc -nostdinc++ ${SDK_CXX_INCLUDE} ${SDK_C_INCLUDE}" + + changequote(,) + HOST_DARWIN_MAJOR=`echo "$build_os" | sed -E -e 's/^darwin([0-9]+).*$/\1/'` + changequote([,]) + if test "$HOST_DARWIN_MAJOR" -lt 9 ; then + dnl The build host is running Tiger (10.4) or earlier. ld support for + dnl -syslibroot is compiler-agnostic, but only available on Tiger and + dnl later. On Tiger and earlier build hosts, just rely on NEXT_ROOT, + dnl because it's not been shown to cause any problems. + + LIBS="-L${MACOS_SDK_DIR}/usr/lib/gcc/darwin -L${MACOS_SDK_DIR}/usr/lib/gcc/darwin/${GCC_VERSION_FULL} -L${MACOS_SDK_DIR}/usr/lib $LIBS" + else + dnl The build host is running Leopard (10.5) or later. With NEXT_ROOT + dnl set, the linker will still not apply it when resolving dependencies. + dnl This causes problems on Leopard, where an SDK depends on frameworks + dnl which were present in earlier OS releases (and the associated SDK) + dnl but not in Leopard. -syslibroot does not have this problem, but it + dnl results in harmless warnings when NEXT_ROOT is set. NEXT_ROOT needs + dnl to remain set even on Leopard because the compiler uses it too. + LIBS="-Wl,-syslibroot,${MACOS_SDK_DIR} $LIBS" + fi + export NEXT_ROOT=$MACOS_SDK_DIR + + if test -n "$CROSS_COMPILE" ; then + dnl NEXT_ROOT will be in the environment, but it shouldn't be set for + dnl the build host. HOST_CXX is presently unused. + HOST_CC="NEXT_ROOT= $HOST_CC" + HOST_CXX="NEXT_ROOT= $HOST_CXX" + fi + else + dnl gcc >= 4.0 uses different paths than above, but knows how to find + dnl them itself. + CFLAGS="$CFLAGS -isysroot ${MACOS_SDK_DIR}" + CXXFLAGS="$CXXFLAGS -isysroot ${MACOS_SDK_DIR}" + + dnl CPP/CXXCPP needs to be set for AC_CHECK_HEADER. + CPP="$CPP -isysroot ${MACOS_SDK_DIR}" + CXXCPP="$CXXCPP -isysroot ${MACOS_SDK_DIR}" + + if test "$GCC_VERSION_FULL" = "4.0.0" ; then + dnl If gcc >= 4.0, we're guaranteed to be on Tiger, which has an ld + dnl that supports -syslibroot. Don't set NEXT_ROOT because it will + dnl be ignored and cause warnings when -syslibroot is specified. + dnl gcc 4.0.1 will pass -syslibroot to ld automatically based on + dnl the -isysroot it receives, so this is only needed with 4.0.0. + LDFLAGS="$LDFLAGS -Wl,-syslibroot,${MACOS_SDK_DIR}" + fi + fi + + AC_MSG_CHECKING([for valid compiler/Mac OS X SDK combination]) + AC_LANG_CPLUSPLUS + AC_TRY_COMPILE([#include <new> + int main() { return 0; }], + result=yes, + result=no) + AC_LANG_RESTORE + AC_MSG_RESULT($result) + + if test "$result" = "no" ; then + AC_MSG_ERROR([The selected compiler and Mac OS X SDK are incompatible.]) + fi +fi + +fi # COMPILE_ENVIRONMENT + +dnl Be sure the make we use is GNU make. +dnl on win32, gmake.exe is the generally the wrong version +case "$host_os" in +cygwin*|mingw*|mks*|msvc*) + AC_PATH_PROGS(MAKE, $MAKE make gmake, :) + ;; +*) + AC_PATH_PROGS(MAKE, $MAKE gmake make, :) + ;; +esac +_make_try=`$MAKE --version 2>/dev/null | grep GNU` +if test ! "$_make_try" +then + echo + echo "*** $MAKE is not GNU Make. You will not be able to build Mozilla without GNU Make." + echo + exit 1 +fi +dnl Now exit if version if < MAKE_VERSION +rm -f dummy.mk +echo 'all: ; @echo $(MAKE_VERSION)' > dummy.mk +_make_vers=`$MAKE --no-print-directory -f dummy.mk all 2>/dev/null` +rm -f dummy.mk +_MAKE_MAJOR_VERSION=`echo $_make_vers | $AWK -F\. '{ print $1 }'` +_MAKE_MINOR_VERSION=`echo $_make_vers | $AWK -F\. '{ print $2 }'` +MAKE_MAJOR_VERSION=`echo $MAKE_VERSION | $AWK -F\. '{ print $1 }'` +MAKE_MINOR_VERSION=`echo $MAKE_VERSION | $AWK -F\. '{ print $2 }'` +if test "$_MAKE_MAJOR_VERSION" -lt "$MAKE_MAJOR_VERSION" || \ + test "$_MAKE_MAJOR_VERSION" = "$MAKE_MAJOR_VERSION" -a \ + "$_MAKE_MINOR_VERSION" -lt "$MAKE_MINOR_VERSION"; then + AC_MSG_ERROR([GNU Make $MAKE_VERSION or higher is required to build Mozilla.]) +fi +AC_SUBST(MAKE) + +if test "$COMPILE_ENVIRONMENT"; then + +AC_PATH_XTRA + +dnl Check in X11 include directory too. +if test "$no_x" != "yes"; then + CPPFLAGS="$CPPFLAGS $X_CFLAGS" +fi + +XCFLAGS="$X_CFLAGS" + +fi # COMPILE_ENVIRONMENT + +dnl ======================================================== +dnl set the defaults first +dnl ======================================================== +AS_BIN=$AS +AR_FLAGS='cr $@' +AR_LIST='$(AR) t' +AR_EXTRACT='$(AR) x' +AR_DELETE='$(AR) d' +AS='$(CC)' +AS_DASH_C_FLAG='-c' +DLL_PREFIX=lib +LIB_PREFIX=lib +DLL_SUFFIX=.so +OBJ_SUFFIX=o +LIB_SUFFIX=a +ASM_SUFFIX=s +IMPORT_LIB_SUFFIX= +TARGET_MD_ARCH=unix +DIRENT_INO=d_ino +CYGWIN_WRAPPER= +WIN_TOP_SRC= +MOZ_USER_DIR=".mozilla" +HOST_AR='$(AR)' +HOST_AR_FLAGS='$(AR_FLAGS)' + +MOZ_JPEG_CFLAGS= +MOZ_JPEG_LIBS='-L$(DIST)/lib -lmozjpeg' +MOZ_ZLIB_CFLAGS= +MOZ_ZLIB_LIBS='-L$(DIST)/lib -lmozz' +MOZ_PNG_CFLAGS= +MOZ_PNG_LIBS='-L$(DIST)/lib -lmozpng' + +MOZ_JS_LIBS='-L$(DIST)/bin -lmozjs' +DYNAMIC_XPCOM_LIBS='-L$(DIST)/bin -lxpcom -lxpcom_core' +MOZ_FIX_LINK_PATHS='-Wl,-rpath-link,$(DIST)/bin' +XPCOM_FROZEN_LDOPTS='-L$(DIST)/bin $(MOZ_FIX_LINK_PATHS) -lxpcom' +LIBXUL_LIBS='$(XPCOM_FROZEN_LDOPTS) -lxul' +XPCOM_GLUE_LDOPTS='$(DIST)/lib/$(LIB_PREFIX)xpcomglue_s.$(LIB_SUFFIX) $(XPCOM_FROZEN_LDOPTS)' +XPCOM_STANDALONE_GLUE_LDOPTS='$(DIST)/lib/$(LIB_PREFIX)xpcomglue.$(LIB_SUFFIX)' + +MOZ_COMPONENT_NSPR_LIBS='-L$(DIST)/bin $(NSPR_LIBS)' +MOZ_XPCOM_OBSOLETE_LIBS='-L$(DIST)/lib -lxpcom_compat' + +USE_DEPENDENT_LIBS=1 + +_PLATFORM_DEFAULT_TOOLKIT=gtk2 +MOZ_GFX_TOOLKIT='$(MOZ_WIDGET_TOOLKIT)' +MOZ_WIDGET_TOOLKIT_LDFLAGS='-lwidget_$(MOZ_WIDGET_TOOLKIT)' +MOZ_GFX_TOOLKIT_LDFLAGS='-lgfx_$(MOZ_GFX_TOOLKIT) $(MOZ_XLIBRGB_LDFLAGS)' +WIDGET_DLL='\"libwidget_$(MOZ_WIDGET_TOOLKIT)$(DLL_SUFFIX)\"' +GFXWIN_DLL='\"libgfx_$(MOZ_GFX_TOOLKIT)$(DLL_SUFFIX)\"' + +MOZ_ENABLE_POSTSCRIPT=1 + +if test -n "$CROSS_COMPILE"; then + OS_TARGET="${target_os}" + OS_ARCH=`echo $target_os | sed -e 's|/|_|g'` + OS_RELEASE= + OS_TEST="${target_cpu}" + case "${target_os}" in + linux*) OS_ARCH=Linux ;; + solaris*) OS_ARCH=SunOS OS_RELEASE=5 ;; + mingw*) OS_ARCH=WINNT ;; + wince*) OS_ARCH=WINCE ;; + darwin*) OS_ARCH=Darwin OS_TARGET=Darwin ;; + esac +else + OS_TARGET=`uname -s` + OS_ARCH=`uname -s | sed -e 's|/|_|g'` + OS_RELEASE=`uname -r` + OS_TEST=`uname -m` +fi +_COMPILER_PREFIX= + +HOST_OS_ARCH=`echo $host_os | sed -e 's|/|_|g'` + +####################################################################### +# Master "Core Components" macros for getting the OS target # +####################################################################### + +# +# Note: OS_TARGET should be specified on the command line for gmake. +# When OS_TARGET=WIN95 is specified, then a Windows 95 target is built. +# The difference between the Win95 target and the WinNT target is that +# the WinNT target uses Windows NT specific features not available +# in Windows 95. The Win95 target will run on Windows NT, but (supposedly) +# at lesser performance (the Win95 target uses threads; the WinNT target +# uses fibers). +# +# When OS_TARGET=WIN16 is specified, then a Windows 3.11 (16bit) target +# is built. See: win16_3.11.mk for lots more about the Win16 target. +# +# If OS_TARGET is not specified, it defaults to $(OS_ARCH), i.e., no +# cross-compilation. +# + +# +# The following hack allows one to build on a WIN95 machine (as if +# s/he were cross-compiling on a WINNT host for a WIN95 target). +# It also accomodates for MKS's uname.exe. If you never intend +# to do development on a WIN95 machine, you don't need this hack. +# +case "$OS_ARCH" in +WIN95) + OS_ARCH=WINNT + OS_TARGET=WIN95 + ;; +Windows_95) + OS_ARCH=Windows_NT + OS_TARGET=WIN95 + ;; +Windows_98) + OS_ARCH=Windows_NT + OS_TARGET=WIN95 + ;; +CYGWIN_9*|CYGWIN_ME*) + OS_ARCH='CYGWIN_NT-4.0' + OS_TARGET=WIN95 + ;; +esac + +# +# Define and override various archtecture-specific variables, including +# HOST_OS_ARCH +# OS_ARCH +# OS_TEST +# OS_TARGET +# OS_RELEASE +# OS_MINOR_RELEASE +# + +case "$HOST_OS_ARCH" in +cygwin*|mingw*|mks*|msvc*) + HOST_OS_ARCH=WINNT + ;; +linux*) + HOST_OS_ARCH=Linux + ;; +solaris*) + HOST_OS_ARCH=SunOS + ;; +BSD_386) + HOST_OS_ARCH=BSD + ;; +dgux) + HOST_OS_ARCH=DGUX + ;; +IRIX64) + HOST_OS_ARCH=IRIX + ;; +UNIX_SV) + if "`cat /etc/bcheckrc | grep -c NCR 2>/dev/null`" != "0"; then + HOST_OS_ARCH=NCR + else + HOST_OS_ARCH=UNIXWARE + fi + ;; +ncr) + HOST_OS_ARCH=NCR + ;; +UNIX_SYSTEM_V) + HOST_OS_ARCH=NEC + ;; +OSF1) + ;; +*OpenVMS*) + HOST_OS_ARCH=OpenVMS + ;; +OS_2) + HOST_OS_ARCH=OS2 + ;; +QNX) + ;; +SCO_SV) + HOST_OS_ARCH=SCOOS + ;; +SINIX-N | SINIX-Y | SINIX-Z |ReliantUNIX-M) + HOST_OS_ARCH=SINIX + ;; +UnixWare) + HOST_OS_ARCH=UNIXWARE + ;; +esac + +case "$OS_ARCH" in +WINNT) + OS_TEST=`uname -p` + ;; +Windows_NT) +# +# If uname -s returns "Windows_NT", we assume that we are using +# the uname.exe in MKS toolkit. +# +# The -r option of MKS uname only returns the major version number. +# So we need to use its -v option to get the minor version number. +# Moreover, it doesn't have the -p option, so we need to use uname -m. +# + OS_ARCH=WINNT + OS_TARGET=WINNT + OS_MINOR_RELEASE=`uname -v` + if test "$OS_MINOR_RELEASE" = "00"; then + OS_MINOR_RELEASE=0 + fi + OS_RELEASE="${OS_RELEASE}.${OS_MINOR_RELEASE}" + ;; +CYGWIN32_NT|CYGWIN_NT*|MINGW*_NT*) +# +# If uname -s returns "CYGWIN_NT-4.0", we assume that we are using +# the uname.exe in the Cygwin tools. +# Prior to the Beta 20 release, Cygwin was called GNU-Win32. +# If uname -s returns "CYGWIN32/NT", we assume that we are using +# the uname.exe in the GNU-Win32 tools. +# If uname -s returns MINGW32_NT-5.1, we assume that we are using +# the uname.exe in the MSYS tools. +# + OS_RELEASE=`expr $OS_ARCH : '.*NT-\(.*\)'` + OS_ARCH=WINNT + OS_TARGET=WINNT + ;; +AIX) + OS_RELEASE=`uname -v`.`uname -r` + OS_TEST=${target_cpu} + ;; +BSD_386) + OS_ARCH=BSD + ;; +dgux) + OS_ARCH=DGUX + ;; +IRIX64) + OS_ARCH=IRIX + ;; +UNIX_SV) + if "`cat /etc/bcheckrc | grep -c NCR 2>/dev/null`" != "0"; then + OS_ARCH=NCR + else + OS_ARCH=UNIXWARE + OS_RELEASE=`uname -v` + fi + ;; +ncr) + OS_ARCH=NCR + ;; +UNIX_SYSTEM_V) + OS_ARCH=NEC + ;; +OSF1) + case `uname -v` in + 148) + OS_RELEASE=V3.2C + ;; + 564) + OS_RELEASE=V4.0B + ;; + 878) + OS_RELEASE=V4.0D + ;; + esac + ;; +*OpenVMS*) + OS_ARCH=OpenVMS + OS_RELEASE=`uname -v` + OS_TEST=`uname -p` + ;; +OS_2) + OS_ARCH=OS2 + OS_TARGET=OS2 + OS_RELEASE=`uname -v` + ;; +QNX) + if test "$OS_TARGET" != "NTO"; then + OS_RELEASE=`uname -v | sed 's/^\([0-9]\)\([0-9]*\)$/\1.\2/'` + fi + OS_TEST=x86 + ;; +SCO_SV) + OS_ARCH=SCOOS + OS_RELEASE=5.0 + ;; +SINIX-N | SINIX-Y | SINIX-Z |ReliantUNIX-M) + OS_ARCH=SINIX + OS_TEST=`uname -p` + ;; +UnixWare) + OS_ARCH=UNIXWARE + OS_RELEASE=`uname -v` + ;; +WINCE) + OS_ARCH=WINCE + OS_TARGET=WINCE + ;; +Darwin) + case "${target_cpu}" in + powerpc*) + OS_TEST=ppc + ;; + i*86*) + OS_TEST=i386 + ;; + *) + if test -z "$CROSS_COMPILE" ; then + OS_TEST=`uname -p` + fi + ;; + esac + ;; +esac + +if test "$OS_ARCH" = "NCR"; then + OS_RELEASE=`awk '{print $3}' /etc/.relid | sed 's/^\([0-9]\)\(.\)\(..\)\(.*\)$/\2.\3/'` +fi + +# Only set CPU_ARCH if we recognize the value of OS_TEST + +case "$OS_TEST" in +*86 | i86pc) + CPU_ARCH=x86 + ;; + +powerpc* | ppc | rs6000) + CPU_ARCH=ppc + ;; + +Alpha | alpha | ALPHA) + CPU_ARCH=Alpha + ;; + +sun4u) + CPU_ARCH=sparc + ;; + +x86_64 | sparc | ppc | ia64) + CPU_ARCH="$OS_TEST" + ;; +esac + +if test -z "$OS_TARGET"; then + OS_TARGET=$OS_ARCH +fi +if test "$OS_TARGET" = "WIN95"; then + OS_RELEASE="4.0" +fi +if test "$OS_TARGET" = "WIN16"; then + OS_RELEASE= +fi +OS_CONFIG="${OS_TARGET}${OS_RELEASE}" + +dnl ======================================================== +dnl GNU specific defaults +dnl ======================================================== +if test "$GNU_CC"; then + MKSHLIB='$(CXX) $(CXXFLAGS) $(DSO_PIC_CFLAGS) $(DSO_LDOPTS) -Wl,-h,$@ -o $@' + MKCSHLIB='$(CC) $(CFLAGS) $(DSO_PIC_CFLAGS) $(DSO_LDOPTS) -Wl,-h,$@ -o $@' + DSO_LDOPTS='-shared' + if test "$GCC_USE_GNU_LD"; then + # Don't allow undefined symbols in libraries + DSO_LDOPTS="$DSO_LDOPTS -Wl,-z,defs" + fi + DSO_CFLAGS='' + DSO_PIC_CFLAGS='-fPIC' + _MOZ_RTTI_FLAGS_ON=${_COMPILER_PREFIX}-frtti + _MOZ_RTTI_FLAGS_OFF=${_COMPILER_PREFIX}-fno-rtti + _MOZ_EXCEPTIONS_FLAGS_ON='-fhandle-exceptions' + _MOZ_EXCEPTIONS_FLAGS_OFF='-fno-handle-exceptions' + + # Turn on GNU specific features + # -Wall - turn on all warnings + # -pedantic - make compiler warn about non-ANSI stuff, and + # be a little bit stricter + # Warnings slamm took out for now (these were giving more noise than help): + # -Wbad-function-cast - warns when casting a function to a new return type + # -Wconversion - complained when char's or short's were used a function args + # -Wshadow - removed because it generates more noise than help --pete + _WARNINGS_CFLAGS="${_WARNINGS_CFLAGS} -Wall -W -Wno-unused -Wpointer-arith -Wcast-align" + + dnl Turn pedantic on but disable the warnings for long long + _PEDANTIC=1 + _IGNORE_LONG_LONG_WARNINGS=1 + + _DEFINES_CFLAGS='-include $(DEPTH)/mozilla-config.h -DMOZILLA_CLIENT' + _USE_CPP_INCLUDE_FLAG=1 +else + MKSHLIB='$(LD) $(DSO_LDOPTS) -h $@ -o $@' + MKCSHLIB='$(LD) $(DSO_LDOPTS) -h $@ -o $@' + + DSO_LDOPTS='-shared' + if test "$GNU_LD"; then + # Don't allow undefined symbols in libraries + DSO_LDOPTS="$DSO_LDOPTS -z defs" + fi + + DSO_CFLAGS='' + DSO_PIC_CFLAGS='-KPIC' + _DEFINES_CFLAGS='$(ACDEFINES) -D_MOZILLA_CONFIG_H_ -DMOZILLA_CLIENT' +fi + +if test "$GNU_CXX"; then + # Turn on GNU specific features + _WARNINGS_CXXFLAGS="${_WARNINGS_CXXFLAGS} -Wall -Wconversion -Wpointer-arith -Wcast-align -Woverloaded-virtual -Wsynth -Wno-ctor-dtor-privacy -Wno-non-virtual-dtor" + + _DEFINES_CXXFLAGS='-DMOZILLA_CLIENT -include $(DEPTH)/mozilla-config.h' + _USE_CPP_INCLUDE_FLAG=1 +else + _DEFINES_CXXFLAGS='-DMOZILLA_CLIENT -D_MOZILLA_CONFIG_H_ $(ACDEFINES)' +fi + +dnl gcc can come with its own linker so it is better to use the pass-thru calls +dnl MKSHLIB_FORCE_ALL is used to force the linker to include all object +dnl files present in an archive. MKSHLIB_UNFORCE_ALL reverts the linker to +dnl normal behavior. +dnl ======================================================== +MKSHLIB_FORCE_ALL= +MKSHLIB_UNFORCE_ALL= + +if test "$COMPILE_ENVIRONMENT"; then +if test "$GNU_CC"; then + AC_MSG_CHECKING(whether ld has archive extraction flags) + AC_CACHE_VAL(ac_cv_mkshlib_force_and_unforce, + [_SAVE_LDFLAGS=$LDFLAGS; _SAVE_LIBS=$LIBS + ac_cv_mkshlib_force_and_unforce="no" + exec 3<&0 <<LOOP_INPUT + force="-Wl,--whole-archive"; unforce="-Wl,--no-whole-archive" + force="-Wl,-z -Wl,allextract"; unforce="-Wl,-z -Wl,defaultextract" + force="-Wl,-all"; unforce="-Wl,-none" +LOOP_INPUT + while read line + do + eval $line + LDFLAGS=$force + LIBS=$unforce + AC_TRY_LINK(,, ac_cv_mkshlib_force_and_unforce=$line; break) + done + exec 0<&3 3<&- + LDFLAGS=$_SAVE_LDFLAGS; LIBS=$_SAVE_LIBS + ]) + if test "$ac_cv_mkshlib_force_and_unforce" = "no"; then + AC_MSG_RESULT(no) + else + AC_MSG_RESULT(yes) + eval $ac_cv_mkshlib_force_and_unforce + MKSHLIB_FORCE_ALL=$force + MKSHLIB_UNFORCE_ALL=$unforce + fi +fi # GNU_CC +fi # COMPILE_ENVIRONMENT + +dnl ================================================================= +dnl Set up and test static assertion macros used to avoid AC_TRY_RUN, +dnl which is bad when cross compiling. +dnl ================================================================= +if test "$COMPILE_ENVIRONMENT"; then +configure_static_assert_macros=' +#define CONFIGURE_STATIC_ASSERT(condition) CONFIGURE_STATIC_ASSERT_IMPL(condition, __LINE__) +#define CONFIGURE_STATIC_ASSERT_IMPL(condition, line) CONFIGURE_STATIC_ASSERT_IMPL2(condition, line) +#define CONFIGURE_STATIC_ASSERT_IMPL2(condition, line) typedef int static_assert_line_##line[(condition) ? 1 : -1] +' + +dnl test that the macros actually work: +AC_MSG_CHECKING(that static assertion macros used in autoconf tests work) +AC_CACHE_VAL(ac_cv_static_assertion_macros_work, + [AC_LANG_SAVE + AC_LANG_C + ac_cv_static_assertion_macros_work="yes" + AC_TRY_COMPILE([$configure_static_assert_macros], + [CONFIGURE_STATIC_ASSERT(1)], + , + ac_cv_static_assertion_macros_work="no") + AC_TRY_COMPILE([$configure_static_assert_macros], + [CONFIGURE_STATIC_ASSERT(0)], + ac_cv_static_assertion_macros_work="no", + ) + AC_LANG_CPLUSPLUS + AC_TRY_COMPILE([$configure_static_assert_macros], + [CONFIGURE_STATIC_ASSERT(1)], + , + ac_cv_static_assertion_macros_work="no") + AC_TRY_COMPILE([$configure_static_assert_macros], + [CONFIGURE_STATIC_ASSERT(0)], + ac_cv_static_assertion_macros_work="no", + ) + AC_LANG_RESTORE + ]) +AC_MSG_RESULT("$ac_cv_static_assertion_macros_work") +if test "$ac_cv_static_assertion_macros_work" = "no"; then + AC_MSG_ERROR([Compiler cannot compile macros used in autoconf tests.]) +fi + +fi # COMPILE_ENVIRONMENT + +dnl ======================================================== +dnl Checking for 64-bit OS +dnl ======================================================== +if test "$COMPILE_ENVIRONMENT"; then +AC_LANG_SAVE +AC_LANG_C +AC_MSG_CHECKING(for 64-bit OS) +AC_TRY_COMPILE([$configure_static_assert_macros], + [CONFIGURE_STATIC_ASSERT(sizeof(long) == 8)], + result="yes", result="no") +AC_MSG_RESULT("$result") +if test "$result" = "yes"; then + AC_DEFINE(HAVE_64BIT_OS) + HAVE_64BIT_OS=1 +fi +AC_SUBST(HAVE_64BIT_OS) + +if test "$HAVE_64BIT_OS"; then + case "$target_os" in + solaris*) TARGET_NSPR_MDCPUCFG='\"md/_solaris64.cfg\"' ;; + esac +fi +AC_LANG_RESTORE +fi # COMPILE_ENVIRONMENT + +dnl ======================================================== +dnl System overrides of the defaults for host +dnl ======================================================== +case "$host" in +*-beos*) + HOST_CFLAGS="$HOST_CFLAGS -DXP_BEOS -DBeOS -DBEOS -D_POSIX_SOURCE -DNO_X11" + HOST_NSPR_MDCPUCFG='\"md/_beos.cfg\"' + HOST_OPTIMIZE_FLAGS="${HOST_OPTIMIZE_FLAGS=-O3}" + ;; + +*cygwin*|*mingw*|*mks*|*msvc*|*wince) + if test -n "$_WIN32_MSVC"; then + HOST_AR=lib + HOST_AR_FLAGS='-NOLOGO -OUT:"$@"' + HOST_CFLAGS="$HOST_CFLAGS -TC -nologo -Fd\$(HOST_PDBFILE)" + HOST_RANLIB='echo ranlib' + else + HOST_CFLAGS="$HOST_CFLAGS -mno-cygwin" + fi + HOST_CFLAGS="$HOST_CFLAGS -DXP_WIN32 -DXP_WIN -DWIN32 -D_WIN32 -DNO_X11" + HOST_NSPR_MDCPUCFG='\"md/_winnt.cfg\"' + HOST_OPTIMIZE_FLAGS="${HOST_OPTIMIZE_FLAGS=-O2}" + HOST_BIN_SUFFIX=.exe + case "$host" in + *mingw*) + dnl MinGW/MSYS does not need CYGWIN_WRAPPER + ;; + *) + CYGWIN_WRAPPER="${srcdir}/build/cygwin-wrapper" + if test "`echo ${srcdir} | grep -c ^/ 2>/dev/null`" = 0; then + _pwd=`pwd` + CYGWIN_WRAPPER="${_pwd}/${srcdir}/build/cygwin-wrapper" + fi + if test "`${PERL} -v | grep -c cygwin 2>/dev/null`" = 0; then + AS_PERL=1 + PERL="${CYGWIN_WRAPPER} $PERL" + fi + ;; + esac + ;; + +*-darwin*) + HOST_CFLAGS="$HOST_CFLAGS -DXP_UNIX -DXP_MACOSX -DNO_X11" + HOST_NSPR_MDCPUCFG='\"md/_darwin.cfg\"' + HOST_OPTIMIZE_FLAGS="${HOST_OPTIMIZE_FLAGS=-O3}" + MOZ_FIX_LINK_PATHS='-Wl,-executable_path,$(DIST)/bin' + LIBXUL_LIBS='$(XPCOM_FROZEN_LDOPTS) $(DIST)/bin/XUL -lobjc' + ;; + +*-linux*) + HOST_CFLAGS="$HOST_CFLAGS -DXP_UNIX" + HOST_NSPR_MDCPUCFG='\"md/_linux.cfg\"' + HOST_OPTIMIZE_FLAGS="${HOST_OPTIMIZE_FLAGS=-O3}" + ;; + +*os2*) + HOST_CFLAGS="$HOST_CFLAGS -DXP_OS2 -DNO_X11 -Zomf" + HOST_NSPR_MDCPUCFG='\"md/_os2.cfg\"' + HOST_OPTIMIZE_FLAGS="${HOST_OPTIMIZE_FLAGS=-O2}" + HOST_BIN_SUFFIX=.exe + MOZ_FIX_LINK_PATHS= + ;; + +*-osf*) + HOST_CFLAGS="$HOST_CFLAGS -DXP_UNIX" + HOST_NSPR_MDCPUCFG='\"md/_osf1.cfg\"' + HOST_OPTIMIZE_FLAGS="${HOST_OPTIMIZE_FLAGS=-O2}" + ;; + +*) + HOST_CFLAGS="$HOST_CFLAGS -DXP_UNIX" + HOST_OPTIMIZE_FLAGS="${HOST_OPTIMIZE_FLAGS=-O2}" + ;; +esac + +dnl Get mozilla version from central milestone file +MOZILLA_VERSION=`$PERL $srcdir/config/milestone.pl -topsrcdir $srcdir` + +dnl Get version of various core apps from the version files. +FIREFOX_VERSION=`cat $topsrcdir/browser/config/version.txt` +THUNDERBIRD_VERSION=`cat $topsrcdir/mail/config/version.txt` +SUNBIRD_VERSION=`cat $topsrcdir/calendar/sunbird/config/version.txt` +SEAMONKEY_VERSION=`cat $topsrcdir/xpfe/bootstrap/version.txt` + +AC_DEFINE_UNQUOTED(MOZILLA_VERSION,"$MOZILLA_VERSION") +AC_DEFINE_UNQUOTED(MOZILLA_VERSION_U,$MOZILLA_VERSION) + +dnl ======================================================== +dnl System overrides of the defaults for target +dnl ======================================================== + +case "$target" in +*-aix*) + AC_DEFINE(AIX) + if test ! "$GNU_CC"; then + if test ! "$HAVE_64BIT_OS"; then + # Compiling with Visual Age C++ object model compat is the + # default. To compile with object model ibm, add + # AIX_OBJMODEL=ibm to .mozconfig. + if test "$AIX_OBJMODEL" = "ibm"; then + CXXFLAGS="$CXXFLAGS -qobjmodel=ibm" + else + AIX_OBJMODEL=compat + fi + else + AIX_OBJMODEL=compat + fi + AC_SUBST(AIX_OBJMODEL) + DSO_LDOPTS='-qmkshrobj=1' + DSO_CFLAGS='-qflag=w:w' + DSO_PIC_CFLAGS= + LDFLAGS="$LDFLAGS -Wl,-brtl -blibpath:/usr/lib:/lib" + AC_MSG_WARN([Clearing MOZ_FIX_LINK_PATHS till we can fix bug 332075.]) + MOZ_FIX_LINK_PATHS= + MKSHLIB='$(CXX) $(DSO_LDOPTS) -o $@' + MKCSHLIB='$(CC) $(DSO_LDOPTS) -o $@' + if test "$COMPILE_ENVIRONMENT"; then + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + AC_MSG_CHECKING([for VisualAge C++ compiler version >= 5.0.2.0]) + AC_TRY_COMPILE([], + [#if (__IBMCPP__ < 502) + #error "Bad compiler" + #endif], + _BAD_COMPILER=,_BAD_COMPILER=1) + if test -n "$_BAD_COMPILER"; then + AC_MSG_RESULT([no]) + AC_MSG_ERROR([VisualAge C++ version 5.0.2.0 or higher is required to build.]) + else + AC_MSG_RESULT([yes]) + fi + AC_LANG_RESTORE + TARGET_COMPILER_ABI="ibmc" + CC_VERSION=`lslpp -Lcq vac.C 2>/dev/null | awk -F: '{ print $3 }'` + CXX_VERSION=`lslpp -Lcq vacpp.cmp.core 2>/dev/null | awk -F: '{ print $3 }'` + fi + fi + case "${target_os}" in + aix4.1*) + DLL_SUFFIX='_shr.a' + ;; + esac + if test "$COMPILE_ENVIRONMENT"; then + AC_CHECK_HEADERS(sys/inttypes.h) + fi + AC_DEFINE(NSCAP_DISABLE_DEBUG_PTR_TYPES) + ;; + +*-beos*) + no_x=yes + MKSHLIB='$(CXX) $(CXXFLAGS) $(DSO_LDOPTS) -Wl,-h,$@ -o $@' + _PLATFORM_DEFAULT_TOOLKIT="beos" + DSO_LDOPTS='-nostart' + TK_LIBS='-lbe -lroot' + LIBS="$LIBS -lbe" + if test "$COMPILE_ENVIRONMENT"; then + AC_CHECK_LIB(bind,main,LIBS="$LIBS -lbind") + AC_CHECK_LIB(zeta,main,LIBS="$LIBS -lzeta") + fi + _WARNINGS_CFLAGS="${_WARNINGS_CFLAGS} -Wno-multichar" + _WARNINGS_CXXFLAGS="${_WARNINGS_CXXFLAGS} -Wno-multichar" + _MOZ_USE_RTTI=1 + USE_DEPENDENT_LIBS= + MOZ_USER_DIR="Mozilla" + ;; + +*-bsdi*) + dnl -pedantic doesn't play well with BSDI's _very_ modified gcc (shlicc2) + _PEDANTIC= + _IGNORE_LONG_LONG_WARNINGS= + case $OS_RELEASE in + 4.*|5.*) + STRIP="$STRIP -d" + ;; + *) + DSO_CFLAGS='' + DSO_LDOPTS='-r' + _WARNINGS_CFLAGS="-Wall" + _WARNINGS_CXXFLAGS="-Wall" + # The test above doesn't work properly, at least on 3.1. + MKSHLIB_FORCE_ALL='' + MKSHLIB_UNFORCE_ALL='' + ;; + esac + ;; + +*-darwin*) + AC_DEFINE(STDC_HEADERS) + MKSHLIB='$(CXX) $(CXXFLAGS) $(DSO_PIC_CFLAGS) $(DSO_LDOPTS) -o $@' + MKCSHLIB='$(CC) $(CFLAGS) $(DSO_PIC_CFLAGS) $(DSO_LDOPTS) -o $@' + + _PEDANTIC= + CFLAGS="$CFLAGS -fpascal-strings -no-cpp-precomp -fno-common" + CXXFLAGS="$CXXFLAGS -fpascal-strings -no-cpp-precomp -fno-common" + DLL_SUFFIX=".dylib" + DSO_LDOPTS='' + STRIP="$STRIP -x -S" + _PLATFORM_DEFAULT_TOOLKIT='mac' + MOZ_ENABLE_POSTSCRIPT= + TARGET_NSPR_MDCPUCFG='\"md/_darwin.cfg\"' + # set MACOSX to generate lib/mac/MoreFiles/Makefile + MACOSX=1 + + dnl check for the presence of the -dead_strip linker flag + AC_MSG_CHECKING([for -dead_strip option to ld]) + _SAVE_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -Wl,-dead_strip" + AC_TRY_LINK(,[return 0;],_HAVE_DEAD_STRIP=1,_HAVE_DEAD_STRIP=) + if test -n "$_HAVE_DEAD_STRIP" ; then + AC_MSG_RESULT([yes]) + MOZ_OPTIMIZE_LDFLAGS="-Wl,-dead_strip" + else + AC_MSG_RESULT([no]) + fi + LDFLAGS=$_SAVE_LDFLAGS + ;; + +*-freebsd*) + if test `test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` != "elf"; then + DLL_SUFFIX=".so.1.0" + DSO_LDOPTS="-shared" + fi + if test ! "$GNU_CC"; then + DSO_LDOPTS="-Bshareable $DSO_LDOPTS" + fi +# Can't have force w/o an unforce. +# # Hack for FreeBSD 2.2 +# if test -z "$MKSHLIB_FORCE_ALL"; then +# MKSHLIB_FORCE_ALL='-Wl,-Bforcearchive' +# MKSHLIB_UNFORCE_ALL='' +# fi + ;; + +*-hpux*) + DLL_SUFFIX=".sl" + if test ! "$GNU_CC"; then + DSO_LDOPTS='-b -Wl,+s' + DSO_CFLAGS="" + DSO_PIC_CFLAGS="+Z" + MKSHLIB='$(CXX) $(CXXFLAGS) $(DSO_LDOPTS) -L$(DIST)/bin -o $@' + MKCSHLIB='$(LD) -b +s -L$(DIST)/bin -o $@' + CXXFLAGS="$CXXFLAGS -Wc,-ansi_for_scope,on" + else + DSO_LDOPTS='-b -E +s' + MKSHLIB='$(LD) $(DSO_LDOPTS) -L$(DIST)/bin -L$(DIST)/lib -o $@' + MKCSHLIB='$(LD) $(DSO_LDOPTS) -L$(DIST)/bin -L$(DIST)/lib -o $@' + fi + MOZ_POST_PROGRAM_COMMAND='chatr +s enable' + AC_DEFINE(NSCAP_DISABLE_DEBUG_PTR_TYPES) + ;; + +*-irix5*) + AC_DEFINE(IRIX) + DSO_LDOPTS='-elf -shared' + + if test "$GNU_CC"; then + MKSHLIB='$(CXX) $(CXXFLAGS) $(DSO_PIC_CFLAGS) $(DSO_LDOPTS) -o $@' + MKCSHLIB='$(CC) $(CFLAGS) $(DSO_PIC_CFLAGS) $(DSO_LDOPTS) -o $@' + MKSHLIB_FORCE_ALL='-Wl,-all' + MKSHLIB_UNFORCE_ALL='-Wl,-none' + CXXFLAGS="$CXXFLAGS -D_LANGUAGE_C_PLUS_PLUS" + else + MKSHLIB='$(LD) $(DSO_LDOPTS) -o $@' + MKCSHLIB='$(LD) $(DSO_LDOPTS) -o $@' + MKSHLIB_FORCE_ALL='-all' + MKSHLIB_UNFORCE_ALL='-none' + fi + ;; + +*-irix6*) + AC_DEFINE(IRIX) + dnl the irix specific xptcinvoke code is written against the n32 ABI so we *must* + dnl compile and link using -n32 + USE_N32=1 + TARGET_COMPILER_ABI=n32 + DSO_LDOPTS='-elf -shared' + MKSHLIB='$(CCC) $(CXXFLAGS) $(DSO_PIC_CFLAGS) $(DSO_LDOPTS) -o $@' + MKCSHLIB='$(CC) $(CFLAGS) $(DSO_PIC_CFLAGS) $(DSO_LDOPTS) -o $@' + _MOZ_EXCEPTIONS_FLAGS_OFF="-LANG:exceptions=OFF" + _MOZ_EXCEPTIONS_FLAGS_ON="-LANG:exceptions=ON" + if test "$GNU_CC"; then + MKSHLIB_FORCE_ALL='-Wl,-all' + MKSHLIB_UNFORCE_ALL='-Wl,-none' + _WARNINGS_CFLAGS="-Wall" + _WARNINGS_CXXFLAGS="-Wall" + CXXFLAGS="$CXXFLAGS -D_LANGUAGE_C_PLUS_PLUS" + else + MKSHLIB_FORCE_ALL='-all' + MKSHLIB_UNFORCE_ALL='-none' + AR_LIST="$AR t" + AR_EXTRACT="$AR x" + AR_DELETE="$AR d" + AR='$(CXX) -ar' + AR_FLAGS='-o $@' + CFLAGS="$CFLAGS -woff 3262 -G 4" + CXXFLAGS="$CXXFLAGS -woff 3262 -G 4" + if test -n "$USE_N32"; then + ASFLAGS="$ASFLAGS -n32" + CFLAGS="$CFLAGS -n32" + CXXFLAGS="$CXXFLAGS -n32" + LDFLAGS="$LDFLAGS -n32" + fi + AC_DEFINE(NSCAP_DISABLE_DEBUG_PTR_TYPES) + fi + if test -z "$GNU_CXX"; then + MIPSPRO_CXX=1 + fi + ;; + +*-*linux*) + TARGET_NSPR_MDCPUCFG='\"md/_linux.cfg\"' + MOZ_DEBUG_FLAGS="-g -fno-inline" # most people on linux use gcc/gdb, + # and that combo is not yet good at + # debugging inlined functions (even + # when using DWARF2 as the debugging + # format) + + case "${target_cpu}" in + alpha*) + CFLAGS="$CFLAGS -mieee" + CXXFLAGS="$CXXFLAGS -mieee" + ;; + i*86) + USE_ELF_DYNSTR_GC=1 + MOZ_ENABLE_OLD_ABI_COMPAT_WRAPPERS=1 + ;; + mips*) + CFLAGS="$CFLAGS -Wa,-xgot" + CXXFLAGS="$CXXFLAGS -Wa,-xgot" + ;; + esac + ;; + +*-wince*) + + MOZ_TOOLS_DIR=`echo $MOZ_TOOLS` + AR_LIST="$AR -list" + AR_EXTRACT="$AR -extract" + AR_DELETE="$AR d" + AR_FLAGS='-OUT:"$@"' + + DSO_CFLAGS= + DSO_PIC_CFLAGS= + DLL_SUFFIX=.dll + BIN_SUFFIX='.exe' + RC=rc.exe + # certain versions of cygwin's makedepend barf on the + # #include <string> vs -I./dist/include/string issue so don't use it + SYSTEM_MAKEDEPEND= + + HOST_CC=cl + HOST_CXX=cl + HOST_LD=link + HOST_AR='lib -OUT:$@' + HOST_RANLIB='echo ranlib' + HOST_CFLAGS="$HOST_CFLAGS -D_X86_" + + MOZ_OPTIMIZE_FLAGS='-O1' + AR_FLAGS='-NOLOGO -OUT:"$@"' + ASM_SUFFIX=asm + CFLAGS="$CFLAGS -W3 -Gy -Fd\$(PDBFILE)" + CXXFLAGS="$CXXFLAGS -W3 -Gy -Fd\$(PDBFILE)" + DLL_PREFIX= + DOXYGEN=: + DSO_LDOPTS=-SUBSYSTEM:WINDOWSCE + DYNAMIC_XPCOM_LIBS='$(DIST)/lib/xpcom.lib $(DIST)/lib/xpcom_core.lib' + GARBAGE= + IMPORT_LIB_SUFFIX=lib + LIBS="$LIBS" + LIBXUL_LIBS='$(DIST)/lib/xpcom.lib $(DIST)/lib/xul.lib' + LIB_PREFIX= + LIB_SUFFIX=lib + MKCSHLIB='$(LD) -NOLOGO -DLL -OUT:$@ $(DSO_LDOPTS)' + MKSHLIB='$(LD) -NOLOGO -DLL -OUT:$@ $(DSO_LDOPTS)' + MKSHLIB_FORCE_ALL= + MKSHLIB_UNFORCE_ALL= + MOZ_COMPONENT_NSPR_LIBS='$(NSPR_LIBS)' + MOZ_COMPONENT_NSPR_LIBS='$(NSPR_LIBS)' + MOZ_DEBUG_FLAGS='-Zi' + MOZ_DEBUG_LDFLAGS='-DEBUG -DEBUGTYPE:CV' + MOZ_FIX_LINK_PATHS= + MOZ_JPEG_LIBS='$(DIST)/lib/mozjpeg.lib' + MOZ_JS_LIBS='$(DIST)/lib/js$(MOZ_BITS)$(VERSION_NUMBER).lib' + MOZ_OPTIMIZE_FLAGS='-O1' + MOZ_PNG_LIBS='$(DIST)/lib/mozpng.lib' + MOZ_XPCOM_OBSOLETE_LIBS='$(DIST)/lib/xpcom_compat.lib' + MOZ_ZLIB_LIBS='$(DIST)/lib/mozz.lib' + OBJ_SUFFIX=obj + RANLIB='echo not_ranlib' + STRIP='echo not_strip' + TARGET_NSPR_MDCPUCFG='\"md/_wince.cfg\"' + UNZIP=unzip + XARGS=xargs + XPCOM_FROZEN_LDOPTS='$(DIST)/lib/xpcom.lib' + ZIP=zip + LIBIDL_CFLAGS="-I$MOZ_TOOLS_DIR/include ${GLIB_CFLAGS}" + LIBIDL_LIBS="$MOZ_TOOLS_DIR/lib/libidl-0.6_s.lib $MOZ_TOOLS_DIR/lib/glib-1.2_s.lib" + STATIC_LIBIDL=1 + + AC_DEFINE(HAVE_SNPRINTF) + AC_DEFINE(_WINDOWS) + AC_DEFINE(_WIN32) + AC_DEFINE(WIN32) + AC_DEFINE(XP_WIN) + AC_DEFINE(XP_WIN32) + AC_DEFINE(HW_THREADS) + AC_DEFINE_UNQUOTED(WINVER,0x400) + AC_DEFINE(STDC_HEADERS) + AC_DEFINE(NEW_H, <new>) + AC_DEFINE(WIN32_LEAN_AND_MEAN) + + TARGET_MD_ARCH=win32 + _PLATFORM_DEFAULT_TOOLKIT='windows' + BIN_SUFFIX='.exe' + USE_SHORT_LIBNAME=1 + MOZ_ENABLE_COREXFONTS= + MOZ_ENABLE_POSTSCRIPT= + MOZ_USER_DIR="Mozilla" +;; + + +*-mingw*|*-cygwin*|*-msvc*|*-mks*) + DSO_CFLAGS= + DSO_PIC_CFLAGS= + DLL_SUFFIX=.dll + RC=rc.exe + # certain versions of cygwin's makedepend barf on the + # #include <string> vs -I./dist/include/string issue so don't use it + SYSTEM_MAKEDEPEND= + if test -n "$GNU_CC"; then + CC="$CC -mno-cygwin" + CXX="$CXX -mno-cygwin" + CPP="$CPP -mno-cygwin" + CFLAGS="$CFLAGS -mms-bitfields" + CXXFLAGS="$CXXFLAGS -mms-bitfields" + DSO_LDOPTS='-shared' + MKSHLIB='$(CXX) $(DSO_LDOPTS) -o $@' + MKCSHLIB='$(CC) $(DSO_LDOPTS) -o $@' + RC='$(WINDRES)' + # Use temp file for windres (bug 213281) + RCFLAGS='-O coff --use-temp-file' + MOZ_JPEG_LIBS='-L$(DIST)/lib -ljpeg$(MOZ_BITS)$(VERSION_NUMBER)' + MOZ_ZLIB_LIBS='-L$(DIST)/lib -lmozz' + MOZ_PNG_LIBS='-L$(DIST)/lib -lpng' + MOZ_JS_LIBS='-L$(DIST)/lib -ljs$(MOZ_BITS)$(VERSION_NUMBER)' + MOZ_FIX_LINK_PATHS= + DYNAMIC_XPCOM_LIBS='-L$(DIST)/lib -lxpcom -lxpcom_core' + XPCOM_FROZEN_LDOPTS='-L$(DIST)/lib -lxpcom' + DLL_PREFIX= + IMPORT_LIB_SUFFIX=dll.a + else + TARGET_COMPILER_ABI=msvc + HOST_CC='$(CC)' + HOST_CXX='$(CXX)' + HOST_LD='$(LD)' + AR='lib -NOLOGO -OUT:"$@"' + AR_FLAGS= + RANLIB='echo not_ranlib' + STRIP='echo not_strip' + XARGS=xargs + ZIP=zip + UNZIP=unzip + DOXYGEN=: + GARBAGE='$(OBJDIR)/vc20.pdb $(OBJDIR)/vc40.pdb' + OBJ_SUFFIX=obj + LIB_SUFFIX=lib + DLL_PREFIX= + LIB_PREFIX= + IMPORT_LIB_SUFFIX=lib + MKSHLIB='$(LD) -NOLOGO -DLL -OUT:$@ -PDB:$(PDBFILE) $(DSO_LDOPTS)' + MKCSHLIB='$(LD) -NOLOGO -DLL -OUT:$@ -PDB:$(PDBFILE) $(DSO_LDOPTS)' + MKSHLIB_FORCE_ALL= + MKSHLIB_UNFORCE_ALL= + DSO_LDOPTS=-SUBSYSTEM:WINDOWS + CFLAGS="$CFLAGS -W3 -Gy -Fd\$(PDBFILE)" + CXXFLAGS="$CXXFLAGS -W3 -Gy -Fd\$(PDBFILE)" + LIBS="$LIBS kernel32.lib user32.lib gdi32.lib winmm.lib wsock32.lib advapi32.lib" + MOZ_DEBUG_FLAGS='-Zi' + MOZ_DEBUG_LDFLAGS='-DEBUG -DEBUGTYPE:CV' + MOZ_OPTIMIZE_FLAGS='-O1' + MOZ_JPEG_LIBS='$(DIST)/lib/jpeg$(MOZ_BITS)$(VERSION_NUMBER).lib' + MOZ_ZLIB_LIBS='$(DIST)/lib/mozz.lib' + MOZ_PNG_LIBS='$(DIST)/lib/png.lib' + MOZ_JS_LIBS='$(DIST)/lib/js$(MOZ_BITS)$(VERSION_NUMBER).lib' + MOZ_FIX_LINK_PATHS= + DYNAMIC_XPCOM_LIBS='$(DIST)/lib/xpcom.lib $(DIST)/lib/xpcom_core.lib' + XPCOM_FROZEN_LDOPTS='$(DIST)/lib/xpcom.lib' + LIBXUL_LIBS='$(DIST)/lib/xpcom.lib $(DIST)/lib/xul.lib' + MOZ_COMPONENT_NSPR_LIBS='$(NSPR_LIBS)' + MOZ_XPCOM_OBSOLETE_LIBS='$(DIST)/lib/xpcom_compat.lib' + fi + AC_DEFINE(HAVE_SNPRINTF) + AC_DEFINE(_WINDOWS) + AC_DEFINE(_WIN32) + AC_DEFINE(WIN32) + AC_DEFINE(XP_WIN) + AC_DEFINE(XP_WIN32) + AC_DEFINE(HW_THREADS) + AC_DEFINE_UNQUOTED(WINVER,0x400) + AC_DEFINE_UNQUOTED(_WIN32_WINNT,0x400) + AC_DEFINE(STDC_HEADERS) + AC_DEFINE(NEW_H, <new>) + AC_DEFINE(WIN32_LEAN_AND_MEAN) + TARGET_MD_ARCH=win32 + _PLATFORM_DEFAULT_TOOLKIT='windows' + BIN_SUFFIX='.exe' + USE_SHORT_LIBNAME=1 + MOZ_ENABLE_POSTSCRIPT= + MOZ_USER_DIR="Mozilla" + + dnl Hardcode to win95 for now - cls + TARGET_NSPR_MDCPUCFG='\"md/_win95.cfg\"' + + dnl set NO_X11 defines here as the general check is skipped on win32 + no_x=yes + AC_DEFINE(NO_X11) + + dnl MinGW/MSYS doesn't provide or need cygpath + case "$host" in + *-mingw*) + CYGPATH_W=echo + CYGPATH_S=cat + MOZ_BUILD_ROOT=`cd $MOZ_BUILD_ROOT && pwd -W` + ;; + *-cygwin*|*-msvc*|*-mks*) + CYGPATH_W="cygpath -a -w" + CYGPATH_S="sed -e s|\\\\|/|g" + MOZ_BUILD_ROOT=`$CYGPATH_W $MOZ_BUILD_ROOT | $CYGPATH_S` + ;; + esac + case "$host" in + *-mingw*|*-cygwin*|*-msvc*|*-mks*) + + if test -z "$MOZ_TOOLS"; then + AC_MSG_ERROR([MOZ_TOOLS is not set]) + fi + + MOZ_TOOLS_DIR=`cd $MOZ_TOOLS && pwd` + if test "$?" != "0" || test -z "$MOZ_TOOLS_DIR"; then + AC_MSG_ERROR([cd \$MOZ_TOOLS failed. MOZ_TOOLS ==? $MOZ_TOOLS]) + fi + if test `echo ${PATH}: | grep -ic "$MOZ_TOOLS_DIR/bin:"` = 0; then + AC_MSG_ERROR([\$MOZ_TOOLS\\bin must be in your path.]) + fi + MOZ_TOOLS_DIR=`$CYGPATH_W $MOZ_TOOLS_DIR | $CYGPATH_S` + + if test -n "$GLIB_PREFIX"; then + _GLIB_PREFIX_DIR=`cd $GLIB_PREFIX && pwd` + if test "$?" = "0"; then + if test `echo ${PATH}: | grep -ic "$_GLIB_PREFIX_DIR/bin:"` = 0; then + AC_MSG_ERROR([GLIB_PREFIX must be in your \$PATH.]) + fi + _GLIB_PREFIX_DIR=`$CYGPATH_W $_GLIB_PREFIX_DIR | $CYGPATH_S` + else + AC_MSG_ERROR([GLIB_PREFIX is set but "${GLIB_PREFIX}" is not a directory.]) + fi + else + _GLIB_PREFIX_DIR=$MOZ_TOOLS_DIR + fi + if test ! -f "${_GLIB_PREFIX_DIR}/include/glib.h"; then + AC_MSG_ERROR([Cannot find $_GLIB_PREFIX_DIR/include/glib.h .]) + fi + GLIB_CFLAGS="-I${_GLIB_PREFIX_DIR}/include" + if test -f "${_GLIB_PREFIX_DIR}/lib/glib-1.2_s.lib"; then + GLIB_LIBS="${_GLIB_PREFIX_DIR}/lib/glib-1.2_s.lib" + elif test -f "${_GLIB_PREFIX_DIR}/lib/glib-1.2.lib"; then + GLIB_LIBS="${_GLIB_PREFIX_DIR}/lib/glib-1.2.lib" + else + AC_MSG_ERROR([Cannot find $_GLIB_PREFIX_DIR/lib/glib-1.2.lib or $_GLIB_PREFIX_DIR/lib/glib-1.2_s.lib]) + fi + + if test -n "$LIBIDL_PREFIX"; then + _LIBIDL_PREFIX_DIR=`cd $LIBIDL_PREFIX && pwd` + if test "$?" = "0"; then + if test `echo ${PATH}: | grep -ic "$_LIBIDL_PREFIX_DIR/bin:"` = 0; then + AC_MSG_ERROR([LIBIDL_PREFIX must be in your \$PATH.]) + fi + _LIBIDL_PREFIX_DIR=`$CYGPATH_W $_LIBIDL_PREFIX_DIR | $CYGPATH_S` + else + AC_MSG_ERROR([LIBIDL_PREFIX is set but "${LIBIDL_PREFIX}" is not a directory.]) + fi + else + _LIBIDL_PREFIX_DIR=$MOZ_TOOLS_DIR + fi + if test ! -f "${_LIBIDL_PREFIX_DIR}/include/libIDL/IDL.h"; then + AC_MSG_ERROR([Cannot find $_LIBIDL_PREFIX_DIR/include/libIDL/IDL.h .]) + fi + LIBIDL_CFLAGS="-I${_LIBIDL_PREFIX_DIR}/include ${GLIB_CFLAGS}" + if test -f "${_LIBIDL_PREFIX_DIR}/lib/libidl-0.6_s.lib"; then + LIBIDL_LIBS="${_LIBIDL_PREFIX_DIR}/lib/libidl-0.6_s.lib" + STATIC_LIBIDL=1 + elif test -f "${_LIBIDL_PREFIX_DIR}/lib/libidl-0.6.lib"; then + LIBIDL_LIBS="${_LIBIDL_PREFIX_DIR}/lib/libidl-0.6.lib" + else + AC_MSG_ERROR([Cannot find $_LIBIDL_PREFIX_DIR/lib/libidl-0.6.lib or $_LIBIDL_PREFIX_DIR/lib/libidl-0.6_s.lib]) + fi + LIBIDL_LIBS="${LIBIDL_LIBS} ${GLIB_LIBS}" + ;; + + *) # else cross-compiling + if test -n "$GLIB_PREFIX"; then + GLIB_CFLAGS="-I${GLIB_PREFIX}/include" + if test -f "${GLIB_PREFIX}/lib/glib-1.2_s.lib"; then + GLIB_LIBS="${GLIB_PREFIX}/lib/glib-1.2_s.lib" + elif test -f "${GLIB_PREFIX}/lib/glib-1.2.lib"; then + GLIB_LIBS="${GLIB_PREFIX}/lib/glib-1.2.lib" + else + AC_MSG_ERROR([Cannot find $GLIB_PREFIX/lib/glib-1.2.lib or $GLIB_PREFIX/lib/glib-1.2_s.lib]) + fi + fi + if test -n "$LIBIDL_PREFIX"; then + LIBIDL_CFLAGS="-I${LIBIDL_PREFIX}/include ${GLIB_CFLAGS}" + if test -f "${LIBIDL_PREFIX}/lib/libIDL-0.6_s.lib"; then + LIBIDL_LIBS="${LIBIDL_PREFIX}/lib/libIDL-0.6_s.lib" + STATIC_LIBIDL=1 + elif test -f "${LIBIDL_PREFIX}/lib/libIDL-0.6.lib"; then + LIBIDL_LIBS="${LIBIDL_PREFIX}/lib/libIDL-0.6.lib" + else + AC_MSG_ERROR([Cannot find $LIBIDL_PREFIX/lib/libIDL-0.6.lib or $LIBIDL_PREFIX/lib/libIDL-0.6_s.lib]) + fi + fi + LIBIDL_LIBS="${LIBIDL_LIBS} ${GLIB_LIBS}" + ;; + esac + + case "$target" in + i*86-*) + AC_DEFINE(_X86_) + ;; + alpha-*) + AC_DEFINE(_ALPHA_) + ;; + mips-*) + AC_DEFINE(_MIPS_) + ;; + *) + AC_DEFINE(_CPU_ARCH_NOT_DEFINED) + ;; + esac + ;; + +*-netbsd*) + DSO_CFLAGS='' + CFLAGS="$CFLAGS -Dunix" + CXXFLAGS="$CXXFLAGS -Dunix" + if $CC -E - -dM </dev/null | grep __ELF__ >/dev/null; then + DLL_SUFFIX=".so" + DSO_PIC_CFLAGS='-fPIC -DPIC' + DSO_LDOPTS='-shared' + BIN_FLAGS='-Wl,--export-dynamic' + else + DSO_PIC_CFLAGS='-fPIC -DPIC' + DLL_SUFFIX=".so.1.0" + DSO_LDOPTS='-shared' + fi + # This will fail on a.out systems prior to 1.5.1_ALPHA. + MKSHLIB_FORCE_ALL='-Wl,--whole-archive' + MKSHLIB_UNFORCE_ALL='-Wl,--no-whole-archive' + if test "$LIBRUNPATH"; then + DSO_LDOPTS="-Wl,-R$LIBRUNPATH $DSO_LDOPTS" + fi + MKSHLIB='$(CXX) $(CXXFLAGS) $(DSO_PIC_CFLAGS) $(DSO_LDOPTS) -Wl,-soname,lib$(LIBRARY_NAME)$(DLL_SUFFIX) -o $@' + MKCSHLIB='$(CC) $(CFLAGS) $(DSO_PIC_CFLAGS) $(DSO_LDOPTS) -Wl,-soname,lib$(LIBRARY_NAME)$(DLL_SUFFIX) -o $@' + ;; + +*-nto*) + AC_DEFINE(NTO) + AC_DEFINE(_QNX_SOURCE) + AC_DEFINE(_i386) + OS_TARGET=NTO + MOZ_OPTIMIZE_FLAGS="-O" + MOZ_DEBUG_FLAGS="-gdwarf-2" + USE_PTHREADS=1 + _PEDANTIC= + LIBS="$LIBS -lsocket -lstdc++" + _DEFINES_CFLAGS='-Wp,-include -Wp,$(DEPTH)/mozilla-config.h -DMOZILLA_CLIENT -D_POSIX_C_SOURCE=199506' + _DEFINES_CXXFLAGS='-DMOZILLA_CLIENT -Wp,-include -Wp,$(DEPTH)/mozilla-config.h -D_POSIX_C_SOURCE=199506' + if test "$with_x" != "yes" + then + _PLATFORM_DEFAULT_TOOLKIT="photon" + TK_CFLAGS='-I/usr/include/photon' + TK_LIBS='-lph' + fi + case "${target_cpu}" in + ppc*) + AC_DEFINE(HAVE_VA_LIST_AS_ARRAY) + ;; + esac + case "${host_cpu}" in + i*86) + USE_ELF_DYNSTR_GC=1 + ;; + esac + ;; + +*-openbsd*) + DLL_SUFFIX=".so.1.0" + DSO_CFLAGS='' + DSO_PIC_CFLAGS='-fPIC' + DSO_LDOPTS='-shared -fPIC' + if test "$LIBRUNPATH"; then + DSO_LDOPTS="-R$LIBRUNPATH $DSO_LDOPTS" + fi + ;; + +*-openvms*) + AC_DEFINE(NO_PW_GECOS) + AC_DEFINE(NO_UDSOCK) + AC_DEFINE(POLL_WITH_XCONNECTIONNUMBER) + USE_PTHREADS=1 + MKSHLIB_FORCE_ALL='-all' + MKSHLIB_UNFORCE_ALL='-none' + AS='as' + AS_DASH_C_FLAG='-Wc/names=as_is' + AR_FLAGS='c $@' + DSO_LDOPTS='-shared -auto_symvec' + DSO_PIC_CFLAGS= + MOZ_DEBUG_LDFLAGS='-g' + COMPAQ_CXX=1 + CC_VERSION=`$CC -V 2>&1 | awk '/ C / { print $3 }'` + CXX_VERSION=`$CXX -V 2>&1 | awk '/ C\+\+ / { print $3 }'` + ;; + + +*-os2*) + MKSHLIB='$(CXX) $(CXXFLAGS) $(DSO_PIC_CFLAGS) $(DSO_LDOPTS) -o $@' + MKCSHLIB='$(CC) $(CFLAGS) $(DSO_PIC_CFLAGS) $(DSO_LDOPTS) -o $@' + AC_DEFINE(XP_OS2) + USE_SHORT_LIBNAME=1 + DLL_PREFIX= + LIB_PREFIX= + LIB_SUFFIX=lib + BIN_SUFFIX=".exe" + DLL_SUFFIX=".dll" + IMPORT_LIB_SUFFIX=lib + DSO_PIC_CFLAGS= + TARGET_MD_ARCH=os2 + _PLATFORM_DEFAULT_TOOLKIT=os2 + WIDGET_DLL='\"wdgt$(MOZ_WIDGET_TOOLKIT)$(DLL_SUFFIX)\"' + GFXWIN_DLL='\"gfx_$(MOZ_GFX_TOOLKIT)$(DLL_SUFFIX)\"' + MOZ_ENABLE_POSTSCRIPT= + RC=rc.exe + RCFLAGS='-n' + MOZ_USER_DIR="Mozilla" + + if test "$MOZTOOLS"; then + MOZ_TOOLS_DIR=`echo $MOZTOOLS | sed -e 's|\\\\|/|g'` + else + AC_MSG_ERROR([MOZTOOLS is not set]) + fi + + # EMX/GCC build + if test -n "$GNU_CC"; then + AC_DEFINE(OS2) + AC_DEFINE(XP_OS2_EMX) + AC_DEFINE(OS2EMX_PLAIN_CHAR) + AC_DEFINE(TCPV40HDRS) + AR=emxomfar + AR_FLAGS='r $@' + CFLAGS="$CFLAGS -Zomf" + CXXFLAGS="$CXXFLAGS -Zomf" + DSO_LDOPTS='-Zdll' + BIN_FLAGS='-Zlinker /ST:0x100000' + IMPLIB='emximp -o' + FILTER='emxexp -o' + LDFLAGS='-Zmap' + MOZ_DEBUG_FLAGS="-g -fno-inline" + MOZ_OPTIMIZE_FLAGS="-O2 -s" + MOZ_OPTIMIZE_LDFLAGS="-Zlinker /EXEPACK:2 -Zlinker /PACKCODE -Zlinker /PACKDATA" + MOZ_WIDGET_TOOLKIT_LDFLAGS='-lwdgt$(MOZ_WIDGET_TOOLKIT)' + MOZ_GFX_TOOLKIT_LDFLAGS='-lgfx_$(MOZ_GFX_TOOLKIT)' + MOZ_XPCOM_OBSOLETE_LIBS='-L$(DIST)/lib $(DIST)/lib/xpcomct.lib' + DYNAMIC_XPCOM_LIBS='-L$(DIST)/lib $(DIST)/lib/xpcom.lib $(DIST)/lib/xpcomcor.lib' + LIBXUL_LIBS='-L$(DIST)/lib $(DIST)/lib/xpcom.lib $(DIST)/lib/xul.lib' + + # GCC for OS/2 currently predefines these, but we don't want them + _DEFINES_CFLAGS="$_DEFINES_CFLAGS -Uunix -U__unix -U__unix__" + _DEFINES_CXXFLAGS="$_DEFINES_CXXFLAGS -Uunix -U__unix -U__unix__" + + # Visual Age C++ build + elif test "$VACPP" = "yes"; then + MOZ_BUILD_ROOT=`pwd -D` + OBJ_SUFFIX=obj + AR=-ilib + AR_FLAGS='/NOL /NOI /O:$(subst /,\\,$@)' + AR_LIST='/L' + AR_EXTRACT='-*' + AR_DELETE='-' + AS=alp + ASFLAGS='-Mb' + AS_DASH_C_FLAG='' + ASM_SUFFIX=asm + LD='-ilink' + CFLAGS="/Q /qlibansi /Gm+ /Su4 /Mp /Tl9" + CXXFLAGS="/Q /qlibansi /Gm+ /Su4 /Mp /Tl9 /Gx+" + MOZ_DEBUG_FLAGS="/Ti+" + MOZ_OPTIMIZE_FLAGS="/O+ /Gl+ /G5 /qarch=pentium" + LDFLAGS="/NOL /M" + MOZ_DEBUG_LDFLAGS="/DE" + MOZ_OPTIMIZE_LDFLAGS="/OPTFUNC /EXEPACK:2 /PACKCODE /PACKDATA" + DSO_LDOPTS='' + DSO_PIC_CFLAGS= + IMPLIB='implib /NOL /NOI' + FILTER='cppfilt -q -B -P' + AC_DEFINE(NO_ANSI_KEYWORDS) + AC_DEFINE(OS2,4) + AC_DEFINE(_X86_) + AC_DEFINE(XP_OS2_VACPP) + AC_DEFINE(TCPV40HDRS) + AC_DEFINE(NSCAP_DISABLE_DEBUG_PTR_TYPES) + AC_DEFINE(STDC_HEADERS) + MOZ_COMPONENT_NSPR_LIBS='$(NSPR_LIBS)' + MKSHLIB='$(LD) $(DSO_LDOPTS)' + MKCSHLIB='$(LD) $(DSO_LDOPTS)' + MOZ_JS_LIBS='$(DIST)/lib/mozjs.lib' + MOZ_XPCOM_OBSOLETE_LIBS='$(DIST)/lib/xpcomct.lib' + DYNAMIC_XPCOM_LIBS='$(DIST)/lib/xpcom.lib $(DIST)/lib/xpcomcor.lib' + LIBXUL_LIBS='$(DIST)/lib/xpcom.lib $(DIST)/lib/xul.lib' + MOZ_JPEG_LIBS='$(DIST)/lib/mozjpeg.$(LIB_SUFFIX)' + MOZ_ZLIB_LIBS='$(DIST)/lib/mozz.$(LIB_SUFFIX)' + MOZ_PNG_LIBS='$(DIST)/lib/mozpng.$(LIB_SUFFIX)' + MOZ_WIDGET_TOOLKIT_LDFLAGS='$(DIST)/lib/wdgt$(MOZ_WIDGET_TOOLKIT)' + MOZ_GFX_TOOLKIT_LDFLAGS='$(DIST)/lib/gfx_$(MOZ_GFX_TOOLKIT)' + fi + ;; + +alpha*-*-osf*) + if test "$GNU_CC"; then + MKSHLIB='$(CXX) $(CXXFLAGS) $(DSO_PIC_CFLAGS) $(DSO_LDOPTS) -Wl,-soname,$@ -o $@' + MKCSHLIB='$(CC) $(CFLAGS) $(DSO_PIC_CFLAGS) $(DSO_LDOPTS) -Wl,-soname,$@ -o $@' + + else + MOZ_DEBUG_FLAGS='-g' + ASFLAGS='-I$(topsrcdir)/xpcom/reflect/xptcall/public -g' + CFLAGS="$CFLAGS -ieee" + CXXFLAGS="$CXXFLAGS "'-noexceptions -ieee -ptr $(DIST)/cxx_repository' + DSO_LDOPTS='-shared -msym -expect_unresolved \* -update_registry $(DIST)/so_locations' + DSO_CFLAGS= + DSO_PIC_CFLAGS= + MKCSHLIB='$(CC) $(CFLAGS) $(DSO_PIC_CFLAGS) $(DSO_LDOPTS) -soname $@ -o $@' + MKSHLIB='$(CXX) $(CXXFLAGS) $(DSO_PIC_CFLAGS) $(DSO_LDOPTS) -soname $@ -o $@' + MKSHLIB_FORCE_ALL='-all' + MKSHLIB_UNFORCE_ALL='-none' + dnl Might fix the libxpcom.so breakage on this platform as well.... + AC_DEFINE(NSCAP_DISABLE_TEST_DONTQUERY_CASES) + AC_DEFINE(NSCAP_DISABLE_DEBUG_PTR_TYPES) + fi + if test -z "$GNU_CXX"; then + COMPAQ_CXX=1 + fi + AC_DEFINE(NEED_USLEEP_PROTOTYPE) + ;; + +*-qnx*) + DIRENT_INO=d_stat.st_ino + dnl Solves the problems the QNX compiler has with nsCOMPtr.h. + AC_DEFINE(NSCAP_DISABLE_TEST_DONTQUERY_CASES) + AC_DEFINE(NSCAP_DISABLE_DEBUG_PTR_TYPES) + dnl Explicit set STDC_HEADERS to workaround QNX 6.0's failing of std test + AC_DEFINE(STDC_HEADERS) + if test "$no_x" = "yes"; then + _PLATFORM_DEFAULT_TOOLKIT='photon' + TK_CFLAGS='-I/usr/nto/include/photon' + TK_LIBS='-lphoton -lphrender' + fi + ;; + +*-sco*) + AC_DEFINE(NSCAP_DISABLE_TEST_DONTQUERY_CASES) + AC_DEFINE(NSCAP_DISABLE_DEBUG_PTR_TYPES) + CXXFLAGS="$CXXFLAGS -I/usr/include/CC" + if test ! "$GNU_CC"; then + DSO_LDOPTS='-G' + fi + ;; + +dnl the qsort routine under solaris is faulty +*-solaris*) + AC_DEFINE(SOLARIS) + TARGET_NSPR_MDCPUCFG='\"md/_solaris32.cfg\"' + SYSTEM_MAKEDEPEND= + if test -z "$GNU_CC"; then + NS_USE_NATIVE=1 + MOZ_FIX_LINK_PATHS='-R $(LIBXUL_DIST)/bin' + AC_DEFINE(NSCAP_DISABLE_DEBUG_PTR_TYPES) + CFLAGS="$CFLAGS -xstrconst -xbuiltin=%all" + CXXFLAGS="$CXXFLAGS -xbuiltin=%all -features=tmplife" + LDFLAGS="-xildoff -zlazyload -zcombreloc $LDFLAGS" + if test -z "$CROSS_COMPILE" && test -f /usr/lib/ld/map.noexstk; then + _SAVE_LDFLAGS=$LDFLAGS + LDFLAGS="-M /usr/lib/ld/map.noexstk $LDFLAGS" + AC_TRY_LINK([#include <stdio.h>], + [printf("Hello World\n");], + , + [LDFLAGS=$_SAVE_LDFLAGS]) + fi + MOZ_OPTIMIZE_FLAGS="-xO4" + MKSHLIB='$(CXX) $(CXXFLAGS) $(DSO_PIC_FLAGS) $(DSO_LDOPTS) -h $@ -o $@' + MKCSHLIB='$(CC) $(CFLAGS) $(DSO_PIC_FLAGS) -G -Wl,-z -Wl,muldefs -h $@ -o $@' + MKSHLIB_FORCE_ALL='-Qoption ld -z,allextract' + MKSHLIB_UNFORCE_ALL='' + DSO_LDOPTS='-G -Qoption ld -z,muldefs' + AR_LIST="$AR t" + AR_EXTRACT="$AR x" + AR_DELETE="$AR d" + AR='$(CXX) -xar' + AR_FLAGS='-o $@' + AS='/usr/ccs/bin/as' + ASFLAGS="$ASFLAGS -K PIC -L -P -D_ASM -D__STDC__=0" + AS_DASH_C_FLAG='' + TARGET_COMPILER_ABI="sunc" + CC_VERSION=`$CC -V 2>&1 | grep '^cc:' 2>/dev/null | $AWK -F\: '{ print $2 }'` + CXX_VERSION=`$CXX -V 2>&1 | grep '^CC:' 2>/dev/null | $AWK -F\: '{ print $2 }'` + AC_MSG_CHECKING([for Forte compiler version >= WS6U2]) + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + AC_TRY_COMPILE([], + [#if (__SUNPRO_CC < 0x530) + #error "Denied" + #endif], + _BAD_COMPILER=,_BAD_COMPILER=1) + if test -n "$_BAD_COMPILER"; then + _res="no" + AC_MSG_ERROR([Forte version WS6U2 or higher is required to build. Your compiler version is $CC_VERSION .]) + else + _res="yes" + fi + AC_MSG_RESULT([$_res]) + AC_LANG_RESTORE + else + ASFLAGS="$ASFLAGS -fPIC" + DSO_LDOPTS='-G' + _WARNINGS_CFLAGS='' + _WARNINGS_CXXFLAGS='' + if test "$OS_RELEASE" = "5.3"; then + AC_DEFINE(MUST_UNDEF_HAVE_BOOLEAN_AFTER_INCLUDES) + fi + fi + if test "$OS_RELEASE" = "5.5.1"; then + AC_DEFINE(NEED_USLEEP_PROTOTYPE) + fi + ;; + +*-sunos*) + DSO_LDOPTS='-Bdynamic' + MKSHLIB='-$(LD) $(DSO_LDOPTS) -o $@' + MKCSHLIB='-$(LD) $(DSO_LDOPTS) -o $@' + AC_DEFINE(SUNOS4) + AC_DEFINE(SPRINTF_RETURNS_STRING) + case "$(target_os)" in + sunos4.1*) + DLL_SUFFIX='.so.1.0' + ;; + esac + ;; + +*-sysv4.2uw7*) + NSPR_LIBS="-lnspr$NSPR_VERSION -lplc$NSPR_VERSION -lplds$NSPR_VERSION -L/usr/ccs/lib -lcrt" + ;; + +*-os2*) + HOST_NSPR_MDCPUCFG='\"md/_os2.cfg\"' + ;; + +esac + +dnl Only one oddball right now (QNX), but this gives us flexibility +dnl if any other platforms need to override this in the future. +AC_DEFINE_UNQUOTED(D_INO,$DIRENT_INO) + +dnl ======================================================== +dnl Any platform that doesn't have MKSHLIB_FORCE_ALL defined +dnl by now will not have any way to link most binaries (tests +dnl as well as viewer, apprunner, etc.), because some symbols +dnl will be left out of the "composite" .so's by ld as unneeded. +dnl So, by defining NO_LD_ARCHIVE_FLAGS for these platforms, +dnl they can link in the static libs that provide the missing +dnl symbols. +dnl ======================================================== +NO_LD_ARCHIVE_FLAGS= +if test -z "$MKSHLIB_FORCE_ALL" || test -z "$MKSHLIB_UNFORCE_ALL"; then + NO_LD_ARCHIVE_FLAGS=1 +fi +case "$target" in +*-os2*) + NO_LD_ARCHIVE_FLAGS= + ;; +*-aix4.3*|*-aix5*) + NO_LD_ARCHIVE_FLAGS= + ;; +*-openvms*) + NO_LD_ARCHIVE_FLAGS= + ;; +*-msvc*|*-mks*|*-mingw*|*-cygwin*|*-wince) + if test -z "$GNU_CC"; then + NO_LD_ARCHIVE_FLAGS= + fi + ;; +esac +AC_SUBST(NO_LD_ARCHIVE_FLAGS) + +dnl +dnl Indicate that platform requires special thread safe +dnl locking when starting up the OJI JVM +dnl (see mozilla/modules/oji/src/nsJVMManager.cpp) +dnl ======================================================== +case "$target" in + *-hpux*) + AC_DEFINE(MOZ_OJI_REQUIRE_THREAD_SAFE_ON_STARTUP) + ;; +esac + +dnl ======================================================== +dnl = Flags to strip unused symbols from .so components +dnl ======================================================== +case "$target" in + *-linux*) + MOZ_COMPONENTS_VERSION_SCRIPT_LDFLAGS='-Wl,--version-script -Wl,$(BUILD_TOOLS)/gnu-ld-scripts/components-version-script' + ;; + *-solaris*) + if test -z "$GNU_CC"; then + MOZ_COMPONENTS_VERSION_SCRIPT_LDFLAGS='-M $(BUILD_TOOLS)/gnu-ld-scripts/components-mapfile' + else + if test -z "$GCC_USE_GNU_LD"; then + MOZ_COMPONENTS_VERSION_SCRIPT_LDFLAGS='-Wl,-M -Wl,$(BUILD_TOOLS)/gnu-ld-scripts/components-mapfile' + else + MOZ_COMPONENTS_VERSION_SCRIPT_LDFLAGS='-Wl,--version-script -Wl,$(BUILD_TOOLS)/gnu-ld-scripts/components-version-script' + fi + fi + ;; + *-nto*) + MOZ_COMPONENTS_VERSION_SCRIPT_LDFLAGS='-Wl,--version-script,$(BUILD_TOOLS)/gnu-ld-scripts/components-version-script' + ;; + *-darwin*) + MOZ_COMPONENTS_VERSION_SCRIPT_LDFLAGS='-Wl,-exported_symbols_list -Wl,$(BUILD_TOOLS)/gnu-ld-scripts/components-export-list' + ;; + *-cygwin*|*-mingw*|*-mks*|*-msvc|*-wince) + if test -n "$GNU_CC"; then + MOZ_COMPONENTS_VERSION_SCRIPT_LDFLAGS='-Wl,--version-script,$(BUILD_TOOLS)/gnu-ld-scripts/components-version-script' + fi + ;; +esac + +if test -z "$COMPILE_ENVIRONMENT"; then + SKIP_COMPILER_CHECKS=1 +fi + +if test -z "$SKIP_COMPILER_CHECKS"; then +dnl Checks for typedefs, structures, and compiler characteristics. +dnl ======================================================== +AC_LANG_C +AC_HEADER_STDC +AC_C_CONST +AC_TYPE_MODE_T +AC_TYPE_OFF_T +AC_TYPE_PID_T +AC_TYPE_SIZE_T +AC_STRUCT_ST_BLKSIZE +AC_MSG_CHECKING(for siginfo_t) +AC_CACHE_VAL(ac_cv_siginfo_t, + [AC_TRY_COMPILE([#define _POSIX_C_SOURCE 199506L + #include <signal.h>], + [siginfo_t* info;], + [ac_cv_siginfo_t=true], + [ac_cv_siginfo_t=false])]) +if test "$ac_cv_siginfo_t" = true ; then + AC_DEFINE(HAVE_SIGINFO_T) + AC_MSG_RESULT(yes) +else + AC_MSG_RESULT(no) +fi + +dnl Visual Age for os/2 also defines size_t and off_t in certain +dnl header files. These defines make Visual Age use the mozilla +dnl defines types. +if test "$VACPP" = "yes"; then + AC_DEFINE(__size_t) + AC_DEFINE(__off_t) +fi + +dnl Check for int16_t, int32_t, int64_t, int64, uint, uint_t, and uint16_t. +dnl ======================================================== +AC_MSG_CHECKING(for int16_t) +AC_CACHE_VAL(ac_cv_int16_t, + [AC_TRY_COMPILE([#include <stdio.h> + #include <sys/types.h>], + [int16_t foo = 0;], + [ac_cv_int16_t=true], + [ac_cv_int16_t=false])]) +if test "$ac_cv_int16_t" = true ; then + AC_DEFINE(HAVE_INT16_T) + AC_MSG_RESULT(yes) +else + AC_MSG_RESULT(no) +fi +AC_MSG_CHECKING(for int32_t) +AC_CACHE_VAL(ac_cv_int32_t, + [AC_TRY_COMPILE([#include <stdio.h> + #include <sys/types.h>], + [int32_t foo = 0;], + [ac_cv_int32_t=true], + [ac_cv_int32_t=false])]) +if test "$ac_cv_int32_t" = true ; then + AC_DEFINE(HAVE_INT32_T) + AC_MSG_RESULT(yes) +else + AC_MSG_RESULT(no) +fi +AC_MSG_CHECKING(for int64_t) +AC_CACHE_VAL(ac_cv_int64_t, + [AC_TRY_COMPILE([#include <stdio.h> + #include <sys/types.h>], + [int64_t foo = 0;], + [ac_cv_int64_t=true], + [ac_cv_int64_t=false])]) +if test "$ac_cv_int64_t" = true ; then + AC_DEFINE(HAVE_INT64_T) + AC_MSG_RESULT(yes) +else + AC_MSG_RESULT(no) +fi +AC_MSG_CHECKING(for int64) +AC_CACHE_VAL(ac_cv_int64, + [AC_TRY_COMPILE([#include <stdio.h> + #include <sys/types.h>], + [int64 foo = 0;], + [ac_cv_int64=true], + [ac_cv_int64=false])]) +if test "$ac_cv_int64" = true ; then + AC_DEFINE(HAVE_INT64) + AC_MSG_RESULT(yes) +else + AC_MSG_RESULT(no) +fi +AC_MSG_CHECKING(for uint) +AC_CACHE_VAL(ac_cv_uint, + [AC_TRY_COMPILE([#include <stdio.h> + #include <sys/types.h>], + [uint foo = 0;], + [ac_cv_uint=true], + [ac_cv_uint=false])]) +if test "$ac_cv_uint" = true ; then + AC_DEFINE(HAVE_UINT) + AC_MSG_RESULT(yes) +else + AC_MSG_RESULT(no) +fi +AC_MSG_CHECKING(for uint_t) +AC_CACHE_VAL(ac_cv_uint_t, + [AC_TRY_COMPILE([#include <stdio.h> + #include <sys/types.h>], + [uint_t foo = 0;], + [ac_cv_uint_t=true], + [ac_cv_uint_t=false])]) +if test "$ac_cv_uint_t" = true ; then + AC_DEFINE(HAVE_UINT_T) + AC_MSG_RESULT(yes) +else + AC_MSG_RESULT(no) +fi +AC_MSG_CHECKING(for uint16_t) +AC_CACHE_VAL(ac_cv_uint16_t, + [AC_TRY_COMPILE([#include <stdio.h> + #include <sys/types.h>], + [uint16_t foo = 0;], + [ac_cv_uint16_t=true], + [ac_cv_uint16_t=false])]) +if test "$ac_cv_uint16_t" = true ; then + AC_DEFINE(HAVE_UINT16_T) + AC_MSG_RESULT(yes) +else + AC_MSG_RESULT(no) +fi + +dnl On the gcc trunk (as of 2001-02-09) _GNU_SOURCE, and thus __USE_GNU, +dnl are defined when compiling C++ but not C. Since the result of this +dnl test is used only in C++, do it in C++. +AC_LANG_CPLUSPLUS + +AC_MSG_CHECKING(for uname.domainname) +AC_CACHE_VAL(ac_cv_have_uname_domainname_field, + [AC_TRY_COMPILE([#include <sys/utsname.h>], + [ struct utsname *res; char *domain; + (void)uname(res); if (res != 0) { domain = res->domainname; } ], + [ac_cv_have_uname_domainname_field=true], + [ac_cv_have_uname_domainname_field=false])]) + +if test "$ac_cv_have_uname_domainname_field" = "true"; then + AC_DEFINE(HAVE_UNAME_DOMAINNAME_FIELD) + AC_MSG_RESULT(yes) +else + AC_MSG_RESULT(no) +fi + +AC_MSG_CHECKING(for uname.__domainname) +AC_CACHE_VAL(ac_cv_have_uname_us_domainname_field, + [AC_TRY_COMPILE([#include <sys/utsname.h>], + [ struct utsname *res; char *domain; + (void)uname(res); if (res != 0) { domain = res->__domainname; } ], + [ac_cv_have_uname_us_domainname_field=true], + [ac_cv_have_uname_us_domainname_field=false])]) + +if test "$ac_cv_have_uname_us_domainname_field" = "true"; then + AC_DEFINE(HAVE_UNAME_US_DOMAINNAME_FIELD) + AC_MSG_RESULT(yes) +else + AC_MSG_RESULT(no) +fi + +AC_LANG_C + +dnl Check for usable wchar_t (2 bytes, unsigned) +dnl (we really don't need the unsignedness check anymore) +dnl ======================================================== + +AC_CACHE_CHECK(for usable wchar_t (2 bytes, unsigned), + ac_cv_have_usable_wchar_v2, + [AC_TRY_COMPILE([#include <stddef.h> + $configure_static_assert_macros], + [CONFIGURE_STATIC_ASSERT(sizeof(wchar_t) == 2); + CONFIGURE_STATIC_ASSERT((wchar_t)-1 > (wchar_t) 0)], + ac_cv_have_usable_wchar_v2="yes", + ac_cv_have_usable_wchar_v2="no")]) +if test "$ac_cv_have_usable_wchar_v2" = "yes"; then + AC_DEFINE(HAVE_CPP_2BYTE_WCHAR_T) + HAVE_CPP_2BYTE_WCHAR_T=1 +else +dnl This is really gcc-only +dnl Do this test using CXX only since some versions of gcc +dnl 2.95-2.97 have a signed wchar_t in c++ only and some versions +dnl only have short-wchar support for c++. +dnl Note that we assume that mac & win32 have short wchar (see nscore.h) + + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + _SAVE_CXXFLAGS=$CXXFLAGS + CXXFLAGS="$CXXFLAGS -fshort-wchar" + + AC_CACHE_CHECK(for compiler -fshort-wchar option, + ac_cv_have_usable_wchar_option_v2, + [AC_TRY_COMPILE([#include <stddef.h> + $configure_static_assert_macros], + [CONFIGURE_STATIC_ASSERT(sizeof(wchar_t) == 2); + CONFIGURE_STATIC_ASSERT((wchar_t)-1 > (wchar_t) 0)], + ac_cv_have_usable_wchar_option_v2="yes", + ac_cv_have_usable_wchar_option_v2="no")]) + + if test "$ac_cv_have_usable_wchar_option_v2" = "yes"; then + AC_DEFINE(HAVE_CPP_2BYTE_WCHAR_T) + HAVE_CPP_2BYTE_WCHAR_T=1 + else + CXXFLAGS=$_SAVE_CXXFLAGS + fi + AC_LANG_RESTORE +fi + +dnl Check for .hidden assembler directive and visibility attribute. +dnl Borrowed from glibc configure.in +dnl =============================================================== +if test "$GNU_CC"; then + AC_CACHE_CHECK(for visibility(hidden) attribute, + ac_cv_visibility_hidden, + [cat > conftest.c <<EOF + int foo __attribute__ ((visibility ("hidden"))) = 1; +EOF + ac_cv_visibility_hidden=no + if ${CC-cc} -Werror -S conftest.c -o conftest.s >/dev/null 2>&1; then + if egrep '\.(hidden|private_extern).*foo' conftest.s >/dev/null; then + ac_cv_visibility_hidden=yes + fi + fi + rm -f conftest.[cs] + ]) + if test "$ac_cv_visibility_hidden" = "yes"; then + AC_DEFINE(HAVE_VISIBILITY_HIDDEN_ATTRIBUTE) + + AC_CACHE_CHECK(for visibility(default) attribute, + ac_cv_visibility_default, + [cat > conftest.c <<EOF + int foo __attribute__ ((visibility ("default"))) = 1; +EOF + ac_cv_visibility_default=no + if ${CC-cc} -fvisibility=hidden -Werror -S conftest.c -o conftest.s >/dev/null 2>&1; then + if ! egrep '\.(hidden|private_extern).*foo' conftest.s >/dev/null; then + ac_cv_visibility_default=yes + fi + fi + rm -f conftest.[cs] + ]) + if test "$ac_cv_visibility_default" = "yes"; then + AC_DEFINE(HAVE_VISIBILITY_ATTRIBUTE) + + AC_CACHE_CHECK(for visibility pragma support, + ac_cv_visibility_pragma, + [cat > conftest.c <<EOF +#pragma GCC visibility push(hidden) + int foo_hidden = 1; +#pragma GCC visibility push(default) + int foo_default = 1; +EOF + ac_cv_visibility_pragma=no + if ${CC-cc} -Werror -S conftest.c -o conftest.s >/dev/null 2>&1; then + if egrep '\.(hidden|extern_private).*foo_hidden' conftest.s >/dev/null; then + if ! egrep '\.(hidden|extern_private).*foo_default' conftest.s > /dev/null; then + ac_cv_visibility_pragma=yes + fi + fi + fi + rm -f conftest.[cs] + ]) + if test "$ac_cv_visibility_pragma" = "yes"; then + AC_CACHE_CHECK(For gcc visibility bug with class-level attributes (GCC bug 26905), + ac_cv_have_visibility_class_bug, + [cat > conftest.c <<EOF +#pragma GCC visibility push(hidden) +struct __attribute__ ((visibility ("default"))) TestStruct { + static void Init(); +}; +__attribute__ ((visibility ("default"))) void TestFunc() { + TestStruct::Init(); +} +EOF + ac_cv_have_visibility_class_bug=no + if ! ${CXX-g++} ${CXXFLAGS} ${DSO_PIC_CFLAGS} ${DSO_LDOPTS} -S -o conftest.S conftest.c > /dev/null 2>&1 ; then + ac_cv_have_visibility_class_bug=yes + else + if test `grep -c "@PLT" conftest.S` = 0; then + ac_cv_have_visibility_class_bug=yes + fi + fi + rm -rf conftest.{c,S} + ]) + + AC_CACHE_CHECK(For x86_64 gcc visibility bug with builtins (GCC bug 20297), + ac_cv_have_visibility_builtin_bug, + [cat > conftest.c <<EOF +#pragma GCC visibility push(hidden) +#pragma GCC visibility push(default) +#include <string.h> +#pragma GCC visibility pop + +__attribute__ ((visibility ("default"))) void Func() { + char c[[100]]; + memset(c, 0, sizeof(c)); +} +EOF + ac_cv_have_visibility_builtin_bug=no + if ! ${CC-cc} ${CFLAGS} ${DSO_PIC_CFLAGS} ${DSO_LDOPTS} -O2 -S -o conftest.S conftest.c > /dev/null 2>&1 ; then + ac_cv_have_visibility_builtin_bug=yes + else + if test `grep -c "@PLT" conftest.S` = 0; then + ac_cv_visibility_builtin_bug=yes + fi + fi + rm -f conftest.{c,S} + ]) + if test "$ac_cv_have_visibility_builtin_bug" = "no" -a \ + "$ac_cv_have_visibility_class_bug" = "no"; then + VISIBILITY_FLAGS='-I$(DIST)/include/system_wrappers -include $(topsrcdir)/config/gcc_hidden.h' + WRAP_SYSTEM_INCLUDES=1 + else + VISIBILITY_FLAGS='-fvisibility=hidden' + fi # have visibility pragma bug + fi # have visibility pragma + fi # have visibility(default) attribute + fi # have visibility(hidden) attribute +fi # GNU_CC + +AC_SUBST(WRAP_SYSTEM_INCLUDES) +AC_SUBST(VISIBILITY_FLAGS) + +dnl Checks for header files. +dnl ======================================================== +AC_HEADER_DIRENT +case "$target_os" in +freebsd*) +# for stuff like -lXshm + CPPFLAGS="${CPPFLAGS} ${X_CFLAGS}" + ;; +esac +AC_CHECK_HEADERS(sys/byteorder.h compat.h getopt.h) +AC_CHECK_HEADERS(sys/bitypes.h memory.h unistd.h) +AC_CHECK_HEADERS(gnu/libc-version.h nl_types.h) +AC_CHECK_HEADERS(malloc.h) +AC_CHECK_HEADERS(X11/XKBlib.h) + +dnl These are all the places some variant of statfs can be hiding. +AC_CHECK_HEADERS(sys/statvfs.h sys/statfs.h sys/vfs.h sys/mount.h) + +dnl Try for MMX support +dnl NB - later gcc versions require -mmmx for this header to be successfully +dnl included (or another option which implies it, such as -march=pentium-mmx) +AC_CHECK_HEADERS(mmintrin.h) + +dnl Check whether the compiler supports the new-style C++ standard +dnl library headers (i.e. <new>) or needs the old "new.h" +AC_LANG_CPLUSPLUS +NEW_H=new.h +AC_CHECK_HEADER(new, [NEW_H=new]) +AC_DEFINE_UNQUOTED(NEW_H, <$NEW_H>) +AC_LANG_C + +case $target in +*-aix4.3*|*-aix5*) + ;; +*) + AC_CHECK_HEADERS(sys/cdefs.h) + ;; +esac + +dnl Checks for libraries. +dnl ======================================================== +case $target in +*-hpux11.*) + ;; +*) + AC_CHECK_LIB(c_r, gethostbyname_r) + ;; +esac +AC_CHECK_LIB(m, atan) + +dnl We don't want to link with libdl even if it's present on OS X, since +dnl it's not used and not part of the default installation. + +case $target in +*-darwin*) + ;; +*) + AC_CHECK_LIB(dl, dlopen, + AC_CHECK_HEADER(dlfcn.h, + LIBS="-ldl $LIBS" + AC_DEFINE(HAVE_LIBDL))) + ;; +esac +if test ! "$GNU_CXX"; then + + case $target in + *-aix*) + AC_CHECK_LIB(C_r, demangle) + ;; + *) + AC_CHECK_LIB(C, demangle) + ;; + esac +fi +AC_CHECK_LIB(socket, socket) + +XLDFLAGS="$X_LIBS" +XLIBS="$X_EXTRA_LIBS" + +dnl ======================================================== +dnl Checks for X libraries. +dnl Ordering is important. +dnl Xt is dependent upon SM as of X11R6 +dnl ======================================================== +if test "$no_x" = "yes"; then + AC_DEFINE(NO_X11) +else + AC_DEFINE_UNQUOTED(FUNCPROTO,15) + XLIBS="-lX11 $XLIBS" + _SAVE_LDFLAGS="$LDFLAGS" + LDFLAGS="$XLDFLAGS $LDFLAGS" + AC_CHECK_LIB(X11, XDrawLines, [X11_LIBS="-lX11"], + [MISSING_X="$MISSING_X -lX11"], $XLIBS) + AC_CHECK_LIB(Xext, XextAddDisplay, [XEXT_LIBS="-lXext"], + [MISSING_X="$MISSING_X -lXext"], $XLIBS) + + + AC_CHECK_LIB(Xt, XtFree, [ XT_LIBS="-lXt"], [ + unset ac_cv_lib_Xt_XtFree + AC_CHECK_LIB(ICE, IceFlush, [XT_LIBS="-lICE $XT_LIBS"],, $XT_LIBS $XLIBS) + AC_CHECK_LIB(SM, SmcCloseConnection, [XT_LIBS="-lSM $XT_LIBS"],, $XT_LIBS $XLIBS) + AC_CHECK_LIB(Xt, XtFree, [ XT_LIBS="-lXt $XT_LIBS"], + [MISSING_X="$MISSING_X -lXt"], $X_PRE_LIBS $XT_LIBS $XLIBS) + ]) + + # AIX needs the motif library linked before libXt to prevent + # crashes in plugins linked against Motif - Bug #98892 + case "${target_os}" in + aix*) + XT_LIBS="-lXm $XT_LIBS" + ;; + esac + + dnl ======================================================== + dnl = Check for Xinerama + dnl ======================================================== + AC_CHECK_LIB(Xinerama, XineramaIsActive, [MOZ_XINERAMA_LIBS="-lXinerama"],, + $XLIBS $XEXT_LIBS) + AC_CHECK_HEADER(X11/extensions/Xinerama.h) + + dnl ======================================================== + dnl = Check for XShm + dnl ======================================================== + AC_CHECK_LIB(Xext, XShmCreateImage, _HAVE_XSHM_XEXT=1,, + $XLIBS $XEXT_LIBS) + AC_CHECK_HEADER(X11/extensions/XShm.h) + if test -n "$ac_cv_header_X11_extensions_XShm_h" && + test -n "$_HAVE_XSHM_XEXT"; then + AC_DEFINE(HAVE_XSHM) + fi + + dnl ======================================================== + dnl = Check for XIE + dnl ======================================================== + AC_CHECK_LIB(XIE, XieFloGeometry, [MOZ_XIE_LIBS="-lXIE"],, + $XLIBS $XEXT_LIBS) + AC_CHECK_HEADER(X11/extensions/XIElib.h) + + if test "$MOZ_XIE_LIBS"; then + dnl ==================================================== + dnl = If XIE is present and is desired, turn it on + dnl ==================================================== + case $target in + *-hpux*) + ;; + *) + HAVE_XIE=1 + ;; + esac + fi + + LDFLAGS="$_SAVE_LDFLAGS" + + AC_CHECK_FT2(6.1.0, [_HAVE_FREETYPE2=1], [_HAVE_FREETYPE2=]) + +fi # $no_x + +AC_SUBST(XCFLAGS) +AC_SUBST(XLDFLAGS) +AC_SUBST(XLIBS) +AC_SUBST(XT_LIBS) + +dnl ======================================================== +dnl = pthread support +dnl = Start by checking whether the system support pthreads +dnl ======================================================== +MOZ_CHECK_PTHREADS(pthreads, + USE_PTHREADS=1 _PTHREAD_LDFLAGS="-lpthreads", + MOZ_CHECK_PTHREADS(pthread, + USE_PTHREADS=1 _PTHREAD_LDFLAGS="-lpthread", + MOZ_CHECK_PTHREADS(c_r, + USE_PTHREADS=1 _PTHREAD_LDFLAGS="-lc_r", + MOZ_CHECK_PTHREADS(c, + USE_PTHREADS=1 + ) + ) + ) +) + +dnl ======================================================== +dnl Check the command line for --with-pthreads +dnl ======================================================== +MOZ_ARG_WITH_BOOL(pthreads, +[ --with-pthreads Force use of system pthread library with NSPR ], +[ if test "$USE_PTHREADS"x = x; then + AC_MSG_ERROR([ --with-pthreads specified for a system without pthread support ]); +fi], + USE_PTHREADS= + _PTHREAD_LDFLAGS= +) + +dnl ======================================================== +dnl Do the platform specific pthread hackery +dnl ======================================================== +if test "$USE_PTHREADS"x != x +then + dnl + dnl See if -pthread is supported. + dnl + rm -f conftest* + ac_cv_have_dash_pthread=no + AC_MSG_CHECKING(whether ${CC-cc} accepts -pthread) + echo 'int main() { return 0; }' | cat > conftest.c + ${CC-cc} -pthread -o conftest conftest.c > conftest.out 2>&1 + if test $? -eq 0; then + if test -z "`egrep -i '(unrecognize|unknown)' conftest.out | grep pthread`" && test -z "`egrep -i '(error|incorrect)' conftest.out`" ; then + ac_cv_have_dash_pthread=yes + case "$target_os" in + freebsd*) +# Freebsd doesn't use -pthread for compiles, it uses them for linking + ;; + *) + CFLAGS="$CFLAGS -pthread" + CXXFLAGS="$CXXFLAGS -pthread" + ;; + esac + fi + fi + rm -f conftest* + AC_MSG_RESULT($ac_cv_have_dash_pthread) + + dnl + dnl See if -pthreads is supported. + dnl + ac_cv_have_dash_pthreads=no + if test "$ac_cv_have_dash_pthread" = "no"; then + AC_MSG_CHECKING(whether ${CC-cc} accepts -pthreads) + echo 'int main() { return 0; }' | cat > conftest.c + ${CC-cc} -pthreads -o conftest conftest.c > conftest.out 2>&1 + if test $? -eq 0; then + if test -z "`egrep -i '(unrecognize|unknown)' conftest.out | grep pthreads`" && test -z "`egrep -i '(error|incorrect)' conftest.out`" ; then + ac_cv_have_dash_pthreads=yes + CFLAGS="$CFLAGS -pthreads" + CXXFLAGS="$CXXFLAGS -pthreads" + fi + fi + rm -f conftest* + AC_MSG_RESULT($ac_cv_have_dash_pthreads) + fi + + case "$target" in + *-*-freebsd*) + AC_DEFINE(_REENTRANT) + AC_DEFINE(_THREAD_SAFE) + dnl -pthread links in -lc_r, so don't specify it explicitly. + if test "$ac_cv_have_dash_pthread" = "yes"; then + _PTHREAD_LDFLAGS="-pthread" + else + _PTHREAD_LDFLAGS="-lc_r" + fi + ;; + + *-*-openbsd*|*-*-bsdi*) + AC_DEFINE(_REENTRANT) + AC_DEFINE(_THREAD_SAFE) + dnl -pthread links in -lc_r, so don't specify it explicitly. + if test "$ac_cv_have_dash_pthread" = "yes"; then + _PTHREAD_LDFLAGS="-pthread" + LDFLAGS="${_PTHREAD_LDFLAGS} ${LDFLAGS}" + fi + ;; + + *-*-linux*) + AC_DEFINE(_REENTRANT) + ;; + + *-*-nto*) + AC_DEFINE(_REENTRANT) + ;; + + *-aix4.3*|*-aix5*) + AC_DEFINE(_REENTRANT) + ;; + + *-hpux11.*) + AC_DEFINE(_REENTRANT) + ;; + + alpha*-*-osf*) + AC_DEFINE(_REENTRANT) + ;; + + *-*-solaris*) + AC_DEFINE(_REENTRANT) + if test ! "$GNU_CC"; then + CFLAGS="$CFLAGS -mt" + CXXFLAGS="$CXXFLAGS -mt" + fi + ;; + esac +fi + +dnl ======================================================== +dnl See if mmap sees writes +dnl For cross compiling, just define it as no, which is a safe default +dnl ======================================================== +AC_MSG_CHECKING(whether mmap() sees write()s) + +changequote(,) +mmap_test_prog=' + #include <stdlib.h> + #include <unistd.h> + #include <sys/mman.h> + #include <sys/types.h> + #include <sys/stat.h> + #include <fcntl.h> + + char fname[] = "conftest.file"; + char zbuff[1024]; /* Fractional page is probably worst case */ + + int main() { + char *map; + int fd; + int i; + unlink(fname); + fd = open(fname, O_RDWR | O_CREAT, 0660); + if(fd<0) return 1; + unlink(fname); + write(fd, zbuff, sizeof(zbuff)); + lseek(fd, 0, SEEK_SET); + map = (char*)mmap(0, sizeof(zbuff), PROT_READ, MAP_SHARED, fd, 0); + if(map==(char*)-1) return 2; + for(i=0; fname[i]; i++) { + int rc = write(fd, &fname[i], 1); + if(map[i]!=fname[i]) return 4; + } + return 0; + } +' +changequote([,]) + +AC_TRY_RUN($mmap_test_prog , result="yes", result="no", result="yes") + +AC_MSG_RESULT("$result") + +if test "$result" = "no"; then + AC_DEFINE(MMAP_MISSES_WRITES) +fi + + +dnl Checks for library functions. +dnl ======================================================== +AC_PROG_GCC_TRADITIONAL +AC_FUNC_MEMCMP +AC_CHECK_FUNCS(random strerror lchown fchmod snprintf statvfs memmove rint stat64 lstat64) +AC_CHECK_FUNCS(flockfile getpagesize) + +dnl localtime_r and strtok_r are only present on MacOS version 10.2 and higher +if test -z "$MACOS_DEPLOYMENT_TARGET" || test "$MACOS_DEPLOYMENT_TARGET" -ge "100200"; then + AC_CHECK_FUNCS(localtime_r strtok_r) +fi + +dnl check for wcrtomb/mbrtowc +dnl ======================================================================= +if test -z "$MACOS_DEPLOYMENT_TARGET" || test "$MACOS_DEPLOYMENT_TARGET" -ge "100300"; then +AC_LANG_SAVE +AC_LANG_CPLUSPLUS +AC_CACHE_CHECK(for wcrtomb, + ac_cv_have_wcrtomb, + [AC_TRY_LINK([#include <wchar.h>], + [mbstate_t ps={0};wcrtomb(0,'f',&ps);], + ac_cv_have_wcrtomb="yes", + ac_cv_have_wcrtomb="no")]) +if test "$ac_cv_have_wcrtomb" = "yes"; then + AC_DEFINE(HAVE_WCRTOMB) +fi +AC_CACHE_CHECK(for mbrtowc, + ac_cv_have_mbrtowc, + [AC_TRY_LINK([#include <wchar.h>], + [mbstate_t ps={0};mbrtowc(0,0,0,&ps);], + ac_cv_have_mbrtowc="yes", + ac_cv_have_mbrtowc="no")]) +if test "$ac_cv_have_mbrtowc" = "yes"; then + AC_DEFINE(HAVE_MBRTOWC) +fi +AC_LANG_RESTORE +fi + +AC_CACHE_CHECK( + [for res_ninit()], + ac_cv_func_res_ninit, + [AC_TRY_LINK([ + #ifdef linux + #define _BSD_SOURCE 1 + #endif + #include <resolv.h> + ], + [int foo = res_ninit(&_res);], + [ac_cv_func_res_ninit=yes], + [ac_cv_func_res_ninit=no]) + ]) + +if test "$ac_cv_func_res_ninit" = "yes"; then + AC_DEFINE(HAVE_RES_NINIT) +dnl must add the link line we do something as foolish as this... dougt +dnl else +dnl AC_CHECK_LIB(bind, res_ninit, AC_DEFINE(HAVE_RES_NINIT), +dnl AC_CHECK_LIB(resolv, res_ninit, AC_DEFINE(HAVE_RES_NINIT))) +fi + +AC_LANG_CPLUSPLUS +AC_CACHE_CHECK( + [for gnu_get_libc_version()], + ac_cv_func_gnu_get_libc_version, + [AC_TRY_LINK([ + #ifdef HAVE_GNU_LIBC_VERSION_H + #include <gnu/libc-version.h> + #endif + ], + [const char *glibc_version = gnu_get_libc_version();], + [ac_cv_func_gnu_get_libc_version=yes], + [ac_cv_func_gnu_get_libc_version=no] + )] + ) + +if test "$ac_cv_func_gnu_get_libc_version" = "yes"; then + AC_DEFINE(HAVE_GNU_GET_LIBC_VERSION) +fi + +case $target_os in + os2*|msvc*|mks*|cygwin*|mingw*|darwin*|wince*) + ;; + *) + +AC_CHECK_LIB(c, iconv, [_ICONV_LIBS="$_ICONV_LIBS"], + AC_CHECK_LIB(iconv, iconv, [_ICONV_LIBS="$_ICONV_LIBS -liconv"], + AC_CHECK_LIB(iconv, libiconv, [_ICONV_LIBS="$_ICONV_LIBS -liconv"]))) +_SAVE_LIBS=$LIBS +LIBS="$LIBS $_ICONV_LIBS" +AC_CACHE_CHECK( + [for iconv()], + ac_cv_func_iconv, + [AC_TRY_LINK([ + #include <stdlib.h> + #include <iconv.h> + ], + [ + iconv_t h = iconv_open("", ""); + iconv(h, NULL, NULL, NULL, NULL); + iconv_close(h); + ], + [ac_cv_func_iconv=yes], + [ac_cv_func_iconv=no] + )] + ) +if test "$ac_cv_func_iconv" = "yes"; then + AC_DEFINE(HAVE_ICONV) + DYNAMIC_XPCOM_LIBS="$DYNAMIC_XPCOM_LIBS $_ICONV_LIBS" + LIBXUL_LIBS="$LIBXUL_LIBS $_ICONV_LIBS" + LIBICONV="$_ICONV_LIBS" + AC_CACHE_CHECK( + [for iconv() with const input], + ac_cv_func_const_iconv, + [AC_TRY_COMPILE([ + #include <stdlib.h> + #include <iconv.h> + ], + [ + const char *input = "testing"; + iconv_t h = iconv_open("", ""); + iconv(h, &input, NULL, NULL, NULL); + iconv_close(h); + ], + [ac_cv_func_const_iconv=yes], + [ac_cv_func_const_iconv=no] + )] + ) + if test "$ac_cv_func_const_iconv" = "yes"; then + AC_DEFINE(HAVE_ICONV_WITH_CONST_INPUT) + fi +fi +LIBS=$_SAVE_LIBS + + ;; +esac + +AM_LANGINFO_CODESET + +AC_LANG_C + +dnl ********************** +dnl *** va_copy checks *** +dnl ********************** +dnl we currently check for all three va_copy possibilities, so we get +dnl all results in config.log for bug reports. +AC_MSG_CHECKING(for an implementation of va_copy()) +AC_CACHE_VAL(ac_cv_va_copy,[ + AC_TRY_RUN([ + #include <stdarg.h> + void f (int i, ...) { + va_list args1, args2; + va_start (args1, i); + va_copy (args2, args1); + if (va_arg (args2, int) != 42 || va_arg (args1, int) != 42) + exit (1); + va_end (args1); va_end (args2); + } + int main() { f (0, 42); return 0; }], + ac_cv_va_copy=yes, + ac_cv_va_copy=no, + ac_cv_va_copy=no + ) +]) +AC_MSG_RESULT($ac_cv_va_copy) +AC_MSG_CHECKING(for an implementation of __va_copy()) +AC_CACHE_VAL(ac_cv___va_copy,[ + AC_TRY_RUN([ + #include <stdarg.h> + void f (int i, ...) { + va_list args1, args2; + va_start (args1, i); + __va_copy (args2, args1); + if (va_arg (args2, int) != 42 || va_arg (args1, int) != 42) + exit (1); + va_end (args1); va_end (args2); + } + int main() { f (0, 42); return 0; }], + ac_cv___va_copy=yes, + ac_cv___va_copy=no, + ac_cv___va_copy=no + ) +]) +AC_MSG_RESULT($ac_cv___va_copy) +AC_MSG_CHECKING(whether va_lists can be copied by value) +AC_CACHE_VAL(ac_cv_va_val_copy,[ + AC_TRY_RUN([ + #include <stdarg.h> + void f (int i, ...) { + va_list args1, args2; + va_start (args1, i); + args2 = args1; + if (va_arg (args2, int) != 42 || va_arg (args1, int) != 42) + exit (1); + va_end (args1); va_end (args2); + } + int main() { f (0, 42); return 0; }], + ac_cv_va_val_copy=yes, + ac_cv_va_val_copy=no, + ac_cv_va_val_copy=yes + ) +]) +if test "x$ac_cv_va_copy" = "xyes"; then + AC_DEFINE(VA_COPY, va_copy) + AC_DEFINE(HAVE_VA_COPY) +elif test "x$ac_cv___va_copy" = "xyes"; then + AC_DEFINE(VA_COPY, __va_copy) + AC_DEFINE(HAVE_VA_COPY) +fi + +if test "x$ac_cv_va_val_copy" = "xno"; then + AC_DEFINE(HAVE_VA_LIST_AS_ARRAY) +fi +AC_MSG_RESULT($ac_cv_va_val_copy) + +dnl Check for dll-challenged libc's. +dnl This check is apparently only needed for Linux. +case "$target" in + *-linux*) + dnl =================================================================== + _curdir=`pwd` + export _curdir + rm -rf conftest* _conftest + mkdir _conftest + cat >> conftest.C <<\EOF +#include <stdio.h> +#include <link.h> +#include <dlfcn.h> +#ifdef _dl_loaded +void __dump_link_map(void) { + struct link_map *map = _dl_loaded; + while (NULL != map) {printf("0x%08x %s\n", map->l_addr, map->l_name); map = map->l_next;} +} +int main() { + dlopen("./conftest1.so",RTLD_LAZY); + dlopen("./../_conftest/conftest1.so",RTLD_LAZY); + dlopen("CURDIR/_conftest/conftest1.so",RTLD_LAZY); + dlopen("CURDIR/_conftest/../_conftest/conftest1.so",RTLD_LAZY); + __dump_link_map(); +} +#else +/* _dl_loaded isn't defined, so this should be either a libc5 (glibc1) system, or a glibc2 system that doesn't have the multiple load bug (i.e., RH6.0).*/ +int main() { printf("./conftest1.so\n"); } +#endif +EOF + + $PERL -p -i -e "s/CURDIR/\$ENV{_curdir}/g;" conftest.C + + cat >> conftest1.C <<\EOF +#include <stdio.h> +void foo(void) {printf("foo in dll called\n");} +EOF + ${CXX-g++} -fPIC -c -g conftest1.C + ${CXX-g++} -shared -Wl,-h -Wl,conftest1.so -o conftest1.so conftest1.o + ${CXX-g++} -g conftest.C -o conftest -ldl + cp -f conftest1.so conftest _conftest + cd _conftest + if test `./conftest | grep conftest1.so | wc -l` -gt 1 + then + echo + echo "*** Your libc has a bug that can result in loading the same dynamic" + echo "*** library multiple times. This bug is known to be fixed in glibc-2.0.7-32" + echo "*** or later. However, if you choose not to upgrade, the only effect" + echo "*** will be excessive memory usage at runtime." + echo + fi + cd ${_curdir} + rm -rf conftest* _conftest + dnl =================================================================== + ;; +esac + +dnl =================================================================== +dnl ======================================================== +dnl By default, turn rtti and exceptions off on g++/egcs +dnl ======================================================== +if test "$GNU_CXX"; then + + AC_MSG_CHECKING(for C++ exceptions flag) + + dnl They changed -f[no-]handle-exceptions to -f[no-]exceptions in g++ 2.8 + AC_CACHE_VAL(ac_cv_cxx_exceptions_flags, + [echo "int main() { return 0; }" | cat > conftest.C + + ${CXX-g++} ${CXXFLAGS} -c -fno-handle-exceptions conftest.C > conftest.out 2>&1 + + if egrep "warning.*renamed" conftest.out >/dev/null; then + ac_cv_cxx_exceptions_flags=${_COMPILER_PREFIX}-fno-exceptions + else + ac_cv_cxx_exceptions_flags=${_COMPILER_PREFIX}-fno-handle-exceptions + fi + + rm -f conftest*]) + + AC_MSG_RESULT($ac_cv_cxx_exceptions_flags) + _MOZ_EXCEPTIONS_FLAGS_OFF=$ac_cv_cxx_exceptions_flags + _MOZ_EXCEPTIONS_FLAGS_ON=`echo $ac_cv_cxx_exceptions_flags | sed 's|no-||'` +fi + +dnl ======================================================== +dnl Put your C++ language/feature checks below +dnl ======================================================== +AC_LANG_CPLUSPLUS + +HAVE_GCC3_ABI= +if test "$GNU_CC"; then + AC_CACHE_CHECK(for gcc 3.0 ABI, + ac_cv_gcc_three_abi, + [AC_TRY_COMPILE([], + [ +#if defined(__GXX_ABI_VERSION) && __GXX_ABI_VERSION >= 100 /* G++ V3 ABI */ + return 0; +#else +#error Not gcc3. +#endif + ], + ac_cv_gcc_three_abi="yes", + ac_cv_gcc_three_abi="no")]) + if test "$ac_cv_gcc_three_abi" = "yes"; then + TARGET_COMPILER_ABI="${TARGET_COMPILER_ABI-gcc3}" + HAVE_GCC3_ABI=1 + else + TARGET_COMPILER_ABI="${TARGET_COMPILER_ABI-gcc2}" + fi +fi +AC_SUBST(HAVE_GCC3_ABI) + + +AC_CACHE_CHECK(for C++ \"explicit\" keyword, + ac_cv_cpp_explicit, + [AC_TRY_COMPILE(class X { + public: explicit X(int i) : i_(i) {} + private: int i_; + };, + X x(3);, + ac_cv_cpp_explicit=yes, + ac_cv_cpp_explicit=no)]) +if test "$ac_cv_cpp_explicit" = yes ; then + AC_DEFINE(HAVE_CPP_EXPLICIT) +fi + +AC_CACHE_CHECK(for C++ \"typename\" keyword, + ac_cv_cpp_typename, + [AC_TRY_COMPILE(class param { + public: + typedef unsigned long num_type; + }; + + template <class T> class tplt { + public: + typedef typename T::num_type t_num_type; + t_num_type foo(typename T::num_type num) { + return num; + } + };, + tplt<param> A; + A.foo(0);, + ac_cv_cpp_typename=yes, + ac_cv_cpp_typename=no)]) +if test "$ac_cv_cpp_typename" = yes ; then + AC_DEFINE(HAVE_CPP_TYPENAME) +fi + +dnl Check for support of modern template specialization syntax +dnl Test code and requirement from scc@netscape.com. +dnl Autoconf cut-and-paste job by waterson@netscape.com +AC_CACHE_CHECK(for modern C++ template specialization syntax support, + ac_cv_cpp_modern_specialize_template_syntax, + [AC_TRY_COMPILE(template <class T> struct X { int a; }; + class Y {}; + template <> struct X<Y> { double a; };, + X<int> int_x; + X<Y> y_x;, + ac_cv_cpp_modern_specialize_template_syntax=yes, + ac_cv_cpp_modern_specialize_template_syntax=no)]) +if test "$ac_cv_cpp_modern_specialize_template_syntax" = yes ; then + AC_DEFINE(HAVE_CPP_MODERN_SPECIALIZE_TEMPLATE_SYNTAX) +fi + + +dnl Some compilers support only full specialization, and some don't. +AC_CACHE_CHECK(whether partial template specialization works, + ac_cv_cpp_partial_specialization, + [AC_TRY_COMPILE(template <class T> class Foo {}; + template <class T> class Foo<T*> {};, + return 0;, + ac_cv_cpp_partial_specialization=yes, + ac_cv_cpp_partial_specialization=no)]) +if test "$ac_cv_cpp_partial_specialization" = yes ; then + AC_DEFINE(HAVE_CPP_PARTIAL_SPECIALIZATION) +fi + +dnl Some compilers have limited support for operators with templates; +dnl specifically, it is necessary to define derived operators when a base +dnl class's operator declaration should suffice. +AC_CACHE_CHECK(whether operators must be re-defined for templates derived from templates, + ac_cv_need_derived_template_operators, + [AC_TRY_COMPILE([template <class T> class Base { }; + template <class T> + Base<T> operator+(const Base<T>& lhs, const Base<T>& rhs) { return lhs; } + template <class T> class Derived : public Base<T> { };], + [Derived<char> a, b; + Base<char> c = a + b; + return 0;], + ac_cv_need_derived_template_operators=no, + ac_cv_need_derived_template_operators=yes)]) +if test "$ac_cv_need_derived_template_operators" = yes ; then + AC_DEFINE(NEED_CPP_DERIVED_TEMPLATE_OPERATORS) +fi + + +dnl Some compilers have trouble detecting that a template class +dnl that derives from another template is actually an instance +dnl of the base class. This test checks for that. +AC_CACHE_CHECK(whether we need to cast a derived template to pass as its base class, + ac_cv_need_cpp_template_cast_to_base, + [AC_TRY_COMPILE([template <class T> class Base { }; + template <class T> class Derived : public Base<T> { }; + template <class T> int foo(const Base<T>&) { return 0; }], + [Derived<char> bar; return foo(bar);], + ac_cv_need_cpp_template_cast_to_base=no, + ac_cv_need_cpp_template_cast_to_base=yes)]) +if test "$ac_cv_need_cpp_template_cast_to_base" = yes ; then + AC_DEFINE(NEED_CPP_TEMPLATE_CAST_TO_BASE) +fi + +dnl Some compilers have trouble resolving the ambiguity between two +dnl functions whose arguments differ only by cv-qualifications. +AC_CACHE_CHECK(whether the compiler can resolve const ambiguities for templates, + ac_cv_can_resolve_const_ambiguity, + [AC_TRY_COMPILE([ + template <class T> class ptrClass { + public: T* ptr; + }; + + template <class T> T* a(ptrClass<T> *arg) { + return arg->ptr; + } + + template <class T> + const T* a(const ptrClass<T> *arg) { + return arg->ptr; + } + ], + [ ptrClass<int> i; + a(&i); ], + ac_cv_can_resolve_const_ambiguity=yes, + ac_cv_can_resolve_const_ambiguity=no)]) +if test "$ac_cv_can_resolve_const_ambiguity" = no ; then + AC_DEFINE(CANT_RESOLVE_CPP_CONST_AMBIGUITY) +fi + +dnl +dnl We dont do exceptions on unix. The only reason this used to be here +dnl is that mozilla/xpcom/tests/TestCOMPtr.cpp has a test which uses +dnl exceptions. But, we turn exceptions off by default and this test breaks. +dnl So im commenting this out until someone writes some artificial +dnl intelligence to detect not only if the compiler has exceptions, but if +dnl they are enabled as well. +dnl +dnl AC_CACHE_CHECK(for C++ \"exceptions\", +dnl ac_cv_cpp_exceptions, +dnl [AC_TRY_COMPILE(class X { public: X() {} }; +dnl static void F() { throw X(); }, +dnl try { F(); } catch(X & e) { }, +dnl ac_cv_cpp_exceptions=yes, +dnl ac_cv_cpp_exceptions=no)]) +dnl if test $ac_cv_cpp_exceptions = yes ; then +dnl AC_DEFINE(HAVE_CPP_EXCEPTIONS) +dnl fi + +dnl Some compilers have marginal |using| support; for example, gcc-2.7.2.3 +dnl supports it well enough to allow us to use it to change access, but not +dnl to resolve ambiguity. The next two tests determine how well the |using| +dnl keyword is supported. +dnl +dnl Check to see if we can change access with |using|. Test both a +dnl legal and an illegal example. +AC_CACHE_CHECK(whether the C++ \"using\" keyword can change access, + ac_cv_cpp_access_changing_using2, + [AC_TRY_COMPILE( + class A { protected: int foo() { return 0; } }; + class B : public A { public: using A::foo; };, + B b; return b.foo();, + [AC_TRY_COMPILE( + class A { public: int foo() { return 1; } }; + class B : public A { private: using A::foo; };, + B b; return b.foo();, + ac_cv_cpp_access_changing_using2=no, + ac_cv_cpp_access_changing_using2=yes)], + ac_cv_cpp_access_changing_using2=no)]) +if test "$ac_cv_cpp_access_changing_using2" = yes ; then + AC_DEFINE(HAVE_CPP_ACCESS_CHANGING_USING) +fi + +dnl Check to see if we can resolve ambiguity with |using|. +AC_CACHE_CHECK(whether the C++ \"using\" keyword resolves ambiguity, + ac_cv_cpp_ambiguity_resolving_using, + [AC_TRY_COMPILE(class X { + public: int go(const X&) {return 3;} + int jo(const X&) {return 3;} + }; + class Y : public X { + public: int go(int) {return 2;} + int jo(int) {return 2;} + using X::jo; + private: using X::go; + };, + X x; Y y; y.jo(x);, + ac_cv_cpp_ambiguity_resolving_using=yes, + ac_cv_cpp_ambiguity_resolving_using=no)]) +if test "$ac_cv_cpp_ambiguity_resolving_using" = yes ; then + AC_DEFINE(HAVE_CPP_AMBIGUITY_RESOLVING_USING) +fi + +dnl Check to see if the |std| namespace is supported. If so, we'll want +dnl to qualify any standard library calls with "std::" to ensure that +dnl those functions can be resolved. +AC_CACHE_CHECK(for \"std::\" namespace, + ac_cv_cpp_namespace_std, + [AC_TRY_COMPILE([#include <algorithm>], + [return std::min(0, 1);], + ac_cv_cpp_namespace_std=yes, + ac_cv_cpp_namespace_std=no)]) +if test "$ac_cv_cpp_namespace_std" = yes ; then + AC_DEFINE(HAVE_CPP_NAMESPACE_STD) +fi + +dnl Older compilers are overly ambitious with respect to using the standard +dnl template library's |operator!=()| when |operator==()| is defined. In +dnl which case, defining |operator!=()| in addition to |operator==()| causes +dnl ambiguity at compile-time. This test checks for that case. +AC_CACHE_CHECK(whether standard template operator!=() is ambiguous, + ac_cv_cpp_unambiguous_std_notequal, + [AC_TRY_COMPILE([#include <algorithm> + struct T1 {}; + int operator==(const T1&, const T1&) { return 0; } + int operator!=(const T1&, const T1&) { return 0; }], + [T1 a,b; return a != b;], + ac_cv_cpp_unambiguous_std_notequal=unambiguous, + ac_cv_cpp_unambiguous_std_notequal=ambiguous)]) +if test "$ac_cv_cpp_unambiguous_std_notequal" = unambiguous ; then + AC_DEFINE(HAVE_CPP_UNAMBIGUOUS_STD_NOTEQUAL) +fi + + +AC_CACHE_CHECK(for C++ reinterpret_cast, + ac_cv_cpp_reinterpret_cast, + [AC_TRY_COMPILE(struct X { int i; }; + struct Y { int i; };, + X x; X*const z = &x;Y*y = reinterpret_cast<Y*>(z);, + ac_cv_cpp_reinterpret_cast=yes, + ac_cv_cpp_reinterpret_cast=no)]) +if test "$ac_cv_cpp_reinterpret_cast" = yes ; then + AC_DEFINE(HAVE_CPP_NEW_CASTS) +fi + +dnl See if a dynamic_cast to void* gives the most derived object. +AC_CACHE_CHECK(for C++ dynamic_cast to void*, + ac_cv_cpp_dynamic_cast_void_ptr, + [AC_TRY_RUN([class X { int i; public: virtual ~X() { } }; + class Y { int j; public: virtual ~Y() { } }; + class Z : public X, public Y { int k; }; + + int main() { + Z mdo; + X *subx = (X*)&mdo; + Y *suby = (Y*)&mdo; + return !((((void*)&mdo != (void*)subx) && + ((void*)&mdo == dynamic_cast<void*>(subx))) || + (((void*)&mdo != (void*)suby) && + ((void*)&mdo == dynamic_cast<void*>(suby)))); + }], + ac_cv_cpp_dynamic_cast_void_ptr=yes, + ac_cv_cpp_dynamic_cast_void_ptr=no, + ac_cv_cpp_dynamic_cast_void_ptr=no)]) +if test "$ac_cv_cpp_dynamic_cast_void_ptr" = yes ; then + AC_DEFINE(HAVE_CPP_DYNAMIC_CAST_TO_VOID_PTR) +fi + + +dnl note that this one is reversed - if the test fails, then +dnl we require implementations of unused virtual methods. Which +dnl really blows because it means we'll have useless vtable +dnl bloat. +AC_CACHE_CHECK(whether C++ requires implementation of unused virtual methods, + ac_cv_cpp_unused_required, + [AC_TRY_LINK(class X {private: virtual void never_called();};, + X x;, + ac_cv_cpp_unused_required=no, + ac_cv_cpp_unused_required=yes)]) +if test "$ac_cv_cpp_unused_required" = yes ; then + AC_DEFINE(NEED_CPP_UNUSED_IMPLEMENTATIONS) +fi + + +dnl Some compilers have trouble comparing a constant reference to a templatized +dnl class to zero, and require an explicit operator==() to be defined that takes +dnl an int. This test separates the strong from the weak. + +AC_CACHE_CHECK(for trouble comparing to zero near std::operator!=(), + ac_cv_trouble_comparing_to_zero, + [AC_TRY_COMPILE([#include <algorithm> + template <class T> class Foo {}; + class T2; + template <class T> int operator==(const T2*, const T&) { return 0; } + template <class T> int operator!=(const T2*, const T&) { return 0; }], + [Foo<int> f; return (0 != f);], + ac_cv_trouble_comparing_to_zero=no, + ac_cv_trouble_comparing_to_zero=yes)]) +if test "$ac_cv_trouble_comparing_to_zero" = yes ; then + AC_DEFINE(HAVE_CPP_TROUBLE_COMPARING_TO_ZERO) +fi + + + +dnl End of C++ language/feature checks +AC_LANG_C + +dnl ======================================================== +dnl = Internationalization checks +dnl ======================================================== +dnl +dnl Internationalization and Locale support is different +dnl on various UNIX platforms. Checks for specific i18n +dnl features go here. + +dnl check for LC_MESSAGES +AC_CACHE_CHECK(for LC_MESSAGES, + ac_cv_i18n_lc_messages, + [AC_TRY_COMPILE([#include <locale.h>], + [int category = LC_MESSAGES;], + ac_cv_i18n_lc_messages=yes, + ac_cv_i18n_lc_messages=no)]) +if test "$ac_cv_i18n_lc_messages" = yes; then + AC_DEFINE(HAVE_I18N_LC_MESSAGES) +fi + +fi # SKIP_COMPILER_CHECKS + +TARGET_XPCOM_ABI= +if test -n "${CPU_ARCH}" -a -n "${TARGET_COMPILER_ABI}"; then + TARGET_XPCOM_ABI="${CPU_ARCH}-${TARGET_COMPILER_ABI}" +fi + +dnl Mozilla specific options +dnl ======================================================== +dnl The macros used for command line options +dnl are defined in build/autoconf/altoptions.m4. + + +dnl ======================================================== +dnl = +dnl = Check for external package dependencies +dnl = +dnl ======================================================== +MOZ_ARG_HEADER(External Packages) + +dnl ======================================================== +dnl = If NSPR was not detected in the system, +dnl = use the one in the source tree (mozilla/nsprpub) +dnl ======================================================== +MOZ_ARG_WITH_BOOL(system-nspr, +[ --with-system-nspr Use system installed NSPR], + _USE_SYSTEM_NSPR=1 ) + +if test -n "$_USE_SYSTEM_NSPR"; then + AM_PATH_NSPR(4.0.0, [MOZ_NATIVE_NSPR=1], [MOZ_NATIVE_NSPR=]) +fi + +if test -z "$MOZ_NATIVE_NSPR"; then + NSPR_CFLAGS='`$(DEPTH)/nsprpub/config/nspr-config --prefix=$(DIST) --includedir=$(DIST)/include/nspr --cflags`' + # explicitly set libs for Visual Age C++ for OS/2 + if test "$OS_ARCH" = "OS2" -a "$VACPP" = "yes"; then + NSPR_LIBS='$(DIST)/lib/nspr'$NSPR_VERSION'.lib $(DIST)/lib/plc'$NSPR_VERSION'.lib $(DIST)/lib/plds'$NSPR_VERSION'.lib '$_PTHREAD_LDFLAGS'' + elif test "$OS_ARCH" = "WINCE"; then + NSPR_CFLAGS='-I$(DIST)/include/nspr' + NSPR_LIBS='$(DIST)/lib/nspr'$NSPR_VERSION'.lib $(DIST)/lib/plc'$NSPR_VERSION'.lib $(DIST)/lib/plds'$NSPR_VERSION'.lib ' + elif test "$OS_ARCH" = "WINNT"; then + NSPR_CFLAGS='-I$(DIST)/include/nspr' + if test -n "$GNU_CC"; then + NSPR_LIBS="-L\$(DIST)/lib -lnspr$NSPR_VERSION -lplc$NSPR_VERSION -lplds$NSPR_VERSION" + else + NSPR_LIBS='$(DIST)/lib/nspr'$NSPR_VERSION'.lib $(DIST)/lib/plc'$NSPR_VERSION'.lib $(DIST)/lib/plds'$NSPR_VERSION'.lib ' + fi + else + NSPR_LIBS='`$(DEPTH)/nsprpub/config/nspr-config --prefix=$(DIST) --libdir=$(DIST)/lib --libs`' + fi +fi + +dnl ======================================================== +dnl = If NSS was not detected in the system, +dnl = use the one in the source tree (mozilla/security/nss) +dnl ======================================================== + +MOZ_ARG_WITH_BOOL(system-nss, +[ --with-system-nss Use system installed NSS], + _USE_SYSTEM_NSS=1 ) + +if test -n "$_USE_SYSTEM_NSS"; then + AM_PATH_NSS(3.0.0, [MOZ_NATIVE_NSS=1], [MOZ_NATIVE_NSS=]) +fi + +if test -n "$MOZ_NATIVE_NSS"; then + NSS_LIBS="$NSS_LIBS -lcrmf" +else + NSS_CFLAGS='-I$(DIST)/public/nss' + NSS_DEP_LIBS='\\\ + $(DIST)/lib/$(LIB_PREFIX)crmf.$(LIB_SUFFIX) \\\ + $(DIST)/lib/$(DLL_PREFIX)smime'$NSS_VERSION'$(DLL_SUFFIX) \\\ + $(DIST)/lib/$(DLL_PREFIX)ssl'$NSS_VERSION'$(DLL_SUFFIX) \\\ + $(DIST)/lib/$(DLL_PREFIX)nss'$NSS_VERSION'$(DLL_SUFFIX) \\\ + $(DIST)/lib/$(DLL_PREFIX)softokn'$NSS_VERSION'$(DLL_SUFFIX)' + + if test -z "$GNU_CC" && test "$OS_ARCH" = "WINNT" -o "$OS_ARCH" = "WINCE" -o "$OS_ARCH" = "OS2"; then + NSS_LIBS='\\\ + $(DIST)/lib/$(LIB_PREFIX)crmf.$(LIB_SUFFIX) \\\ + $(DIST)/lib/$(LIB_PREFIX)smime'$NSS_VERSION'.$(IMPORT_LIB_SUFFIX) \\\ + $(DIST)/lib/$(LIB_PREFIX)ssl'$NSS_VERSION'.$(IMPORT_LIB_SUFFIX) \\\ + $(DIST)/lib/$(LIB_PREFIX)nss'$NSS_VERSION'.$(IMPORT_LIB_SUFFIX) \\\ + $(DIST)/lib/$(LIB_PREFIX)softokn'$NSS_VERSION'.$(IMPORT_LIB_SUFFIX)' + else + NSS_LIBS='-L$(LIBS_DIR)'" -lcrmf -lsmime$NSS_VERSION -lssl$NSS_VERSION -lnss$NSS_VERSION -lsoftokn$NSS_VERSION" + fi +fi + +if test -z "$SKIP_LIBRARY_CHECKS"; then +dnl system JPEG support +dnl ======================================================== +MOZ_ARG_WITH_STRING(system-jpeg, +[ --with-system-jpeg[=PFX] + Use system libjpeg [installed at prefix PFX]], + JPEG_DIR=$withval) + +_SAVE_CFLAGS=$CFLAGS +_SAVE_LDFLAGS=$LDFLAGS +_SAVE_LIBS=$LIBS +if test -n "${JPEG_DIR}" -a "${JPEG_DIR}" != "yes"; then + CFLAGS="-I${JPEG_DIR}/include $CFLAGS" + LDFLAGS="-L${JPEG_DIR}/lib $LDFLAGS" +fi +if test -z "$JPEG_DIR" -o "$JPEG_DIR" = no; then + SYSTEM_JPEG= +else + AC_CHECK_LIB(jpeg, jpeg_destroy_compress, [SYSTEM_JPEG=1 JPEG_LIBS="-ljpeg $JPEG_LIBS"], SYSTEM_JPEG=, $JPEG_LIBS) +fi + +if test "$SYSTEM_JPEG" = 1; then + LIBS="$JPEG_LIBS $LIBS" + AC_TRY_RUN( + #include <stdio.h> + #include <sys/types.h> + #include <jpeglib.h> + int main () { + #if JPEG_LIB_VERSION >= $MOZJPEG + exit(0); + #else + exit(1); + #endif + } + , SYSTEM_JPEG=1, [SYSTEM_JPEG= JPEG_CFLAGS= JPEG_LIBS=], SYSTEM_JPEG= ) + rm -f core +fi +CFLAGS=$_SAVE_CFLAGS +LDFLAGS=$_SAVE_LDFLAGS +LIBS=$_SAVE_LIBS + +if test -n "${JPEG_DIR}" -a -d "${JPEG_DIR}" -a "$SYSTEM_JPEG" = 1; then + JPEG_CFLAGS="-I${JPEG_DIR}/include" + JPEG_LIBS="-L${JPEG_DIR}/lib ${JPEG_LIBS}" +fi + +dnl system ZLIB support +dnl ======================================================== +MOZ_ARG_WITH_STRING(system-zlib, +[ --with-system-zlib[=PFX] + Use system libz [installed at prefix PFX]], + ZLIB_DIR=$withval) + +_SAVE_CFLAGS=$CFLAGS +_SAVE_LDFLAGS=$LDFLAGS +_SAVE_LIBS=$LIBS +if test -n "${ZLIB_DIR}" -a "${ZLIB_DIR}" != "yes"; then + CFLAGS="-I${ZLIB_DIR}/include $CFLAGS" + LDFLAGS="-L${ZLIB_DIR}/lib $LDFLAGS" +fi +if test -z "$ZLIB_DIR" -o "$ZLIB_DIR" = no; then + SYSTEM_ZLIB= +else + AC_CHECK_LIB(z, gzread, [SYSTEM_ZLIB=1 ZLIB_LIBS="-lz $ZLIB_LIBS"], + [SYSTEM_ZLIB= ZLIB_CFLAGS= ZLIB_LIBS=], $ZLIB_LIBS) +fi +if test "$SYSTEM_ZLIB" = 1; then + LIBS="$ZLIB_LIBS $LIBS" + AC_TRY_RUN([ + #include <stdio.h> + #include <string.h> + #include <zlib.h> + int parse_version(const char *str, int *ver) { + return (sscanf(str, "%d.%d.%d", ver, ver+1, ver+2)==3?0:1); + } + int main() { + int sys[3], req[3]; + if (parse_version(zlib_version, sys) || parse_version("$MOZZLIB", req)) + exit(1); + if ((sys[0] == req[0]) && + ((sys[1] > req[1]) || ((sys[1] == req[1]) && (sys[2] >= req[2])))) + exit(0); + else + exit(1); + } + ], SYSTEM_ZLIB=1, [SYSTEM_ZLIB= ZLIB_CFLAGS= ZLIB_LIBS=], SYSTEM_ZLIB= ) + rm -f core +fi +CFLAGS=$_SAVE_CFLAGS +LDFLAGS=$_SAVE_LDFLAGS +LIBS=$_SAVE_LIBS + +if test "${ZLIB_DIR}" -a -d "${ZLIB_DIR}" -a "$SYSTEM_ZLIB" = 1; then + ZLIB_CFLAGS="-I${ZLIB_DIR}/include" + ZLIB_LIBS="-L${ZLIB_DIR}/lib ${ZLIB_LIBS}" +fi + +dnl system PNG Support +dnl ======================================================== +MOZ_ARG_WITH_STRING(system-png, +[ --with-system-png[=PFX] + Use system libpng [installed at prefix PFX]], + PNG_DIR=$withval) + +_SAVE_CFLAGS=$CFLAGS +_SAVE_LDFLAGS=$LDFLAGS +_SAVE_LIBS=$LIBS +CFLAGS="$ZLIB_CFLAGS $CFLAGS" +LDFLAGS="$ZLIB_LIBS -lz $LDFLAGS" +if test -n "${PNG_DIR}" -a "${PNG_DIR}" != "yes"; then + CFLAGS="-I${PNG_DIR}/include $CFLAGS" + LDFLAGS="-L${PNG_DIR}/lib $LDFLAGS" +fi +if test -z "$PNG_DIR" -o "$PNG_DIR" = no; then + SYSTEM_PNG= +else + AC_CHECK_LIB(png, png_get_valid, [SYSTEM_PNG=1 PNG_LIBS="-lpng $PNG_LIBS"], + SYSTEM_PNG=, $PNG_LIBS) +fi +if test "$SYSTEM_PNG" = 1; then + LIBS="$PNG_LIBS $LIBS" + AC_TRY_RUN( + #include <stdio.h> + #include <sys/types.h> + #include <png.h> + int main () { + #if PNG_LIBPNG_VER >= $MOZPNG + exit(0); + #else + exit(1); + #endif + } + , SYSTEM_PNG=1, [SYSTEM_PNG= PNG_CFLAGS= PNG_LIBS=], SYSTEM_PNG= ) + rm -f core +fi +CFLAGS=$_SAVE_CFLAGS +LDFLAGS=$_SAVE_LDFLAGS +LIBS=$_SAVE_LIBS + +if test "${PNG_DIR}" -a -d "${PNG_DIR}" -a "$SYSTEM_PNG" = 1; then + PNG_CFLAGS="-I${PNG_DIR}/include" + PNG_LIBS="-L${PNG_DIR}/lib ${PNG_LIBS}" +fi + +fi # SKIP_LIBRARY_CHECKS + +dnl ======================================================== +dnl Java SDK support +dnl ======================================================== +JAVA_INCLUDE_PATH= +MOZ_ARG_WITH_STRING(java-include-path, +[ --with-java-include-path=dir Location of Java SDK headers], + JAVA_INCLUDE_PATH=$withval) + +JAVA_BIN_PATH= +MOZ_ARG_WITH_STRING(java-bin-path, +[ --with-java-bin-path=dir Location of Java binaries (java, javac, jar)], + JAVA_BIN_PATH=$withval) + +dnl ======================================================== +dnl = +dnl = Toolkit Options +dnl = +dnl ======================================================== +MOZ_ARG_HEADER(Toolkit Options) + + dnl ======================================================== + dnl = Select the default toolkit + dnl ======================================================== + MOZ_ARG_ENABLE_STRING(default-toolkit, + [ --enable-default-toolkit=TK + Select default toolkit + Platform specific defaults: + BeOS - beos + Mac OS X - mac (carbon) + Neutrino/QNX - photon + OS/2 - os2 + Win32 - windows + * - gtk], + [ _DEFAULT_TOOLKIT=$enableval ], + [ _DEFAULT_TOOLKIT=$_PLATFORM_DEFAULT_TOOLKIT]) + + if test "$_DEFAULT_TOOLKIT" = "gtk" \ + -o "$_DEFAULT_TOOLKIT" = "qt" \ + -o "$_DEFAULT_TOOLKIT" = "gtk2" \ + -o "$_DEFAULT_TOOLKIT" = "xlib" \ + -o "$_DEFAULT_TOOLKIT" = "os2" \ + -o "$_DEFAULT_TOOLKIT" = "beos" \ + -o "$_DEFAULT_TOOLKIT" = "photon" \ + -o "$_DEFAULT_TOOLKIT" = "mac" \ + -o "$_DEFAULT_TOOLKIT" = "windows" \ + -o "$_DEFAULT_TOOLKIT" = "cocoa" \ + -o "$_DEFAULT_TOOLKIT" = "cairo-gtk2" \ + -o "$_DEFAULT_TOOLKIT" = "cairo-xlib" + then + dnl nglayout only supports building with one toolkit, + dnl so ignore everything after the first comma (","). + MOZ_WIDGET_TOOLKIT=`echo "$_DEFAULT_TOOLKIT" | sed -e "s/,.*$//"` + else + if test "$no_x" != "yes"; then + AC_MSG_ERROR([Toolkit must be xlib, gtk, gtk2 or qt.]) + else + AC_MSG_ERROR([Toolkit must be $_PLATFORM_DEFAULT_TOOLKIT.]) + fi + fi + +AC_DEFINE_UNQUOTED(MOZ_DEFAULT_TOOLKIT,"$MOZ_WIDGET_TOOLKIT") + +dnl ======================================================== +dnl = Enable the toolkit as needed = +dnl ======================================================== + +case "$MOZ_WIDGET_TOOLKIT" in +gtk) + MOZ_ENABLE_GTK=1 + MOZ_ENABLE_XREMOTE=1 + if test "$_HAVE_FREETYPE2"; then + MOZ_ENABLE_FREETYPE2=1 + fi + MOZ_ENABLE_XPRINT=1 + TK_CFLAGS='$(MOZ_GTK_CFLAGS)' + TK_LIBS='$(MOZ_GTK_LDFLAGS)' + AC_DEFINE(MOZ_WIDGET_GTK) + ;; + +gtk2) + MOZ_ENABLE_GTK2=1 + MOZ_ENABLE_XREMOTE=1 + MOZ_ENABLE_COREXFONTS=${MOZ_ENABLE_COREXFONTS-} + TK_CFLAGS='$(MOZ_GTK2_CFLAGS)' + TK_LIBS='$(MOZ_GTK2_LIBS)' + AC_DEFINE(MOZ_WIDGET_GTK2) + ;; + +xlib) + MOZ_ENABLE_XLIB=1 + if test "$_HAVE_FREETYPE2"; then + MOZ_ENABLE_FREETYPE2=1 + fi + MOZ_ENABLE_XPRINT=1 + TK_CFLAGS='$(MOZ_XLIB_CFLAGS)' + TK_LIBS='$(MOZ_XLIB_LDFLAGS)' + AC_DEFINE(MOZ_WIDGET_XLIB) + ;; + +qt) + MOZ_ENABLE_QT=1 + if test "$_HAVE_FREETYPE2"; then + MOZ_ENABLE_FREETYPE2=1 + fi + MOZ_ENABLE_XPRINT=1 + TK_CFLAGS='$(MOZ_QT_CFLAGS)' + TK_LIBS='$(MOZ_QT_LDFLAGS)' + AC_DEFINE(MOZ_WIDGET_QT) + ;; + +photon) + MOZ_ENABLE_PHOTON=1 + AC_DEFINE(MOZ_WIDGET_PHOTON) + ;; +mac|cocoa) + TK_LIBS='-framework Carbon' + TK_CFLAGS="-I${MACOS_SDK_DIR}/Developer/Headers/FlatCarbon" + CFLAGS="$CFLAGS $TK_CFLAGS" + CXXFLAGS="$CXXFLAGS $TK_CFLAGS" + MOZ_USER_DIR="Mozilla" + AC_DEFINE(XP_MACOSX) + AC_DEFINE(TARGET_CARBON) + AC_DEFINE(TARGET_API_MAC_CARBON) + if test "$MOZ_WIDGET_TOOLKIT" = "cocoa"; then + MOZ_ENABLE_COCOA=1 + AC_DEFINE(MOZ_WIDGET_COCOA) + fi + ;; + +cairo-gtk2) + MOZ_WIDGET_TOOLKIT=gtk2 + MOZ_GFX_TOOLKIT=cairo + MOZ_ENABLE_CAIRO_GFX=1 + MOZ_ENABLE_GTK2=1 + MOZ_ENABLE_XREMOTE=1 + TK_CFLAGS='$(MOZ_GTK2_CFLAGS) $(MOZ_CAIRO_CFLAGS)' + TK_LIBS='$(MOZ_GTK2_LIBS) $(MOZ_CAIRO_LIBS)' + AC_DEFINE(MOZ_WIDGET_GTK2) + ;; +cairo-xlib) + MOZ_WIDGET_TOOLKIT=xlib + MOZ_GFX_TOOLKIT=cairo + MOZ_ENABLE_CAIRO_GFX=1 + MOZ_ENABLE_XLIB=1 + TK_CFLAGS='$(MOZ_XLIB_CFLAGS) $(MOZ_CAIRO_FLAGS)' + TK_LIBS='$(MOZ_XLIB_LDFLAGS) $(MOZ_CAIRO_LIBS)' + AC_DEFINE(MOZ_WIDGET_XLIB) + ;; +esac + +if test "$MOZ_ENABLE_XREMOTE"; then + AC_DEFINE(MOZ_ENABLE_XREMOTE) +fi + +if test "$COMPILE_ENVIRONMENT"; then +if test "$MOZ_ENABLE_GTK" +then + AM_PATH_GTK($GTK_VERSION,, + AC_MSG_ERROR(Test for GTK failed.)) + + MOZ_GTK_LDFLAGS=$GTK_LIBS + MOZ_GTK_CFLAGS=$GTK_CFLAGS +fi + +if test "$MOZ_ENABLE_GTK2" +then + PKG_CHECK_MODULES(MOZ_GTK2, gtk+-2.0 >= 1.3.7) +fi + +if test "$MOZ_ENABLE_XLIB" +then + MOZ_XLIB_CFLAGS="$X_CFLAGS" + MOZ_XLIB_LDFLAGS="$XLDFLAGS" + MOZ_XLIB_LDFLAGS="$MOZ_XLIB_LDFLAGS $XEXT_LIBS $X11_LIBS" +fi + +if test "$MOZ_ENABLE_QT" +then + MOZ_ARG_WITH_STRING(qtdir, + [ --with-qtdir=\$dir Specify Qt directory ], + [ QTDIR=$withval]) + + if test -z "$QTDIR"; then + QTDIR="/usr" + fi + QTINCDIR="/include/qt" + if test ! -d "$QTDIR$QTINCDIR"; then + QTINCDIR="/include/X11/qt" + fi + if test ! -d "$QTDIR$QTINCDIR"; then + QTINCDIR="/include" + fi + + if test -x "$QTDIR/bin/moc"; then + HOST_MOC="$QTDIR/bin/moc" + else + AC_CHECK_PROGS(HOST_MOC, moc, "") + fi + if test -z "$HOST_MOC"; then + AC_MSG_ERROR([no acceptable moc preprocessor found]) + fi + MOC=$HOST_MOC + + QT_CFLAGS="-I${QTDIR}${QTINCDIR} -DQT_GENUINE_STR -DQT_NO_STL" + if test -z "$MOZ_DEBUG"; then + QT_CFLAGS="$QT_CFLAGS -DQT_NO_DEBUG -DNO_DEBUG" + fi + _SAVE_LDFLAGS=$LDFLAGS + QT_LDFLAGS=-L${QTDIR}/lib + LDFLAGS="$LDFLAGS $QT_LDFLAGS" + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + AC_CHECK_LIB(qt, main, QT_LIB=-lqt, + AC_CHECK_LIB(qt-mt, main, QT_LIB=-lqt-mt, + AC_MSG_ERROR([Cannot find QT libraries.]))) + LDFLAGS=$_SAVE_LDFLAGS + QT_LIBS="-L/usr/X11R6/lib $QT_LDFLAGS $QT_LIB -lXext -lX11" + + MOZ_QT_LDFLAGS=$QT_LIBS + MOZ_QT_CFLAGS=$QT_CFLAGS + + _SAVE_CXXFLAGS=$CXXFLAGS + _SAVE_LIBS=$LIBS + + CXXFLAGS="$CXXFLAGS $QT_CFLAGS" + LIBS="$LIBS $QT_LIBS" + + AC_MSG_CHECKING(Qt - version >= $QT_VERSION) + AC_TRY_COMPILE([#include <qglobal.h>], + [ + #if (QT_VERSION < $QT_VERSION_NUM) + #error "QT_VERSION too old" + #endif + ],result="yes",result="no") + + AC_MSG_RESULT("$result") + if test "$result" = "no"; then + AC_MSG_ERROR([Qt Mozilla requires at least version $QT_VERSION of Qt]) + fi + CXXFLAGS=$_SAVE_CXXFLAGS + LIBS=$_SAVE_LIBS + + AC_LANG_RESTORE +fi +fi # COMPILE_ENVIRONMENT + +AC_SUBST(MOZ_DEFAULT_TOOLKIT) + +AC_SUBST(GTK_CONFIG) +AC_SUBST(TK_CFLAGS) +AC_SUBST(TK_LIBS) + +AC_SUBST(MOZ_ENABLE_GTK) +AC_SUBST(MOZ_ENABLE_XLIB) +AC_SUBST(MOZ_ENABLE_GTK2) +AC_SUBST(MOZ_ENABLE_QT) +AC_SUBST(MOZ_ENABLE_PHOTON) +AC_SUBST(MOZ_ENABLE_COCOA) +AC_SUBST(MOZ_ENABLE_CAIRO_GFX) +AC_SUBST(MOZ_ENABLE_XREMOTE) +AC_SUBST(MOZ_GTK_CFLAGS) +AC_SUBST(MOZ_GTK_LDFLAGS) +AC_SUBST(MOZ_GTK2_CFLAGS) +AC_SUBST(MOZ_GTK2_LIBS) +AC_SUBST(MOZ_XLIB_CFLAGS) +AC_SUBST(MOZ_XLIB_LDFLAGS) +AC_SUBST(MOZ_QT_CFLAGS) +AC_SUBST(MOZ_QT_LDFLAGS) + +AC_SUBST(MOC) + +if test "$MOZ_ENABLE_GTK" \ +|| test "$MOZ_ENABLE_QT" \ +|| test "$MOZ_ENABLE_XLIB" \ +|| test "$MOZ_ENABLE_GTK2" +then + AC_DEFINE(MOZ_X11) + MOZ_X11=1 +fi +AC_SUBST(MOZ_X11) + +dnl ======================================================== +dnl = +dnl = Application +dnl = +dnl ======================================================== + +MOZ_ARG_HEADER(Application) + +ACCESSIBILITY=1 +BUILD_MODULES=all +BUILD_SHARED_LIBS=1 +BUILD_STATIC_LIBS= +ENABLE_TESTS=1 +MOZ_ACTIVEX_SCRIPTING_SUPPORT= +MOZ_BRANDING_DIRECTORY= +MOZ_CALENDAR= +MOZ_DBGRINFO_MODULES= +MOZ_ENABLE_CANVAS=1 +MOZ_ENABLE_LIBXUL= +MOZ_EXTENSIONS_ALL=" cookie wallet content-packs xml-rpc xmlextras help p3p pref transformiix venkman inspector irc universalchardet typeaheadfind webservices spellcheck gnomevfs auth sroaming xmlterm datetime finger cview layout-debug tasks sql xforms permissions schema-validation reporter" +MOZ_FEEDS=1 +MOZ_IMG_DECODERS_DEFAULT="png gif jpeg bmp xbm" +MOZ_IMG_ENCODERS_DEFAULT="png jpeg" +MOZ_IPCD= +MOZ_JAVAXPCOM= +MOZ_JSDEBUGGER=1 +MOZ_JSLOADER=1 +MOZ_LIBART_CFLAGS= +MOZ_LIBART_LIBS= +MOZ_MAIL_NEWS= +MOZ_MATHML=1 +MOZ_MORK=1 +MOZ_MORKREADER= +MOZ_NO_ACTIVEX_SUPPORT=1 +MOZ_NO_INSPECTOR_APIS= +MOZ_NO_XPCOM_OBSOLETE= +MOZ_NO_FAST_LOAD= +MOZ_OJI=1 +MOZ_PLACES= +MOZ_PLAINTEXT_EDITOR_ONLY= +MOZ_PLUGINS=1 +MOZ_PROFILELOCKING=1 +MOZ_PROFILESHARING=1 +MOZ_PSM=1 +MOZ_PYTHON= +MOZ_PYTHON_DEBUG_SUFFIX= +MOZ_PYTHON_DLL_SUFFIX= +MOZ_PYTHON_INCLUDES= +MOZ_PYTHON_LIBS= +MOZ_PYTHON_PREFIX= +MOZ_PYTHON_VER= +MOZ_PYTHON_VER_DOTTED= +MOZ_REFLOW_PERF= +MOZ_REORDER= +MOZ_SAFE_BROWSING= +MOZ_SINGLE_PROFILE= +MOZ_STATIC_COMPONENT_LIBS= +MOZ_STATIC_MAIL_BUILD= +MOZ_STORAGE=1 +MOZ_TIMELINE= +MOZ_UI_LOCALE=en-US +MOZ_USE_NATIVE_UCONV= +MOZ_V1_STRING_ABI=1 +MOZ_VIEW_SOURCE=1 +MOZ_XPFE_COMPONENTS=1 +MOZ_XPINSTALL=1 +MOZ_XTF=1 +MOZ_XUL=1 +NS_PRINTING=1 +NECKO_PROTOCOLS_DEFAULT="about data file ftp gopher http res viewsource" +NECKO_COOKIES=1 +NECKO_DISK_CACHE=1 +NECKO_SMALL_BUFFERS= +SUNCTL= +JS_STATIC_BUILD= + +dnl canvas and cairo won't build with gtk1, so disable it +dnl ======================================================== +if test "$MOZ_ENABLE_GTK"; then + MOZ_ENABLE_CANVAS= +fi + +case "$target_os" in + msvc*|mks*|cygwin*|mingw*) + if test -z "$GNU_CC"; then + MOZ_NO_ACTIVEX_SUPPORT= + MOZ_ACTIVEX_SCRIPTING_SUPPORT=1 + fi + ;; +esac + +MOZ_ARG_ENABLE_STRING(application, +[ --enable-application=APP + Options include: + suite + browser (Firefox) + mail (Thunderbird) + minimo + composer + calendar (Sunbird) + xulrunner + macbrowser (Camino) + standalone (use this for standalone + xpcom/xpconnect or to manually drive a build)], +[ MOZ_BUILD_APP=$enableval ] ) + +case "$MOZ_BUILD_APP" in +suite) + MOZ_APP_NAME=seamonkey + MOZ_APP_DISPLAYNAME=SeaMonkey + MOZ_MAIL_NEWS=1 + MOZ_LDAP_XPCOM=1 + MOZ_COMPOSER=1 + MOZ_SUITE=1 + MOZ_PROFILESHARING= + MOZ_APP_VERSION=$SEAMONKEY_VERSION + MOZ_EXTENSIONS_DEFAULT=" cookie wallet content-packs xml-rpc xmlextras help p3p pref transformiix venkman inspector irc universalchardet typeaheadfind webservices spellcheck gnomevfs auth sroaming permissions reporter" + AC_DEFINE(MOZ_SUITE) + ;; + +browser) + MOZ_APP_NAME=firefox + MOZ_APP_DISPLAYNAME=BonEcho + MOZ_XUL_APP=1 + MOZ_PHOENIX=1 + MOZ_SAFE_BROWSING=1 + MOZ_APP_VERSION=$FIREFOX_VERSION + MOZ_EXTENSIONS_DEFAULT=" cookie xml-rpc xmlextras pref transformiix universalchardet webservices inspector gnomevfs auth permissions reporter spellcheck" + AC_DEFINE(MOZ_PHOENIX) + ;; + +minimo) + MOZ_APP_NAME=minimo + MOZ_APP_DISPLAYNAME=minimo + ACCESSIBILITY= + AC_DEFINE(MINIMO) + ENABLE_TESTS= + MINIMO=1 + MOZ_ACTIVEX_SCRIPTING_SUPPORT= + MOZ_APP_VERSION=`cat $topsrcdir/minimo/config/version.txt` + MOZ_COMPOSER= + MOZ_ENABLE_CANVAS= + MOZ_ENABLE_POSTSCRIPT= + MOZ_EXTENSIONS_DEFAULT=" cookie xmlextras transformiix spatialnavigation permissions" + MOZ_IMG_DECODERS_DEFAULT="png gif jpeg bmp" + MOZ_IMG_ENCODERS_DEFAULT= + MOZ_IMG_ENCODERS= + MOZ_INSTALLER= + MOZ_JSDEBUGGER= + MOZ_LDAP_XPCOM= + MOZ_MAIL_NEWS= + MOZ_MATHML= + MOZ_AUTH_EXTENSION= + MOZ_NO_ACTIVEX_SUPPORT=1 + MOZ_NO_XPCOM_OBSOLETE=1 + MOZ_NO_FAST_LOAD=1 + MOZ_NO_INSPECTOR_APIS=1 + MOZ_OJI= + MOZ_PLAINTEXT_EDITOR_ONLY=1 + MOZ_PREF_EXTENSIONS= + MOZ_PROFILELOCKING= + MOZ_PROFILESHARING= + MOZ_STORAGE= + MOZ_SINGLE_PROFILE=1 + MOZ_UNIVERSALCHARDET= + MOZ_UPDATER= + MOZ_URL_CLASSIFIER= + MOZ_USE_NATIVE_UCONV=1 + MOZ_V1_STRING_ABI= + MOZ_VIEW_SOURCE= + MOZ_XPFE_COMPONENTS= + MOZ_XPINSTALL= + MOZ_XTF= + MOZ_XUL_APP=1 + NECKO_PROTOCOLS_DEFAULT="about data http file res" + NECKO_SMALL_BUFFERS=1 + NS_DISABLE_LOGGING=1 + NS_PRINTING= + MOZ_WEBSERVICES= + JS_STATIC_BUILD=1 + ;; + +mail) + MOZ_APP_NAME=thunderbird + MOZ_APP_DISPLAYNAME=Thunderbird + MOZ_XUL_APP=1 + MOZ_THUNDERBIRD=1 + MOZ_MATHML= + MOZ_NO_ACTIVEX_SUPPORT=1 + MOZ_ACTIVEX_SCRIPTING_SUPPORT= + ENABLE_TESTS= + MOZ_OJI= + MOZ_PLUGINS= + NECKO_DISK_CACHE= + NECKO_PROTOCOLS="http,file,jar,viewsource,res,data" + MOZ_ENABLE_CANVAS= + MOZ_IMG_DECODERS_DEFAULT=`echo "$MOZ_IMG_DECODERS_DEFAULT" | sed "s/ xbm//"` + MOZ_MAIL_NEWS=1 + MOZ_LDAP_XPCOM=1 + MOZ_STATIC_MAIL_BUILD=1 + MOZ_COMPOSER=1 + MOZ_SAFE_BROWSING=1 + MOZ_APP_VERSION=$THUNDERBIRD_VERSION + MOZ_EXTENSIONS_DEFAULT=" wallet spellcheck xmlextras transformiix pref webservices universalchardet auth" + AC_DEFINE(MOZ_THUNDERBIRD) + ;; + +composer) + MOZ_APP_NAME=nvu + MOZ_APP_DISPLAYNAME=NVU + MOZ_XUL_APP=1 + MOZ_STANDALONE_COMPOSER=1 + MOZ_COMPOSER=1 + MOZ_APP_VERSION=0.17+ + AC_DEFINE(MOZ_STANDALONE_COMPOSER) + ;; + +calendar) + MOZ_APP_NAME=sunbird + MOZ_APP_DISPLAYNAME=Calendar + MOZ_XUL_APP=1 + MOZ_SUNBIRD=1 + MOZ_CALENDAR=1 + MOZ_APP_VERSION=$SUNBIRD_VERSION + MOZ_PLAINTEXT_EDITOR_ONLY=1 + NECKO_PROTOCOLS_DEFAULT="about http ftp file res viewsource" + MOZ_NO_ACTIVEX_SUPPORT=1 + MOZ_ACTIVEX_SCRIPTING_SUPPORT= + MOZ_INSTALLER= + MOZ_MATHML= + NECKO_DISK_CACHE= + MOZ_OJI= + MOZ_PLUGINS= + NECKO_COOKIES= + MOZ_EXTENSIONS_DEFAULT=" xmlextras transformiix" + AC_DEFINE(MOZ_SUNBIRD) + ;; + +xulrunner) + MOZ_APP_NAME=xulrunner + MOZ_APP_DISPLAYNAME=XULRunner + MOZ_XUL_APP=1 + MOZ_XULRUNNER=1 + MOZ_ENABLE_LIBXUL=1 + MOZ_APP_VERSION=$MOZILLA_VERSION + MOZ_JAVAXPCOM=1 + MOZ_EXTENSIONS_DEFAULT=" xml-rpc xmlextras pref transformiix universalchardet webservices gnomevfs auth" + AC_DEFINE(MOZ_XULRUNNER) + ;; + +macbrowser) + MOZ_APP_NAME=mozilla + MOZ_APP_DISPLAYNAME=Mozilla + MOZ_APP_VERSION=$MOZILLA_VERSION + MOZ_STORAGE=1 + MOZ_EXTENSIONS_DEFAULT=" cookie xmlextras universalchardet typeaheadfind transformiix permissions spellcheck auth" + AC_DEFINE(MOZ_MACBROWSER) + ;; + +standalone) + MOZ_APP_NAME=mozilla + MOZ_APP_DISPLAYNAME=Mozilla + MOZ_APP_VERSION=$MOZILLA_VERSION + ;; + +*) + AC_MSG_ERROR([--enable-application=APP is required]) + ;; + +esac + +AC_SUBST(MOZ_BUILD_APP) +AC_SUBST(MOZ_XUL_APP) +AC_SUBST(MOZ_SUITE) +AC_SUBST(MOZ_PHOENIX) +AC_SUBST(MOZ_THUNDERBIRD) +AC_SUBST(MOZ_STANDALONE_COMPOSER) +AC_SUBST(MOZ_SUNBIRD) +AC_SUBST(MOZ_XULRUNNER) + +AC_DEFINE_UNQUOTED(MOZ_BUILD_APP,$MOZ_BUILD_APP) + +if test "$MOZ_XUL_APP"; then + MOZ_SINGLE_PROFILE=1 + MOZ_PROFILESHARING= + AC_DEFINE(MOZ_XUL_APP) +fi + +dnl check whether to enable canvas +dnl ======================================================== +MOZ_ARG_ENABLE_BOOL(canvas, +[ --enable-canvas Enable html:canvas feature], + MOZ_ENABLE_CANVAS=1, + MOZ_ENABLE_CANVAS= ) +if test "$MOZ_ENABLE_CANVAS"; then + AC_DEFINE(MOZ_ENABLE_CANVAS) +fi +AC_SUBST(MOZ_ENABLE_CANVAS) + +dnl ======================================================== +dnl = +dnl = Components & Features +dnl = +dnl ======================================================== +MOZ_ARG_HEADER(Components and Features) + +dnl ======================================================== +dnl = Localization +dnl ======================================================== +MOZ_ARG_ENABLE_STRING(ui-locale, +[ --enable-ui-locale=ab-CD + Select the user interface locale (default: en-US)], + MOZ_UI_LOCALE=$enableval ) +AC_SUBST(MOZ_UI_LOCALE) + +dnl ========================================================= +dnl = Calendar client +dnl ========================================================= +MOZ_ARG_ENABLE_BOOL(calendar,, + MOZ_OLD_CALENDAR=1, + MOZ_OLD_CALENDAR= ) + +if test "$MOZ_OLD_CALENDAR"; then + AC_MSG_WARN([Building with the calendar extension is no longer supported.]) + if test "$MOZ_THUNDERBIRD"; then + AC_MSG_WARN([Since you're trying to build mail, you could try adding]) + AC_MSG_WARN(['--enable-extensions=default,lightning' to your mozconfig]) + AC_MSG_WARN([and building WITH A FRESH TREE.]) + fi + AC_MSG_WARN([For more information, please visit:]) + AC_MSG_ERROR([http://www.mozilla.org/projects/calendar/]) +fi + +AC_SUBST(MOZ_CALENDAR) + +dnl ========================================================= +dnl = Mail & News +dnl ========================================================= +MOZ_ARG_DISABLE_BOOL(mailnews, +[ --disable-mailnews Disable building of mail & news components], + MOZ_MAIL_NEWS=, + MOZ_MAIL_NEWS=1 ) +AC_SUBST(MOZ_MAIL_NEWS) + +dnl ======================================================== +dnl static mail build off by default +dnl ======================================================== +MOZ_ARG_ENABLE_BOOL(static-mail, +[ --enable-static-mail Enable static mail build support], + MOZ_STATIC_MAIL_BUILD=1, + MOZ_STATIC_MAIL_BUILD= ) + +if test "$MOZ_STATIC_MAIL_BUILD"; then + AC_DEFINE(MOZ_STATIC_MAIL_BUILD) +fi + +AC_SUBST(MOZ_STATIC_MAIL_BUILD) + +dnl ========================================================= +dnl = LDAP +dnl ========================================================= +MOZ_ARG_DISABLE_BOOL(ldap, +[ --disable-ldap Disable LDAP support], + MOZ_LDAP_XPCOM=, + MOZ_LDAP_XPCOM=1) + +dnl ======================================================== +dnl = Trademarked Branding +dnl ======================================================== +MOZ_ARG_ENABLE_BOOL(official-branding, +[ --enable-official-branding Enable Official mozilla.org Branding + Do not distribute builds with + --enable-official-branding unless you have + permission to use trademarks per + http://www.mozilla.org/foundation/trademarks/ .], +[case "$MOZ_BUILD_APP" in +browser) + MOZ_BRANDING_DIRECTORY=other-licenses/branding/firefox + MOZ_APP_DISPLAYNAME=Firefox + ;; + +calendar) + MOZ_BRANDING_DIRECTORY=other-licenses/branding/sunbird + MOZ_APP_DISPLAYNAME=Sunbird + ;; + +mail) + MOZ_BRANDING_DIRECTORY=other-licenses/branding/thunderbird + ;; + +*)] + AC_MSG_ERROR([Official branding is only available for Firefox Sunbird and Thunderbird.]) +esac +) + +MOZ_ARG_WITH_STRING(branding, +[ --with-branding=dir Use branding from the specified directory.], + MOZ_BRANDING_DIRECTORY=$withval) + +AC_SUBST(MOZ_BRANDING_DIRECTORY) + +dnl ======================================================== +dnl = Distribution ID +dnl ======================================================== +MOZ_ARG_WITH_STRING(distribution-id, +[ --with-distribution-id=ID Set distribution-specific id (default=org.mozilla)], +[ val=`echo $withval` + MOZ_DISTRIBUTION_ID="$val"]) + +if test -z "$MOZ_DISTRIBUTION_ID"; then + MOZ_DISTRIBUTION_ID="org.mozilla" +fi + +AC_DEFINE_UNQUOTED(MOZ_DISTRIBUTION_ID,"$MOZ_DISTRIBUTION_ID") +AC_SUBST(MOZ_DISTRIBUTION_ID) + +dnl ======================================================== +dnl = FreeType2 +dnl = Enable freetype by default if building against X11 +dnl = and freetype is available +dnl ======================================================== +MOZ_ARG_DISABLE_BOOL(freetype2, +[ --disable-freetype2 Disable FreeType2 support ], + MOZ_ENABLE_FREETYPE2=, + MOZ_ENABLE_FREETYPE2=1) + +if test "$MOZ_ENABLE_FREETYPE2" && test -z "$MOZ_X11" -o -z "$_HAVE_FREETYPE2"; then + AC_MSG_ERROR([Cannot enable FreeType2 support for non-X11 toolkits or if FreeType2 is not detected.]) +fi + +if test "$MOZ_ENABLE_FREETYPE2"; then + AC_DEFINE(MOZ_ENABLE_FREETYPE2) + _NON_GLOBAL_ACDEFINES="$_NON_GLOBAL_ACDEFINES MOZ_ENABLE_FREETYPE2" +fi +AC_SUBST(MOZ_ENABLE_FREETYPE2) + +dnl ======================================================== +dnl = Xft +dnl ======================================================== +if test "$MOZ_ENABLE_GTK2"; then + MOZ_ENABLE_XFT=1 +fi + +MOZ_ARG_DISABLE_BOOL(xft, +[ --disable-xft Disable Xft support ], + MOZ_ENABLE_XFT=, + MOZ_ENABLE_XFT=1) + +if test "$MOZ_ENABLE_XFT" && test -z "$MOZ_ENABLE_GTK2"; then + AC_MSG_ERROR([Cannot enable XFT support for non-GTK2 toolkits.]) +fi + +if test "$MOZ_ENABLE_XFT" && test "$MOZ_ENABLE_FREETYPE2"; then + AC_MSG_ERROR([Cannot enable XFT and FREETYPE2 at the same time.]) +fi + +if test "$MOZ_ENABLE_XFT" +then + AC_DEFINE(MOZ_ENABLE_XFT) + PKG_CHECK_MODULES(MOZ_XFT, xft) + PKG_CHECK_MODULES(_PANGOCHK, pango >= 1.1.0) +fi + +AC_SUBST(MOZ_ENABLE_XFT) +AC_SUBST(MOZ_XFT_CFLAGS) +AC_SUBST(MOZ_XFT_LIBS) + +dnl ======================================================== +dnl = pango font rendering +dnl ======================================================== +MOZ_ARG_ENABLE_BOOL(pango, +[ --enable-pango Enable Pango font rendering support], + MOZ_ENABLE_PANGO=1, + MOZ_ENABLE_PANGO=) + +if test "$MOZ_ENABLE_PANGO" +then + AC_DEFINE(MOZ_ENABLE_PANGO) + PKG_CHECK_MODULES(MOZ_PANGO, pango >= 1.6.0 pangoft2 >= 1.6.0) + + AC_SUBST(MOZ_ENABLE_PANGO) + AC_SUBST(MOZ_PANGO_CFLAGS) + AC_SUBST(MOZ_PANGO_LIBS) +fi + +dnl ======================================================== +dnl = x11 core font support (default and ability to enable depend on toolkit) +dnl ======================================================== +if test "$MOZ_X11" +then + MOZ_ENABLE_COREXFONTS=${MOZ_ENABLE_COREXFONTS-1} +else + MOZ_ENABLE_COREXFONTS= +fi +if test "$MOZ_ENABLE_COREXFONTS" +then + AC_DEFINE(MOZ_ENABLE_COREXFONTS) +fi + +AC_SUBST(MOZ_ENABLE_COREXFONTS) + +dnl ======================================================== +dnl = PostScript print module +dnl ======================================================== +MOZ_ARG_DISABLE_BOOL(postscript, +[ --disable-postscript Disable PostScript printing support ], + MOZ_ENABLE_POSTSCRIPT=, + MOZ_ENABLE_POSTSCRIPT=1 ) + +dnl ======================================================== +dnl = Xprint print module +dnl ======================================================== +if test "$MOZ_X11" +then + _SAVE_LDFLAGS="$LDFLAGS" + LDFLAGS="$XLDFLAGS $LDFLAGS" + AC_CHECK_LIB(Xp, XpGetPrinterList, [XPRINT_LIBS="-lXp"], + MOZ_ENABLE_XPRINT=, $XEXT_LIBS $XLIBS) + LDFLAGS="$_SAVE_LDFLAGS" + + MOZ_XPRINT_CFLAGS="$X_CFLAGS" + MOZ_XPRINT_LDFLAGS="$XLDFLAGS $XPRINT_LIBS" + MOZ_XPRINT_LDFLAGS="$MOZ_XPRINT_LDFLAGS $XEXT_LIBS $X11_LIBS" + + MOZ_ARG_DISABLE_BOOL(xprint, + [ --disable-xprint Disable Xprint printing support ], + MOZ_ENABLE_XPRINT=, + MOZ_ENABLE_XPRINT=1 ) +fi + +dnl ======================================================== +dnl = GnomeVFS support module +dnl ======================================================== + +if test "$MOZ_X11" +then + dnl build the gnomevfs extension by default only when the + dnl GTK2 toolkit is in use. + if test "$MOZ_ENABLE_GTK2" + then + MOZ_ENABLE_GNOMEVFS=1 + MOZ_ENABLE_GCONF=1 + MOZ_ENABLE_LIBGNOME=1 + fi + + MOZ_ARG_DISABLE_BOOL(gnomevfs, + [ --disable-gnomevfs Disable GnomeVFS support ], + MOZ_ENABLE_GNOMEVFS=, + MOZ_ENABLE_GNOMEVFS=force) + + if test "$MOZ_ENABLE_GNOMEVFS" + then + PKG_CHECK_MODULES(MOZ_GNOMEVFS, gnome-vfs-2.0 >= $GNOMEVFS_VERSION gnome-vfs-module-2.0 >= $GNOMEVFS_VERSION,[ + MOZ_GNOMEVFS_LIBS=`echo $MOZ_GNOMEVFS_LIBS | sed 's/-llinc\>//'` + MOZ_ENABLE_GNOMEVFS=1 + ],[ + if test "$MOZ_ENABLE_GNOMEVFS" = "force" + then + AC_MSG_ERROR([* * * Could not find gnome-vfs-module-2.0 >= $GNOMEVFS_VERSION]) + fi + MOZ_ENABLE_GNOMEVFS= + ]) + fi + + AC_SUBST(MOZ_GNOMEVFS_CFLAGS) + AC_SUBST(MOZ_GNOMEVFS_LIBS) + + if test "$MOZ_ENABLE_GCONF" + then + PKG_CHECK_MODULES(MOZ_GCONF, gconf-2.0 >= $GCONF_VERSION,[ + MOZ_GCONF_LIBS=`echo $MOZ_GCONF_LIBS | sed 's/-llinc\>//'` + MOZ_ENABLE_GCONF=1 + ],[ + MOZ_ENABLE_GCONF= + ]) + fi + + AC_SUBST(MOZ_GCONF_CFLAGS) + AC_SUBST(MOZ_GCONF_LIBS) + + if test "$MOZ_ENABLE_LIBGNOME" + then + PKG_CHECK_MODULES(MOZ_LIBGNOME, libgnome-2.0 >= $LIBGNOME_VERSION,[ + MOZ_LIBGNOME_LIBS=`echo $MOZ_LIBGNOME_LIBS | sed 's/-llinc\>//'` + MOZ_ENABLE_LIBGNOME=1 + ],[ + MOZ_ENABLE_LIBGNOME= + ]) + fi + + AC_SUBST(MOZ_LIBGNOME_CFLAGS) + AC_SUBST(MOZ_LIBGNOME_LIBS) + + # The GNOME component is built if gtk2, gconf, gnome-vfs, and libgnome + # are all available. + + if test "$MOZ_ENABLE_GTK2" -a "$MOZ_ENABLE_GCONF" -a \ + "$MOZ_ENABLE_GNOMEVFS" -a "$MOZ_ENABLE_LIBGNOME"; then + MOZ_ENABLE_GNOME_COMPONENT=1 + else + MOZ_ENABLE_GNOME_COMPONENT= + fi + + AC_SUBST(MOZ_ENABLE_GNOME_COMPONENT) +fi + +dnl ======================================================== +dnl = libgnomeui support module +dnl ======================================================== + +if test "$MOZ_ENABLE_GTK2" +then + MOZ_ENABLE_GNOMEUI=1 + + MOZ_ARG_DISABLE_BOOL(gnomeui, + [ --disable-gnomeui Disable libgnomeui support (default: auto, optional at runtime) ], + MOZ_ENABLE_GNOMEUI=, + MOZ_ENABLE_GNOMEUI=force) + + if test "$MOZ_ENABLE_GNOMEUI" + then + PKG_CHECK_MODULES(MOZ_GNOMEUI, libgnomeui-2.0 >= $GNOMEUI_VERSION, + [ + MOZ_GNOMEUI_LIBS=`echo $MOZ_GNOMEUI_LIBS | sed 's/-llinc\>//'` + MOZ_ENABLE_GNOMEUI=1 + ],[ + if test "$MOZ_ENABLE_GNOMEUI" = "force" + then + AC_MSG_ERROR([* * * Could not find libgnomeui-2.0 >= $GNOMEUI_VERSION]) + fi + MOZ_ENABLE_GNOMEUI= + ]) + fi + + if test "$MOZ_ENABLE_GNOMEUI"; then + AC_DEFINE(MOZ_ENABLE_GNOMEUI) + fi +fi +AC_SUBST(MOZ_ENABLE_GNOMEUI) +AC_SUBST(MOZ_GNOMEUI_CFLAGS) +AC_SUBST(MOZ_GNOMEUI_LIBS) + +dnl ======================================================== +dnl = Setting MOZ_EXTRA_X11CONVERTERS turns on additional +dnl = converters in intl/uconv that are used only by X11 gfx +dnl = implementations. By default, it's undefined so that +dnl = those converters are not built on other platforms/toolkits. +dnl = (see bug 180851) +dnl ======================================================== + +if (test "$MOZ_ENABLE_GTK" || test "$MOZ_ENABLE_GTK2") \ +&& test "$MOZ_ENABLE_COREXFONTS" \ +|| test "$MOZ_ENABLE_XLIB" \ +|| test "$MOZ_ENABLE_XPRINT" +then + AC_DEFINE(MOZ_EXTRA_X11CONVERTERS) + MOZ_EXTRA_X11CONVERTERS=1 +fi +AC_SUBST(MOZ_EXTRA_X11CONVERTERS) + +dnl ======================================================== +dnl = Build Personal Security Manager +dnl ======================================================== +MOZ_ARG_DISABLE_BOOL(crypto, +[ --disable-crypto Disable crypto support (Personal Security Manager)], + MOZ_PSM=, + MOZ_PSM=1 ) + +if test "$COMPILE_ENVIRONMENT"; then + case $target in + *-cygwin*|*-mingw*|*-msvc*|*-mks*|*-wince) + if test -n "$MOZ_PSM" -a ! -e "$AS_BIN"; then + AC_MSG_ERROR([Building crypto support requires a valid version of the standalone assembler (ml.exe for MSVC).]) + fi + ;; + esac +fi + +dnl ======================================================== +dnl = JS Debugger XPCOM component (js/jsd) +dnl ======================================================== +MOZ_ARG_DISABLE_BOOL(jsd, +[ --disable-jsd Disable JavaScript debug library], + MOZ_JSDEBUGGER=, + MOZ_JSDEBUGGER=1) + + +dnl ======================================================== +dnl = Disable plugin support +dnl ======================================================== +MOZ_ARG_DISABLE_BOOL(plugins, +[ --disable-plugins Disable plugins support], + MOZ_PLUGINS=, + MOZ_PLUGINS=1) + +dnl ======================================================== +dnl = Open JVM Interface (OJI) support +dnl ======================================================== +MOZ_ARG_DISABLE_BOOL(oji, +[ --disable-oji Disable Open JVM Integration support], + MOZ_OJI=, + MOZ_OJI=1) +if test -n "$MOZ_OJI"; then + AC_DEFINE(OJI) +fi + +dnl ======================================================== +dnl = This turns on xinerama support. We just can't use the +dnl = autodetection of the libraries since on Red Hat 7 linking with +dnl = Xinerama crashes the dynamic loader. Make people turn it on +dnl = explicitly. The autodetection is done above in the Xlib +dnl = detection routines. +dnl ======================================================== +MOZ_ARG_ENABLE_BOOL(xinerama, +[ --enable-xinerama Enable Xinerama support + ( not safe for Red Hat 7.0 ) ], + _ENABLE_XINERAMA=1, + _ENABLE_XINERAMA= ) + +if test -n "$_ENABLE_XINERAMA" -a -n "$MOZ_XINERAMA_LIBS" -a \ + -n "$ac_cv_header_X11_extensions_Xinerama_h"; then + MOZ_ENABLE_XINERAMA=1 + AC_DEFINE(MOZ_ENABLE_XINERAMA) +fi + +dnl bi-directional support always on +IBMBIDI=1 +AC_DEFINE(IBMBIDI) + +dnl ======================================================== +dnl complex text support off by default +dnl ======================================================== +MOZ_ARG_ENABLE_BOOL(ctl, +[ --enable-ctl Enable Thai Complex Script support], + SUNCTL=1, + SUNCTL= ) + +dnl ======================================================== +dnl view source support on by default +dnl ======================================================== +MOZ_ARG_DISABLE_BOOL(view-source, +[ --disable-view-source Disable view source support], + MOZ_VIEW_SOURCE=, + MOZ_VIEW_SOURCE=1 ) +if test "$MOZ_VIEW_SOURCE"; then + AC_DEFINE(MOZ_VIEW_SOURCE) +fi + + +dnl ======================================================== +dnl accessibility support on by default +dnl ======================================================== +MOZ_ARG_DISABLE_BOOL(accessibility, +[ --disable-accessibility Disable accessibility support], + ACCESSIBILITY=, + ACCESSIBILITY=1 ) +if test "$ACCESSIBILITY"; then + AC_DEFINE(ACCESSIBILITY) +fi + +dnl ======================================================== +dnl xpfe/components on by default +dnl ======================================================== +MOZ_ARG_DISABLE_BOOL(xpfe-components, +[ --disable-xpfe-components + Disable xpfe components], + MOZ_XPFE_COMPONENTS=, + MOZ_XPFE_COMPONENTS=1 ) + +dnl ======================================================== +dnl xpinstall support on by default +dnl ======================================================== +MOZ_ARG_DISABLE_BOOL(xpinstall, +[ --disable-xpinstall Disable xpinstall support], + MOZ_XPINSTALL=, + MOZ_XPINSTALL=1 ) +if test "$MOZ_XPINSTALL"; then + AC_DEFINE(MOZ_XPINSTALL) +fi + +dnl ======================================================== +dnl Single profile support off by default +dnl ======================================================== +MOZ_ARG_ENABLE_BOOL(single-profile, +[ --enable-single-profile Enable single profile support ], + MOZ_SINGLE_PROFILE=1, + MOZ_SINGLE_PROFILE= ) + +dnl ======================================================== +dnl xpcom js loader support on by default +dnl ======================================================== +MOZ_ARG_DISABLE_BOOL(jsloader, +[ --disable-jsloader Disable xpcom js loader support], + MOZ_JSLOADER=, + MOZ_JSLOADER=1 ) +if test "$MOZ_JSLOADER"; then + AC_DEFINE(MOZ_JSLOADER) +fi + +dnl ======================================================== +dnl Disable printing +dnl ======================================================== +MOZ_ARG_DISABLE_BOOL(printing, +[ --disable-printing Disable printing support], + NS_PRINTING=, + NS_PRINTING=1 ) + +if test "$NS_PRINTING"; then + AC_DEFINE(NS_PRINTING) + AC_DEFINE(NS_PRINT_PREVIEW) +fi + +dnl ======================================================== +dnl use native unicode converters +dnl ======================================================== +MOZ_ARG_ENABLE_BOOL(native-uconv, +[ --enable-native-uconv Enable iconv support], + MOZ_USE_NATIVE_UCONV=1, + MOZ_USE_NATIVE_UCONV= ) + +if test "$MOZ_USE_NATIVE_UCONV"; then + AC_DEFINE(MOZ_USE_NATIVE_UCONV) +fi +if test "$OS_ARCH" != "WINCE" -a "$OS_ARCH" != "WINNT" -a "$MOZ_USE_NATIVE_UCONV" -a "$ac_cv_func_iconv" != "yes"; then + AC_MSG_ERROR([iconv() not found. Cannot enable native uconv support.]) +fi + +dnl ======================================================== +dnl Libeditor can be build as plaintext-only, +dnl or as a full html and text editing component. +dnl We build both by default. +dnl ======================================================== +MOZ_ARG_ENABLE_BOOL(plaintext-editor-only, +[ --enable-plaintext-editor-only + Allow only plaintext editing], + MOZ_PLAINTEXT_EDITOR_ONLY=1, + MOZ_PLAINTEXT_EDITOR_ONLY= ) +dnl Note the #define is MOZILLA, not MOZ, for compat with the Mac build. +AC_SUBST(MOZ_PLAINTEXT_EDITOR_ONLY) + +dnl ======================================================== +dnl Composer is on by default. +dnl ======================================================== +MOZ_ARG_DISABLE_BOOL(composer, +[ --disable-composer Disable building of Composer], + MOZ_COMPOSER=, + MOZ_COMPOSER=1 ) +AC_SUBST(MOZ_COMPOSER) + +dnl ======================================================== +dnl = Disable Fast Load +dnl ======================================================== +MOZ_ARG_DISABLE_BOOL(xpcom-fastload, +[ --disable-xpcom-fastload Disable XPCOM fastload support], + MOZ_NO_FAST_LOAD=1, + MOZ_NO_FAST_LOAD=) + +AC_SUBST(MOZ_NO_FAST_LOAD) + +if test -n "$MOZ_NO_FAST_LOAD"; then + AC_DEFINE(MOZ_NO_FAST_LOAD) +fi + +dnl ======================================================== +dnl = Drop XPCOM Obsolete library +dnl ======================================================== +MOZ_ARG_DISABLE_BOOL(xpcom-obsolete, +[ --disable-xpcom-obsolete Disable XPCOM Obsolete Library], + MOZ_NO_XPCOM_OBSOLETE=1, + MOZ_NO_XPCOM_OBSOLETE=) + +if test -n "$MOZ_NO_XPCOM_OBSOLETE"; then +if test -n "$MOZ_XPINSTALL"; then + AC_MSG_ERROR([Building without xpcom-obsolete isn't support when building xpinstal.]) +fi +if test -z "$MOZ_SINGLE_PROFILE"; then + AC_MSG_ERROR([Building without xpcom-obsolete isn't support when building full profile support.]) +fi + AC_DEFINE(MOZ_NO_XPCOM_OBSOLETE) +fi + +dnl ======================================================== +dnl XTF +dnl ======================================================== +MOZ_ARG_DISABLE_BOOL(xtf, +[ --disable-xtf Disable XTF (pluggable xml tags) support], + MOZ_XTF=, + MOZ_XTF=1 ) +if test "$MOZ_XTF"; then + AC_DEFINE(MOZ_XTF) +fi + +dnl ======================================================== +dnl XTF +dnl ======================================================== +MOZ_ARG_DISABLE_BOOL(inspector-apis, +[ --diable-inspector-apis Disable the DOM inspection APIS ], + MOZ_NO_INSPECTOR_APIS=1, + MOZ_NO_INSPECTOR_APIS= ) + +dnl ======================================================== +dnl JavaXPCOM +dnl ======================================================== +MOZ_ARG_ENABLE_BOOL(javaxpcom, +[ --enable-javaxpcom + Enable Java-XPCOM bridge], + MOZ_JAVAXPCOM=1, + MOZ_JAVAXPCOM= ) + +if test -n "${MOZ_JAVAXPCOM}"; then + case "$host_os" in + cygwin*|msvc*|mks*) + if test -n "$JAVA_HOME"; then + JAVA_HOME=`cygpath -u \`cygpath -m -s "$JAVA_HOME"\`` + fi + ;; + *mingw*) + if test -n "$JAVA_HOME"; then + JAVA_HOME=`cd "$JAVA_HOME" && pwd` + fi + ;; + esac + + if test -n "${JAVA_INCLUDE_PATH}"; then + dnl Make sure jni.h exists in the given include path. + if test ! -f "$JAVA_INCLUDE_PATH/jni.h"; then + AC_MSG_ERROR([jni.h was not found in given include path $JAVA_INCLUDE_PATH.]) + fi + else + case "$target_os" in + darwin*) + dnl Default to java system location + JAVA_INCLUDE_PATH=/System/Library/Frameworks/JavaVM.framework/Headers + ;; + *) + dnl Try $JAVA_HOME + JAVA_INCLUDE_PATH="$JAVA_HOME/include" + ;; + esac + if test ! -f "$JAVA_INCLUDE_PATH/jni.h"; then + AC_MSG_ERROR([The header jni.h was not found. Set \$JAVA_HOME or use --with-java-include-path={java-include-dir}.]) + fi + fi + + if test -n "${JAVA_BIN_PATH}"; then + dnl Look for javac and jar in the specified path. + JAVA_PATH="$JAVA_BIN_PATH" + else + dnl No path specified, so look for javac and jar in $JAVA_HOME & $PATH. + JAVA_PATH="$JAVA_HOME/bin:$PATH" + fi + + AC_PATH_PROG(JAVAC, javac, :, [$JAVA_PATH]) + AC_PATH_PROG(JAR, jar, :, [$JAVA_PATH]) + if test -z "$JAVAC" || test "$JAVAC" = ":" || test -z "$JAR" || test "$JAR" = ":"; then + AC_MSG_ERROR([The programs javac and jar were not found. Set \$JAVA_HOME or use --with-java-bin-path={java-bin-dir}.]) + fi +fi + + +dnl ======================================================== +dnl = Enable compilation of specific extension modules +dnl ======================================================== + +MOZ_ARG_ENABLE_STRING(extensions, +[ --enable-extensions Enable extensions], +[ for option in `echo $enableval | sed 's/,/ /g'`; do + if test "$option" = "yes" || test "$option" = "all"; then + MOZ_EXTENSIONS="$MOZ_EXTENSIONS $MOZ_EXTENSIONS_ALL" + elif test "$option" = "no" || test "$option" = "none"; then + MOZ_EXTENSIONS="" + elif test "$option" = "default"; then + MOZ_EXTENSIONS="$MOZ_EXTENSIONS $MOZ_EXTENSIONS_DEFAULT" + elif test `echo "$option" | grep -c \^-` != 0; then + option=`echo $option | sed 's/^-//'` + MOZ_EXTENSIONS=`echo "$MOZ_EXTENSIONS" | sed "s/ ${option}//"` + else + MOZ_EXTENSIONS="$MOZ_EXTENSIONS $option" + fi +done], + MOZ_EXTENSIONS="$MOZ_EXTENSIONS_DEFAULT") + +if test -z "$MOZ_ENABLE_GTK" && test `echo "$MOZ_EXTENSIONS" | grep -c xmlterm` -ne 0; then + AC_MSG_WARN([Cannot build xmlterm without gtk toolkit. Removing xmlterm from MOZ_EXTENSIONS.]) + MOZ_EXTENSIONS=`echo $MOZ_EXTENSIONS | sed -e 's|xmlterm||'` +fi + +if test -z "$MOZ_ENABLE_GNOMEVFS" && test `echo "$MOZ_EXTENSIONS" | grep -c gnomevfs` -ne 0; then + # Suppress warning on non-X11 platforms + if test -n "$MOZ_X11"; then + AC_MSG_WARN([Cannot build gnomevfs without required libraries. Removing gnomevfs from MOZ_EXTENSIONS.]) + fi + MOZ_EXTENSIONS=`echo $MOZ_EXTENSIONS | sed -e 's|gnomevfs||'` +fi + +if test -z "$MOZ_JSDEBUGGER" && test `echo "$MOZ_EXTENSIONS" | grep -c venkman` -ne 0; then + AC_MSG_WARN([Cannot build venkman without JavaScript debug library. Removing venkman from MOZ_EXTENSIONS.]) + MOZ_EXTENSIONS=`echo $MOZ_EXTENSIONS | sed -e 's|venkman||'` +fi + +dnl This might be temporary: build tridentprofile only on Windows +if test `echo "$MOZ_EXTENSIONS" | grep -c tridentprofile` -ne 0 && test "$OS_ARCH" != "WINNT"; then + AC_MSG_WARN([tridentprofile extension works only on Windows at this time. Removing tridentprofile from MOZ_EXTENSIONS.]) + MOZ_EXTENSIONS=`echo $MOZ_EXTENSIONS | sed -e 's|tridentprofile||'` +fi + +dnl cookie must be built before tridentprofile. put it at list's end. +if test `echo "$MOZ_EXTENSIONS" | grep -c tridentprofile` -ne 0; then + MOZ_EXTENSIONS=`echo $MOZ_EXTENSIONS | sed -e 's|tridentprofile||'` + if test `echo "$MOZ_EXTENSIONS" | grep -c cookie` -eq 0; then + AC_MSG_WARN([tridentprofile extension requires cookie. Removing tridentprofile.]) + else + MOZ_EXTENSIONS="$MOZ_EXTENSIONS tridentprofile" + fi +fi + +dnl xforms requires xtf and webservices and schema-validation +if test -z "$MOZ_XTF" && test `echo "$MOZ_EXTENSIONS" | grep -c xforms` -ne 0; then + AC_MSG_WARN([Cannot build XForms without XTF support. Removing XForms from MOZ_EXTENSIONS.]) + MOZ_EXTENSIONS=`echo $MOZ_EXTENSIONS | sed -e 's|xforms||g'` +fi +if test `echo "$MOZ_EXTENSIONS" | grep -c xforms` -ne 0 && test `echo "$MOZ_EXTENSIONS" | grep -c webservices` -eq 0; then + AC_MSG_WARN([Cannot build XForms without webservices. Removing XForms from MOZ_EXTENSIONS.]) + MOZ_EXTENSIONS=`echo $MOZ_EXTENSIONS | sed -e 's|xforms||g'` +fi + +if test `echo "$MOZ_EXTENSIONS" | grep -c xforms` -ne 0 && test `echo "$MOZ_EXTENSIONS" | grep -c schema-validation` -eq 0; then + AC_MSG_WARN([Cannot build XForms without schema validation. Removing XForms from MOZ_EXTENSIONS.]) + MOZ_EXTENSIONS=`echo $MOZ_EXTENSIONS | sed -e 's|xforms||g'` +fi + +if test `echo "$MOZ_EXTENSIONS" | grep -c java` -ne 0; then + AC_MSG_WARN([java is no longer an extension, use --enable-javaxpcom to enable.]) + MOZ_EXTENSIONS=`echo $MOZ_EXTENSIONS | sed -e 's|java||g'` +fi + +dnl Remove dupes +MOZ_EXTENSIONS=`${PERL} ${srcdir}/build/unix/uniq.pl ${MOZ_EXTENSIONS}` + +dnl ======================================================== +dnl Image decoders +dnl ======================================================== +case "$target_os" in +cygwin*|mingw*|msvc*|mks*|os2*|wince*|beos*) + MOZ_IMG_DECODERS_DEFAULT="$MOZ_IMG_DECODERS_DEFAULT icon" + ;; +darwin*) + if test "$MOZ_WIDGET_TOOLKIT" = "mac" -o "$MOZ_WIDGET_TOOLKIT" = "cocoa"; + then + MOZ_IMG_DECODERS_DEFAULT="$MOZ_IMG_DECODERS_DEFAULT icon" + fi + ;; +*) + if test "$MOZ_ENABLE_GNOMEUI"; then + MOZ_IMG_DECODERS_DEFAULT="$MOZ_IMG_DECODERS_DEFAULT icon" + fi + ;; +esac + +MOZ_ARG_ENABLE_STRING(image-decoders, +[ --enable-image-decoders[={mod1,mod2,default,all,none}] + Enable specific image decoders], +[ for option in `echo $enableval | sed 's/,/ /g'`; do + if test "$option" = "yes" || test "$option" = "all"; then + MOZ_IMG_DECODERS="$MOZ_IMG_DECODERS $MOZ_IMG_DECODERS_DEFAULT" + elif test "$option" = "no" || test "$option" = "none"; then + MOZ_IMG_DECODERS="" + elif test "$option" = "default"; then + MOZ_IMG_DECODERS="$MOZ_IMG_DECODERS $MOZ_IMG_DECODERS_DEFAULT" + elif test `echo "$option" | grep -c \^-` != 0; then + option=`echo $option | sed 's/^-//'` + MOZ_IMG_DECODERS=`echo "$MOZ_IMG_DECODERS" | sed "s/ ${option}//"` + else + MOZ_IMG_DECODERS="$MOZ_IMG_DECODERS $option" + fi +done], + MOZ_IMG_DECODERS="$MOZ_IMG_DECODERS_DEFAULT") + +dnl Dupes are removed in the encoder section because it will also add decoders + +dnl ======================================================== +dnl Image encoders +dnl ======================================================== +MOZ_ARG_ENABLE_STRING(image-encoders, +[ --enable-image-encoders[={mod1,mod2,default,all,none}] + Enable specific image encoders], +[ for option in `echo $enableval | sed 's/,/ /g'`; do + if test "$option" = "yes" || test "$option" = "all"; then + addencoder="$MOZ_IMG_ENCODERS_DEFAULT" + elif test "$option" = "no" || test "$option" = "none"; then + MOZ_IMG_ENCODERS="" + addencoder="" + elif test "$option" = "default"; then + addencoder="$MOZ_IMG_ENCODERS_DEFAULT" + elif test `echo "$option" | grep -c \^-` != 0; then + option=`echo $option | sed 's/^-//'` + addencoder=`echo "$MOZ_IMG_ENCODERS" | sed "s/ ${option}//"` + else + addencoder="$option" + fi + MOZ_IMG_ENCODERS="$MOZ_IMG_ENCODERS $addencoder" +done], + MOZ_IMG_ENCODERS="$MOZ_IMG_ENCODERS_DEFAULT") + +dnl Remove dupes +MOZ_IMG_DECODERS=`${PERL} ${srcdir}/build/unix/uniq.pl ${MOZ_IMG_DECODERS}` +MOZ_IMG_ENCODERS=`${PERL} ${srcdir}/build/unix/uniq.pl ${MOZ_IMG_ENCODERS}` + +dnl ======================================================== +dnl experimental ldap features +dnl ======================================================== +MOZ_ARG_ENABLE_BOOL(ldap-experimental, +[ --enable-ldap-experimental + Enable LDAP experimental features], + MOZ_LDAP_XPCOM_EXPERIMENTAL=1, + MOZ_LDAP_XPCOM_EXPERIMENTAL=) + +dnl ======================================================== +dnl MathML on by default +dnl ======================================================== +MOZ_ARG_DISABLE_BOOL(mathml, +[ --disable-mathml Disable MathML support], + MOZ_MATHML=, + MOZ_MATHML=1 ) +if test "$MOZ_MATHML"; then + AC_DEFINE(MOZ_MATHML) +fi + +dnl ======================================================== +dnl SVG +dnl ======================================================== +MOZ_ARG_ENABLE_BOOL(svg, +[ --enable-svg Enable SVG support], + MOZ_SVG=1, + MOZ_SVG= ) +if test -n "$MOZ_SVG"; then + AC_DEFINE(MOZ_SVG) + + SVG_DEFAULT_RENDERER=cairo + + MOZ_ARG_ENABLE_STRING(svg-renderer, + [ --enable-svg-renderer={gdiplus,libart,cairo}], + [ SVG_RENDERER=$enableval ], + [ SVG_RENDERER=$SVG_DEFAULT_RENDERER]) + + case "$SVG_RENDERER" in + gdiplus) + MOZ_SVG_RENDERER_GDIPLUS=1 + dnl XXX This is the test we'd like to perform but it isn't working + dnl under Windows for some reason: + dnl AC_CHECK_HEADER(Gdiplus.h,, + dnl AC_MSG_ERROR([Gdiplus.h not found!])) + dnl So do this instead: + AC_MSG_CHECKING(for Gdiplus.h) + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + AC_TRY_COMPILE([#include <windows.h> + #include <unknwn.h> + #include <Gdiplus.h>],,AC_MSG_RESULT(yes), + AC_MSG_ERROR([Building the SVG GDI+ renderer requires an appropriate Microsoft SDK.])) + AC_LANG_RESTORE + AC_DEFINE(MOZ_SVG_RENDERER_GDIPLUS) + ;; + + libart) + MOZ_SVG_RENDERER_LIBART=1 + AC_DEFINE(MOZ_SVG_RENDERER_LIBART) + ;; + + cairo) + MOZ_SVG_RENDERER_CAIRO=1 + AC_DEFINE(MOZ_SVG_RENDERER_CAIRO) + ;; + + *) + AC_MSG_ERROR([unknown svg renderer $SVG_RENDERER]) + ;; + esac +fi + +dnl COMMENTED OUT because foreignobject support should +dnl not be tweakable by distributors! +dnl ======================================================== +dnl SVG <foreignObject> +dnl ======================================================== +dnl MOZ_ARG_ENABLE_BOOL(svg-foreignobject, +dnl [ --enable-svg-foreignobject +dnl Enable SVG <foreignObject> support], +dnl MOZ_SVG_FOREIGNOBJECT=1, +dnl MOZ_SVG_FOREIGNOBJECT= ) +dnl if test -n "$MOZ_SVG_FOREIGNOBJECT"; then +dnl AC_DEFINE(MOZ_SVG_FOREIGNOBJECT) +dnl fi + +dnl ======================================================== +dnl Transformiix +dnl ======================================================== + +dnl To build transformiix standalone, set TX_EXE while configuring +if test "$TX_EXE"; then + AC_DEFINE(TX_EXE) +fi + +dnl ======================================================== +dnl Installer +dnl ======================================================== +case "$target_os" in + aix*|solaris*|linux*|msvc*|mks*|cygwin*|mingw*|os2*|wince*) + MOZ_INSTALLER=1 + ;; +esac + +MOZ_ARG_DISABLE_BOOL(installer, +[ --disable-installer Disable building of installer], + MOZ_INSTALLER=, + MOZ_INSTALLER=1 ) +if test -n "$MOZ_INSTALLER" -a -n "$MOZ_XUL_APP" -a "$OS_ARCH" = "WINNT"; then + # Disable installer for Windows builds that use the new toolkit if NSIS + # isn't in the path. + AC_PATH_PROGS(MAKENSIS, makensis) + if test -z "$MAKENSIS" || test "$MAKENSIS" = ":"; then + AC_MSG_ERROR([To build the installer makensis is required in your path. To build without the installer reconfigure using --disable-installer.]) + fi + # The Windows build for NSIS requires the iconv command line utility to + # convert the charset of the locale files. + AC_PATH_PROGS(HOST_ICONV, $HOST_ICONV "iconv", "") + if test -z "$HOST_ICONV"; then + AC_MSG_ERROR([To build the installer iconv is required in your path. To build without the installer reconfigure using --disable-installer.]) + fi +fi + +# Automatically disable installer if xpinstall isn't built +if test -z "$MOZ_XPINSTALL"; then + MOZ_INSTALLER= +fi +AC_SUBST(MOZ_INSTALLER) + +dnl ======================================================== +dnl Updater +dnl ======================================================== +if test "$MOZ_XUL_APP"; then + MOZ_UPDATER=1 +fi + +MOZ_ARG_DISABLE_BOOL(updater, +[ --disable-updater Disable building of updater], + MOZ_UPDATER=, + MOZ_UPDATER=1 ) +# The Windows build requires the iconv command line utility +# in order to build the updater. +case "$target_os" in + msvc*|mks*|cygwin*|mingw*|wince*) + if test -n "$MOZ_UPDATER"; then + AC_MSG_CHECKING([for iconv]) + AC_CHECK_PROGS(HOST_ICONV, $HOST_ICONV "iconv", "") + if test -z "$HOST_ICONV"; then + AC_MSG_ERROR([iconv not found in \$PATH]) + fi + fi + ;; +esac +AC_SUBST(MOZ_UPDATER) + +# app update channel is 'default' when not supplied. +MOZ_ARG_ENABLE_STRING([update-channel], +[ --enable-update-channel=CHANNEL + Select application update channel (default=default)], + MOZ_UPDATE_CHANNEL=`echo $enableval | tr A-Z a-z`) + +if test -z "$MOZ_UPDATE_CHANNEL"; then + MOZ_UPDATE_CHANNEL=default +fi +AC_DEFINE_UNQUOTED(MOZ_UPDATE_CHANNEL, $MOZ_UPDATE_CHANNEL) + +# tools/update-packaging is not checked out by default. +MOZ_ARG_ENABLE_BOOL(update-packaging, +[ --enable-update-packaging + Enable tools/update-packaging], + MOZ_UPDATE_PACKAGING=1, + MOZ_UPDATE_PACKAGING= ) +AC_SUBST(MOZ_UPDATE_PACKAGING) + +dnl ======================================================== +dnl ActiveX +dnl ======================================================== +MOZ_ARG_DISABLE_BOOL(activex, +[ --disable-activex Disable building of ActiveX control (win32 only)], + MOZ_NO_ACTIVEX_SUPPORT=1, + MOZ_NO_ACTIVEX_SUPPORT= ) +AC_SUBST(MOZ_NO_ACTIVEX_SUPPORT) + +MOZ_ARG_DISABLE_BOOL(activex-scripting, +[ --disable-activex-scripting + Disable building of ActiveX scripting support (win32)], + MOZ_ACTIVEX_SCRIPTING_SUPPORT=, + MOZ_ACTIVEX_SCRIPTING_SUPPORT=1) +AC_SUBST(MOZ_ACTIVEX_SCRIPTING_SUPPORT) + +if test -n "$MOZ_NO_ACTIVEX_SUPPORT" -a -n "$MOZ_ACTIVEX_SCRIPTING_SUPPORT"; +then + AC_MSG_ERROR([Cannot enable ActiveX scripting support when ActiveX support is disabled.]) +fi + +dnl ======================================================== +dnl leaky +dnl ======================================================== +MOZ_ARG_ENABLE_BOOL(leaky, +[ --enable-leaky Build leaky memory tool], + MOZ_LEAKY=1, + MOZ_LEAKY=) + + +dnl ======================================================== +dnl xpctools +dnl ======================================================== +MOZ_ARG_ENABLE_BOOL(xpctools, +[ --enable-xpctools Build JS profiling tool], + MOZ_XPCTOOLS=1, + MOZ_XPCTOOLS= ) + + +dnl ======================================================== +dnl build the tests by default +dnl ======================================================== +MOZ_ARG_DISABLE_BOOL(tests, +[ --disable-tests Do not build test libraries & programs], + ENABLE_TESTS=, + ENABLE_TESTS=1 ) + +dnl ======================================================== +dnl = +dnl = Module specific options +dnl = +dnl ======================================================== +MOZ_ARG_HEADER(Individual module options) + +dnl ======================================================== +dnl = Enable Lea malloc in xpcom. OFF by default. +dnl ======================================================== +MOZ_ARG_ENABLE_BOOL(xpcom-lea, +[ --enable-xpcom-lea Use Lea malloc in xpcom ], + XPCOM_USE_LEA=1, + XPCOM_USE_LEA= ) +if test -n "$XPCOM_USE_LEA"; then + AC_DEFINE(XPCOM_USE_LEA) +fi + +dnl ======================================================== +dnl = Enable places (new history/bookmarks) +dnl ======================================================== +MOZ_ARG_ENABLE_BOOL(places, +[ --enable-places Enable 'places' bookmark/history implementation], + MOZ_PLACES=1, + MOZ_PLACES= ) +if test -n "$MOZ_PLACES"; then + AC_DEFINE(MOZ_PLACES) + MOZ_MORK= + MOZ_MORKREADER=1 +fi + +dnl ======================================================== +dnl = Disable feeds (new feed handling/processing) - Firefox +dnl ======================================================== +MOZ_ARG_DISABLE_BOOL(feeds, +[ --disable-feeds Disable in-page feed handling and processing], + MOZ_FEEDS=, + MOZ_FEEDS=1 ) +if test -n "$MOZ_FEEDS"; then + AC_DEFINE(MOZ_FEEDS) +fi + +dnl ======================================================== +dnl = Enable mozStorage +dnl = XXX need to implement --with-system-sqlite3 (see bug 263381) +dnl ======================================================== +dnl Implicitly enabled by default if building calendar or places +MOZ_ARG_ENABLE_BOOL(storage, +[ --enable-storage Enable mozStorage module and related components], + MOZ_STORAGE=1, + MOZ_STORAGE= ) +if test -n "$MOZ_STORAGE"; then + AC_DEFINE(MOZ_STORAGE) +fi + +dnl ======================================================== +dnl = Enable safe browsing (anti-phishing) +dnl ======================================================== +MOZ_ARG_ENABLE_BOOL(safe-browsing, +[ --enable-safe-browsing Enable safe browsing (anti-phishing) implementation], + MOZ_SAFE_BROWSING=1, + MOZ_SAFE_BROWSING= ) +if test -n "$MOZ_SAFE_BROWSING"; then + AC_DEFINE(MOZ_SAFE_BROWSING) +fi +AC_SUBST(MOZ_SAFE_BROWSING) + +dnl ======================================================== +dnl = Enable url-classifier +dnl ======================================================== +dnl Implicitly enabled by default if building with safe-browsing +if test -n "$MOZ_SAFE_BROWSING"; then + MOZ_URL_CLASSIFIER=1 +fi +MOZ_ARG_ENABLE_BOOL(url-classifier, +[ --enable-url-classifier Enable url classifier module], + MOZ_URL_CLASSIFIER=1, + MOZ_URL_CLASSIFIER= ) +if test -n "$MOZ_URL_CLASSIFIER"; then + AC_DEFINE(MOZ_URL_CLASSIFIER) +fi +AC_SUBST(MOZ_URL_CLASSIFIER) + +dnl ======================================================== +dnl = Enable Ultrasparc specific optimizations for JS +dnl ======================================================== +MOZ_ARG_ENABLE_BOOL(js-ultrasparc, +[ --enable-js-ultrasparc Use UltraSPARC optimizations in JS], + JS_ULTRASPARC_OPTS=1, + JS_ULTRASPARC_OPTS= ) + +dnl only enable option for ultrasparcs +if test `echo "$target_os" | grep -c \^solaris 2>/dev/null` = 0 -o \ + "$OS_TEST" != "sun4u"; then + JS_ULTRASPARC_OPTS= +fi +AC_SUBST(JS_ULTRASPARC_OPTS) + +dnl ======================================================== +dnl = +dnl = Feature options that require extra sources to be pulled +dnl = +dnl ======================================================== +dnl MOZ_ARG_HEADER(Features that require extra sources) + +dnl ======================================================== +dnl = +dnl = Debugging Options +dnl = +dnl ======================================================== +MOZ_ARG_HEADER(Debugging and Optimizations) + +dnl ======================================================== +dnl = Disable building with debug info. +dnl = Debugging is OFF by default +dnl ======================================================== +if test -z "$MOZ_DEBUG_FLAGS" +then + case "$target" in + *-irix*) + if test "$GNU_CC"; then + GCC_VERSION=`$CC -v 2>&1 | awk '/version/ { print $3 }'` + case "$GCC_VERSION" in + 2.95.*) + MOZ_DEBUG_FLAGS="" + ;; + *) + MOZ_DEBUG_FLAGS="-g" + ;; + esac + else + MOZ_DEBUG_FLAGS="-g" + fi + ;; + *) + MOZ_DEBUG_FLAGS="-g" + ;; + esac +fi + +MOZ_ARG_ENABLE_STRING(debug, +[ --enable-debug[=DBG] Enable building with developer debug info + (Using compiler flags DBG)], +[ if test "$enableval" != "no"; then + MOZ_DEBUG=1 + if test -n "$enableval" && test "$enableval" != "yes"; then + MOZ_DEBUG_FLAGS=`echo $enableval | sed -e 's|\\\ | |g'` + fi + else + MOZ_DEBUG= + fi ], + MOZ_DEBUG=) + +MOZ_DEBUG_ENABLE_DEFS="-DDEBUG -D_DEBUG" + case "${target_os}" in + beos*) + MOZ_DEBUG_ENABLE_DEFS="$MOZ_DEBUG_ENABLE_DEFS -DDEBUG_${USER}" + ;; + msvc*|mks*|cygwin*|mingw*|os2*|wince*) + MOZ_DEBUG_ENABLE_DEFS="$MOZ_DEBUG_ENABLE_DEFS -DDEBUG_`echo ${USERNAME} | sed -e 's| |_|g'`" + ;; + *) + MOZ_DEBUG_ENABLE_DEFS="$MOZ_DEBUG_ENABLE_DEFS -DDEBUG_`$WHOAMI`" + ;; + esac +MOZ_DEBUG_ENABLE_DEFS="$MOZ_DEBUG_ENABLE_DEFS -DTRACING" + +MOZ_DEBUG_DISABLE_DEFS="-DNDEBUG -DTRIMMED" + +if test -n "$MOZ_DEBUG"; then + AC_MSG_CHECKING([for valid debug flags]) + _SAVE_CFLAGS=$CFLAGS + CFLAGS="$CFLAGS $MOZ_DEBUG_FLAGS" + AC_TRY_COMPILE([#include <stdio.h>], + [printf("Hello World\n");], + _results=yes, + _results=no) + AC_MSG_RESULT([$_results]) + if test "$_results" = "no"; then + AC_MSG_ERROR([These compiler flags are invalid: $MOZ_DEBUG_FLAGS]) + fi + CFLAGS=$_SAVE_CFLAGS +fi + +dnl ======================================================== +dnl = Enable code optimization. ON by default. +dnl ======================================================== +if test -z "$MOZ_OPTIMIZE_FLAGS"; then + MOZ_OPTIMIZE_FLAGS="-O" +fi + +MOZ_ARG_ENABLE_STRING(optimize, +[ --disable-optimize Disable compiler optimization + --enable-optimize=[OPT] Specify compiler optimization flags [OPT=-O]], +[ if test "$enableval" != "no"; then + MOZ_OPTIMIZE=1 + if test -n "$enableval" && test "$enableval" != "yes"; then + MOZ_OPTIMIZE_FLAGS=`echo "$enableval" | sed -e 's|\\\ | |g'` + MOZ_OPTIMIZE=2 + fi +else + MOZ_OPTIMIZE= +fi ], MOZ_OPTIMIZE=1) + +if test "$COMPILE_ENVIRONMENT"; then +if test -n "$MOZ_OPTIMIZE"; then + AC_MSG_CHECKING([for valid optimization flags]) + _SAVE_CFLAGS=$CFLAGS + CFLAGS="$CFLAGS $MOZ_OPTIMIZE_FLAGS" + AC_TRY_COMPILE([#include <stdio.h>], + [printf("Hello World\n");], + _results=yes, + _results=no) + AC_MSG_RESULT([$_results]) + if test "$_results" = "no"; then + AC_MSG_ERROR([These compiler flags are invalid: $MOZ_OPTIMIZE_FLAGS]) + fi + CFLAGS=$_SAVE_CFLAGS +fi +fi # COMPILE_ENVIRONMENT + +AC_SUBST(MOZ_OPTIMIZE) +AC_SUBST(MOZ_OPTIMIZE_FLAGS) +AC_SUBST(MOZ_OPTIMIZE_LDFLAGS) + +dnl ======================================================== +dnl = Enable/disable debug for specific modules only +dnl = module names beginning with ^ will be disabled +dnl ======================================================== +MOZ_ARG_ENABLE_STRING(debug-modules, +[ --enable-debug-modules Enable/disable debug info for specific modules], +[ MOZ_DEBUG_MODULES=`echo $enableval| sed 's/,/ /g'` ] ) + +dnl ======================================================== +dnl = Enable/disable generation of debugger info for specific modules only +dnl = the special module name ALL_MODULES can be used to denote all modules +dnl = module names beginning with ^ will be disabled +dnl ======================================================== +MOZ_ARG_ENABLE_STRING(debugger-info-modules, +[ --enable-debugger-info-modules + Enable/disable debugger info for specific modules], +[ for i in `echo $enableval | sed 's/,/ /g'`; do + dnl note that the list of module names is reversed as it is copied + dnl this is important, as it will allow config.mk to interpret stuff like + dnl "^ALL_MODULES xpcom" properly + if test "$i" = "no"; then + i="^ALL_MODULES" + fi + if test "$i" = "yes"; then + i="ALL_MODULES" + fi + MOZ_DBGRINFO_MODULES="$i $MOZ_DBGRINFO_MODULES"; + done ]) + +dnl ======================================================== +dnl Enable garbage collector +dnl ======================================================== +MOZ_ARG_ENABLE_BOOL(boehm, +[ --enable-boehm Enable the Boehm Garbage Collector], + GC_LEAK_DETECTOR=1, + GC_LEAK_DETECTOR= ) +if test -n "$GC_LEAK_DETECTOR"; then + AC_DEFINE(GC_LEAK_DETECTOR) +fi + +dnl ======================================================== +dnl Disable runtime logging checks +dnl ======================================================== +MOZ_ARG_DISABLE_BOOL(logging, +[ --disable-logging Disable logging facilities], + NS_DISABLE_LOGGING=1, + NS_DISABLE_LOGGING= ) +if test "$NS_DISABLE_LOGGING"; then + AC_DEFINE(NS_DISABLE_LOGGING) +else + AC_DEFINE(MOZ_LOGGING) +fi + +dnl ======================================================== +dnl Crash on assert +dnl ======================================================== +MOZ_ARG_ENABLE_BOOL(crash-on-assert, +[ --enable-crash-on-assert + Make NS_ASSERTION crash on Unix], + _CRASH_ON_ASSERT=1, + _CRASH_ON_ASSERT= ) +if test "$_CRASH_ON_ASSERT"; then + AC_DEFINE(UNIX_CRASH_ON_ASSERT) +fi + +dnl ======================================================== +dnl = Enable function reordering. Off by default +dnl ======================================================== +MOZ_ARG_ENABLE_BOOL(reorder, +[ --enable-reorder Enable function reordering (requires GNU ld) ], + _ENABLE_REORDER=1, + _ENABLE_REORDER= ) +if test -n "$_ENABLE_REORDER"; then + if test -z "$GNU_LD"; then + AC_MSG_WARN([Reordering only works with GNU ld. Not reordering.]) + else + MOZ_REORDER=1 + fi +fi + +dnl ======================================================== +dnl = dnl This will enable logging of addref, release, ctor, dtor. +dnl ======================================================== +_ENABLE_LOGREFCNT=42 +MOZ_ARG_ENABLE_BOOL(logrefcnt, +[ --enable-logrefcnt Enable logging of refcounts (default=debug) ], + _ENABLE_LOGREFCNT=1, + _ENABLE_LOGREFCNT= ) +if test "$_ENABLE_LOGREFCNT" = "1"; then + AC_DEFINE(FORCE_BUILD_REFCNT_LOGGING) +elif test -z "$_ENABLE_LOGREFCNT"; then + AC_DEFINE(NO_BUILD_REFCNT_LOGGING) +fi + +dnl ======================================================== +dnl = detect webshell leaks +dnl ======================================================== +MOZ_ARG_ENABLE_BOOL(detect-webshell-leaks, +[ --enable-detect-webshell-leaks + Enable detection of webshell leaks + (default=debug)], + _DETECT_WEBSHELL_LEAKS=1, + _DETECT_WEBSHELL_LEAKS=, + [ if test "$MOZ_DEBUG"; then + _DETECT_WEBSHELL_LEAKS=1 + fi]) + +if test "$_DETECT_WEBSHELL_LEAKS"; then + AC_DEFINE(DETECT_WEBSHELL_LEAKS) + AC_SUBST(DETECT_WEBSHELL_LEAKS) +fi + +dnl ======================================================== +dnl = Use malloc wrapper lib +dnl ======================================================== +MOZ_ARG_ENABLE_BOOL(wrap-malloc, +[ --enable-wrap-malloc Wrap malloc calls (gnu linker only)], + _WRAP_MALLOC=1, + _WRAP_MALLOC= ) + +if test -n "$_WRAP_MALLOC"; then + if test "$GNU_CC"; then + WRAP_MALLOC_CFLAGS="${LDFLAGS} -Wl,--wrap -Wl,malloc -Wl,--wrap -Wl,free -Wl,--wrap -Wl,realloc -Wl,--wrap -Wl,__builtin_new -Wl,--wrap -Wl,__builtin_vec_new -Wl,--wrap -Wl,__builtin_delete -Wl,--wrap -Wl,__builtin_vec_delete -Wl,--wrap -Wl,PR_Free -Wl,--wrap -Wl,PR_Malloc -Wl,--wrap -Wl,PR_Calloc -Wl,--wrap -Wl,PR_Realloc" + MKSHLIB='$(CXX) $(DSO_LDOPTS) $(WRAP_MALLOC_CFLAGS) -o $@' + fi +fi + +dnl ======================================================== +dnl = Location of malloc wrapper lib +dnl ======================================================== +MOZ_ARG_WITH_STRING(wrap-malloc, +[ --with-wrap-malloc=DIR Location of malloc wrapper library], + WRAP_MALLOC_LIB=$withval) + +dnl ======================================================== +dnl = Use Electric Fence +dnl ======================================================== +MOZ_ARG_ENABLE_BOOL(efence, +[ --enable-efence Link with Electric Fence], + _ENABLE_EFENCE=1, + _ENABLE_EFENCE= ) +if test -n "$_ENABLE_EFENCE"; then + AC_CHECK_LIB(efence,malloc) +fi + +dnl ======================================================== +dnl jprof +dnl ======================================================== +MOZ_ARG_ENABLE_BOOL(jprof, +[ --enable-jprof Enable jprof profiling tool (needs mozilla/tools/jprof)], + MOZ_JPROF=1, + MOZ_JPROF= ) +if test -n "$MOZ_JPROF"; then + AC_DEFINE(MOZ_JPROF) +fi + + +dnl ======================================================== +dnl = Enable stripping of libs & executables +dnl ======================================================== +MOZ_ARG_ENABLE_BOOL(strip, +[ --enable-strip Enable stripping of libs & executables ], + ENABLE_STRIP=1, + ENABLE_STRIP= ) + +dnl ======================================================== +dnl = --enable-elf-dynstr-gc +dnl ======================================================== +MOZ_ARG_ENABLE_BOOL(elf-dynstr-gc, +[ --enable-elf-dynstr-gc Enable elf dynstr garbage collector (opt builds only)], + USE_ELF_DYNSTR_GC=1, + USE_ELF_DYNSTR_GC= ) + +dnl ======================================================== +dnl = --enable-old-abi-compat-wrappers +dnl ======================================================== +dnl on x86 linux, the current builds of some popular plugins (notably +dnl flashplayer and real) expect a few builtin symbols from libgcc +dnl which were available in some older versions of gcc. However, +dnl they're _NOT_ available in newer versions of gcc (eg 3.1), so if +dnl we want those plugin to work with a gcc-3.1 built binary, we need +dnl to provide these symbols. MOZ_ENABLE_OLD_ABI_COMPAT_WRAPPERS defaults +dnl to true on x86 linux, and false everywhere else. +dnl + +MOZ_ARG_ENABLE_BOOL(old-abi-compat-wrappers, +[ --enable-old-abi-compat-wrappers + Support old GCC ABI symbols to ease the pain + of the linux compiler change], + MOZ_ENABLE_OLD_ABI_COMPAT_WRAPPERS=1, + MOZ_ENABLE_OLD_ABI_COMPAT_WRAPPERS= ) +if test "$COMPILE_ENVIRONMENT"; then +if test "$MOZ_ENABLE_OLD_ABI_COMPAT_WRAPPERS"; then + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + AC_CHECK_FUNCS(__builtin_vec_new __builtin_vec_delete __builtin_new __builtin_delete __pure_virtual) + AC_LANG_RESTORE + AC_DEFINE(MOZ_ENABLE_OLD_ABI_COMPAT_WRAPPERS) +fi +fi # COMPILE_ENVIRONMENT + +dnl ======================================================== +dnl = --enable-prebinding +dnl ======================================================== +MOZ_ARG_ENABLE_BOOL(prebinding, +[ --enable-prebinding Enable prebinding (Mac OS X only)], + USE_PREBINDING=1, + USE_PREBINDING= ) + +dnl ======================================================== +dnl = +dnl = Profiling and Instrumenting +dnl = +dnl ======================================================== +MOZ_ARG_HEADER(Profiling and Instrumenting) + +dnl ======================================================== +dnl = Enable timeline service, which provides lightweight +dnl = instrumentation of mozilla for performance measurement. +dnl = Timeline is off by default. +dnl ======================================================== +MOZ_ARG_ENABLE_BOOL(timeline, +[ --enable-timeline Enable timeline services ], + MOZ_TIMELINE=1, + MOZ_TIMELINE= ) +if test -n "$MOZ_TIMELINE"; then + AC_DEFINE(MOZ_TIMELINE) +fi + +dnl ======================================================== +dnl Turn on reflow counting +dnl ======================================================== +MOZ_ARG_ENABLE_BOOL(reflow-perf, +[ --enable-reflow-perf Enable reflow performance tracing], + MOZ_REFLOW_PERF=1, + MOZ_REFLOW_PERF= ) +if test -n "$MOZ_REFLOW_PREF"; then + AC_DEFINE(MOZ_REFLOW_PREF) +fi +AC_SUBST(MOZ_REFLOW_PERF) + +dnl ======================================================== +dnl Enable performance metrics. +dnl ======================================================== +MOZ_ARG_ENABLE_BOOL(perf-metrics, +[ --enable-perf-metrics Enable performance metrics], + MOZ_PERF_METRICS=1, + MOZ_PERF_METRICS= ) +if test -n "$MOZ_PERF_METRICS"; then + AC_DEFINE(MOZ_PERF_METRICS) +fi + +dnl ======================================================== +dnl Enable code size metrics. +dnl ======================================================== +MOZ_ARG_ENABLE_BOOL(codesighs, +[ --enable-codesighs Enable code size analysis tools], + _ENABLE_CODESIGHS=1, + _ENABLE_CODESIGHS= ) +if test -n "$_ENABLE_CODESIGHS"; then + if test -d $srcdir/tools/codesighs; then + MOZ_MAPINFO=1 + else + AC_MSG_ERROR([Codesighs directory $srcdir/tools/codesighs required.]) + fi +fi + +dnl ======================================================== +dnl = Enable trace malloc +dnl ======================================================== +NS_TRACE_MALLOC=${MOZ_TRACE_MALLOC} +MOZ_ARG_ENABLE_BOOL(trace-malloc, +[ --enable-trace-malloc Enable malloc tracing], + NS_TRACE_MALLOC=1, + NS_TRACE_MALLOC= ) +if test "$NS_TRACE_MALLOC"; then + # Please, Mr. Linker Man, don't take away our symbol names + MOZ_COMPONENTS_VERSION_SCRIPT_LDFLAGS= + USE_ELF_DYNSTR_GC= + AC_DEFINE(NS_TRACE_MALLOC) +fi +AC_SUBST(NS_TRACE_MALLOC) + +dnl ======================================================== +dnl = Add support for Eazel profiler +dnl ======================================================== +MOZ_ARG_ENABLE_BOOL(eazel-profiler-support, +[ --enable-eazel-profiler-support + Enable Corel/Eazel profiler support], + ENABLE_EAZEL_PROFILER=1, + ENABLE_EAZEL_PROFILER= ) +if test -n "$ENABLE_EAZEL_PROFILER"; then + AC_DEFINE(ENABLE_EAZEL_PROFILER) + USE_ELF_DYNSTR_GC= + MOZ_COMPONENTS_VERSION_SCRIPT_LDFLAGS= + EAZEL_PROFILER_CFLAGS="-g -O -gdwarf-2 -finstrument-functions -D__NO_STRING_INLINES -D__NO_MATH_INLINES" + EAZEL_PROFILER_LIBS="-lprofiler -lpthread" +fi + +MOZ_ARG_ENABLE_STRING(profile-modules, +[ --enable-profile-modules + Enable/disable profiling for specific modules], +[ MOZ_PROFILE_MODULES=`echo $enableval| sed 's/,/ /g'` ] ) + +MOZ_ARG_ENABLE_BOOL(insure, +[ --enable-insure Enable insure++ instrumentation (linux only)], + _ENABLE_INSURE=1, + _ENABLE_INSURE= ) +if test -n "$_ENABLE_INSURE"; then + MOZ_INSURE="insure" + MOZ_INSURIFYING=1 + MOZ_INSURE_DIRS="." + MOZ_INSURE_EXCLUDE_DIRS="config" +fi + +MOZ_ARG_WITH_STRING(insure-dirs, +[ --with-insure-dirs=DIRS + Dirs to instrument with insure ], + MOZ_INSURE_DIRS=$withval ) + +MOZ_ARG_WITH_STRING(insure-exclude-dirs, +[ --with-insure-exclude-dirs=DIRS + Dirs to not instrument with insure ], + MOZ_INSURE_EXCLUDE_DIRS="config $withval" ) + +dnl ======================================================== +dnl = Support for Quantify (Windows) +dnl ======================================================== +MOZ_ARG_ENABLE_BOOL(quantify, +[ --enable-quantify Enable Quantify support (Windows only) ], + MOZ_QUANTIFY=1, + MOZ_QUANTIFY= ) + +dnl ======================================================== +dnl = Support for demangling undefined symbols +dnl ======================================================== +if test -z "$SKIP_LIBRARY_CHECKS"; then + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + AC_CHECK_FUNCS(__cxa_demangle, HAVE_DEMANGLE=1, HAVE_DEMANGLE=) + AC_LANG_RESTORE +fi + +# Demangle only for debug or trace-malloc builds +MOZ_DEMANGLE_SYMBOLS= +if test "$HAVE_DEMANGLE" -a "$HAVE_GCC3_ABI" && test "$MOZ_DEBUG" -o "$NS_TRACE_MALLOC"; then + MOZ_DEMANGLE_SYMBOLS=1 + AC_DEFINE(MOZ_DEMANGLE_SYMBOLS) +fi +AC_SUBST(MOZ_DEMANGLE_SYMBOLS) + + +dnl ======================================================== +dnl = +dnl = Misc. Options +dnl = +dnl ======================================================== +MOZ_ARG_HEADER(Misc. Options) + +dnl ======================================================== +dnl update xterm title +dnl ======================================================== +MOZ_ARG_ENABLE_BOOL(xterm-updates, +[ --enable-xterm-updates Update XTERM titles with current command.], + MOZ_UPDATE_XTERM=1, + MOZ_UPDATE_XTERM= ) + +dnl ========================================================= +dnl = Chrome format +dnl ========================================================= +MOZ_ARG_ENABLE_STRING([chrome-format], +[ --enable-chrome-format=jar|flat|both|symlink + Select FORMAT of chrome files (default=jar)], + MOZ_CHROME_FILE_FORMAT=`echo $enableval | tr A-Z a-z`) + +if test -z "$MOZ_CHROME_FILE_FORMAT"; then + MOZ_CHROME_FILE_FORMAT=jar +fi + +if test "$MOZ_CHROME_FILE_FORMAT" != "jar" && + test "$MOZ_CHROME_FILE_FORMAT" != "flat" && + test "$MOZ_CHROME_FILE_FORMAT" != "symlink" && + test "$MOZ_CHROME_FILE_FORMAT" != "both"; then + AC_MSG_ERROR([--enable-chrome-format must be set to either jar, flat, both, or symlink]) +fi + +dnl ======================================================== +dnl = Define default location for MOZILLA_FIVE_HOME +dnl ======================================================== +MOZ_ARG_WITH_STRING(default-mozilla-five-home, +[ --with-default-mozilla-five-home + Set the default value for MOZILLA_FIVE_HOME], +[ val=`echo $withval` + AC_DEFINE_UNQUOTED(MOZ_DEFAULT_MOZILLA_FIVE_HOME,"$val") ]) + +dnl ======================================================== +dnl = Location of the mozilla user directory (default is ~/.mozilla).], +dnl ======================================================== +MOZ_ARG_WITH_STRING(user-appdir, +[ --with-user-appdir=DIR Set user-specific appdir (default=.mozilla)], +[ val=`echo $withval` +if echo "$val" | grep "\/" >/dev/null; then + AC_MSG_ERROR("Homedir must be single relative path.") +else + MOZ_USER_DIR="$val" +fi]) + +AC_DEFINE_UNQUOTED(MOZ_USER_DIR,"$MOZ_USER_DIR") + +dnl ======================================================== +dnl = Doxygen configuration +dnl ======================================================== +dnl Use commas to specify multiple dirs to this arg +MOZ_DOC_INPUT_DIRS='./dist/include ./dist/idl' +MOZ_ARG_WITH_STRING(doc-input-dirs, +[ --with-doc-input-dirs=DIRS + Header/idl dirs to create docs from], +[ MOZ_DOC_INPUT_DIRS=`echo "$withval" | sed "s/,/ /g"` ] ) +AC_SUBST(MOZ_DOC_INPUT_DIRS) + +dnl Use commas to specify multiple dirs to this arg +MOZ_DOC_INCLUDE_DIRS='./dist/include ./dist/include/nspr' +MOZ_ARG_WITH_STRING(doc-include-dirs, +[ --with-doc-include-dirs=DIRS + Include dirs to preprocess doc headers], +[ MOZ_DOC_INCLUDE_DIRS=`echo "$withval" | sed "s/,/ /g"` ] ) +AC_SUBST(MOZ_DOC_INCLUDE_DIRS) + +MOZ_DOC_OUTPUT_DIR='./dist/docs' +MOZ_ARG_WITH_STRING(doc-output-dir, +[ --with-doc-output-dir=DIR + Dir to generate docs into], +[ MOZ_DOC_OUTPUT_DIR=$withval ] ) +AC_SUBST(MOZ_DOC_OUTPUT_DIR) + +if test -z "$SKIP_COMPILER_CHECKS"; then +dnl ======================================================== +dnl = +dnl = Compiler Options +dnl = +dnl ======================================================== +MOZ_ARG_HEADER(Compiler Options) + +dnl ======================================================== +dnl Check for gcc -pipe support +dnl ======================================================== +AC_MSG_CHECKING([for gcc -pipe support]) +if test -n "$GNU_CC" && test -n "$GNU_CXX" && test -n "$GNU_AS"; then + echo '#include <stdio.h>' > dummy-hello.c + echo 'int main() { printf("Hello World\n"); exit(0); }' >> dummy-hello.c + ${CC} -S dummy-hello.c -o dummy-hello.s 2>&5 + cat dummy-hello.s | ${AS_BIN} -o dummy-hello.S - 2>&5 + if test $? = 0; then + _res_as_stdin="yes" + else + _res_as_stdin="no" + fi + if test "$_res_as_stdin" = "yes"; then + _SAVE_CFLAGS=$CFLAGS + CFLAGS="$CFLAGS -pipe" + AC_TRY_COMPILE( [ #include <stdio.h> ], + [printf("Hello World\n");], + [_res_gcc_pipe="yes"], + [_res_gcc_pipe="no"] ) + CFLAGS=$_SAVE_CFLAGS + fi + if test "$_res_as_stdin" = "yes" && test "$_res_gcc_pipe" = "yes"; then + _res="yes"; + CFLAGS="$CFLAGS -pipe" + CXXFLAGS="$CXXFLAGS -pipe" + else + _res="no" + fi + rm -f dummy-hello.c dummy-hello.s dummy-hello.S dummy-hello a.out + AC_MSG_RESULT([$_res]) +else + AC_MSG_RESULT([no]) +fi + +dnl pass -Wno-long-long to the compiler +MOZ_ARG_ENABLE_BOOL(long-long-warning, +[ --enable-long-long-warning + Warn about use of non-ANSI long long type], + _IGNORE_LONG_LONG_WARNINGS=, + _IGNORE_LONG_LONG_WARNINGS=1) + +if test "$_IGNORE_LONG_LONG_WARNINGS"; then + _SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS ${_COMPILER_PREFIX}-Wno-long-long" + AC_MSG_CHECKING([whether compiler supports -Wno-long-long]) + AC_TRY_COMPILE([], [return(0);], + [ _WARNINGS_CFLAGS="${_WARNINGS_CFLAGS} ${_COMPILER_PREFIX}-Wno-long-long" + _WARNINGS_CXXFLAGS="${_WARNINGS_CXXFLAGS} ${_COMPILER_PREFIX}-Wno-long-long" + result="yes" ], result="no") + AC_MSG_RESULT([$result]) + CFLAGS="$_SAVE_CFLAGS" +fi + +dnl Test for profiling options +dnl Under gcc 3.3, use -fprofile-arcs/-fbranch-probabilities +dnl Under gcc 3.4+, use -fprofile-generate/-fprofile-use + +_SAVE_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS -fprofile-generate" + +AC_MSG_CHECKING([whether C compiler supports -fprofile-generate]) +AC_TRY_COMPILE([], [return 0;], + [ PROFILE_GEN_CFLAGS="-fprofile-generate" + result="yes" ], result="no") +AC_MSG_RESULT([$result]) + +if test $result = "yes"; then + PROFILE_USE_CFLAGS="-fprofile-use" +else + CFLAGS="$_SAVE_CFLAGS -fprofile-arcs" + AC_MSG_CHECKING([whether C compiler supports -fprofile-arcs]) + AC_TRY_COMPILE([], [return 0;], + [ PROFILE_GEN_CFLAGS="-fprofile-arcs" + result="yes" ], result="no") + AC_MSG_RESULT([$result]) + if test $result = "yes"; then + PROFILE_USE_CFLAGS="-fbranch-probabilities" + fi +fi + +CFLAGS="$_SAVE_CFLAGS" + +AC_SUBST(PROFILE_GEN_CFLAGS) +AC_SUBST(PROFILE_USE_CFLAGS) + +AC_LANG_CPLUSPLUS + +dnl ======================================================== +dnl Test for -pedantic bustage +dnl ======================================================== +MOZ_ARG_DISABLE_BOOL(pedantic, +[ --disable-pedantic Issue all warnings demanded by strict ANSI C ], +_PEDANTIC= ) +if test "$_PEDANTIC"; then + _SAVE_CXXFLAGS=$CXXFLAGS + CXXFLAGS="$CXXFLAGS ${_WARNINGS_CXXFLAGS} ${_COMPILER_PREFIX}-pedantic" + AC_MSG_CHECKING([whether C++ compiler has -pedantic long long bug]) + AC_TRY_COMPILE([$configure_static_assert_macros], + [CONFIGURE_STATIC_ASSERT(sizeof(long long) == 8)], + result="no", result="yes" ) + AC_MSG_RESULT([$result]) + CXXFLAGS="$_SAVE_CXXFLAGS" + + case "$result" in + no) + _WARNINGS_CFLAGS="${_WARNINGS_CFLAGS} ${_COMPILER_PREFIX}-pedantic" + _WARNINGS_CXXFLAGS="${_WARNINGS_CXXFLAGS} ${_COMPILER_PREFIX}-pedantic" + ;; + yes) + AC_MSG_ERROR([Your compiler appears to have a known bug where long long is miscompiled when using -pedantic. Reconfigure using --disable-pedantic. ]) + ;; + esac +fi + +dnl ======================================================== +dnl Test for correct temporary object destruction order +dnl ======================================================== +dnl We want to make sure the compiler follows the C++ spec here as +dnl xpcom and the string classes depend on it (bug 235381). +AC_MSG_CHECKING([for correct temporary object destruction order]) +AC_TRY_RUN([ class A { + public: A(int& x) : mValue(x) {} + ~A() { mValue--; } + operator char**() { return 0; } + private: int& mValue; + }; + void func(char **arg) {} + int m=2; + void test() { + func(A(m)); + if (m==1) m = 0; + } + int main() { + test(); + return(m); + } + ], + result="yes", result="no", result="maybe") +AC_MSG_RESULT([$result]) + +if test "$result" = "no"; then + AC_MSG_ERROR([Your compiler does not follow the C++ specification for temporary object destruction order.]) +fi + +dnl ======================================================== +dnl Autoconf test for gcc 2.7.2.x (and maybe others?) so that we don't +dnl provide non-const forms of the operator== for comparing nsCOMPtrs to +dnl raw pointers in nsCOMPtr.h. (VC++ has the same bug.) +dnl ======================================================== +_SAVE_CXXFLAGS=$CXXFLAGS +CXXFLAGS="$CXXFLAGS ${_WARNINGS_CXXFLAGS}" +AC_CACHE_CHECK(for correct overload resolution with const and templates, + ac_nscap_nonconst_opeq_bug, + [AC_TRY_COMPILE([ + template <class T> + class Pointer + { + public: + T* myPtr; + }; + + template <class T, class U> + int operator==(const Pointer<T>& rhs, U* lhs) + { + return rhs.myPtr == lhs; + } + + template <class T, class U> + int operator==(const Pointer<T>& rhs, const U* lhs) + { + return rhs.myPtr == lhs; + } + ], + [ + Pointer<int> foo; + const int* bar; + return foo == bar; + ], + ac_nscap_nonconst_opeq_bug="no", + ac_nscap_nonconst_opeq_bug="yes")]) +CXXFLAGS="$_SAVE_CXXFLAGS" + +if test "$ac_nscap_nonconst_opeq_bug" = "yes" ; then + AC_DEFINE(NSCAP_DONT_PROVIDE_NONCONST_OPEQ) +fi +fi # SKIP_COMPILER_CHECKS + +dnl ======================================================== +dnl C++ rtti +dnl Should be smarter and check that the compiler does indeed have rtti +dnl ======================================================== +MOZ_ARG_ENABLE_BOOL(cpp-rtti, +[ --enable-cpp-rtti Enable C++ RTTI ], +[ _MOZ_USE_RTTI=1 ], +[ _MOZ_USE_RTTI= ]) + +if test "$_MOZ_USE_RTTI"; then + _MOZ_RTTI_FLAGS=$_MOZ_RTTI_FLAGS_ON +else + _MOZ_RTTI_FLAGS=$_MOZ_RTTI_FLAGS_OFF +fi + +dnl ======================================================== +dnl C++ exceptions (g++/egcs only - for now) +dnl Should be smarter and check that the compiler does indeed have exceptions +dnl ======================================================== +MOZ_ARG_ENABLE_BOOL(cpp-exceptions, +[ --enable-cpp-exceptions Enable C++ exceptions ], +[ _MOZ_CPP_EXCEPTIONS=1 ], +[ _MOZ_CPP_EXCEPTIONS= ]) + +if test "$_MOZ_CPP_EXCEPTIONS"; then + _MOZ_EXCEPTIONS_FLAGS=$_MOZ_EXCEPTIONS_FLAGS_ON +else + _MOZ_EXCEPTIONS_FLAGS=$_MOZ_EXCEPTIONS_FLAGS_OFF +fi + +# Irix & OSF native compilers do not like exception declarations +# when exceptions are disabled +if test -n "$MIPSPRO_CXX" -o -n "$COMPAQ_CXX" -o -n "$VACPP"; then + AC_DEFINE(CPP_THROW_NEW, []) +else + AC_DEFINE(CPP_THROW_NEW, [throw()]) +fi +AC_LANG_C + +dnl ======================================================== +dnl = +dnl = Build depencency options +dnl = +dnl ======================================================== +MOZ_ARG_HEADER(Build dependencies) + +dnl ======================================================== +dnl = Do not auto generate dependency info +dnl ======================================================== +MOZ_AUTO_DEPS=1 +MOZ_ARG_DISABLE_BOOL(auto-deps, +[ --disable-auto-deps Do not automatically generate dependency info], + MOZ_AUTO_DEPS=, + MOZ_AUTO_DEPS=1) + +if test -n "$MOZ_AUTO_DEPS"; then +dnl ======================================================== +dnl = Use mkdepend instead of $CC -MD for dependency generation +dnl ======================================================== +_cpp_md_flag= +MOZ_ARG_DISABLE_BOOL(md, +[ --disable-md Do not use compiler-based dependencies ], + [_cpp_md_flag=], + [_cpp_md_flag=1], + [dnl Default is to turn on -MD if using GNU-compatible compilers + if test "$GNU_CC" -a "$GNU_CXX" -a "$OS_ARCH" != "WINNT" -a "$OS_ARCH" != "WINCE"; then + _cpp_md_flag=1 + fi]) +if test "$_cpp_md_flag"; then + COMPILER_DEPEND=1 + if test "$OS_ARCH" = "OpenVMS"; then + _DEPEND_CFLAGS='$(subst =, ,$(filter-out %/.pp,-MM=-MD=-MF=$(MDDEPDIR)/$(*F).pp))' + else + _DEPEND_CFLAGS='$(filter-out %/.pp,-Wp,-MD,$(MDDEPDIR)/$(*F).pp)' + fi +else + COMPILER_DEPEND= + _USE_CPP_INCLUDE_FLAG= + _DEFINES_CFLAGS='$(ACDEFINES) -D_MOZILLA_CONFIG_H_ -DMOZILLA_CLIENT' + _DEFINES_CXXFLAGS='$(ACDEFINES) -D_MOZILLA_CONFIG_H_ -DMOZILLA_CLIENT' +fi +fi # MOZ_AUTO_DEPS +MDDEPDIR='.deps' +AC_SUBST(MOZ_AUTO_DEPS) +AC_SUBST(COMPILER_DEPEND) +AC_SUBST(MDDEPDIR) + + +dnl ======================================================== +dnl = +dnl = Static Build Options +dnl = +dnl ======================================================== +MOZ_ARG_HEADER(Static build options) +MOZ_ARG_DISABLE_BOOL(shared, +[ --disable-shared Disable building of internal shared libs], + BUILD_SHARED_LIBS=) + +MOZ_ARG_ENABLE_BOOL(static, +[ --enable-static Enable building of internal static libs], + BUILD_STATIC_LIBS=1 + MOZ_STATIC_COMPONENT_LIBS=1) + +if (test -z "$BUILD_SHARED_LIBS" && test -z "$BUILD_STATIC_LIBS") || + (test -n "$BUILD_SHARED_LIBS" && test -n "$BUILD_STATIC_LIBS") ; then + AC_MSG_ERROR([Only one of --enable-shared or --enable-static must be specified.]) +fi + +MOZ_ARG_ENABLE_BOOL(libxul, +[ --enable-libxul Enable building of libxul], + MOZ_ENABLE_LIBXUL=1, + MOZ_ENABLE_LIBXUL=) + +if test -n "$MOZ_ENABLE_LIBXUL" -a -n "$BUILD_STATIC_LIBS"; then + AC_MSG_ERROR([--enable-libxul is not compatible with --enable-static]) +fi + +if test -n "$MOZ_ENABLE_LIBXUL" -a -z "$MOZ_XUL_APP"; then + AC_MSG_ERROR([--enable-libxul is only compatible with toolkit XUL applications.]) +fi + +if test -n "$MOZ_ENABLE_LIBXUL"; then + XPCOM_LIBS="$LIBXUL_LIBS" + AC_DEFINE(MOZ_ENABLE_LIBXUL) +else + XPCOM_LIBS="$DYNAMIC_XPCOM_LIBS" +fi + +dnl ======================================================== +dnl = Force JS to be a static lib +dnl ======================================================== +MOZ_ARG_ENABLE_BOOL(js-static-build, +[ --enable-js-static-build Force js to be a static lib], + JS_STATIC_BUILD=1, + JS_STATIC_BUILD= ) + +AC_SUBST(JS_STATIC_BUILD) + +if test -n "$JS_STATIC_BUILD"; then + AC_DEFINE(EXPORT_JS_API) + +if test -z "$BUILD_STATIC_LIBS"; then + AC_MSG_ERROR([--enable-js-static-build is only compatible with --enable-static]) +fi + +fi + +dnl ======================================================== +dnl = +dnl = Standalone module options +dnl = +dnl ======================================================== +MOZ_ARG_HEADER(Standalone module options (Not for building Mozilla)) + +dnl ======================================================== +dnl = Only selectively build modules +dnl ======================================================== +MOZ_ARG_ENABLE_STRING(standalone-modules, +[ --enable-standalone-modules=mod1[,mod2] + Enable standalone build of specific modules], +[ BUILD_MODULES=`echo $enableval | sed 's/,/ /g'` ] ) + +dnl Disable ldap if LDAP is not building all of Mozilla +dnl and ldap isn't in the standalone list +if test "$BUILD_MODULES" != "all" && + test `echo "$BUILD_MODULES" | grep -c ldap` = 0 && + test "$enable_ldap" != "yes"; then + MOZ_LDAP_XPCOM= +fi + +dnl Check for GLib and libIDL. +dnl ======================================================== +case "$target_os" in +msvc*|mks*|cygwin*|mingw*|wince*) + SKIP_IDL_CHECK="yes" + ;; +*) + SKIP_IDL_CHECK="no" + ;; +esac + +if test -z "$COMPILE_ENVIRONMENT"; then + SKIP_IDL_CHECK="yes" +fi + +dnl = Allow users to disable libIDL checking for standalone modules +MOZ_ARG_WITHOUT_BOOL(libIDL, +[ --without-libIDL Skip check for libIDL (standalone modules only)], + SKIP_IDL_CHECK="yes") + +if test "$SKIP_IDL_CHECK" = "no" +then + _LIBIDL_FOUND= + if test "$MACOS_SDK_DIR"; then + dnl xpidl, and therefore libIDL, is only needed on the build host. + dnl Don't build it against the SDK, as that causes problems. + _MACSAVE_CFLAGS="$CFLAGS" + _MACSAVE_LIBS="$LIBS" + _MACSAVE_LDFLAGS="$LDFLAGS" + _MACSAVE_NEXT_ROOT="$NEXT_ROOT" + changequote(,) + CFLAGS=`echo $CFLAGS|sed -E -e "s%((-I|-isystem )${MACOS_SDK_DIR}/usr/(include|lib/gcc)[^ ]*)|-F${MACOS_SDK_DIR}(/System)?/Library/Frameworks[^ ]*|-nostdinc[^ ]*|-isysroot ${MACOS_SDK_DIR}%%g"` + LIBS=`echo $LIBS|sed -e "s?-L${MACOS_SDK_DIR}/usr/lib[^ ]*??g"` + LDFLAGS=`echo $LDFLAGS|sed -e "s?-Wl,-syslibroot,${MACOS_SDK_DIR}??g"` + changequote([,]) + unset NEXT_ROOT + fi + + if test "$MOZ_ENABLE_GTK2"; then + PKG_CHECK_MODULES(LIBIDL, libIDL-2.0 >= 0.8.0,_LIBIDL_FOUND=1,_LIBIDL_FOUND=) + fi + if test "$MOZ_ENABLE_GTK"; then + AM_PATH_LIBIDL($LIBIDL_VERSION,_LIBIDL_FOUND=1) + fi + dnl if no gtk/libIDL1 or gtk2/libIDL2 combination was found, fall back + dnl to either libIDL1 or libIDL2. + if test -z "$_LIBIDL_FOUND"; then + AM_PATH_LIBIDL($LIBIDL_VERSION,_LIBIDL_FOUND=1) + if test -z "$_LIBIDL_FOUND"; then + PKG_CHECK_MODULES(LIBIDL, libIDL-2.0 >= 0.8.0,_LIBIDL_FOUND=1) + fi + fi + dnl + dnl If we don't have a libIDL config program & not cross-compiling, + dnl look for orbit-config instead. + dnl + if test -z "$_LIBIDL_FOUND" && test -z "$CROSS_COMPILE"; then + AC_PATH_PROGS(ORBIT_CONFIG, $ORBIT_CONFIG orbit-config) + if test -n "$ORBIT_CONFIG"; then + AC_MSG_CHECKING([for ORBit libIDL usability]) + _ORBIT_CFLAGS=`${ORBIT_CONFIG} client --cflags` + _ORBIT_LIBS=`${ORBIT_CONFIG} client --libs` + _ORBIT_INC_PATH=`${PERL} -e '{ for $f (@ARGV) { print "$f " if ($f =~ m/^-I/); } }' -- ${_ORBIT_CFLAGS}` + _ORBIT_LIB_PATH=`${PERL} -e '{ for $f (@ARGV) { print "$f " if ($f =~ m/^-L/); } }' -- ${_ORBIT_LIBS}` + LIBIDL_CFLAGS="$_ORBIT_INC_PATH" + LIBIDL_LIBS="$_ORBIT_LIB_PATH -lIDL -lglib" + LIBIDL_CONFIG= + _SAVE_CFLAGS="$CFLAGS" + _SAVE_LIBS="$LIBS" + CFLAGS="$LIBIDL_CFLAGS $CFLAGS" + LIBS="$LIBIDL_LIBS $LIBS" + AC_TRY_RUN([ +#include <stdlib.h> +#include <libIDL/IDL.h> +int main() { + char *s; + s=strdup(IDL_get_libver_string()); + if(s==NULL) { + exit(1); + } + exit(0); +} + ], [_LIBIDL_FOUND=1 + result="yes"], + [LIBIDL_CFLAGS= + LIBIDL_LIBS= + result="no"], + [_LIBIDL_FOUND=1 + result="maybe"] ) + AC_MSG_RESULT($result) + CFLAGS="$_SAVE_CFLAGS" + LIBS="$_SAVE_LIBS" + fi + fi + if test -z "$_LIBIDL_FOUND"; then + AC_MSG_ERROR([libIDL not found. + libIDL $LIBIDL_VERSION or higher is required.]) + fi + if test "$MACOS_SDK_DIR"; then + CFLAGS="$_MACSAVE_CFLAGS" + LIBS="$_MACSAVE_LIBS" + LDFLAGS="$_MACSAVE_LDFLAGS" + if test -n "$_MACSAVE_NEXT_ROOT" ; then + export NEXT_ROOT="$_MACSAVE_NEXT_ROOT" + fi + fi +fi + +if test -n "$CROSS_COMPILE"; then + if test -z "$HOST_LIBIDL_CONFIG"; then + HOST_LIBIDL_CONFIG="$LIBIDL_CONFIG" + fi + if test -n "$HOST_LIBIDL_CONFIG" && test "$HOST_LIBIDL_CONFIG" != "no"; then + HOST_LIBIDL_CFLAGS=`${HOST_LIBIDL_CONFIG} --cflags` + HOST_LIBIDL_LIBS=`${HOST_LIBIDL_CONFIG} --libs` + else + HOST_LIBIDL_CFLAGS="$LIBIDL_CFLAGS" + HOST_LIBIDL_LIBS="$LIBIDL_LIBS" + fi +fi + +if test -z "$SKIP_PATH_CHECKS"; then +if test -z "${GLIB_CFLAGS}" || test -z "${GLIB_LIBS}" ; then + if test "$MOZ_ENABLE_GTK2"; then + PKG_CHECK_MODULES(GLIB, glib-2.0 >= 1.3.7) + else + AM_PATH_GLIB(${GLIB_VERSION}) + fi +fi +fi + +if test -z "${GLIB_GMODULE_LIBS}" -a -n "${GLIB_CONFIG}"; then + GLIB_GMODULE_LIBS=`$GLIB_CONFIG gmodule --libs` +fi + +AC_SUBST(LIBIDL_CFLAGS) +AC_SUBST(LIBIDL_LIBS) +AC_SUBST(STATIC_LIBIDL) +AC_SUBST(GLIB_CFLAGS) +AC_SUBST(GLIB_LIBS) +AC_SUBST(GLIB_GMODULE_LIBS) +AC_SUBST(HOST_LIBIDL_CONFIG) +AC_SUBST(HOST_LIBIDL_CFLAGS) +AC_SUBST(HOST_LIBIDL_LIBS) + +dnl ======================================================== +dnl Check for libart +dnl ======================================================== +if test "$MOZ_SVG_RENDERER_LIBART"; then + if test ! -f $topsrcdir/other-licenses/libart_lgpl/Makefile.in; then + AC_MSG_ERROR([You must check out the mozilla version of libart. Use +mk_add_options MOZ_CO_MODULE=mozilla/other-licenses/libart_lgpl]) + fi + + dnl libart's configure hasn't been run yet, but we know what the + dnl answer should be anyway + MOZ_LIBART_CFLAGS='-I${DIST}/include/libart_lgpl' + case "$target_os" in + msvc*|mks*|cygwin*|mingw*|wince*) + MOZ_LIBART_LIBS='$(DIST)/lib/$(LIB_PREFIX)moz_art_lgpl.$(IMPORT_LIB_SUFFIX)' + ;; + os2*) + MOZ_LIBART_LIBS='-lmoz_art -lm' + ;; + beos*) + MOZ_LIBART_LIBS='-lmoz_art_lgpl -lroot -lbe' + ;; + *) + MOZ_LIBART_LIBS='-lmoz_art_lgpl -lm' + ;; + esac + AC_FUNC_ALLOCA +fi + +AC_SUBST(MOZ_LIBART_CFLAGS) +AC_SUBST(MOZ_LIBART_LIBS) + +dnl ======================================================== +dnl Check for cairo +dnl ======================================================== +if test "$MOZ_SVG_RENDERER_CAIRO" -o "$MOZ_ENABLE_CANVAS" -o "$MOZ_ENABLE_CAIRO_GFX" ; then + MOZ_CAIRO_CFLAGS='-I$(DIST)/include/cairo' + + MOZ_TREE_CAIRO=1 + MOZ_ARG_ENABLE_BOOL(system-cairo, + [ --enable-system-cairo Use system cairo (located with pkgconfig)], + MOZ_TREE_CAIRO=, + MOZ_TREE_CAIRO=1 ) + + if test "$MOZ_TREE_CAIRO"; then + # Check for headers defining standard int types. + AC_CHECK_HEADERS(stdint.h inttypes.h sys/int_types.h) + + # For now we assume that we will have a uint64_t available through + # one of the above headers or mozstdint.h. + AC_DEFINE(HAVE_UINT64_T) + + # Define macros for cairo-features.h + if test "$MOZ_X11"; then + XLIB_SURFACE_FEATURE="#define CAIRO_HAS_XLIB_SURFACE 1" + FT_FONT_FEATURE="#define CAIRO_HAS_FT_FONT 1" + MOZ_ENABLE_CAIRO_FT=1 + fi + if test "$MOZ_WIDGET_TOOLKIT" = "mac" -o "$MOZ_WIDGET_TOOLKIT" = "cocoa"; then + QUARTZ_SURFACE_FEATURE="#define CAIRO_HAS_QUARTZ_SURFACE 1" + ATSUI_FONT_FEATURE="#define CAIRO_HAS_ATSUI_FONT 1" + fi + if test "$MOZ_WIDGET_TOOLKIT" = "windows"; then + WIN32_SURFACE_FEATURE="#define CAIRO_HAS_WIN32_SURFACE 1" + WIN32_FONT_FEATURE="#define CAIRO_HAS_WIN32_FONT 1" + fi + if test "$MOZ_WIDGET_TOOLKIT" = "os2"; then + OS2_SURFACE_FEATURE="#define CAIRO_HAS_OS2_SURFACE 1" + FT_FONT_FEATURE="#define CAIRO_HAS_FT_FONT 1" + CAIRO_FT_CFLAGS="-I${MZFTCFGFT2}/include" + CAIRO_FT_LIBS="-L${MZFTCFGFT2}/lib -lmozft -lmzfntcfg" + MOZ_ENABLE_CAIRO_FT=1 + fi + AC_SUBST(MOZ_ENABLE_CAIRO_FT) + AC_SUBST(CAIRO_FT_CFLAGS) + + AC_SUBST(PS_SURFACE_FEATURE) + AC_SUBST(PDF_SURFACE_FEATURE) + AC_SUBST(XLIB_SURFACE_FEATURE) + AC_SUBST(QUARTZ_SURFACE_FEATURE) + AC_SUBST(XCB_SURFACE_FEATURE) + AC_SUBST(WIN32_SURFACE_FEATURE) + AC_SUBST(OS2_SURFACE_FEATURE) + AC_SUBST(GLITZ_SURFACE_FEATURE) + AC_SUBST(FT_FONT_FEATURE) + AC_SUBST(WIN32_FONT_FEATURE) + AC_SUBST(ATSUI_FONT_FEATURE) + AC_SUBST(PNG_FUNCTIONS_FEATURE) + + if test "$_WIN32_MSVC"; then + MOZ_CAIRO_LIBS='$(DIST)/lib/mozcairo.lib $(DIST)/lib/mozlibpixman.lib' + else + MOZ_CAIRO_LIBS="-lmozcairo -lmozlibpixman $CAIRO_FT_LIBS" + + if test "$MOZ_X11"; then + MOZ_CAIRO_LIBS="$MOZ_CAIRO_LIBS $XLDFLAGS -lXrender $XLIBS -lfontconfig -lfreetype" + fi + if test "$MOZ_WIDGET_TOOLKIT" = "windows"; then + MOZ_CAIRO_LIBS="$MOZ_CAIRO_LIBS -lgdi32" + fi + fi + else + PKG_CHECK_MODULES(CAIRO, cairo >= $CAIRO_VERSION) + MOZ_CAIRO_CFLAGS=$CAIRO_CFLAGS + MOZ_CAIRO_LIBS=$CAIRO_LIBS + fi +fi + +AC_SUBST(MOZ_TREE_CAIRO) +AC_SUBST(MOZ_CAIRO_CFLAGS) +AC_SUBST(MOZ_CAIRO_LIBS) + +dnl ======================================================== +dnl disable xul +dnl ======================================================== +MOZ_ARG_DISABLE_BOOL(xul, +[ --disable-xul Disable XUL], + MOZ_XUL= ) +if test "$MOZ_XUL"; then + AC_DEFINE(MOZ_XUL) +else + dnl remove extensions that require XUL + MOZ_EXTENSIONS=`echo $MOZ_EXTENSIONS | sed -e 's/inspector//' -e 's/venkman//' -e 's/irc//' -e 's/tasks//'` +fi + +AC_SUBST(MOZ_XUL) + +dnl ======================================================== +dnl Python XPCOM bindings - if enabled, we must locate Python. +dnl ======================================================== +dnl +dnl Allow PYTHON to point to the Python interpreter to use. +dnl If not set, we use whatever Python we can find. Setting +dnl PYTHON will allow you to build from any Python version you nominate +dnl +dnl If future Python based extensions are added, some of this should +dnl be split out appropriately. +if test `echo "$MOZ_EXTENSIONS" | grep -c python/xpcom` -ne 0; then + dnl If PYTHON is in the environment, we use that + if test -z "$PYTHON"; then + AC_PATH_PROG(PYTHON, python, :) + fi + if test "$OS_ARCH" = "WINNT"; then + dnl Convert to cygwin style "mixed" (ie, "c:/path/file.exe") + PYTHON=`cygpath -t mixed $PYTHON` + fi + if test ! -x "$PYTHON"; then + AC_MSG_ERROR([Could not find Python - please adjust your PATH, or set PYTHON.]) + fi + MOZ_PYTHON=$PYTHON + dnl Ask Python what its version number is + MOZ_PYTHON_VER=`$PYTHON -c "import sys;print '%d%d' % sys.version_info[[0:2]]"` + MOZ_PYTHON_VER_DOTTED=`$PYTHON -c "import sys;print '%d.%d' % sys.version_info[[0:2]]"` + dnl Ask for the Python "prefix" (ie, home/source dir) + MOZ_PYTHON_PREFIX=`$PYTHON -c "import sys; print sys.prefix"` + dnl Setup the include and library directories. + if test "$OS_ARCH" = "WINNT"; then + MOZ_PYTHON_PREFIX=`cygpath -t mixed $MOZ_PYTHON_PREFIX` + dnl Source trees have "include" and "PC" for .h, and "PCbuild" for .lib + dnl Binary trees have "include" for .h, and "libs" for .lib + dnl We add 'em both - along with quotes, to handle spaces. + MOZ_PYTHON_DLL_SUFFIX=.pyd + MOZ_PYTHON_INCLUDES="\"-I$MOZ_PYTHON_PREFIX/include\" \"-I$MOZ_PYTHON_PREFIX/PC\"" + MOZ_PYTHON_LIBS="\"/libpath:$MOZ_PYTHON_PREFIX/PCBuild\" \"/libpath:$MOZ_PYTHON_PREFIX/libs\"" + else + dnl Non-Windows include and libs + MOZ_PYTHON_DLL_SUFFIX=$DLL_SUFFIX + PYTHON_INCLUDE_SRC=$MOZ_PYTHON_PREFIX/include/python$MOZ_PYTHON_VER_DOTTED + PYTHON_LIB_SRC=`$PYTHON -c 'from distutils import sysconfig; print sysconfig.get_config_var("LIBPL")'` + if test ! -f $PYTHON_INCLUDE_SRC/Python.h; then + AC_MSG_ERROR([Include directory $PYTHON_INCLUDE_SRC not found or does not contain development headers]) + fi + MOZ_PYTHON_INCLUDES="-I$PYTHON_INCLUDE_SRC" + MOZ_PYTHON_LIBS="-L$PYTHON_LIB_SRC -lpython$MOZ_PYTHON_VER_DOTTED" + fi + dnl Handle "_d" on Windows + if test "$OS_ARCH" = "WINNT" && test -n "$MOZ_DEBUG"; then + MOZ_PYTHON_DEBUG_SUFFIX="_d" + else + MOZ_PYTHON_DEBUG_SUFFIX= + fi + AC_MSG_RESULT(Building PyXPCOM using Python-$MOZ_PYTHON_VER_DOTTED from $MOZ_PYTHON_PREFIX) +fi +AC_SUBST(MOZ_PYTHON) +AC_SUBST(MOZ_PYTHON_PREFIX) +AC_SUBST(MOZ_PYTHON_INCLUDES) +AC_SUBST(MOZ_PYTHON_LIBS) +AC_SUBST(MOZ_PYTHON_VER) +AC_SUBST(MOZ_PYTHON_VER_DOTTED) +AC_SUBST(MOZ_PYTHON_DEBUG_SUFFIX) +AC_SUBST(MOZ_PYTHON_DLL_SUFFIX) + +dnl ======================================================== +dnl disable profile sharing +dnl ======================================================== +MOZ_ARG_DISABLE_BOOL(profilesharing, +[ --disable-profilesharing Disable profile sharing], + MOZ_PROFILESHARING=, + MOZ_PROFILESHARING=1 ) +if test "$MOZ_PROFILESHARING"; then + MOZ_IPCD=1 + AC_DEFINE(MOZ_PROFILESHARING) +fi + +dnl ======================================================== +dnl disable profile locking +dnl do no use this in applications that can have more than +dnl one process accessing the profile directory. +dnl ======================================================== +MOZ_ARG_DISABLE_BOOL(profilelocking, +[ --disable-profilelocking Disable profile locking], + MOZ_PROFILELOCKING=, + MOZ_PROFILELOCKING=1 ) +if test "$MOZ_PROFILELOCKING"; then + AC_DEFINE(MOZ_PROFILELOCKING) +fi + + +dnl ======================================================== +dnl necko configuration options +dnl ======================================================== + +dnl +dnl option to disable various necko protocols +dnl +MOZ_ARG_ENABLE_STRING(necko-protocols, +[ --enable-necko-protocols[={http,ftp,default,all,none}] + Enable/disable specific protocol handlers], +[ for option in `echo $enableval | sed 's/,/ /g'`; do + if test "$option" = "yes" || test "$option" = "all"; then + NECKO_PROTOCOLS="$NECKO_PROTOCOLS $NECKO_PROTOCOLS_DEFAULT" + elif test "$option" = "no" || test "$option" = "none"; then + NECKO_PROTOCOLS="" + elif test "$option" = "default"; then + NECKO_PROTOCOLS="$NECKO_PROTOCOLS $NECKO_PROTOCOLS_DEFAULT" + elif test `echo "$option" | grep -c \^-` != 0; then + option=`echo $option | sed 's/^-//'` + NECKO_PROTOCOLS=`echo "$NECKO_PROTOCOLS" | sed "s/ ${option}//"` + else + NECKO_PROTOCOLS="$NECKO_PROTOCOLS $option" + fi +done], + NECKO_PROTOCOLS="$NECKO_PROTOCOLS_DEFAULT") +dnl Remove dupes +NECKO_PROTOCOLS=`${PERL} ${srcdir}/build/unix/uniq.pl ${NECKO_PROTOCOLS}` +AC_SUBST(NECKO_PROTOCOLS) +for p in $NECKO_PROTOCOLS; do + AC_DEFINE_UNQUOTED(NECKO_PROTOCOL_$p) +done + +dnl +dnl option to disable necko's disk cache +dnl +MOZ_ARG_DISABLE_BOOL(necko-disk-cache, +[ --disable-necko-disk-cache + Disable necko disk cache], + NECKO_DISK_CACHE=, + NECKO_DISK_CACHE=1) +AC_SUBST(NECKO_DISK_CACHE) +if test "$NECKO_DISK_CACHE"; then + AC_DEFINE(NECKO_DISK_CACHE) +fi + +dnl +dnl option to minimize size of necko's i/o buffers +dnl +MOZ_ARG_ENABLE_BOOL(necko-small-buffers, +[ --enable-necko-small-buffers + Minimize size of necko's i/o buffers], + NECKO_SMALL_BUFFERS=1, + NECKO_SMALL_BUFFERS=) +AC_SUBST(NECKO_SMALL_BUFFERS) +if test "$NECKO_SMALL_BUFFERS"; then + AC_DEFINE(NECKO_SMALL_BUFFERS) +fi + +dnl +dnl option to disable cookies +dnl +MOZ_ARG_DISABLE_BOOL(cookies, +[ --disable-cookies Disable cookie support], + NECKO_COOKIES=, + NECKO_COOKIES=1) +AC_SUBST(NECKO_COOKIES) +if test "$NECKO_COOKIES"; then + AC_DEFINE(NECKO_COOKIES) +fi + +dnl NECKO_ configuration options are not global +_NON_GLOBAL_ACDEFINES="$_NON_GLOBAL_ACDEFINES NECKO_" + +dnl ======================================================== +dnl string api compatibility +dnl ======================================================== +MOZ_ARG_DISABLE_BOOL(v1-string-abi, +[ --disable-v1-string-abi Disable binary compatibility layer for strings], + MOZ_V1_STRING_ABI=, + MOZ_V1_STRING_ABI=1) +AC_SUBST(MOZ_V1_STRING_ABI) +if test "$MOZ_V1_STRING_ABI"; then + AC_DEFINE(MOZ_V1_STRING_ABI) +fi + +dnl Only build Mork if it's required +AC_SUBST(MOZ_MORK) +if test "$MOZ_MORK"; then + AC_DEFINE(MOZ_MORK) +fi + +dnl Build the lightweight Mork reader if required +AC_SUBST(MOZ_MORKREADER) +if test "$MOZ_MORKREADER"; then + AC_DEFINE(MOZ_MORKREADER) +fi + +dnl ======================================================== +if test "$MOZ_DEBUG" || test "$NS_TRACE_MALLOC"; then + MOZ_COMPONENTS_VERSION_SCRIPT_LDFLAGS= +fi + +if test "$MOZ_LDAP_XPCOM"; then + LDAP_CFLAGS='-I${DIST}/public/ldap' + if test "$OS_ARCH" = "WINNT"; then + if test -n "$GNU_CC"; then + LDAP_LIBS='-L$(DIST)/lib -lnsldap32v50 -lnsldappr32v50' + else + LDAP_LIBS='$(DIST)/lib/$(LIB_PREFIX)nsldap32v50.${IMPORT_LIB_SUFFIX} $(DIST)/lib/$(LIB_PREFIX)nsldappr32v50.${IMPORT_LIB_SUFFIX}' + fi + elif test "$VACPP"; then + LDAP_LIBS='$(DIST)/lib/$(LIB_PREFIX)ldap50.${IMPORT_LIB_SUFFIX} $(DIST)/lib/$(LIB_PREFIX)prldap50.${IMPORT_LIB_SUFFIX}' + else + LDAP_LIBS='-L${DIST}/bin -L${DIST}/lib -lldap50 -llber50 -lprldap50' + fi +fi + +if test "$COMPILE_ENVIRONMENT"; then +if test "$SUNCTL"; then + dnl older versions of glib do not seem to have gmodule which ctl needs + _SAVE_CFLAGS=$CFLAGS + CFLAGS="$CFLAGS $GLIB_CFLAGS" + AC_LANG_SAVE + AC_LANG_C + AC_TRY_COMPILE([#include <gmodule.h>], + [ int x = 1; x++; ],, + [AC_MSG_ERROR([Cannot build ctl without gmodule support in glib.])]) + AC_LANG_RESTORE + CFLAGS=$_SAVE_CFLAGS + AC_DEFINE(SUNCTL) +fi +fi # COMPILE_ENVIRONMENT + +dnl ======================================================== +dnl = +dnl = Maintainer debug option (no --enable equivalent) +dnl = +dnl ======================================================== + +AC_SUBST(AR) +AC_SUBST(AR_FLAGS) +AC_SUBST(AR_LIST) +AC_SUBST(AR_EXTRACT) +AC_SUBST(AR_DELETE) +AC_SUBST(AS) +AC_SUBST(ASFLAGS) +AC_SUBST(AS_DASH_C_FLAG) +AC_SUBST(LD) +AC_SUBST(RC) +AC_SUBST(RCFLAGS) +AC_SUBST(WINDRES) +AC_SUBST(USE_SHORT_LIBNAME) +AC_SUBST(IMPLIB) +AC_SUBST(FILTER) +AC_SUBST(BIN_FLAGS) +AC_SUBST(NS_USE_NATIVE) +AC_SUBST(MOZ_WIDGET_TOOLKIT) +AC_SUBST(MOZ_WIDGET_TOOLKIT_LDFLAGS) +AC_SUBST(WIDGET_DLL) +AC_SUBST(GFXWIN_DLL) +AC_SUBST(MOZ_GFX_TOOLKIT) +AC_SUBST(MOZ_GFX_TOOLKIT_LDFLAGS) +AC_SUBST(MOZ_UPDATE_XTERM) +AC_SUBST(MINIMO) +AC_SUBST(MOZ_MATHML) +AC_SUBST(MOZ_XTF) +AC_SUBST(MOZ_NO_INSPECTOR_APIS) +AC_SUBST(MOZ_SVG) +AC_SUBST(MOZ_SVG_FOREIGNOBJECT) +AC_SUBST(MOZ_SVG_RENDERER_GDIPLUS) +AC_SUBST(MOZ_SVG_RENDERER_LIBART) +AC_SUBST(MOZ_SVG_RENDERER_CAIRO) +AC_SUBST(TX_EXE) +AC_SUBST(MOZ_JS_LIBS) +AC_SUBST(MOZ_PSM) +AC_SUBST(BUILD_MODULES) +AC_SUBST(MOZ_DEBUG) +AC_SUBST(MOZ_DEBUG_MODULES) +AC_SUBST(MOZ_PROFILE_MODULES) +AC_SUBST(MOZ_DEBUG_ENABLE_DEFS) +AC_SUBST(MOZ_DEBUG_DISABLE_DEFS) +AC_SUBST(MOZ_DEBUG_FLAGS) +AC_SUBST(MOZ_DEBUG_LDFLAGS) +AC_SUBST(MOZ_DBGRINFO_MODULES) +AC_SUBST(MOZ_EXTENSIONS) +AC_SUBST(MOZ_IMG_DECODERS) +AC_SUBST(MOZ_IMG_ENCODERS) +AC_SUBST(MOZ_JSDEBUGGER) +AC_SUBST(MOZ_OJI) +AC_SUBST(MOZ_NO_XPCOM_OBSOLETE) +AC_SUBST(MOZ_NO_FAST_LOAD) +AC_SUBST(MOZ_PLUGINS) +AC_SUBST(ENABLE_EAZEL_PROFILER) +AC_SUBST(EAZEL_PROFILER_CFLAGS) +AC_SUBST(EAZEL_PROFILER_LIBS) +AC_SUBST(MOZ_PERF_METRICS) +AC_SUBST(GC_LEAK_DETECTOR) +AC_SUBST(MOZ_LOG_REFCNT) +AC_SUBST(MOZ_LEAKY) +AC_SUBST(MOZ_JPROF) +AC_SUBST(MOZ_XPCTOOLS) +AC_SUBST(MOZ_JSLOADER) +AC_SUBST(MOZ_USE_NATIVE_UCONV) +AC_SUBST(MOZ_INSURE) +AC_SUBST(MOZ_INSURE_DIRS) +AC_SUBST(MOZ_INSURE_EXCLUDE_DIRS) +AC_SUBST(MOZ_QUANTIFY) +AC_SUBST(MOZ_INSURIFYING) +AC_SUBST(MOZ_LDAP_XPCOM) +AC_SUBST(MOZ_LDAP_XPCOM_EXPERIMENTAL) +AC_SUBST(LDAP_CFLAGS) +AC_SUBST(LDAP_LIBS) +AC_SUBST(LIBICONV) +AC_SUBST(MOZ_PLACES) +AC_SUBST(MOZ_STORAGE) +AC_SUBST(MOZ_FEEDS) +AC_SUBST(NS_PRINTING) + +AC_SUBST(MOZ_JAVAXPCOM) +AC_SUBST(JAVA_INCLUDE_PATH) +AC_SUBST(JAVAC) +AC_SUBST(JAR) + +AC_SUBST(MOZ_PROFILESHARING) +AC_SUBST(MOZ_PROFILELOCKING) + +AC_SUBST(MOZ_IPCD) + +AC_SUBST(HAVE_XIE) +AC_SUBST(MOZ_XIE_LIBS) +AC_SUBST(MOZ_XPRINT_CFLAGS) +AC_SUBST(MOZ_XPRINT_LDFLAGS) +AC_SUBST(MOZ_ENABLE_XPRINT) +AC_SUBST(MOZ_ENABLE_POSTSCRIPT) +AC_SUBST(MOZ_XINERAMA_LIBS) +AC_SUBST(MOZ_ENABLE_XINERAMA) + +AC_SUBST(XPCOM_USE_LEA) +AC_SUBST(BUILD_SHARED_LIBS) +AC_SUBST(BUILD_STATIC_LIBS) +AC_SUBST(MOZ_STATIC_COMPONENT_LIBS) +AC_SUBST(MOZ_ENABLE_LIBXUL) +AC_SUBST(ENABLE_TESTS) +AC_SUBST(IBMBIDI) +AC_SUBST(SUNCTL) +AC_SUBST(ACCESSIBILITY) +AC_SUBST(MOZ_XPINSTALL) +AC_SUBST(MOZ_VIEW_SOURCE) +AC_SUBST(MOZ_SINGLE_PROFILE) +AC_SUBST(MOZ_XPFE_COMPONENTS) +AC_SUBST(MOZ_USER_DIR) + +AC_SUBST(ENABLE_STRIP) +AC_SUBST(USE_ELF_DYNSTR_GC) +AC_SUBST(USE_PREBINDING) +AC_SUBST(INCREMENTAL_LINKER) +AC_SUBST(MOZ_COMPONENTS_VERSION_SCRIPT_LDFLAGS) +AC_SUBST(MOZ_COMPONENT_NSPR_LIBS) +AC_SUBST(MOZ_XPCOM_OBSOLETE_LIBS) + +AC_SUBST(MOZ_FIX_LINK_PATHS) +AC_SUBST(XPCOM_LIBS) +AC_SUBST(XPCOM_FROZEN_LDOPTS) +AC_SUBST(XPCOM_GLUE_LDOPTS) +AC_SUBST(XPCOM_STANDALONE_GLUE_LDOPTS) + +AC_SUBST(USE_DEPENDENT_LIBS) + +AC_SUBST(MOZ_BUILD_ROOT) +AC_SUBST(MOZ_OS2_TOOLS) +AC_SUBST(MOZ_OS2_EMX_OBJECTFORMAT) + +AC_SUBST(MOZ_POST_DSO_LIB_COMMAND) +AC_SUBST(MOZ_POST_PROGRAM_COMMAND) +AC_SUBST(MOZ_REORDER) +AC_SUBST(MOZ_TIMELINE) +AC_SUBST(WINCE) +AC_SUBST(TARGET_DEVICE) + +AC_SUBST(MOZ_APP_NAME) +AC_SUBST(MOZ_APP_DISPLAYNAME) +AC_SUBST(MOZ_APP_VERSION) +AC_SUBST(FIREFOX_VERSION) +AC_SUBST(THUNDERBIRD_VERSION) +AC_SUBST(SUNBIRD_VERSION) +AC_SUBST(SEAMONKEY_VERSION) + +AC_SUBST(MOZ_PKG_SPECIAL) + +dnl win32 options +AC_SUBST(MOZ_PROFILE) +AC_SUBST(MOZ_DEBUG_SYMBOLS) +AC_SUBST(MOZ_COVERAGE) +AC_SUBST(MOZ_MAPINFO) +AC_SUBST(MOZ_BROWSE_INFO) +AC_SUBST(MOZ_TOOLS_DIR) +AC_SUBST(CYGWIN_WRAPPER) +AC_SUBST(AS_PERL) + +dnl Echo the CFLAGS to remove extra whitespace. +CFLAGS=`echo \ + $_WARNINGS_CFLAGS \ + $CFLAGS` + +CXXFLAGS=`echo \ + $_MOZ_RTTI_FLAGS \ + $_MOZ_EXCEPTIONS_FLAGS \ + $_WARNINGS_CXXFLAGS \ + $CXXFLAGS` + +COMPILE_CFLAGS=`echo \ + $_DEFINES_CFLAGS \ + $_DEPEND_CFLAGS \ + $COMPILE_CFLAGS` + +COMPILE_CXXFLAGS=`echo \ + $_DEFINES_CXXFLAGS \ + $_DEPEND_CFLAGS \ + $COMPILE_CXXFLAGS` + +AC_SUBST(SYSTEM_MAKEDEPEND) +AC_SUBST(SYSTEM_JPEG) +AC_SUBST(SYSTEM_PNG) +AC_SUBST(SYSTEM_ZLIB) + +AC_SUBST(JPEG_CFLAGS) +AC_SUBST(JPEG_LIBS) +AC_SUBST(ZLIB_CFLAGS) +AC_SUBST(ZLIB_LIBS) +AC_SUBST(PNG_CFLAGS) +AC_SUBST(PNG_LIBS) + +AC_SUBST(MOZ_JPEG_CFLAGS) +AC_SUBST(MOZ_JPEG_LIBS) +AC_SUBST(MOZ_ZLIB_CFLAGS) +AC_SUBST(MOZ_ZLIB_LIBS) +AC_SUBST(MOZ_PNG_CFLAGS) +AC_SUBST(MOZ_PNG_LIBS) + +AC_SUBST(NSPR_CFLAGS) +AC_SUBST(NSPR_LIBS) +AC_SUBST(MOZ_NATIVE_NSPR) + +AC_SUBST(NSS_CFLAGS) +AC_SUBST(NSS_LIBS) +AC_SUBST(NSS_DEP_LIBS) +AC_SUBST(MOZ_NATIVE_NSS) + +AC_SUBST(CFLAGS) +AC_SUBST(CXXFLAGS) +AC_SUBST(CPPFLAGS) +AC_SUBST(COMPILE_CFLAGS) +AC_SUBST(COMPILE_CXXFLAGS) +AC_SUBST(LDFLAGS) +AC_SUBST(LIBS) +AC_SUBST(CROSS_COMPILE) + +AC_SUBST(HOST_CC) +AC_SUBST(HOST_CXX) +AC_SUBST(HOST_CFLAGS) +AC_SUBST(HOST_CXXFLAGS) +AC_SUBST(HOST_OPTIMIZE_FLAGS) +AC_SUBST(HOST_AR) +AC_SUBST(HOST_AR_FLAGS) +AC_SUBST(HOST_LD) +AC_SUBST(HOST_RANLIB) +AC_SUBST(HOST_NSPR_MDCPUCFG) +AC_SUBST(HOST_BIN_SUFFIX) +AC_SUBST(HOST_OS_ARCH) + +AC_SUBST(TARGET_CPU) +AC_SUBST(TARGET_VENDOR) +AC_SUBST(TARGET_OS) +AC_SUBST(TARGET_NSPR_MDCPUCFG) +AC_SUBST(TARGET_MD_ARCH) +AC_SUBST(TARGET_XPCOM_ABI) +AC_SUBST(OS_TARGET) +AC_SUBST(OS_ARCH) +AC_SUBST(OS_RELEASE) +AC_SUBST(OS_TEST) + +AC_SUBST(MOZ_DISABLE_JAR_PACKAGING) +AC_SUBST(MOZ_CHROME_FILE_FORMAT) + +AC_SUBST(WRAP_MALLOC_CFLAGS) +AC_SUBST(WRAP_MALLOC_LIB) +AC_SUBST(MKSHLIB) +AC_SUBST(MKCSHLIB) +AC_SUBST(MKSHLIB_FORCE_ALL) +AC_SUBST(MKSHLIB_UNFORCE_ALL) +AC_SUBST(DSO_CFLAGS) +AC_SUBST(DSO_PIC_CFLAGS) +AC_SUBST(DSO_LDOPTS) +AC_SUBST(LIB_PREFIX) +AC_SUBST(DLL_PREFIX) +AC_SUBST(DLL_SUFFIX) +AC_DEFINE_UNQUOTED(MOZ_DLL_SUFFIX, "$DLL_SUFFIX") +AC_SUBST(LIB_SUFFIX) +AC_SUBST(OBJ_SUFFIX) +AC_SUBST(BIN_SUFFIX) +AC_SUBST(ASM_SUFFIX) +AC_SUBST(IMPORT_LIB_SUFFIX) +AC_SUBST(USE_N32) +AC_SUBST(CC_VERSION) +AC_SUBST(CXX_VERSION) + +if test "$USING_HCC"; then + CC='${topsrcdir}/build/hcc' + CC="$CC '$_OLDCC'" + CXX='${topsrcdir}/build/hcpp' + CXX="$CXX '$_OLDCXX'" + AC_SUBST(CC) + AC_SUBST(CXX) +fi + +dnl Check for missing components +if test "$COMPILE_ENVIRONMENT"; then +if test "$MOZ_X11"; then + dnl ==================================================== + dnl = Check if X headers exist + dnl ==================================================== + _SAVE_CFLAGS=$CFLAGS + CFLAGS="$CFLAGS $XCFLAGS" + AC_TRY_COMPILE([ + #include <stdio.h> + #include <X11/Xlib.h> + ], + [ + Display *dpy = 0; + if ((dpy = XOpenDisplay(NULL)) == NULL) { + fprintf(stderr, ": can't open %s\n", XDisplayName(NULL)); + exit(1); + } + ], [], + [ AC_MSG_ERROR([Could not compile basic X program.]) ]) + CFLAGS="$_SAVE_CFLAGS" + + if test ! -z "$MISSING_X"; then + AC_MSG_ERROR([ Could not find the following X libraries: $MISSING_X ]); + fi + +fi # MOZ_X11 +fi # COMPILE_ENVIRONMENT + +dnl Set various defines and substitutions +dnl ======================================================== + +if test "$OS_ARCH" = "OS2" -a "$VACPP" = "yes"; then + LIBS='so32dll.lib tcp32dll.lib' +elif test "$OS_ARCH" = "BeOS"; then + AC_DEFINE(XP_BEOS) + MOZ_MOVEMAIL=1 +elif test "$OS_ARCH" = "Darwin"; then + AC_DEFINE(XP_UNIX) + AC_DEFINE(UNIX_ASYNC_DNS) + MOZ_MOVEMAIL=1 +elif test "$OS_ARCH" = "OpenVMS"; then + AC_DEFINE(XP_UNIX) +elif test "$OS_ARCH" != "WINNT" -a "$OS_ARCH" != "OS2" -a "$OS_ARCH" != "WINCE"; then + AC_DEFINE(XP_UNIX) + AC_DEFINE(UNIX_ASYNC_DNS) + MOZ_MOVEMAIL=1 +fi +AC_SUBST(MOZ_MOVEMAIL) + +AC_DEFINE(JS_THREADSAFE) + +if test "$MOZ_DEBUG"; then + AC_DEFINE(MOZ_REFLOW_PERF) + AC_DEFINE(MOZ_REFLOW_PERF_DSP) +fi + +if test "$ACCESSIBILITY" -a "$MOZ_ENABLE_GTK2" ; then + AC_DEFINE(MOZ_ACCESSIBILITY_ATK) +fi + +# Define MOZILLA_1_8_BRANCH on the branch for code that is kept in sync +# between branch and trunk. +AC_DEFINE(MOZILLA_1_8_BRANCH) +MOZILLA_1_8_BRANCH=1 +AC_SUBST(MOZILLA_1_8_BRANCH) + +# Used for LD_LIBRARY_PATH of run_viewer target +LIBS_PATH= +for lib_arg in $NSPR_LIBS $TK_LIBS; do + case $lib_arg in + -L* ) LIBS_PATH="${LIBS_PATH:+$LIBS_PATH:}"`expr $lib_arg : "-L\(.*\)"` ;; + * ) ;; + esac +done +AC_SUBST(LIBS_PATH) + +dnl ======================================================== +dnl Use cygwin wrapper for win32 builds, except MSYS/MinGW +dnl ======================================================== +case "$host_os" in +mingw*) + WIN_TOP_SRC=`cd $srcdir; pwd -W` + ;; +cygwin*|msvc*|mks*) + HOST_CC="\$(CYGWIN_WRAPPER) $HOST_CC" + HOST_CXX="\$(CYGWIN_WRAPPER) $HOST_CXX" + CC="\$(CYGWIN_WRAPPER) $CC" + CXX="\$(CYGWIN_WRAPPER) $CXX" + CPP="\$(CYGWIN_WRAPPER) $CPP" + LD="\$(CYGWIN_WRAPPER) $LD" + AS="\$(CYGWIN_WRAPPER) $AS" + RC="\$(CYGWIN_WRAPPER) $RC" + MIDL="\$(CYGWIN_WRAPPER) $MIDL" + CYGDRIVE_MOUNT=`mount -p | awk '{ if (/^\//) { print $1; exit } }'` + WIN_TOP_SRC=`cygpath -a -w $srcdir | sed -e 's|\\\\|/|g'` + ;; +esac + +AC_SUBST(CYGDRIVE_MOUNT) +AC_SUBST(WIN_TOP_SRC) + +AC_SUBST(MOZILLA_VERSION) + +. ${srcdir}/config/chrome-versions.sh +AC_SUBST(MOZILLA_LOCALE_VERSION) +AC_SUBST(MOZILLA_REGION_VERSION) +AC_DEFINE_UNQUOTED(MOZILLA_LOCALE_VERSION,"$MOZILLA_LOCALE_VERSION") +AC_DEFINE_UNQUOTED(MOZILLA_REGION_VERSION,"$MOZILLA_REGION_VERSION") +AC_DEFINE_UNQUOTED(MOZILLA_SKIN_VERSION,"$MOZILLA_SKIN_VERSION") + +AC_SUBST(ac_configure_args) + +dnl Spit out some output +dnl ======================================================== + +dnl The following defines are used by xpcom +_NON_GLOBAL_ACDEFINES="$_NON_GLOBAL_ACDEFINES +CPP_THROW_NEW +HAVE_CPP_2BYTE_WCHAR_T +HAVE_CPP_ACCESS_CHANGING_USING +HAVE_CPP_AMBIGUITY_RESOLVING_USING +HAVE_CPP_BOOL +HAVE_CPP_DYNAMIC_CAST_TO_VOID_PTR +HAVE_CPP_EXPLICIT +HAVE_CPP_MODERN_SPECIALIZE_TEMPLATE_SYNTAX +HAVE_CPP_NAMESPACE_STD +HAVE_CPP_NEW_CASTS +HAVE_CPP_PARTIAL_SPECIALIZATION +HAVE_CPP_TROUBLE_COMPARING_TO_ZERO +HAVE_CPP_TYPENAME +HAVE_CPP_UNAMBIGUOUS_STD_NOTEQUAL +HAVE_STATVFS +NEED_CPP_UNUSED_IMPLEMENTATIONS +NEW_H +HAVE_GETPAGESIZE +HAVE_ICONV +HAVE_ICONV_WITH_CONST_INPUT +HAVE_MBRTOWC +HAVE_SYS_MOUNT_H +HAVE_SYS_VFS_H +HAVE_WCRTOMB +MOZ_V1_STRING_ABI +" + +AC_CONFIG_HEADER( +gfx/gfx-config.h +netwerk/necko-config.h +xpcom/xpcom-config.h +xpcom/xpcom-private.h +) + +# Save the defines header file before autoconf removes it. +# (Do not add AC_DEFINE calls after this line.) + _CONFIG_TMP=confdefs-tmp.h + _CONFIG_DEFS_H=mozilla-config.h + + cat > $_CONFIG_TMP <<\EOF +/* List of defines generated by configure. Included with preprocessor flag, + * -include, to avoid long list of -D defines on the compile command-line. + * Do not edit. + */ + +#ifndef _MOZILLA_CONFIG_H_ +#define _MOZILLA_CONFIG_H_ +EOF + +_EGREP_PATTERN='^#define (' +if test -n "$_NON_GLOBAL_ACDEFINES"; then + for f in $_NON_GLOBAL_ACDEFINES; do + _EGREP_PATTERN="${_EGREP_PATTERN}$f|" + done +fi +_EGREP_PATTERN="${_EGREP_PATTERN}dummy_never_defined)" + + sort confdefs.h | egrep -v "$_EGREP_PATTERN" >> $_CONFIG_TMP + + cat >> $_CONFIG_TMP <<\EOF + +#endif /* _MOZILLA_CONFIG_H_ */ + +EOF + + # Only write mozilla-config.h when something changes (or it doesn't exist) + if cmp -s $_CONFIG_TMP $_CONFIG_DEFS_H; then + rm $_CONFIG_TMP + else + AC_MSG_RESULT("creating $_CONFIG_DEFS_H") + mv -f $_CONFIG_TMP $_CONFIG_DEFS_H + + echo ==== $_CONFIG_DEFS_H ================================= + cat $_CONFIG_DEFS_H + fi + +dnl Probably shouldn't call this manually but we always want the output of DEFS +rm -f confdefs.h.save +mv confdefs.h confdefs.h.save +egrep -v "$_EGREP_PATTERN" confdefs.h.save > confdefs.h +AC_OUTPUT_MAKE_DEFS() +MOZ_DEFINES=$DEFS +AC_SUBST(MOZ_DEFINES) +rm -f confdefs.h +mv confdefs.h.save confdefs.h + +dnl Load the list of Makefiles to generate. +dnl To add new Makefiles, edit allmakefiles.sh. +dnl allmakefiles.sh sets the variable, MAKEFILES. +. ${srcdir}/allmakefiles.sh +dnl +dnl Run a perl script to quickly create the makefiles. +dnl If it succeeds, it outputs a shell command to set CONFIG_FILES +dnl for the files it cannot handle correctly. This way, config.status +dnl will handle these files. +dnl If it fails, nothing is set and config.status will run as usual. +dnl +dnl This does not change the $MAKEFILES variable. +dnl +dnl OpenVMS gets a line overflow on the long eval command, so use a temp file. +dnl +if test -z "${AS_PERL}"; then +echo $MAKEFILES | ${PERL} $srcdir/build/autoconf/acoutput-fast.pl > conftest.sh +else +echo $MAKEFILES | ${PERL} $srcdir/build/autoconf/acoutput-fast.pl -nowrap --cygwin-srcdir=$srcdir > conftest.sh +fi +. ./conftest.sh +rm conftest.sh + +echo $MAKEFILES > unallmakefiles + +AC_OUTPUT($MAKEFILES) + +dnl ======================================================== +dnl = Setup a nice relatively clean build environment for +dnl = sub-configures. +dnl ======================================================== +CC="$_SUBDIR_CC" +CXX="$_SUBDIR_CXX" +CFLAGS="$_SUBDIR_CFLAGS" +CPPFLAGS="$_SUBDIR_CPPFLAGS" +CXXFLAGS="$_SUBDIR_CXXFLAGS" +LDFLAGS="$_SUBDIR_LDFLAGS" +HOST_CC="$_SUBDIR_HOST_CC" +HOST_CFLAGS="$_SUBDIR_HOST_CFLAGS" +HOST_LDFLAGS="$_SUBDIR_HOST_LDFLAGS" +RC= + +unset MAKEFILES +unset CONFIG_FILES + +if test "$COMPILE_ENVIRONMENT"; then +if test -z "$MOZ_NATIVE_NSPR" || test "$MOZ_LDAP_XPCOM"; then + ac_configure_args="$_SUBDIR_CONFIG_ARGS --with-dist-prefix=$MOZ_BUILD_ROOT/dist --with-mozilla" + if test -z "$MOZ_DEBUG"; then + ac_configure_args="$ac_configure_args --disable-debug" + fi + if test "$MOZ_OPTIMIZE" = "1"; then + ac_configure_args="$ac_configure_args --enable-optimize" + fi + if test "$OS_ARCH" = "WINNT" && test "$NS_TRACE_MALLOC"; then + ac_configure_args="$ac_configure_args --enable-debug --disable-optimize" + fi + if test -n "$HAVE_64BIT_OS"; then + ac_configure_args="$ac_configure_args --enable-64bit" + fi + AC_OUTPUT_SUBDIRS(nsprpub) + ac_configure_args="$_SUBDIR_CONFIG_ARGS" +fi + +if test -z "$MOZ_NATIVE_NSPR"; then + # Hack to deal with the fact that we use NSPR_CFLAGS everywhere + AC_MSG_WARN([Recreating autoconf.mk with updated nspr-config output]) + if test ! "$VACPP" && test "$OS_ARCH" != "WINNT" && test "$OS_ARCH" != "WINCE"; then + _libs=`./nsprpub/config/nspr-config --prefix=$\(DIST\) --exec-prefix=$\(DIST\) --libdir=$\(DIST\)/lib --libs` + $PERL -pi.bak -e "s '^NSPR_LIBS\\s*=.*'NSPR_LIBS = $_libs'" config/autoconf.mk + fi + if test "$OS_ARCH" != "WINNT" && test "$OS_ARCH" != "WINCE" ; then + _cflags=`./nsprpub/config/nspr-config --prefix=$\(DIST\) --exec-prefix=$\(DIST\) --includedir=$\(DIST\)/include/nspr --cflags` + $PERL -pi.bak -e "s '^NSPR_CFLAGS\\s*=.*'NSPR_CFLAGS = $_cflags'" config/autoconf.mk + fi + rm -f config/autoconf.mk.bak +fi + +# if we're building the LDAP XPCOM component, we need to build +# the c-sdk first. +# +if test "$MOZ_LDAP_XPCOM"; then + + # these subdirs may not yet have been created in the build tree. + # don't use the "-p" switch to mkdir, since not all platforms have it + # + if test ! -d "directory"; then + mkdir "directory" + fi + if test ! -d "directory/c-sdk"; then + mkdir "directory/c-sdk" + fi + if test ! -d "directory/c-sdk/ldap"; then + mkdir "directory/c-sdk/ldap" + fi + + ac_configure_args="$_SUBDIR_CONFIG_ARGS --prefix=$MOZ_BUILD_ROOT/dist --with-dist-prefix=$MOZ_BUILD_ROOT/dist --without-nss --with-mozilla" + if test -z "$MOZ_DEBUG"; then + ac_configure_args="$ac_configure_args --disable-debug" + fi + if test "$MOZ_OPTIMIZE" = "1"; then + ac_configure_args="$ac_configure_args --enable-optimize" + fi + if test -n "$HAVE_64BIT_OS"; then + ac_configure_args="$ac_configure_args --enable-64bit" + fi + AC_OUTPUT_SUBDIRS(directory/c-sdk) + ac_configure_args="$_SUBDIR_CONFIG_ARGS" +fi +fi # COMPILE_ENVIRONMENT diff --git a/mozilla/extensions/pref/system-pref/src/Makefile.in b/mozilla/extensions/pref/system-pref/src/Makefile.in index 6648980..1151949 100644 --- a/mozilla/extensions/pref/system-pref/src/Makefile.in +++ b/mozilla/extensions/pref/system-pref/src/Makefile.in @@ -47,14 +47,13 @@ VPATH = @srcdir@ include $(DEPTH)/config/autoconf.mk MODULE = system-pref -LIBRARY_NAME = system-pref_s +LIBRARY_NAME = system-pref ifneq ($(OS_ARCH),WINNT) SHORT_LIBNAME = syspref endif -# We want to force the creation of a static lib. -FORCE_STATIC_LIB = 1 MOZILLA_INTERNAL_API = 1 +GRE_MODULE = 1 REQUIRES = xpcom \ string \ @@ -62,27 +61,25 @@ REQUIRES = xpcom \ pref \ $(NULL) -ifdef MOZ_ENABLE_GTK2 +ifdef MOZ_ENABLE_GCONF DIRS = gconf endif -EXTRA_DSO_LDOPTS = \ - -L$(DIST)/bin \ - $(MOZ_COMPONENT_LIBS) \ - $(NULL) - CPPSRCS = \ nsSystemPref.cpp \ + nsSystemPrefFactory.cpp \ $(NULL) +EXTRA_DSO_LDOPTS = \ + $(MOZ_COMPONENT_LIBS) \ + $(NULL) + EXPORTS = \ - nsSystemPrefLog.h \ + nsISystemPrefService.h \ $(NULL) -include $(topsrcdir)/config/rules.mk +EXPORT_LIBRARY = 1 +IS_COMPONENT = 1 +MODULE_NAME = nsSystemPrefModule -ifdef MOZ_ENABLE_GTK2 -INCLUDES += \ - -I$(srcdir)/gconf \ - $(NULL) -endif +include $(topsrcdir)/config/rules.mk diff --git a/mozilla/extensions/pref/system-pref/src/gconf/Makefile.in b/mozilla/extensions/pref/system-pref/src/gconf/Makefile.in index 4b2317f..fe834a5 100644 --- a/mozilla/extensions/pref/system-pref/src/gconf/Makefile.in +++ b/mozilla/extensions/pref/system-pref/src/gconf/Makefile.in @@ -46,44 +46,36 @@ VPATH = @srcdir@ include $(DEPTH)/config/autoconf.mk -MODULE = system-pref -LIBRARY_NAME = system-pref +MODULE = system-pref-gconf +LIBRARY_NAME = system-pref-gconf GRE_MODULE = 1 MOZILLA_INTERNAL_API = 1 +PACKAGE_FILE = gconf.pkg + REQUIRES = pref \ + system-pref \ string \ xpcom \ embedcomponents \ + necko \ $(NULL) CPPSRCS = \ nsSystemPrefService.cpp \ - nsSystemPrefFactory.cpp \ $(NULL) -SHARED_LIBRARY_LIBS = $(DIST)/lib/libsystem-pref_s.a - EXTRA_DSO_LDOPTS = \ - -L$(DIST)/bin \ $(MOZ_COMPONENT_LIBS) \ - $(MOZ_GTK2_LIBS) \ + $(MOZ_GTK2_LIBS) \ + $(MOZ_GCONF_LIBS) \ $(NULL) -EXPORT_LIBRARY = 1 +#EXPORT_LIBRARY = 1 IS_COMPONENT = 1 -MODULE_NAME = nsSystemPrefModule - -EXPORTS = \ - nsSystemPrefService.h \ - $(NULL) +FORCE_SHARED_LIB = 1 include $(topsrcdir)/config/rules.mk -CFLAGS += $(MOZ_GTK2_CFLAGS) -CXXFLAGS += $(MOZ_GTK2_CFLAGS) - -LOCAL_INCLUDES = -I$(srcdir)/.. - -export:: - $(INSTALL) $(srcdir)/../nsSystemPrefFactory.cpp . +CFLAGS += $(MOZ_GTK2_CFLAGS) $(MOZ_GCONF_CFLAGS) +CXXFLAGS += $(MOZ_GTK2_CFLAGS) $(MOZ_GCONF_CFLAGS) diff --git a/mozilla/extensions/pref/system-pref/src/gconf/nsSystemPrefService.cpp b/mozilla/extensions/pref/system-pref/src/gconf/nsSystemPrefService.cpp index efac6dd..2c7f463 100644 --- a/mozilla/extensions/pref/system-pref/src/gconf/nsSystemPrefService.cpp +++ b/mozilla/extensions/pref/system-pref/src/gconf/nsSystemPrefService.cpp @@ -23,7 +23,7 @@ * * Original Author: Bolian Yin (bolian.yin@sun.com) * - * Contributor(s): + * Contributor(s): Robert O'Callahan/Novell (rocallahan@novell.com) * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or @@ -41,6 +41,7 @@ #include <glib.h> #include <glib-object.h> +#include <gconf/gconf-client.h> #include "plstr.h" #include "nsCOMPtr.h" @@ -48,837 +49,1260 @@ #include "nsIServiceManager.h" #include "nsIObserver.h" #include "nsWeakReference.h" - +#include "nsIPrefBranch2.h" +#include "nsISystemPrefService.h" +#include "nsDataHashtable.h" +#include "nsHashKeys.h" +#include "nsICategoryManager.h" +#include "nsIGenericFactory.h" #include "nsString.h" -#include "nsSystemPrefLog.h" -#include "nsSystemPrefService.h" - -/************************************************************************* - * The strange thing here is that we load the gconf library manually and - * search the function pointers we need. If that process fails, no gconf - * support is available in mozilla. The aim is to make mozilla independent - * on gconf, in both compile time and run time. - ************************************************************************/ - -//gconf types -extern "C" { - - typedef enum { - GCONF_VALUE_INVALID, - GCONF_VALUE_STRING, - GCONF_VALUE_INT, - GCONF_VALUE_FLOAT, - GCONF_VALUE_BOOL, - GCONF_VALUE_SCHEMA, - - GCONF_VALUE_LIST, - GCONF_VALUE_PAIR - - }GConfValueType; - - typedef struct { - GConfValueType type; - }GConfValue; - - typedef void * (*GConfClientGetDefaultType) (void); - typedef PRBool (*GConfClientGetBoolType) (void *client, const gchar *key, - GError **err); - typedef gchar* (*GConfClientGetStringType) (void *client, const gchar *key, - GError **err); - typedef PRInt32 (*GConfClientGetIntType) (void *client, const gchar *key, - GError **err); - typedef void (*GConfClientNotifyFuncType) (void* client, guint cnxn_id, - void *entry, - gpointer user_data); - typedef guint (*GConfClientNotifyAddType) (void* client, - const gchar* namespace_section, - GConfClientNotifyFuncType func, - gpointer user_data, - GFreeFunc destroy_notify, - GError** err); - typedef void (*GConfClientNotifyRemoveType) (void *client, - guint cnxn); - typedef void (*GConfClientAddDirType) (void *client, - const gchar *dir, - guint8 preload, - GError **err); - typedef void (*GConfClientRemoveDirType) (void *client, - const gchar *dir, - GError **err); - - typedef const char* (*GConfEntryGetKeyType) (const void *entry); - typedef GConfValue* (*GConfEntryGetValueType) (const void *entry); - - typedef const char* (*GConfValueGetStringType) (const GConfValue *value); - typedef PRInt32 (*GConfValueGetIntType) (const GConfValue *value); - typedef PRBool (*GConfValueGetBoolType) (const GConfValue *value); +#include "nsIPermissionManager.h" - - static void gconf_key_listener (void* client, guint cnxn_id, - void *entry, gpointer user_data); -} +#define NS_SYSTEMPREF_SERVICE_CID \ + { /* {3724e748-b088-4bf8-9298-aad426b66293} */ \ + 0x3724e748, \ + 0xb088, \ + 0x4bf8, \ + { 0x92, 0x98, 0xaa, 0xd4, 0x26, 0xb6, 0x62, 0x93 } \ + } -struct GConfCallbackData -{ - GConfProxy *proxy; - void * userData; - PRUint32 atom; - PRUint32 notifyId; +#define NS_SYSTEMPREF_SERVICE_CLASSNAME "System Preferences Platform Service" + +/** + * We can link directly to the gconf library. If it's not available, + * this component just won't load and no system prefs will be offered. + */ + +#define NUM_ELEM(a) (sizeof(a)/sizeof(a[0])) + +class nsSystemPrefService; + +/** + * List the preferences that have a simple mapping between Moz and gconf. + * These preferences have the same meaning and their values are + * automatically converted. + */ +struct SimplePrefMapping { + const char *mozPrefName; + const char *gconfPrefName; + /** + * If this is PR_FALSE, then we never allow Mozilla to change + * this setting. The Mozilla pref will always be locked. + * If this is PR_TRUE then Mozilla will be allowed to change + * the setting --- but only if it is writable in gconf. + */ + PRBool allowWritesFromMozilla; +}; +typedef nsresult (* ComplexGConfPrefChanged)(nsSystemPrefService* aPrefService, + GConfClient* aClient); +typedef nsresult (* ComplexMozPrefChanged)(nsSystemPrefService* aPrefService, + GConfClient* aClient); +struct ComplexGConfPrefMapping { + const char* gconfPrefName; + ComplexGConfPrefChanged callback; +}; + +struct ComplexMozPrefMapping { + const char* mozPrefName; + ComplexMozPrefChanged callback; }; -////////////////////////////////////////////////////////////////////// -// GConPrxoy is a thin wrapper for easy use of gconf funcs. It loads the -// gconf library and initializes the func pointers for later use. -////////////////////////////////////////////////////////////////////// -class GConfProxy + +class nsSystemPrefService : public nsISystemPrefService { public: - GConfProxy(nsSystemPrefService* aSysPrefService); - ~GConfProxy(); - PRBool Init(); + NS_DECL_ISUPPORTS + + nsresult Init(); - nsresult GetBoolPref(const char *aMozKey, PRBool *retval); - nsresult GetCharPref(const char *aMozKey, char **retval); - nsresult GetIntPref(const char *aMozKey, PRInt32 *retval); + virtual nsresult LoadSystemPreferences(nsISystemPref* aPrefs); + virtual nsresult NotifyMozillaPrefChanged(const char* aPrefName); + virtual nsresult NotifyUnloadSystemPreferences(); - nsresult NotifyAdd (PRUint32 aAtom, void *aUserData); - nsresult NotifyRemove (PRUint32 aAtom, const void *aUserData); + nsSystemPrefService(); + virtual ~nsSystemPrefService(); - nsresult GetAtomForMozKey(const char *aMozKey, PRUint32 *aAtom) { - return GetAtom(aMozKey, 0, aAtom); + nsISystemPref* GetPrefs() { return mPref; } + SimplePrefMapping* GetSimpleCallbackData(PRUint32 aKey) { + SimplePrefMapping* result = nsnull; + mGConfSimpleCallbacks.Get(aKey, &result); + return result; } - const char *GetMozKey(PRUint32 aAtom) { - return GetKey(aAtom, 0); + ComplexGConfPrefMapping* GetComplexCallbackData(PRUint32 aKey) { + ComplexGConfPrefMapping* result = nsnull; + mGConfComplexCallbacks.Get(aKey, &result); + return result; } - void OnNotify(void *aClient, void * aEntry, PRUint32 aNotifyId, - GConfCallbackData *aData); - private: - void *mGConfClient; - PRLibrary *mGConfLib; - PRBool mInitialized; - nsSystemPrefService *mSysPrefService; - - //listeners - nsAutoVoidArray *mObservers; - - void InitFuncPtrs(); - //gconf public func ptrs - - //gconf client funcs - GConfClientGetDefaultType GConfClientGetDefault; - GConfClientGetBoolType GConfClientGetBool; - GConfClientGetStringType GConfClientGetString; - GConfClientGetIntType GConfClientGetInt; - GConfClientNotifyAddType GConfClientNotifyAdd; - GConfClientNotifyRemoveType GConfClientNotifyRemove; - GConfClientAddDirType GConfClientAddDir; - GConfClientRemoveDirType GConfClientRemoveDir; - - //gconf entry funcs - GConfEntryGetValueType GConfEntryGetValue; - GConfEntryGetKeyType GConfEntryGetKey; - - //gconf value funcs - GConfValueGetBoolType GConfValueGetBool; - GConfValueGetStringType GConfValueGetString; - GConfValueGetIntType GConfValueGetInt; - - //pref name translating stuff - nsresult GetAtom(const char *aKey, PRUint8 aNameType, PRUint32 *aAtom); - nsresult GetAtomForGConfKey(const char *aGConfKey, PRUint32 *aAtom) \ - {return GetAtom(aGConfKey, 1, aAtom);} - const char *GetKey(PRUint32 aAtom, PRUint8 aNameType); - const char *GetGConfKey(PRUint32 aAtom) \ - {return GetKey(aAtom, 1); } - inline const char *MozKey2GConfKey(const char *aMozKey); - - //const strings - static const char sPrefGConfKey[]; - static const char sDefaultLibName1[]; - static const char sDefaultLibName2[]; -}; - -struct SysPrefCallbackData { - nsISupports *observer; - PRBool bIsWeakRef; - PRUint32 prefAtom; + nsISystemPref* mPref; + nsDataHashtable<nsUint32HashKey, SimplePrefMapping*> mGConfSimpleCallbacks; + nsDataHashtable<nsUint32HashKey, ComplexGConfPrefMapping*> mGConfComplexCallbacks; + // This is set to PR_FALSE temporarily to stop listening to gconf + // change notifications (while we change gconf values) + PRPackedBool mListenToGConf; }; -PRBool PR_CALLBACK -sysPrefDeleteObserver(void *aElement, void *aData) { - SysPrefCallbackData *pElement = - NS_STATIC_CAST(SysPrefCallbackData *, aElement); - NS_RELEASE(pElement->observer); - nsMemory::Free(pElement); - return PR_TRUE; -} - -NS_IMPL_ISUPPORTS2(nsSystemPrefService, nsIPrefBranch, nsIPrefBranch2) - -/* public */ nsSystemPrefService::nsSystemPrefService() - :mInitialized(PR_FALSE), - mGConf(nsnull), - mObservers(nsnull) + : mPref(nsnull), mListenToGConf(PR_TRUE) { + mGConfSimpleCallbacks.Init(); + mGConfComplexCallbacks.Init(); } nsSystemPrefService::~nsSystemPrefService() { - mInitialized = PR_FALSE; - - if (mGConf) - delete mGConf; - if (mObservers) { - (void)mObservers->EnumerateForwards(sysPrefDeleteObserver, nsnull); - delete mObservers; - } + NotifyUnloadSystemPreferences(); } nsresult nsSystemPrefService::Init() { - if (!gSysPrefLog) { - gSysPrefLog = PR_NewLogModule("Syspref"); - if (!gSysPrefLog) return NS_ERROR_OUT_OF_MEMORY; - } - - SYSPREF_LOG(("Init SystemPref Service\n")); - if (mInitialized) - return NS_ERROR_FAILURE; - - if (!mGConf) { - mGConf = new GConfProxy(this); - if (!mGConf->Init()) { - delete mGConf; - mGConf = nsnull; - return NS_ERROR_FAILURE; - } - } - - mInitialized = PR_TRUE; return NS_OK; } -/* readonly attribute string root; */ -NS_IMETHODIMP nsSystemPrefService::GetRoot(char * *aRoot) -{ - return NS_ERROR_NOT_IMPLEMENTED; +NS_IMPL_ISUPPORTS1(nsSystemPrefService, nsISystemPrefService) + +static GConfClient* GetGConf() { + return gconf_client_get_default(); } -/* long getPrefType (in string aPrefName); */ -NS_IMETHODIMP nsSystemPrefService::GetPrefType(const char *aPrefName, PRInt32 *_retval) +static PRBool VerifyMatchingTypes(nsISystemPref* aPrefs, + const char* aMozPref, GConfValue* aVal) { - return NS_ERROR_NOT_IMPLEMENTED; + nsCOMPtr<nsIPrefBranch2> prefBranch = aPrefs->GetPrefUserBranch(); + PRInt32 type; + nsresult rv = prefBranch->GetPrefType(aMozPref, &type); + if (NS_FAILED(rv)) { + // pref probably doesn't exist. Let gconf set it. + return PR_TRUE; + } + + PRBool ok; + switch (aVal->type) { + case GCONF_VALUE_STRING: + ok = type == nsIPrefBranch2::PREF_STRING; + break; + case GCONF_VALUE_INT: + ok = type == nsIPrefBranch2::PREF_INT; + break; + case GCONF_VALUE_BOOL: + ok = type == nsIPrefBranch2::PREF_BOOL; + break; + default: + NS_ERROR("Unhandled gconf preference type"); + return PR_FALSE; + } + + NS_ASSERTION(ok, "Mismatched gconf/Mozilla pref types"); + return ok; } -/* boolean getBoolPref (in string aPrefName); */ -NS_IMETHODIMP nsSystemPrefService::GetBoolPref(const char *aPrefName, PRBool *_retval) +/** + * Map a gconf pref value into the corresponding Mozilla pref. + */ +static nsresult ApplySimpleMapping(SimplePrefMapping* aMap, + nsISystemPref* aPrefs, + GConfClient* aClient) { - return mInitialized ? - mGConf->GetBoolPref(aPrefName, _retval) : NS_ERROR_FAILURE; + GConfValue* val = gconf_client_get(aClient, aMap->gconfPrefName, nsnull); + if (!val) { + // No gconf key, so there's really nothing to do + return NS_OK; + } + + VerifyMatchingTypes(aPrefs, aMap->mozPrefName, val); + + PRBool locked = !aMap->allowWritesFromMozilla || + !gconf_client_key_is_writable(aClient, aMap->gconfPrefName, nsnull); + nsresult rv; + switch (val->type) { + case GCONF_VALUE_STRING: { + const char* str = gconf_value_get_string(val); + rv = aPrefs->SetOverridingMozillaStringPref(aMap->mozPrefName, str, locked); + // XXX do we need to free 'str' here? + break; + } + case GCONF_VALUE_INT: + rv = aPrefs->SetOverridingMozillaIntPref(aMap->mozPrefName, + gconf_value_get_int(val), locked); + break; + case GCONF_VALUE_BOOL: + rv = aPrefs->SetOverridingMozillaBoolPref(aMap->mozPrefName, + gconf_value_get_bool(val), locked); + break; + default: + NS_ERROR("Unusable gconf value type"); + rv = NS_ERROR_FAILURE; + break; + } + + gconf_value_free(val); + return rv; } -/* void setBoolPref (in string aPrefName, in long aValue); */ -NS_IMETHODIMP nsSystemPrefService::SetBoolPref(const char *aPrefName, PRInt32 aValue) +/** + * Map a Mozilla pref into the corresponding gconf pref, if + * that's allowed. + */ +static nsresult ReverseApplySimpleMapping(SimplePrefMapping* aMap, + nsISystemPref* aPrefs, + GConfClient* aClient) { - return NS_ERROR_NOT_IMPLEMENTED; + // Verify that the gconf key has the right type, if it exists + GConfValue* val = gconf_client_get(aClient, aMap->gconfPrefName, nsnull); + if (val) { + VerifyMatchingTypes(aPrefs, aMap->mozPrefName, val); + gconf_value_free(val); + } + + PRBool writable = aMap->allowWritesFromMozilla && + gconf_client_key_is_writable(aClient, aMap->gconfPrefName, nsnull); + if (!writable) { + NS_ERROR("Gconf key is not writable"); + return NS_ERROR_FAILURE; + } + + nsCOMPtr<nsIPrefBranch2> prefBranch = aPrefs->GetPrefUserBranch(); + PRInt32 type; + nsresult rv = prefBranch->GetPrefType(aMap->mozPrefName, &type); + if (NS_FAILED(rv)) { + NS_ERROR("Writing back a pref that doesn't exist?"); + return rv; + } + + switch (type) { + case nsIPrefBranch2::PREF_STRING: + { + char* result; + rv = prefBranch->GetCharPref(aMap->mozPrefName, &result); + if (NS_FAILED(rv)) + return rv; + + gconf_client_set_string(aClient, aMap->gconfPrefName, result, nsnull); + nsMemory::Free(result); + } + break; + case nsIPrefBranch2::PREF_INT: + { + PRInt32 result; + rv = prefBranch->GetIntPref(aMap->mozPrefName, &result); + if (NS_FAILED(rv)) + return rv; + + gconf_client_set_int(aClient, aMap->gconfPrefName, result, nsnull); + } + break; + case nsIPrefBranch2::PREF_BOOL: + { + PRBool result; + rv = prefBranch->GetBoolPref(aMap->mozPrefName, &result); + if (NS_FAILED(rv)) + return rv; + + gconf_client_set_bool(aClient, aMap->gconfPrefName, result, nsnull); + } + break; + default: + NS_ERROR("Unhandled gconf preference type"); + return NS_ERROR_FAILURE; + } + + return NS_OK; } -/* string getCharPref (in string aPrefName); */ -NS_IMETHODIMP nsSystemPrefService::GetCharPref(const char *aPrefName, char **_retval) +/* BEGIN preference mapping definition area + * + * There are a few rules that our preference maps have to obey: + * + * 1) Each mapping defines a relationship R between a set of GConf preferences and + * a set of Mozilla preferences that must *always* be true. Thus, when a Mozilla + * pref changes or a gconf pref changes, we may need to change something on the + * other side to preserve R. If a GConf preference is read-only, then we may + * need to lock one or more Mozilla preferences to avoid a situation where the + * Mozilla preference changes and we can't update the GConf preference to + * ensure R continues to hold. + * + * 2) If an unlocked Mozilla preference is changed, then we can only + * preserve R by changing GConf preferences; we are not allowed to + * change Mozilla preferences. + * + * 3) If a GConf preference is changed, then we can only preserve R by + * changing Moozilla preferences; we are nt allowed to change GConf + * preferences. + * + * For "simple" mappings, the relationship R is just of the form + * "GConf preference 'A' is equal to Mozilla preference 'B'". R is + * preserved by setting A to B when B changes, and by setting B to A + * when A changes. If A is read-only then we lock B (or we may just + * decide to lock B for other reasons). Thus rules 1-3 are satisfied. + * + * For "complex" mappings we have more complicated + * relationships. These are documented below. + */ + +static SimplePrefMapping sSimplePrefMappings[] = { + // GNOME proxy settings; allow these to be set through the Firefox UI + {"network.proxy.http", "/system/http_proxy/host", PR_TRUE}, + {"network.proxy.http_port", "/system/http_proxy/port", PR_TRUE}, + {"network.proxy.ftp", "/system/proxy/ftp_host", PR_TRUE}, + {"network.proxy.ftp_port", "/system/proxy/ftp_port", PR_TRUE}, + {"network.proxy.ssl", "/system/proxy/secure_host", PR_TRUE}, + {"network.proxy.ssl_port", "/system/proxy/secure_port", PR_TRUE}, + {"network.proxy.socks", "/system/proxy/socks_host", PR_TRUE}, + {"network.proxy.socks_port", "/system/proxy/socks_port", PR_TRUE}, + {"network.proxy.autoconfig_url", "/system/proxy/autoconfig_url", PR_TRUE}, + + // GNOME accessibility setting; never allow this to be set by Firefox + {"config.use_system_prefs.accessibility", + "/desktop/gnome/interface/accessibility", PR_FALSE}, + + // GConf Firefox preferences; allow these to be set through the Firefox UI + {"security.enable_java", "/apps/firefox/web/java_enabled", PR_TRUE}, + {"javascript.enabled", "/apps/firefox/web/javascript_enabled", PR_TRUE}, + {"browser.startup.homepage", "/apps/firefox/general/homepage_url", PR_TRUE}, + {"browser.cache.disk.capacity", "/apps/firefox/web/cache_size", PR_TRUE}, + {"network.cookie.lifetimePolicy", "/apps/firefox/web/cookie_accept", PR_TRUE}, + + // UI lockdown settings; never allow these to be set by Firefox. There is no + // Firefox UI for these but they could otherwise be set via about:config. + {"config.lockdown.printing", "/desktop/gnome/lockdown/disable_printing", PR_FALSE}, + {"config.lockdown.printsetup", "/desktop/gnome/lockdown/disable_print_setup", PR_FALSE}, + {"config.lockdown.savepage", "/desktop/gnome/lockdown/disable_save_to_disk", PR_FALSE}, + {"config.lockdown.history", "/apps/firefox/lockdown/disable_history", PR_FALSE}, + {"config.lockdown.toolbarediting", "/apps/firefox/lockdown/disable_toolbar_editing", PR_FALSE}, + {"config.lockdown.urlbar", "/apps/firefox/lockdown/disable_url_bar", PR_FALSE}, + {"config.lockdown.bookmark", "/apps/firefox/lockdown/disable_bookmark_editing", PR_FALSE}, + {"config.lockdown.disable_themes", "/apps/firefox/lockdown/disable_themes", PR_FALSE}, + {"config.lockdown.disable_extensions", "/apps/firefox/lockdown/disable_extensions", PR_FALSE}, + {"config.lockdown.searchbar", "/apps/firefox/lockdown/disable_searchbar", PR_FALSE}, + {"config.lockdown.hidebookmark", "/apps/firefox/lockdown/hide_bookmark", PR_FALSE}, + {"config.lockdown.showsavedpasswords", "/apps/firefox/lockdown/disable_show_passwords", PR_FALSE}, +}; + +static nsresult ApplyListPref(nsSystemPrefService* aPrefService, + GConfClient* aClient, + const char* aGConfKey, const char* aMozKey, + char aSeparator) { - return mInitialized ? - mGConf->GetCharPref(aPrefName, _retval) : NS_ERROR_FAILURE; + GSList* list = gconf_client_get_list(aClient, aGConfKey, + GCONF_VALUE_STRING, nsnull); + nsCAutoString str; + for (GSList* l = list; l; l = l->next) { + str.Append((const char*)l->data); + if (l->next) { + str.Append(aSeparator); + } + } + PRBool lock = !gconf_client_key_is_writable(aClient, aGConfKey, nsnull); + nsresult rv = aPrefService->GetPrefs()-> + SetOverridingMozillaStringPref(aMozKey, str.get(), lock); + // XXX does this free the strings? Should it? + g_slist_free(list); + return rv; } - -/* void setCharPref (in string aPrefName, in string aValue); */ -NS_IMETHODIMP nsSystemPrefService::SetCharPref(const char *aPrefName, const char *aValue) +static nsresult ReverseApplyListPref(nsSystemPrefService* aPrefService, + GConfClient* aClient, + const char* aGConfKey, const char* aMozKey, + char aSeparator) { - return NS_ERROR_NOT_IMPLEMENTED; + char* data = nsnull; + nsCOMPtr<nsIPrefBranch2> prefs = + aPrefService->GetPrefs()->GetPrefUserBranch(); + prefs->GetCharPref(aMozKey, &data); + if (!data) + return NS_ERROR_FAILURE; + nsresult rv = NS_OK; + GSList* list = nsnull; + PRInt32 i = 0; + while (data[i]) { + const char* nextComma = strchr(data+i, ','); + PRInt32 tokLen = nextComma ? nextComma - (data+i) : strlen(data+i); + char* tok = strndup(data+i, tokLen); + if (!tok) + break; + GSList* newList = g_slist_append(list, tok); + if (!newList) { + rv = NS_ERROR_OUT_OF_MEMORY; + break; + } + list = newList; + if (!nextComma) + break; + i = nextComma + 1 - data; + } + nsMemory::Free(data); + if (NS_SUCCEEDED(rv)) { + gconf_client_set_list(aClient, aGConfKey, GCONF_VALUE_STRING, list, nsnull); + } + for (GSList* l = list; l; l = l->next) { + free(l->data); + } + g_slist_free(list); + return rv; } -/* long getIntPref (in string aPrefName); */ -NS_IMETHODIMP nsSystemPrefService::GetIntPref(const char *aPrefName, PRInt32 *_retval) +/** + * The relationship R is + * "network.negotiate-auth.trusted-uris" is the comma-separated concatenation + * of the elements of the list "/apps/firefox/general/trusted_URIs" + */ +static const char GConfKey_TrustedURIs[] = "/apps/firefox/general/trusted_URIs"; +static const char MozKey_TrustedURIs[] = "network.negotiate-auth.trusted-uris"; +static nsresult ApplyTrustedURIs(nsSystemPrefService* aPrefService, + GConfClient* aClient) { - return mInitialized ? - mGConf->GetIntPref(aPrefName, _retval) : NS_ERROR_FAILURE; + return ApplyListPref(aPrefService, aClient, + GConfKey_TrustedURIs, MozKey_TrustedURIs, ','); } - -/* void setIntPref (in string aPrefName, in long aValue); */ -NS_IMETHODIMP nsSystemPrefService::SetIntPref(const char *aPrefName, PRInt32 aValue) +static nsresult ReverseApplyTrustedURIs(nsSystemPrefService* aPrefService, + GConfClient* aClient) { - return NS_ERROR_NOT_IMPLEMENTED; + return ReverseApplyListPref(aPrefService, aClient, + GConfKey_TrustedURIs, MozKey_TrustedURIs, ','); } -/* void getComplexValue (in string aPrefName, in nsIIDRef aType, [iid_is (aType), retval] out nsQIResult aValue); */ -NS_IMETHODIMP nsSystemPrefService::GetComplexValue(const char *aPrefName, const nsIID & aType, void * *aValue) +/** + * The relationship R is + * "network.negotiate-auth.delegation-uris" is the comma-separated concatenation + * of the elements of the list "/apps/firefox/general/delegation_URIs" + */ +static const char GConfKey_DelegationURIs[] = "/apps/firefox/general/delegation_URIs"; +static const char MozKey_DelegationURIs[] = "network.negotiate-auth.delegation-uris"; +static nsresult ApplyDelegationURIs(nsSystemPrefService* aPrefService, + GConfClient* aClient) { - return NS_ERROR_NOT_IMPLEMENTED; + return ApplyListPref(aPrefService, aClient, + GConfKey_DelegationURIs, MozKey_DelegationURIs, ','); } - -/* void setComplexValue (in string aPrefName, in nsIIDRef aType, in nsISupports aValue); */ -NS_IMETHODIMP nsSystemPrefService::SetComplexValue(const char *aPrefName, const nsIID & aType, nsISupports *aValue) +static nsresult ReverseApplyDelegationURIs(nsSystemPrefService* aPrefService, + GConfClient* aClient) { - return NS_ERROR_NOT_IMPLEMENTED; + return ReverseApplyListPref(aPrefService, aClient, + GConfKey_DelegationURIs, MozKey_DelegationURIs, ','); } -/* void clearUserPref (in string aPrefName); */ -NS_IMETHODIMP nsSystemPrefService::ClearUserPref(const char *aPrefName) +/** + * The relationship R is + * "network.proxy.no_proxies_on" is the comma-separated concatenation + * of the elements of the list "/system/http_proxy/ignore_hosts" + */ +static const char GConfKey_IgnoreHosts[] = "/system/http_proxy/ignore_hosts"; +static const char MozKey_IgnoreHosts[] = "network.proxy.no_proxies_on"; +static nsresult ApplyIgnoreHosts(nsSystemPrefService* aPrefService, + GConfClient* aClient) { - return NS_ERROR_NOT_IMPLEMENTED; + return ApplyListPref(aPrefService, aClient, + GConfKey_IgnoreHosts, MozKey_IgnoreHosts, ','); } - -/* void lockPref (in string aPrefName); */ -NS_IMETHODIMP nsSystemPrefService::LockPref(const char *aPrefName) +static nsresult ReverseApplyIgnoreHosts(nsSystemPrefService* aPrefService, + GConfClient* aClient) { - return NS_ERROR_NOT_IMPLEMENTED; + return ReverseApplyListPref(aPrefService, aClient, + GConfKey_IgnoreHosts, MozKey_IgnoreHosts, ','); } -/* boolean prefHasUserValue (in string aPrefName); */ -NS_IMETHODIMP nsSystemPrefService::PrefHasUserValue(const char *aPrefName, PRBool *_retval) +/** + * The relationship R is + * ("/system/proxy/mode" is 'manual' if and only if "network.proxy.type" is eProxyConfig_Manual (1)) + * AND ("/system/proxy/mode" is 'auto' if and only if "network.proxy.type" is eProxyConfig_PAC (2)) + * + * [This means 'none' matches any value of "network.proxy.type" other than 1 or 2.] + */ +static const char GConfKey_ProxyMode[] = "/system/proxy/mode"; +static const char MozKey_ProxyMode[] = "network.proxy.type"; +static nsresult ApplyProxyMode(nsSystemPrefService* aPrefService, + GConfClient* aClient) { - return NS_ERROR_NOT_IMPLEMENTED; + char* str = gconf_client_get_string(aClient, GConfKey_ProxyMode, nsnull); + if (!str) + return NS_ERROR_FAILURE; + PRInt32 val = -1; + nsCOMPtr<nsIPrefBranch2> prefs = + aPrefService->GetPrefs()->GetPrefUserBranch(); + prefs->GetIntPref(MozKey_ProxyMode, &val); + if (val < 0) + return NS_ERROR_FAILURE; + if (!strcmp(str, "manual")) { + val = 1; + } else if (!strcmp(str, "auto")) { + val = 2; + } else if (strcmp(str, "none")) { + // invalid value for this gconf pref; do nothing + g_free(str); + return NS_OK; + } else { + if (val == 1 || val == 2) { + // We need to make it something that 'none' maps to + val = 0; + } + } + g_free(str); + PRBool lock = !gconf_client_key_is_writable(aClient, GConfKey_ProxyMode, nsnull); + nsresult rv = aPrefService->GetPrefs()-> + SetOverridingMozillaIntPref(MozKey_ProxyMode, val, lock); + return rv; } - -/* boolean prefIsLocked (in string aPrefName); */ -NS_IMETHODIMP nsSystemPrefService::PrefIsLocked(const char *aPrefName, PRBool *_retval) +static nsresult ReverseApplyProxyMode(nsSystemPrefService* aPrefService, + GConfClient* aClient) { - return NS_ERROR_NOT_IMPLEMENTED; + PRInt32 val = -1; + nsCOMPtr<nsIPrefBranch2> prefs = + aPrefService->GetPrefs()->GetPrefUserBranch(); + prefs->GetIntPref(MozKey_ProxyMode, &val); + if (val < 0) + return NS_ERROR_FAILURE; + const char* str; + switch (val) { + case 1: str = "manual"; break; + case 2: str = "auto"; break; + default: str = "none"; break; + } + gconf_client_set_string(aClient, GConfKey_ProxyMode, str, nsnull); + return NS_OK; } -/* void unlockPref (in string aPrefName); */ -NS_IMETHODIMP nsSystemPrefService::UnlockPref(const char *aPrefName) +/** + * The relationship R is + * If "/apps/firefox/web/download_defaultfolder" is the empty string, then + * "browser.download.useDownloadDir" is false; + * otherwise "browser.download.useDownloadDir" is true and "browser.download.folderList" + * is (0 if "/apps/firefox/web/download_defaultfolder" is "Desktop"; + * 1 if "/apps/firefox/web/download_defaultfolder" is "My Downloads"; + * 3 if "/apps/firefox/web/download_defaultfolder" is "Home"; + * otherwise 2 and "browser.download.dir" = "/apps/firefox/web/download_defaultfolder") + */ +static const char GConfKey_DownloadFolder[] = "/apps/firefox/web/download_defaultfolder"; +static const char MozKey_UseDownloadDir[] = "browser.download.useDownloadDir"; +static const char MozKey_DownloadDirType[] = "browser.download.folderList"; +static const char MozKey_DownloadDirExplicit[] = "browser.download.dir"; +static nsresult ApplyDownloadFolder(nsSystemPrefService* aPrefService, + GConfClient* aClient) { - return NS_ERROR_NOT_IMPLEMENTED; + char* str = gconf_client_get_string(aClient, GConfKey_DownloadFolder, nsnull); + if (!str) + return NS_ERROR_FAILURE; + PRBool lock = !gconf_client_key_is_writable(aClient, GConfKey_DownloadFolder, nsnull); + nsresult rv = aPrefService->GetPrefs()-> + SetOverridingMozillaBoolPref(MozKey_UseDownloadDir, *str != 0, lock); + if (NS_FAILED(rv)) { + g_free(str); + return rv; + } + PRInt32 dirType = 0; + if (!strcmp(str, "Desktop")) { + dirType = 0; + } else if (!strcmp(str, "My Downloads")) { + dirType = 1; + } else if (!strcmp(str, "Home")) { + dirType = 3; + } else { + dirType = 2; + } + // Always set all three Mozilla preferences. This is simpler and avoids + // problems; e.g., if the gconf value changes from "/home/rocallahan" to "Desktop" + // we might leave MozKey_DownloadDirType accidentally locked. + rv = aPrefService->GetPrefs()-> + SetOverridingMozillaIntPref(MozKey_DownloadDirType, dirType, lock); + if (NS_SUCCEEDED(rv)) { + rv = aPrefService->GetPrefs()-> + SetOverridingMozillaStringPref(MozKey_DownloadDirExplicit, str, lock); + } + g_free(str); + return rv; } -/* void deleteBranch (in string aStartingAt); */ -NS_IMETHODIMP nsSystemPrefService::DeleteBranch(const char *aStartingAt) +static nsresult ReverseApplyDownloadFolder(nsSystemPrefService* aPrefService, + GConfClient* aClient) { - return NS_ERROR_NOT_IMPLEMENTED; + PRBool useDownloadDir = PR_FALSE; + const char* result; + char* explicitStr = nsnull; + nsCOMPtr<nsIPrefBranch2> prefs = aPrefService->GetPrefs()->GetPrefUserBranch(); + prefs->GetBoolPref(MozKey_UseDownloadDir, &useDownloadDir); + if (!useDownloadDir) { + result = ""; + } else { + PRInt32 type = -1; + prefs->GetIntPref(MozKey_DownloadDirType, &type); + if (type < 0) + return NS_ERROR_FAILURE; + switch (type) { + case 0: result = "Desktop"; break; + case 1: result = "My Downloads"; break; + case 2: + prefs->GetCharPref(MozKey_DownloadDirExplicit, &explicitStr); + result = explicitStr; + break; + case 3: result = "Home"; break; + default: + NS_ERROR("Unknown download dir type"); + return NS_ERROR_FAILURE; + } + } + if (!result) + return NS_ERROR_FAILURE; + gconf_client_set_string(aClient, GConfKey_DownloadFolder, + result, nsnull); + nsMemory::Free(explicitStr); + return NS_OK; } -/* void getChildList (in string aStartingAt, out unsigned long aCount, [array, size_is (aCount), retval] out string aChildArray); */ -NS_IMETHODIMP nsSystemPrefService::GetChildList(const char *aStartingAt, PRUint32 *aCount, char ***aChildArray) +/** + * The relationship R is + * "/apps/firefox/web/disable_cookies" is true if and only if + * "network.cookie.cookieBehavior" is 2 ('dontUse') + */ +static const char GConfKey_DisableCookies[] = "/apps/firefox/web/disable_cookies"; +static const char MozKey_CookieBehavior[] = "network.cookie.cookieBehavior"; +static const char MozKey_CookieExceptions[] = "network.cookie.honorExceptions"; +static const char MozKey_CookieViewExceptions[] = "pref.privacy.disable_button.cookie_exceptions"; +static nsresult ApplyDisableCookies(nsSystemPrefService* aPrefService, + GConfClient* aClient) { - return NS_ERROR_NOT_IMPLEMENTED; + gboolean disable = gconf_client_get_bool(aClient, GConfKey_DisableCookies, nsnull); + PRInt32 behavior = -1; + nsCOMPtr<nsIPrefBranch2> prefs = + aPrefService->GetPrefs()->GetPrefUserBranch(); + prefs->GetIntPref(MozKey_CookieBehavior, &behavior); + if (behavior < 0) + return NS_ERROR_FAILURE; + if (disable) { + behavior = 2; + } else { + if (behavior == 2) { + behavior = 0; + } + } + PRBool lock = !gconf_client_key_is_writable(aClient, GConfKey_DisableCookies, nsnull); + nsresult rv = aPrefService->GetPrefs()-> + SetOverridingMozillaBoolPref(MozKey_CookieExceptions, !lock, lock); + if (NS_FAILED(rv)) + return rv; + rv = aPrefService->GetPrefs()-> + SetOverridingMozillaBoolPref(MozKey_CookieViewExceptions, lock, lock); + if (NS_FAILED(rv)) + return rv; + return aPrefService->GetPrefs()-> + SetOverridingMozillaIntPref(MozKey_CookieBehavior, behavior, lock); } - -/* void resetBranch (in string aStartingAt); */ -NS_IMETHODIMP nsSystemPrefService::ResetBranch(const char *aStartingAt) +static nsresult ReverseApplyDisableCookies(nsSystemPrefService* aPrefService, + GConfClient* aClient) { - return NS_ERROR_NOT_IMPLEMENTED; + PRInt32 behavior = -1; + nsCOMPtr<nsIPrefBranch2> prefs = + aPrefService->GetPrefs()->GetPrefUserBranch(); + prefs->GetIntPref(MozKey_CookieBehavior, &behavior); + if (behavior < 0) + return NS_ERROR_FAILURE; + gconf_client_set_bool(aClient, GConfKey_DisableCookies, behavior == 2, nsnull); + return NS_OK; } -/* void addObserver (in string aDomain, in nsIObserver aObserver, in boolean aHoldWeak); */ -NS_IMETHODIMP nsSystemPrefService::AddObserver(const char *aDomain, nsIObserver *aObserver, PRBool aHoldWeak) +static char const* windowOpenFeatures[] = { + "dom.disable_window_open_feature.close", + "dom.disable_window_open_feature.directories", + "dom.disable_window_open_feature.location", + "dom.disable_window_open_feature.menubar", + "dom.disable_window_open_feature.minimizable", + "dom.disable_window_open_feature.personalbar", + "dom.disable_window_open_feature.resizable", + "dom.disable_window_open_feature.scrollbars", + "dom.disable_window_open_feature.status", + "dom.disable_window_open_feature.titlebar", + "dom.disable_window_open_feature.toolbar" +}; +/** + * The relationship R is + * "/apps/firefox/lockdown/disable_javascript_chrome" is true if and only if + * all of windowOpenFeatures are true + */ +static const char GConfKey_DisableJSChrome[] = + "/apps/firefox/lockdown/disable_javascript_chrome"; +static nsresult ApplyWindowOpen(nsSystemPrefService* aPrefService, + GConfClient* aClient) { - nsresult rv; - - NS_ENSURE_ARG_POINTER(aDomain); - NS_ENSURE_ARG_POINTER(aObserver); - - NS_ENSURE_TRUE(mInitialized, NS_ERROR_FAILURE); - - PRUint32 prefAtom; - // make sure the pref name is supported - rv = mGConf->GetAtomForMozKey(aDomain, &prefAtom); - NS_ENSURE_SUCCESS(rv, rv); - - if (!mObservers) { - mObservers = new nsAutoVoidArray(); - if (mObservers == nsnull) - return NS_ERROR_OUT_OF_MEMORY; - } - - SysPrefCallbackData *pCallbackData = (SysPrefCallbackData *) - nsMemory::Alloc(sizeof(SysPrefCallbackData)); - if (pCallbackData == nsnull) - return NS_ERROR_OUT_OF_MEMORY; - - pCallbackData->bIsWeakRef = aHoldWeak; - pCallbackData->prefAtom = prefAtom; - // hold a weak reference to the observer if so requested - nsCOMPtr<nsISupports> observerRef; - if (aHoldWeak) { - nsCOMPtr<nsISupportsWeakReference> weakRefFactory = - do_QueryInterface(aObserver); - if (!weakRefFactory) { - // the caller didn't give us a object that supports weak reference. - // ... tell them - nsMemory::Free(pCallbackData); - return NS_ERROR_INVALID_ARG; + gboolean disable = gconf_client_get_bool(aClient, GConfKey_DisableJSChrome, nsnull); + PRBool lock = !gconf_client_key_is_writable(aClient, GConfKey_DisableJSChrome, nsnull); + PRBool curValues[NUM_ELEM(windowOpenFeatures)]; + PRUint32 i; + nsCOMPtr<nsIPrefBranch2> prefs = aPrefService->GetPrefs()->GetPrefUserBranch(); + PRBool allDisabled = PR_TRUE; + for (i = 0; i < NUM_ELEM(windowOpenFeatures); ++i) { + nsresult rv = prefs->GetBoolPref(windowOpenFeatures[i], &curValues[i]); + if (NS_FAILED(rv)) + return rv; + if (!curValues[i]) { + allDisabled = PR_FALSE; } - nsCOMPtr<nsIWeakReference> tmp = do_GetWeakReference(weakRefFactory); - observerRef = tmp; - } else { - observerRef = aObserver; } - - rv = mGConf->NotifyAdd(prefAtom, pCallbackData); - if (NS_FAILED(rv)) { - nsMemory::Free(pCallbackData); - return rv; + for (i = 0; i < NUM_ELEM(windowOpenFeatures); ++i) { + PRBool newVal = curValues[i]; + if (disable) { + newVal = PR_TRUE; + } else if (allDisabled) { + // If all disable-window-open-feature prefs are currently + // PR_TRUE, then we need to set at least one of them to + // PR_FALSE. Set all of them to PR_FALSE. + newVal = PR_FALSE; + } // If at least one disable-window-open-feature pref is + // currently PR_FALSE, then we don't need to change anything + // when the gconf pref says don't disable + nsresult rv = aPrefService->GetPrefs()-> + SetOverridingMozillaBoolPref(windowOpenFeatures[i], newVal, lock); + if (NS_FAILED(rv)) + return rv; } - - pCallbackData->observer = observerRef; - NS_ADDREF(pCallbackData->observer); - - mObservers->AppendElement(pCallbackData); return NS_OK; } -/* void removeObserver (in string aDomain, in nsIObserver aObserver); */ -NS_IMETHODIMP nsSystemPrefService::RemoveObserver(const char *aDomain, nsIObserver *aObserver) +static nsresult ReverseApplyWindowOpen(nsSystemPrefService* aPrefService, + GConfClient* aClient) { - nsresult rv; - - NS_ENSURE_ARG_POINTER(aDomain); - NS_ENSURE_ARG_POINTER(aObserver); - NS_ENSURE_TRUE(mInitialized, NS_ERROR_FAILURE); - - if (!mObservers) - return NS_OK; - - PRUint32 prefAtom; - // make sure the pref name is supported - rv = mGConf->GetAtomForMozKey(aDomain, &prefAtom); - NS_ENSURE_SUCCESS(rv, rv); - - // need to find the index of observer, so we can remove it - PRIntn count = mObservers->Count(); - if (count <= 0) - return NS_OK; - - PRIntn i; - SysPrefCallbackData *pCallbackData; - for (i = 0; i < count; ++i) { - pCallbackData = (SysPrefCallbackData *)mObservers->ElementAt(i); - if (pCallbackData) { - nsCOMPtr<nsISupports> observerRef; - if (pCallbackData->bIsWeakRef) { - nsCOMPtr<nsISupportsWeakReference> weakRefFactory = - do_QueryInterface(aObserver); - if (weakRefFactory) { - nsCOMPtr<nsIWeakReference> tmp = - do_GetWeakReference(aObserver); - observerRef = tmp; - } - } - if (!observerRef) - observerRef = aObserver; - - if (pCallbackData->observer == observerRef && - pCallbackData->prefAtom == prefAtom) { - rv = mGConf->NotifyRemove(prefAtom, pCallbackData); - if (NS_SUCCEEDED(rv)) { - mObservers->RemoveElementAt(i); - NS_RELEASE(pCallbackData->observer); - nsMemory::Free(pCallbackData); - } - return rv; - } + nsCOMPtr<nsIPrefBranch2> prefs = aPrefService->GetPrefs()->GetPrefUserBranch(); + PRBool allDisabled = PR_TRUE; + PRBool curValues[NUM_ELEM(windowOpenFeatures)]; + for (PRUint32 i = 0; i < NUM_ELEM(windowOpenFeatures); ++i) { + nsresult rv = prefs->GetBoolPref(windowOpenFeatures[i], &curValues[i]); + if (NS_FAILED(rv)) + return rv; + if (!curValues[i]) { + allDisabled = PR_FALSE; } } + gconf_client_set_bool(aClient, GConfKey_DisableJSChrome, allDisabled, nsnull); return NS_OK; } -void -nsSystemPrefService::OnPrefChange(PRUint32 aPrefAtom, void *aData) +/** + * The relationship R is + * If "/apps/firefox/lockdown/disable_unsafe_protocol" is true then + * -- "network.protocol-handler.blocked-default" is true + * -- "network.protocol-handler.blocked.XYZ" is false if and only if + * XYZ is a builtin non-disablable protocol or in + * "/apps/firefox/lockdown/additional_safe_protocols" + * AND if "/apps/firefox/lockdown/disable_unsafe_protocol" is false then + * -- "network.protocol-handler.blocked-default" is false + * -- if "network.protocol-handler.blocked.XYZ" exists then it is false + */ +static const char GConfKey_DisableUnsafeProtocols[] = + "/apps/firefox/lockdown/disable_unsafe_protocol"; +static const char GConfKey_AdditionalSafeProtocols[] = + "/apps/firefox/lockdown/additional_safe_protocols"; +static const char MozKey_BlockedDefault[] = + "network.protocol-handler.blocked-default"; +static const char MozKey_BlockedPrefix[] = + "network.protocol-handler.blocked."; +static const char* nonDisablableBuiltinProtocols[] = + { "about", "data", "jar", "keyword", "resource", "viewsource", + "chrome", "moz-icon", "javascript", "file" }; +static PRBool FindString(const char** aList, PRInt32 aCount, + const char* aStr) { - if (!mInitialized) - return; - - SysPrefCallbackData *pData = (SysPrefCallbackData *)aData; - if (pData->prefAtom != aPrefAtom) - return; - - nsCOMPtr<nsIObserver> observer; - if (pData->bIsWeakRef) { - nsCOMPtr<nsIWeakReference> weakRef = - do_QueryInterface(pData->observer); - if(weakRef) - observer = do_QueryReferent(weakRef); - if (!observer) { - // this weak referenced observer went away, remove it from the list - nsresult rv = mGConf->NotifyRemove(aPrefAtom, pData); - if (NS_SUCCEEDED(rv)) { - mObservers->RemoveElement(pData); - NS_RELEASE(pData->observer); - nsMemory::Free(pData); - } - return; + for (PRInt32 i = 0; i < aCount; ++i) { + if (!strcmp(aStr, aList[i])) + return PR_TRUE; + } + return PR_FALSE; +} +typedef nsDataHashtable<nsCStringHashKey,int> StringSet; +/** Collect the set of protocol names that we want to set preferences for */ +static nsresult AddAllProtocols(nsSystemPrefService* aPrefService, + const char* aSafeProtocols, + StringSet* aProtocolSet, + StringSet* aSafeSet) +{ + nsCOMPtr<nsIPrefBranch2> prefs = aPrefService->GetPrefs()->GetPrefUserBranch(); + PRUint32 childCount; + char **childArray = nsnull; + nsresult rv = prefs->GetChildList(MozKey_BlockedPrefix, &childCount, &childArray); + if (NS_FAILED(rv)) + return rv; + PRUint32 i; + for (i = 0; i < childCount; ++i) { + nsDependentCString tmp(childArray[i] + NUM_ELEM(MozKey_BlockedPrefix)-1); + aProtocolSet->Put(tmp, 1); // copies + } + for (i = 0; i < NUM_ELEM(nonDisablableBuiltinProtocols); ++i) { + nsDependentCString tmp(nonDisablableBuiltinProtocols[i]); + aProtocolSet->Put(tmp, 1); + } + i = 0; + while (aSafeProtocols[i]) { + const char* nextComma = strchr(aSafeProtocols+i, ','); + PRUint32 tokLen = nextComma ? nextComma - (aSafeProtocols+i) + : strlen(aSafeProtocols+i); + nsCAutoString tok(aSafeProtocols+i, tokLen); + aProtocolSet->Put(tok, 1); + aSafeSet->Put(tok, 1); + if (nextComma) { + i = nextComma - aSafeProtocols + 1; + } else { + break; } } - else - observer = do_QueryInterface(pData->observer); - - if (observer) - observer->Observe(NS_STATIC_CAST(nsIPrefBranch *, this), - NS_SYSTEMPREF_PREFCHANGE_TOPIC_ID, - NS_ConvertUTF8toUCS2(mGConf->GetMozKey(aPrefAtom)). - get()); + NS_FREE_XPCOM_ALLOCATED_POINTER_ARRAY(childCount, childArray); + return NS_OK; } -/************************************************************* - * GConfProxy - * - ************************************************************/ - -struct GConfFuncListType { - const char *FuncName; - PRFuncPtr FuncPtr; -}; - -struct PrefNamePair { - const char *mozPrefName; - const char *gconfPrefName; +struct ProtocolPrefClosure { + StringSet safeProtocolSet; + nsIPrefBranch2* prefs; + nsISystemPref* prefSetter; + PRPackedBool disableUnsafe; + PRPackedBool lock; }; -const char -GConfProxy::sPrefGConfKey[] = "accessibility.unix.gconf2.shared-library"; -const char GConfProxy::sDefaultLibName1[] = "libgconf-2.so.4"; -const char GConfProxy::sDefaultLibName2[] = "libgconf-2.so"; - -#define GCONF_FUNCS_POINTER_BEGIN \ - static GConfFuncListType sGConfFuncList[] = { -#define GCONF_FUNCS_POINTER_ADD(func_name) \ - {func_name, nsnull}, -#define GCONF_FUNCS_POINTER_END \ - {nsnull, nsnull}, }; - -GCONF_FUNCS_POINTER_BEGIN - GCONF_FUNCS_POINTER_ADD("gconf_client_get_default") // 0 - GCONF_FUNCS_POINTER_ADD("gconf_client_get_bool") // 1 - GCONF_FUNCS_POINTER_ADD("gconf_client_get_string") //2 - GCONF_FUNCS_POINTER_ADD("gconf_client_get_int") //3 - GCONF_FUNCS_POINTER_ADD("gconf_client_notify_add") //4 - GCONF_FUNCS_POINTER_ADD("gconf_client_notify_remove") //5 - GCONF_FUNCS_POINTER_ADD("gconf_client_add_dir") //6 - GCONF_FUNCS_POINTER_ADD("gconf_client_remove_dir") //7 - GCONF_FUNCS_POINTER_ADD("gconf_entry_get_value") //8 - GCONF_FUNCS_POINTER_ADD("gconf_entry_get_key") //9 - GCONF_FUNCS_POINTER_ADD("gconf_value_get_bool") //10 - GCONF_FUNCS_POINTER_ADD("gconf_value_get_string") //11 - GCONF_FUNCS_POINTER_ADD("gconf_value_get_int") //12 -GCONF_FUNCS_POINTER_END - -///////////////////////////////////////////////////////////////////////////// -// the list is the mapping table, between mozilla prefs and gconf prefs -// It is expected to include all the pref pairs that are related in mozilla -// and gconf. -// -// Note: the prefs listed here are not neccessarily be read from gconf, they -// are the prefs that could be read from gconf. Mozilla has another -// list (see sSysPrefList in nsSystemPref.cpp) that decide which prefs -// are really read. -////////////////////////////////////////////////////////////////////////////// - -static const PrefNamePair sPrefNameMapping[] = { -#include "gconf_pref_list.inc" - {nsnull, nsnull}, -}; +static PLDHashOperator PR_CALLBACK SetProtocolPref(const nsACString& aKey, + int aItem, + void* aClosure) +{ + ProtocolPrefClosure* closure = NS_STATIC_CAST(ProtocolPrefClosure*, aClosure); + const nsCString& protocol = PromiseFlatCString(aKey); + PRBool blockProtocol = PR_FALSE; + if (closure->disableUnsafe && + !FindString(nonDisablableBuiltinProtocols, + NUM_ELEM(nonDisablableBuiltinProtocols), protocol.get()) && + !closure->safeProtocolSet.Get(aKey, nsnull)) { + blockProtocol = PR_TRUE; + } -PRBool PR_CALLBACK -gconfDeleteObserver(void *aElement, void *aData) { - nsMemory::Free(aElement); - return PR_TRUE; + nsCAutoString prefName; + prefName.Append(MozKey_BlockedPrefix); + prefName.Append(protocol); + closure->prefSetter->SetOverridingMozillaBoolPref(prefName.get(), blockProtocol, + closure->lock); + return PL_DHASH_NEXT; } - -GConfProxy::GConfProxy(nsSystemPrefService *aSysPrefService): - mGConfClient(nsnull), - mGConfLib(nsnull), - mInitialized(PR_FALSE), - mSysPrefService(aSysPrefService), - mObservers(nsnull) +static nsresult ApplyUnsafeProtocols(nsSystemPrefService* aPrefService, + GConfClient* aClient) { + PRBool lock = !gconf_client_key_is_writable(aClient, GConfKey_DisableUnsafeProtocols, nsnull) + || !gconf_client_key_is_writable(aClient, GConfKey_AdditionalSafeProtocols, nsnull); + gboolean disable = gconf_client_get_bool(aClient, GConfKey_DisableUnsafeProtocols, nsnull); + char* protocols = gconf_client_get_string(aClient, GConfKey_AdditionalSafeProtocols, nsnull); + if (!protocols) + return NS_ERROR_FAILURE; + nsresult rv = aPrefService->GetPrefs()-> + SetOverridingMozillaBoolPref(MozKey_BlockedDefault, disable, lock); + StringSet protocolSet; + ProtocolPrefClosure closure; + protocolSet.Init(); + closure.safeProtocolSet.Init(); + if (NS_SUCCEEDED(rv)) { + rv = AddAllProtocols(aPrefService, protocols, &protocolSet, + &closure.safeProtocolSet); + } + if (NS_SUCCEEDED(rv)) { + closure.disableUnsafe = disable; + closure.lock = lock; + closure.prefSetter = aPrefService->GetPrefs(); + nsCOMPtr<nsIPrefBranch2> prefs = aPrefService->GetPrefs()->GetPrefUserBranch(); + closure.prefs = prefs; + protocolSet.EnumerateRead(SetProtocolPref, &closure); + } + g_free(protocols); + return rv; } -GConfProxy::~GConfProxy() +static nsresult ReverseApplyUnsafeProtocols(nsSystemPrefService* aPrefService, + GConfClient* aClient) { - if (mGConfClient) - g_object_unref(G_OBJECT(mGConfClient)); - - if (mObservers) { - (void)mObservers->EnumerateForwards(gconfDeleteObserver, nsnull); - delete mObservers; + nsCOMPtr<nsIPrefBranch2> prefs = aPrefService->GetPrefs()->GetPrefUserBranch(); + PRBool blockedDefault; + nsresult rv = prefs->GetBoolPref(MozKey_BlockedDefault, &blockedDefault); + if (NS_FAILED(rv)) + return rv; + nsCAutoString enabledProtocols; + PRUint32 childCount; + char **childArray = nsnull; + rv = prefs->GetChildList(MozKey_BlockedPrefix, &childCount, &childArray); + if (NS_FAILED(rv)) + return rv; + for (PRUint32 i = 0; i < childCount; ++i) { + PRBool val = PR_FALSE; + prefs->GetBoolPref(childArray[i], &val); + if (val) { + if (enabledProtocols.Length() > 0) { + enabledProtocols.Append(','); + } + enabledProtocols.Append(childArray[i] + NUM_ELEM(MozKey_BlockedPrefix)-1); + } } + NS_FREE_XPCOM_ALLOCATED_POINTER_ARRAY(childCount, childArray); + gconf_client_set_bool(aClient, GConfKey_DisableUnsafeProtocols, blockedDefault, nsnull); + gconf_client_set_string(aClient, GConfKey_AdditionalSafeProtocols, + enabledProtocols.get(), nsnull); + return NS_OK; } -PRBool -GConfProxy::Init() +/** + * Set config.lockdown.setwallpaper if and only if + * /desktop/gnome/background/picture_filename is write-only. Always + * lock it. + */ +static const char MozKey_LockdownWallpaper[] = "config.lockdown.setwallpaper"; +static const char GConfKey_WallpaperSetting[] = + "/desktop/gnome/background/picture_filename"; +static nsresult ApplyWallpaper(nsSystemPrefService* aPrefService, + GConfClient* aClient) { - SYSPREF_LOG(("GConfProxy:: Init GConfProxy\n")); - if (!mSysPrefService) - return PR_FALSE; - if (mInitialized) - return PR_TRUE; + PRBool canSetWallpaper = + gconf_client_key_is_writable(aClient, GConfKey_WallpaperSetting, nsnull); + return aPrefService->GetPrefs()-> + SetOverridingMozillaBoolPref(MozKey_LockdownWallpaper, + !canSetWallpaper, PR_TRUE); +} +// No ReverseApplyWallpaper because this Mozilla pref can never be +// modified - nsCOMPtr<nsIPref> pref = do_GetService(NS_PREF_CONTRACTID); - if (!pref) - return PR_FALSE; +/** + * The relationship R is + * "signon.rememberSignons" is true if and only if "/apps/firefox/web/disable_save_password" + * is false. + */ +static const char MozKey_RememberSignons[] = "signon.rememberSignons"; +static const char GConfKey_DisableSavePassword[] = "/apps/firefox/web/disable_save_password"; +static nsresult ApplyDisableSavePassword(nsSystemPrefService* aPrefService, + GConfClient* aClient) +{ + PRBool lock = !gconf_client_key_is_writable(aClient, GConfKey_DisableSavePassword, nsnull); + gboolean disable = gconf_client_get_bool(aClient, GConfKey_DisableSavePassword, nsnull); + return aPrefService->GetPrefs()-> + SetOverridingMozillaBoolPref(MozKey_RememberSignons, !disable, lock); +} - nsXPIDLCString gconfLibName; - nsresult rv; +static nsresult ReverseApplyDisableSavePassword(nsSystemPrefService* aPrefService, + GConfClient* aClient) +{ + nsCOMPtr<nsIPrefBranch2> prefs = aPrefService->GetPrefs()->GetPrefUserBranch(); + PRBool remember; + nsresult rv = prefs->GetBoolPref(MozKey_RememberSignons, &remember); + if (NS_FAILED(rv)) + return rv; + gconf_client_set_bool(aClient, GConfKey_DisableSavePassword, !remember, nsnull); + return NS_OK; +} - //check if gconf-2 library is given in prefs - rv = pref->GetCharPref(sPrefGConfKey, getter_Copies(gconfLibName)); - if (NS_SUCCEEDED(rv)) { - //use the library name in the preference - SYSPREF_LOG(("GConf library in prefs is %s\n", gconfLibName.get())); - mGConfLib = PR_LoadLibrary(gconfLibName.get()); - } - else { - SYSPREF_LOG(("GConf library not specified in prefs, try the default: " - "%s and %s\n", sDefaultLibName1, sDefaultLibName2)); - mGConfLib = PR_LoadLibrary(sDefaultLibName1); - if (!mGConfLib) - mGConfLib = PR_LoadLibrary(sDefaultLibName2); +/** + * The relationship R is + * "permissions.default.image" is 1 (nsIPermissionManager::ALLOW_ACTION) if and only if + * "/apps/firefox/web/images_load" is 0, AND + * "permissions.default.image" is 2 (nsIPermissionManager::DENY_ACTION) if and only if + * "/apps/firefox/web/images_load" is 2, AND + * "permissions.default.image" is 3 if and only if "/apps/firefox/web/images_load" is 1 + * + * Also, we set pref.advanced.images.disable_button.view_image iff + * /apps/firefox/web/images_load is read-only + * And we set permissions.default.honorExceptions iff + * /apps/firefox/web/images_load is not read-only + */ +static const char MozKey_ImagePermissions[] = "permissions.default.image"; +static const char MozKey_ImageExceptions[] = "permissions.honorExceptions.image"; +static const char MozKey_ImageViewExceptions[] = "pref.advanced.images.disable_button.view_image"; +static const char GConfKey_LoadImages[] = "/apps/firefox/web/images_load"; +static nsresult ApplyLoadImages(nsSystemPrefService* aPrefService, + GConfClient* aClient) +{ + PRBool lock = !gconf_client_key_is_writable(aClient, GConfKey_LoadImages, nsnull); + // 0 == accept, 1 == no-foreign, 2 == reject + gint setting = gconf_client_get_int(aClient, GConfKey_LoadImages, nsnull); + PRInt32 pref; + switch (setting) { + case 0: pref = nsIPermissionManager::ALLOW_ACTION; break; + case 2: pref = nsIPermissionManager::DENY_ACTION; break; + case 1: pref = 3; break; + default: return NS_ERROR_FAILURE; } + nsresult rv = aPrefService->GetPrefs()-> + SetOverridingMozillaBoolPref(MozKey_ImageExceptions, !lock, lock); + if (NS_FAILED(rv)) + return rv; + rv = aPrefService->GetPrefs()-> + SetOverridingMozillaBoolPref(MozKey_ImageViewExceptions, lock, lock); + if (NS_FAILED(rv)) + return rv; + return aPrefService->GetPrefs()-> + SetOverridingMozillaIntPref(MozKey_ImagePermissions, pref, lock); +} - if (!mGConfLib) { - SYSPREF_LOG(("Fail to load GConf library\n")); - return PR_FALSE; +static nsresult ReverseApplyLoadImages(nsSystemPrefService* aPrefService, + GConfClient* aClient) +{ + nsCOMPtr<nsIPrefBranch2> prefs = aPrefService->GetPrefs()->GetPrefUserBranch(); + PRInt32 pref; + nsresult rv = prefs->GetIntPref(MozKey_ImagePermissions, &pref); + if (NS_FAILED(rv)) + return rv; + gint setting; + switch (pref) { + case nsIPermissionManager::ALLOW_ACTION: setting = 0; break; + case nsIPermissionManager::DENY_ACTION: setting = 2; break; + case 3: setting = 1; break; + default: return NS_ERROR_FAILURE; } + gconf_client_set_int(aClient, GConfKey_LoadImages, setting, nsnull); + return NS_OK; +} - //check every func we need in the gconf library - GConfFuncListType *funcList; - PRFuncPtr func; - for (funcList = sGConfFuncList; funcList->FuncName; ++funcList) { - func = PR_FindFunctionSymbol(mGConfLib, funcList->FuncName); - if (!func) { - SYSPREF_LOG(("Check GConf Func Error: %s", funcList->FuncName)); - goto init_failed_unload; +/** + * The relationship R is + * "/apps/firefox/web/disable_popups" is true if and only if + * "dom.disable_open_during_load" is true + * AND if "/apps/firefox/web/disable_popups" is true then + * "privacy.popups.showBrowserMessage" is false. + */ +static const char MozKey_DisablePopups[] = "dom.disable_open_during_load"; +static const char MozKey_DisableBrowserPopupMessage[] = "privacy.popups.showBrowserMessage"; +static const char GConfKey_DisablePopups[] = "/apps/firefox/web/disable_popups"; +static nsresult ApplyDisablePopups(nsSystemPrefService* aPrefService, + GConfClient* aClient) +{ + PRBool lock = !gconf_client_key_is_writable(aClient, GConfKey_DisablePopups, nsnull); + gboolean disable = gconf_client_get_bool(aClient, GConfKey_DisablePopups, nsnull); + nsresult rv = aPrefService->GetPrefs()-> + SetOverridingMozillaBoolPref(MozKey_DisablePopups, disable, lock); + if (NS_SUCCEEDED(rv)) { + if (disable) { + rv = aPrefService->GetPrefs()-> + SetOverridingMozillaBoolPref(MozKey_DisableBrowserPopupMessage, PR_TRUE, lock); + } else { + rv = aPrefService->GetPrefs()-> + StopOverridingMozillaPref(MozKey_DisableBrowserPopupMessage); } - funcList->FuncPtr = func; } - - InitFuncPtrs(); - - mGConfClient = GConfClientGetDefault(); - - // Don't unload past this point, since GConf's initialization of ORBit - // causes atexit handlers to be registered. - - if (!mGConfClient) { - SYSPREF_LOG(("Fail to Get default gconf client\n")); - goto init_failed; - } - mInitialized = PR_TRUE; - return PR_TRUE; - - init_failed_unload: - PR_UnloadLibrary(mGConfLib); - init_failed: - mGConfLib = nsnull; - return PR_FALSE; + return rv; } -nsresult -GConfProxy::GetBoolPref(const char *aMozKey, PRBool *retval) +static nsresult ReverseApplyDisablePopups(nsSystemPrefService* aPrefService, + GConfClient* aClient) { - NS_ENSURE_TRUE(mInitialized, NS_ERROR_FAILURE); - *retval = GConfClientGetBool(mGConfClient, MozKey2GConfKey(aMozKey), NULL); + nsCOMPtr<nsIPrefBranch2> prefs = aPrefService->GetPrefs()->GetPrefUserBranch(); + PRBool disabled; + nsresult rv = prefs->GetBoolPref(MozKey_DisablePopups, &disabled); + if (NS_FAILED(rv)) + return rv; + gconf_client_set_bool(aClient, GConfKey_DisablePopups, disabled, nsnull); return NS_OK; } -nsresult -GConfProxy::GetCharPref(const char *aMozKey, char **retval) -{ - NS_ENSURE_TRUE(mInitialized, NS_ERROR_FAILURE); +static ComplexGConfPrefMapping sComplexGConfPrefMappings[] = { + {GConfKey_TrustedURIs, ApplyTrustedURIs}, + {GConfKey_DelegationURIs, ApplyDelegationURIs}, + {GConfKey_IgnoreHosts, ApplyIgnoreHosts}, + {GConfKey_ProxyMode, ApplyProxyMode}, + {GConfKey_DownloadFolder, ApplyDownloadFolder}, + {GConfKey_DisableCookies, ApplyDisableCookies}, + {GConfKey_DisableJSChrome, ApplyWindowOpen}, + {GConfKey_DisableUnsafeProtocols, ApplyUnsafeProtocols}, + {GConfKey_AdditionalSafeProtocols, ApplyUnsafeProtocols}, + {GConfKey_WallpaperSetting, ApplyWallpaper}, + {GConfKey_DisableSavePassword, ApplyDisableSavePassword}, + {GConfKey_LoadImages, ApplyLoadImages}, + {GConfKey_DisablePopups, ApplyDisablePopups} +}; +static ComplexMozPrefMapping sComplexMozPrefMappings[] = { + {MozKey_TrustedURIs, ReverseApplyTrustedURIs}, + {MozKey_DelegationURIs, ReverseApplyDelegationURIs}, + {MozKey_IgnoreHosts, ReverseApplyIgnoreHosts}, + {MozKey_ProxyMode, ReverseApplyProxyMode}, + {MozKey_UseDownloadDir, ReverseApplyDownloadFolder}, + {MozKey_DownloadDirType, ReverseApplyDownloadFolder}, + {MozKey_DownloadDirExplicit, ReverseApplyDownloadFolder}, + {MozKey_CookieBehavior, ReverseApplyDisableCookies}, + {MozKey_RememberSignons, ReverseApplyDisableSavePassword}, + {MozKey_ImagePermissions, ReverseApplyLoadImages}, + {MozKey_DisablePopups, ReverseApplyDisablePopups} +}; +// The unsafe protocol preferences are handled specially because +// they affect an unknown number of Mozilla preferences +// Window opener permissions are also handled specially so we don't have to +// repeat the windowOpenFeatures list. - gchar *str = GConfClientGetString(mGConfClient, - MozKey2GConfKey(aMozKey), NULL); - if (str) { - *retval = PL_strdup(str); - g_free(str); - } - return NS_OK; -} +/* END preference mapping definition area */ -nsresult -GConfProxy::GetIntPref(const char *aMozKey, PRInt32 *retval) -{ - NS_ENSURE_TRUE(mInitialized, NS_ERROR_FAILURE); - if (strcmp (aMozKey, "network.proxy.type") == 0) { - gchar *str; - - str = GConfClientGetString(mGConfClient, - MozKey2GConfKey (aMozKey), NULL); - - if (str) { - if (strcmp (str, "manual") == 0) - *retval = 1; - else if (strcmp (str, "auto") == 0) - *retval = 2; - else - *retval = 0; - - g_free (str); - } else - *retval = 0; - } else { - *retval = GConfClientGetInt(mGConfClient, - MozKey2GConfKey(aMozKey), NULL); - } +static PR_CALLBACK void GConfSimpleNotification(GConfClient* client, + guint cnxn_id, + GConfEntry *entry, + gpointer user_data) +{ + nsSystemPrefService* service = NS_STATIC_CAST(nsSystemPrefService*, user_data); + SimplePrefMapping* map = NS_STATIC_CAST(SimplePrefMapping*, + service->GetSimpleCallbackData(cnxn_id)); + NS_ASSERTION(map, "Can't find mapping for callback"); + if (!map) + return; - return NS_OK; + ApplySimpleMapping(map, service->GetPrefs(), client); } -nsresult -GConfProxy::NotifyAdd (PRUint32 aAtom, void *aUserData) +static PR_CALLBACK void GConfComplexNotification(GConfClient* client, + guint cnxn_id, + GConfEntry *entry, + gpointer user_data) { - NS_ENSURE_TRUE(mInitialized, NS_ERROR_FAILURE); + nsSystemPrefService* service = NS_STATIC_CAST(nsSystemPrefService*, user_data); + ComplexGConfPrefMapping* map = NS_STATIC_CAST(ComplexGConfPrefMapping*, + service->GetComplexCallbackData(cnxn_id)); + NS_ASSERTION(map, "Can't find mapping for callback"); + if (!map) + return; - const char *gconfKey = GetGConfKey(aAtom); - if (!gconfKey) - return NS_ERROR_FAILURE; + map->callback(service, GetGConf()); +} - if (!mObservers) { - mObservers = new nsAutoVoidArray(); - if (mObservers == nsnull) - return NS_ERROR_OUT_OF_MEMORY; +nsresult nsSystemPrefService::LoadSystemPreferences(nsISystemPref* aPrefs) +{ + mPref = aPrefs; + + GConfClient* client = GetGConf(); + PRUint32 i; + nsCOMPtr<nsIPrefBranch2> userPrefs = aPrefs->GetPrefUserBranch(); + + // Update gconf settings with any Mozilla settings that have + // changed from the default. Do it before we register our + // gconf notifications. + for (i = 0; i < NUM_ELEM(sSimplePrefMappings); ++i) { + gconf_client_add_dir(client, sSimplePrefMappings[i].gconfPrefName, + GCONF_CLIENT_PRELOAD_NONE, nsnull); + + PRBool hasUserPref = PR_FALSE; + nsresult rv = + userPrefs->PrefHasUserValue(sSimplePrefMappings[i].mozPrefName, + &hasUserPref); + if (NS_FAILED(rv)) + return rv; + if (hasUserPref && sSimplePrefMappings[i].allowWritesFromMozilla && + gconf_client_key_is_writable(client, + sSimplePrefMappings[i].gconfPrefName, + nsnull)) { + rv = ReverseApplySimpleMapping(&sSimplePrefMappings[i], + aPrefs, client); + if (NS_FAILED(rv)) + return rv; + } + } + for (i = 0; i < NUM_ELEM(sComplexGConfPrefMappings); ++i) { + gconf_client_add_dir(client, sComplexGConfPrefMappings[i].gconfPrefName, + GCONF_CLIENT_PRELOAD_NONE, nsnull); + } + ComplexMozPrefChanged lastMozCallback = nsnull; + for (i = 0; i < NUM_ELEM(sComplexMozPrefMappings); ++i) { + PRBool hasUserPref = PR_FALSE; + nsresult rv = + userPrefs->PrefHasUserValue(sComplexMozPrefMappings[i].mozPrefName, + &hasUserPref); + if (NS_FAILED(rv)) + return rv; + if (hasUserPref) { + ComplexMozPrefChanged cb = sComplexMozPrefMappings[i].callback; + if (cb != lastMozCallback) { + cb(this, client); + lastMozCallback = cb; + } + } } - GConfCallbackData *pData = (GConfCallbackData *) - nsMemory::Alloc(sizeof(GConfCallbackData)); - NS_ENSURE_TRUE(pData, NS_ERROR_OUT_OF_MEMORY); - - pData->proxy = this; - pData->userData = aUserData; - pData->atom = aAtom; - mObservers->AppendElement(pData); - - GConfClientAddDir(mGConfClient, gconfKey, - 0, // GCONF_CLIENT_PRELOAD_NONE, don't preload anything - NULL); - - pData->notifyId = GConfClientNotifyAdd(mGConfClient, gconfKey, - gconf_key_listener, pData, - NULL, NULL); + // Register simple mappings and callbacks + for (i = 0; i < NUM_ELEM(sSimplePrefMappings); ++i) { + guint cx = gconf_client_notify_add(client, + sSimplePrefMappings[i].gconfPrefName, + GConfSimpleNotification, this, + nsnull, nsnull); + mGConfSimpleCallbacks.Put(cx, &sSimplePrefMappings[i]); + nsresult rv = ApplySimpleMapping(&sSimplePrefMappings[i], aPrefs, client); + if (NS_FAILED(rv)) + return rv; + } + + ComplexGConfPrefChanged lastCallback = nsnull; + for (i = 0; i < NUM_ELEM(sComplexGConfPrefMappings); ++i) { + guint cx = gconf_client_notify_add(client, + sComplexGConfPrefMappings[i].gconfPrefName, + GConfComplexNotification, this, + nsnull, nsnull); + mGConfComplexCallbacks.Put(cx, &sComplexGConfPrefMappings[i]); + ComplexGConfPrefChanged cb = sComplexGConfPrefMappings[i].callback; + if (cb != lastCallback) { + cb(this, client); + lastCallback = cb; + } + } + + ApplyUnsafeProtocols(this, client); + return NS_OK; } -nsresult -GConfProxy::NotifyRemove (PRUint32 aAtom, const void *aUserData) +nsresult nsSystemPrefService::NotifyMozillaPrefChanged(const char* aPrefName) { - NS_ENSURE_TRUE(mInitialized, NS_ERROR_FAILURE); + PRUint32 i; + GConfClient* client = GetGConf(); - PRIntn count = mObservers->Count(); - if (count <= 0) - return NS_OK; - - PRIntn i; - GConfCallbackData *pData; - for (i = 0; i < count; ++i) { - pData = (GConfCallbackData *)mObservers->ElementAt(i); - if (pData && pData->atom == aAtom && pData->userData == aUserData) { - GConfClientNotifyRemove(mGConfClient, pData->notifyId); - GConfClientRemoveDir(mGConfClient, - GetGConfKey(pData->atom), NULL); - mObservers->RemoveElementAt(i); - nsMemory::Free(pData); - break; + for (i = 0; i < NUM_ELEM(sSimplePrefMappings); ++i) { + if (!strcmp(aPrefName, sSimplePrefMappings[i].mozPrefName)) { + ReverseApplySimpleMapping(&sSimplePrefMappings[i], + mPref, client); } } - return NS_OK; -} -void -GConfProxy::InitFuncPtrs() -{ - //gconf client funcs - GConfClientGetDefault = - (GConfClientGetDefaultType) sGConfFuncList[0].FuncPtr; - GConfClientGetBool = - (GConfClientGetBoolType) sGConfFuncList[1].FuncPtr; - GConfClientGetString = - (GConfClientGetStringType) sGConfFuncList[2].FuncPtr; - GConfClientGetInt = - (GConfClientGetIntType) sGConfFuncList[3].FuncPtr; - GConfClientNotifyAdd = - (GConfClientNotifyAddType) sGConfFuncList[4].FuncPtr; - GConfClientNotifyRemove = - (GConfClientNotifyRemoveType) sGConfFuncList[5].FuncPtr; - GConfClientAddDir = - (GConfClientAddDirType) sGConfFuncList[6].FuncPtr; - GConfClientRemoveDir = - (GConfClientRemoveDirType) sGConfFuncList[7].FuncPtr; - - //gconf entry funcs - GConfEntryGetValue = (GConfEntryGetValueType) sGConfFuncList[8].FuncPtr; - GConfEntryGetKey = (GConfEntryGetKeyType) sGConfFuncList[9].FuncPtr; - - //gconf value funcs - GConfValueGetBool = (GConfValueGetBoolType) sGConfFuncList[10].FuncPtr; - GConfValueGetString = (GConfValueGetStringType) sGConfFuncList[11].FuncPtr; - GConfValueGetInt = (GConfValueGetIntType) sGConfFuncList[12].FuncPtr; -} - -void -GConfProxy::OnNotify(void *aClient, void * aEntry, PRUint32 aNotifyId, - GConfCallbackData *aData) -{ - if (!mInitialized || !aEntry || (mGConfClient != aClient) || !aData) - return; + for (i = 0; i < NUM_ELEM(sComplexMozPrefMappings); ++i) { + if (!strcmp(aPrefName, sComplexMozPrefMappings[i].mozPrefName)) { + sComplexMozPrefMappings[i].callback(this, client); + } + } - if (GConfEntryGetValue(aEntry) == NULL) - return; + for (i = 0; i < NUM_ELEM(windowOpenFeatures); ++i) { + if (!strcmp(aPrefName, windowOpenFeatures[i])) { + ReverseApplyWindowOpen(this, client); + } + } - PRUint32 prefAtom; - nsresult rv = GetAtomForGConfKey(GConfEntryGetKey(aEntry), &prefAtom); - if (NS_FAILED(rv)) - return; + ReverseApplyUnsafeProtocols(this, client); - mSysPrefService->OnPrefChange(prefAtom, aData->userData); + return NS_OK; } -nsresult -GConfProxy::GetAtom(const char *aKey, PRUint8 aNameType, PRUint32 *aAtom) +static PLDHashOperator PR_CALLBACK UnregisterSimple(const PRUint32& aKey, + SimplePrefMapping* aData, + void* aClosure) { - if (!aKey) - return NS_ERROR_FAILURE; - PRUint32 prefSize = sizeof(sPrefNameMapping) / sizeof(sPrefNameMapping[0]); - for (PRUint32 index = 0; index < prefSize; ++index) { - if (!strcmp((aNameType == 0) ? sPrefNameMapping[index].mozPrefName : - sPrefNameMapping[index].gconfPrefName, aKey)) { - *aAtom = index; - return NS_OK; - } - } - return NS_ERROR_FAILURE; + GConfClient* client = GetGConf(); + gconf_client_notify_remove(client, aKey); + gconf_client_remove_dir(client, aData->gconfPrefName, nsnull); + return PL_DHASH_NEXT; } -const char * -GConfProxy::GetKey(PRUint32 aAtom, PRUint8 aNameType) +static PLDHashOperator PR_CALLBACK UnregisterComplex(const PRUint32& aKey, + ComplexGConfPrefMapping* aData, + void* aClosure) { - PRUint32 mapSize = sizeof(sPrefNameMapping) / sizeof(sPrefNameMapping[0]); - if (aAtom >= 0 && aAtom < mapSize) - return (aNameType == 0) ? sPrefNameMapping[aAtom].mozPrefName : - sPrefNameMapping[aAtom].gconfPrefName; - return NULL; + GConfClient* client = GetGConf(); + gconf_client_notify_remove(client, aKey); + gconf_client_remove_dir(client, aData->gconfPrefName, nsnull); + return PL_DHASH_NEXT; } -inline const char * -GConfProxy::MozKey2GConfKey(const char *aMozKey) +nsresult nsSystemPrefService::NotifyUnloadSystemPreferences() { - PRUint32 atom; - nsresult rv = GetAtomForMozKey(aMozKey, &atom); - if (NS_SUCCEEDED(rv)) - return GetGConfKey(atom); - return NULL; -} + // Unregister callbacks + mGConfSimpleCallbacks.EnumerateRead(UnregisterSimple, this); + mGConfSimpleCallbacks.Clear(); + mGConfComplexCallbacks.EnumerateRead(UnregisterComplex, this); + mGConfComplexCallbacks.Clear(); -/* static */ -void gconf_key_listener (void* client, guint cnxn_id, - void *entry, gpointer user_data) -{ - SYSPREF_LOG(("...SYSPREF_LOG...key listener get called \n")); - if (!user_data) - return; - GConfCallbackData *pData = NS_REINTERPRET_CAST(GConfCallbackData *, - user_data); - pData->proxy->OnNotify(client, entry, cnxn_id, pData); + return NS_OK; } + +// Factory stuff + +NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsSystemPrefService, Init) + +static const nsModuleComponentInfo components[] = { + { NS_SYSTEMPREF_SERVICE_CLASSNAME, + NS_SYSTEMPREF_SERVICE_CID, + NS_SYSTEMPREF_SERVICE_CONTRACTID, + nsSystemPrefServiceConstructor, + }, +}; + +NS_IMPL_NSGETMODULE(nsSystemPrefServiceModule, components) diff --git a/mozilla/extensions/pref/system-pref/src/nsISystemPrefService.h b/mozilla/extensions/pref/system-pref/src/nsISystemPrefService.h new file mode 100644 index 0000000..d517e70 --- /dev/null +++ b/mozilla/extensions/pref/system-pref/src/nsISystemPrefService.h @@ -0,0 +1,107 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* vim:expandtab:shiftwidth=4:tabstop=4: + */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is Novell + * Portions created by Novell are Copyright (C) 2005 Novell, + * All Rights Reserved. + * + * Original Author: Robert O'Callahan (rocallahan@novell.com) + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the NPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the NPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#ifndef nsISystemPrefService_h__ +#define nsISystemPrefService_h__ + +#include "nsCOMPtr.h" +#include "nsIPrefBranchInternal.h" + +#define NS_SYSTEMPREF_SERVICE_CONTRACTID "@mozilla.org/system-preferences-service;1" + +#define NS_ISYSTEMPREFSERVICE_IID \ +{ 0x006e1cfd, 0xd66a, 0x40b9, \ + { 0x84, 0xa1, 0x84, 0xf3, 0xe6, 0xa2, 0xca, 0xbc } } + +class nsISystemPref { +public: + /** + * Call one of these three methods to override a Mozilla + * preference with a system value. You can call it multiple + * times to change the value of a given preference to track + * the underlying system value. + * + * If aLocked is true then we set the default preference and + * lock it so the user value is ignored. If aLocked is false + * then we unlock the Mozilla preference and set the Mozilla + * user value. + */ + virtual nsresult SetOverridingMozillaBoolPref(const char* aPrefName, + PRBool aValue, PRBool aLocked, + PRBool aPresent = PR_TRUE) = 0; + virtual nsresult SetOverridingMozillaIntPref(const char* aPrefName, + PRInt32 aValue, PRBool aLocked, + PRBool aPresent = PR_TRUE) = 0; + virtual nsresult SetOverridingMozillaStringPref(const char* aPrefName, + const char* aValue, PRBool aLocked, + PRBool aPresent = PR_TRUE) = 0; + virtual nsresult StopOverridingMozillaPref(const char* aPrefName) = 0; + virtual already_AddRefed<nsIPrefBranch2> GetPrefUserBranch() = 0; + virtual already_AddRefed<nsIPrefBranch> GetPrefDefaultBranch() = 0; +}; + +class nsISystemPrefService : public nsISupports { +public: + NS_DEFINE_STATIC_IID_ACCESSOR(NS_ISYSTEMPREFSERVICE_IID) + + /** + * Load the system prefs from the store into their corresponding + * Mozilla prefs, calling SetOverridingMozillaPref on each + * such pref. + */ + virtual nsresult LoadSystemPreferences(nsISystemPref* aPrefs) = 0; + + /** + * Notify that a Mozilla user pref that is being overridden by the + * store has changed. The new value of the Mozilla pref should be + * written back to the store. + */ + virtual nsresult NotifyMozillaPrefChanged(const char* aPrefName) = 0; + + /** + * Notify that we're about to stop using the system prefs. After + * this, nsSystemPref will automatically stop overriding all + * Mozilla prefs that are being overridden. + */ + virtual nsresult NotifyUnloadSystemPreferences() = 0; +}; + +#endif diff --git a/mozilla/extensions/pref/system-pref/src/nsSystemPref.cpp b/mozilla/extensions/pref/system-pref/src/nsSystemPref.cpp index 2f0d2a5..2b7158d 100644 --- a/mozilla/extensions/pref/system-pref/src/nsSystemPref.cpp +++ b/mozilla/extensions/pref/system-pref/src/nsSystemPref.cpp @@ -24,6 +24,7 @@ * Original Author: Bolian Yin (bolian.yin@sun.com) * * Contributor(s): + * Robert O'Callahan (rocallahan@novell.com) * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or @@ -41,66 +42,60 @@ #include "nsSystemPref.h" #include "nsIObserverService.h" +#include "nsIAppStartupNotifier.h" +#include "nsIPrefService.h" +#include "nsIPrefBranch.h" +#include "nsICategoryManager.h" +#include "nsIServiceManager.h" #include "nsSystemPrefLog.h" -#include "nsSystemPrefService.h" #include "nsString.h" -const char sSysPrefString[] = "config.use_system_prefs"; -union MozPrefValue { - char * stringVal; - PRInt32 intVal; - PRBool boolVal; -}; +#include <stdlib.h> struct SysPrefItem { - const char *prefName; // mozilla pref string name - MozPrefValue defaultValue; // store the mozilla default value - PRBool isLocked; // store the mozilla lock status + // Saved values on both branches + PRInt32 savedUserValueScalar; + char* savedUserValueString; + PRInt32 savedDefaultValueScalar; + char* savedDefaultValueString; + // When this is true, then the value was locked originally + PRPackedBool savedLocked; + // When this is true, then there was a user value + PRPackedBool savedUserPresent; + PRPackedBool ignore; + SysPrefItem() { - prefName = nsnull; - defaultValue.intVal = 0; - defaultValue.stringVal = nsnull; - defaultValue.boolVal = PR_FALSE; - isLocked = PR_FALSE; + savedUserValueScalar = 0; + savedUserValueString = nsnull; + savedDefaultValueScalar = 0; + savedDefaultValueString = nsnull; + savedUserPresent = PR_FALSE; + savedLocked = PR_FALSE; + ignore = PR_FALSE; } - void SetPrefName(const char *aPrefName) { - prefName = aPrefName; + + virtual ~SysPrefItem() { + nsMemory::Free(savedUserValueString); + nsMemory::Free(savedDefaultValueString); } }; -// all prefs that mozilla need to read from host system if they are available -static const char *sSysPrefList[] = { - "network.proxy.http", - "network.proxy.http_port", - "network.proxy.ftp", - "network.proxy.ftp_port", - "network.proxy.ssl", - "network.proxy.ssl_port", - "network.proxy.socks", - "network.proxy.socks_port", - "network.proxy.no_proxies_on", - "network.proxy.autoconfig_url", - "network.proxy.type", - "config.use_system_prefs.accessibility", -}; +static const char sSysPrefString[] = "config.use_system_prefs"; PRLogModuleInfo *gSysPrefLog = NULL; NS_IMPL_ISUPPORTS2(nsSystemPref, nsIObserver, nsISupportsWeakReference) -nsSystemPref::nsSystemPref(): - mSysPrefService(nsnull), - mEnabled(PR_FALSE), - mSysPrefs(nsnull) +nsSystemPref::nsSystemPref() : mIgnorePrefSetting(PR_FALSE) { + mSavedPrefs.Init(); + mCachedUserPrefBranch = nsnull; + mCachedDefaultPrefBranch = nsnull; } nsSystemPref::~nsSystemPref() { - mSysPrefService = nsnull; - mEnabled = PR_FALSE; - delete [] mSysPrefs; } /////////////////////////////////////////////////////////////////////////////// @@ -131,6 +126,54 @@ nsSystemPref::Init(void) return(rv); } +already_AddRefed<nsIPrefBranch2> +nsSystemPref::GetPrefUserBranch() +{ + if (mCachedUserPrefBranch) { + NS_ADDREF(mCachedUserPrefBranch); + return mCachedUserPrefBranch; + } + + nsresult rv; + nsCOMPtr<nsIPrefService> prefService = + do_GetService(NS_PREFSERVICE_CONTRACTID, &rv); + if (NS_FAILED(rv)) + return nsnull; + nsCOMPtr<nsIPrefBranch> prefBranch; + rv = prefService->GetBranch(nsnull, getter_AddRefs(prefBranch)); + if (NS_FAILED(rv)) + return nsnull; + nsCOMPtr<nsIPrefBranch2> pb2(do_QueryInterface(prefBranch)); + if (!pb2) + return nsnull; + + nsIPrefBranch2* result = nsnull; + pb2.swap(result); + return result; +} + +already_AddRefed<nsIPrefBranch> +nsSystemPref::GetPrefDefaultBranch() +{ + if (mCachedDefaultPrefBranch) { + NS_ADDREF(mCachedDefaultPrefBranch); + return mCachedDefaultPrefBranch; + } + + nsresult rv; + nsCOMPtr<nsIPrefService> prefService = + do_GetService(NS_PREFSERVICE_CONTRACTID, &rv); + if (NS_FAILED(rv)) + return nsnull; + nsCOMPtr<nsIPrefBranch> prefBranch; + rv = prefService->GetDefaultBranch(nsnull, getter_AddRefs(prefBranch)); + if (NS_FAILED(rv)) + return nsnull; + nsIPrefBranch* pb = nsnull; + prefBranch.swap(pb); + return pb; +} + /////////////////////////////////////////////////////////////////////////////// // nsSystemPref::Observe // Observe notifications from mozilla pref system and system prefs (if enabled) @@ -145,330 +188,446 @@ nsSystemPref::Observe(nsISupports *aSubject, if (!aTopic) return NS_OK; - // if we are notified by pref service - // check the system pref settings - if (!nsCRT::strcmp(aTopic, NS_PREFSERVICE_READ_TOPIC_ID)) { - SYSPREF_LOG(("Observed: %s\n", aTopic)); - - nsCOMPtr<nsIPrefBranch2> prefBranch = - do_GetService(NS_PREFSERVICE_CONTRACTID, &rv); - if (NS_FAILED(rv)) - return rv; + nsCOMPtr<nsIPrefBranch2> userBranch = GetPrefUserBranch(); + nsCOMPtr<nsIPrefBranch> defaultBranch = GetPrefDefaultBranch(); - rv = prefBranch->GetBoolPref(sSysPrefString, &mEnabled); + // Check the default branch first. If system prefs are enabled + // by default, then don't check the user prefs; we don't want + // to allow users to change the default. + PRBool defaultEnabled; + rv = defaultBranch->GetBoolPref(sSysPrefString, &defaultEnabled); + if (NS_FAILED(rv)) { + SYSPREF_LOG(("...Failed to Get %s\n", sSysPrefString)); + return rv; + } + PRBool enabled = defaultEnabled; + if (!enabled) { + rv = userBranch->GetBoolPref(sSysPrefString, &enabled); if (NS_FAILED(rv)) { - SYSPREF_LOG(("...FAil to Get %s\n", sSysPrefString)); + SYSPREF_LOG(("...Failed to Get %s\n", sSysPrefString)); return rv; } + } - // if there is no system pref service, assume nothing happen to us - mSysPrefService = do_GetService(NS_SYSTEMPREF_SERVICE_CONTRACTID, &rv); - if (NS_FAILED(rv) || !mSysPrefService) { - SYSPREF_LOG(("...No System Pref Service\n")); - return NS_OK; - } + if (!nsCRT::strcmp(aTopic, NS_PREFSERVICE_READ_TOPIC_ID)) { + // The prefs have just loaded. This is the first thing that + // happens to us. + SYSPREF_LOG(("Observed: %s\n", aTopic)); - // listen on its changes - rv = prefBranch->AddObserver(sSysPrefString, this, PR_TRUE); + // listen on changes to use_system_pref. It's OK to + // hold a strong reference because we don't keep a reference + // to the pref branch. + rv = userBranch->AddObserver(sSysPrefString, this, PR_TRUE); if (NS_FAILED(rv)) { - SYSPREF_LOG(("...FAil to add observer for %s\n", sSysPrefString)); + SYSPREF_LOG(("...Failed to add observer for %s\n", sSysPrefString)); return rv; } - if (!mEnabled) { - SYSPREF_LOG(("%s is disabled\n", sSysPrefString)); + NS_ASSERTION(!mSysPrefService, "Should not be already enabled"); + if (!enabled) { + // Don't load the system pref service if the preference is + // not set. return NS_OK; } - SYSPREF_LOG(("%s is enabled\n", sSysPrefString)); - rv = UseSystemPrefs(); - } - // sSysPrefString value was changed, update ... - else if (!nsCRT::strcmp(aTopic, NS_PREFBRANCH_PREFCHANGE_TOPIC_ID) && - NS_ConvertUTF8toUCS2(sSysPrefString).Equals(aData)) { - SYSPREF_LOG(("++++++ Notify: topic=%s data=%s\n", - aTopic, NS_ConvertUCS2toUTF8(aData).get())); + SYSPREF_LOG(("%s is enabled\n", sSysPrefString)); - nsCOMPtr<nsIPrefBranch> prefBranch = - do_GetService(NS_PREFSERVICE_CONTRACTID, &rv); + rv = LoadSystemPrefs(); if (NS_FAILED(rv)) return rv; - PRBool enabled = mEnabled; - rv = prefBranch->GetBoolPref(sSysPrefString, &mEnabled); - if (enabled != mEnabled) { - if (mEnabled) - //read prefs from system - rv = UseSystemPrefs(); - else - //roll back to mozilla prefs - rv = UseMozillaPrefs(); + // Lock config.use_system_prefs so the user can't undo + // it. But only do this if it was set by in the default prefs; + // if it was not set by default, then locking it would actually + // unset the value! And the user should be allowed to turn off + // something they set themselves. + if (NS_SUCCEEDED(rv) && defaultEnabled) { + userBranch->LockPref(sSysPrefString); } } - // if the system pref notify us that some pref has been changed by user - // outside mozilla. We need to read it again. - else if (!nsCRT::strcmp(aTopic, NS_SYSTEMPREF_PREFCHANGE_TOPIC_ID) && - aData) { - NS_ASSERTION(mEnabled == PR_TRUE, "Should not listen when disabled"); - SYSPREF_LOG(("====== System Pref Notify topic=%s data=%s\n", - aTopic, (char*)aData)); - rv = ReadSystemPref(NS_LossyConvertUCS2toASCII(aData).get()); - return NS_OK; - } else if (!nsCRT::strcmp(aTopic,"profile-before-change")) { - //roll back to mozilla prefs - if (mEnabled) - UseMozillaPrefs(); - mEnabled = PR_FALSE; - mSysPrefService = nsnull; - delete [] mSysPrefs; - mSysPrefs = nsnull; - } else - SYSPREF_LOG(("Not needed topic Received %s\n", aTopic)); - return rv; -} + if (!nsCRT::strcmp(aTopic, NS_PREFBRANCH_PREFCHANGE_TOPIC_ID) && + nsDependentString(aData).EqualsASCII(sSysPrefString)) { + // sSysPrefString value was changed, update... + SYSPREF_LOG(("++++++ Notify: topic=%s data=%s\n", + aTopic, NS_ConvertUCS2toUTF8(aData).get())); + if (mSysPrefService && !enabled) + return RestoreMozillaPrefs(); + if (!mSysPrefService && enabled) { + // Don't lock it. If the user enabled use_system_prefs, + // they should be allowed to unlock it. + return LoadSystemPrefs(); + } -/* private */ + // didn't change? + return NS_OK; + } -//////////////////////////////////////////////////////////////// -// nsSystemPref::UseSystemPrefs -// Read all the prefs in the table from system, listen for their -// changes in system pref service. -//////////////////////////////////////////////////////////////// -nsresult -nsSystemPref::UseSystemPrefs() -{ - SYSPREF_LOG(("\n====Now Use system prefs==\n")); - nsresult rv = NS_OK; - if (!mSysPrefService) { - return NS_ERROR_FAILURE; + if (!nsCRT::strcmp(aTopic, NS_PREFBRANCH_PREFCHANGE_TOPIC_ID)) { + // some other pref changed, tell the backend if there is one + if (mSysPrefService && !mIgnorePrefSetting) { + NS_LossyConvertUTF16toASCII tmp(aData); +#ifdef DEBUG + PRBool isLocked; + userBranch->PrefIsLocked(tmp.get(), &isLocked); + NS_ASSERTION(!isLocked, "Locked pref is changing?"); +#endif + SysPrefItem* item; + if (!mSavedPrefs.Get(tmp, &item)) { + NS_ERROR("Notified about pref change that we didn't ask about?"); + } else { + if (!item->ignore) { + mSysPrefService->NotifyMozillaPrefChanged(tmp.get()); + } + } + } + return NS_OK; } - PRIntn sysPrefCount= sizeof(sSysPrefList) / sizeof(sSysPrefList[0]); + if (!nsCRT::strcmp(aTopic,"profile-before-change")) + return RestoreMozillaPrefs(); - if (!mSysPrefs) { - mSysPrefs = new SysPrefItem[sysPrefCount]; - if (!mSysPrefs) - return NS_ERROR_OUT_OF_MEMORY; - for (PRIntn index = 0; index < sysPrefCount; ++index) - mSysPrefs[index].SetPrefName(sSysPrefList[index]); - } + SYSPREF_LOG(("Not needed topic Received %s\n", aTopic)); - for (PRIntn index = 0; index < sysPrefCount; ++index) { - // save mozilla prefs - SaveMozDefaultPref(mSysPrefs[index].prefName, - &mSysPrefs[index].defaultValue, - &mSysPrefs[index].isLocked); - - // get the system prefs - ReadSystemPref(mSysPrefs[index].prefName); - SYSPREF_LOG(("Add Listener on %s\n", mSysPrefs[index].prefName)); - mSysPrefService->AddObserver(mSysPrefs[index].prefName, - this, PR_TRUE); - } return rv; } -////////////////////////////////////////////////////////////////////// -// nsSystemPref::ReadSystemPref -// Read a pref value from system pref service, and lock it in mozilla. -////////////////////////////////////////////////////////////////////// nsresult -nsSystemPref::ReadSystemPref(const char *aPrefName) +nsSystemPref::SetOverridingMozillaBoolPref(const char* aPrefName, + PRBool aValue, PRBool aLock, PRBool aPresent) { - if (!mSysPrefService) - return NS_ERROR_FAILURE; - nsresult rv; - - nsCOMPtr<nsIPrefBranch> prefBranch - (do_GetService(NS_PREFSERVICE_CONTRACTID, &rv)); - if (NS_FAILED(rv)) - return rv; - - SYSPREF_LOG(("about to read aPrefName %s\n", aPrefName)); + return OverridePref(aPrefName, nsIPrefBranch::PREF_BOOL, + (void*)aValue, aLock, aPresent); +} - prefBranch->UnlockPref(aPrefName); +nsresult +nsSystemPref::SetOverridingMozillaIntPref(const char* aPrefName, + PRInt32 aValue, PRBool aLock, PRBool aPresent) +{ + return OverridePref(aPrefName, nsIPrefBranch::PREF_INT, + (void*)aValue, aLock, aPresent); +} - PRInt32 prefType = nsIPrefBranch::PREF_INVALID; - nsXPIDLCString strValue; - PRInt32 intValue = 0; - PRBool boolValue = PR_FALSE; +nsresult +nsSystemPref::SetOverridingMozillaStringPref(const char* aPrefName, + const char* aValue, PRBool aLock, PRBool aPresent) +{ + return OverridePref(aPrefName, nsIPrefBranch::PREF_STRING, + (void*)aValue, aLock, aPresent); +} - rv = prefBranch->GetPrefType(aPrefName, &prefType); - if (NS_FAILED(rv)) - return rv; - switch (prefType) { +static nsresult RestorePrefValue(PRInt32 aPrefType, + const char* aPrefName, + SysPrefItem* aItem, + nsIPrefBranch* aUser, + nsIPrefBranch* aDefault) +{ + switch (aPrefType) { case nsIPrefBranch::PREF_STRING: - mSysPrefService->GetCharPref(aPrefName, getter_Copies(strValue)); - SYSPREF_LOG(("system value is %s\n", strValue.get())); - - prefBranch->SetCharPref(aPrefName, strValue.get()); + aDefault->SetCharPref(aPrefName, + aItem->savedDefaultValueString); + if (aItem->savedUserPresent) { + aUser->SetCharPref(aPrefName, aItem->savedUserValueString); + } break; case nsIPrefBranch::PREF_INT: - mSysPrefService->GetIntPref(aPrefName, &intValue); - SYSPREF_LOG(("system value is %d\n", intValue)); - - prefBranch->SetIntPref(aPrefName, intValue); + aDefault->SetIntPref(aPrefName, aItem->savedDefaultValueScalar); + if (aItem->savedUserPresent) { + aUser->SetIntPref(aPrefName, aItem->savedUserValueScalar); + } break; case nsIPrefBranch::PREF_BOOL: - mSysPrefService->GetBoolPref(aPrefName, &boolValue); - SYSPREF_LOG(("system value is %s\n", boolValue ? "TRUE" : "FALSE")); - - prefBranch->SetBoolPref(aPrefName, boolValue); + aDefault->SetBoolPref(aPrefName, aItem->savedDefaultValueScalar); + if (aItem->savedUserPresent) { + aUser->SetBoolPref(aPrefName, aItem->savedUserValueScalar); + } break; default: - SYSPREF_LOG(("Fail to system value for it\n")); + NS_ERROR("Unknown preference type"); return NS_ERROR_FAILURE; } - prefBranch->LockPref(aPrefName); + + if (!aItem->savedUserPresent) { + aUser->DeleteBranch(aPrefName); + } + return NS_OK; } -////////////////////////////////////////////////////////////////////// -// nsSystemPref::UseMozillaPrefs -// Restore mozilla default prefs, remove system pref listeners -///////////////////////////////////////////////////////////////////// -nsresult -nsSystemPref::UseMozillaPrefs() +static PLDHashOperator PR_CALLBACK RestorePref(const nsACString& aKey, + SysPrefItem* aItem, + void* aClosure) { - nsresult rv = NS_OK; - SYSPREF_LOG(("\n====Now rollback to Mozilla prefs==\n")); + nsSystemPref* prefs = NS_STATIC_CAST(nsSystemPref*, aClosure); + nsCOMPtr<nsIPrefBranch2> userBranch = prefs->GetPrefUserBranch(); + const nsCString& prefName = PromiseFlatCString(aKey); + + PRInt32 prefType = nsIPrefBranch::PREF_INVALID; + nsresult rv = userBranch->GetPrefType(prefName.get(), &prefType); + if (NS_FAILED(rv)) + return PL_DHASH_NEXT; + PRBool isLocked; + userBranch->PrefIsLocked(prefName.get(), &isLocked); + if (NS_FAILED(rv)) + return PL_DHASH_NEXT; + + // Remove our observer before we change the value + userBranch->RemoveObserver(prefName.get(), prefs); + // Remember to ignore this item. Because some prefs start with "config.use_system_prefs", + // which we always observe, even after we remove the observer, changes to the pref will + // still be observed by us. We must ignore them. + aItem->ignore = PR_TRUE; + + // Unlock the pref so we can set it + if (isLocked) { + userBranch->UnlockPref(prefName.get()); + } - // if we did not use system prefs, do nothing - if (!mSysPrefService) - return NS_OK; + nsCOMPtr<nsIPrefBranch> defaultBranch = prefs->GetPrefDefaultBranch(); - PRIntn sysPrefCount= sizeof(sSysPrefList) / sizeof(sSysPrefList[0]); - for (PRIntn index = 0; index < sysPrefCount; ++index) { - // restore mozilla default value and free string memory if needed - RestoreMozDefaultPref(mSysPrefs[index].prefName, - &mSysPrefs[index].defaultValue, - mSysPrefs[index].isLocked); - SYSPREF_LOG(("stop listening on %s\n", mSysPrefs[index].prefName)); - mSysPrefService->RemoveObserver(mSysPrefs[index].prefName, - this); + RestorePrefValue(prefType, prefName.get(), aItem, + userBranch, defaultBranch); + + if (aItem->savedLocked) { + userBranch->LockPref(prefName.get()); } - return rv; + + return PL_DHASH_NEXT; } -//////////////////////////////////////////////////////////////////////////// -// nsSystemPref::RestoreMozDefaultPref -// Save the saved mozilla default value. -// It is also responsible for allocate the string memory when needed, because -// this method know what type of value is stored. -///////////////////////////////////////////////////////////////////////////// nsresult -nsSystemPref::SaveMozDefaultPref(const char *aPrefName, - MozPrefValue *aPrefValue, - PRBool *aLocked) +nsSystemPref::StopOverridingMozillaPref(const char* aPrefName) { - NS_ENSURE_ARG_POINTER(aPrefName); - NS_ENSURE_ARG_POINTER(aPrefValue); - NS_ENSURE_ARG_POINTER(aLocked); - - nsresult rv; + SysPrefItem* item; + nsDependentCString prefNameStr(aPrefName); + if (!mSavedPrefs.Get(prefNameStr, &item)) + return NS_OK; - nsCOMPtr<nsIPrefBranch> prefBranch = - do_GetService(NS_PREFSERVICE_CONTRACTID, &rv); - if (NS_FAILED(rv)) - return rv; + RestorePref(prefNameStr, item, this); + mSavedPrefs.Remove(prefNameStr); + delete item; + return NS_OK; +} - SYSPREF_LOG(("Save Mozilla value for %s\n", aPrefName)); +/* private */ +nsresult +nsSystemPref::OverridePref(const char* aPrefName, PRInt32 aType, + void* aValue, PRBool aLock, PRBool aPresent) +{ + nsCOMPtr<nsIPrefBranch2> userBranch = GetPrefUserBranch(); + nsCOMPtr<nsIPrefBranch> defaultBranch = GetPrefDefaultBranch(); PRInt32 prefType = nsIPrefBranch::PREF_INVALID; - nsXPIDLCString strValue; + nsresult rv = userBranch->GetPrefType(aPrefName, &prefType); + if (NS_FAILED(rv)) + return rv; - rv = prefBranch->GetPrefType(aPrefName, &prefType); + PRBool isLocked; + rv = userBranch->PrefIsLocked(aPrefName, &isLocked); + if (NS_FAILED(rv)) + return rv; + PRBool hasUserValue; + rv = userBranch->PrefHasUserValue(aPrefName, &hasUserValue); if (NS_FAILED(rv)) return rv; - switch (prefType) { - case nsIPrefBranch::PREF_STRING: - prefBranch->GetCharPref(aPrefName, - getter_Copies(strValue)); - SYSPREF_LOG(("Mozilla value is %s", strValue.get())); - if (aPrefValue->stringVal) - PL_strfree(aPrefValue->stringVal); - aPrefValue->stringVal = PL_strdup(strValue.get()); - break; - case nsIPrefBranch::PREF_INT: - prefBranch->GetIntPref(aPrefName, &aPrefValue->intVal); - SYSPREF_LOG(("Mozilla value is %d\n", aPrefValue->intVal)); + if (prefType == 0) { + // Preference does not exist. Allow the system prefs to + // set it. + } else { + NS_ASSERTION(aType == prefType, + "System pref engine passed incorrect type for Mozilla pref"); + if (aType != prefType) + return NS_ERROR_FAILURE; + } - break; - case nsIPrefBranch::PREF_BOOL: - prefBranch->GetBoolPref(aPrefName, &aPrefValue->boolVal); - SYSPREF_LOG(("Mozilla value is %s\n", - aPrefValue->boolVal ? "TRUE" : "FALSE")); + if (prefType != 0) { + nsDependentCString prefNameStr(aPrefName); + SysPrefItem* item = nsnull; + if (!mSavedPrefs.Get(prefNameStr, &item)) { + // Need to save the existing value away + item = new SysPrefItem(); + if (!item) + return NS_ERROR_OUT_OF_MEMORY; + + item->savedLocked = isLocked; + item->savedUserPresent = hasUserValue; + + switch (prefType) { + case nsIPrefBranch::PREF_STRING: + if (hasUserValue) { + userBranch->GetCharPref(aPrefName, &item->savedUserValueString); + } + defaultBranch->GetCharPref(aPrefName, &item->savedDefaultValueString); + break; + case nsIPrefBranch::PREF_INT: + if (hasUserValue) { + userBranch->GetIntPref(aPrefName, &item->savedUserValueScalar); + } + defaultBranch->GetIntPref(aPrefName, &item->savedDefaultValueScalar); + break; + case nsIPrefBranch::PREF_BOOL: + if (hasUserValue) { + userBranch->GetBoolPref(aPrefName, &item->savedUserValueScalar); + } + defaultBranch->GetBoolPref(aPrefName, &item->savedDefaultValueScalar); + break; + default: + NS_ERROR("Unknown preference type"); + delete item; + return NS_ERROR_FAILURE; + } + + mSavedPrefs.Put(prefNameStr, item); + + // Watch the user value in case it changes on the Mozilla side + // If 'aLock' is true then it shouldn't change and we don't + // need the observer, but don't bother optimizing for that. + userBranch->AddObserver(aPrefName, this, PR_TRUE); + } else { + if (isLocked != aLock) { + // restore pref value on user and default branches + RestorePrefValue(prefType, aPrefName, item, + userBranch, defaultBranch); + } + } + } - break; - default: - SYSPREF_LOG(("Fail to Read Mozilla value for it\n")); - return NS_ERROR_FAILURE; + // We need to ignore pref changes due to our own calls here + mIgnorePrefSetting = PR_TRUE; + + // Unlock it if it's locked, so we can set it + if (isLocked) { + rv = userBranch->UnlockPref(aPrefName); + if (NS_FAILED(rv)) + return rv; } - rv = prefBranch->PrefIsLocked(aPrefName, aLocked); - SYSPREF_LOG((" (%s).\n", aLocked ? "Locked" : "NOT Locked")); + + // Set the pref on the default branch if we're locking it, because + // only the default branch gets used when the pref is locked. + // Set the pref on the user branch if we're not locking it, because + // that's where the user change will go. + nsIPrefBranch* settingBranch = + aLock ? defaultBranch.get() : NS_STATIC_CAST(nsIPrefBranch*, userBranch.get()); + + if (!aPresent) { + rv = settingBranch->DeleteBranch(aPrefName); + } else { + switch (aType) { + case nsIPrefBranch::PREF_STRING: + rv = settingBranch->SetCharPref(aPrefName, (const char*)aValue); + break; + case nsIPrefBranch::PREF_INT: + rv = settingBranch->SetIntPref(aPrefName, (PRInt32)(NS_PTR_TO_INT32(aValue))); + break; + case nsIPrefBranch::PREF_BOOL: + rv = settingBranch->SetBoolPref(aPrefName, (PRBool)(NS_PTR_TO_INT32(aValue))); + break; + default: + NS_ERROR("Unknown preference type"); + mIgnorePrefSetting = PR_FALSE; + return NS_ERROR_FAILURE; + } + } + if (NS_FAILED(rv)) + return rv; + if (aLock) { + rv = userBranch->LockPref(aPrefName); + } + + mIgnorePrefSetting = PR_FALSE; return rv; } -//////////////////////////////////////////////////////////////////////////// -// nsSystemPref::RestoreMozDefaultPref -// Restore the saved mozilla default value to pref service. -// It is also responsible for free the string memory when needed, because -// this method know what type of value is stored. -///////////////////////////////////////////////////////////////////////////// nsresult -nsSystemPref::RestoreMozDefaultPref(const char *aPrefName, - MozPrefValue *aPrefValue, - PRBool aLocked) +nsSystemPref::FixupLockdownPrefs() { - NS_ENSURE_ARG_POINTER(aPrefName); - - nsresult rv; - - nsCOMPtr<nsIPrefBranch> prefBranch = - do_GetService(NS_PREFSERVICE_CONTRACTID, &rv); + nsCOMPtr<nsIPrefBranch2> userPrefs = GetPrefUserBranch(); + nsCOMPtr<nsIPrefBranch2> defaultPrefs = GetPrefUserBranch(); + PRUint32 childCount; + char **childArray = nsnull; + nsresult rv = userPrefs->GetChildList("config.lockdown.", + &childCount, &childArray); if (NS_FAILED(rv)) return rv; + for (PRUint32 i = 0; i < childCount; ++i) { + PRInt32 type; + rv = defaultPrefs->GetPrefType(childArray[i], &type); + if (NS_FAILED(rv)) + return rv; + NS_ASSERTION(type == nsIPrefBranch2::PREF_BOOL, + "All config.lockdown.* prefs should be boolean"); + if (type == nsIPrefBranch2::PREF_BOOL) { + rv = defaultPrefs->SetBoolPref(childArray[i], PR_FALSE); + if (NS_FAILED(rv)) + return rv; + } + } + NS_FREE_XPCOM_ALLOCATED_POINTER_ARRAY(childCount, childArray); + return NS_OK; +} - SYSPREF_LOG(("Restore Mozilla value for %s\n", aPrefName)); +nsresult +nsSystemPref::LoadSystemPrefs() +{ + SYSPREF_LOG(("\n====Now Use system prefs==\n")); + NS_ASSERTION(!mSysPrefService, + "Shouldn't have the pref service here"); + nsresult rv; + mSysPrefService = do_GetService(NS_SYSTEMPREF_SERVICE_CONTRACTID, &rv); + if (NS_FAILED(rv) || !mSysPrefService) { + FixupLockdownPrefs(); + SYSPREF_LOG(("...No System Pref Service\n")); + return NS_OK; + } - PRInt32 prefType = nsIPrefBranch::PREF_INVALID; - rv = prefBranch->GetPrefType(aPrefName, &prefType); - if (NS_FAILED(rv)) - return rv; + // Cache the pref-branch while we load up the system prefs. + NS_ASSERTION(!mCachedUserPrefBranch, + "Shouldn't have a cache here"); + nsCOMPtr<nsIPrefBranch2> userBranch = GetPrefUserBranch(); + nsCOMPtr<nsIPrefBranch> defaultBranch = GetPrefDefaultBranch(); + mCachedDefaultPrefBranch = defaultBranch; + mCachedUserPrefBranch = userBranch; + rv = mSysPrefService->LoadSystemPreferences(this); + mCachedDefaultPrefBranch = nsnull; + mCachedUserPrefBranch = nsnull; + + if (NS_FAILED(rv)) { + // Restore all modified preferences to their original values + mSavedPrefs.EnumerateRead(RestorePref, this); + mSavedPrefs.Clear(); + mSysPrefService = nsnull; + } + + return rv; +} - // unlock, if it is locked - prefBranch->UnlockPref(aPrefName); +nsresult +nsSystemPref::RestoreMozillaPrefs() +{ + SYSPREF_LOG(("\n====Now rollback to Mozilla prefs==\n")); - switch (prefType) { - case nsIPrefBranch::PREF_STRING: - prefBranch->SetCharPref(aPrefName, - aPrefValue->stringVal); - SYSPREF_LOG(("Mozilla value is %s\n", aPrefValue->stringVal)); + NS_ASSERTION(mSysPrefService, + "Should have the pref service here"); + if (!mSysPrefService) + return NS_ERROR_FAILURE; - PL_strfree(aPrefValue->stringVal); - aPrefValue->stringVal = nsnull; + nsCOMPtr<nsIPrefBranch2> userBranch = GetPrefUserBranch(); + nsCOMPtr<nsIPrefBranch> defaultBranch = GetPrefDefaultBranch(); + mCachedDefaultPrefBranch = defaultBranch; + mCachedUserPrefBranch = userBranch; - break; - case nsIPrefBranch::PREF_INT: - prefBranch->SetIntPref(aPrefName, aPrefValue->intVal); - SYSPREF_LOG(("Mozilla value is %d\n", aPrefValue->intVal)); + mSysPrefService->NotifyUnloadSystemPreferences(); + // Restore all modified preferences to their original values + mSavedPrefs.EnumerateRead(RestorePref, this); + mSavedPrefs.Clear(); - break; - case nsIPrefBranch::PREF_BOOL: - prefBranch->SetBoolPref(aPrefName, aPrefValue->boolVal); - SYSPREF_LOG(("Mozilla value is %s\n", - aPrefValue->boolVal ? "TRUE" : "FALSE")); + mCachedDefaultPrefBranch = nsnull; + mCachedUserPrefBranch = nsnull; + + mSysPrefService = nsnull; - break; - default: - SYSPREF_LOG(("Fail to Restore Mozilla value for it\n")); - return NS_ERROR_FAILURE; - } + FixupLockdownPrefs(); - // restore its old lock status - if (aLocked) - prefBranch->LockPref(aPrefName); return NS_OK; } diff --git a/mozilla/extensions/pref/system-pref/src/nsSystemPref.h b/mozilla/extensions/pref/system-pref/src/nsSystemPref.h index 9bc3e87..7a069ab 100644 --- a/mozilla/extensions/pref/system-pref/src/nsSystemPref.h +++ b/mozilla/extensions/pref/system-pref/src/nsSystemPref.h @@ -23,7 +23,7 @@ * * Original Author: Bolian Yin (bolian.yin@sun.com) * - * Contributor(s): + * Contributor(s): Robert O'Callahan/Novell (rocallahan@novell.com) * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or @@ -45,16 +45,14 @@ #include "nsCOMPtr.h" #include "nsXPCOM.h" #include "nsCRT.h" -#include "nsIAppStartupNotifier.h" -#include "nsICategoryManager.h" -#include "nsIServiceManager.h" #include "nsWeakReference.h" -#include "nsIPrefService.h" -#include "nsIPrefBranch2.h" +#include "nsClassHashtable.h" +#include "nsHashKeys.h" +#include "nsMemory.h" -#include <nsIObserver.h> +#include "nsISystemPrefService.h" +#include "nsIObserver.h" -union MozPrefValue; struct SysPrefItem; ////////////////////////////////////////////////////////////////////////// @@ -62,18 +60,34 @@ struct SysPrefItem; // nsSystemPref, as an extension of mozilla pref service, reads some mozilla // prefs from host system when the feature is enabled ("config.system-pref"). // -// nsSystemPref listens on NS_PREFSERVICE_READ_TOPIC_ID. When notified, -// nsSystemPref will start the nsSystemPrefService (platform specific) to -// read all the interested prefs (listed in sSysPrefList table) from system -// and lock these prefs from user's modification. +// nsSystemPref listens on NS_PREFSERVICE_READ_TOPIC_ID. When +// notified, nsSystemPref will start the nsSystemPrefService (platform +// specific) and tell it to override Mozilla prefs with its own +// settings. +// +// When overriding a Mozilla preference the prefservice can request the +// pref be locked or unlocked. If the pref is locked then we set the default +// value and lock it in Mozilla so the user value is ignored and the user cannot +// change the value. If the pref is unlocked then we set the user value +// and unlock it in Mozilla so the user can change it. If the user changes it, +// then the prefservice is notified so it can copy the value back to its +// underlying store. +// +// We detect changes to Mozilla prefs by observing pref changes in the +// user branch. +// +// For testing purposes, if the user toggles on +// config.use_system_prefs then we save the current preferences before +// overriding them from gconf, and if the user toggles off +// config.use_system_prefs *in the same session* then we restore the +// preferences. If the user exits without turning off use_system_prefs +// then the saved values are lost and the new values are permanent. // -// This feature will make mozilla integrated better into host platforms. If -// users want to change the prefs read from system, the system provided pref -// editor (i.e. gconf-editor in gnome) should be used. ////////////////////////////////////////////////////////////////////////// class nsSystemPref : public nsIObserver, - public nsSupportsWeakReference + public nsSupportsWeakReference, + public nsISystemPref { public: NS_DECL_ISUPPORTS @@ -83,23 +97,39 @@ public: virtual ~nsSystemPref(); nsresult Init(void); + // nsISystemPref + virtual nsresult SetOverridingMozillaBoolPref(const char* aPrefName, + PRBool aValue, PRBool aLocked, + PRBool aPresent = PR_TRUE); + virtual nsresult SetOverridingMozillaIntPref(const char* aPrefName, + PRInt32 aValue, PRBool aLocked, + PRBool aPresent = PR_TRUE); + virtual nsresult SetOverridingMozillaStringPref(const char* aPrefName, + const char* aValue, PRBool aLocked, + PRBool aPresent = PR_TRUE); + virtual nsresult StopOverridingMozillaPref(const char* aPrefName); + virtual already_AddRefed<nsIPrefBranch2> GetPrefUserBranch(); + virtual already_AddRefed<nsIPrefBranch> GetPrefDefaultBranch(); + private: - // funcs used to load system prefs and save mozilla default prefs - nsresult UseSystemPrefs(); - nsresult ReadSystemPref(const char *aPrefName); - nsresult SaveMozDefaultPref(const char *aPrefName, - MozPrefValue *aPrefVal, - PRBool *aLocked); - - // funcs used to load mozilla default prefs - nsresult UseMozillaPrefs(); - nsresult RestoreMozDefaultPref(const char *aPrefName, - MozPrefValue *aPrefVal, - PRBool aLocked); - - nsCOMPtr<nsIPrefBranch2> mSysPrefService; - PRBool mEnabled; // system pref is enabled or not - SysPrefItem *mSysPrefs; + // If we don't load the system prefs for any reason, then + // set all config.lockdown.* preferences to PR_FALSE so that + // residual lockdown settings are removed. + nsresult FixupLockdownPrefs(); + + nsresult LoadSystemPrefs(); + + nsresult RestoreMozillaPrefs(); + + nsresult OverridePref(const char* aPrefName, PRInt32 aType, + void* aValue, PRBool aLock, PRBool aPresent); + + nsCOMPtr<nsISystemPrefService> mSysPrefService; + nsClassHashtable<nsCStringHashKey,SysPrefItem> mSavedPrefs; + // weak pointers to cached prefbranches + nsIPrefBranch2* mCachedUserPrefBranch; + nsIPrefBranch* mCachedDefaultPrefBranch; + PRPackedBool mIgnorePrefSetting; }; #define NS_SYSTEMPREF_CID \ diff --git a/mozilla/extensions/pref/system-pref/src/nsSystemPrefFactory.cpp b/mozilla/extensions/pref/system-pref/src/nsSystemPrefFactory.cpp index 690d11b..98331fe 100644 --- a/mozilla/extensions/pref/system-pref/src/nsSystemPrefFactory.cpp +++ b/mozilla/extensions/pref/system-pref/src/nsSystemPrefFactory.cpp @@ -42,10 +42,10 @@ #include "nsICategoryManager.h" #include "nsIGenericFactory.h" #include "nsSystemPref.h" -#include "nsSystemPrefService.h" +#include "nsIServiceManager.h" +#include "nsIAppStartupNotifier.h" NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsSystemPref, Init) -NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsSystemPrefService, Init) // Registering nsSystemPref module as part of the app-startup category to get // it instantiated. @@ -96,11 +96,6 @@ static const nsModuleComponentInfo components[] = { RegisterSystemPref, UnRegisterSystemPref, }, - { NS_SYSTEMPREF_SERVICE_CLASSNAME, - NS_SYSTEMPREF_SERVICE_CID, - NS_SYSTEMPREF_SERVICE_CONTRACTID, - nsSystemPrefServiceConstructor, - }, }; NS_IMPL_NSGETMODULE(nsSystemPrefModule, components)