diff --git a/sdch/sdch.Makefile b/sdch/sdch.Makefile
deleted file mode 100644
index adfbab9..0000000
--- a/sdch/sdch.Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-# This file is generated by gyp; do not edit.
-
-export builddir_name ?= /usr/local/google/src/chromium-merge/src/sdch/out
-.PHONY: all
-all:
-	$(MAKE) -C .. sdch
diff --git a/sdch/sdch.target.mk b/sdch/sdch.target.mk
deleted file mode 100644
index f945961..0000000
--- a/sdch/sdch.target.mk
+++ /dev/null
@@ -1,145 +0,0 @@
-# This file is generated by gyp; do not edit.
-
-TOOLSET := target
-TARGET := sdch
-DEFS_Debug := '-DNO_HEAPCHECKER' \
-	'-DCHROMIUM_BUILD' \
-	'-DENABLE_REMOTING=1' \
-	'-DENABLE_GPU=1' \
-	'-D__STDC_FORMAT_MACROS' \
-	'-DDYNAMIC_ANNOTATIONS_ENABLED=1' \
-	'-D_DEBUG'
-
-# Flags passed to both C and C++ files.
-CFLAGS_Debug := -Werror \
-	-pthread \
-	-fno-exceptions \
-	-Wall \
-	-Wno-unused-parameter \
-	-Wno-missing-field-initializers \
-	-D_FILE_OFFSET_BITS=64 \
-	-fvisibility=hidden \
-	-pipe \
-	-fno-strict-aliasing \
-	-O0 \
-	-g
-
-# Flags passed to only C (and not C++) files.
-CFLAGS_C_Debug := 
-
-# Flags passed to only C++ (and not C) files.
-CFLAGS_CC_Debug := -fno-rtti \
-	-fno-threadsafe-statics \
-	-fvisibility-inlines-hidden
-
-INCS_Debug := -Isdch/open-vcdiff/src \
-	-Isdch/linux
-
-DEFS_Release := '-DNO_HEAPCHECKER' \
-	'-DCHROMIUM_BUILD' \
-	'-DENABLE_REMOTING=1' \
-	'-DENABLE_GPU=1' \
-	'-D__STDC_FORMAT_MACROS' \
-	'-DNDEBUG' \
-	'-DNVALGRIND' \
-	'-DDYNAMIC_ANNOTATIONS_ENABLED=0'
-
-# Flags passed to both C and C++ files.
-CFLAGS_Release := -Werror \
-	-pthread \
-	-fno-exceptions \
-	-Wall \
-	-Wno-unused-parameter \
-	-Wno-missing-field-initializers \
-	-D_FILE_OFFSET_BITS=64 \
-	-fvisibility=hidden \
-	-pipe \
-	-fno-strict-aliasing \
-	-O2 \
-	-fno-ident \
-	-fdata-sections \
-	-ffunction-sections
-
-# Flags passed to only C (and not C++) files.
-CFLAGS_C_Release := 
-
-# Flags passed to only C++ (and not C) files.
-CFLAGS_CC_Release := -fno-rtti \
-	-fno-threadsafe-statics \
-	-fvisibility-inlines-hidden
-
-INCS_Release := -Isdch/open-vcdiff/src \
-	-Isdch/linux
-
-OBJS := $(obj).target/$(TARGET)/sdch/open-vcdiff/src/addrcache.o \
-	$(obj).target/$(TARGET)/sdch/open-vcdiff/src/adler32.o \
-	$(obj).target/$(TARGET)/sdch/open-vcdiff/src/blockhash.o \
-	$(obj).target/$(TARGET)/sdch/open-vcdiff/src/codetable.o \
-	$(obj).target/$(TARGET)/sdch/open-vcdiff/src/decodetable.o \
-	$(obj).target/$(TARGET)/sdch/open-vcdiff/src/encodetable.o \
-	$(obj).target/$(TARGET)/sdch/open-vcdiff/src/headerparser.o \
-	$(obj).target/$(TARGET)/sdch/open-vcdiff/src/instruction_map.o \
-	$(obj).target/$(TARGET)/sdch/open-vcdiff/src/logging.o \
-	$(obj).target/$(TARGET)/sdch/open-vcdiff/src/varint_bigendian.o \
-	$(obj).target/$(TARGET)/sdch/open-vcdiff/src/vcdecoder.o \
-	$(obj).target/$(TARGET)/sdch/open-vcdiff/src/vcdiffengine.o
-
-# Add to the list of files we specially track dependencies for.
-all_deps += $(OBJS)
-
-# CFLAGS et al overrides must be target-local.
-# See "Target-specific Variable Values" in the GNU Make manual.
-$(OBJS): TOOLSET := $(TOOLSET)
-$(OBJS): GYP_CFLAGS := $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_C_$(BUILDTYPE)) $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE))
-$(OBJS): GYP_CXXFLAGS := $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_CC_$(BUILDTYPE)) $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE))
-
-# Suffix rules, putting all outputs into $(obj).
-
-$(obj).$(TOOLSET)/$(TARGET)/%.o: $(srcdir)/%.cc FORCE_DO_CMD
-	@$(call do_cmd,cxx,1)
-
-$(obj).$(TOOLSET)/$(TARGET)/%.o: $(srcdir)/%.c FORCE_DO_CMD
-	@$(call do_cmd,cc,1)
-
-# Try building from generated source, too.
-
-$(obj).$(TOOLSET)/$(TARGET)/%.o: $(obj).$(TOOLSET)/%.cc FORCE_DO_CMD
-	@$(call do_cmd,cxx,1)
-
-$(obj).$(TOOLSET)/$(TARGET)/%.o: $(obj).$(TOOLSET)/%.c FORCE_DO_CMD
-	@$(call do_cmd,cc,1)
-
-$(obj).$(TOOLSET)/$(TARGET)/%.o: $(obj)/%.cc FORCE_DO_CMD
-	@$(call do_cmd,cxx,1)
-
-$(obj).$(TOOLSET)/$(TARGET)/%.o: $(obj)/%.c FORCE_DO_CMD
-	@$(call do_cmd,cc,1)
-
-# End of this set of suffix rules
-### Rules for final target.
-LDFLAGS_Debug := -pthread \
-	-Wl,-z,noexecstack
-
-LDFLAGS_Release := -pthread \
-	-Wl,-z,noexecstack \
-	-Wl,-O1 \
-	-Wl,--as-needed \
-	-Wl,--gc-sections
-
-LIBS := 
-
-$(obj).target/sdch/libsdch.a: GYP_LDFLAGS := $(LDFLAGS_$(BUILDTYPE))
-$(obj).target/sdch/libsdch.a: LIBS := $(LIBS)
-$(obj).target/sdch/libsdch.a: TOOLSET := $(TOOLSET)
-$(obj).target/sdch/libsdch.a: $(OBJS) FORCE_DO_CMD
-	$(call do_cmd,alink)
-
-all_deps += $(obj).target/sdch/libsdch.a
-# Add target alias
-.PHONY: sdch
-sdch: $(obj).target/sdch/libsdch.a
-
-# Add target alias to "all" target.
-.PHONY: all
-all: sdch
-
diff --git a/testing/gmock.Makefile b/testing/gmock.Makefile
deleted file mode 100644
index ed678eb..0000000
--- a/testing/gmock.Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-# This file is generated by gyp; do not edit.
-
-export builddir_name ?= /usr/local/google/src/chromium-merge/src/testing/out
-.PHONY: all
-all:
-	$(MAKE) -C .. gmock gmockmain
diff --git a/testing/gmock.target.mk b/testing/gmock.target.mk
deleted file mode 100644
index b43fc81..0000000
--- a/testing/gmock.target.mk
+++ /dev/null
@@ -1,129 +0,0 @@
-# This file is generated by gyp; do not edit.
-
-TOOLSET := target
-TARGET := gmock
-DEFS_Debug := '-DNO_HEAPCHECKER' \
-	'-DCHROMIUM_BUILD' \
-	'-DENABLE_REMOTING=1' \
-	'-DENABLE_GPU=1' \
-	'-DUNIT_TEST' \
-	'-DGTEST_HAS_RTTI=0' \
-	'-DDYNAMIC_ANNOTATIONS_ENABLED=1' \
-	'-D_DEBUG'
-
-# Flags passed to both C and C++ files.
-CFLAGS_Debug := -pthread \
-	-fno-exceptions \
-	-Wno-unused-parameter \
-	-Wno-missing-field-initializers \
-	-D_FILE_OFFSET_BITS=64 \
-	-fvisibility=hidden \
-	-pipe \
-	-fno-strict-aliasing \
-	-O0 \
-	-g
-
-# Flags passed to only C (and not C++) files.
-CFLAGS_C_Debug := 
-
-# Flags passed to only C++ (and not C) files.
-CFLAGS_CC_Debug := -fno-rtti \
-	-fno-threadsafe-statics \
-	-fvisibility-inlines-hidden
-
-INCS_Debug := -Itesting/gmock \
-	-Itesting/gmock/include \
-	-Itesting/gtest/include
-
-DEFS_Release := '-DNO_HEAPCHECKER' \
-	'-DCHROMIUM_BUILD' \
-	'-DENABLE_REMOTING=1' \
-	'-DENABLE_GPU=1' \
-	'-DUNIT_TEST' \
-	'-DGTEST_HAS_RTTI=0' \
-	'-DNDEBUG' \
-	'-DNVALGRIND' \
-	'-DDYNAMIC_ANNOTATIONS_ENABLED=0'
-
-# Flags passed to both C and C++ files.
-CFLAGS_Release := -pthread \
-	-fno-exceptions \
-	-Wno-unused-parameter \
-	-Wno-missing-field-initializers \
-	-D_FILE_OFFSET_BITS=64 \
-	-fvisibility=hidden \
-	-pipe \
-	-fno-strict-aliasing \
-	-O2 \
-	-fno-ident \
-	-fdata-sections \
-	-ffunction-sections
-
-# Flags passed to only C (and not C++) files.
-CFLAGS_C_Release := 
-
-# Flags passed to only C++ (and not C) files.
-CFLAGS_CC_Release := -fno-rtti \
-	-fno-threadsafe-statics \
-	-fvisibility-inlines-hidden
-
-INCS_Release := -Itesting/gmock \
-	-Itesting/gmock/include \
-	-Itesting/gtest/include
-
-OBJS := $(obj).target/$(TARGET)/testing/gmock/src/gmock-cardinalities.o \
-	$(obj).target/$(TARGET)/testing/gmock/src/gmock-internal-utils.o \
-	$(obj).target/$(TARGET)/testing/gmock/src/gmock-matchers.o \
-	$(obj).target/$(TARGET)/testing/gmock/src/gmock-spec-builders.o \
-	$(obj).target/$(TARGET)/testing/gmock/src/gmock.o
-
-# Add to the list of files we specially track dependencies for.
-all_deps += $(OBJS)
-
-# CFLAGS et al overrides must be target-local.
-# See "Target-specific Variable Values" in the GNU Make manual.
-$(OBJS): TOOLSET := $(TOOLSET)
-$(OBJS): GYP_CFLAGS := $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_C_$(BUILDTYPE)) $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE))
-$(OBJS): GYP_CXXFLAGS := $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_CC_$(BUILDTYPE)) $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE))
-
-# Suffix rules, putting all outputs into $(obj).
-
-$(obj).$(TOOLSET)/$(TARGET)/%.o: $(srcdir)/%.cc FORCE_DO_CMD
-	@$(call do_cmd,cxx,1)
-
-# Try building from generated source, too.
-
-$(obj).$(TOOLSET)/$(TARGET)/%.o: $(obj).$(TOOLSET)/%.cc FORCE_DO_CMD
-	@$(call do_cmd,cxx,1)
-
-$(obj).$(TOOLSET)/$(TARGET)/%.o: $(obj)/%.cc FORCE_DO_CMD
-	@$(call do_cmd,cxx,1)
-
-# End of this set of suffix rules
-### Rules for final target.
-LDFLAGS_Debug := -pthread \
-	-Wl,-z,noexecstack
-
-LDFLAGS_Release := -pthread \
-	-Wl,-z,noexecstack \
-	-Wl,-O1 \
-	-Wl,--as-needed \
-	-Wl,--gc-sections
-
-LIBS := 
-
-$(obj).target/testing/libgmock.a: GYP_LDFLAGS := $(LDFLAGS_$(BUILDTYPE))
-$(obj).target/testing/libgmock.a: LIBS := $(LIBS)
-$(obj).target/testing/libgmock.a: TOOLSET := $(TOOLSET)
-$(obj).target/testing/libgmock.a: $(OBJS) FORCE_DO_CMD
-	$(call do_cmd,alink)
-
-all_deps += $(obj).target/testing/libgmock.a
-# Add target alias
-.PHONY: gmock
-gmock: $(obj).target/testing/libgmock.a
-
-# Add target alias to "all" target.
-.PHONY: all
-all: gmock
-
diff --git a/testing/gmockmain.target.mk b/testing/gmockmain.target.mk
deleted file mode 100644
index 229e244..0000000
--- a/testing/gmockmain.target.mk
+++ /dev/null
@@ -1,123 +0,0 @@
-# This file is generated by gyp; do not edit.
-
-TOOLSET := target
-TARGET := gmockmain
-DEFS_Debug := '-DNO_HEAPCHECKER' \
-	'-DCHROMIUM_BUILD' \
-	'-DENABLE_REMOTING=1' \
-	'-DENABLE_GPU=1' \
-	'-DUNIT_TEST' \
-	'-DGTEST_HAS_RTTI=0' \
-	'-DDYNAMIC_ANNOTATIONS_ENABLED=1' \
-	'-D_DEBUG'
-
-# Flags passed to both C and C++ files.
-CFLAGS_Debug := -pthread \
-	-fno-exceptions \
-	-Wno-unused-parameter \
-	-Wno-missing-field-initializers \
-	-D_FILE_OFFSET_BITS=64 \
-	-fvisibility=hidden \
-	-pipe \
-	-fno-strict-aliasing \
-	-O0 \
-	-g
-
-# Flags passed to only C (and not C++) files.
-CFLAGS_C_Debug := 
-
-# Flags passed to only C++ (and not C) files.
-CFLAGS_CC_Debug := -fno-rtti \
-	-fno-threadsafe-statics \
-	-fvisibility-inlines-hidden
-
-INCS_Debug := -Itesting/gmock/include \
-	-Itesting/gtest/include
-
-DEFS_Release := '-DNO_HEAPCHECKER' \
-	'-DCHROMIUM_BUILD' \
-	'-DENABLE_REMOTING=1' \
-	'-DENABLE_GPU=1' \
-	'-DUNIT_TEST' \
-	'-DGTEST_HAS_RTTI=0' \
-	'-DNDEBUG' \
-	'-DNVALGRIND' \
-	'-DDYNAMIC_ANNOTATIONS_ENABLED=0'
-
-# Flags passed to both C and C++ files.
-CFLAGS_Release := -pthread \
-	-fno-exceptions \
-	-Wno-unused-parameter \
-	-Wno-missing-field-initializers \
-	-D_FILE_OFFSET_BITS=64 \
-	-fvisibility=hidden \
-	-pipe \
-	-fno-strict-aliasing \
-	-O2 \
-	-fno-ident \
-	-fdata-sections \
-	-ffunction-sections
-
-# Flags passed to only C (and not C++) files.
-CFLAGS_C_Release := 
-
-# Flags passed to only C++ (and not C) files.
-CFLAGS_CC_Release := -fno-rtti \
-	-fno-threadsafe-statics \
-	-fvisibility-inlines-hidden
-
-INCS_Release := -Itesting/gmock/include \
-	-Itesting/gtest/include
-
-OBJS := $(obj).target/$(TARGET)/testing/gmock/src/gmock_main.o
-
-# Add to the list of files we specially track dependencies for.
-all_deps += $(OBJS)
-
-# CFLAGS et al overrides must be target-local.
-# See "Target-specific Variable Values" in the GNU Make manual.
-$(OBJS): TOOLSET := $(TOOLSET)
-$(OBJS): GYP_CFLAGS := $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_C_$(BUILDTYPE)) $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE))
-$(OBJS): GYP_CXXFLAGS := $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_CC_$(BUILDTYPE)) $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE))
-
-# Suffix rules, putting all outputs into $(obj).
-
-$(obj).$(TOOLSET)/$(TARGET)/%.o: $(srcdir)/%.cc FORCE_DO_CMD
-	@$(call do_cmd,cxx,1)
-
-# Try building from generated source, too.
-
-$(obj).$(TOOLSET)/$(TARGET)/%.o: $(obj).$(TOOLSET)/%.cc FORCE_DO_CMD
-	@$(call do_cmd,cxx,1)
-
-$(obj).$(TOOLSET)/$(TARGET)/%.o: $(obj)/%.cc FORCE_DO_CMD
-	@$(call do_cmd,cxx,1)
-
-# End of this set of suffix rules
-### Rules for final target.
-LDFLAGS_Debug := -pthread \
-	-Wl,-z,noexecstack
-
-LDFLAGS_Release := -pthread \
-	-Wl,-z,noexecstack \
-	-Wl,-O1 \
-	-Wl,--as-needed \
-	-Wl,--gc-sections
-
-LIBS := 
-
-$(obj).target/testing/libgmockmain.a: GYP_LDFLAGS := $(LDFLAGS_$(BUILDTYPE))
-$(obj).target/testing/libgmockmain.a: LIBS := $(LIBS)
-$(obj).target/testing/libgmockmain.a: TOOLSET := $(TOOLSET)
-$(obj).target/testing/libgmockmain.a: $(OBJS) FORCE_DO_CMD
-	$(call do_cmd,alink)
-
-all_deps += $(obj).target/testing/libgmockmain.a
-# Add target alias
-.PHONY: gmockmain
-gmockmain: $(obj).target/testing/libgmockmain.a
-
-# Add target alias to "all" target.
-.PHONY: all
-all: gmockmain
-
diff --git a/testing/gtest.Makefile b/testing/gtest.Makefile
deleted file mode 100644
index 2c7a724..0000000
--- a/testing/gtest.Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-# This file is generated by gyp; do not edit.
-
-export builddir_name ?= /usr/local/google/src/chromium-merge/src/testing/out
-.PHONY: all
-all:
-	$(MAKE) -C .. gtest gtestmain
diff --git a/testing/gtest.target.mk b/testing/gtest.target.mk
deleted file mode 100644
index 1db9611..0000000
--- a/testing/gtest.target.mk
+++ /dev/null
@@ -1,128 +0,0 @@
-# This file is generated by gyp; do not edit.
-
-TOOLSET := target
-TARGET := gtest
-DEFS_Debug := '-DNO_HEAPCHECKER' \
-	'-DCHROMIUM_BUILD' \
-	'-DENABLE_REMOTING=1' \
-	'-DENABLE_GPU=1' \
-	'-DGTEST_HAS_RTTI=0' \
-	'-DDYNAMIC_ANNOTATIONS_ENABLED=1' \
-	'-D_DEBUG'
-
-# Flags passed to both C and C++ files.
-CFLAGS_Debug := -pthread \
-	-fno-exceptions \
-	-Wno-unused-parameter \
-	-Wno-missing-field-initializers \
-	-D_FILE_OFFSET_BITS=64 \
-	-fvisibility=hidden \
-	-pipe \
-	-fno-strict-aliasing \
-	-O0 \
-	-g
-
-# Flags passed to only C (and not C++) files.
-CFLAGS_C_Debug := 
-
-# Flags passed to only C++ (and not C) files.
-CFLAGS_CC_Debug := -fno-rtti \
-	-fno-threadsafe-statics \
-	-fvisibility-inlines-hidden
-
-INCS_Debug := -Itesting/gtest \
-	-Itesting/gtest/include
-
-DEFS_Release := '-DNO_HEAPCHECKER' \
-	'-DCHROMIUM_BUILD' \
-	'-DENABLE_REMOTING=1' \
-	'-DENABLE_GPU=1' \
-	'-DGTEST_HAS_RTTI=0' \
-	'-DNDEBUG' \
-	'-DNVALGRIND' \
-	'-DDYNAMIC_ANNOTATIONS_ENABLED=0'
-
-# Flags passed to both C and C++ files.
-CFLAGS_Release := -pthread \
-	-fno-exceptions \
-	-Wno-unused-parameter \
-	-Wno-missing-field-initializers \
-	-D_FILE_OFFSET_BITS=64 \
-	-fvisibility=hidden \
-	-pipe \
-	-fno-strict-aliasing \
-	-O2 \
-	-fno-ident \
-	-fdata-sections \
-	-ffunction-sections
-
-# Flags passed to only C (and not C++) files.
-CFLAGS_C_Release := 
-
-# Flags passed to only C++ (and not C) files.
-CFLAGS_CC_Release := -fno-rtti \
-	-fno-threadsafe-statics \
-	-fvisibility-inlines-hidden
-
-INCS_Release := -Itesting/gtest \
-	-Itesting/gtest/include
-
-OBJS := $(obj).target/$(TARGET)/testing/gtest/src/gtest-death-test.o \
-	$(obj).target/$(TARGET)/testing/gtest/src/gtest-filepath.o \
-	$(obj).target/$(TARGET)/testing/gtest/src/gtest-port.o \
-	$(obj).target/$(TARGET)/testing/gtest/src/gtest-printers.o \
-	$(obj).target/$(TARGET)/testing/gtest/src/gtest-test-part.o \
-	$(obj).target/$(TARGET)/testing/gtest/src/gtest-typed-test.o \
-	$(obj).target/$(TARGET)/testing/gtest/src/gtest.o \
-	$(obj).target/$(TARGET)/testing/multiprocess_func_list.o
-
-# Add to the list of files we specially track dependencies for.
-all_deps += $(OBJS)
-
-# CFLAGS et al overrides must be target-local.
-# See "Target-specific Variable Values" in the GNU Make manual.
-$(OBJS): TOOLSET := $(TOOLSET)
-$(OBJS): GYP_CFLAGS := $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_C_$(BUILDTYPE)) $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE))
-$(OBJS): GYP_CXXFLAGS := $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_CC_$(BUILDTYPE)) $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE))
-
-# Suffix rules, putting all outputs into $(obj).
-
-$(obj).$(TOOLSET)/$(TARGET)/%.o: $(srcdir)/%.cc FORCE_DO_CMD
-	@$(call do_cmd,cxx,1)
-
-# Try building from generated source, too.
-
-$(obj).$(TOOLSET)/$(TARGET)/%.o: $(obj).$(TOOLSET)/%.cc FORCE_DO_CMD
-	@$(call do_cmd,cxx,1)
-
-$(obj).$(TOOLSET)/$(TARGET)/%.o: $(obj)/%.cc FORCE_DO_CMD
-	@$(call do_cmd,cxx,1)
-
-# End of this set of suffix rules
-### Rules for final target.
-LDFLAGS_Debug := -pthread \
-	-Wl,-z,noexecstack
-
-LDFLAGS_Release := -pthread \
-	-Wl,-z,noexecstack \
-	-Wl,-O1 \
-	-Wl,--as-needed \
-	-Wl,--gc-sections
-
-LIBS := 
-
-$(obj).target/testing/libgtest.a: GYP_LDFLAGS := $(LDFLAGS_$(BUILDTYPE))
-$(obj).target/testing/libgtest.a: LIBS := $(LIBS)
-$(obj).target/testing/libgtest.a: TOOLSET := $(TOOLSET)
-$(obj).target/testing/libgtest.a: $(OBJS) FORCE_DO_CMD
-	$(call do_cmd,alink)
-
-all_deps += $(obj).target/testing/libgtest.a
-# Add target alias
-.PHONY: gtest
-gtest: $(obj).target/testing/libgtest.a
-
-# Add target alias to "all" target.
-.PHONY: all
-all: gtest
-
diff --git a/testing/gtestmain.target.mk b/testing/gtestmain.target.mk
deleted file mode 100644
index e1db871..0000000
--- a/testing/gtestmain.target.mk
+++ /dev/null
@@ -1,121 +0,0 @@
-# This file is generated by gyp; do not edit.
-
-TOOLSET := target
-TARGET := gtestmain
-DEFS_Debug := '-DNO_HEAPCHECKER' \
-	'-DCHROMIUM_BUILD' \
-	'-DENABLE_REMOTING=1' \
-	'-DENABLE_GPU=1' \
-	'-DUNIT_TEST' \
-	'-DGTEST_HAS_RTTI=0' \
-	'-DDYNAMIC_ANNOTATIONS_ENABLED=1' \
-	'-D_DEBUG'
-
-# Flags passed to both C and C++ files.
-CFLAGS_Debug := -pthread \
-	-fno-exceptions \
-	-Wno-unused-parameter \
-	-Wno-missing-field-initializers \
-	-D_FILE_OFFSET_BITS=64 \
-	-fvisibility=hidden \
-	-pipe \
-	-fno-strict-aliasing \
-	-O0 \
-	-g
-
-# Flags passed to only C (and not C++) files.
-CFLAGS_C_Debug := 
-
-# Flags passed to only C++ (and not C) files.
-CFLAGS_CC_Debug := -fno-rtti \
-	-fno-threadsafe-statics \
-	-fvisibility-inlines-hidden
-
-INCS_Debug := -Itesting/gtest/include
-
-DEFS_Release := '-DNO_HEAPCHECKER' \
-	'-DCHROMIUM_BUILD' \
-	'-DENABLE_REMOTING=1' \
-	'-DENABLE_GPU=1' \
-	'-DUNIT_TEST' \
-	'-DGTEST_HAS_RTTI=0' \
-	'-DNDEBUG' \
-	'-DNVALGRIND' \
-	'-DDYNAMIC_ANNOTATIONS_ENABLED=0'
-
-# Flags passed to both C and C++ files.
-CFLAGS_Release := -pthread \
-	-fno-exceptions \
-	-Wno-unused-parameter \
-	-Wno-missing-field-initializers \
-	-D_FILE_OFFSET_BITS=64 \
-	-fvisibility=hidden \
-	-pipe \
-	-fno-strict-aliasing \
-	-O2 \
-	-fno-ident \
-	-fdata-sections \
-	-ffunction-sections
-
-# Flags passed to only C (and not C++) files.
-CFLAGS_C_Release := 
-
-# Flags passed to only C++ (and not C) files.
-CFLAGS_CC_Release := -fno-rtti \
-	-fno-threadsafe-statics \
-	-fvisibility-inlines-hidden
-
-INCS_Release := -Itesting/gtest/include
-
-OBJS := $(obj).target/$(TARGET)/testing/gtest/src/gtest_main.o
-
-# Add to the list of files we specially track dependencies for.
-all_deps += $(OBJS)
-
-# CFLAGS et al overrides must be target-local.
-# See "Target-specific Variable Values" in the GNU Make manual.
-$(OBJS): TOOLSET := $(TOOLSET)
-$(OBJS): GYP_CFLAGS := $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_C_$(BUILDTYPE)) $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE))
-$(OBJS): GYP_CXXFLAGS := $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_CC_$(BUILDTYPE)) $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE))
-
-# Suffix rules, putting all outputs into $(obj).
-
-$(obj).$(TOOLSET)/$(TARGET)/%.o: $(srcdir)/%.cc FORCE_DO_CMD
-	@$(call do_cmd,cxx,1)
-
-# Try building from generated source, too.
-
-$(obj).$(TOOLSET)/$(TARGET)/%.o: $(obj).$(TOOLSET)/%.cc FORCE_DO_CMD
-	@$(call do_cmd,cxx,1)
-
-$(obj).$(TOOLSET)/$(TARGET)/%.o: $(obj)/%.cc FORCE_DO_CMD
-	@$(call do_cmd,cxx,1)
-
-# End of this set of suffix rules
-### Rules for final target.
-LDFLAGS_Debug := -pthread \
-	-Wl,-z,noexecstack
-
-LDFLAGS_Release := -pthread \
-	-Wl,-z,noexecstack \
-	-Wl,-O1 \
-	-Wl,--as-needed \
-	-Wl,--gc-sections
-
-LIBS := 
-
-$(obj).target/testing/libgtestmain.a: GYP_LDFLAGS := $(LDFLAGS_$(BUILDTYPE))
-$(obj).target/testing/libgtestmain.a: LIBS := $(LIBS)
-$(obj).target/testing/libgtestmain.a: TOOLSET := $(TOOLSET)
-$(obj).target/testing/libgtestmain.a: $(OBJS) FORCE_DO_CMD
-	$(call do_cmd,alink)
-
-all_deps += $(obj).target/testing/libgtestmain.a
-# Add target alias
-.PHONY: gtestmain
-gtestmain: $(obj).target/testing/libgtestmain.a
-
-# Add target alias to "all" target.
-.PHONY: all
-all: gtestmain
-
diff --git a/third_party/modp_b64/SConstruct b/third_party/modp_b64/SConstruct
deleted file mode 100644
index c530113..0000000
--- a/third_party/modp_b64/SConstruct
+++ /dev/null
@@ -1,2 +0,0 @@
-# This file is generated; do not edit.
-SConscript('modp_b64_main.scons')
diff --git a/third_party/modp_b64/modp_b64.Makefile b/third_party/modp_b64/modp_b64.Makefile
deleted file mode 100644
index c160765..0000000
--- a/third_party/modp_b64/modp_b64.Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-# This file is generated by gyp; do not edit.
-
-export builddir_name ?= /usr/local/google/src/chromium-merge/src/third_party/modp_b64/out
-.PHONY: all
-all:
-	$(MAKE) -C ../.. modp_b64
diff --git a/third_party/modp_b64/modp_b64.scons b/third_party/modp_b64/modp_b64.scons
deleted file mode 100644
index 1ba2389..0000000
--- a/third_party/modp_b64/modp_b64.scons
+++ /dev/null
@@ -1,276 +0,0 @@
-# This file is generated; do not edit.
-
-import os
-
-Import("env")
-
-env = env.Clone(COMPONENT_NAME='modp_b64',
-                TARGET_NAME='modp_b64')
-
-configurations = {
-    'Debug' : {
-        'Append' : dict(
-            CCFLAGS = [
-                '-pthread',
-                '-fno-exceptions',
-                '-fno-asynchronous-unwind-tables',
-                '-fvisibility=hidden',
-                '-D_FILE_OFFSET_BITS=64',
-                '-O0',
-                '-g'
-            ],
-            CPPDEFINES = [
-                'CHROMIUM_BUILD',
-                '_DEBUG'
-            ],
-            CPPPATH = [
-                env.Dir('$SRC_DIR/third_party/modp_b64/../..')
-            ],
-            CXXFLAGS = [
-                '-fno-rtti',
-                '-fno-threadsafe-statics',
-                '-fvisibility-inlines-hidden'
-            ],
-            LINKFLAGS = [
-                '-pthread',
-                '-rdynamic'
-            ],
-        ),
-        'FilterOut' : dict(
-        ),
-        'Replace' : dict(
-             FLOCK_LDMODULE = ['flock', '$TOP_BUILDDIR/linker.lock', '$LDMODULE'],
-             FLOCK_LINK = ['flock', '$TOP_BUILDDIR/linker.lock', '$LINK'],
-             FLOCK_SHLINK = ['flock', '$TOP_BUILDDIR/linker.lock', '$SHLINK'],
-             IMPLICIT_COMMAND_DEPENDENCIES = '0',
-             LDMODULECOM = [['$FLOCK_LDMODULE',
-  '-o',
-  '$TARGET',
-  '$_LIBDIRFLAGS',
-  '$LDMODULEFLAGS',
-  '$SOURCES',
-  '-Wl,--start-group',
-  '$_LIBFLAGS',
-  '-Wl,--end-group']],
-             LIBPATH = ['$LIB_DIR'],
-             LINKCOM = [['$FLOCK_LINK',
-  '-o',
-  '$TARGET',
-  '$_LIBDIRFLAGS',
-  '$LINKFLAGS',
-  '$SOURCES',
-  '-Wl,--start-group',
-  '$_LIBFLAGS',
-  '-Wl,--end-group']],
-             SHLINKCOM = [['$FLOCK_SHLINK',
-  '-o',
-  '$TARGET',
-  '$_LIBDIRFLAGS',
-  '$SHLINKFLAGS',
-  '$SOURCES',
-  '-Wl,--start-group',
-  '$_LIBFLAGS',
-  '-Wl,--end-group']],
-        ),
-        'ImportExternal' : [
-             'AS',
-             'CC',
-             'CXX',
-             'LINK',
-        ],
-        'PropagateExternal' : [
-             'AS',
-             'CC',
-             'CCACHE_DIR',
-             'CXX',
-             'DISTCC_DIR',
-             'DISTCC_HOSTS',
-             'HOME',
-             'INCLUDE_SERVER_ARGS',
-             'INCLUDE_SERVER_PORT',
-             'LINK',
-             'CHROME_BUILD_TYPE',
-             'CHROMIUM_BUILD',
-             'OFFICIAL_BUILD',
-        ],
-    },
-    'Release' : {
-        'Append' : dict(
-            CCFLAGS = [
-                '-pthread',
-                '-fno-exceptions',
-                '-fno-asynchronous-unwind-tables',
-                '-fvisibility=hidden',
-                '-D_FILE_OFFSET_BITS=64',
-                '-O2',
-                '-fno-ident',
-                '-fdata-sections',
-                '-ffunction-sections'
-            ],
-            CPPDEFINES = [
-                'CHROMIUM_BUILD',
-                'NDEBUG',
-                'NVALGRIND'
-            ],
-            CPPPATH = [
-                env.Dir('$SRC_DIR/third_party/modp_b64/../..')
-            ],
-            CXXFLAGS = [
-                '-fno-rtti',
-                '-fno-threadsafe-statics',
-                '-fvisibility-inlines-hidden'
-            ],
-            LINKFLAGS = [
-                '-pthread',
-                '-Wl,--gc-sections'
-            ],
-        ),
-        'FilterOut' : dict(
-        ),
-        'Replace' : dict(
-             FLOCK_LDMODULE = ['flock', '$TOP_BUILDDIR/linker.lock', '$LDMODULE'],
-             FLOCK_LINK = ['flock', '$TOP_BUILDDIR/linker.lock', '$LINK'],
-             FLOCK_SHLINK = ['flock', '$TOP_BUILDDIR/linker.lock', '$SHLINK'],
-             IMPLICIT_COMMAND_DEPENDENCIES = '0',
-             LDMODULECOM = [['$FLOCK_LDMODULE',
-  '-o',
-  '$TARGET',
-  '$_LIBDIRFLAGS',
-  '$LDMODULEFLAGS',
-  '$SOURCES',
-  '-Wl,--start-group',
-  '$_LIBFLAGS',
-  '-Wl,--end-group']],
-             LIBPATH = ['$LIB_DIR'],
-             LINKCOM = [['$FLOCK_LINK',
-  '-o',
-  '$TARGET',
-  '$_LIBDIRFLAGS',
-  '$LINKFLAGS',
-  '$SOURCES',
-  '-Wl,--start-group',
-  '$_LIBFLAGS',
-  '-Wl,--end-group']],
-             SHLINKCOM = [['$FLOCK_SHLINK',
-  '-o',
-  '$TARGET',
-  '$_LIBDIRFLAGS',
-  '$SHLINKFLAGS',
-  '$SOURCES',
-  '-Wl,--start-group',
-  '$_LIBFLAGS',
-  '-Wl,--end-group']],
-        ),
-        'ImportExternal' : [
-             'AS',
-             'CC',
-             'CXX',
-             'LINK',
-        ],
-        'PropagateExternal' : [
-             'AS',
-             'CC',
-             'CCACHE_DIR',
-             'CXX',
-             'DISTCC_DIR',
-             'DISTCC_HOSTS',
-             'HOME',
-             'INCLUDE_SERVER_ARGS',
-             'INCLUDE_SERVER_PORT',
-             'LINK',
-             'CHROME_BUILD_TYPE',
-             'CHROMIUM_BUILD',
-             'OFFICIAL_BUILD',
-        ],
-    },
-}
-
-config = configurations[env['CONFIG_NAME']]
-env.Append(**config['Append'])
-env.FilterOut(**config['FilterOut'])
-env.Replace(**config['Replace'])
-
-# Scons forces -fPIC for SHCCFLAGS on some platforms.
-# Disable that so we can control it from cflags in gyp.
-# Note that Scons itself is inconsistent with its -fPIC
-# setting. SHCCFLAGS forces -fPIC, and SHCFLAGS does not.
-# This will make SHCCFLAGS consistent with SHCFLAGS.
-env['SHCCFLAGS'] = ['$CCFLAGS']
-
-for _var in config['ImportExternal']:
-  if _var in ARGUMENTS:
-    env[_var] = ARGUMENTS[_var]
-  elif _var in os.environ:
-    env[_var] = os.environ[_var]
-for _var in config['PropagateExternal']:
-  if _var in ARGUMENTS:
-    env[_var] = ARGUMENTS[_var]
-  elif _var in os.environ:
-    env['ENV'][_var] = os.environ[_var]
-
-env['ENV']['LD_LIBRARY_PATH'] = env.subst('$LIB_DIR')
-
-if ARGUMENTS.get('COVERAGE') not in (None, '0'):
-  env.AppendUnique(
-            CCFLAGS = [
-                '-fprofile-arcs',
-                '-ftest-coverage'
-            ],
-            LINKFLAGS = [
-                '-fprofile-arcs'
-            ],
-  )
-
-if ARGUMENTS.get('PROFILE') not in (None, '0'):
-  env.AppendUnique(
-            CCFLAGS = [
-                '-pg',
-                '-g'
-            ],
-            LINKFLAGS = [
-                '-pg'
-            ],
-  )
-
-if ARGUMENTS.get('SYMBOLS') not in (None, '0'):
-  env.AppendUnique(
-            CCFLAGS = [
-                '-g'
-            ],
-  )
-
-input_files = [
-    'modp_b64.cc',
-    'modp_b64.h',
-    'modp_b64_data.h',
-]
-
-target_files = []
-prerequisites = []
-
-_result = []
-for infile in input_files:
-  if env.compilable(infile):
-    if (type(infile) == type('')
-        and (infile.startswith('$SRC_DIR/third_party/modp_b64/')
-             or not os.path.isabs(env.subst(infile)))):
-      # Force files below the build directory by replacing all '..'
-      # elements in the path with '__':
-      base, ext = os.path.splitext(os.path.normpath(infile))
-      base = [d == '..' and '__' or d for d in base.split('/')]
-      base = os.path.join(*base)
-      object = '${OBJ_DIR}/${COMPONENT_NAME}/${TARGET_NAME}/' + base
-      if not infile.startswith('$SRC_DIR/third_party/modp_b64/'):
-        infile = '$SRC_DIR/third_party/modp_b64/' + infile
-      infile = env.StaticObject(object, infile)[0]
-    else:
-      infile = env.StaticObject(infile)[0]
-  _result.append(infile)
-input_files = _result
-
-_outputs = env.GypStaticLibrary('modp_b64', input_files)
-target_files.extend(_outputs)
-
-gyp_target = env.Alias('modp_b64', target_files)
-env.Requires(gyp_target, prerequisites)
-Return("gyp_target")
diff --git a/third_party/modp_b64/modp_b64.target.mk b/third_party/modp_b64/modp_b64.target.mk
deleted file mode 100644
index 5d51384..0000000
--- a/third_party/modp_b64/modp_b64.target.mk
+++ /dev/null
@@ -1,117 +0,0 @@
-# This file is generated by gyp; do not edit.
-
-TOOLSET := target
-TARGET := modp_b64
-DEFS_Debug := '-DNO_HEAPCHECKER' \
-	'-DCHROMIUM_BUILD' \
-	'-DENABLE_REMOTING=1' \
-	'-DENABLE_GPU=1' \
-	'-DDYNAMIC_ANNOTATIONS_ENABLED=1' \
-	'-D_DEBUG'
-
-# Flags passed to both C and C++ files.
-CFLAGS_Debug := -pthread \
-	-fno-exceptions \
-	-Wno-unused-parameter \
-	-Wno-missing-field-initializers \
-	-D_FILE_OFFSET_BITS=64 \
-	-fvisibility=hidden \
-	-pipe \
-	-fno-strict-aliasing \
-	-O0 \
-	-g
-
-# Flags passed to only C (and not C++) files.
-CFLAGS_C_Debug := 
-
-# Flags passed to only C++ (and not C) files.
-CFLAGS_CC_Debug := -fno-rtti \
-	-fno-threadsafe-statics \
-	-fvisibility-inlines-hidden
-
-INCS_Debug := -I.
-
-DEFS_Release := '-DNO_HEAPCHECKER' \
-	'-DCHROMIUM_BUILD' \
-	'-DENABLE_REMOTING=1' \
-	'-DENABLE_GPU=1' \
-	'-DNDEBUG' \
-	'-DNVALGRIND' \
-	'-DDYNAMIC_ANNOTATIONS_ENABLED=0'
-
-# Flags passed to both C and C++ files.
-CFLAGS_Release := -pthread \
-	-fno-exceptions \
-	-Wno-unused-parameter \
-	-Wno-missing-field-initializers \
-	-D_FILE_OFFSET_BITS=64 \
-	-fvisibility=hidden \
-	-pipe \
-	-fno-strict-aliasing \
-	-O2 \
-	-fno-ident \
-	-fdata-sections \
-	-ffunction-sections
-
-# Flags passed to only C (and not C++) files.
-CFLAGS_C_Release := 
-
-# Flags passed to only C++ (and not C) files.
-CFLAGS_CC_Release := -fno-rtti \
-	-fno-threadsafe-statics \
-	-fvisibility-inlines-hidden
-
-INCS_Release := -I.
-
-OBJS := $(obj).target/$(TARGET)/third_party/modp_b64/modp_b64.o
-
-# Add to the list of files we specially track dependencies for.
-all_deps += $(OBJS)
-
-# CFLAGS et al overrides must be target-local.
-# See "Target-specific Variable Values" in the GNU Make manual.
-$(OBJS): TOOLSET := $(TOOLSET)
-$(OBJS): GYP_CFLAGS := $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_C_$(BUILDTYPE)) $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE))
-$(OBJS): GYP_CXXFLAGS := $(CFLAGS_$(BUILDTYPE)) $(CFLAGS_CC_$(BUILDTYPE)) $(DEFS_$(BUILDTYPE)) $(INCS_$(BUILDTYPE))
-
-# Suffix rules, putting all outputs into $(obj).
-
-$(obj).$(TOOLSET)/$(TARGET)/%.o: $(srcdir)/%.cc FORCE_DO_CMD
-	@$(call do_cmd,cxx,1)
-
-# Try building from generated source, too.
-
-$(obj).$(TOOLSET)/$(TARGET)/%.o: $(obj).$(TOOLSET)/%.cc FORCE_DO_CMD
-	@$(call do_cmd,cxx,1)
-
-$(obj).$(TOOLSET)/$(TARGET)/%.o: $(obj)/%.cc FORCE_DO_CMD
-	@$(call do_cmd,cxx,1)
-
-# End of this set of suffix rules
-### Rules for final target.
-LDFLAGS_Debug := -pthread \
-	-Wl,-z,noexecstack
-
-LDFLAGS_Release := -pthread \
-	-Wl,-z,noexecstack \
-	-Wl,-O1 \
-	-Wl,--as-needed \
-	-Wl,--gc-sections
-
-LIBS := 
-
-$(obj).target/third_party/modp_b64/libmodp_b64.a: GYP_LDFLAGS := $(LDFLAGS_$(BUILDTYPE))
-$(obj).target/third_party/modp_b64/libmodp_b64.a: LIBS := $(LIBS)
-$(obj).target/third_party/modp_b64/libmodp_b64.a: TOOLSET := $(TOOLSET)
-$(obj).target/third_party/modp_b64/libmodp_b64.a: $(OBJS) FORCE_DO_CMD
-	$(call do_cmd,alink)
-
-all_deps += $(obj).target/third_party/modp_b64/libmodp_b64.a
-# Add target alias
-.PHONY: modp_b64
-modp_b64: $(obj).target/third_party/modp_b64/libmodp_b64.a
-
-# Add target alias to "all" target.
-.PHONY: all
-all: modp_b64
-
diff --git a/third_party/modp_b64/modp_b64_main.scons b/third_party/modp_b64/modp_b64_main.scons
deleted file mode 100644
index 60db606..0000000
--- a/third_party/modp_b64/modp_b64_main.scons
+++ /dev/null
@@ -1,327 +0,0 @@
-# This file is generated; do not edit.
-
-__doc__ = '''
-Wrapper configuration for building this entire "solution,"
-including all the specific targets in various *.scons files.
-'''
-
-import os
-import sys
-
-import SCons.Environment
-import SCons.Util
-
-def GetProcessorCount():
-  '''
-  Detects the number of CPUs on the system. Adapted form:
-  http://codeliberates.blogspot.com/2008/05/detecting-cpuscores-in-python.html
-  '''
-  # Linux, Unix and Mac OS X:
-  if hasattr(os, 'sysconf'):
-    if os.sysconf_names.has_key('SC_NPROCESSORS_ONLN'):
-      # Linux and Unix or Mac OS X with python >= 2.5:
-      return os.sysconf('SC_NPROCESSORS_ONLN')
-    else:  # Mac OS X with Python < 2.5:
-      return int(os.popen2("sysctl -n hw.ncpu")[1].read())
-  # Windows:
-  if os.environ.has_key('NUMBER_OF_PROCESSORS'):
-    return max(int(os.environ.get('NUMBER_OF_PROCESSORS', '1')), 1)
-  return 1  # Default
-
-# Support PROGRESS= to show progress in different ways.
-p = ARGUMENTS.get('PROGRESS')
-if p == 'spinner':
-  Progress(['/\r', '|\r', '\\\r', '-\r'],
-           interval=5,
-           file=open('/dev/tty', 'w'))
-elif p == 'name':
-  Progress('$TARGET\r', overwrite=True, file=open('/dev/tty', 'w'))
-
-# Set the default -j value based on the number of processors.
-SetOption('num_jobs', GetProcessorCount() + 1)
-
-# Have SCons use its cached dependency information.
-SetOption('implicit_cache', 1)
-
-# Only re-calculate MD5 checksums if a timestamp has changed.
-Decider('MD5-timestamp')
-
-# Since we set the -j value by default, suppress SCons warnings about being
-# unable to support parallel build on versions of Python with no threading.
-default_warnings = ['no-no-parallel-support']
-SetOption('warn', default_warnings + GetOption('warn'))
-
-AddOption('--mode', nargs=1, dest='conf_list', default=[],
-          action='append', help='Configuration to build.')
-
-AddOption('--verbose', dest='verbose', default=False,
-          action='store_true', help='Verbose command-line output.')
-
-
-#
-sconscript_file_map = dict(
-    modp_b64 = 'modp_b64.scons',
-)
-
-class LoadTarget:
-  '''
-  Class for deciding if a given target sconscript is to be included
-  based on a list of included target names, optionally prefixed with '-'
-  to exclude a target name.
-  '''
-  def __init__(self, load):
-    '''
-    Initialize a class with a list of names for possible loading.
-
-    Arguments:
-      load:  list of elements in the LOAD= specification
-    '''
-    self.included = set([c for c in load if not c.startswith('-')])
-    self.excluded = set([c[1:] for c in load if c.startswith('-')])
-
-    if not self.included:
-      self.included = set(['all'])
-
-  def __call__(self, target):
-    '''
-    Returns True if the specified target's sconscript file should be
-    loaded, based on the initialized included and excluded lists.
-    '''
-    return (target in self.included or
-            ('all' in self.included and not target in self.excluded))
-
-if 'LOAD' in ARGUMENTS:
-  load = ARGUMENTS['LOAD'].split(',')
-else:
-  load = []
-load_target = LoadTarget(load)
-
-sconscript_files = []
-for target, sconscript in sconscript_file_map.iteritems():
-  if load_target(target):
-    sconscript_files.append(sconscript)
-
-
-target_alias_list= []
-
-conf_list = GetOption('conf_list')
-if conf_list:
-    # In case the same --mode= value was specified multiple times.
-    conf_list = list(set(conf_list))
-else:
-    conf_list = ['Debug']
-
-sconsbuild_dir = Dir('../../sconsbuild')
-
-
-def FilterOut(self, **kw):
-  kw = SCons.Environment.copy_non_reserved_keywords(kw)
-  for key, val in kw.items():
-    envval = self.get(key, None)
-    if envval is None:
-      # No existing variable in the environment, so nothing to delete.
-      continue
-
-    for vremove in val:
-      # Use while not if, so we can handle duplicates.
-      while vremove in envval:
-        envval.remove(vremove)
-
-    self[key] = envval
-
-    # TODO(sgk): SCons.Environment.Append() has much more logic to deal
-    # with various types of values.  We should handle all those cases in here
-    # too.  (If variable is a dict, etc.)
-
-
-non_compilable_suffixes = {
-    'LINUX' : set([
-        '.bdic',
-        '.css',
-        '.dat',
-        '.fragment',
-        '.gperf',
-        '.h',
-        '.hh',
-        '.hpp',
-        '.html',
-        '.hxx',
-        '.idl',
-        '.in',
-        '.in0',
-        '.in1',
-        '.js',
-        '.mk',
-        '.rc',
-        '.sigs',
-        '',
-    ]),
-    'WINDOWS' : set([
-        '.h',
-        '.hh',
-        '.hpp',
-        '.dat',
-        '.idl',
-        '.in',
-        '.in0',
-        '.in1',
-    ]),
-}
-
-def compilable(env, file):
-  base, ext = os.path.splitext(str(file))
-  if ext in non_compilable_suffixes[env['TARGET_PLATFORM']]:
-    return False
-  return True
-
-def compilable_files(env, sources):
-  return [x for x in sources if compilable(env, x)]
-
-def GypProgram(env, target, source, *args, **kw):
-  source = compilable_files(env, source)
-  result = env.Program('$TOP_BUILDDIR/' + str(target), source, *args, **kw)
-  if env.get('INCREMENTAL'):
-    env.Precious(result)
-  return result
-
-def GypTestProgram(env, target, source, *args, **kw):
-  source = compilable_files(env, source)
-  result = env.Program('$TOP_BUILDDIR/' + str(target), source, *args, **kw)
-  if env.get('INCREMENTAL'):
-    env.Precious(*result)
-  return result
-
-def GypLibrary(env, target, source, *args, **kw):
-  source = compilable_files(env, source)
-  result = env.Library('$LIB_DIR/' + str(target), source, *args, **kw)
-  return result
-
-def GypLoadableModule(env, target, source, *args, **kw):
-  source = compilable_files(env, source)
-  result = env.LoadableModule('$TOP_BUILDDIR/' + str(target), source, *args,
-                              **kw)
-  return result
-
-def GypStaticLibrary(env, target, source, *args, **kw):
-  source = compilable_files(env, source)
-  result = env.StaticLibrary('$LIB_DIR/' + str(target), source, *args, **kw)
-  return result
-
-def GypSharedLibrary(env, target, source, *args, **kw):
-  source = compilable_files(env, source)
-  result = env.SharedLibrary('$LIB_DIR/' + str(target), source, *args, **kw)
-  if env.get('INCREMENTAL'):
-    env.Precious(result)
-  return result
-
-def add_gyp_methods(env):
-  env.AddMethod(GypProgram)
-  env.AddMethod(GypTestProgram)
-  env.AddMethod(GypLibrary)
-  env.AddMethod(GypLoadableModule)
-  env.AddMethod(GypStaticLibrary)
-  env.AddMethod(GypSharedLibrary)
-
-  env.AddMethod(FilterOut)
-
-  env.AddMethod(compilable)
-
-
-base_env = Environment(
-    tools = ['ar', 'as', 'gcc', 'g++', 'gnulink', 'chromium_builders'],
-    INTERMEDIATE_DIR='$OBJ_DIR/${COMPONENT_NAME}/_${TARGET_NAME}_intermediate',
-    LIB_DIR='$TOP_BUILDDIR/lib',
-    OBJ_DIR='$TOP_BUILDDIR/obj',
-    SCONSBUILD_DIR=sconsbuild_dir.abspath,
-    SHARED_INTERMEDIATE_DIR='$OBJ_DIR/_global_intermediate',
-    SRC_DIR=Dir('../..'),
-    TARGET_PLATFORM='LINUX',
-    TOP_BUILDDIR='$SCONSBUILD_DIR/$CONFIG_NAME',
-    LIBPATH=['$LIB_DIR'],
-)
-
-if not GetOption('verbose'):
-  base_env.SetDefault(
-      ARCOMSTR='Creating library $TARGET',
-      ASCOMSTR='Assembling $TARGET',
-      CCCOMSTR='Compiling $TARGET',
-      CONCATSOURCECOMSTR='ConcatSource $TARGET',
-      CXXCOMSTR='Compiling $TARGET',
-      LDMODULECOMSTR='Building loadable module $TARGET',
-      LINKCOMSTR='Linking $TARGET',
-      MANIFESTCOMSTR='Updating manifest for $TARGET',
-      MIDLCOMSTR='Compiling IDL $TARGET',
-      PCHCOMSTR='Precompiling $TARGET',
-      RANLIBCOMSTR='Indexing $TARGET',
-      RCCOMSTR='Compiling resource $TARGET',
-      SHCCCOMSTR='Compiling $TARGET',
-      SHCXXCOMSTR='Compiling $TARGET',
-      SHLINKCOMSTR='Linking $TARGET',
-      SHMANIFESTCOMSTR='Updating manifest for $TARGET',
-  )
-
-add_gyp_methods(base_env)
-
-for conf in conf_list:
-  env = base_env.Clone(CONFIG_NAME=conf)
-  SConsignFile(env.File('$TOP_BUILDDIR/.sconsign').abspath)
-  for sconscript in sconscript_files:
-    target_alias = env.SConscript(sconscript, exports=['env'])
-    if target_alias:
-      target_alias_list.extend(target_alias)
-
-Default(Alias('all', target_alias_list))
-
-help_fmt = '''
-Usage: hammer [SCONS_OPTIONS] [VARIABLES] [TARGET] ...
-
-Local command-line build options:
-  --mode=CONFIG             Configuration to build:
-                              --mode=Debug [default]
-                              --mode=Release
-  --verbose                 Print actual executed command lines.
-
-Supported command-line build variables:
-  LOAD=[module,...]         Comma-separated list of components to load in the
-                              dependency graph ('-' prefix excludes)
-  PROGRESS=type             Display a progress indicator:
-                              name:  print each evaluated target name
-                              spinner:  print a spinner every 5 targets
-
-The following TARGET names can also be used as LOAD= module names:
-
-%s
-'''
-
-if GetOption('help'):
-  def columnar_text(items, width=78, indent=2, sep=2):
-    result = []
-    colwidth = max(map(len, items)) + sep
-    cols = (width - indent) / colwidth
-    if cols < 1:
-      cols = 1
-    rows = (len(items) + cols - 1) / cols
-    indent = '%*s' % (indent, '')
-    sep = indent
-    for row in xrange(0, rows):
-      result.append(sep)
-      for i in xrange(row, len(items), rows):
-        result.append('%-*s' % (colwidth, items[i]))
-      sep = '\n' + indent
-    result.append('\n')
-    return ''.join(result)
-
-  load_list = set(sconscript_file_map.keys())
-  target_aliases = set(map(str, target_alias_list))
-
-  common = load_list and target_aliases
-  load_only = load_list - common
-  target_only = target_aliases - common
-  help_text = [help_fmt % columnar_text(sorted(list(common)))]
-  if target_only:
-    fmt = "The following are additional TARGET names:\n\n%s\n"
-    help_text.append(fmt % columnar_text(sorted(list(target_only))))
-  if load_only:
-    fmt = "The following are additional LOAD= module names:\n\n%s\n"
-    help_text.append(fmt % columnar_text(sorted(list(load_only))))
-  Help(''.join(help_text))
