Use sandboxed clang

Change-Id: I0b9b5b7940b441aba6c6214e621d8997feef90b1
diff --git a/tools/cpp/clang_3p6/BUILD b/tools/cpp/clang_3p6/BUILD
new file mode 100644
index 0000000..23504d7
--- /dev/null
+++ b/tools/cpp/clang_3p6/BUILD
@@ -0,0 +1,86 @@
+package(default_visibility = ["//tools/cpp:__pkg__"])
+
+filegroup(
+    name = "ar",
+    srcs = [
+        "x86_64-linux-gnu-ar",
+        "@clang_3p6_repo//:ar",
+    ],
+)
+
+filegroup(
+    name = "ld",
+    srcs = [
+        "x86_64-linux-gnu-ld",
+        "@clang_3p6_repo//:ld",
+    ],
+)
+
+filegroup(
+    name = "nm",
+    srcs = [
+        "x86_64-linux-gnu-nm",
+        "@clang_3p6_repo//:nm",
+    ],
+)
+
+filegroup(
+    name = "objcopy",
+    srcs = [
+        "x86_64-linux-gnu-objcopy",
+        "@clang_3p6_repo//:objcopy",
+    ],
+)
+
+filegroup(
+    name = "objdump",
+    srcs = [
+        "x86_64-linux-gnu-objdump",
+        "@clang_3p6_repo//:objdump",
+    ],
+)
+
+filegroup(
+    name = "strip",
+    srcs = [
+        "x86_64-linux-gnu-strip",
+        "@clang_3p6_repo//:strip",
+    ],
+)
+
+filegroup(
+    name = "as",
+    srcs = [
+        "x86_64-linux-gnu-as",
+        "@clang_3p6_repo//:as",
+    ],
+)
+
+filegroup(
+    name = "clang",
+    srcs = [
+        "x86_64-linux-gnu-clang-3.6",
+        "@clang_3p6_repo//:clang",
+    ],
+)
+
+filegroup(
+    name = "tool-wrappers",
+    srcs = [
+        ":ar",
+        ":as",
+        ":clang",
+        ":ld",
+        ":nm",
+        ":objcopy",
+        ":objdump",
+        ":strip",
+    ],
+)
+
+filegroup(
+    name = "clang-symlinks",
+    srcs = glob([
+        "clang_more_libs/**",
+    ]),
+)
diff --git a/tools/cpp/clang_3p6/clang_3p6.BUILD b/tools/cpp/clang_3p6/clang_3p6.BUILD
new file mode 100644
index 0000000..648a511
--- /dev/null
+++ b/tools/cpp/clang_3p6/clang_3p6.BUILD
@@ -0,0 +1,112 @@
+package(default_visibility = ["//visibility:public"])
+
+filegroup(
+    name = "clang-format",
+    srcs = [
+        "usr/bin/clang-3.6",
+        ":compiler_pieces",
+    ],
+)
+
+filegroup(
+    name = "clang",
+    srcs = [
+        "usr/bin/clang-3.6",
+    ],
+)
+
+filegroup(
+    name = "ar",
+    srcs = [
+        "usr/bin/ar",
+    ],
+)
+
+filegroup(
+    name = "ld",
+    srcs = [
+        "usr/bin/ld",
+    ],
+)
+
+filegroup(
+    name = "nm",
+    srcs = [
+        "usr/bin/nm",
+    ],
+)
+
+filegroup(
+    name = "objcopy",
+    srcs = [
+        "usr/bin/objcopy",
+    ],
+)
+
+filegroup(
+    name = "objdump",
+    srcs = [
+        "usr/bin/objdump",
+    ],
+)
+
+filegroup(
+    name = "strip",
+    srcs = [
+        "usr/bin/strip",
+    ],
+)
+
+filegroup(
+    name = "as",
+    srcs = [
+        "usr/bin/as",
+    ],
+)
+
+cc_library(
+    name = "librt",
+    srcs = [
+        "usr/lib/x86_64-linux-gnu/librt.so",
+    ],
+)
+
+cc_library(
+    name = "libdl",
+    srcs = [
+        "usr/lib/x86_64-linux-gnu/libdl.so",
+    ],
+)
+
+cc_library(
+    name = "libm",
+    srcs = [
+        "usr/lib/x86_64-linux-gnu/libm.so",
+    ],
+)
+
+filegroup(
+    name = "compiler_pieces",
+    srcs = glob(
+        [
+            "**",
+        ],
+        exclude = [
+            "usr/share/**",
+        ],
+    ),
+)
+
+filegroup(
+    name = "compiler_components",
+    srcs = [
+        ":ar",
+        ":as",
+        ":clang",
+        ":ld",
+        ":nm",
+        ":objcopy",
+        ":objdump",
+        ":strip",
+    ],
+)
diff --git a/tools/cpp/clang_3p6/clang_more_libs/libc.so b/tools/cpp/clang_3p6/clang_more_libs/libc.so
new file mode 100644
index 0000000..5800d08
--- /dev/null
+++ b/tools/cpp/clang_3p6/clang_more_libs/libc.so
@@ -0,0 +1,5 @@
+/* GNU ld script
+   Use the shared library, but some functions are only in
+   the static library, so try that secondarily.  */
+OUTPUT_FORMAT(elf64-x86-64)
+GROUP ( libc.so.6 libc_nonshared.a  AS_NEEDED ( ld-linux-x86-64.so.2 ) )
diff --git a/tools/cpp/clang_3p6/clang_more_libs/libpthread.so b/tools/cpp/clang_3p6/clang_more_libs/libpthread.so
new file mode 100644
index 0000000..f02ce72
--- /dev/null
+++ b/tools/cpp/clang_3p6/clang_more_libs/libpthread.so
@@ -0,0 +1,5 @@
+/* GNU ld script
+   Use the shared library, but some functions are only in
+   the static library, so try that secondarily.  */
+OUTPUT_FORMAT(elf64-x86-64)
+GROUP ( libpthread.so.0 libpthread_nonshared.a )
diff --git a/tools/cpp/clang_3p6/x86_64-linux-gnu-ar b/tools/cpp/clang_3p6/x86_64-linux-gnu-ar
new file mode 100755
index 0000000..b8ba259
--- /dev/null
+++ b/tools/cpp/clang_3p6/x86_64-linux-gnu-ar
@@ -0,0 +1,9 @@
+#!/bin/bash --norc
+
+LD_LIBRARY_PATH="${BAZEL_OUTPUT_ROOT}external/clang_3p6_repo/usr/lib/x86_64-linux-gnu"
+LD_LIBRARY_PATH+=":${BAZEL_OUTPUT_ROOT}external/clang_3p6_repo/usr/lib"
+export LD_LIBRARY_PATH
+
+exec -a ar \
+  ${BAZEL_OUTPUT_ROOT}external/clang_3p6_repo/usr/bin/ar \
+  "$@"
diff --git a/tools/cpp/clang_3p6/x86_64-linux-gnu-as b/tools/cpp/clang_3p6/x86_64-linux-gnu-as
new file mode 100755
index 0000000..f264544
--- /dev/null
+++ b/tools/cpp/clang_3p6/x86_64-linux-gnu-as
@@ -0,0 +1,5 @@
+#!/bin/bash --norc
+
+exec -a as \
+  ${BAZEL_OUTPUT_ROOT}external/clang_3p6_repo/usr/bin/as \
+  "$@"
diff --git a/tools/cpp/clang_3p6/x86_64-linux-gnu-clang-3.6 b/tools/cpp/clang_3p6/x86_64-linux-gnu-clang-3.6
new file mode 100755
index 0000000..369bf41
--- /dev/null
+++ b/tools/cpp/clang_3p6/x86_64-linux-gnu-clang-3.6
@@ -0,0 +1,11 @@
+#!/bin/bash --norc
+
+LD_LIBRARY_PATH="${BAZEL_OUTPUT_ROOT}external/clang_3p6_repo/usr/lib/x86_64-linux-gnu"
+# TODO(Brian): Figure out why it segfaults with this enabled, and re-enable it.
+#LD_LIBRARY_PATH+=":${BAZEL_OUTPUT_ROOT}external/clang_3p6_repo/lib/x86_64-linux-gnu"
+LD_LIBRARY_PATH+=":${BAZEL_OUTPUT_ROOT}external/clang_3p6_repo/usr/lib"
+export LD_LIBRARY_PATH
+
+exec \
+  ${BAZEL_OUTPUT_ROOT}external/clang_3p6_repo/usr/bin/clang-3.6 \
+  "$@"
diff --git a/tools/cpp/clang_3p6/x86_64-linux-gnu-cpp b/tools/cpp/clang_3p6/x86_64-linux-gnu-cpp
new file mode 100755
index 0000000..adf3869
--- /dev/null
+++ b/tools/cpp/clang_3p6/x86_64-linux-gnu-cpp
@@ -0,0 +1,5 @@
+#!/bin/bash --norc
+
+exec -a cpp \
+  ${BAZEL_OUTPUT_ROOT}external/clang_3p6_repo/usr/bin/cpp \
+  "$@"
diff --git a/tools/cpp/clang_3p6/x86_64-linux-gnu-gcc b/tools/cpp/clang_3p6/x86_64-linux-gnu-gcc
new file mode 100755
index 0000000..4fe1d67
--- /dev/null
+++ b/tools/cpp/clang_3p6/x86_64-linux-gnu-gcc
@@ -0,0 +1,6 @@
+#!/bin/bash --norc
+
+PATH="${BAZEL_OUTPUT_ROOT}external/clang_3p6_repo/usr/lib/gcc/x86_64-linux-gnu/4.9:$PATH" \
+  exec \
+  ${BAZEL_OUTPUT_ROOT}external/clang_3p6_repo/usr/bin/gcc \
+  "$@"
diff --git a/tools/cpp/clang_3p6/x86_64-linux-gnu-gcov b/tools/cpp/clang_3p6/x86_64-linux-gnu-gcov
new file mode 100755
index 0000000..e71ab3e
--- /dev/null
+++ b/tools/cpp/clang_3p6/x86_64-linux-gnu-gcov
@@ -0,0 +1,5 @@
+#!/bin/bash --norc
+
+exec -a gcov \
+  ${BAZEL_OUTPUT_ROOT}external/clang_3p6_repo/usr/bin/gcov \
+  "$@"
diff --git a/tools/cpp/clang_3p6/x86_64-linux-gnu-ld b/tools/cpp/clang_3p6/x86_64-linux-gnu-ld
new file mode 100755
index 0000000..803a818
--- /dev/null
+++ b/tools/cpp/clang_3p6/x86_64-linux-gnu-ld
@@ -0,0 +1,5 @@
+#!/bin/bash --norc
+
+exec -a ld \
+  ${BAZEL_OUTPUT_ROOT}external/clang_3p6_repo/usr/bin/ld \
+  "$@"
diff --git a/tools/cpp/clang_3p6/x86_64-linux-gnu-nm b/tools/cpp/clang_3p6/x86_64-linux-gnu-nm
new file mode 100755
index 0000000..f8d1eb7
--- /dev/null
+++ b/tools/cpp/clang_3p6/x86_64-linux-gnu-nm
@@ -0,0 +1,5 @@
+#!/bin/bash --norc
+
+exec -a nm \
+  ${BAZEL_OUTPUT_ROOT}external/clang_3p6_repo/usr/bin/nm \
+  "$@"
diff --git a/tools/cpp/clang_3p6/x86_64-linux-gnu-objcopy b/tools/cpp/clang_3p6/x86_64-linux-gnu-objcopy
new file mode 100755
index 0000000..2a49155
--- /dev/null
+++ b/tools/cpp/clang_3p6/x86_64-linux-gnu-objcopy
@@ -0,0 +1,5 @@
+#!/bin/bash --norc
+
+exec -a objcopy \
+  ${BAZEL_OUTPUT_ROOT}external/clang_3p6_repo/usr/bin/objcopy \
+  "$@"
diff --git a/tools/cpp/clang_3p6/x86_64-linux-gnu-objdump b/tools/cpp/clang_3p6/x86_64-linux-gnu-objdump
new file mode 100755
index 0000000..a549b29
--- /dev/null
+++ b/tools/cpp/clang_3p6/x86_64-linux-gnu-objdump
@@ -0,0 +1,5 @@
+#!/bin/bash --norc
+
+exec -a objdump \
+  ${BAZEL_OUTPUT_ROOT}external/clang_3p6_repo/usr/bin/objdump \
+  "$@"
diff --git a/tools/cpp/clang_3p6/x86_64-linux-gnu-strip b/tools/cpp/clang_3p6/x86_64-linux-gnu-strip
new file mode 100755
index 0000000..0817069
--- /dev/null
+++ b/tools/cpp/clang_3p6/x86_64-linux-gnu-strip
@@ -0,0 +1,5 @@
+#!/bin/bash --norc
+
+exec -a strip \
+  ${BAZEL_OUTPUT_ROOT}external/clang_3p6_repo/usr/bin/strip \
+  "$@"