Bug 381611 - Client pull script to checkout Tamarin/NSPR/NSS into the right dirs, and keep everything updated, r=luser
authorBenjamin Smedberg <benjamin@smedbergs.us>
Tue, 22 May 2007 16:07:17 -0400
changeset 847 52123bb691069bf3295e76bc02caf0b83723d689
parent 846 6100d773079af1e8bd0e929f62edbf207f3be758
child 848 a0b38e534c243ce8eb045b24202edba60b82714a
push id1
push userbsmedberg@mozilla.com
push dateThu, 20 Mar 2008 16:49:24 +0000
treeherderautoland@61007906a1f8 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersluser
bugs381611
milestone1.9a4pre
Bug 381611 - Client pull script to checkout Tamarin/NSPR/NSS into the right dirs, and keep everything updated, r=luser
client.mk
client.py
--- a/client.mk
+++ b/client.mk
@@ -35,529 +35,104 @@
 # 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 MPL, the GPL or the LGPL.
 #
 # ***** END LICENSE BLOCK *****
 
 # Build a mozilla application.
 #
-# To checkout and build a tree,
-#    1. cvs co mozilla/client.mk
+# To build a tree,
+#    1. hg clone ssh://hg.mozilla.org/mozilla-central mozilla
 #    2. cd mozilla
-#    3. create your .mozconfig file with
+#    3. python client.py checkout
+#    4. create your .mozconfig file with
 #       mk_add_options MOZ_CO_PROJECT=
 #         suite,browser
-#    4. gmake -f client.mk 
-#
-# This script will pick up the CVSROOT from the CVS/Root file. If you wish
-# to use a different CVSROOT, you must set CVSROOT in your environment:
-#
-#   export CVSROOT=:pserver:anonymous:anonymous@cvs-mirror.mozilla.org:/cvsroot
-#   export CVSROOT=:pserver:username%somedomain.org@cvs.mozilla.org:/cvsroot
-# 
-# You must specify which products/modules you wish to checkout, with
-#   MOZ_CO_PROJECT and MOZ_CO_MODULE variables.
-#
-#   MOZ_CO_PROJECT possibilities include the following:
-#     suite (Seamonkey suite)
-#     browser (aka Firefox)
-#     mail (aka Thunderbird)
-#     minimo (small browser for devices)
-#     composer (standalone composer, aka NVU)
-#     calendar (aka Sunbird, use this to build the calendar extensions also)
-#     xulrunner
-#     camino
-#     tamarin
-#
-# Other common MOZ_CO_MODULE options include the following:
-#   mozilla/other-licenses/libart_lgpl
-#   mozilla/other-licenses/bsdiff
-#   mozilla/tools/codesighs
+#    5. gmake -f client.mk 
 #
 # Other targets (gmake -f client.mk [targets...]),
-#    checkout
 #    build
 #    clean (realclean is now the same as clean)
 #    distclean
 #
 # See http://www.mozilla.org/build/ for more information.
 #
 # Options:
 #   MOZ_BUILD_PROJECTS   - Build multiple projects in subdirectories
 #                          of MOZ_OBJDIR
 #   MOZ_OBJDIR           - Destination object directory
-#   MOZ_CO_DATE          - Date tag to use for checkout (default: none)
-#   MOZ_CO_LOCALES_DATE  - Date tag to use for locale checkout
-#                          (default: MOZ_CO_DATE)
-#   MOZ_CO_MODULE        - Module to checkout
-#   MOZ_CVS_FLAGS        - Flags to pass cvs (default: -q -z3)
-#   MOZ_CO_FLAGS         - Flags to pass after 'cvs co' (default: -P)
 #   MOZ_MAKE_FLAGS       - Flags to pass to $(MAKE)
-#   MOZ_CO_LOCALES       - localizations to pull (MOZ_CO_LOCALES="de-DE,pt-BR")
-#   MOZ_LOCALE_DIRS      - directories which contain localizations
-#   LOCALES_CVSROOT      - CVSROOT to use to pull localizations
 #   MOZ_PREFLIGHT_ALL  } - Makefiles to run before any project in
 #   MOZ_PREFLIGHT      }   MOZ_BUILD_PROJECTS, before each project, after
 #   MOZ_POSTFLIGHT     }   each project, and after all projects; these
 #   MOZ_POSTFLIGHT_ALL }   variables contain space-separated lists
 #   MOZ_UNIFY_BDATE      - Set to use the same bdate for each project in
 #                          MOZ_BUILD_PROJECTS
 #
 
-AVAILABLE_PROJECTS = \
-  all \
-  suite \
-  toolkit \
-  browser \
-  mail \
-  minimo \
-  composer \
-  calendar \
-  xulrunner \
-  camino \
-  necko \
-  tamarin \
-  $(NULL)
-
-# Trailing / on top-level mozilla dir required to stop fast-update thinking
-# it is a module name.
-MODULES_NS_necko :=                             \
-  mozilla/                                      \
-  $(NULL)
-
-MODULES_necko :=                                \
-  mozilla/README                                \
-  mozilla/config                                \
-  mozilla/build                                 \
-  mozilla/intl                                  \
-  mozilla/modules/libpref                       \
-  mozilla/modules/zlib                          \
-  mozilla/netwerk                               \
-  mozilla/xpcom                                 \
-  mozilla/tools/test-harness                    \
-  $(NULL)
-
-MODULES_NS_core :=                              \
-  $(MODULES_NS_necko)                           \
-  mozilla/js                                    \
-  mozilla/js/src                                \
-  mozilla/js/jsd                                \
-  mozilla/db                                    \
-  $(NULL)
-
-MODULES_core :=                                 \
-  $(MODULES_necko)                              \
-  mozilla/caps                                  \
-  mozilla/content                               \
-  mozilla/db/mdb                                \
-  mozilla/db/mork                               \
-  mozilla/docshell                              \
-  mozilla/dom                                   \
-  mozilla/editor                                \
-  mozilla/embedding                             \
-  mozilla/extensions                            \
-  mozilla/gfx                                   \
-  mozilla/parser                                \
-  mozilla/layout                                \
-  mozilla/jpeg                                  \
-  mozilla/js/src/fdlibm                         \
-  mozilla/js/src/liveconnect                    \
-  mozilla/js/src/xpconnect                      \
-  mozilla/js/jsd/idl                            \
-  mozilla/modules/libimg                        \
-  mozilla/modules/libjar                        \
-  mozilla/modules/libpr0n                       \
-  mozilla/modules/libreg                        \
-  mozilla/modules/libutil                       \
-  mozilla/modules/oji                           \
-  mozilla/modules/plugin                        \
-  mozilla/modules/staticmod                     \
-  mozilla/plugin/oji                            \
-  mozilla/profile                               \
-  mozilla/rdf                                   \
-  mozilla/security/manager                      \
-  mozilla/sun-java                              \
-  mozilla/ipc/ipcd                              \
-  mozilla/modules/libpr0n                       \
-  mozilla/modules/libmar                        \
-  mozilla/modules/libbz2                        \
-  mozilla/accessible                            \
-  mozilla/other-licenses/atk-1.0                \
-  mozilla/other-licenses/ia2                    \
-  mozilla/security/manager                      \
-  mozilla/tools/elf-dynstr-gc                   \
-  mozilla/uriloader                             \
-  mozilla/view                                  \
-  mozilla/webshell                              \
-  mozilla/widget                                \
-  mozilla/xpfe                                  \
-  mozilla/xpinstall                             \
-  mozilla/toolkit                               \
-  mozilla/storage                               \
-  mozilla/db/sqlite3                            \
-  mozilla/db/morkreader                         \
-  mozilla/testing/mochitest                     \
-  $(NULL)
-
-LOCALES_necko :=                                \
-  netwerk                                       \
-  $(NULL)
-
-LOCALES_core :=                                 \
-  $(LOCALES_necko)                              \
-  dom                                           \
-  $(NULL)
-
-BOOTSTRAP_necko :=                              \
-  mozilla/browser/config/version.txt            \
-  mozilla/mail/config/version.txt               \
-  mozilla/calendar/sunbird/config/version.txt   \
-  mozilla/suite/config/version.txt              \
-  $(NULL)
-
-BOOTSTRAP_core :=                               \
-  $(BOOTSTRAP_necko)                            \
-  $(NULL)
-
-MODULES_NS_toolkit :=                           \
-  $(MODULES_NS_core)                            \
-  $(NULL)
-
-MODULES_toolkit :=                              \
-  $(MODULES_core)                               \
-  mozilla/chrome                                \
-  $(NULL)
-
-LOCALES_toolkit :=                              \
-  $(LOCALES_core)                               \
-  toolkit                                       \
-  security/manager                              \
-  $(NULL)
-
-BOOTSTRAP_toolkit :=                            \
-  $(BOOTSTRAP_core)                             \
-  $(NULL)
-
-MODULES_NS_suite :=                             \
-  $(MODULES_NS_toolkit)                         \
-  $(NULL)
-
-MODULES_suite :=                                \
-  $(MODULES_toolkit)                            \
-  mozilla/directory/xpcom                       \
-  mozilla/mailnews                              \
-  mozilla/themes                                \
-  mozilla/suite                                 \
-  $(NULL)
-
-LOCALES_suite :=                                \
-  $(LOCALES_toolkit)                            \
-  suite                                         \
-  editor/ui                                     \
-  extensions/reporter                           \
-  $(NULL)
-
-BOOTSTRAP_suite :=                              \
-  $(BOOTSTRAP_toolkit)                          \
-  $(NULL)
-
-MODULES_NS_browser :=                           \
-  $(MODULES_NS_toolkit)                         \
-  $(NULL)
-
-MODULES_browser :=                              \
-  $(MODULES_toolkit)                            \
-  mozilla/browser                               \
-  mozilla/other-licenses/branding/firefox       \
-  mozilla/other-licenses/7zstub/firefox         \
-  $(NULL)
-
-LOCALES_browser :=                              \
-  $(LOCALES_toolkit)                            \
-  browser                                       \
-  extensions/reporter                           \
-  extensions/spellcheck                         \
-  other-licenses/branding/firefox               \
-  $(NULL)
-
-BOOTSTRAP_browser :=                            \
-  $(BOOTSTRAP_toolkit)                          \
-  mozilla/browser/config/mozconfig              \
-  $(NULL)
-
-MODULES_NS_minimo :=                            \
-  $(MODULES_NS_toolkit)                         \
-  $(NULL)
-
-MODULES_minimo :=                               \
-  $(MODULES_toolkit)                            \
-  mozilla/minimo                                \
-  $(NULL)
-
-BOOTSTRAP_minimo :=                             \
-  $(BOOTSTRAP_toolkit)                          \
-  $(NULL)
-
-MODULES_NS_mail :=                              \
-  $(MODULES_NS_toolkit)                         \
-  $(NULL)
-
-MODULES_mail :=                                 \
-  $(MODULES_toolkit)                            \
-  mozilla/directory/xpcom                       \
-  mozilla/mailnews                              \
-  mozilla/mail                                  \
-  mozilla/other-licenses/branding/thunderbird   \
-  mozilla/other-licenses/7zstub/thunderbird     \
-  $(NULL)
-
-LOCALES_mail :=                                 \
-  $(LOCALES_toolkit)                            \
-  mail                                          \
-  other-licenses/branding/thunderbird           \
-  editor/ui                                     \
-  extensions/spellcheck                         \
-  $(NULL)
-
-BOOTSTRAP_mail :=                               \
-  $(BOOTSTRAP_toolkit)                          \
-  mozilla/mail/config/mozconfig                 \
-  $(NULL)
-
-MODULES_composer :=                             \
-  $(MODULES_toolkit)                            \
-  mozilla/composer                              \
-  $(NULL)
-
-MODULES_NS_calendar :=                          \
-  $(MODULES_NS_toolkit)                         \
-  $(NULL)
-
-MODULES_calendar :=                             \
-  $(MODULES_toolkit)                            \
-  mozilla/storage                               \
-  mozilla/db/sqlite3                            \
-  mozilla/calendar                              \
-  mozilla/other-licenses/branding/sunbird       \
-  mozilla/other-licenses/7zstub/sunbird         \
-  $(NULL)
-
-LOCALES_calendar :=                             \
-  $(LOCALES_toolkit)                            \
-  calendar                                      \
-  other-licenses/branding/sunbird               \
-  $(NULL)
-
-BOOTSTRAP_calendar :=                           \
-  $(BOOTSTRAP_toolkit)                          \
-  mozilla/calendar/sunbird/config/mozconfig     \
-  $(NULL)
-
-MODULES_NS_xulrunner :=                         \
-  $(MODULES_NS_toolkit)                         \
-  $(NULL)
-
-MODULES_xulrunner :=                            \
-  $(MODULES_toolkit)                            \
-  mozilla/xulrunner                             \
-  $(NULL)
-
-LOCALES_xulrunner :=                            \
-  $(LOCALES_toolkit)                            \
-  $(NULL)
-
-BOOTSTRAP_xulrunner :=                          \
-  $(BOOTSTRAP_toolkit)                          \
-  mozilla/xulrunner/config/mozconfig            \
-  $(NULL)
-
-MODULES_NS_camino :=                            \
-  $(MODULES_NS_toolkit)                         \
-  $(NULL)
-
-MODULES_camino :=                               \
-  $(MODULES_core)                               \
-  mozilla/camino                                \
-  mozilla/themes                                \
-  $(NULL)
-
-BOOTSTRAP_camino :=                             \
-  $(BOOTSTRAP_toolkit)                          \
-  mozilla/camino/config/mozconfig               \
-  $(NULL)
-
-MODULES_tamarin :=                              \
-  mozilla/js/tamarin                            \
-  mozilla/modules/zlib                          \
-  $(NULL)
-
-MODULES_all :=                                  \
-  mozilla/other-licenses/bsdiff                 \
-  mozilla/other-licenses/libart_lgpl            \
-  mozilla/tools/trace-malloc                    \
-  mozilla/tools/jprof                           \
-  mozilla/tools/codesighs                       \
-  mozilla/tools/update-packaging                \
-  $(NULL)
-
-#######################################################################
-# Checkout Tags
-#
-# For branches, uncomment the MOZ_CO_TAG line with the proper tag,
-# and commit this file on that tag.
-#MOZ_CO_TAG          = <tag>
-NSPR_CO_TAG          = NSPRPUB_PRE_4_2_CLIENT_BRANCH
-NSS_CO_TAG           = NSS_3_11_5_RTM
-LDAPCSDK_CO_TAG      = LDAPCSDK_6_0_3_CLIENT_BRANCH
-LOCALES_CO_TAG       =
-
 #######################################################################
 # Defines
 #
 CVS = cvs
 comma := ,
 
 CWD := $(shell pwd)
 ifneq (1,$(words $(CWD)))
 $(error The mozilla directory cannot be located in a path with spaces.)
 endif
 
 ifeq "$(CWD)" "/"
 CWD   := /.
 endif
 
-ifneq (, $(wildcard client.mk))
-# Ran from mozilla directory
-ROOTDIR   := $(shell dirname $(CWD))
-TOPSRCDIR := $(CWD)
-else
-# Ran from mozilla/.. directory (?)
-ROOTDIR   := $(CWD)
-TOPSRCDIR := $(CWD)/mozilla
+ifndef TOPSRCDIR
+ifeq (,$(wildcard client.mk))
+$(error Must run from the client.mk directory, or specify TOPSRCDIR)
+endif
+TOPSRCDIR = $(CWD)
 endif
 
-# on os2, TOPSRCDIR may have two forward slashes in a row, which doesn't
-#  work;  replace first instance with one forward slash
-TOPSRCDIR := $(shell echo "$(TOPSRCDIR)" | sed -e 's%//%/%')
-
-ifndef TOPSRCDIR_MOZ
-TOPSRCDIR_MOZ=$(TOPSRCDIR)
-endif
-
-# if ROOTDIR equals only drive letter (i.e. "C:"), set to "/"
-DIRNAME := $(shell echo "$(ROOTDIR)" | sed -e 's/^.://')
-ifeq ($(DIRNAME),)
-ROOTDIR := /.
-endif
-
-AUTOCONF := autoconf
+AUTOCONF := autoconf-2.13
 MKDIR := mkdir
 SH := /bin/sh
 ifndef MAKE
 MAKE := gmake
 endif
 PERL ?= perl
 
-CONFIG_GUESS_SCRIPT := $(wildcard $(TOPSRCDIR)/build/autoconf/config.guess)
-ifdef CONFIG_GUESS_SCRIPT
-  CONFIG_GUESS = $(shell $(CONFIG_GUESS_SCRIPT))
-else
-  _IS_FIRST_CHECKOUT := 1
-endif
+RUN_AUTOCONF_LOCALLY = 1
 
 ####################################
 # Sanity checks
 
 ifneq (,$(filter MINGW%,$(shell uname -s)))
 # check for CRLF line endings
 ifneq (0,$(shell $(PERL) -e 'binmode(STDIN); while (<STDIN>) { if (/\r/) { print "1"; exit } } print "0"' < $(TOPSRCDIR)/client.mk))
 $(error This source tree appears to have Windows-style line endings. To \
 convert it to Unix-style line endings, run \
 "python mozilla/build/win32/mozilla-dos2unix.py")
 endif
 endif
 
 ####################################
-# CVS
-
-# Add the CVS root to CVS_FLAGS if needed
-CVS_ROOT_IN_TREE := $(shell cat $(TOPSRCDIR)/CVS/Root 2>/dev/null)
-ifneq ($(CVS_ROOT_IN_TREE),)
-ifneq ($(CVS_ROOT_IN_TREE),$(CVSROOT))
-  CVS_FLAGS := -d $(CVS_ROOT_IN_TREE)
-endif
-endif
-
-CVS_CO_DATE_FLAGS = $(if $(MOZ_CO_DATE),-D "$(MOZ_CO_DATE)")
-CVS_CO_LOCALES_DATE_FLAGS = $(if $(MOZ_CO_LOCALES_DATE),-D "$(MOZ_CO_LOCALES_DATE)")
-CVSCO = $(CVS) $(CVS_FLAGS) co $(MOZ_CO_FLAGS) $(if $(MOZ_CO_TAG),-r $(MOZ_CO_TAG)) $(CVS_CO_DATE_FLAGS)
-
-MOZ_CO_LOCALES_DATE ?= $(MOZ_CO_DATE)
-
-CVSCO_LOGFILE := $(ROOTDIR)/cvsco.log
-CVSCO_LOGFILE := $(shell echo $(CVSCO_LOGFILE) | sed s%//%/%)
-
-# if LOCALES_CVSROOT is not specified, set it here
-# (and let mozconfig override it)
-LOCALES_CVSROOT ?= :pserver:anonymous:anonymous@cvs-mirror.mozilla.org:/l10n
-
-####################################
 # Load mozconfig Options
 
 # See build pages, http://www.mozilla.org/build/ for how to set up mozconfig.
 
-MOZCONFIG_LOADER := mozilla/build/autoconf/mozconfig2client-mk
-MOZCONFIG_FINDER := mozilla/build/autoconf/mozconfig-find 
-MOZCONFIG_MODULES := mozilla/build/unix/uniq.pl
-run_for_side_effects := \
-  $(shell cd $(ROOTDIR); \
-     if test "$(_IS_FIRST_CHECKOUT)"; then \
-        $(CVSCO) $(MOZCONFIG_FINDER) $(MOZCONFIG_LOADER) $(MOZCONFIG_MODULES); \
-     else true; \
-     fi; \
-     $(MOZCONFIG_LOADER) $(TOPSRCDIR) mozilla/.mozconfig.mk > mozilla/.mozconfig.out)
-include $(TOPSRCDIR)/.mozconfig.mk
+MOZCONFIG_LOADER := build/autoconf/mozconfig2client-mk
+MOZCONFIG_FINDER := build/autoconf/mozconfig-find 
+MOZCONFIG_MODULES := build/unix/uniq.pl
 
-####################################
-# Options that may come from mozconfig
-
-MOZ_PROJECT_LIST := $(subst $(comma), ,$(MOZ_CO_PROJECT))
-MOZ_PROJECT_LIST := $(subst macbrowser,camino,$(MOZ_PROJECT_LIST))
-
-ifneq (,$(filter-out $(AVAILABLE_PROJECTS),$(MOZ_PROJECT_LIST)))
-$(error MOZ_CO_PROJECT contains an unrecognized project.)
-endif
 
-ifeq (all,$(filter all,$(MOZ_PROJECT_LIST)))
-  MOZ_PROJECT_LIST := $(AVAILABLE_PROJECTS)
-endif
-
-MOZ_MODULE_LIST := $(subst $(comma), ,$(MOZ_CO_MODULE)) $(foreach project,$(MOZ_PROJECT_LIST),$(MODULES_$(project)))
-MOZ_MODULE_LIST_NS := $(foreach project,$(MOZ_PROJECT_LIST),$(MODULES_NS_$(project)))
-LOCALE_DIRS := $(MOZ_LOCALE_DIRS) $(foreach project,$(MOZ_PROJECT_LIST),$(LOCALES_$(project)))
-
-MOZCONFIG_MODULES += $(foreach project,$(MOZ_PROJECT_LIST),$(BOOTSTRAP_$(project)))
 
-# Using $(sort) here because it also removes duplicate entries.
-MOZ_MODULE_LIST := $(sort $(MOZ_MODULE_LIST))
-LOCALE_DIRS := $(sort $(LOCALE_DIRS))
-MOZCONFIG_MODULES := $(sort $(MOZCONFIG_MODULES))
+run_for_side_effects := \
+  $(shell $(TOPSRCDIR)/$(MOZCONFIG_LOADER) $(TOPSRCDIR) $(TOPSRCDIR)/.mozconfig.mk > $(TOPSRCDIR)/.mozconfig.out)
 
-# Change CVS flags if anonymous root is requested
-ifdef MOZ_CO_USE_MIRROR
-  CVS_FLAGS := -d :pserver:anonymous:anonymous@cvs-mirror.mozilla.org:/cvsroot
-endif
-
-# MOZ_CVS_FLAGS - Basic CVS flags
-ifeq "$(origin MOZ_CVS_FLAGS)" "undefined"
-  CVS_FLAGS := $(CVS_FLAGS) -q -z 3 
-else
-  CVS_FLAGS := $(MOZ_CVS_FLAGS)
-endif
+include $(TOPSRCDIR)/.mozconfig.mk
 
 ifdef MOZ_BUILD_PROJECTS
 
 ifndef MOZ_OBJDIR
   $(error When MOZ_BUILD_PROJECTS is set, you must set MOZ_OBJDIR)
 endif
 ifdef MOZ_CURRENT_PROJECT
   OBJDIR = $(MOZ_OBJDIR)/$(MOZ_CURRENT_PROJECT)
@@ -575,368 +150,42 @@ ifdef MOZ_OBJDIR
   MOZ_MAKE = $(MAKE) $(MOZ_MAKE_FLAGS) -C $(OBJDIR)
 else
   OBJDIR := $(TOPSRCDIR)
   MOZ_MAKE := $(MAKE) $(MOZ_MAKE_FLAGS)
 endif
 
 endif # MOZ_BUILD_PROJECTS
 
-####################################
-# CVS defines for NSS
-#
-NSS_CO_MODULE =               \
-		mozilla/dbm               \
-		mozilla/security/nss      \
-		mozilla/security/coreconf \
-		mozilla/security/dbm      \
-		$(NULL)
-
-NSS_CO_FLAGS := -P
-ifdef MOZ_CO_FLAGS
-  NSS_CO_FLAGS := $(MOZ_CO_FLAGS)
-endif
-NSS_CO_FLAGS := $(NSS_CO_FLAGS) $(if $(NSS_CO_TAG),-r $(NSS_CO_TAG),-A)
-
-# Can only pull the tip or branch tags by date
-ifeq (,$(filter-out HEAD %BRANCH,$(NSS_CO_TAG)))
-CVSCO_NSS = $(CVS) $(CVS_FLAGS) co $(NSS_CO_FLAGS) $(CVS_CO_DATE_FLAGS) $(NSS_CO_MODULE)
-else
-CVSCO_NSS = $(CVS) $(CVS_FLAGS) co $(NSS_CO_FLAGS) $(NSS_CO_MODULE)
-endif
-
-####################################
-# CVS defines for NSPR
-#
-NSPR_CO_MODULE = mozilla/nsprpub
-NSPR_CO_FLAGS := -P
-ifdef MOZ_CO_FLAGS
-  NSPR_CO_FLAGS := $(MOZ_CO_FLAGS)
-endif
-NSPR_CO_FLAGS := $(NSPR_CO_FLAGS) $(if $(NSPR_CO_TAG),-r $(NSPR_CO_TAG),-A)
-
-# Can only pull the tip or branch tags by date
-ifeq (,$(filter-out HEAD %BRANCH,$(NSPR_CO_TAG)))
-CVSCO_NSPR = $(CVS) $(CVS_FLAGS) co $(NSPR_CO_FLAGS) $(CVS_CO_DATE_FLAGS) $(NSPR_CO_MODULE)
-else
-CVSCO_NSPR = $(CVS) $(CVS_FLAGS) co $(NSPR_CO_FLAGS) $(NSPR_CO_MODULE)
-endif
-
-####################################
-# CVS defines for the C LDAP SDK
-#
-LDAPCSDK_CO_MODULE = mozilla/directory/c-sdk
-LDAPCSDK_CO_FLAGS := -P
-ifdef MOZ_CO_FLAGS
-  LDAPCSDK_CO_FLAGS := $(MOZ_CO_FLAGS)
-endif
-LDAPCSDK_CO_FLAGS := $(LDAPCSDK_CO_FLAGS) $(if $(LDAPCSDK_CO_TAG),-r $(LDAPCSDK_CO_TAG),-A)
-
-# Can only pull the tip or branch tags by date
-ifeq (,$(filter-out HEAD %BRANCH,$(LDAPCSDK_CO_TAG)))
-CVSCO_LDAPCSDK = $(CVS) $(CVS_FLAGS) co $(LDAPCSDK_CO_FLAGS) $(CVS_CO_DATE_FLAGS) $(LDAPCSDK_CO_MODULE)
-else
-CVSCO_LDAPCSDK = $(CVS) $(CVS_FLAGS) co $(LDAPCSDK_CO_FLAGS) $(LDAPCSDK_CO_MODULE)
-endif
-
-####################################
-# Error on obsolete variables.
-#
-
-ifdef MOZ_MAPINFO
-$(warning MOZ_MAPINFO is obsolete, use MOZ_CO_MODULE=mozilla/tools/codesighs instead.)
-MOZ_MODULE_LIST += mozilla/tools/codesighs
-endif
-ifdef MOZ_INTERNAL_LIBART_LGPL
-$(error MOZ_INTERNAL_LIBART_LGPL is obsolete, use MOZ_CO_MODULE=mozilla/other-licenses/libart_lgpl instead.)
-endif
-ifdef MOZ_PHOENIX
-$(warning MOZ_PHOENIX is obsolete.)
-MOZ_MODULE_LIST += $(MODULES_browser)
-# $(error MOZ_PHOENIX is obsolete, use MOZ_CO_PROJECT=browser and --enable-application=browser)
-endif
-ifdef MOZ_THUNDERBIRD
-$(warning MOZ_THUNDERBIRD is obsolete.)
-MOZ_MODULE_LIST += $(MODULES_mail)
-# $(error MOZ_THUNDERBIRD is obsolete, use MOZ_CO_PROJECT=mail and --enable-application=mail)
-endif
-
-###################################
-# Checkout main modules
-#
-
-# sort is used to remove duplicates.
-MOZ_MODULE_LIST := $(sort $(MOZ_MODULE_LIST))
-MOZ_MODULE_LIST_NS := $(sort $(MOZ_MODULE_LIST_NS))
-
-####################################
-# Suppress standalone modules if they're not needed.
-#
 CONFIGURES := $(TOPSRCDIR)/configure
-ifeq (,$(filter mozilla/xpcom,$(MOZ_MODULE_LIST)))
-  CVSCO_NSPR :=
-else
-  CONFIGURES += $(TOPSRCDIR)/nsprpub/configure
-endif
-
-ifeq (,$(filter mozilla/security/manager,$(MOZ_MODULE_LIST)))
-  CVSCO_NSS :=
-endif
-ifeq (,$(filter mozilla/directory/xpcom,$(MOZ_MODULE_LIST)))
-  CVSCO_LDAPCSDK :=
-else
-  CONFIGURES += $(TOPSRCDIR)/directory/c-sdk/configure
-endif
-
-MODULES_CO_FLAGS := -P
-ifdef MOZ_CO_FLAGS
-  MODULES_CO_FLAGS := $(MOZ_CO_FLAGS)
-endif
-MODULES_CO_FLAGS := $(MODULES_CO_FLAGS) $(if $(MOZ_CO_TAG),-r $(MOZ_CO_TAG),-A)
-
-CVSCO_MODULES_NS = $(CVS) $(CVS_FLAGS) co $(MODULES_CO_FLAGS) $(CVS_CO_DATE_FLAGS) -l $(MOZ_MODULE_LIST_NS)
-
-ifeq (,$(strip $(MOZ_MODULE_LIST)))
-FASTUPDATE_MODULES = $(error No modules or projects were specified. Use MOZ_CO_PROJECT to specify a project for checkout.)
-CHECKOUT_MODULES   = $(error No modules or projects were specified. Use MOZ_CO_PROJECT to specify a project for checkout.)
-else
-FASTUPDATE_MODULES := fast_update $(CVS) $(CVS_FLAGS) co $(MODULES_CO_FLAGS) $(CVS_CO_DATE_FLAGS) $(MOZ_MODULE_LIST)
-CHECKOUT_MODULES   := cvs_co $(CVS) $(CVS_FLAGS) co $(MODULES_CO_FLAGS) $(CVS_CO_DATE_FLAGS) $(MOZ_MODULE_LIST);
-endif
-ifeq (,$(MOZ_MODULE_LIST_NS))
-FASTUPDATE_MODULES_NS := true
-CHECKOUT_MODULES_NS   := true
-else
-FASTUPDATE_MODULES_NS := fast_update $(CVSCO_MODULES_NS)
-CHECKOUT_MODULES_NS   := cvs_co      $(CVSCO_MODULES_NS)
-endif
-
-###################################
-# CVS defines for locales
-#
-
-LOCALES_CO_FLAGS := -P
-ifdef MOZ_CO_FLAGS
-  LOCALES_CO_FLAGS := $(MOZ_CO_FLAGS)
-endif
-LOCALES_CO_FLAGS := $(LOCALES_CO_FLAGS) $(if $(LOCALES_CO_TAG),-r $(LOCALES_CO_TAG),-A)
-
-ifndef MOZ_CO_LOCALES
-FASTUPDATE_LOCALES := true
-CHECKOUT_LOCALES := true
-else
-
-override MOZ_CO_LOCALES := $(subst $(comma), ,$(MOZ_CO_LOCALES))
-
-ifeq (all,$(MOZ_CO_LOCALES))
-MOZCONFIG_MODULES += $(foreach project,$(MOZ_PROJECT_LIST),mozilla/$(project)/locales/all-locales)
-
-LOCALE_CO_DIRS := $(sort $(foreach project,$(MOZ_PROJECT_LIST),$(foreach locale,$(shell cat mozilla/$(project)/locales/all-locales),$(foreach dir,$(LOCALES_$(project)),l10n/$(locale)/$(dir)))))
-else # MOZ_CO_LOCALES != all
-LOCALE_CO_DIRS = $(sort $(foreach locale,$(MOZ_CO_LOCALES),$(foreach dir,$(LOCALE_DIRS),l10n/$(locale)/$(dir))))
-endif
-
-CVSCO_LOCALES := $(CVS) $(CVS_FLAGS) -d $(LOCALES_CVSROOT) co $(LOCALES_CO_FLAGS) $(CVS_CO_LOCALES_DATE_FLAGS) $(LOCALE_CO_DIRS)
-
-FASTUPDATE_LOCALES := fast_update $(CVSCO_LOCALES)
-CHECKOUT_LOCALES := cvs_co $(CVSCO_LOCALES)
-endif #MOZ_CO_LOCALES
+CONFIGURES += $(TOPSRCDIR)/nsprpub/configure
 
 #######################################################################
 # Rules
 # 
 
+# The default rule is build
+build::
+
 # Print out any options loaded from mozconfig.
-all build checkout clean depend distclean export libs install realclean::
+all build clean depend distclean export libs install realclean::
 	@if test -f .mozconfig.out; then \
 	  cat .mozconfig.out; \
 	  rm -f .mozconfig.out; \
 	else true; \
 	fi
 
-ifdef _IS_FIRST_CHECKOUT
-all:: checkout build
-else
-all:: checkout alldep
-endif
-
 # Windows equivalents
-pull_all: checkout
 build_all: build
 build_all_dep: alldep
 build_all_depend: alldep
 clobber clobber_all: clean
-pull_and_build_all: checkout alldep
 
 # Do everything from scratch
-everything: checkout clean build
-
-####################################
-# CVS checkout
-#
-checkout::
-#	@: Backup the last checkout log.
-	@if test -f $(CVSCO_LOGFILE) ; then \
-	  mv $(CVSCO_LOGFILE) $(CVSCO_LOGFILE).old; \
-	else true; \
-	fi
-ifdef RUN_AUTOCONF_LOCALLY
-	@echo "Removing local configures" ; \
-	cd $(ROOTDIR) && \
-	$(RM) -f $(CONFIGURES)
-endif
-	@echo "checkout start: "`date` | tee $(CVSCO_LOGFILE)
-	@echo '$(CVSCO) $(CVS_CO_DATE_FLAGS) mozilla/client.mk $(MOZCONFIG_MODULES)'; \
-        cd $(ROOTDIR) && \
-	$(CVSCO) $(CVS_CO_DATE_FLAGS) mozilla/client.mk $(MOZCONFIG_MODULES)
-	@cd $(ROOTDIR) && $(MAKE) -f mozilla/client.mk real_checkout
-
-#	Start the checkout. Split the output to the tty and a log file.
-
-real_checkout:
-	@set -e; \
-	cvs_co() { set -e; echo "$$@" ; \
-	  "$$@" 2>&1 | tee -a $(CVSCO_LOGFILE); }; \
-	cvs_co $(CVSCO_NSPR); \
-	cvs_co $(CVSCO_NSS); \
-	cvs_co $(CVSCO_LDAPCSDK); \
-	$(CHECKOUT_MODULES_NS); \
-	$(CHECKOUT_MODULES) \
-	$(CHECKOUT_LOCALES);
-	@echo "checkout finish: "`date` | tee -a $(CVSCO_LOGFILE)
-# update the NSS checkout timestamp, if we checked PSM out
-	@if test -d $(TOPSRCDIR)/security/manager -a \
-		 `egrep -c '^(U|C) mozilla/security/(nss|coreconf)' $(CVSCO_LOGFILE) 2>/dev/null` != 0; then \
-		touch $(TOPSRCDIR)/security/manager/.nss.checkout; \
-	fi
-ifdef RUN_AUTOCONF_LOCALLY
-	cd $(ROOTDIR) && \
-	$(RM) -f $(CONFIGURES)
-endif
-#	@: Check the log for conflicts. ;
-	@conflicts=`egrep "^C " $(CVSCO_LOGFILE)` ;\
-	if test "$$conflicts" ; then \
-	  echo "$(MAKE): *** Conflicts during checkout." ;\
-	  echo "$$conflicts" ;\
-	  echo "$(MAKE): Refer to $(CVSCO_LOGFILE) for full log." ;\
-	  false; \
-	else true; \
-	fi
-
-fast-update:
-#	@: Backup the last checkout log.
-	@if test -f $(CVSCO_LOGFILE) ; then \
-	  mv $(CVSCO_LOGFILE) $(CVSCO_LOGFILE).old; \
-	else true; \
-	fi
-ifdef RUN_AUTOCONF_LOCALLY
-	@echo "Removing local configures" ; \
-	cd $(ROOTDIR) && \
-	$(RM) -f $(CONFIGURES)
-endif
-	@echo "checkout start: "`date` | tee $(CVSCO_LOGFILE)
-	@echo '$(CVSCO) mozilla/client.mk $(MOZCONFIG_MODULES)'; \
-        cd $(ROOTDIR) && \
-	$(CVSCO) mozilla/client.mk $(MOZCONFIG_MODULES)
-	@cd $(TOPSRCDIR) && \
-	$(MAKE) -f client.mk real_fast-update
-
-# Start the update. Split the output to the tty and a log file.
-real_fast-update:
-	@set -e; \
-	fast_update() { set -e; config/cvsco-fast-update.pl $$@ 2>&1 | tee -a $(CVSCO_LOGFILE); }; \
-	cvs_co() { set -e; echo "$$@" ; \
-	  "$$@" 2>&1 | tee -a $(CVSCO_LOGFILE); }; \
-	fast_update $(CVSCO_NSPR); \
-	cd $(ROOTDIR); \
-	cvs_co $(CVSCO_NSS); \
-	cd mozilla; \
-	fast_update $(CVSCO_LDAPCSDK); \
-	$(FASTUPDATE_MODULES); \
-	$(FASTUPDATE_MODULES_NS); \
-	$(FASTUPDATE_LOCALES);
-	@echo "fast_update finish: "`date` | tee -a $(CVSCO_LOGFILE)
-# update the NSS checkout timestamp
-	@if test `egrep -c '^(U|C) mozilla/security/(nss|coreconf)' $(CVSCO_LOGFILE) 2>/dev/null` != 0; then \
-		touch $(TOPSRCDIR)/security/manager/.nss.checkout; \
-	fi
-ifdef RUN_AUTOCONF_LOCALLY
-	cd $(ROOTDIR) && \
-	$(RM) -f $(CONFIGURES)
-endif
-#	@: Check the log for conflicts. ;
-	@conflicts=`egrep "^C " $(CVSCO_LOGFILE)` ;\
-	if test "$$conflicts" ; then \
-	  echo "$(MAKE): *** Conflicts during fast-update." ;\
-	  echo "$$conflicts" ;\
-	  echo "$(MAKE): Refer to $(CVSCO_LOGFILE) for full log." ;\
-	  false; \
-	else true; \
-	fi
-
-CVSCO_LOGFILE_L10N := $(ROOTDIR)/cvsco-l10n.log
-CVSCO_LOGFILE_L10N := $(shell echo $(CVSCO_LOGFILE_L10N) | sed s%//%/%)
-
-l10n-checkout:
-#	@: Backup the last checkout log.
-	@if test -f $(CVSCO_LOGFILE_L10N) ; then \
-	  mv $(CVSCO_LOGFILE_L10N) $(CVSCO_LOGFILE_L10N).old; \
-	else true; \
-	fi
-	@echo "checkout start: "`date` | tee $(CVSCO_LOGFILE_L10N)
-	@echo '$(CVSCO) $(CVS_CO_DATE_FLAGS) mozilla/client.mk $(MOZCONFIG_MODULES)'; \
-        cd $(ROOTDIR) && \
-	$(CVSCO) $(CVS_CO_DATE_FLAGS) mozilla/client.mk $(MOZCONFIG_MODULES)
-	@cd $(ROOTDIR) && $(MAKE) -f mozilla/client.mk real_l10n-checkout
-
-EN_US_CO_DIRS := $(sort $(foreach dir,$(LOCALE_DIRS),mozilla/$(dir)/locales)) \
-  $(foreach mod,$(MOZ_PROJECT_LIST),mozilla/$(mod)/config) \
-  mozilla/client.mk        \
-  $(MOZCONFIG_MODULES)     \
-  mozilla/configure        \
-  mozilla/configure.in     \
-  mozilla/allmakefiles.sh  \
-  mozilla/build            \
-  mozilla/config           \
-  $(NULL)
-
-EN_US_CO_FILES_NS :=          \
-  mozilla/toolkit/mozapps/installer \
-  $(NULL)
-
-#	Start the checkout. Split the output to the tty and a log file.
-real_l10n-checkout:
-	@set -e; \
-	cvs_co() { set -e; echo "$$@" ; \
-	  "$$@" 2>&1 | tee -a $(CVSCO_LOGFILE_L10N); }; \
-	cvs_co $(CVS) $(CVS_FLAGS) co $(MODULES_CO_FLAGS) $(CVS_CO_DATE_FLAGS) $(EN_US_CO_DIRS); \
-	cvs_co $(CVS) $(CVS_FLAGS) co $(MODULES_CO_FLAGS) $(CVS_CO_DATE_FLAGS) -l $(EN_US_CO_FILES_NS); \
-	cvs_co $(CVSCO_LOCALES)
-	@echo "checkout finish: "`date` | tee -a $(CVSCO_LOGFILE_L10N)
-#	@: Check the log for conflicts. ;
-	@conflicts=`egrep "^C " $(CVSCO_LOGFILE_L10N)` ;\
-	if test "$$conflicts" ; then \
-	  echo "$(MAKE): *** Conflicts during checkout." ;\
-	  echo "$$conflicts" ;\
-	  echo "$(MAKE): Refer to $(CVSCO_LOGFILE_L10N) for full log." ;\
-	  false; \
-	else true; \
-	fi
-
-#####################################################
-# First Checkout
-
-ifdef _IS_FIRST_CHECKOUT
-# First time, do build target in a new process to pick up new files.
-build::
-	$(MAKE) -f $(TOPSRCDIR)/client.mk build
-else
-
-#####################################################
-# After First Checkout
+everything: clean build
 
 #####################################################
 # Build date unification
 
 ifdef MOZ_UNIFY_BDATE
 ifndef MOZ_BUILD_DATE
 ifdef MOZ_BUILD_PROJECTS
 MOZ_BUILD_DATE = $(shell $(PERL) -I$(TOPSRCDIR)/config $(TOPSRCDIR)/config/bdate.pl)
@@ -997,20 +246,16 @@ EXTRA_CONFIG_DEPS := \
 
 $(TOPSRCDIR)/configure: $(TOPSRCDIR)/configure.in $(EXTRA_CONFIG_DEPS)
 	@echo Generating $@ using autoconf
 	cd $(TOPSRCDIR); $(AUTOCONF)
 
 $(TOPSRCDIR)/nsprpub/configure: $(TOPSRCDIR)/nsprpub/configure.in $(EXTRA_CONFIG_DEPS)
 	@echo Generating $@ using autoconf
 	cd $(TOPSRCDIR)/nsprpub; $(AUTOCONF)
-
-$(TOPSRCDIR)/directory/c-sdk/configure: $(TOPSRCDIR)/directory/c-sdk/configure.in $(EXTRA_CONFIG_DEPS)
-	@echo Generating $@ using autoconf
-	cd $(TOPSRCDIR)/directory/c-sdk; $(AUTOCONF)
 endif
 
 CONFIG_STATUS_DEPS := \
 	$(TOPSRCDIR)/configure \
 	$(TOPSRCDIR)/allmakefiles.sh \
 	$(TOPSRCDIR)/.mozconfig.mk \
 	$(wildcard $(TOPSRCDIR)/nsprpub/configure) \
 	$(wildcard $(TOPSRCDIR)/directory/c-sdk/configure) \
@@ -1143,15 +388,12 @@ cleansrcdir:
 	else \
 	  echo "Removing object files from srcdir..."; \
 	  rm -fr `find . -type d \( -name .deps -print -o -name CVS \
 	          -o -exec test ! -d {}/CVS \; \) -prune \
 	          -o \( -name '*.[ao]' -o -name '*.so' \) -type f -print`; \
 	   build/autoconf/clean-config.sh; \
 	fi;
 
-# (! IS_FIRST_CHECKOUT)
-endif
-
 echo_objdir:
 	@echo $(OBJDIR)
 
 .PHONY: checkout real_checkout depend build export libs alldep install clean realclean distclean cleansrcdir pull_all build_all clobber clobber_all pull_and_build_all everything configure preflight_all preflight postflight postflight_all
new file mode 100644
--- /dev/null
+++ b/client.py
@@ -0,0 +1,88 @@
+#!/usr/bin/python
+
+NSPR_CO_TAG = 'NSPRPUB_PRE_4_2_CLIENT_BRANCH'
+NSS_CO_TAG  = 'NSS_3_11_7_BETA1'
+
+NSPR_DIRS = ('nsprpub',)
+NSS_DIRS  = ('dbm',
+             'security/nss',
+             'security/coreconf',
+             'security/dbm')
+
+import os
+import sys
+from optparse import OptionParser
+
+topsrcdir = os.path.dirname(__file__)
+if topsrcdir == '':
+    topsrcdir = '.'
+
+try:
+    from subprocess import check_call
+except ImportError:
+    import subprocess
+    def check_call(*popenargs, **kwargs):
+        retcode = subprocess.call(*popenargs, **kwargs)
+        if retcode:
+            cmd = kwargs.get("args")
+            if cmd is None:
+                cmd = popenargs[0]
+                raise Exception("Command '%s' returned non-zero exit status %i" % (cmd, retcode))
+
+def do_hg_checkout(dir, remote, hgroot, hg):
+    fulldir = os.path.join(topsrcdir, dir)
+    repository = '%s/%s' % (hgroot, remote)
+    check_call([hg, 'clone', repository, fulldir])
+
+def do_hg_pull(dir, remote, hgroot, hg):
+    fulldir = os.path.join(topsrcdir, dir)
+    repository = '%s/%s' % (hgroot, remote)
+    cmd = [hg, 'pull', '-R', fulldir, repository]
+    check_call(cmd)
+
+def do_cvs_checkout(modules, tag, cvsroot, cvs):
+    """Check out a CVS directory.
+    modules is a list of directories to check out, e.g. ['nsprpub']
+    """
+    for module in modules:
+        (parent, leaf) = os.path.split(module)
+        check_call([cvs, '-d', cvsroot,
+                    'checkout', '-P', '-r', tag, '-d', leaf,
+                    'mozilla/%s' % module],
+                   cwd=os.path.join(topsrcdir, parent))
+
+o = OptionParser(usage="client.py [options] {checkout|update}")
+o.add_option("-m", "--mozilla-repo", dest="mozilla_repo",
+             default="mozilla-central",
+             help="Specify the Mozilla repository to pull from, default 'mozilla-central'")
+o.add_option("-t", "--tamarin-repo", dest="tamarin_repo",
+             default="tamarin-central",
+             help="Specify the Tamarin repository to pull from, default 'tamarin-central'")
+o.add_option("--hg", dest="hg", default=os.environ.get('HG', 'hg'),
+             help="The location of the hg binary")
+o.add_option("--cvs", dest="cvs", default=os.environ.get('CVS', 'cvs'),
+             help="The location of the cvs binary")
+o.add_option("--hgroot", dest="hgroot", default="ssh://hg.mozilla.org",
+             help="The hg root (default: ssh://hg.mozilla.org)")
+o.add_option("--cvsroot", dest="cvsroot",
+             default=os.environ.get('CVSROOT', ':pserver:anonymous@cvs-mirror.mozilla.org:/cvsroot'),
+             help="The CVSROOT (default: :pserver:anonymous@cvs-mirror.mozilla.org:/cvsroot")
+
+try:
+    (options, (action,)) = o.parse_args()
+except ValueError:
+    o.print_help()
+    sys.exit(2)
+
+if action in ('checkout', 'co'):
+    do_cvs_checkout(NSPR_DIRS, NSPR_CO_TAG, options.cvsroot, options.cvs)
+    do_cvs_checkout(NSS_DIRS, NSS_CO_TAG, options.cvsroot, options.cvs)
+    do_hg_checkout('js/tamarin', options.tamarin_repo, options.hgroot, options.hg)
+elif action in ('update', 'up', 'pull'):
+    do_cvs_checkout(NSPR_DIRS, NSPR_CO_TAG, options.cvsroot, options.cvs)
+    do_cvs_checkout(NSS_DIRS, NSS_CO_TAG, options.cvsroot, options.cvs)
+    do_hg_pull('js/tamarin', options.tamarin_repo, options.hgroot, options.hg)
+    do_hg_pull('.', options.mozilla_repo, options.hgroot, options.hg)
+else:
+    o.print_help()
+    sys.exit(2)