Split libc++ into a module.

Bug: http://b/23362228
Change-Id: I344cae5b848da04dd92663c956c0c80a611a359c
diff --git a/build/tools/build-target-prebuilts.sh b/build/tools/build-target-prebuilts.sh
index 5b8c8c9..66bb45e 100755
--- a/build/tools/build-target-prebuilts.sh
+++ b/build/tools/build-target-prebuilts.sh
@@ -109,10 +109,6 @@
 run $BUILDTOOLS/build-cxx-stl.sh --stl=stlport --abis="$ABIS" $FLAGS --with-debug-info $BUILD_TOOLCHAIN
 fail_panic "Could not build stlport with debug info!"
 
-dump "Building $ABIS libc++ binaries... with libc++abi"
-run $BUILDTOOLS/build-cxx-stl.sh --stl=libc++-libc++abi --abis="$ABIS" $FLAGS --with-debug-info $BUILD_TOOLCHAIN
-fail_panic "Could not build libc++ with libc++abi and debug info!"
-
 if [ "$PACKAGE_DIR" ]; then
     dump "Done, see $PACKAGE_DIR"
 else
diff --git a/checkbuild.py b/checkbuild.py
index 2264d66..e88b79f 100644
--- a/checkbuild.py
+++ b/checkbuild.py
@@ -40,6 +40,7 @@
     'gdbserver',
     'gnustl',
     'host-tools',
+    'libc++',
     'platforms',
     'target',
 }
@@ -194,6 +195,15 @@
     invoke_build('build-gnustl.py', build_args)
 
 
+def build_libcxx(out_dir, args, _):
+    print('Building libc++...')
+    build_args = common_build_args(out_dir, args)
+    if args.arch is not None:
+        build_args.append('--arch={}'.format(args.arch))
+    invoke_external_build(
+        'ndk/sources/cxx-stl/llvm-libc++/build.py', build_args)
+
+
 def build_platforms(out_dir, args, _):
     print('Building platforms...')
     invoke_build('build-platforms.py', common_build_args(out_dir, args))
@@ -290,6 +300,7 @@
         ('gdbserver', build_gdbserver),
         ('gnustl', build_gnustl),
         ('host-tools', build_host_tools),
+        ('libc++', build_libcxx),
         ('platforms', build_platforms),
         ('target', build_target),
     ])
diff --git a/sources/cxx-stl/llvm-libc++/build.py b/sources/cxx-stl/llvm-libc++/build.py
new file mode 100755
index 0000000..df26bba
--- /dev/null
+++ b/sources/cxx-stl/llvm-libc++/build.py
@@ -0,0 +1,60 @@
+#!/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 libc++ for Android."""
+from __future__ import print_function
+
+import os
+import site
+
+site.addsitedir(os.path.join(os.path.dirname(__file__), '../../../build/lib'))
+
+import build_support
+
+
+class ArgParser(build_support.ArgParser):
+    def __init__(self):
+        super(ArgParser, self).__init__()
+
+        self.add_argument(
+            '--arch', choices=build_support.ALL_ARCHITECTURES,
+            help='Architectures to build. Builds all if not present.')
+
+
+def main(args):
+    arches = build_support.ALL_ARCHITECTURES
+    if args.arch is not None:
+        arches = [args.arch]
+
+    abis = []
+    for arch in arches:
+        abis.extend(build_support.arch_to_abis(arch))
+
+    print('Building libc++ for ABIs: {}'.format(' '.join(abis)))
+
+    abis_arg = '--abis={}'.format(','.join(abis))
+    ndk_dir_arg = '--ndk-dir={}'.format(build_support.ndk_path())
+    script = build_support.ndk_path('build/tools/build-cxx-stl.sh')
+    build_cmd = [
+        'bash', script, '--stl=libc++-libc++abi', abis_arg, ndk_dir_arg,
+        build_support.jobs_arg(), build_support.toolchain_path(),
+        '--with-debug-info', '--llvm-version=3.6',
+    ]
+
+    build_support.build(build_cmd, args)
+
+if __name__ == '__main__':
+    build_support.run(main, ArgParser)