diff --git a/build/core/default-build-commands.mk b/build/core/default-build-commands.mk
index 60ab955..8cf40dc 100644
--- a/build/core/default-build-commands.mk
+++ b/build/core/default-build-commands.mk
@@ -102,11 +102,8 @@
 # the toolchain's setup.mk script.
 TOOLCHAIN_PREFIX = $(TOOLCHAIN_ROOT)/bin/$(TOOLCHAIN_NAME)-
 
-ifneq ($(findstring ccc-analyzer,$(CC)),)
-    TARGET_CC = $(CC)
-else
-    TARGET_CC = $(LLVM_TOOLCHAIN_PREFIX)clang$(HOST_EXEEXT)
-endif
+TARGET_CC = $(LLVM_TOOLCHAIN_PREFIX)clang$(HOST_EXEEXT)
+TARGET_CXX = $(LLVM_TOOLCHAIN_PREFIX)clang++$(HOST_EXEEXT)
 
 CLANG_TIDY = $(LLVM_TOOLCHAIN_PREFIX)clang-tidy$(HOST_EXEEXT)
 
@@ -143,12 +140,6 @@
 TARGET_CONLYFLAGS =
 TARGET_CXXFLAGS = $(TARGET_CFLAGS)
 
-ifneq ($(findstring c++-analyzer,$(CXX)),)
-    TARGET_CXX = $(CXX)
-else
-    TARGET_CXX = $(LLVM_TOOLCHAIN_PREFIX)clang++$(HOST_EXEEXT)
-endif
-
 TARGET_RS_CC    = $(RENDERSCRIPT_TOOLCHAIN_PREFIX)llvm-rs-cc
 TARGET_RS_BCC   = $(RENDERSCRIPT_TOOLCHAIN_PREFIX)bcc_compat
 TARGET_RS_FLAGS = -Wall -Werror
diff --git a/build/ndk-build b/build/ndk-build
index 85d10e6..08e1e29 100755
--- a/build/ndk-build
+++ b/build/ndk-build
@@ -231,58 +231,11 @@
     log "Cygwin-compatible GNU make detected"
 fi
 
+NDK_ANALYZER_FLAGS=
 if [ "$NDK_ANALYZE" = 1 ]; then
-    . $PROGDIR/tools/dev-defaults.sh  # for DEFAULT_LLVM_VERSION
-
-    # Return flags send in env. or command line which are enough to retrive APP_ABI and TOOLCHAIN_PREFIX later
-    gen_flags ()
-    {
-        local FLAGS=
-
-        if [ -n "$PROJECT_PATH" ] ; then
-            FLAGS=$FLAGS" -C $PROJECT_PATH"
-        fi
-        if [ -n "$APP_ABI" ] ; then
-            FLAGS=$FLAGS" APP_ABI=$APP_ABI"
-        fi
-        echo "$FLAGS"
-    }
-
-    get_build_var ()
-    {
-        local VAR=$1
-        local FLAGS=`gen_flags`
-        $GNUMAKE --no-print-dir -f $PROGDIR/core/build-local.mk $FLAGS DUMP_${VAR} | tail -1
-    }
-
-    get_build_var_for_abi ()
-    {
-        local VAR=$1
-        local ABI=$2
-        local FLAGS=`gen_flags`
-        $GNUMAKE --no-print-dir -f $PROGDIR/core/build-local.mk $FLAGS DUMP_${VAR} APP_ABI=${ABI} | tail -1
-    }
-
-    APP_ABIS=`get_build_var APP_ABI`
-    for ABI in $APP_ABIS; do
-        LLVM_TOOLCHAIN_PREFIX=`get_build_var LLVM_TOOLCHAIN_PREFIX`
-        ANALYZER_OUT=`get_build_var NDK_APP_ANALYZER_OUT`
-
-        ANALYZER_CC=${LLVM_TOOLCHAIN_PREFIX}clang
-        ANALYZER_CXX=${LLVM_TOOLCHAIN_PREFIX}clang++
-
-        ANALYZER_OUT_FLAG=
-        if [ -n "$NDK_ANALYZER_OUT" ]; then
-            ANALYZER_OUT_FLAG="-o $NDK_ANALYZER_OUT/$ABI"
-        fi
-
-        perl ${LLVM_TOOLCHAIN_PREFIX}scan-build \
-            --use-cc $ANALYZER_CC \
-            --use-c++ $ANALYZER_CXX \
-            --status-bugs \
-            $ANALYZER_OUT_FLAG \
-            $GNUMAKE -f $PROGDIR/core/build-local.mk "$@" APP_ABI=$ABI
-    done
-else
-    $GNUMAKE -O -f $PROGDIR/core/build-local.mk "$@"
+    # Continue supporting the old interface to the static analyzer. clang-tidy
+    # does all the same checks by default (and some new ones).
+    NDK_ANALYZER_FLAGS=APP_CLANG_TIDY=true
 fi
+
+$GNUMAKE -O -f $PROGDIR/core/build-local.mk $NDK_ANALYZER_FLAGS "$@"
diff --git a/build/tools/build-shader-tools.py b/build/tools/build-shader-tools.py
deleted file mode 100755
index 716ed00..0000000
--- a/build/tools/build-shader-tools.py
+++ /dev/null
@@ -1,150 +0,0 @@
-#!/usr/bin/env python
-#
-# Copyright (C) 2016 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-"""Builds the glslc, spirv-as, spirv-dis, and spirv-val host executables."""
-
-from __future__ import print_function
-
-import os
-import site
-import shutil
-import subprocess
-
-site.addsitedir(os.path.join(os.path.dirname(__file__), '../lib'))
-site.addsitedir(os.path.join(os.path.dirname(__file__), '../..'))
-
-# pylint: disable=import-error,wrong-import-position
-import build_support
-from build_support import ArgParser
-import ndk.hosts
-# pylint: enable=import-error,wrong-import-position
-
-
-def main(args):
-    host_tag = build_support.host_to_tag(args.host)
-    build_host_tag = build_support.get_default_host().value + "-x86"
-
-    package_dir = args.dist_dir
-
-    # TODO(danalbert): use ndk/sources/third_party/googletest/googletest
-    # after it has been updated to a version with CMakeLists
-    gtest_dir = build_support.android_path('external', 'googletest')
-    gtest_cmd = f'-DSHADERC_GOOGLE_TEST_DIR={gtest_dir}'
-
-    # SPIRV-Tools tests require effcee and re2.
-    # Don't enable RE2 testing because it's long and not useful to us.
-    effcee_dir = build_support.android_path('external', 'effcee')
-    re2_dir = build_support.android_path('external', 'regex-re2')
-    effcee_args = [('-DSHADERC_EFFCEE_DIR=' + effcee_dir),
-                   ('-DSHADERC_RE2_DIR=' + re2_dir),
-                   ('-DEFFCEE_GOOGLETEST_DIR=' + gtest_dir),
-                   ('-DEFFCEE_RE2_DIR=' + re2_dir),
-                   ('-DRE2_BUILD_TESTING=OFF')]
-
-    obj_out = os.path.join(args.out_dir, 'shader_tools/obj')
-    install_dir = os.path.join(args.out_dir, 'shader_tools/install')
-
-    package_src = '-'.join([os.path.join(args.out_dir,
-                                         'shader_tools/shader-tools'),
-                            host_tag])
-    package_name = '-'.join(['shader-tools', host_tag])
-
-    source_root = build_support.android_path('external', 'shaderc')
-    shaderc_shaderc_dir = os.path.join(source_root, 'shaderc')
-    spirv_headers_dir = os.path.join(source_root, 'spirv-headers')
-
-    cmake = build_support.android_path('prebuilts', 'cmake',
-                                       build_host_tag, 'bin', 'cmake')
-    ctest = build_support.android_path('prebuilts', 'cmake',
-                                       build_host_tag, 'bin', 'ctest')
-    ninja = build_support.android_path('prebuilts', 'ninja',
-                                       build_host_tag, 'ninja')
-    file_extension = ''
-
-    additional_args = list(effcee_args)
-    if args.host.is_windows:
-        gtest_cmd = ''
-        mingw_root = os.path.join(build_support.android_path(),
-                                  'prebuilts', 'gcc', build_host_tag, 'host',
-                                  'x86_64-w64-mingw32-4.8')
-        mingw_compilers = os.path.join(mingw_root, 'bin', 'x86_64-w64-mingw32')
-        mingw_toolchain = os.path.join(source_root, 'shaderc',
-                                       'cmake', 'linux-mingw-toolchain.cmake')
-        gtest_root = build_support.android_path('external', 'googletest')
-        additional_args.extend(['-DCMAKE_TOOLCHAIN_FILE=' + mingw_toolchain,
-                                '-DMINGW_SYSROOT=' + mingw_root,
-                                '-DMINGW_COMPILER_PREFIX=' + mingw_compilers,
-                                '-DSHADERC_GOOGLE_TEST_DIR=' + gtest_root])
-        file_extension = '.exe'
-        if args.host == ndk.hosts.Host.Windows64:
-            additional_args.extend(
-                ['-DCMAKE_CXX_FLAGS=-fno-rtti -fno-exceptions'])
-        else:
-            additional_args.extend(
-                ['-DCMAKE_CXX_FLAGS=-m32 -fno-rtti -fno-exceptions',
-                 '-DCMAKE_C_FLAGS=-m32'])
-
-    for d in [package_src, obj_out, install_dir]:
-        try:
-            os.makedirs(d)
-        except:
-            pass
-
-    cmake_command = [cmake, '-GNinja', '-DCMAKE_MAKE_PROGRAM=' + ninja,
-                     '-DCMAKE_BUILD_TYPE=Release',
-                     '-DCMAKE_INSTALL_PREFIX=' + install_dir,
-                     '-DSHADERC_THIRD_PARTY_ROOT_DIR=' + source_root,
-                     '-DSPIRV-Headers_SOURCE_DIR=' + spirv_headers_dir,
-                     gtest_cmd,
-                     shaderc_shaderc_dir]
-
-    cmake_command.extend(additional_args)
-
-    subprocess.check_call(cmake_command, cwd=obj_out)
-    subprocess.check_call([cmake, '--build', obj_out, '--', '-v'])
-    subprocess.check_call([cmake, '--build', obj_out,
-                           '--target', 'install/strip'])
-
-    files_to_copy = ['glslc' + file_extension,
-                     'spirv-as' + file_extension,
-                     'spirv-dis' + file_extension,
-                     'spirv-val' + file_extension,
-                     'spirv-cfg' + file_extension,
-                     'spirv-opt' + file_extension,
-                     'spirv-link' + file_extension,
-                     'spirv-reduce' + file_extension]
-    scripts_to_copy = ['spirv-lesspipe.sh',]
-    files_to_copy.extend(scripts_to_copy)
-
-    # Test, except on windows.
-    if not args.host.is_windows:
-        subprocess.check_call([ctest, '--verbose'], cwd=obj_out)
-
-    # Copy to install tree.
-    for src in files_to_copy:
-        shutil.copy2(os.path.join(install_dir, 'bin', src),
-                     os.path.join(package_src, src))
-    if args.host.is_windows:
-        for src in scripts_to_copy:
-            # Convert line endings on scripts.
-            # Do it in place to preserve executable permissions.
-            subprocess.check_call(['unix2dos', '-o',
-                                   os.path.join(package_src, src)])
-
-    build_support.make_package(package_name, package_src, package_dir)
-
-if __name__ == '__main__':
-    build_support.run(main, ArgParser)
diff --git a/build/tools/prebuilt-common.sh b/build/tools/prebuilt-common.sh
index b8bf0e4..d84ce09 100644
--- a/build/tools/prebuilt-common.sh
+++ b/build/tools/prebuilt-common.sh
@@ -1408,13 +1408,6 @@
         echo "ERROR: Not a directory: '$SRC_DIR'"
         exit 1
     fi
-
-    if [ ! -f "$SRC_DIR/build/configure" -o ! -d "$SRC_DIR/gcc" ]; then
-        echo "ERROR: Either the file $SRC_DIR/build/configure or"
-        echo "       the directory $SRC_DIR/gcc does not exist."
-        echo "This is not the top of a toolchain tree: $SRC_DIR"
-        exit 1
-    fi
 }
 
 make_repo_prop () {
diff --git a/docs/changelogs/Changelog-r22.md b/docs/changelogs/Changelog-r22.md
index 328aec0..9295feb 100644
--- a/docs/changelogs/Changelog-r22.md
+++ b/docs/changelogs/Changelog-r22.md
@@ -21,11 +21,13 @@
 
 ## r22b
 
-  * [Issue 1388]: Fixed LLVM's incorrect conversion to list files for long command
-    lines on Windows.
-  * [Issue 1391]: Fixed missing symbols from libz.a.
-  * [Issue 1427]: Fixed Clang auto-detection for CMake 3.19 and older for Windows.
+* [Issue 1377]: Fix Clang backend crash in register scavenging.
+* [Issue 1388]: Fixed LLVM's incorrect conversion to list files for long command
+  lines on Windows.
+* [Issue 1391]: Fixed missing symbols from libz.a.
+* [Issue 1427]: Fixed Clang auto-detection for CMake 3.19 and older for Windows.
 
+[Issue 1377]: https://github.com/android/ndk/issues/1377
 [Issue 1388]: https://github.com/android/ndk/issues/1388
 [Issue 1391]: https://github.com/android/ndk/issues/1391
 [Issue 1427]: https://github.com/android/ndk/issues/1427
diff --git a/docs/changelogs/Changelog-r23.md b/docs/changelogs/Changelog-r23.md
index 61eec28..89b309c 100644
--- a/docs/changelogs/Changelog-r23.md
+++ b/docs/changelogs/Changelog-r23.md
@@ -13,8 +13,18 @@
   removed in the next release. If you are building with `-fno-integrated-as`,
   file bugs if anything is preventing you from removing that flag.
 
+* Support for GDB has ended. The GDB from r22 will continue to be included in
+  the NDK, but it will be removed if and when it stops working. Use LLDB
+  instead. Note that `ndk-gdb` uses LLDB by default.
+
 ## Changes
 
+* Includes preview Android S DP 1 APIs.
+* Updated LLVM to clang-r412851, based on LLVM 12 development.
+  * [Issue 1047]: Fixes crash when using ASan with the CFI unwinder.
+  * [Issue 1096]: Includes support for [Polly]. Enable by adding `-mllvm -polly`
+    to your cflags.
+  * [Issue 1406]: Fixes crash with Neon intrinsic.
 * Vulkan validation layer source and binaries are no longer shipped in the NDK.
   The latest are now posted directly to [GitHub](https://github.com/KhronosGroup/Vulkan-ValidationLayers/releases).
 * Vulkan tools source is also removed, specifically vulkan_wrapper.
@@ -28,9 +38,18 @@
   static libraries.
 * [Issue 1390]: ndk-build now warns when building a static executable with the
   wrong API level.
+* [Issue 1452]: `NDK_ANALYZE=1` now sets `APP_CLANG_TIDY=true` rather than using
+  scan-build. clang-tidy performs all the same checks by default, and scan-build
+  was no longer working. See the bug for more details, but no user-side changes
+  should be needed.
 
 [Issue 929]: https://github.com/android/ndk/issues/929
+[Issue 1047]: https://github.com/android/ndk/issues/1047
+[Issue 1096]: https://github.com/android/ndk/issues/1096
 [Issue 1390]: https://github.com/android/ndk/issues/1390
+[Issue 1406]: https://github.com/android/ndk/issues/1406
+[Issue 1452]: https://github.com/android/ndk/issues/1452
+[Polly]: https://polly.llvm.org/
 
 ## Known Issues
 
diff --git a/meta/platforms.json b/meta/platforms.json
index a124f69..32ff583 100644
--- a/meta/platforms.json
+++ b/meta/platforms.json
@@ -1,6 +1,6 @@
 {
   "min": 16,
-  "max": 30,
+  "max": 31,
   "aliases": {
     "20": 19,
     "25": 24,
@@ -17,6 +17,7 @@
     "O-MR1": 27,
     "P": 28,
     "Q": 29,
-    "R": 30
+    "R": 30,
+    "S": 31
   }
 }
diff --git a/ndk-gdb.py b/ndk-gdb.py
index 5212287..3f68024 100755
--- a/ndk-gdb.py
+++ b/ndk-gdb.py
@@ -706,6 +706,10 @@
     device = args.device
     use_lldb = not args.no_lldb
 
+    if not use_lldb:
+        print("WARNING: --no-lldb was used by GDB is no longer supported.")
+        print("GDB will be used, but will be removed in a future release.")
+
     if device is None:
         error("Could not find a unique connected device/emulator.")
 
diff --git a/ndk/abis.py b/ndk/abis.py
index 57914ce..6430a8c 100644
--- a/ndk/abis.py
+++ b/ndk/abis.py
@@ -23,14 +23,14 @@
 
 
 LP32_ABIS = (
-    'armeabi-v7a',
-    'x86',
+    Abi('armeabi-v7a'),
+    Abi('x86'),
 )
 
 
 LP64_ABIS = (
-    'arm64-v8a',
-    'x86_64',
+    Abi('arm64-v8a'),
+    Abi('x86_64'),
 )
 
 
diff --git a/ndk/builds.py b/ndk/builds.py
index bd9a96b..ed011c5 100644
--- a/ndk/builds.py
+++ b/ndk/builds.py
@@ -23,15 +23,15 @@
 # https://github.com/PyCQA/pylint/issues/73
 from distutils.dir_util import copy_tree
 from enum import auto, Enum, unique
+from ndk.cmake import CMakeBuilder
 import os
 from pathlib import Path, PureWindowsPath
 import shutil
 import stat
 import subprocess
 import textwrap
-from typing import Any, Dict, Iterable, Iterator, List, Optional, Set
+from typing import Any, Dict, Iterator, List, Optional, Set
 
-from ndk.abis import Arch, ALL_ARCHITECTURES
 from ndk.autoconf import AutoconfBuilder
 import ndk.ext.shutil
 from ndk.hosts import Host
@@ -59,12 +59,11 @@
     """Class containing build context information."""
 
     def __init__(self, out_dir: Path, dist_dir: Path, modules: List[Module],
-                 host: Host, arches: List[Arch], build_number: str) -> None:
+                 host: Host, build_number: str) -> None:
         self.out_dir = out_dir
         self.dist_dir = dist_dir
         self.modules = {m.name: m for m in modules}
         self.host = host
-        self.arches = arches
         self.build_number = build_number
 
 
@@ -106,13 +105,6 @@
     # text being included in NOTICE.toolchain.
     notice_group = NoticeGroup.BASE
 
-    # If split_build_by_arch is set, one workqueue task will be created for
-    # each architecture. The Module object will be cloned for each arch and
-    # each will have build_arch set to the architecture that should be built by
-    # that module. If build_arch is None, the module has not yet been split.
-    split_build_by_arch = False
-    build_arch: Optional[Arch] = None
-
     # Set to True if this module is merely a build convenience and not intented
     # to be shipped. For example, Platforms has its own build steps but is
     # shipped within the Toolchain module. If this value is set, the module's
@@ -193,20 +185,17 @@
         assert self.context is not None
         return self.context.modules[name]
 
-    def get_build_host_install(self, arch: Optional[Arch] = None) -> Path:
+    def get_build_host_install(self) -> Path:
         """Returns the module's install path for the current host.
 
         In a cross-compiling context (i.e. building the Windows NDK from
         Linux), this will return the install directory for the build OS rather
         than the target OS.
 
-        Args:
-            arch: Architecture to fetch for architecture-specific modules.
-
         Returns:
             This module's install path for the build host.
         """
-        return self.get_install_path(Host.current(), arch)
+        return self.get_install_path(Host.current())
 
     @property
     def out_dir(self) -> Path:
@@ -226,12 +215,6 @@
         assert self.context is not None
         return self.context.host
 
-    @property
-    def arches(self) -> List[Arch]:
-        """Architectures targeted by the current build."""
-        assert self.context is not None
-        return self.context.arches
-
     def build(self) -> None:
         """Builds the module.
 
@@ -250,48 +233,26 @@
         The install phase should only copy files, not create them. Compilation
         should happen in the build phase.
         """
-        package_installs = ndk.packaging.expand_packages(
-            self.name, str(self.path), self.host, self.arches)
+        package_name, package_install = ndk.packaging.expand_package(
+            self.name, str(self.path), self.host)
 
         install_base = Path(
             ndk.paths.get_install_path(str(self.out_dir), self.host))
         if self.intermediate_module:
             install_base = self.intermediate_out_dir / 'install'
-        for package_name, package_install in package_installs:
-            assert self.context is not None
-            install_path = install_base / package_install
-            package = self.context.dist_dir / package_name
-            if install_path.exists():
-                shutil.rmtree(install_path)
-            ndk.packaging.extract_zip(str(package), str(install_path))
 
-    def get_install_paths(self, host: Host,
-                          arches: Optional[Iterable[Arch]]) -> List[Path]:
-        """Returns the install paths for the given archiectures."""
-        install_subdirs = [
-            Path(p)
-            for p in ndk.packaging.expand_paths(str(self.path), host, arches)
-        ]
-        install_base = Path(ndk.paths.get_install_path(str(self.out_dir),
-                                                       host))
-        if self.intermediate_module:
-            install_base = self.intermediate_out_dir / 'install'
-        return [install_base / d for d in install_subdirs]
+        assert self.context is not None
+        install_path = install_base / package_install
+        package = self.context.dist_dir / package_name
+        if install_path.exists():
+            shutil.rmtree(install_path)
+        ndk.packaging.extract_zip(str(package), str(install_path))
 
-    def get_install_path(self,
-                         host: Optional[Host] = None,
-                         arch: Optional[Arch] = None) -> Path:
+    def get_install_path(self, host: Optional[Host] = None) -> Path:
         """Returns the install path for the given module config.
 
-        For an architecture-independent module, there should only ever be one
-        install path.
-
-        For an architecture-dependent module, the optional arch argument must
-        be provided to select between the install paths.
-
         Args:
             host: The host to use for a host-specific install path.
-            arch: The architecture to use for an architecure-dependent module.
 
         Raises:
             ValueError: This is an architecture-dependent module and no
@@ -302,45 +263,19 @@
         if host is None:
             host = self.host
 
-        arch_dependent = False
-        if ndk.packaging.package_varies_by(str(self.path), 'abi'):
-            arch_dependent = True
-        elif ndk.packaging.package_varies_by(str(self.path), 'arch'):
-            arch_dependent = True
-        elif ndk.packaging.package_varies_by(str(self.path), 'toolchain'):
-            arch_dependent = True
-        elif ndk.packaging.package_varies_by(str(self.path), 'triple'):
-            arch_dependent = True
-
-        arches = None
-        if arch is not None:
-            arches = [arch]
-        elif self.build_arch is not None:
-            arches = [self.build_arch]
-        elif arch_dependent:
-            raise ValueError(
-                f'get_install_path for {arch} requires valid arch')
-
-        install_subdirs = self.get_install_paths(host, arches)
-
-        if len(install_subdirs) != 1:
-            raise RuntimeError(
-                f'non-unique install path for single arch: {self.path}')
-
-        return install_subdirs[0]
+        install_subdir = Path(ndk.packaging.expand_path(str(self.path), host))
+        install_base = Path(ndk.paths.get_install_path(str(self.out_dir),
+                                                       host))
+        if self.intermediate_module:
+            install_base = self.intermediate_out_dir / 'install'
+        return install_base / install_subdir
 
     @property
     def intermediate_out_dir(self) -> Path:
         """Path for intermediate outputs of this module."""
-        base_path = self.out_dir / self.host.value / self.name
-        if self.split_build_by_arch:
-            return base_path / self.build_arch
-        else:
-            return base_path
+        return self.out_dir / self.host.value / self.name
 
     def __str__(self) -> str:
-        if self.split_build_by_arch and self.build_arch is not None:
-            return f'{self.name} [{self.build_arch}]'
         return self.name
 
     def __hash__(self) -> int:
@@ -355,12 +290,7 @@
     @property
     def log_file(self) -> str:
         """Returns the basename of the log file for this module."""
-        if self.split_build_by_arch and self.build_arch is not None:
-            return f'{self.name}-{self.build_arch}.log'
-        elif self.split_build_by_arch:
-            raise RuntimeError('Called log_file on unsplit module')
-        else:
-            return f'{self.name}.log'
+        return f'{self.name}.log'
 
     def log_path(self, log_dir: Path) -> Path:
         """Returns the path to the log file for this module."""
@@ -404,6 +334,48 @@
             str(install_dir))
 
 
+class CMakeModule(Module):
+    # Path to the source code
+    src: Path
+    _builder: Optional[CMakeBuilder] = None
+    run_ctest: bool = False
+
+    @property
+    def builder(self) -> CMakeBuilder:
+        """Returns the lazily initialized builder for this module."""
+        if self._builder is None:
+            self._builder = CMakeBuilder(
+                self.src,
+                self.intermediate_out_dir,
+                self.host,
+                additional_flags=self.flags,
+                additional_env=self.env,
+                run_ctest=self.run_ctest)
+        return self._builder
+
+    @property
+    def env(self) -> Dict[str, str]:
+        return dict()
+
+    @property
+    def flags(self) -> List[str]:
+        return []
+
+    @property
+    def defines(self) -> Dict[str, str]:
+        return dict()
+
+    def build(self) -> None:
+        self.builder.build(self.defines)
+
+    def install(self) -> None:
+        install_dir = self.get_install_path()
+        install_dir.mkdir(parents=True, exist_ok=True)
+        copy_tree(
+            str(self.builder.install_directory),
+            str(install_dir))
+
+
 class PackageModule(Module):
     """A directory to be installed to the NDK.
 
@@ -416,25 +388,11 @@
     def default_notice_path(self) -> Path:
         return self.src / 'NOTICE'
 
-    def validate(self) -> None:
-        super().validate()
-
-        if ndk.packaging.package_varies_by(str(self.path), 'abi'):
-            raise self.validate_error('PackageModule cannot vary by abi')
-        if ndk.packaging.package_varies_by(str(self.path), 'arch'):
-            raise self.validate_error('PackageModule cannot vary by arch')
-        if ndk.packaging.package_varies_by(str(self.path), 'toolchain'):
-            raise self.validate_error('PackageModule cannot vary by toolchain')
-        if ndk.packaging.package_varies_by(str(self.path), 'triple'):
-            raise self.validate_error('PackageModule cannot vary by triple')
-
     def build(self) -> None:
         pass
 
     def install(self) -> None:
-        install_paths = self.get_install_paths(self.host, ALL_ARCHITECTURES)
-        assert len(install_paths) == 1
-        install_path = install_paths[0]
+        install_path = self.get_install_path(self.host)
         install_directory(self.src, install_path)
 
 
@@ -448,20 +406,8 @@
     #: The path to the build script relative to the top of the source tree.
     script: Path
 
-    #: True if the module can be built in parallel per-architecture.
-    arch_specific = False
-
     def build(self) -> None:
         build_args = common_build_args(self.out_dir, self.dist_dir, self.host)
-        if self.split_build_by_arch:
-            build_args.append(f'--arch={self.build_arch}')
-        elif self.arch_specific and len(self.arches) == 1:
-            build_args.append(f'--arch={self.arches[0]}')
-        elif set(self.arches) == set(ALL_ARCHITECTURES):
-            pass
-        else:
-            raise NotImplementedError(
-                f'Module {self.name} can only build all architectures or none')
         script = self.get_script_path()
         invoke_external_build(script, build_args)
 
@@ -597,12 +543,7 @@
 
     def get_script_path(self) -> Path:
         """Returns the installed path of the script."""
-        scripts = [
-            Path(p) for p in ndk.packaging.expand_paths(
-                str(self.script), self.host, ALL_ARCHITECTURES)
-        ]
-        assert len(scripts) == 1
-        return scripts[0]
+        return Path(ndk.packaging.expand_path(str(self.script), self.host))
 
 
 class PythonPackage(Module):
diff --git a/ndk/checkbuild.py b/ndk/checkbuild.py
index a7a8304..05862bd 100755
--- a/ndk/checkbuild.py
+++ b/ndk/checkbuild.py
@@ -39,7 +39,6 @@
 import os
 from pathlib import Path
 import pipes
-import pprint
 import re
 import shutil
 import site
@@ -313,9 +312,6 @@
     with open(ndk.paths.ndk_path('qa_config.json')) as config_file:
         test_config = json.load(config_file)
 
-    if args.arch is not None:
-        test_config['abis'] = ndk.abis.arch_to_abis(args.arch)
-
     test_spec = ndk.test.builder.test_spec_from_config(test_config)
     builder = ndk.test.builder.TestBuilder(
         test_spec, test_options, printer)
@@ -396,7 +392,8 @@
             shutil.rmtree(install_path)
         if not install_path.parent.exists():
             install_path.parent.mkdir(parents=True)
-        shutil.copytree(ClangToolchain.path_for_host(self.host), install_path)
+        shutil.copytree(ClangToolchain.path_for_host(self.host), install_path,
+                        symlinks=not self.host.is_windows)
 
         # clang-4053586 was patched in the prebuilts directory to add the
         # libc++ includes. These are almost certainly a different revision than
@@ -418,18 +415,15 @@
             (bin_dir / 'clang.real').rename(clang)
             (bin_dir / 'clang++').symlink_to('clang')
 
-            # The prebuilts have duplicates as clang-MAJ. Remove these to save
-            # space.
-            for path in bin_dir.glob('clang-*'):
-                if re.search(r'^clang-\d+$', path.name) is not None:
-                    path.unlink()
-
-        # Remove LLD duplicates. We only need ld.lld.
-        # http://b/74250510
         bin_ext = '.exe' if self.host.is_windows else ''
-        (bin_dir / f'ld64.lld{bin_ext}').unlink()
-        (bin_dir / f'lld{bin_ext}').unlink()
-        (bin_dir / f'lld-link{bin_ext}').unlink()
+        if self.host.is_windows:
+            # Remove LLD duplicates. We only need ld.lld. For non-Windows these
+            # are all symlinks so we can keep them (and *need* to keep lld
+            # since that's the real binary).
+            # http://b/74250510
+            (bin_dir / f'ld64.lld{bin_ext}').unlink()
+            (bin_dir / f'lld{bin_ext}').unlink()
+            (bin_dir / f'lld-link{bin_ext}').unlink()
 
         install_clanglib = install_path / 'lib64/clang'
         linux_prebuilt_path = ClangToolchain.path_for_host(Host.Linux)
@@ -438,12 +432,17 @@
         if self.host != Host.Windows64:
             python_bin_dir = install_path / 'python3' / 'bin'
             python_files_to_remove = [
-                '2to3', '2to3-3.8', 'easy_install-3.8', 'idle3', 'idle3.8', 'pip3',
-                'pip3.8', 'pydoc3', 'pydoc3.8', 'python3-config',
-                'python3.8-config',
+                '2to3*', 'easy_install*', 'idle*', 'pip*',
+                'pydoc*', 'python*-config',
             ]
-            for pyfile in python_files_to_remove:
-                (python_bin_dir / pyfile).unlink()
+            for file_pattern in python_files_to_remove:
+                for pyfile in python_bin_dir.glob(file_pattern):
+                    pyfile.unlink()
+
+        # Remove lldb-argdumper in site-packages. libc++ is not available there.
+        # People should use bin/lldb-argdumper instead.
+        for pylib in (install_path / 'lib').glob('python*'):
+            (pylib / f'site-packages/lldb/lldb-argdumper{bin_ext}').unlink()
 
         if self.host != Host.Linux:
             # We don't build target binaries as part of the Darwin or Windows
@@ -478,14 +477,17 @@
         shutil.rmtree(install_path / 'lib64/cmake')
 
 
-def get_gcc_prebuilt_path(host: Host, arch: ndk.abis.Arch) -> Path:
-    """Returns the path to the GCC prebuilt for the given host/arch."""
-    toolchain = ndk.abis.arch_to_toolchain(arch) + '-4.9'
-    prebuilt_path = (ANDROID_DIR / 'prebuilts/ndk/current/toolchains' /
-                     host.tag / toolchain)
+def get_gcc_prebuilt_path(arch: ndk.abis.Arch) -> Path:
+    """Returns the path to the GCC prebuilt for the given arch.
+
+    Since this is only used for getting *target* binaries like libgcc, we
+    always use the Linux prebuilts.
+    """
+    prebuilt_path = (ANDROID_DIR /
+                     'prebuilts/ndk/current/toolchains/linux-x86_64' /
+                     f'{ndk.abis.arch_to_toolchain(arch)}-4.9')
     if not prebuilt_path.is_dir():
-        raise RuntimeError(
-            'Could not find prebuilt GCC at {}'.format(prebuilt_path))
+        raise RuntimeError(f'Could not find prebuilt GCC at {prebuilt_path}')
     return prebuilt_path
 
 
@@ -519,7 +521,6 @@
 
 
 def install_gcc_lib(install_path: Path,
-                    host: Host,
                     arch: ndk.abis.Arch,
                     subarch: str,
                     lib_subdir: Path,
@@ -533,25 +534,24 @@
         lib_install_dir.mkdir(parents=True)
 
     shutil.copy2(
-        get_gcc_prebuilt_path(host, arch) / src_subdir / subarch / libname,
+        get_gcc_prebuilt_path(arch) / src_subdir / subarch / libname,
         lib_install_dir / libname)
 
 
-def install_gcc_crtbegin(install_path: Path, host: Host, arch: ndk.abis.Arch,
+def install_gcc_crtbegin(install_path: Path, arch: ndk.abis.Arch,
                          subarch: str) -> None:
     triple = ndk.abis.arch_to_triple(arch)
     subdir = Path('lib/gcc') / triple / '4.9.x'
-    install_gcc_lib(install_path, host, arch, subarch, subdir, 'crtbegin.o')
+    install_gcc_lib(install_path, arch, subarch, subdir, 'crtbegin.o')
 
 
 def install_libgcc(install_path: Path,
-                   host: Host,
                    arch: ndk.abis.Arch,
                    subarch: str,
                    new_layout: bool = False) -> None:
     triple = ndk.abis.arch_to_triple(arch)
     subdir = Path('lib/gcc') / triple / '4.9.x'
-    install_gcc_lib(install_path, host, arch, subarch, subdir, 'libgcc.a')
+    install_gcc_lib(install_path, arch, subarch, subdir, 'libgcc.a')
 
     if new_layout:
         # For all architectures, we want to ensure that libcompiler_rt-extras
@@ -591,11 +591,11 @@
         libgcc_path.write_text('INPUT({})'.format(libs))
 
 
-def install_libatomic(install_path: Path, host: Host, arch: ndk.abis.Arch,
+def install_libatomic(install_path: Path, arch: ndk.abis.Arch,
                       subarch: str) -> None:
     triple = ndk.abis.arch_to_triple(arch)
     libdir_name = 'lib64' if arch.endswith('64') else 'lib'
-    install_gcc_lib(install_path, host, arch, subarch,
+    install_gcc_lib(install_path, arch, subarch,
                     Path('lib/gcc') / triple / '4.9.x', 'libatomic.a',
                     Path(triple) / libdir_name)
 
@@ -612,11 +612,13 @@
     ]
 
 
-class ShaderTools(ndk.builds.InvokeBuildModule):
+class ShaderTools(ndk.builds.CMakeModule):
     name = 'shader-tools'
+    src = ANDROID_DIR / 'external' / 'shaderc' / 'shaderc'
     path = Path('shader-tools/{host}')
-    script = Path('build-shader-tools.py')
+    run_ctest = True
     notice_group = ndk.builds.NoticeGroup.TOOLCHAIN
+    deps = {'clang'}
 
     @property
     def notices(self) -> Iterator[Path]:
@@ -629,6 +631,92 @@
         yield glslang_dir / 'LICENSE.txt'
         yield spirv_dir / 'LICENSE'
 
+    @property
+    def defines(self) -> Dict[str, str]:
+        gtest_dir = ANDROID_DIR / 'external' / 'googletest'
+        effcee_dir = ANDROID_DIR / 'external' / 'effcee'
+        re2_dir = ANDROID_DIR / 'external' / 'regex-re2'
+        spirv_headers_dir = self.src.parent / 'spirv-headers'
+        defines = {
+            'SHADERC_EFFCEE_DIR': str(effcee_dir),
+            'SHADERC_RE2_DIR': str(re2_dir),
+            'SHADERC_GOOGLE_TEST_DIR': str(gtest_dir),
+            'SHADERC_THIRD_PARTY_ROOT_DIR': str(self.src.parent),
+            'EFFCEE_GOOGLETEST_DIR': str(gtest_dir),
+            'EFFCEE_RE2_DIR': str(re2_dir),
+            # SPIRV-Tools tests require effcee and re2.
+            # Don't enable RE2 testing because it's long and not useful to us.
+            'RE2_BUILD_TESTING': 'OFF',
+            'SPIRV-Headers_SOURCE_DIR': str(spirv_headers_dir),
+        }
+        return defines
+
+    @property
+    def flags(self) -> List[str]:
+        return super().flags + [
+            '-Wno-unused-command-line-argument',
+            '-fno-rtti',
+            '-fno-exceptions',
+        ]
+
+    @property
+    def env(self) -> Dict[str, str]:
+        # Sets path for libc++, for ctest.
+        if self.host == Host.Linux:
+            return {'LD_LIBRARY_PATH': str(self._libcxx_dir)}
+        elif self.host == Host.Darwin:
+            return {'DYLD_LIBRARY_PATH': str(self._libcxx_dir)}
+        return {}
+
+    @property
+    def _libcxx_dir(self) -> Path:
+        return self.get_dep('clang').get_build_host_install() / 'lib64'
+
+    @property
+    def _libcxx(self) -> List[Path]:
+        path = self._libcxx_dir
+        if self.host == Host.Linux:
+            return [
+                path / 'libc++.so.1',
+                path / 'libc++abi.so.1',
+            ]
+        elif self.host == Host.Darwin:
+            return [
+                path / 'libc++.1.dylib',
+                path / 'libc++abi.1.dylib',
+            ]
+        return []
+
+    def install(self) -> None:
+        self.get_install_path().mkdir(parents=True, exist_ok=True)
+        ext = '.exe' if self.host.is_windows else ''
+        files_to_copy = [
+            f'glslc{ext}', f'spirv-as{ext}', f'spirv-dis{ext}',
+            f'spirv-val{ext}', f'spirv-cfg{ext}', f'spirv-opt{ext}',
+            f'spirv-link{ext}', f'spirv-reduce{ext}'
+        ]
+        scripts_to_copy = ['spirv-lesspipe.sh']
+
+        # Copy to install tree.
+        for src in files_to_copy + scripts_to_copy:
+            shutil.copy2(self.builder.install_directory / 'bin' / src,
+                         self.get_install_path())
+
+        if self.host.is_windows:
+            for src in scripts_to_copy:
+                # Convert line endings on scripts.
+                # Do it in place to preserve executable permissions.
+                subprocess.check_call(
+                    ['unix2dos', '-o',
+                     self.get_install_path() / src])
+
+        # Symlink libc++ to install path.
+        for lib in self._libcxx:
+            symlink_name = self.get_install_path() / lib.name
+            symlink_name.unlink(missing_ok=True)
+            symlink_name.symlink_to(
+                Path(os.path.relpath(lib, symlink_name.parent)))
+
 
 class Make(ndk.builds.AutoconfModule):
     name = 'make'
@@ -670,55 +758,65 @@
     src = NDK_DIR / 'ndk-which'
 
 
-class HostTools(ndk.builds.Module):
-    name = 'host-tools'
+class Python(ndk.builds.Module):
+    """Module for host Python 2 to support GDB.
+
+    This is now a prebuilt. Next time this or GDB breaks we'll be removing both
+    and migrating the tools we ship with ndk-build to Python 3.
+    """
+
+    name = 'python'
     path = Path('prebuilt/{host}')
+    PREBUILTS_BASE = ANDROID_DIR / 'prebuilts/ndk/python'
+    notice = ANDROID_DIR / 'prebuilts/ndk/python/NOTICE'
     notice_group = ndk.builds.NoticeGroup.TOOLCHAIN
 
-    @property
-    def notices(self) -> Iterator[Path]:
-        yield ANDROID_DIR / 'toolchain/python/Python-2.7.5/LICENSE'
-        yield NDK_DIR / 'sources/host-tools/toolbox/NOTICE'
-
     def build(self) -> None:
-        build_args = ndk.builds.common_build_args(self.out_dir, self.dist_dir,
-                                                  self.host)
-
-        if self.host.is_windows:
-            print('Building toolbox...')
-            ndk.builds.invoke_external_build(
-                NDK_DIR / 'sources/host-tools/toolbox/build.py', build_args)
-
-        print('Building Python...')
-        ndk.builds.invoke_external_build(
-            ANDROID_DIR / 'toolchain/python/build.py', build_args)
+        pass
 
     def install(self) -> None:
+        copy_tree(str(self.PREBUILTS_BASE / self.host.tag),
+                  str(self.get_install_path()))
+
+
+class Toolbox(ndk.builds.Module):
+    name = 'toolbox'
+    path = Path('prebuilt/{host}/bin')
+    notice_group = ndk.builds.NoticeGroup.TOOLCHAIN
+    notice = NDK_DIR / 'sources/host-tools/toolbox/NOTICE'
+
+    def build_exe(self, src: Path, name: str) -> None:
+        toolchain = ClangToolchain(self.host)
+        cmd = [
+            str(toolchain.cc),
+            '-s',
+            '-o',
+            str(self.intermediate_out_dir / f'{name}.exe'),
+            str(src),
+        ] + toolchain.flags
+        subprocess.run(cmd, check=True)
+
+    def build(self) -> None:
+        if not self.host.is_windows:
+            print(f'Nothing to do for {self.host}')
+            return
+
+        self.intermediate_out_dir.mkdir(parents=True, exist_ok=True)
+
+        src_dir = NDK_DIR / 'sources/host-tools/toolbox'
+        self.build_exe(src_dir / 'echo_win.c', 'echo')
+        self.build_exe(src_dir / 'cmp_win.c', 'cmp')
+
+    def install(self) -> None:
+        if not self.host.is_windows:
+            print(f'Nothing to do for {self.host}')
+            return
+
         install_dir = self.get_install_path()
         install_dir.mkdir(parents=True, exist_ok=True)
 
-        packages = [
-            'ndk-python'
-        ]
-
-        if self.host.is_windows:
-            packages.append('toolbox')
-
-        package_names = [f'{p}-{self.host.tag}.tar.bz2' for p in packages]
-        for package_name in package_names:
-            package_path = self.out_dir / self.host.value / package_name
-            subprocess.check_call(
-                ['tar', 'xf', str(package_path), '-C', str(install_dir),
-                 '--strip-components=1'])
-
-        # Remove unused python scripts.
-        exclude_files = [
-            'python2.7-config', 'python-config.sh', 'pydoc', 'idle', '2to3',
-            'smtpd.py', 'python2-config', 'python-config'
-        ]
-        for file_to_remove in exclude_files:
-            (install_dir / 'bin' / file_to_remove).unlink()
-
+        shutil.copy2(self.intermediate_out_dir / 'echo.exe', install_dir)
+        shutil.copy2(self.intermediate_out_dir / 'cmp.exe', install_dir)
 
 def install_exe(out_dir: str, install_dir: str, name: str, host: Host) -> None:
     ext = '.exe' if host.is_windows else ''
@@ -740,7 +838,6 @@
     path = Path('sources/cxx-stl/llvm-libc++')
     notice = src / 'LICENSE.TXT'
     notice_group = ndk.builds.NoticeGroup.TOOLCHAIN
-    arch_specific = True
     deps = {
         'base-toolchain',
         'libandroid_support',
@@ -756,13 +853,6 @@
     def lib_out(self) -> str:
         return os.path.join(self.out_dir, 'libcxx/libs')
 
-    @property
-    def abis(self) -> List[ndk.abis.Abi]:
-        abis = []
-        for arch in self.arches:
-            abis.extend(ndk.abis.arch_to_abis(arch))
-        return abis
-
     def build(self) -> None:
         ndk_build = os.path.join(
             self.get_dep('ndk-build').get_build_host_install(), 'ndk-build')
@@ -773,7 +863,6 @@
 
         build_cmd = [
             'bash', ndk_build, build_support.jobs_arg(), 'V=1',
-            'APP_ABI=' + ' '.join(self.abis),
 
             # Since nothing in this build depends on libc++_static, we need to
             # name it to force it to build.
@@ -811,7 +900,7 @@
             os.path.join(install_root, 'include'))
         shutil.copytree(self.lib_out, os.path.join(install_root, 'libs'))
 
-        for abi in self.abis:
+        for abi in ndk.abis.ALL_ABIS:
             lib_dir = os.path.join(install_root, 'libs', abi)
 
             # The static libraries installed to the obj dir, not the lib dir.
@@ -1085,373 +1174,43 @@
 class Gdb(ndk.builds.Module):
     """Module for multi-arch host GDB.
 
-    Note that the device side, gdbserver, is a separate module because it needs
-    to be cross compiled for all four Android ABIs.
+    This is now a prebuilt. GDB is no longer supported. Next time it breaks
+    we'll be removing it.
     """
 
     name = 'gdb'
-    path = Path('prebuilt/{host}')
+    path = Path('prebuilt')
 
-    deps = {
-        'make',
-        'host-tools',
-    }
-
-    GDB_VERSION = '8.3'
-
-    expat_src = ndk.paths.ANDROID_DIR / 'toolchain/expat/expat-2.0.1'
-    lzma_src = ndk.paths.ANDROID_DIR / 'toolchain/xz'
-    gdb_src = ndk.paths.ANDROID_DIR / f'toolchain/gdb/gdb-{GDB_VERSION}'
-
+    PREBUILTS_BASE = ANDROID_DIR / 'prebuilts/ndk/gdb'
+    notice = ANDROID_DIR / 'prebuilts/ndk/gdb/NOTICE'
     notice_group = ndk.builds.NoticeGroup.TOOLCHAIN
 
-    _expat_builder: Optional[ndk.autoconf.AutoconfBuilder] = None
-    _lzma_builder: Optional[ndk.cmake.CMakeBuilder] = None
-    _gdb_builder: Optional[ndk.autoconf.AutoconfBuilder] = None
-
-    @property
-    def notices(self) -> Iterator[Path]:
-        yield self.expat_src / 'COPYING'
-        yield self.gdb_src / 'COPYING'
-        yield self.lzma_src / 'COPYING'
-
-    @property
-    def expat_builder(self) -> ndk.autoconf.AutoconfBuilder:
-        """Returns the lazily initialized expat builder for this module."""
-        if self._expat_builder is None:
-            self._expat_builder = ndk.autoconf.AutoconfBuilder(
-                self.expat_src / 'configure',
-                self.intermediate_out_dir / 'expat',
-                self.host,
-                use_clang=True)
-        return self._expat_builder
-
-    @property
-    def lzma_builder(self) -> ndk.cmake.CMakeBuilder:
-        """Returns the lazily initialized lzma builder for this module."""
-        if self._lzma_builder is None:
-            self._lzma_builder = ndk.cmake.CMakeBuilder(
-                self.lzma_src,
-                self.intermediate_out_dir / 'lzma',
-                self.host)
-        return self._lzma_builder
-
-    @property
-    def gdb_builder(self) -> ndk.autoconf.AutoconfBuilder:
-        """Returns the lazily initialized gdb builder for this module."""
-        if self._gdb_builder is None:
-            no_build_or_host = False
-            additional_flags = []
-            if self.host == Host.Darwin:
-                # Awful Darwin hack. For some reason GDB doesn't produce a gdb
-                # executable when using --build/--host.
-                no_build_or_host = True
-                additional_flags.append('-Wl,-rpath,@loader_path/../lib')
-            if self.host == Host.Linux:
-                additional_flags.append('-Wl,-rpath,$$$$\\ORIGIN/../lib')
-            # Add path for libc++.
-            clang_path = ClangToolchain.path_for_host(self.host)
-            additional_flags.append('-L' + str(clang_path / 'lib64'))
-            self._gdb_builder = ndk.autoconf.AutoconfBuilder(
-                self.gdb_src / 'configure',
-                self.intermediate_out_dir / 'gdb',
-                self.host,
-                use_clang=True,
-                no_build_or_host=no_build_or_host,
-                # Since we statically link libpython, python dynamic libraries may
-                # depend on symbols in gdb binary.
-                no_strip=True,
-                additional_flags=additional_flags)
-        return self._gdb_builder
-
-    @property
-    def gdb_stub_install_path(self) -> Path:
-        """The gdb stub install path."""
-        return self.gdb_builder.install_directory / 'bin/gdb-stub'
-
-    def build_expat(self) -> None:
-        """Builds the expat dependency."""
-        self.expat_builder.build([
-            '--disable-shared',
-            '--enable-static',
-        ])
-
-    def build_lzma(self) -> None:
-        """Builds the liblzma dependency."""
-        self.lzma_builder.build({
-            'BUILD_SHARED_LIBS': 'OFF',
-        })
-
-    def build_gdb(self) -> None:
-        """Builds GDB itself."""
-        targets = ' '.join(ndk.abis.ALL_TRIPLES)
-        # TODO: Cleanup Python module so we don't need this explicit path.
-        python_config = (Path(self.out_dir) / self.host.value / 'python' /
-                         self.host.tag /
-                         'install/host-tools/bin/python-config.sh')
-        configure_args = [
-            '--with-expat',
-            f'--with-libexpat-prefix={self.expat_builder.install_directory}',
-            f'--with-python={python_config}',
-            f'--enable-targets={targets}',
-            '--disable-shared',
-            '--disable-werror',
-            '--disable-nls',
-            '--disable-docs',
-            '--without-mpc',
-            '--without-mpfr',
-            '--without-gmp',
-            '--without-isl',
-            '--disable-sim',
-            '--enable-gdbserver=no',
-        ]
-
-        configure_args.extend([
-            '--with-lzma',
-            f'--with-liblzma-prefix={self.lzma_builder.install_directory}',
-        ])
-
-        self.gdb_builder.build(configure_args)
-
-    def build_gdb_stub(self) -> None:
-        """Builds a gdb wrapper to setup PYTHONHOME.
-
-        We need to use gdb with the Python it was built against, so we need to
-        setup PYTHONHOME to point to the NDK's Python, not the host's.
-        """
-        if self.host.is_windows:
-            # TODO: Does it really need to be an executable?
-            # It's probably an executable because the original author wanted a
-            # .exe rather than a .cmd. Not sure how disruptive this change
-            # would be now. Presumably hardly at all because everyone needs to
-            # use ndk-gdb for reasonable behavior anyway?
-            self.build_exe_gdb_stub()
-        else:
-            self.build_sh_gdb_stub()
-
-    def build_exe_gdb_stub(self) -> None:
-        # Don't need to worry about extension here because it'll be renamed on
-        # install anyway.
-        gdb_stub_path = self.gdb_builder.install_directory / 'bin/gdb-stub'
-        stub_src = ndk.paths.NDK_DIR / 'sources/host-tools/gdb-stub/gdb-stub.c'
-        mingw_path = (ndk.paths.ANDROID_DIR /
-                      'prebuilts/gcc/linux-x86/host/x86_64-w64-mingw32-4.8/bin'
-                      / 'x86_64-w64-mingw32-gcc')
-
-        cmd = [
-            str(mingw_path),
-            '-O2',
-            '-s',
-            '-DNDEBUG',
-            str(stub_src),
-            '-o',
-            str(gdb_stub_path),
-        ]
-        pp_cmd = ' '.join([pipes.quote(arg) for arg in cmd])
-        print('Running: {}'.format(pp_cmd))
-        subprocess.run(cmd, check=True)
-
-    def build_sh_gdb_stub(self) -> None:
-        self.gdb_stub_install_path.write_text(
-            textwrap.dedent("""\
-            #!/bin/bash
-            GDBDIR=$(cd $(dirname $0) && pwd)
-            PYTHONHOME="$GDBDIR/.." "$GDBDIR/gdb-orig" "$@"
-            """))
-        self.gdb_stub_install_path.chmod(0o755)
-
     def build(self) -> None:
-        """Builds GDB."""
-        if self.intermediate_out_dir.exists():
-            shutil.rmtree(self.intermediate_out_dir)
+        pass
 
-        self.build_expat()
-        self.build_lzma()
-        self.build_gdb()
-        self.build_gdb_stub()
+    @property
+    def install_dir(self) -> Path:
+        return Path(self.get_install_path())
+
+    def gdbserver_for(self, arch: ndk.abis.Arch) -> Path:
+        return self.PREBUILTS_BASE / f'android-{arch}'
+
+    def install_gdbserver(self, arch: ndk.abis.Arch) -> None:
+        gdbserver_dir = Path(f'android-{arch}/gdbserver')
+        install_dir = self.install_dir / gdbserver_dir
+        if install_dir.exists():
+            shutil.rmtree(install_dir)
+        shutil.copytree(self.PREBUILTS_BASE / gdbserver_dir, install_dir)
+
+    def install_gdb(self) -> None:
+        copy_tree(str(self.PREBUILTS_BASE / self.host.tag),
+                  str(self.install_dir / self.host.tag))
 
     def install(self) -> None:
         """Installs GDB."""
-        install_dir = Path(self.get_install_path())
-        copy_tree(
-            str(self.gdb_builder.install_directory / 'bin'),
-            str(install_dir / 'bin'))
-        gdb_share_dir = self.gdb_builder.install_directory / 'share/gdb'
-        gdb_share_install_dir = install_dir / 'share/gdb'
-        if gdb_share_install_dir.exists():
-            shutil.rmtree(gdb_share_install_dir)
-        shutil.copytree(gdb_share_dir, gdb_share_install_dir)
-
-        exe_suffix = '.exe' if self.host.is_windows else ''
-        gdb_exe = install_dir / ('bin/gdb' + exe_suffix)
-
-        # gdb is currently gdb(.exe)? and the gdb stub is currently gdb-stub.
-        # Make them gdb-orig(.exe)? and gdb(.exe)? respectively.
-        gdb_exe.rename(install_dir / ('bin/gdb-orig' + exe_suffix))
-
-        gdb_stub = install_dir / 'bin/gdb-stub'
-        gdb_stub.rename(install_dir / ('bin/gdb' + exe_suffix))
-
-        # Install libc++.
-        clang_path = ClangToolchain.path_for_host(self.host)
-        libcxx_files: Dict[Host, List[str]] = {
-            Host.Darwin: ['libc++abi.1.dylib', 'libc++.1.dylib'],
-            Host.Linux: ['libc++abi.so.1', 'libc++.so.1'],
-            Host.Windows64: [],
-        }
-        for f in libcxx_files[self.host]:
-            shutil.copy(clang_path / 'lib64' / f, install_dir / 'lib')
-
-
-class GdbServer(ndk.builds.Module):
-    name = 'gdbserver'
-    path = Path('prebuilt/android-{arch}/gdbserver')
-    notice = ANDROID_DIR / f'toolchain/gdb/gdb-{Gdb.GDB_VERSION}/gdb/COPYING'
-    notice_group = ndk.builds.NoticeGroup.TOOLCHAIN
-    arch_specific = True
-    split_build_by_arch = True
-    deps = {
-        'toolchain',
-    }
-    max_api = Platforms().get_apis()[-1]
-
-    libthread_db_src_dir = ndk.paths.ndk_path('sources/android/libthread_db')
-    gdbserver_src_dir = ndk.paths.android_path(
-        f'toolchain/gdb/gdb-{Gdb.GDB_VERSION}/gdb/gdbserver')
-
-    @property
-    def build_dir(self) -> Path:
-        """Returns the build directory for the current architecture."""
-        assert self.build_arch is not None
-        return self.out_dir / self.name / self.build_arch
-
-    @property
-    def libthread_db_a_path(self) -> str:
-        """Returns the path to the built libthread_db.a."""
-        return os.path.join(self.build_dir, 'libthread_db.a')
-
-    def get_tool(self, name: str) -> Path:
-        """Returns the path to the given tool in the toolchain.
-
-        Args:
-            name: Name of the tool. e.g. 'ar'.
-
-        Returns:
-            Path to the specified tool.
-        """
-        toolchain = Path(self.get_dep('toolchain').get_build_host_install())
-        return toolchain / 'bin' / name
-
-    def build_libthread_db(self, api_level: int) -> None:
-        """Builds libthread_db.a for the current architecture."""
-        assert self.build_arch is not None
-
-        libthread_db_c = os.path.join(self.libthread_db_src_dir,
-                                      'libthread_db.c')
-        libthread_db_o = os.path.join(self.build_dir, 'libthread_db.o')
-        cc_args = [
-            str(self.get_tool('clang')),
-            '-target',
-            ndk.abis.clang_target(self.build_arch, api_level),
-            '-I',
-            self.libthread_db_src_dir,
-            '-o',
-            libthread_db_o,
-            '-c',
-            libthread_db_c,
-        ]
-
-        print('Running: {}'.format(' '.join(
-            [pipes.quote(arg) for arg in cc_args])))
-        subprocess.run(cc_args, check=True)
-
-        ar_args = [
-            str(self.get_tool('llvm-ar')),
-            'rD',
-            self.libthread_db_a_path,
-            libthread_db_o,
-        ]
-
-        print('Running: {}'.format(' '.join(
-            [pipes.quote(arg) for arg in ar_args])))
-        subprocess.run(ar_args, check=True)
-
-    def configure(self, api_level: int) -> None:
-        """Configures the gdbserver build for the current architecture."""
-        assert self.build_arch is not None
-        gdbserver_host = {
-            'arm': 'arm-eabi-linux',
-            'arm64': 'aarch64-eabi-linux',
-            'x86': 'i686-linux-android',
-            'x86_64': 'x86_64-linux-android',
-        }[self.build_arch]
-
-        cflags = ['-O2', '-I' + self.libthread_db_src_dir]
-        if self.build_arch.startswith('arm'):
-            cflags.append('-fno-short-enums')
-        if self.build_arch.endswith('64'):
-            cflags.append('-DUAPI_HEADERS')
-
-        ldflags = '-static -Wl,-z,nocopyreloc -Wl,--no-undefined'
-
-        # Use --target as part of CC so it is used when linking as well.
-        target = ndk.abis.clang_target(self.build_arch, api_level)
-        clang = f'{self.get_tool("clang")} --target={target}'
-        clangplusplus = f'{self.get_tool("clang++")} --target={target}'
-        configure_env = {
-            'CC': clang,
-            'CXX': clangplusplus,
-            'AR': str(self.get_tool('llvm-ar')),
-            'RANLIB': str(self.get_tool('llvm-ranlib')),
-            'CFLAGS': ' '.join(cflags),
-            'CXXFLAGS': ' '.join(cflags),
-            'LDFLAGS': ldflags,
-        }
-
-        configure_args = [
-            os.path.join(self.gdbserver_src_dir, 'configure'),
-            '--build=x86_64-linux-gnu',
-            f'--host={gdbserver_host}',
-            f'--with-libthread-db={self.libthread_db_a_path}',
-            '--disable-inprocess-agent',
-            '--enable-werror=no',
-        ]
-
-        subproc_env = dict(os.environ)
-        subproc_env.update(configure_env)
-        print('Running: {} with env:\n{}'.format(
-            ' '.join([pipes.quote(arg) for arg in configure_args]),
-            pprint.pformat(configure_env, indent=4)))
-        subprocess.run(configure_args, env=subproc_env, check=True)
-
-    def make(self) -> None:
-        """Runs make for the configured build."""
-        subprocess.run(['make', build_support.jobs_arg()], check=True)
-
-    def build(self) -> None:
-        """Builds gdbserver."""
-        if not os.path.exists(self.build_dir):
-            os.makedirs(self.build_dir)
-
-        max_api = Platforms().get_apis()[-1]
-        with ndk.ext.os.cd(str(self.build_dir)):
-            self.build_libthread_db(max_api)
-            self.configure(max_api)
-            self.make()
-
-    def install(self) -> None:
-        """Installs gdbserver."""
-        if os.path.exists(self.get_install_path()):
-            shutil.rmtree(self.get_install_path())
-        os.makedirs(self.get_install_path())
-
-        objcopy_args = [
-            str(self.get_tool('llvm-objcopy')),
-            '--strip-unneeded',
-            os.path.join(self.build_dir, 'gdbserver'),
-            os.path.join(self.get_install_path(), 'gdbserver'),
-        ]
-        subprocess.run(objcopy_args, check=True)
+        self.install_gdb()
+        for arch in ndk.abis.ALL_ARCHITECTURES:
+            self.install_gdbserver(arch)
 
 
 class LibShaderc(ndk.builds.Module):
@@ -1598,22 +1357,8 @@
 
     def install(self) -> None:
         super().install()
-
-        # GTest renamed these files to be all lower case, but the SDK patcher
-        # doesn't handle that properly. Rename them back to the old names so
-        # the SDK patches apply properly.
-        # http://b/122741472
-        install_dir = self.get_install_path()
-        docs_dir = os.path.join(install_dir, 'docs')
-        rename_map = {
-            'faq.md': 'FAQ.md',
-            'primer.md': 'Primer.md',
-            'samples.md': 'Samples.md',
-        }
-        for rename_from, rename_to in rename_map.items():
-            os.rename(
-                os.path.join(docs_dir, rename_from),
-                os.path.join(docs_dir, rename_to))
+        # Docs are moved to top level directory.
+        shutil.rmtree(self.get_install_path() / 'docs')
 
 
 class Sysroot(ndk.builds.Module):
@@ -1821,10 +1566,9 @@
         yield from Sysroot().notices
         yield from SystemStl().notices
         yield ANDROID_DIR / 'toolchain/binutils/binutils-2.27/gas/COPYING'
-        for host in Host:
-            for arch in ndk.abis.ALL_ARCHITECTURES:
-                # For libgcc/libatomic.
-                yield get_gcc_prebuilt_path(host, arch) / 'NOTICE'
+        for arch in ndk.abis.ALL_ARCHITECTURES:
+            # For libgcc/libatomic.
+            yield get_gcc_prebuilt_path(arch) / 'NOTICE'
 
     def build(self) -> None:
         pass
@@ -1852,7 +1596,7 @@
         shutil.copyfile(lld, new_bin_ld)
         shutil.copystat(lld, new_bin_ld)
 
-        for arch in self.arches:
+        for arch in ndk.abis.ALL_ARCHITECTURES:
             binutils_dir = get_binutils_prebuilt_path(self.host, arch)
             triple = ndk.abis.arch_to_triple(arch)
 
@@ -1862,13 +1606,12 @@
             # We still need libgcc/libatomic. Copy them from the old GCC
             # prebuilts.
             for subarch in get_subarches(arch):
-                install_libgcc(Path(install_dir), self.host, arch, subarch)
-                install_libatomic(Path(install_dir), self.host, arch, subarch)
+                install_libgcc(Path(install_dir), arch, subarch)
+                install_libatomic(Path(install_dir), arch, subarch)
 
                 # We don't actually want this, but Clang won't recognize a
                 # -gcc-toolchain without it.
-                install_gcc_crtbegin(Path(install_dir), self.host, arch,
-                                     subarch)
+                install_gcc_crtbegin(Path(install_dir), arch, subarch)
 
         platforms = self.get_dep('platforms')
         assert isinstance(platforms, Platforms)
@@ -1990,7 +1733,7 @@
         libcxxabi_inc_src = os.path.join(libcxxabi_dir, 'include')
         copy_tree(libcxxabi_inc_src, libcxx_inc_dst)
 
-        for arch in self.arches:
+        for arch in ndk.abis.ALL_ARCHITECTURES:
             # We need to replace libgcc with linker scripts that also use
             # libunwind on arm32.
             #
@@ -1998,7 +1741,6 @@
             # libunwind isn't available until libc++ has been built.
             for subarch in get_subarches(arch):
                 install_libgcc(Path(install_dir),
-                               self.host,
                                arch,
                                subarch,
                                new_layout=True)
@@ -2561,17 +2303,6 @@
     module.install()
 
 
-def split_module_by_arch(module: ndk.builds.Module, arches: List[ndk.abis.Arch]
-                         ) -> Iterator[ndk.builds.Module]:
-    if module.split_build_by_arch:
-        for arch in arches:
-            build_module = copy.deepcopy(module)
-            build_module.build_arch = arch
-            yield build_module
-    else:
-        yield module
-
-
 def _get_transitive_module_deps(
         module: ndk.builds.Module, deps: Set[ndk.builds.Module],
         unknown_deps: Set[str], seen: Set[ndk.builds.Module]) -> None:
@@ -2603,7 +2334,7 @@
 
 
 def get_modules_to_build(
-        module_names: Iterable[str], arches: List[ndk.abis.Arch]
+        module_names: Iterable[str]
 ) -> Tuple[List[ndk.builds.Module], Set[ndk.builds.Module]]:
     """Returns a list of modules to be built given a list of module names.
 
@@ -2644,8 +2375,7 @@
 
     build_modules = []
     for module in modules:
-        for build_module in split_module_by_arch(module, arches):
-            build_modules.append(build_module)
+        build_modules.append(module)
 
     return sorted(list(build_modules), key=str), deps_only
 
@@ -2658,9 +2388,7 @@
     Clang(),
     CpuFeatures(),
     Gdb(),
-    GdbServer(),
     Gtest(),
-    HostTools(),
     LibAndroidSupport(),
     LibShaderc(),
     Libcxx(),
@@ -2681,6 +2409,7 @@
     NdkWhich(),
     NdkWhichShortcut(),
     Platforms(),
+    Python(),
     PythonPackages(),
     Readme(),
     RenderscriptLibs(),
@@ -2690,6 +2419,7 @@
     SourceProperties(),
     Sysroot(),
     SystemStl(),
+    Toolbox(),
     Toolchain(),
     Vulkan(),
     WrapSh(),
@@ -2716,10 +2446,6 @@
         description=inspect.getdoc(sys.modules[__name__]))
 
     parser.add_argument(
-        '--arch',
-        choices=('arm', 'arm64', 'x86', 'x86_64'),
-        help='Build for the given architecture. Build all by default.')
-    parser.add_argument(
         '-j', '--jobs', type=int, default=multiprocessing.cpu_count(),
         help=('Number of parallel builds to run. Note that this will not '
               'affect the -j used for make; this just parallelizes '
@@ -2838,12 +2564,8 @@
 def build_ndk(modules: List[ndk.builds.Module],
               deps_only: Set[ndk.builds.Module], out_dir: Path, dist_dir: Path,
               args: argparse.Namespace) -> Path:
-    arches = list(ndk.abis.ALL_ARCHITECTURES)
-    if args.arch is not None:
-        arches = [args.arch]
-
     build_context = ndk.builds.BuildContext(
-        out_dir, dist_dir, ALL_MODULES, args.system, arches, args.build_number)
+        out_dir, dist_dir, ALL_MODULES, args.system, args.build_number)
 
     for module in modules:
         module.context = build_context
@@ -2876,14 +2598,14 @@
         workqueue.join()
 
 
-def build_ndk_for_cross_compile(out_dir: Path, arches: List[ndk.abis.Arch],
+def build_ndk_for_cross_compile(out_dir: Path,
                                 args: argparse.Namespace) -> None:
     args = copy.deepcopy(args)
     args.system = Host.current()
     if args.system != Host.Linux:
         raise NotImplementedError
     module_names = NAMES_TO_MODULES.keys()
-    modules, deps_only = get_modules_to_build(module_names, arches)
+    modules, deps_only = get_modules_to_build(module_names)
     print('Building Linux modules: {}'.format(' '.join(
         [str(m) for m in modules])))
     build_ndk(modules, deps_only, out_dir, out_dir, args)
@@ -2940,10 +2662,6 @@
 
     os.environ['ANDROID_BUILD_TOP'] = ndk.paths.android_path()
 
-    arches = list(ndk.abis.ALL_ARCHITECTURES)
-    if args.arch is not None:
-        arches = [args.arch]
-
     out_dir = ndk.paths.get_out_dir()
     dist_dir = ndk.paths.get_dist_dir(out_dir)
 
@@ -2952,9 +2670,9 @@
     if args.system.is_windows and not args.skip_deps:
         # Since the Windows NDK is cross compiled, we need to build a Linux NDK
         # first so we can build components like libc++.
-        build_ndk_for_cross_compile(Path(out_dir), arches, args)
+        build_ndk_for_cross_compile(Path(out_dir), args)
 
-    modules, deps_only = get_modules_to_build(module_names, arches)
+    modules, deps_only = get_modules_to_build(module_names)
     print('Building modules: {}'.format(' '.join(
         [str(m) for m in modules
          if not args.skip_deps or m not in deps_only])))
diff --git a/ndk/cmake.py b/ndk/cmake.py
index 98471aa..f9c40b7 100644
--- a/ndk/cmake.py
+++ b/ndk/cmake.py
@@ -49,8 +49,9 @@
                  src_path: Path,
                  build_dir: Path,
                  host: Host,
-                 additional_flags: List[str] = None,
-                 additional_env: Optional[Dict[str, str]] = None) -> None:
+                 additional_flags: Optional[List[str]] = None,
+                 additional_env: Optional[Dict[str, str]] = None,
+                 run_ctest: bool = False) -> None:
         """Initializes an autoconf builder.
 
         Args:
@@ -68,6 +69,7 @@
         self.host = host
         self.additional_flags = additional_flags
         self.additional_env = additional_env
+        self.run_ctest = run_ctest
 
         self.working_directory = self.build_directory / 'build'
         self.install_directory = self.build_directory / 'install'
@@ -116,6 +118,11 @@
                 (get_default_host().value + '-x86') / 'ninja')
 
     @property
+    def _ctest(self) -> Path:
+        return (ndk.paths.ANDROID_DIR / 'prebuilts' / 'cmake' /
+                (get_default_host().value + '-x86') / 'bin' / 'ctest')
+
+    @property
     def cmake_defines(self) -> Dict[str, str]:
         """CMake defines."""
         flags = self.toolchain.flags + self.flags
@@ -175,9 +182,13 @@
         """Builds the project."""
         self._run([str(self._ninja)])
 
+    def test(self) -> None:
+        """Runs tests."""
+        self._run([str(self._ctest), '--verbose'])
+
     def install(self) -> None:
         """Installs the project."""
-        self._run([str(self._ninja), 'install'])
+        self._run([str(self._ninja), 'install/strip'])
 
     def build(self,
               additional_defines: Optional[Dict[str, str]] = None) -> None:
@@ -192,4 +203,6 @@
         self.configure(
             {} if additional_defines is None else additional_defines)
         self.make()
+        if not self.host.is_windows and self.run_ctest:
+            self.test()
         self.install()
diff --git a/ndk/packaging.py b/ndk/packaging.py
index 8ff653d..94642ba 100644
--- a/ndk/packaging.py
+++ b/ndk/packaging.py
@@ -36,48 +36,17 @@
 )
 
 
-def expand_paths(package: str, host: Host,
-                 arches: Optional[Iterable[ndk.abis.Arch]]) -> List[str]:
-    """Expands package definition tuple into list of full package names.
+def expand_path(package: str, host: Host) -> str:
+    """Expands package definition tuple into a package name.
 
-    >>> expand_paths('gcc-{toolchain}-{host}', Host.Linux, ['arm', 'x86_64'])
-    ['gcc-arm-linux-androideabi-linux-x86_64', 'gcc-x86_64-linux-x86_64']
+    >>> expand_path('llvm-{host}', Host.Linux)
+    'llvm-linux-x86_64'
 
-    >>> expand_paths('gdbserver-{arch}', Host.Linux, ['arm64', 'x86_64'])
-    ['gdbserver-arm64', 'gdbserver-x86_64']
-
-    >>> expand_paths('llvm-{host}', Host.Linux, None)
-    ['llvm-linux-x86_64']
-
-    >>> expand_paths('platforms', Host.Linux, ['arm'])
-    ['platforms']
-
-    >>> expand_paths('libc++-{abi}', Host.Linux, ['arm'])
-    ['libc++-armeabi-v7a']
-
-    >>> expand_paths('binutils/{triple}', Host.Linux, ['arm', 'x86_64'])
-    ['binutils/arm-linux-androideabi', 'binutils/x86_64-linux-android']
-
-    >> expand_paths('toolchains/{toolchain}-4.9', Host.Linux, ['arm', 'x86'])
-    ['toolchains/arm-linux-androideabi-4.9', 'toolchains/x86-4.9']
+    >>> expand_path('platforms', Host.Linux)
+    'platforms'
     """
     host_tag = host_to_tag(host)
-    if arches is None:
-        return [package.format(host=host_tag)]
-
-    seen_packages: Set[str] = set()
-    packages = []
-    for arch in arches:
-        triple = ndk.abis.arch_to_triple(arch)
-        toolchain = ndk.abis.arch_to_toolchain(arch)
-        for abi in ndk.abis.arch_to_abis(arch):
-            expanded = package.format(
-                abi=abi, arch=arch, host=host_tag, triple=triple,
-                toolchain=toolchain)
-            if expanded not in seen_packages:
-                packages.append(expanded)
-            seen_packages.add(expanded)
-    return packages
+    return package.format(host=host_tag)
 
 
 def package_varies_by(install_path: str, variant: str) -> bool:
@@ -100,17 +69,17 @@
     return variant_replacement_str in install_path
 
 
-def expand_packages(package: str, install_path: str, host: Host,
-                    arches: List[ndk.abis.Arch]) -> Iterable[Tuple[str, str]]:
-    """Returns a list of tuples of `(package, install_path)`."""
+def expand_package(package: str, install_path: str,
+                   host: Host) -> Tuple[str, str]:
+    """Returns a tuple of `(package, install_path)`."""
     package_template = package
     for variant in PACKAGE_VARIANTS:
         if package_varies_by(install_path, variant):
             package_template += '-{' + variant + '}'
 
-    expanded_packages = expand_paths(package_template, host, arches)
-    expanded_installs = expand_paths(install_path, host, arches)
-    return zip(expanded_packages, expanded_installs)
+    expanded_packages = expand_path(package_template, host)
+    expanded_installs = expand_path(install_path, host)
+    return expanded_packages, expanded_installs
 
 
 def extract_zip(package_path: str, install_path: str) -> None:
diff --git a/ndk/toolchains.py b/ndk/toolchains.py
index d73f64f..aa7a9b6 100644
--- a/ndk/toolchains.py
+++ b/ndk/toolchains.py
@@ -22,7 +22,7 @@
 import ndk.paths
 
 
-CLANG_VERSION = 'clang-r399163b'
+CLANG_VERSION = 'clang-r412851'
 
 
 HOST_TRIPLE_MAP = {
diff --git a/sources/android/libthread_db/README b/sources/android/libthread_db/README
deleted file mode 100644
index aadd763..0000000
--- a/sources/android/libthread_db/README
+++ /dev/null
@@ -1,10 +0,0 @@
-Here are the sources of the special libthread_db that will be statically
-linked against our gdbserver binary. These are uses automatically by the
-build-gdbserver.sh script.
-
-THIS IS NOT AN IMPORT MODULE.
-
-Applications don't need to link to libthread_db anyway, this library is
-a small interface used by gdbserver to manage the list of threads on the
-target process. Its API and ABI are not stable and may change in the
-future.
diff --git a/sources/android/libthread_db/libthread_db.c b/sources/android/libthread_db/libthread_db.c
deleted file mode 100644
index 16b4e6b..0000000
--- a/sources/android/libthread_db/libthread_db.c
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <dirent.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/ptrace.h>
-#include <thread_db.h>
-#include <unistd.h>
-
-extern pid_t ps_getpid(struct ps_prochandle*);
-
-// We don't have any symbols to cache.
-char const** td_symbol_list(void) {
-    static char const* symbols[] = { NULL };
-    return symbols;
-}
-
-//
-// Thread agents.
-//
-
-td_err_e td_ta_new(struct ps_prochandle* proc_handle, td_thragent_t** agent_out) {
-    td_thragent_t* agent = (td_thragent_t*) calloc(1, sizeof(td_thragent_t));
-    if (!agent) {
-        return TD_MALLOC;
-    }
-
-    agent->pid = ps_getpid(proc_handle);
-    agent->ph = proc_handle;
-    *agent_out = agent;
-
-    return TD_OK;
-}
-
-
-td_err_e td_ta_delete(td_thragent_t* ta) {
-    free(ta);
-    return TD_OK;
-}
-
-td_err_e td_ta_map_lwp2thr(td_thragent_t const* agent, lwpid_t lwpid, td_thrhandle_t* th) {
-    th->pid = ps_getpid(agent->ph);
-    th->tid = lwpid;
-    return TD_OK;
-}
-
-td_err_e td_ta_thr_iter(td_thragent_t const* agent,
-                        td_thr_iter_f* func,
-                        void* cookie,
-                        td_thr_state_e state,
-                        int32_t prio,
-                        sigset_t* sigmask,
-                        uint32_t user_flags) {
-    td_err_e err = TD_OK;
-    char path[32];
-    DIR * dir;
-    struct dirent * entry;
-    td_thrhandle_t handle;
-
-    snprintf(path, sizeof(path), "/proc/%d/task/", agent->pid);
-    dir = opendir(path);
-    if (!dir) {
-        return TD_NOEVENT;
-    }
-
-    handle.pid = agent->pid;
-    while ((entry = readdir(dir)) != NULL) {
-        if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) {
-            continue;
-        }
-        handle.tid = atoi(entry->d_name);
-        if (func(&handle, cookie) != 0) {
-	    err = TD_DBERR;
-            break;
-        }
-    }
-
-    closedir(dir);
-
-    return err;
-}
-
-//
-// Threads.
-//
-
-td_err_e td_thr_get_info(td_thrhandle_t const* handle, td_thrinfo_t* info) {
-    info->ti_tid = handle->tid;
-    info->ti_lid = handle->tid; // Our pthreads uses kernel ids for tids
-    info->ti_state = TD_THR_SLEEP; /* XXX this needs to be read from /proc/<pid>/task/<tid>.
-                                      This is only used to see if the thread is a zombie or not */
-    return TD_OK;
-}
-
-//
-// TLS.
-//
-
-td_err_e td_thr_tlsbase(const td_thrhandle_t* unused1, unsigned long int unused2, psaddr_t* unused3) {
-  return TD_NOAPLIC; // TODO: fix this if/when we support ELF TLS.
-}
-
-td_err_e td_thr_tls_get_addr(const td_thrhandle_t* unused1, psaddr_t unused2, size_t unused3, psaddr_t* unused4) {
-  return TD_NOAPLIC; // TODO: fix this if/when we support ELF TLS.
-}
-
-//
-// Thread events.
-//
-
-// Thread events are no longer used by gdb >= 7.0.
-// Because we link gdbserver statically, though, we need definitions.
-td_err_e td_ta_set_event(td_thragent_t const* agent, td_thr_events_t* events) {
-    abort();
-}
-td_err_e td_ta_event_getmsg(td_thragent_t const* agent, td_event_msg_t* event) {
-    abort();
-}
-td_err_e td_thr_event_enable(const td_thrhandle_t* handle, int event) {
-    abort();
-}
-td_err_e td_ta_clear_event(const td_thragent_t* ta_arg, td_thr_events_t* event) {
-    abort();
-}
-td_err_e td_ta_event_addr(td_thragent_t const* agent, td_event_e event, td_notify_t* notify_out) {
-    abort();
-}
diff --git a/sources/android/libthread_db/thread_db.h b/sources/android/libthread_db/thread_db.h
deleted file mode 100644
index be57393..0000000
--- a/sources/android/libthread_db/thread_db.h
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include <pthread.h>
-#include <signal.h>
-#include <stdint.h>
-#include <sys/procfs.h>
-#include <sys/types.h>
-
-#define TD_THR_ANY_USER_FLAGS       0xffffffff
-#define TD_THR_LOWEST_PRIORITY      -20
-#define TD_SIGNO_MASK               NULL
-
-/* td_err_e values */
-enum {
-    TD_OK,
-    TD_ERR,
-    TD_NOTHR,
-    TD_NOSV,
-    TD_NOLWP,
-    TD_BADPH,
-    TD_BADTH,
-    TD_BADSH,
-    TD_BADTA,
-    TD_BADKEY,
-    TD_NOMSG,
-    TD_NOFPREGS,
-    TD_NOLIBTHREAD,
-    TD_NOEVENT,
-    TD_NOCAPAB,
-    TD_DBERR,
-    TD_NOAPLIC,
-    TD_NOTSD,
-    TD_MALLOC,
-    TD_PARTIALREG,
-    TD_NOXREGS,
-    TD_VERSION
-};
-
-/*
- * td_event_e values
- * NOTE: There is a max of 32 events
- */
-enum {
-    TD_CREATE,
-    TD_DEATH
-};
-
-/* td_thr_state_e values */
-enum {
-    TD_THR_ANY_STATE,
-    TD_THR_UNKNOWN,
-    TD_THR_SLEEP,
-    TD_THR_ZOMBIE
-};
-
-typedef int32_t td_err_e;
-typedef uint32_t td_event_e;
-typedef uint32_t td_notify_e;
-typedef uint32_t td_thr_state_e;
-typedef pthread_t thread_t;
-
-typedef struct
-{
-    pid_t pid;
-    struct ps_prochandle *ph;
-} td_thragent_t;
-
-typedef struct
-{
-    pid_t pid;
-    pid_t tid;
-    psaddr_t th_unique;
-} td_thrhandle_t;
-
-typedef struct
-{
-    td_event_e event;
-    td_thrhandle_t const * th_p;
-    union {
-        void * data;
-    } msg;
-} td_event_msg_t;
-
-typedef struct
-{
-    uint32_t events;
-} td_thr_events_t;
-
-typedef struct
-{
-    union {
-        void * bptaddr;
-    } u;
-} td_notify_t;
-
-typedef struct
-{
-    td_thr_state_e ti_state;
-    thread_t ti_tid; // pthread's id for the thread
-    int32_t ti_lid; // the kernel's id for the thread
-} td_thrinfo_t;
-
-
-#define td_event_emptyset(set) \
-    (set)->events = 0
-
-#define td_event_fillset(set) \
-    (set)->events = 0xffffffff
-
-#define td_event_addset(set, n) \
-    (set)->events |= (1 << n)
-
-
-typedef int td_thr_iter_f(td_thrhandle_t const *, void *);
-
-
-struct ps_prochandle;
-
-#ifdef __cplusplus
-extern "C"{
-#endif
-
-extern td_err_e td_ta_new(struct ps_prochandle * proc_handle, td_thragent_t ** thread_agent);
-
-extern td_err_e td_ta_delete(td_thragent_t * ta);
-
-extern td_err_e td_ta_set_event(td_thragent_t const * agent, td_thr_events_t * event);
-
-extern td_err_e td_ta_event_addr(td_thragent_t const * agent, td_event_e event, td_notify_t * notify);
-
-extern td_err_e td_ta_clear_event(const td_thragent_t * ta_arg,
-				  td_thr_events_t * event);
-
-extern td_err_e td_ta_event_getmsg(td_thragent_t const * agent, td_event_msg_t * event);
-
-extern td_err_e td_ta_map_lwp2thr(td_thragent_t const * agent, lwpid_t lwpid,
-				  td_thrhandle_t *th);
-
-extern td_err_e td_thr_get_info(td_thrhandle_t const * handle,
-				td_thrinfo_t * info);
-
-extern td_err_e td_thr_event_enable(const td_thrhandle_t * handle,
-				    int event);
-
-extern td_err_e td_ta_thr_iter(td_thragent_t const * agent, td_thr_iter_f * func, void * cookie,
-                               td_thr_state_e state, int32_t prio, sigset_t * sigmask, uint32_t user_flags);
-
-extern char const ** td_symbol_list(void);
-
-extern td_err_e td_thr_get_info(td_thrhandle_t const * handle, td_thrinfo_t * info);
-
-extern td_err_e td_thr_tlsbase(const td_thrhandle_t*, unsigned long int, psaddr_t*);
-
-extern td_err_e td_thr_tls_get_addr(const td_thrhandle_t*, psaddr_t, size_t, psaddr_t*);
-
-#ifdef __cplusplus
-}
-#endif
diff --git a/sources/host-tools/gdb-stub/gdb-stub.c b/sources/host-tools/gdb-stub/gdb-stub.c
deleted file mode 100644
index 488022d..0000000
--- a/sources/host-tools/gdb-stub/gdb-stub.c
+++ /dev/null
@@ -1,204 +0,0 @@
-/***************************************************************************
-** The BSD 3-Clause License. http://www.opensource.org/licenses/BSD-3-Clause
-**
-** This file is part of 'mingw-builds' project.
-** Copyright (c) 2011,2012,2013 by niXman (i dotty nixman doggy gmail dotty com)
-** All rights reserved.
-**
-** Project: mingw-builds ( http://sourceforge.net/projects/mingwbuilds/ )
-**
-** Redistribution and use in source and binary forms, with or without 
-** modification, are permitted provided that the following conditions are met:
-** - Redistributions of source code must retain the above copyright 
-**     notice, this list of conditions and the following disclaimer.
-** - Redistributions in binary form must reproduce the above copyright 
-**     notice, this list of conditions and the following disclaimer in 
-**     the documentation and/or other materials provided with the distribution.
-** - Neither the name of the 'mingw-builds' nor the names of its contributors may 
-**     be used to endorse or promote products derived from this software 
-**     without specific prior written permission.
-**
-** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
-** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
-** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 
-** A PARTICULAR PURPOSE ARE DISCLAIMED.
-** IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY 
-** DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
-** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 
-** OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 
-** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 
-** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE 
-** USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-**
-***************************************************************************/
-
-#include <windows.h>
-
-#include <stdio.h>
-#include <strings.h>
-
-#ifdef _DEBUG
- #define dbg_printf(...) printf(__VA_ARGS__)
-#else
- #define dbg_printf(...) do {} while(0)
-#endif
-
-#define GDB_TO_PYTHON_REL_DIR "."
-
-#define GDB_EXECUTABLE_ORIG_FILENAME "gdb-orig.exe"
-
-// The stub is installed to $PREBUILTS/bin, PYTHONHOME is $PREBUILTS.
-#define PYTHONHOME_REL_DIR ".."
-
-#define DIE_IF_FALSE(var) \
-	do { \
-		if ( !(var) ) { \
-			fprintf(stderr, "%s(%d)[%d]: expression \"%s\" fail. terminate.\n" \
-				,__FILE__ \
-				,__LINE__ \
-				,GetLastError() \
-				,#var \
-			); \
-			exit(1); \
-		} \
-	} while (0)
-
-int main(int argc, char** argv) {
-	enum {
-		 envbufsize = 1024*32
-		,exebufsize = 1024
-		,cmdbufsize = envbufsize
-	};
-
-	char *envbuf, *sep, *resbuf, *cmdbuf;
-	DWORD len, exitCode;
-	STARTUPINFO si;
-	PROCESS_INFORMATION pi;
-
-	DIE_IF_FALSE(
-		(envbuf = (char *)malloc(envbufsize))
-	);
-	DIE_IF_FALSE(
-		(cmdbuf = (char *)malloc(cmdbufsize))
-	);
-	*cmdbuf = 0;
-
-	DIE_IF_FALSE(
-		GetEnvironmentVariable("PATH", envbuf, envbufsize)
-	);
-	dbg_printf("env: %s\n", envbuf);
-
-	DIE_IF_FALSE(
-		GetModuleFileName(0, cmdbuf, exebufsize)
-	);
-	dbg_printf("curdir: %s\n", cmdbuf);
-
-	DIE_IF_FALSE(
-		(sep = strrchr(cmdbuf, '\\'))
-	);
-	*(sep+1) = 0;
-	strcat(cmdbuf, GDB_TO_PYTHON_REL_DIR);
-	dbg_printf("sep: %s\n", cmdbuf);
-
-	len = strlen(envbuf)+strlen(cmdbuf)
-		+1  /* for envronment separator */
-		+1; /* for zero-terminator */
-
-	DIE_IF_FALSE(
-		(resbuf = (char *)malloc(len))
-	);
-
-	DIE_IF_FALSE(
-		(snprintf(resbuf, len, "%s;%s", cmdbuf, envbuf) > 0)
-	);
-	dbg_printf("PATH: %s\n", resbuf);
-
-	DIE_IF_FALSE(
-		SetEnvironmentVariable("PATH", resbuf)
-	);
-
-	*(sep+1) = 0;
-	strcat(cmdbuf, PYTHONHOME_REL_DIR);
-	dbg_printf("PYTHONHOME: %s\n", cmdbuf);
-	DIE_IF_FALSE(
-		SetEnvironmentVariable("PYTHONHOME", cmdbuf)
-	);
-
-	*(sep+1) = 0;
-	strcat(cmdbuf, GDB_EXECUTABLE_ORIG_FILENAME" ");
-
-	if ( argc > 1 ) {
-		for ( ++argv; *argv; ++argv ) {
-			len = strlen(cmdbuf);
-			snprintf(cmdbuf+len, cmdbufsize-len, "%s ", *argv);
-		}
-	}
-	dbg_printf("cmd: %s\n", cmdbuf);
-
-	HANDLE ghJob = CreateJobObject(NULL, "Gdb-Wrapper\0"/*NULL*/);
-	if ( ghJob == NULL ) {
-        fprintf(stderr, "Could not create job object\n");
-	}
-	else{
-		JOBOBJECT_EXTENDED_LIMIT_INFORMATION jeli = { 0 };
-		// Configure all child processes associated with the job to terminate when the last handle to the job is closed
-		jeli.BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE;
-		if ( SetInformationJobObject(ghJob, JobObjectExtendedLimitInformation, &jeli, sizeof(jeli)) == 0 ) {
-            fprintf(stderr, "Could not SetInformationJobObject\n");
-		}
-	}
-
-	memset(&si, 0, sizeof(si));
-	si.cb = sizeof(si);
-	si.dwFlags |= STARTF_USESTDHANDLES;
-	si.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
-	si.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
-	si.hStdError = GetStdHandle(STD_ERROR_HANDLE);
-
-	memset(&pi, 0, sizeof(pi));
-	// If current process is being monitored by the Program Compatibility Assistant (PCA), it is placed into a
-	// compatibility job. Therefore, the child process must be created using CREATE_BREAKAWAY_FROM_JOB before it can be
-	// placed in another job.
-	DWORD creationFlags = CREATE_BREAKAWAY_FROM_JOB;
-	DIE_IF_FALSE(
-		CreateProcess(
-			0					// exe name
-			,cmdbuf				// command line
-			,0					// process security attributes
-			,0					// primary thread security attributes
-			,TRUE				// handles are inherited
-			,creationFlags		// creation flags
-			,0					// use parent's environment
-			,0					// use parent's current directory
-			,&si				// STARTUPINFO pointer
-			,&pi				// receives PROCESS_INFORMATION
-		)
-	);
-
-	if ( ghJob != NULL )
-		if ( AssignProcessToJobObject(ghJob, pi.hProcess) == 0 ) {
-            fprintf(stderr, "Could not AssignProcessToObject\n");
-		}
-
-	// Do not handle Ctrl-C in the wrapper
-	SetConsoleCtrlHandler(NULL, TRUE);
-
-	WaitForSingleObject(pi.hProcess, INFINITE);
-
-	DIE_IF_FALSE(
-		GetExitCodeProcess(pi.hProcess, &exitCode)
-	);
-
-	if ( ghJob != NULL )
-		CloseHandle(ghJob);
-	CloseHandle( pi.hProcess );
-	CloseHandle( pi.hThread );
-
-	free(envbuf);
-	free(resbuf);
-	free(cmdbuf);
-
-	dbg_printf("exiting with exitCode %d", exitCode);
-
-	return exitCode;
-}
diff --git a/sources/host-tools/toolbox/build-toolbox.sh b/sources/host-tools/toolbox/build-toolbox.sh
deleted file mode 100755
index d77e1e7..0000000
--- a/sources/host-tools/toolbox/build-toolbox.sh
+++ /dev/null
@@ -1,116 +0,0 @@
-#!/bin/sh
-#
-# Copyright (C) 2011 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-#  This shell script is used to rebuild the toolbox programs which sources
-#  are under $NDK/sources/host-tools/toolbox
-#
-
-# include common function and variable definitions
-. $NDK_BUILDTOOLS_PATH/prebuilt-common.sh
-. $NDK_BUILDTOOLS_PATH/builder-funcs.sh
-
-PROGRAM_PARAMETERS=""
-
-PROGRAM_DESCRIPTION=\
-"Rebuild the prebuilt host toolbox binaries for the Android NDK.
-
-These are simple command-line programs used by the NDK build script.
-
-By default, this will try to place the binaries inside the current NDK
-directory, unless you use the --ndk-dir=<path> option.
-"
-
-PACKAGE_DIR=
-register_var_option "--package-dir=<path>" PACKAGE_DIR "Put prebuilt tarballs into <path>."
-
-NDK_DIR=
-register_var_option "--ndk-dir=<path>" NDK_DIR "Specify NDK root path for the build."
-
-BUILD_DIR=
-register_var_option "--build-dir=<path>" BUILD_DIR "Specify temporary build dir."
-
-NO_MAKEFILE=
-register_var_option "--no-makefile" NO_MAKEFILE "Do not use makefile to speed-up build"
-
-PACKAGE_DIR=
-register_var_option "--package-dir=<path>" PACKAGE_DIR "Archive binaries into package directory"
-
-register_jobs_option
-register_try64_option
-
-extract_parameters "$@"
-
-# Handle NDK_DIR
-if [ -z "$NDK_DIR" ] ; then
-    NDK_DIR=$ANDROID_NDK_ROOT
-    log "Auto-config: --ndk-dir=$NDK_DIR"
-else
-    if [ ! -d "$NDK_DIR" ] ; then
-        echo "ERROR: NDK directory does not exists: $NDK_DIR"
-        exit 1
-    fi
-fi
-
-rm -rf $BUILD_DIR/* && mkdir -p $BUILD_DIR
-fail_panic "Could not create build directory: $BUILD_DIR"
-
-if [ -z "$NO_MAKEFILE" ]; then
-    MAKEFILE=$BUILD_DIR/Makefile
-else
-    MAKEFILE=
-fi
-
-TOOLBOX_SRCDIR=$ANDROID_NDK_ROOT/sources/host-tools/toolbox
-
-BUILD_WINDOWS_SOURCES=yes
-
-if [ "$BUILD_WINDOWS_SOURCES" ]; then
-    ORIGINAL_HOST_TAG=$HOST_TAG
-    MINGW=yes
-    handle_canadian_build
-    prepare_canadian_toolchain $BUILD_DIR
-
-    SUBDIR=$(get_prebuilt_install_prefix $HOST_TAG)/bin
-    DSTDIR=$NDK_DIR/$SUBDIR
-    mkdir -p "$DSTDIR"
-    fail_panic "Could not create destination directory: $DSTDIR"
-
-    # Build echo.exe
-    HOST_TAG=$ORIGINAL_HOST_TAG
-    builder_begin_host "$BUILD_DIR" "$MAKEFILE"
-    builder_set_srcdir "$TOOLBOX_SRCDIR"
-    builder_set_dstdir "$DSTDIR"
-    builder_cflags -std=c99
-    builder_sources echo_win.c
-    builder_host_executable echo
-    builder_end
-
-    # Build cmp.exe
-    HOST_TAG=$ORIGINAL_HOST_TAG
-    builder_begin_host "$BUILD_DIR" "$MAKEFILE"
-    builder_set_srcdir "$TOOLBOX_SRCDIR"
-    builder_set_dstdir "$DSTDIR"
-    builder_sources cmp_win.c
-    builder_host_executable cmp
-    builder_end
-
-    if [ "$PACKAGE_DIR" ]; then
-        ARCHIVE=toolbox-$HOST_TAG.tar.bz2
-        dump "Packaging : $ARCHIVE"
-        pack_archive "$PACKAGE_DIR/$ARCHIVE" "$NDK_DIR" "$SUBDIR/echo.exe" "$SUBDIR/cmp.exe"
-        fail_panic "Could not package toolbox binaires"
-    fi
-fi
diff --git a/sources/host-tools/toolbox/build.py b/sources/host-tools/toolbox/build.py
deleted file mode 100755
index 6d34955..0000000
--- a/sources/host-tools/toolbox/build.py
+++ /dev/null
@@ -1,51 +0,0 @@
-#!/usr/bin/env python
-#
-# Copyright (C) 2015 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-"""Builds NDK toolbox.
-
-Toolbox is just a POSIX compatible cmp.exe and echo.exe for Windows.
-"""
-from __future__ import print_function
-
-import os
-import site
-import sys
-
-site.addsitedir(os.path.join(os.path.dirname(__file__), '../../../build/lib'))
-site.addsitedir(os.path.join(os.path.dirname(__file__), '../../..'))
-
-# pylint: disable=import-error,wrong-import-position
-import build_support
-from ndk.hosts import Host
-# pylint: enable=import-error,wrong-import-position
-
-
-def main(args):
-    if not args.host.is_windows:
-        sys.exit('Toolbox is only for Windows hosts.')
-
-    toolbox_src = os.path.join(args.out_dir, 'toolbox')
-    build_cmd = [
-        'bash',
-        'build-toolbox.sh',
-        '--try-64',
-        f'--build-dir={toolbox_src}',
-    ]
-    build_support.build(build_cmd, args, intermediate_package=True)
-
-
-if __name__ == '__main__':
-    build_support.run(main)
diff --git a/tests/build/NDK_ANALYZE/project/jni/foo.cpp b/tests/build/NDK_ANALYZE/project/jni/foo.cpp
index 6aaa547..7a86c46 100644
--- a/tests/build/NDK_ANALYZE/project/jni/foo.cpp
+++ b/tests/build/NDK_ANALYZE/project/jni/foo.cpp
@@ -1,5 +1,5 @@
 #include <malloc.h>
 
 void foo() {
-  malloc(0);
+  malloc(10);
 }
diff --git a/tests/build/NDK_ANALYZE/test.py b/tests/build/NDK_ANALYZE/test.py
index 6e9bd35..54e8181 100644
--- a/tests/build/NDK_ANALYZE/test.py
+++ b/tests/build/NDK_ANALYZE/test.py
@@ -15,34 +15,29 @@
 #
 import os
 import subprocess
+import sys
 from typing import Tuple
 
 from ndk.abis import Abi
 
 
 def run_test(ndk_path: str, abi: Abi, api: int) -> Tuple[bool, str]:
-    """Runs the static analyzer on a sample project."""
+    """Checks ndk-build output for clang-tidy warnings."""
     ndk_build = os.path.join(ndk_path, 'ndk-build')
+    if sys.platform == 'win32':
+        ndk_build += '.cmd'
     project_path = 'project'
-    analyzer_out = os.path.join(project_path, 'report')
     ndk_args = [
         f'APP_ABI={abi}',
         f'APP_PLATFORM=android-{api}',
         'NDK_ANALYZE=1',
-        f'NDK_ANALYZER_OUT={analyzer_out}',
     ]
     proc = subprocess.Popen([ndk_build, '-C', project_path] + ndk_args,
                             stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
                             encoding='utf-8')
     out, _ = proc.communicate()
-    # We expect the analyzer to find an issue and exit with a failure.
-    if proc.returncode == 0:
-        return False, out
+    if proc.returncode != 0:
+        return proc.returncode == 0, out
 
-    analyzer_abi_out = os.path.join(analyzer_out, abi)
-    # The out directory gets created even if the analyzer fails, so we
-    # intentionally include bad code and make sure we get a failure report.
-    if not os.listdir(analyzer_abi_out):
-        return False, 'No analyzer output found in ' + analyzer_abi_out
-
-    return True, out
+    expect = "warning: Potential memory leak [clang-analyzer-unix.Malloc]"
+    return expect in out, out
diff --git a/tests/libc++/test/std/iterators/iterator.primitives/iterator.traits/test_config.py b/tests/libc++/test/std/iterators/iterator.primitives/iterator.traits/test_config.py
new file mode 100644
index 0000000..03bc9cf
--- /dev/null
+++ b/tests/libc++/test/std/iterators/iterator.primitives/iterator.traits/test_config.py
@@ -0,0 +1,6 @@
+def build_broken(test):
+    if test.case_name == 'empty.fail':
+        # Format of the diagnostic changed in clang and we don't have the
+        # libc++ update to match (https://reviews.llvm.org/D92239).
+        return 'all', 'https://github.com/android/ndk/issues/1454'
+    return None, None
