summaryrefslogtreecommitdiffstats
path: root/build
diff options
context:
space:
mode:
Diffstat (limited to 'build')
-rw-r--r--build/all.gyp14
-rwxr-xr-xbuild/build-bisect.py283
-rw-r--r--build/common.gypi97
-rw-r--r--build/features_override.gypi1
-rwxr-xr-xbuild/linux/dump_signature.py56
-rw-r--r--build/linux/system.gyp24
-rw-r--r--build/sanitize-mac-build-log.sed22
-rwxr-xr-xbuild/sanitize-mac-build-log.sh6
-rw-r--r--build/sanitize-win-build-log.sed14
-rwxr-xr-xbuild/sanitize-win-build-log.sh6
-rw-r--r--build/whitespace_file.txt2
11 files changed, 80 insertions, 445 deletions
diff --git a/build/all.gyp b/build/all.gyp
index 79453dd..46d550d 100644
--- a/build/all.gyp
+++ b/build/all.gyp
@@ -33,7 +33,6 @@
'../third_party/ffmpeg/ffmpeg.gyp:*',
'../third_party/iccjpeg/iccjpeg.gyp:*',
'../third_party/icu/icu.gyp:*',
- '../third_party/libjpeg/libjpeg.gyp:*',
'../third_party/libpng/libpng.gyp:*',
'../third_party/libwebp/libwebp.gyp:*',
'../third_party/libxml/libxml.gyp:*',
@@ -51,6 +50,7 @@
'../webkit/webkit.gyp:*',
'util/build_util.gyp:*',
'temp_gyp/googleurl.gyp:*',
+ '<(libjpeg_gyp_path):*',
],
'conditions': [
['javascript_engine=="v8"', {
@@ -197,7 +197,15 @@
],
}],
],
- }
+ },
+ {
+ 'target_name': 'chromium_gpu_builder',
+ 'type': 'none',
+ 'dependencies': [
+ '../chrome/chrome.gyp:gpu_tests',
+ '../third_party/WebKit/WebKit/chromium/WebKit.gyp:DumpRenderTree',
+ ],
+ }
],
'conditions': [
['OS=="mac"', {
@@ -296,6 +304,7 @@
'../net/net.gyp:net_unittests',
'../printing/printing.gyp:printing_unittests',
'../remoting/remoting.gyp:remoting_unittests',
+ '../chrome/chrome.gyp:safe_browsing_tests',
'../chrome/chrome.gyp:sync_unit_tests',
'../chrome/chrome.gyp:unit_tests',
'../chrome/chrome.gyp:ui_tests',
@@ -391,7 +400,6 @@
'../chrome/app/locales/locales.gyp:*',
'../chrome/chrome.gyp:crash_service',
'../chrome/chrome.gyp:page_cycler_tests',
- '../chrome/chrome.gyp:policy_templates',
'../chrome/chrome.gyp:pyautolib',
'../chrome/chrome.gyp:reliability_tests',
'../chrome/chrome.gyp:startup_tests',
diff --git a/build/build-bisect.py b/build/build-bisect.py
index 84807bc..33fcb89 100755
--- a/build/build-bisect.py
+++ b/build/build-bisect.py
@@ -3,286 +3,9 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
-"""Snapshot Build Bisect Tool
-
-This script bisects a snapshot archive using binary search. It starts at
-a bad revision (it will try to guess HEAD) and asks for a last known-good
-revision. It will then binary search across this revision range by downloading,
-unzipping, and opening Chromium for you. After testing the specific revision,
-it will ask you whether it is good or bad before continuing the search.
-"""
-
-# Base URL to download snapshots from.
-BUILD_BASE_URL = 'http://build.chromium.org/buildbot/snapshots/'
-
-# The type (platform) of the build archive. This is what's passed in to the
-# '-a/--archive' option.
-BUILD_ARCHIVE_TYPE = ''
-
-# The selected archive to bisect.
-BUILD_ARCHIVE_DIR = ''
-
-# The location of the builds.
-BUILD_ARCHIVE_URL = '/%d/'
-
-# Name of the build archive.
-BUILD_ZIP_NAME = ''
-
-# Directory name inside the archive.
-BUILD_DIR_NAME = ''
-
-# Name of the executable.
-BUILD_EXE_NAME = ''
-
-# URL to the ViewVC commit page.
-BUILD_VIEWVC_URL = 'http://src.chromium.org/viewvc/chrome?view=rev&revision=%d'
-
-# Changelogs URL
-CHANGELOG_URL = 'http://build.chromium.org/buildbot/' \
- 'perf/dashboard/ui/changelog.html?url=/trunk/src&range=%d:%d'
-
-###############################################################################
-
-import math
-import optparse
-import os
-import pipes
-import re
-import shutil
import sys
-import tempfile
-import urllib
-import zipfile
-
-
-def UnzipFilenameToDir(filename, dir):
- """Unzip |filename| to directory |dir|."""
- zf = zipfile.ZipFile(filename)
- # Make base.
- pushd = os.getcwd()
- try:
- if not os.path.isdir(dir):
- os.mkdir(dir)
- os.chdir(dir)
- # Extract files.
- for info in zf.infolist():
- name = info.filename
- if name.endswith('/'): # dir
- if not os.path.isdir(name):
- os.makedirs(name)
- else: # file
- dir = os.path.dirname(name)
- if not os.path.isdir(dir):
- os.makedirs(dir)
- out = open(name, 'wb')
- out.write(zf.read(name))
- out.close()
- # Set permissions. Permission info in external_attr is shifted 16 bits.
- os.chmod(name, info.external_attr >> 16L)
- os.chdir(pushd)
- except Exception, e:
- print >>sys.stderr, e
- sys.exit(1)
-
-
-def SetArchiveVars(archive):
- """Set a bunch of global variables appropriate for the specified archive."""
- global BUILD_ARCHIVE_TYPE
- global BUILD_ARCHIVE_DIR
- global BUILD_ZIP_NAME
- global BUILD_DIR_NAME
- global BUILD_EXE_NAME
- global BUILD_BASE_URL
-
- BUILD_ARCHIVE_TYPE = archive
- BUILD_ARCHIVE_DIR = 'chromium-rel-' + BUILD_ARCHIVE_TYPE
-
- if BUILD_ARCHIVE_TYPE in ('linux', 'linux-64', 'linux-chromiumos'):
- BUILD_ZIP_NAME = 'chrome-linux.zip'
- BUILD_DIR_NAME = 'chrome-linux'
- BUILD_EXE_NAME = 'chrome'
- elif BUILD_ARCHIVE_TYPE in ('mac'):
- BUILD_ZIP_NAME = 'chrome-mac.zip'
- BUILD_DIR_NAME = 'chrome-mac'
- BUILD_EXE_NAME = 'Chromium.app/Contents/MacOS/Chromium'
- elif BUILD_ARCHIVE_TYPE in ('xp'):
- BUILD_ZIP_NAME = 'chrome-win32.zip'
- BUILD_DIR_NAME = 'chrome-win32'
- BUILD_EXE_NAME = 'chrome.exe'
-
- BUILD_BASE_URL += BUILD_ARCHIVE_DIR
-
-def ParseDirectoryIndex(url):
- """Parses the HTML directory listing into a list of revision numbers."""
- handle = urllib.urlopen(url)
- dirindex = handle.read()
- handle.close()
- return re.findall(r'<a href="([0-9]*)/">\1/</a>', dirindex)
-
-def GetRevList(good, bad):
- """Gets the list of revision numbers between |good| and |bad|."""
- # Download the main revlist.
- revlist = ParseDirectoryIndex(BUILD_BASE_URL)
- revlist = map(int, revlist)
- revlist = filter(lambda r: range(good, bad).__contains__(int(r)), revlist)
- revlist.sort()
- return revlist
-
-def TryRevision(rev, profile, args):
- """Downloads revision |rev|, unzips it, and opens it for the user to test.
- |profile| is the profile to use."""
- # Do this in a temp dir so we don't collide with user files.
- cwd = os.getcwd()
- tempdir = tempfile.mkdtemp(prefix='bisect_tmp')
- os.chdir(tempdir)
-
- # Download the file.
- download_url = BUILD_BASE_URL + (BUILD_ARCHIVE_URL % rev) + BUILD_ZIP_NAME
- try:
- print 'Fetching ' + download_url
- urllib.urlretrieve(download_url, BUILD_ZIP_NAME)
- except Exception, e:
- print('Could not retrieve the download. Sorry.')
- sys.exit(-1)
-
- # Unzip the file.
- print 'Unziping ...'
- UnzipFilenameToDir(BUILD_ZIP_NAME, os.curdir)
-
- # Tell the system to open the app.
- args = ['--user-data-dir=%s' % profile] + args
- flags = ' '.join(map(pipes.quote, args))
- exe = os.path.join(os.getcwd(), BUILD_DIR_NAME, BUILD_EXE_NAME)
- cmd = '%s %s' % (exe, flags)
- print 'Running %s' % cmd
- os.system(cmd)
-
- os.chdir(cwd)
- print 'Cleaning temp dir ...'
- try:
- shutil.rmtree(tempdir, True)
- except Exception, e:
- pass
-
-
-def AskIsGoodBuild(rev):
- """Ask the user whether build |rev| is good or bad."""
- # Loop until we get a response that we can parse.
- while True:
- response = raw_input('\nBuild %d is [(g)ood/(b)ad]: ' % int(rev))
- if response and response in ('g', 'b'):
- return response == 'g'
-
-def main():
- usage = ('%prog [options] [-- chromium-options]\n'
- 'Perform binary search on the snapshot builds.\n'
- '\n'
- 'Tip: add "-- --no-first-run" to bypass the first run prompts.')
- parser = optparse.OptionParser(usage=usage)
- # Strangely, the default help output doesn't include the choice list.
- choices = ['mac', 'xp', 'linux', 'linux-64', 'linux-chromiumos']
- parser.add_option('-a', '--archive',
- choices = choices,
- help = 'The buildbot archive to bisect [%s].' %
- '|'.join(choices))
- parser.add_option('-b', '--bad', type = 'int',
- help = 'The bad revision to bisect to.')
- parser.add_option('-g', '--good', type = 'int',
- help = 'The last known good revision to bisect from.')
- parser.add_option('-p', '--profile', '--user-data-dir', type = 'str',
- help = 'Profile to use; this will not reset every run. ' +
- 'Defaults to a clean profile.')
- (opts, args) = parser.parse_args()
-
- if opts.archive is None:
- print 'Error: missing required parameter: --archive'
- print
- parser.print_help()
- return 1
-
- if opts.bad and opts.good and (opts.good > opts.bad):
- print ('The good revision (%d) must precede the bad revision (%d).\n' %
- (opts.good, opts.bad))
- parser.print_help()
- return 1
-
- SetArchiveVars(opts.archive)
-
- # Pick a starting point, try to get HEAD for this.
- if opts.bad:
- bad_rev = opts.bad
- else:
- bad_rev = 0
- try:
- # Location of the latest build revision number
- BUILD_LATEST_URL = '%s/LATEST' % (BUILD_BASE_URL)
- nh = urllib.urlopen(BUILD_LATEST_URL)
- latest = int(nh.read())
- nh.close()
- bad_rev = raw_input('Bad revision [HEAD:%d]: ' % latest)
- if (bad_rev == ''):
- bad_rev = latest
- bad_rev = int(bad_rev)
- except Exception, e:
- print('Could not determine latest revision. This could be bad...')
- bad_rev = int(raw_input('Bad revision: '))
-
- # Find out when we were good.
- if opts.good:
- good_rev = opts.good
- else:
- good_rev = 0
- try:
- good_rev = int(raw_input('Last known good [0]: '))
- except Exception, e:
- pass
-
- # Get a list of revisions to bisect across.
- revlist = GetRevList(good_rev, bad_rev)
- if len(revlist) < 2: # Don't have enough builds to bisect
- print 'We don\'t have enough builds to bisect. revlist: %s' % revlist
- sys.exit(1)
-
- # If we don't have a |good_rev|, set it to be the first revision possible.
- if good_rev == 0:
- good_rev = revlist[0]
-
- # These are indexes of |revlist|.
- good = 0
- bad = len(revlist) - 1
- last_known_good_rev = revlist[good]
-
- # Binary search time!
- while good < bad:
- candidates = revlist[good:bad]
- num_poss = len(candidates)
- if num_poss > 10:
- print('%d candidates. %d tries left.' %
- (num_poss, round(math.log(num_poss, 2))))
- else:
- print('Candidates: %s' % revlist[good:bad])
-
- # Cut the problem in half...
- test = int((bad - good) / 2) + good
- test_rev = revlist[test]
-
- # Let the user give this rev a spin (in her own profile, if she wants).
- profile = opts.profile
- if not profile:
- profile = 'profile' # In a temp dir.
- TryRevision(test_rev, profile, args)
- if AskIsGoodBuild(test_rev):
- last_known_good_rev = revlist[good]
- good = test + 1
- else:
- bad = test
- # We're done. Let the user know the results in an official manner.
- print('You are probably looking for build %d.' % revlist[bad])
- print('CHANGELOG URL:')
- print(CHANGELOG_URL % (last_known_good_rev, revlist[bad]))
- print('Built at revision:')
- print(BUILD_VIEWVC_URL % revlist[bad])
+print "This script has been moved to tools/bisect-builds.py."
+print "Please update any docs you're working from!"
-if __name__ == '__main__':
- sys.exit(main())
+sys.exit(1)
diff --git a/build/common.gypi b/build/common.gypi
index 1b260cd..e741a29 100644
--- a/build/common.gypi
+++ b/build/common.gypi
@@ -140,6 +140,9 @@
# Remoting compilation is enabled by default. Set to 0 to disable.
'remoting%': 1,
+ # Use libjpeg-turbo as the JPEG codec used by Chromium.
+ 'use_libjpeg_turbo%': 0,
+
'library%': '<(library)',
# Variable 'component' is for cases where we would like to build some
@@ -317,7 +320,7 @@
# Use GConf, the GNOME configuration system.
'use_gconf%': 1,
- # Use OpenSSL instead of NSS. Currently in development.
+ # Use OpenSSL instead of NSS. Under development: see http://crbug.com/62803
'use_openssl%': 0,
'conditions': [
@@ -400,6 +403,13 @@
}, {
'use_cups%': 0,
}],
+ # Set the relative path from this file to the GYP file of the JPEG
+ # library used by Chromium.
+ ['use_libjpeg_turbo==1', {
+ 'libjpeg_gyp_path': '../third_party/libjpeg_turbo/libjpeg.gyp',
+ }, {
+ 'libjpeg_gyp_path': '../third_party/libjpeg/libjpeg.gyp',
+ }], # use_libjpeg_turbo==1
],
# NOTE: When these end up in the Mac bundle, we need to replace '-' for '_'
@@ -541,9 +551,6 @@
}],
],
}],
- # Linux gyp (into scons) doesn't like target_conditions?
- # TODO(???): track down why 'target_conditions' doesn't work
- # on Linux gyp into scons like it does on Mac gyp into xcodeproj.
['OS=="linux"', {
'cflags': [ '-ftest-coverage',
'-fprofile-arcs' ],
@@ -894,73 +901,6 @@
'ldflags': [
'-pthread', '-Wl,-z,noexecstack',
],
- 'scons_variable_settings': {
- 'LIBPATH': ['$LIB_DIR'],
- # Linking of large files uses lots of RAM, so serialize links
- # using the handy flock command from util-linux.
- 'FLOCK_LINK': ['flock', '$TOP_BUILDDIR/linker.lock', '$LINK'],
- 'FLOCK_SHLINK': ['flock', '$TOP_BUILDDIR/linker.lock', '$SHLINK'],
- 'FLOCK_LDMODULE': ['flock', '$TOP_BUILDDIR/linker.lock', '$LDMODULE'],
-
- # We have several cases where archives depend on each other in
- # a cyclic fashion. Since the GNU linker does only a single
- # pass over the archives we surround the libraries with
- # --start-group and --end-group (aka -( and -) ). That causes
- # ld to loop over the group until no more undefined symbols
- # are found. In an ideal world we would only make groups from
- # those libraries which we knew to be in cycles. However,
- # that's tough with SCons, so we bodge it by making all the
- # archives a group by redefining the linking command here.
- #
- # TODO: investigate whether we still have cycles that
- # require --{start,end}-group. There has been a lot of
- # refactoring since this was first coded, which might have
- # eliminated the circular dependencies.
- #
- # Note: $_LIBDIRFLAGS comes before ${LINK,SHLINK,LDMODULE}FLAGS
- # so that we prefer our own built libraries (e.g. -lpng) to
- # system versions of libraries that pkg-config might turn up.
- # TODO(sgk): investigate handling this not by re-ordering the
- # flags this way, but by adding a hook to use the SCons
- # ParseFlags() option on the output from pkg-config.
- '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']],
- 'LDMODULECOM': [['$FLOCK_LDMODULE', '-o', '$TARGET',
- '$_LIBDIRFLAGS', '$LDMODULEFLAGS', '$SOURCES',
- '-Wl,--start-group', '$_LIBFLAGS', '-Wl,--end-group']],
- 'IMPLICIT_COMMAND_DEPENDENCIES': 0,
- # -rpath is only used when building with shared libraries.
- 'conditions': [
- [ 'library=="shared_library"', {
- 'RPATH': '$LIB_DIR',
- }],
- ],
- },
- 'scons_import_variables': [
- 'AS',
- 'CC',
- 'CXX',
- 'LINK',
- ],
- 'scons_propagate_variables': [
- 'AS',
- 'CC',
- 'CCACHE_DIR',
- 'CXX',
- 'DISTCC_DIR',
- 'DISTCC_HOSTS',
- 'HOME',
- 'INCLUDE_SERVER_ARGS',
- 'INCLUDE_SERVER_PORT',
- 'LINK',
- 'CHROME_BUILD_TYPE',
- 'CHROMIUM_BUILD',
- 'OFFICIAL_BUILD',
- ],
'configurations': {
'Debug_Base': {
'variables': {
@@ -1168,9 +1108,6 @@
# http://code.google.com/p/googletest/source/detail?r=446 .
# TODO(thakis): Use -isystem instead (http://crbug.com/58751 ).
'-Wno-unnamed-type-template-args',
- # The integrated assembler chokes on one ffmpeg file.
- # http://crbug.com/61931
- '-no-integrated-as',
],
'cflags!': [
# Clang doesn't seem to know know this flag.
@@ -1186,9 +1123,6 @@
'cflags': [ '-g' ],
'defines': ['USE_LINUX_BREAKPAD'],
}],
- ['linux_use_seccomp_sandbox==1 and buildtype!="Official"', {
- 'defines': ['USE_SECCOMP_SANDBOX'],
- }],
['library=="shared_library"', {
# When building with shared libraries, remove the visiblity-hiding
# flag.
@@ -1199,6 +1133,11 @@
'cflags': ['-fPIC']
}]
],
+ 'ldflags!': [
+ # --as-needed confuses library interdependencies.
+ # See http://code.google.com/p/chromium/issues/detail?id=61430
+ '-Wl,--as-needed',
+ ],
}],
['linux_use_heapchecker==1', {
'variables': {'linux_use_tcmalloc%': 1},
@@ -1503,10 +1442,6 @@
},
}],
],
- 'scons_settings': {
- 'sconsbuild_dir': '<(DEPTH)/sconsbuild',
- 'tools': ['ar', 'as', 'gcc', 'g++', 'gnulink', 'chromium_builders'],
- },
'xcode_settings': {
# DON'T ADD ANYTHING NEW TO THIS BLOCK UNLESS YOU REALLY REALLY NEED IT!
# This block adds *project-wide* configuration settings to each project
diff --git a/build/features_override.gypi b/build/features_override.gypi
index 5c069ea..dc59950 100644
--- a/build/features_override.gypi
+++ b/build/features_override.gypi
@@ -15,6 +15,7 @@
'ENABLE_BLOB=1',
'ENABLE_BLOB_SLICE=1',
'ENABLE_CHANNEL_MESSAGING=1',
+ 'ENABLE_CLIENT_BASED_GEOLOCATION=0',
'ENABLE_DASHBOARD_SUPPORT=0',
'ENABLE_DATABASE=1',
'ENABLE_DATAGRID=0',
diff --git a/build/linux/dump_signature.py b/build/linux/dump_signature.py
deleted file mode 100755
index 37e50f4..0000000
--- a/build/linux/dump_signature.py
+++ /dev/null
@@ -1,56 +0,0 @@
-#!/usr/bin/python
-#
-# Copyright (c) 2010 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-#
-# This generates symbol signatures with the same algorithm as
-# src/breakpad/src/common/linux/file_id.cc@461
-
-import struct
-import sys
-import subprocess
-
-if len(sys.argv) != 2:
- sys.stderr.write("Error, no filename specified.\n")
- sys.exit(1)
-
-# Shell out to objdump to get the offset of the .text section
-objdump = subprocess.Popen(['objdump', '-h', sys.argv[1]], stdout = subprocess.PIPE)
-(sections, _) = objdump.communicate()
-if objdump.returncode != 0:
- sys.stderr.write('Failed to run objdump to find .text section.\n')
- sys.exit(1)
-
-text_section = [x for x in sections.splitlines() if '.text' in x]
-if len(text_section) == 0:
- sys.stderr.write('objdump failed to find a .text section.\n')
- sys.exit(1)
-text_section = text_section[0]
-try:
- file_offset = int(text_section.split()[5], 16)
-except ValueError:
- sys.stderr.write("Failed to parse objdump output. Here is the failing line:\n");
- sys.stderr.write(text_section)
- sys.exit(1)
-
-bin = open(sys.argv[1])
-bin.seek(file_offset)
-if bin.tell() != file_offset:
- sys.stderr.write("Failed to seek to the .text segment. Truncated file?\n");
- sys.exit(1)
-
-data = bin.read(4096)
-if len(data) != 4096:
- sys.stderr.write("Error, did not read first page of data.\n");
- sys.exit(1)
-bin.close()
-
-signature = [0] * 16
-for i in range(0, 4096):
- signature[i % 16] ^= ord(data[i])
-
-# Append a 0 at the end for the generation number (always 0 on Linux)
-out = ('%08X%04X%04X%02X%02X%02X%02X%02X%02X%02X%02X0' %
- struct.unpack('I2H8B', struct.pack('16B', *signature)))
-sys.stdout.write(out)
diff --git a/build/linux/system.gyp b/build/linux/system.gyp
index 85f8063..39b3a11 100644
--- a/build/linux/system.gyp
+++ b/build/linux/system.gyp
@@ -93,7 +93,6 @@
# out of $(pkg-config --cflags nss) and GYP include paths
# come after cflags on the command line. So we have these
# bodges:
- '-I../net/third_party/nss/ssl', # for scons
'-Inet/third_party/nss/ssl', # for make
'-IWebKit/chromium/net/third_party/nss/ssl', # for make in webkit
'<!@(<(pkg-config) --cflags nss)',
@@ -347,29 +346,6 @@
],
},
},
- {
- 'target_name': 'openssl',
- 'type': 'settings',
- 'conditions': [
- ['use_openssl==1', {
- 'direct_dependent_settings': {
- 'defines': [
- # OpenSSL support is incomplete: http://crbug.com/62803.
- # Defining USE_OPENSSL disables USE_NSS.
- 'USE_OPENSSL',
- ],
- 'include_dirs': [
- '<!@(<(pkg-config) --cflags openssl)',
- ],
- },
- 'link_settings': {
- 'libraries': [
- '<!@(<(pkg-config) --libs-only-l openssl)',
- ],
- },
- },],
- ],
- },
],
}
diff --git a/build/sanitize-mac-build-log.sed b/build/sanitize-mac-build-log.sed
new file mode 100644
index 0000000..d6cef78
--- /dev/null
+++ b/build/sanitize-mac-build-log.sed
@@ -0,0 +1,22 @@
+#!/bin/echo Use sanitize-mac-build-log.sh or sed -f
+
+# Copyright (c) 2010 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+# Use this sed script to reduce a Mac build log into something readable.
+
+# Drop uninformative lines.
+/^distcc/d
+/^Check dependencies/d
+/^ setenv /d
+/^ cd /d
+/^make: Nothing to be done/d
+
+# Xcode prints a short "compiling foobar.o" line followed by the lengthy
+# full command line. These deletions drop the command line.
+\|^ /Developer/usr/bin/|d
+
+# Shorten the "compiling foobar.o" line.
+s|^Distributed-CompileC \(.*\) normal i386 c++ com.apple.compilers.gcc.4_2| CC \1|
+s|^CompileC \(.*\) normal i386 c++ com.apple.compilers.gcc.4_2| CC \1|
diff --git a/build/sanitize-mac-build-log.sh b/build/sanitize-mac-build-log.sh
new file mode 100755
index 0000000..dc743fa
--- /dev/null
+++ b/build/sanitize-mac-build-log.sh
@@ -0,0 +1,6 @@
+#!/bin/sh
+# Copyright (c) 2010 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+sed -f `dirname "${0}"`/`basename "${0}" sh`sed
+
diff --git a/build/sanitize-win-build-log.sed b/build/sanitize-win-build-log.sed
new file mode 100644
index 0000000..d6d049c
--- /dev/null
+++ b/build/sanitize-win-build-log.sed
@@ -0,0 +1,14 @@
+#!/bin/echo Use sanitize-win-build-log.sh or sed -f
+
+# Copyright (c) 2010 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+# Use this sed script to reduce a Windows build log into something
+# machine-parsable.
+
+# Drop uninformative lines.
+/The operation completed successfully./d
+
+# Drop parallelization indicators on lines.
+s/^[0-9]\+>//
diff --git a/build/sanitize-win-build-log.sh b/build/sanitize-win-build-log.sh
new file mode 100755
index 0000000..dc743fa
--- /dev/null
+++ b/build/sanitize-win-build-log.sh
@@ -0,0 +1,6 @@
+#!/bin/sh
+# Copyright (c) 2010 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+sed -f `dirname "${0}"`/`basename "${0}" sh`sed
+
diff --git a/build/whitespace_file.txt b/build/whitespace_file.txt
index 7bd040c..ccedfae 100644
--- a/build/whitespace_file.txt
+++ b/build/whitespace_file.txt
@@ -6,4 +6,4 @@ This file is used for making non-code changes to trigger buildbot cycles. Make
any modification below this line.
================================================================================
-I AM SOMEWHAT SPARTA
+i am somewhat YELLY!