Generate our CROSSTOOL

I want to add a second cortex-m4f one, which is mostly the same, and not
have to maintain two of them. Actually doing that is coming in a
separate change.

Change-Id: I6e985de31b7741a7aa27a1d221d28623192f0a08
diff --git a/WORKSPACE b/WORKSPACE
index 3921318..24b9051 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -162,13 +162,6 @@
     actual = "//third_party/googletest:googlemock_main",
 )
 
-new_http_archive(
-    name = "python_import_helpers",
-    build_file = "third_party/python_import_helpers.BUILD",
-    sha256 = "71939a7d75585a57d2e99a33d39f391764d8f930f9a16acf32e00c5d3f432aa0",
-    url = "http://frc971.org/Build-Dependencies/empty.tar.gz",
-)
-
 # Recompressed from libusb-1.0.21.7z.
 http_file(
     name = "libusb_1_0_windows",
diff --git a/third_party/bazel/BUILD b/third_party/bazel/BUILD
index 4b56a08..4aecbea 100644
--- a/third_party/bazel/BUILD
+++ b/third_party/bazel/BUILD
@@ -1,11 +1,22 @@
-licenses(['notice'])
+licenses(["notice"])
 
 # Generated from Bazel's
 # 30df02a567cbd8a307b96037f0960fca66a5deaf://src/main/protobuf/extra_actions_base.proto.
 py_library(
-  name = 'extra_actions_proto_py',
-  visibility = ['//visibility:public'],
-  srcs = [
-    'protos/extra_actions_base_pb2.py',
-  ],
+    name = "extra_actions_proto_py",
+    srcs = [
+        "protos/extra_actions_base_pb2.py",
+    ],
+    visibility = ["//visibility:public"],
+)
+
+# Generated from Bazel's
+# aa7e972dbc96aa94f86522d452089dc30f6dbbcd://src/main/protobuf/crosstool_config.proto.
+py_library(
+    name = "crosstool_config_proto_py",
+    srcs = [
+        "protos/crosstool_config_pb2.py",
+    ],
+    visibility = ["//visibility:public"],
+    deps = ["//third_party/protobuf:protobuf_python"],
 )
diff --git a/third_party/bazel/protos/crosstool_config_pb2.py b/third_party/bazel/protos/crosstool_config_pb2.py
new file mode 100644
index 0000000..1c10fb8
--- /dev/null
+++ b/third_party/bazel/protos/crosstool_config_pb2.py
@@ -0,0 +1,1564 @@
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: src/main/protobuf/crosstool_config.proto
+
+import sys
+_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
+from google.protobuf.internal import enum_type_wrapper
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+from google.protobuf import descriptor_pb2
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+  name='src/main/protobuf/crosstool_config.proto',
+  package='com.google.devtools.build.lib.view.config.crosstool',
+  syntax='proto2',
+  serialized_pb=_b('\n(src/main/protobuf/crosstool_config.proto\x12\x33\x63om.google.devtools.build.lib.view.config.crosstool\"\x8c \n\nCToolchain\x12X\n\x07\x66\x65\x61ture\x18\x32 \x03(\x0b\x32G.com.google.devtools.build.lib.view.config.crosstool.CToolchain.Feature\x12\x63\n\raction_config\x18\x35 \x03(\x0b\x32L.com.google.devtools.build.lib.view.config.crosstool.CToolchain.ActionConfig\x12r\n\x15\x61rtifact_name_pattern\x18\x36 \x03(\x0b\x32S.com.google.devtools.build.lib.view.config.crosstool.CToolchain.ArtifactNamePattern\x12\x1c\n\x14toolchain_identifier\x18\x01 \x02(\t\x12\x18\n\x10host_system_name\x18\x02 \x02(\t\x12\x1a\n\x12target_system_name\x18\x03 \x02(\t\x12\x12\n\ntarget_cpu\x18\x04 \x02(\t\x12\x13\n\x0btarget_libc\x18\x05 \x02(\t\x12\x10\n\x08\x63ompiler\x18\x06 \x02(\t\x12\x13\n\x0b\x61\x62i_version\x18\x07 \x02(\t\x12\x18\n\x10\x61\x62i_libc_version\x18\x08 \x02(\t\x12P\n\ttool_path\x18\t \x03(\x0b\x32=.com.google.devtools.build.lib.view.config.crosstool.ToolPath\x12#\n\x14supports_gold_linker\x18\n \x01(\x08:\x05\x66\x61lse\x12%\n\x16supports_thin_archives\x18\x0b \x01(\x08:\x05\x66\x61lse\x12%\n\x16supports_start_end_lib\x18\x1c \x01(\x08:\x05\x66\x61lse\x12\x30\n!supports_interface_shared_objects\x18  \x01(\x08:\x05\x66\x61lse\x12)\n\x1asupports_embedded_runtimes\x18( \x01(\x08:\x05\x66\x61lse\x12!\n\x19static_runtimes_filegroup\x18- \x01(\t\x12\"\n\x1a\x64ynamic_runtimes_filegroup\x18. \x01(\t\x12*\n\x1bsupports_incremental_linker\x18) \x01(\x08:\x05\x66\x61lse\x12&\n\x17supports_normalizing_ar\x18\x1a \x01(\x08:\x05\x66\x61lse\x12\x1f\n\x10supports_fission\x18+ \x01(\x08:\x05\x66\x61lse\x12\x1c\n\rsupports_dsym\x18\x33 \x01(\x08:\x05\x66\x61lse\x12\x17\n\x08needsPic\x18\x0c \x01(\x08:\x05\x66\x61lse\x12\x15\n\rcompiler_flag\x18\r \x03(\t\x12\x10\n\x08\x63xx_flag\x18\x0e \x03(\t\x12\x1b\n\x13unfiltered_cxx_flag\x18\x19 \x03(\t\x12\x13\n\x0blinker_flag\x18\x0f \x03(\t\x12#\n\x1b\x64ynamic_library_linker_flag\x18\x1b \x03(\t\x12\x1d\n\x15test_only_linker_flag\x18\x31 \x03(\t\x12\x1a\n\x12objcopy_embed_flag\x18\x10 \x03(\t\x12\x15\n\rld_embed_flag\x18\x17 \x03(\t\x12\x0f\n\x07\x61r_flag\x18/ \x03(\t\x12\x1d\n\x15\x61r_thin_archives_flag\x18\x30 \x03(\t\x12 \n\x18gcc_plugin_compiler_flag\x18\" \x03(\t\x12i\n\x16\x63ompilation_mode_flags\x18\x11 \x03(\x0b\x32I.com.google.devtools.build.lib.view.config.crosstool.CompilationModeFlags\x12[\n\x0flipo_mode_flags\x18, \x03(\x0b\x32\x42.com.google.devtools.build.lib.view.config.crosstool.LipoModeFlags\x12\x61\n\x12linking_mode_flags\x18\x12 \x03(\x0b\x32\x45.com.google.devtools.build.lib.view.config.crosstool.LinkingModeFlags\x12#\n\x1bgcc_plugin_header_directory\x18\x13 \x03(\t\x12#\n\x1bmao_plugin_header_directory\x18\x14 \x03(\t\x12X\n\rmake_variable\x18\x15 \x03(\x0b\x32\x41.com.google.devtools.build.lib.view.config.crosstool.MakeVariable\x12%\n\x1d\x63xx_builtin_include_directory\x18\x16 \x03(\t\x12\x17\n\x0f\x62uiltin_sysroot\x18\x18 \x01(\t\x12\x1a\n\x12\x64\x65\x66\x61ult_python_top\x18\x1d \x01(\t\x12\x1e\n\x16\x64\x65\x66\x61ult_python_version\x18\x1e \x01(\t\x12\x1f\n\x17python_preload_swigdeps\x18* \x01(\x08\x12\x18\n\x10\x64\x65\x66\x61ult_grte_top\x18\x1f \x01(\t\x12\x1d\n\x15\x64\x65\x62ian_extra_requires\x18! \x03(\t\x12\x14\n\x0c\x63\x63_target_os\x18\x37 \x01(\t\x1a\xee\x02\n\tFlagGroup\x12\x0c\n\x04\x66lag\x18\x01 \x03(\t\x12]\n\nflag_group\x18\x02 \x03(\x0b\x32I.com.google.devtools.build.lib.view.config.crosstool.CToolchain.FlagGroup\x12\x14\n\x0citerate_over\x18\x03 \x01(\t\x12\x1f\n\x17\x65xpand_if_all_available\x18\x04 \x03(\t\x12 \n\x18\x65xpand_if_none_available\x18\x05 \x03(\t\x12\x16\n\x0e\x65xpand_if_true\x18\x06 \x01(\t\x12\x17\n\x0f\x65xpand_if_false\x18\x07 \x01(\t\x12j\n\x0f\x65xpand_if_equal\x18\x08 \x01(\x0b\x32Q.com.google.devtools.build.lib.view.config.crosstool.CToolchain.VariableWithValue\x1a\x34\n\x11VariableWithValue\x12\x10\n\x08variable\x18\x01 \x02(\t\x12\r\n\x05value\x18\x02 \x02(\t\x1a&\n\x08\x45nvEntry\x12\x0b\n\x03key\x18\x01 \x02(\t\x12\r\n\x05value\x18\x02 \x02(\t\x1a\x1d\n\nFeatureSet\x12\x0f\n\x07\x66\x65\x61ture\x18\x01 \x03(\t\x1a\x36\n\x0eWithFeatureSet\x12\x0f\n\x07\x66\x65\x61ture\x18\x01 \x03(\t\x12\x13\n\x0bnot_feature\x18\x02 \x03(\t\x1a\xff\x01\n\x07\x46lagSet\x12\x0e\n\x06\x61\x63tion\x18\x01 \x03(\t\x12]\n\nflag_group\x18\x02 \x03(\x0b\x32I.com.google.devtools.build.lib.view.config.crosstool.CToolchain.FlagGroup\x12\x64\n\x0cwith_feature\x18\x03 \x03(\x0b\x32N.com.google.devtools.build.lib.view.config.crosstool.CToolchain.WithFeatureSet\x12\x1f\n\x17\x65xpand_if_all_available\x18\x04 \x03(\t\x1a\xdb\x01\n\x06\x45nvSet\x12\x0e\n\x06\x61\x63tion\x18\x01 \x03(\t\x12[\n\tenv_entry\x18\x02 \x03(\x0b\x32H.com.google.devtools.build.lib.view.config.crosstool.CToolchain.EnvEntry\x12\x64\n\x0cwith_feature\x18\x03 \x03(\x0b\x32N.com.google.devtools.build.lib.view.config.crosstool.CToolchain.WithFeatureSet\x1a\xdd\x02\n\x07\x46\x65\x61ture\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0f\n\x07\x65nabled\x18\x07 \x01(\x08\x12Y\n\x08\x66lag_set\x18\x02 \x03(\x0b\x32G.com.google.devtools.build.lib.view.config.crosstool.CToolchain.FlagSet\x12W\n\x07\x65nv_set\x18\x06 \x03(\x0b\x32\x46.com.google.devtools.build.lib.view.config.crosstool.CToolchain.EnvSet\x12\\\n\x08requires\x18\x03 \x03(\x0b\x32J.com.google.devtools.build.lib.view.config.crosstool.CToolchain.FeatureSet\x12\x0f\n\x07implies\x18\x04 \x03(\t\x12\x10\n\x08provides\x18\x05 \x03(\t\x1a\x9e\x01\n\x04Tool\x12\x11\n\ttool_path\x18\x01 \x02(\t\x12\x64\n\x0cwith_feature\x18\x02 \x03(\x0b\x32N.com.google.devtools.build.lib.view.config.crosstool.CToolchain.WithFeatureSet\x12\x1d\n\x15\x65xecution_requirement\x18\x03 \x03(\t\x1aO\n\x13\x41rtifactNamePattern\x12\x15\n\rcategory_name\x18\x01 \x02(\t\x12\x0e\n\x06prefix\x18\x02 \x02(\t\x12\x11\n\textension\x18\x03 \x02(\t\x1a\xc0\x03\n\x0c\x41\x63tionConfig\x12\x13\n\x0b\x63onfig_name\x18\x01 \x02(\t\x12\x13\n\x0b\x61\x63tion_name\x18\x02 \x02(\t\x12\x0f\n\x07\x65nabled\x18\x08 \x01(\x08\x12R\n\x04tool\x18\x03 \x03(\x0b\x32\x44.com.google.devtools.build.lib.view.config.crosstool.CToolchain.Tool\x12Y\n\x08\x66lag_set\x18\x04 \x03(\x0b\x32G.com.google.devtools.build.lib.view.config.crosstool.CToolchain.FlagSet\x12W\n\x07\x65nv_set\x18\x05 \x03(\x0b\x32\x46.com.google.devtools.build.lib.view.config.crosstool.CToolchain.EnvSet\x12\\\n\x08requires\x18\x06 \x03(\x0b\x32J.com.google.devtools.build.lib.view.config.crosstool.CToolchain.FeatureSet\x12\x0f\n\x07implies\x18\x07 \x03(\t\"&\n\x08ToolPath\x12\x0c\n\x04name\x18\x01 \x02(\t\x12\x0c\n\x04path\x18\x02 \x02(\t\"\xa8\x01\n\x14\x43ompilationModeFlags\x12R\n\x04mode\x18\x01 \x02(\x0e\x32\x44.com.google.devtools.build.lib.view.config.crosstool.CompilationMode\x12\x15\n\rcompiler_flag\x18\x02 \x03(\t\x12\x10\n\x08\x63xx_flag\x18\x03 \x03(\t\x12\x13\n\x0blinker_flag\x18\x04 \x03(\t\"w\n\x10LinkingModeFlags\x12N\n\x04mode\x18\x01 \x02(\x0e\x32@.com.google.devtools.build.lib.view.config.crosstool.LinkingMode\x12\x13\n\x0blinker_flag\x18\x02 \x03(\t\"\x9a\x01\n\rLipoModeFlags\x12K\n\x04mode\x18\x01 \x02(\x0e\x32=.com.google.devtools.build.lib.view.config.crosstool.LipoMode\x12\x15\n\rcompiler_flag\x18\x02 \x03(\t\x12\x10\n\x08\x63xx_flag\x18\x03 \x03(\t\x12\x13\n\x0blinker_flag\x18\x04 \x03(\t\"+\n\x0cMakeVariable\x12\x0c\n\x04name\x18\x01 \x02(\t\x12\r\n\x05value\x18\x02 \x02(\t\"]\n\x13\x44\x65\x66\x61ultCpuToolchain\x12\x0b\n\x03\x63pu\x18\x01 \x02(\t\x12\x1c\n\x14toolchain_identifier\x18\x02 \x02(\t\x12\x1b\n\rsupports_lipo\x18\x03 \x01(\x08:\x04true\"\x95\x02\n\x10\x43rosstoolRelease\x12\x15\n\rmajor_version\x18\x01 \x02(\t\x12\x15\n\rminor_version\x18\x02 \x02(\t\x12\x1a\n\x12\x64\x65\x66\x61ult_target_cpu\x18\x03 \x02(\t\x12\x63\n\x11\x64\x65\x66\x61ult_toolchain\x18\x04 \x03(\x0b\x32H.com.google.devtools.build.lib.view.config.crosstool.DefaultCpuToolchain\x12R\n\ttoolchain\x18\x05 \x03(\x0b\x32?.com.google.devtools.build.lib.view.config.crosstool.CToolchain*@\n\x0f\x43ompilationMode\x12\r\n\tFASTBUILD\x10\x01\x12\x07\n\x03\x44\x42G\x10\x02\x12\x07\n\x03OPT\x10\x03\x12\x0c\n\x08\x43OVERAGE\x10\x04*\\\n\x0bLinkingMode\x12\x10\n\x0c\x46ULLY_STATIC\x10\x01\x12\x11\n\rMOSTLY_STATIC\x10\x02\x12\x0b\n\x07\x44YNAMIC\x10\x03\x12\x1b\n\x17MOSTLY_STATIC_LIBRARIES\x10\x04*\x1f\n\x08LipoMode\x12\x07\n\x03OFF\x10\x01\x12\n\n\x06\x42INARY\x10\x02\x42\x35\n3com.google.devtools.build.lib.view.config.crosstool')
+)
+
+_COMPILATIONMODE = _descriptor.EnumDescriptor(
+  name='CompilationMode',
+  full_name='com.google.devtools.build.lib.view.config.crosstool.CompilationMode',
+  filename=None,
+  file=DESCRIPTOR,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='FASTBUILD', index=0, number=1,
+      options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='DBG', index=1, number=2,
+      options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='OPT', index=2, number=3,
+      options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='COVERAGE', index=3, number=4,
+      options=None,
+      type=None),
+  ],
+  containing_type=None,
+  options=None,
+  serialized_start=5117,
+  serialized_end=5181,
+)
+_sym_db.RegisterEnumDescriptor(_COMPILATIONMODE)
+
+CompilationMode = enum_type_wrapper.EnumTypeWrapper(_COMPILATIONMODE)
+_LINKINGMODE = _descriptor.EnumDescriptor(
+  name='LinkingMode',
+  full_name='com.google.devtools.build.lib.view.config.crosstool.LinkingMode',
+  filename=None,
+  file=DESCRIPTOR,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='FULLY_STATIC', index=0, number=1,
+      options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='MOSTLY_STATIC', index=1, number=2,
+      options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='DYNAMIC', index=2, number=3,
+      options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='MOSTLY_STATIC_LIBRARIES', index=3, number=4,
+      options=None,
+      type=None),
+  ],
+  containing_type=None,
+  options=None,
+  serialized_start=5183,
+  serialized_end=5275,
+)
+_sym_db.RegisterEnumDescriptor(_LINKINGMODE)
+
+LinkingMode = enum_type_wrapper.EnumTypeWrapper(_LINKINGMODE)
+_LIPOMODE = _descriptor.EnumDescriptor(
+  name='LipoMode',
+  full_name='com.google.devtools.build.lib.view.config.crosstool.LipoMode',
+  filename=None,
+  file=DESCRIPTOR,
+  values=[
+    _descriptor.EnumValueDescriptor(
+      name='OFF', index=0, number=1,
+      options=None,
+      type=None),
+    _descriptor.EnumValueDescriptor(
+      name='BINARY', index=1, number=2,
+      options=None,
+      type=None),
+  ],
+  containing_type=None,
+  options=None,
+  serialized_start=5277,
+  serialized_end=5308,
+)
+_sym_db.RegisterEnumDescriptor(_LIPOMODE)
+
+LipoMode = enum_type_wrapper.EnumTypeWrapper(_LIPOMODE)
+FASTBUILD = 1
+DBG = 2
+OPT = 3
+COVERAGE = 4
+FULLY_STATIC = 1
+MOSTLY_STATIC = 2
+DYNAMIC = 3
+MOSTLY_STATIC_LIBRARIES = 4
+OFF = 1
+BINARY = 2
+
+
+
+_CTOOLCHAIN_FLAGGROUP = _descriptor.Descriptor(
+  name='FlagGroup',
+  full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.FlagGroup',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='flag', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.FlagGroup.flag', index=0,
+      number=1, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='flag_group', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.FlagGroup.flag_group', index=1,
+      number=2, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='iterate_over', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.FlagGroup.iterate_over', index=2,
+      number=3, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='expand_if_all_available', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.FlagGroup.expand_if_all_available', index=3,
+      number=4, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='expand_if_none_available', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.FlagGroup.expand_if_none_available', index=4,
+      number=5, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='expand_if_true', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.FlagGroup.expand_if_true', index=5,
+      number=6, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='expand_if_false', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.FlagGroup.expand_if_false', index=6,
+      number=7, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='expand_if_equal', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.FlagGroup.expand_if_equal', index=7,
+      number=8, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  syntax='proto2',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2134,
+  serialized_end=2500,
+)
+
+_CTOOLCHAIN_VARIABLEWITHVALUE = _descriptor.Descriptor(
+  name='VariableWithValue',
+  full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.VariableWithValue',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='variable', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.VariableWithValue.variable', index=0,
+      number=1, type=9, cpp_type=9, label=2,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='value', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.VariableWithValue.value', index=1,
+      number=2, type=9, cpp_type=9, label=2,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  syntax='proto2',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2502,
+  serialized_end=2554,
+)
+
+_CTOOLCHAIN_ENVENTRY = _descriptor.Descriptor(
+  name='EnvEntry',
+  full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.EnvEntry',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='key', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.EnvEntry.key', index=0,
+      number=1, type=9, cpp_type=9, label=2,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='value', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.EnvEntry.value', index=1,
+      number=2, type=9, cpp_type=9, label=2,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  syntax='proto2',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2556,
+  serialized_end=2594,
+)
+
+_CTOOLCHAIN_FEATURESET = _descriptor.Descriptor(
+  name='FeatureSet',
+  full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.FeatureSet',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='feature', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.FeatureSet.feature', index=0,
+      number=1, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  syntax='proto2',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2596,
+  serialized_end=2625,
+)
+
+_CTOOLCHAIN_WITHFEATURESET = _descriptor.Descriptor(
+  name='WithFeatureSet',
+  full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.WithFeatureSet',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='feature', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.WithFeatureSet.feature', index=0,
+      number=1, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='not_feature', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.WithFeatureSet.not_feature', index=1,
+      number=2, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  syntax='proto2',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2627,
+  serialized_end=2681,
+)
+
+_CTOOLCHAIN_FLAGSET = _descriptor.Descriptor(
+  name='FlagSet',
+  full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.FlagSet',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='action', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.FlagSet.action', index=0,
+      number=1, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='flag_group', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.FlagSet.flag_group', index=1,
+      number=2, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='with_feature', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.FlagSet.with_feature', index=2,
+      number=3, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='expand_if_all_available', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.FlagSet.expand_if_all_available', index=3,
+      number=4, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  syntax='proto2',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2684,
+  serialized_end=2939,
+)
+
+_CTOOLCHAIN_ENVSET = _descriptor.Descriptor(
+  name='EnvSet',
+  full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.EnvSet',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='action', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.EnvSet.action', index=0,
+      number=1, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='env_entry', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.EnvSet.env_entry', index=1,
+      number=2, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='with_feature', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.EnvSet.with_feature', index=2,
+      number=3, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  syntax='proto2',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=2942,
+  serialized_end=3161,
+)
+
+_CTOOLCHAIN_FEATURE = _descriptor.Descriptor(
+  name='Feature',
+  full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.Feature',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='name', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.Feature.name', index=0,
+      number=1, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='enabled', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.Feature.enabled', index=1,
+      number=7, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='flag_set', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.Feature.flag_set', index=2,
+      number=2, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='env_set', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.Feature.env_set', index=3,
+      number=6, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='requires', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.Feature.requires', index=4,
+      number=3, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='implies', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.Feature.implies', index=5,
+      number=4, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='provides', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.Feature.provides', index=6,
+      number=5, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  syntax='proto2',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3164,
+  serialized_end=3513,
+)
+
+_CTOOLCHAIN_TOOL = _descriptor.Descriptor(
+  name='Tool',
+  full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.Tool',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='tool_path', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.Tool.tool_path', index=0,
+      number=1, type=9, cpp_type=9, label=2,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='with_feature', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.Tool.with_feature', index=1,
+      number=2, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='execution_requirement', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.Tool.execution_requirement', index=2,
+      number=3, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  syntax='proto2',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3516,
+  serialized_end=3674,
+)
+
+_CTOOLCHAIN_ARTIFACTNAMEPATTERN = _descriptor.Descriptor(
+  name='ArtifactNamePattern',
+  full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.ArtifactNamePattern',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='category_name', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.ArtifactNamePattern.category_name', index=0,
+      number=1, type=9, cpp_type=9, label=2,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='prefix', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.ArtifactNamePattern.prefix', index=1,
+      number=2, type=9, cpp_type=9, label=2,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='extension', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.ArtifactNamePattern.extension', index=2,
+      number=3, type=9, cpp_type=9, label=2,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  syntax='proto2',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3676,
+  serialized_end=3755,
+)
+
+_CTOOLCHAIN_ACTIONCONFIG = _descriptor.Descriptor(
+  name='ActionConfig',
+  full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.ActionConfig',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='config_name', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.ActionConfig.config_name', index=0,
+      number=1, type=9, cpp_type=9, label=2,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='action_name', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.ActionConfig.action_name', index=1,
+      number=2, type=9, cpp_type=9, label=2,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='enabled', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.ActionConfig.enabled', index=2,
+      number=8, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='tool', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.ActionConfig.tool', index=3,
+      number=3, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='flag_set', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.ActionConfig.flag_set', index=4,
+      number=4, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='env_set', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.ActionConfig.env_set', index=5,
+      number=5, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='requires', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.ActionConfig.requires', index=6,
+      number=6, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='implies', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.ActionConfig.implies', index=7,
+      number=7, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  syntax='proto2',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=3758,
+  serialized_end=4206,
+)
+
+_CTOOLCHAIN = _descriptor.Descriptor(
+  name='CToolchain',
+  full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='feature', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.feature', index=0,
+      number=50, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='action_config', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.action_config', index=1,
+      number=53, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='artifact_name_pattern', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.artifact_name_pattern', index=2,
+      number=54, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='toolchain_identifier', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.toolchain_identifier', index=3,
+      number=1, type=9, cpp_type=9, label=2,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='host_system_name', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.host_system_name', index=4,
+      number=2, type=9, cpp_type=9, label=2,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='target_system_name', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.target_system_name', index=5,
+      number=3, type=9, cpp_type=9, label=2,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='target_cpu', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.target_cpu', index=6,
+      number=4, type=9, cpp_type=9, label=2,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='target_libc', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.target_libc', index=7,
+      number=5, type=9, cpp_type=9, label=2,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='compiler', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.compiler', index=8,
+      number=6, type=9, cpp_type=9, label=2,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='abi_version', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.abi_version', index=9,
+      number=7, type=9, cpp_type=9, label=2,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='abi_libc_version', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.abi_libc_version', index=10,
+      number=8, type=9, cpp_type=9, label=2,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='tool_path', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.tool_path', index=11,
+      number=9, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='supports_gold_linker', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.supports_gold_linker', index=12,
+      number=10, type=8, cpp_type=7, label=1,
+      has_default_value=True, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='supports_thin_archives', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.supports_thin_archives', index=13,
+      number=11, type=8, cpp_type=7, label=1,
+      has_default_value=True, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='supports_start_end_lib', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.supports_start_end_lib', index=14,
+      number=28, type=8, cpp_type=7, label=1,
+      has_default_value=True, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='supports_interface_shared_objects', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.supports_interface_shared_objects', index=15,
+      number=32, type=8, cpp_type=7, label=1,
+      has_default_value=True, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='supports_embedded_runtimes', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.supports_embedded_runtimes', index=16,
+      number=40, type=8, cpp_type=7, label=1,
+      has_default_value=True, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='static_runtimes_filegroup', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.static_runtimes_filegroup', index=17,
+      number=45, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='dynamic_runtimes_filegroup', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.dynamic_runtimes_filegroup', index=18,
+      number=46, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='supports_incremental_linker', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.supports_incremental_linker', index=19,
+      number=41, type=8, cpp_type=7, label=1,
+      has_default_value=True, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='supports_normalizing_ar', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.supports_normalizing_ar', index=20,
+      number=26, type=8, cpp_type=7, label=1,
+      has_default_value=True, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='supports_fission', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.supports_fission', index=21,
+      number=43, type=8, cpp_type=7, label=1,
+      has_default_value=True, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='supports_dsym', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.supports_dsym', index=22,
+      number=51, type=8, cpp_type=7, label=1,
+      has_default_value=True, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='needsPic', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.needsPic', index=23,
+      number=12, type=8, cpp_type=7, label=1,
+      has_default_value=True, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='compiler_flag', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.compiler_flag', index=24,
+      number=13, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='cxx_flag', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.cxx_flag', index=25,
+      number=14, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='unfiltered_cxx_flag', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.unfiltered_cxx_flag', index=26,
+      number=25, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='linker_flag', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.linker_flag', index=27,
+      number=15, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='dynamic_library_linker_flag', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.dynamic_library_linker_flag', index=28,
+      number=27, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='test_only_linker_flag', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.test_only_linker_flag', index=29,
+      number=49, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='objcopy_embed_flag', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.objcopy_embed_flag', index=30,
+      number=16, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='ld_embed_flag', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.ld_embed_flag', index=31,
+      number=23, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='ar_flag', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.ar_flag', index=32,
+      number=47, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='ar_thin_archives_flag', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.ar_thin_archives_flag', index=33,
+      number=48, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='gcc_plugin_compiler_flag', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.gcc_plugin_compiler_flag', index=34,
+      number=34, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='compilation_mode_flags', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.compilation_mode_flags', index=35,
+      number=17, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='lipo_mode_flags', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.lipo_mode_flags', index=36,
+      number=44, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='linking_mode_flags', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.linking_mode_flags', index=37,
+      number=18, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='gcc_plugin_header_directory', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.gcc_plugin_header_directory', index=38,
+      number=19, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='mao_plugin_header_directory', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.mao_plugin_header_directory', index=39,
+      number=20, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='make_variable', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.make_variable', index=40,
+      number=21, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='cxx_builtin_include_directory', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.cxx_builtin_include_directory', index=41,
+      number=22, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='builtin_sysroot', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.builtin_sysroot', index=42,
+      number=24, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='default_python_top', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.default_python_top', index=43,
+      number=29, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='default_python_version', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.default_python_version', index=44,
+      number=30, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='python_preload_swigdeps', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.python_preload_swigdeps', index=45,
+      number=42, type=8, cpp_type=7, label=1,
+      has_default_value=False, default_value=False,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='default_grte_top', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.default_grte_top', index=46,
+      number=31, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='debian_extra_requires', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.debian_extra_requires', index=47,
+      number=33, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='cc_target_os', full_name='com.google.devtools.build.lib.view.config.crosstool.CToolchain.cc_target_os', index=48,
+      number=55, type=9, cpp_type=9, label=1,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[_CTOOLCHAIN_FLAGGROUP, _CTOOLCHAIN_VARIABLEWITHVALUE, _CTOOLCHAIN_ENVENTRY, _CTOOLCHAIN_FEATURESET, _CTOOLCHAIN_WITHFEATURESET, _CTOOLCHAIN_FLAGSET, _CTOOLCHAIN_ENVSET, _CTOOLCHAIN_FEATURE, _CTOOLCHAIN_TOOL, _CTOOLCHAIN_ARTIFACTNAMEPATTERN, _CTOOLCHAIN_ACTIONCONFIG, ],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  syntax='proto2',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=98,
+  serialized_end=4206,
+)
+
+
+_TOOLPATH = _descriptor.Descriptor(
+  name='ToolPath',
+  full_name='com.google.devtools.build.lib.view.config.crosstool.ToolPath',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='name', full_name='com.google.devtools.build.lib.view.config.crosstool.ToolPath.name', index=0,
+      number=1, type=9, cpp_type=9, label=2,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='path', full_name='com.google.devtools.build.lib.view.config.crosstool.ToolPath.path', index=1,
+      number=2, type=9, cpp_type=9, label=2,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  syntax='proto2',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=4208,
+  serialized_end=4246,
+)
+
+
+_COMPILATIONMODEFLAGS = _descriptor.Descriptor(
+  name='CompilationModeFlags',
+  full_name='com.google.devtools.build.lib.view.config.crosstool.CompilationModeFlags',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='mode', full_name='com.google.devtools.build.lib.view.config.crosstool.CompilationModeFlags.mode', index=0,
+      number=1, type=14, cpp_type=8, label=2,
+      has_default_value=False, default_value=1,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='compiler_flag', full_name='com.google.devtools.build.lib.view.config.crosstool.CompilationModeFlags.compiler_flag', index=1,
+      number=2, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='cxx_flag', full_name='com.google.devtools.build.lib.view.config.crosstool.CompilationModeFlags.cxx_flag', index=2,
+      number=3, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='linker_flag', full_name='com.google.devtools.build.lib.view.config.crosstool.CompilationModeFlags.linker_flag', index=3,
+      number=4, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  syntax='proto2',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=4249,
+  serialized_end=4417,
+)
+
+
+_LINKINGMODEFLAGS = _descriptor.Descriptor(
+  name='LinkingModeFlags',
+  full_name='com.google.devtools.build.lib.view.config.crosstool.LinkingModeFlags',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='mode', full_name='com.google.devtools.build.lib.view.config.crosstool.LinkingModeFlags.mode', index=0,
+      number=1, type=14, cpp_type=8, label=2,
+      has_default_value=False, default_value=1,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='linker_flag', full_name='com.google.devtools.build.lib.view.config.crosstool.LinkingModeFlags.linker_flag', index=1,
+      number=2, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  syntax='proto2',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=4419,
+  serialized_end=4538,
+)
+
+
+_LIPOMODEFLAGS = _descriptor.Descriptor(
+  name='LipoModeFlags',
+  full_name='com.google.devtools.build.lib.view.config.crosstool.LipoModeFlags',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='mode', full_name='com.google.devtools.build.lib.view.config.crosstool.LipoModeFlags.mode', index=0,
+      number=1, type=14, cpp_type=8, label=2,
+      has_default_value=False, default_value=1,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='compiler_flag', full_name='com.google.devtools.build.lib.view.config.crosstool.LipoModeFlags.compiler_flag', index=1,
+      number=2, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='cxx_flag', full_name='com.google.devtools.build.lib.view.config.crosstool.LipoModeFlags.cxx_flag', index=2,
+      number=3, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='linker_flag', full_name='com.google.devtools.build.lib.view.config.crosstool.LipoModeFlags.linker_flag', index=3,
+      number=4, type=9, cpp_type=9, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  syntax='proto2',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=4541,
+  serialized_end=4695,
+)
+
+
+_MAKEVARIABLE = _descriptor.Descriptor(
+  name='MakeVariable',
+  full_name='com.google.devtools.build.lib.view.config.crosstool.MakeVariable',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='name', full_name='com.google.devtools.build.lib.view.config.crosstool.MakeVariable.name', index=0,
+      number=1, type=9, cpp_type=9, label=2,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='value', full_name='com.google.devtools.build.lib.view.config.crosstool.MakeVariable.value', index=1,
+      number=2, type=9, cpp_type=9, label=2,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  syntax='proto2',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=4697,
+  serialized_end=4740,
+)
+
+
+_DEFAULTCPUTOOLCHAIN = _descriptor.Descriptor(
+  name='DefaultCpuToolchain',
+  full_name='com.google.devtools.build.lib.view.config.crosstool.DefaultCpuToolchain',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='cpu', full_name='com.google.devtools.build.lib.view.config.crosstool.DefaultCpuToolchain.cpu', index=0,
+      number=1, type=9, cpp_type=9, label=2,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='toolchain_identifier', full_name='com.google.devtools.build.lib.view.config.crosstool.DefaultCpuToolchain.toolchain_identifier', index=1,
+      number=2, type=9, cpp_type=9, label=2,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='supports_lipo', full_name='com.google.devtools.build.lib.view.config.crosstool.DefaultCpuToolchain.supports_lipo', index=2,
+      number=3, type=8, cpp_type=7, label=1,
+      has_default_value=True, default_value=True,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  syntax='proto2',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=4742,
+  serialized_end=4835,
+)
+
+
+_CROSSTOOLRELEASE = _descriptor.Descriptor(
+  name='CrosstoolRelease',
+  full_name='com.google.devtools.build.lib.view.config.crosstool.CrosstoolRelease',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='major_version', full_name='com.google.devtools.build.lib.view.config.crosstool.CrosstoolRelease.major_version', index=0,
+      number=1, type=9, cpp_type=9, label=2,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='minor_version', full_name='com.google.devtools.build.lib.view.config.crosstool.CrosstoolRelease.minor_version', index=1,
+      number=2, type=9, cpp_type=9, label=2,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='default_target_cpu', full_name='com.google.devtools.build.lib.view.config.crosstool.CrosstoolRelease.default_target_cpu', index=2,
+      number=3, type=9, cpp_type=9, label=2,
+      has_default_value=False, default_value=_b("").decode('utf-8'),
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='default_toolchain', full_name='com.google.devtools.build.lib.view.config.crosstool.CrosstoolRelease.default_toolchain', index=3,
+      number=4, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+    _descriptor.FieldDescriptor(
+      name='toolchain', full_name='com.google.devtools.build.lib.view.config.crosstool.CrosstoolRelease.toolchain', index=4,
+      number=5, type=11, cpp_type=10, label=3,
+      has_default_value=False, default_value=[],
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      options=None),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  options=None,
+  is_extendable=False,
+  syntax='proto2',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=4838,
+  serialized_end=5115,
+)
+
+_CTOOLCHAIN_FLAGGROUP.fields_by_name['flag_group'].message_type = _CTOOLCHAIN_FLAGGROUP
+_CTOOLCHAIN_FLAGGROUP.fields_by_name['expand_if_equal'].message_type = _CTOOLCHAIN_VARIABLEWITHVALUE
+_CTOOLCHAIN_FLAGGROUP.containing_type = _CTOOLCHAIN
+_CTOOLCHAIN_VARIABLEWITHVALUE.containing_type = _CTOOLCHAIN
+_CTOOLCHAIN_ENVENTRY.containing_type = _CTOOLCHAIN
+_CTOOLCHAIN_FEATURESET.containing_type = _CTOOLCHAIN
+_CTOOLCHAIN_WITHFEATURESET.containing_type = _CTOOLCHAIN
+_CTOOLCHAIN_FLAGSET.fields_by_name['flag_group'].message_type = _CTOOLCHAIN_FLAGGROUP
+_CTOOLCHAIN_FLAGSET.fields_by_name['with_feature'].message_type = _CTOOLCHAIN_WITHFEATURESET
+_CTOOLCHAIN_FLAGSET.containing_type = _CTOOLCHAIN
+_CTOOLCHAIN_ENVSET.fields_by_name['env_entry'].message_type = _CTOOLCHAIN_ENVENTRY
+_CTOOLCHAIN_ENVSET.fields_by_name['with_feature'].message_type = _CTOOLCHAIN_WITHFEATURESET
+_CTOOLCHAIN_ENVSET.containing_type = _CTOOLCHAIN
+_CTOOLCHAIN_FEATURE.fields_by_name['flag_set'].message_type = _CTOOLCHAIN_FLAGSET
+_CTOOLCHAIN_FEATURE.fields_by_name['env_set'].message_type = _CTOOLCHAIN_ENVSET
+_CTOOLCHAIN_FEATURE.fields_by_name['requires'].message_type = _CTOOLCHAIN_FEATURESET
+_CTOOLCHAIN_FEATURE.containing_type = _CTOOLCHAIN
+_CTOOLCHAIN_TOOL.fields_by_name['with_feature'].message_type = _CTOOLCHAIN_WITHFEATURESET
+_CTOOLCHAIN_TOOL.containing_type = _CTOOLCHAIN
+_CTOOLCHAIN_ARTIFACTNAMEPATTERN.containing_type = _CTOOLCHAIN
+_CTOOLCHAIN_ACTIONCONFIG.fields_by_name['tool'].message_type = _CTOOLCHAIN_TOOL
+_CTOOLCHAIN_ACTIONCONFIG.fields_by_name['flag_set'].message_type = _CTOOLCHAIN_FLAGSET
+_CTOOLCHAIN_ACTIONCONFIG.fields_by_name['env_set'].message_type = _CTOOLCHAIN_ENVSET
+_CTOOLCHAIN_ACTIONCONFIG.fields_by_name['requires'].message_type = _CTOOLCHAIN_FEATURESET
+_CTOOLCHAIN_ACTIONCONFIG.containing_type = _CTOOLCHAIN
+_CTOOLCHAIN.fields_by_name['feature'].message_type = _CTOOLCHAIN_FEATURE
+_CTOOLCHAIN.fields_by_name['action_config'].message_type = _CTOOLCHAIN_ACTIONCONFIG
+_CTOOLCHAIN.fields_by_name['artifact_name_pattern'].message_type = _CTOOLCHAIN_ARTIFACTNAMEPATTERN
+_CTOOLCHAIN.fields_by_name['tool_path'].message_type = _TOOLPATH
+_CTOOLCHAIN.fields_by_name['compilation_mode_flags'].message_type = _COMPILATIONMODEFLAGS
+_CTOOLCHAIN.fields_by_name['lipo_mode_flags'].message_type = _LIPOMODEFLAGS
+_CTOOLCHAIN.fields_by_name['linking_mode_flags'].message_type = _LINKINGMODEFLAGS
+_CTOOLCHAIN.fields_by_name['make_variable'].message_type = _MAKEVARIABLE
+_COMPILATIONMODEFLAGS.fields_by_name['mode'].enum_type = _COMPILATIONMODE
+_LINKINGMODEFLAGS.fields_by_name['mode'].enum_type = _LINKINGMODE
+_LIPOMODEFLAGS.fields_by_name['mode'].enum_type = _LIPOMODE
+_CROSSTOOLRELEASE.fields_by_name['default_toolchain'].message_type = _DEFAULTCPUTOOLCHAIN
+_CROSSTOOLRELEASE.fields_by_name['toolchain'].message_type = _CTOOLCHAIN
+DESCRIPTOR.message_types_by_name['CToolchain'] = _CTOOLCHAIN
+DESCRIPTOR.message_types_by_name['ToolPath'] = _TOOLPATH
+DESCRIPTOR.message_types_by_name['CompilationModeFlags'] = _COMPILATIONMODEFLAGS
+DESCRIPTOR.message_types_by_name['LinkingModeFlags'] = _LINKINGMODEFLAGS
+DESCRIPTOR.message_types_by_name['LipoModeFlags'] = _LIPOMODEFLAGS
+DESCRIPTOR.message_types_by_name['MakeVariable'] = _MAKEVARIABLE
+DESCRIPTOR.message_types_by_name['DefaultCpuToolchain'] = _DEFAULTCPUTOOLCHAIN
+DESCRIPTOR.message_types_by_name['CrosstoolRelease'] = _CROSSTOOLRELEASE
+DESCRIPTOR.enum_types_by_name['CompilationMode'] = _COMPILATIONMODE
+DESCRIPTOR.enum_types_by_name['LinkingMode'] = _LINKINGMODE
+DESCRIPTOR.enum_types_by_name['LipoMode'] = _LIPOMODE
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+CToolchain = _reflection.GeneratedProtocolMessageType('CToolchain', (_message.Message,), dict(
+
+  FlagGroup = _reflection.GeneratedProtocolMessageType('FlagGroup', (_message.Message,), dict(
+    DESCRIPTOR = _CTOOLCHAIN_FLAGGROUP,
+    __module__ = 'src.main.protobuf.crosstool_config_pb2'
+    # @@protoc_insertion_point(class_scope:com.google.devtools.build.lib.view.config.crosstool.CToolchain.FlagGroup)
+    ))
+  ,
+
+  VariableWithValue = _reflection.GeneratedProtocolMessageType('VariableWithValue', (_message.Message,), dict(
+    DESCRIPTOR = _CTOOLCHAIN_VARIABLEWITHVALUE,
+    __module__ = 'src.main.protobuf.crosstool_config_pb2'
+    # @@protoc_insertion_point(class_scope:com.google.devtools.build.lib.view.config.crosstool.CToolchain.VariableWithValue)
+    ))
+  ,
+
+  EnvEntry = _reflection.GeneratedProtocolMessageType('EnvEntry', (_message.Message,), dict(
+    DESCRIPTOR = _CTOOLCHAIN_ENVENTRY,
+    __module__ = 'src.main.protobuf.crosstool_config_pb2'
+    # @@protoc_insertion_point(class_scope:com.google.devtools.build.lib.view.config.crosstool.CToolchain.EnvEntry)
+    ))
+  ,
+
+  FeatureSet = _reflection.GeneratedProtocolMessageType('FeatureSet', (_message.Message,), dict(
+    DESCRIPTOR = _CTOOLCHAIN_FEATURESET,
+    __module__ = 'src.main.protobuf.crosstool_config_pb2'
+    # @@protoc_insertion_point(class_scope:com.google.devtools.build.lib.view.config.crosstool.CToolchain.FeatureSet)
+    ))
+  ,
+
+  WithFeatureSet = _reflection.GeneratedProtocolMessageType('WithFeatureSet', (_message.Message,), dict(
+    DESCRIPTOR = _CTOOLCHAIN_WITHFEATURESET,
+    __module__ = 'src.main.protobuf.crosstool_config_pb2'
+    # @@protoc_insertion_point(class_scope:com.google.devtools.build.lib.view.config.crosstool.CToolchain.WithFeatureSet)
+    ))
+  ,
+
+  FlagSet = _reflection.GeneratedProtocolMessageType('FlagSet', (_message.Message,), dict(
+    DESCRIPTOR = _CTOOLCHAIN_FLAGSET,
+    __module__ = 'src.main.protobuf.crosstool_config_pb2'
+    # @@protoc_insertion_point(class_scope:com.google.devtools.build.lib.view.config.crosstool.CToolchain.FlagSet)
+    ))
+  ,
+
+  EnvSet = _reflection.GeneratedProtocolMessageType('EnvSet', (_message.Message,), dict(
+    DESCRIPTOR = _CTOOLCHAIN_ENVSET,
+    __module__ = 'src.main.protobuf.crosstool_config_pb2'
+    # @@protoc_insertion_point(class_scope:com.google.devtools.build.lib.view.config.crosstool.CToolchain.EnvSet)
+    ))
+  ,
+
+  Feature = _reflection.GeneratedProtocolMessageType('Feature', (_message.Message,), dict(
+    DESCRIPTOR = _CTOOLCHAIN_FEATURE,
+    __module__ = 'src.main.protobuf.crosstool_config_pb2'
+    # @@protoc_insertion_point(class_scope:com.google.devtools.build.lib.view.config.crosstool.CToolchain.Feature)
+    ))
+  ,
+
+  Tool = _reflection.GeneratedProtocolMessageType('Tool', (_message.Message,), dict(
+    DESCRIPTOR = _CTOOLCHAIN_TOOL,
+    __module__ = 'src.main.protobuf.crosstool_config_pb2'
+    # @@protoc_insertion_point(class_scope:com.google.devtools.build.lib.view.config.crosstool.CToolchain.Tool)
+    ))
+  ,
+
+  ArtifactNamePattern = _reflection.GeneratedProtocolMessageType('ArtifactNamePattern', (_message.Message,), dict(
+    DESCRIPTOR = _CTOOLCHAIN_ARTIFACTNAMEPATTERN,
+    __module__ = 'src.main.protobuf.crosstool_config_pb2'
+    # @@protoc_insertion_point(class_scope:com.google.devtools.build.lib.view.config.crosstool.CToolchain.ArtifactNamePattern)
+    ))
+  ,
+
+  ActionConfig = _reflection.GeneratedProtocolMessageType('ActionConfig', (_message.Message,), dict(
+    DESCRIPTOR = _CTOOLCHAIN_ACTIONCONFIG,
+    __module__ = 'src.main.protobuf.crosstool_config_pb2'
+    # @@protoc_insertion_point(class_scope:com.google.devtools.build.lib.view.config.crosstool.CToolchain.ActionConfig)
+    ))
+  ,
+  DESCRIPTOR = _CTOOLCHAIN,
+  __module__ = 'src.main.protobuf.crosstool_config_pb2'
+  # @@protoc_insertion_point(class_scope:com.google.devtools.build.lib.view.config.crosstool.CToolchain)
+  ))
+_sym_db.RegisterMessage(CToolchain)
+_sym_db.RegisterMessage(CToolchain.FlagGroup)
+_sym_db.RegisterMessage(CToolchain.VariableWithValue)
+_sym_db.RegisterMessage(CToolchain.EnvEntry)
+_sym_db.RegisterMessage(CToolchain.FeatureSet)
+_sym_db.RegisterMessage(CToolchain.WithFeatureSet)
+_sym_db.RegisterMessage(CToolchain.FlagSet)
+_sym_db.RegisterMessage(CToolchain.EnvSet)
+_sym_db.RegisterMessage(CToolchain.Feature)
+_sym_db.RegisterMessage(CToolchain.Tool)
+_sym_db.RegisterMessage(CToolchain.ArtifactNamePattern)
+_sym_db.RegisterMessage(CToolchain.ActionConfig)
+
+ToolPath = _reflection.GeneratedProtocolMessageType('ToolPath', (_message.Message,), dict(
+  DESCRIPTOR = _TOOLPATH,
+  __module__ = 'src.main.protobuf.crosstool_config_pb2'
+  # @@protoc_insertion_point(class_scope:com.google.devtools.build.lib.view.config.crosstool.ToolPath)
+  ))
+_sym_db.RegisterMessage(ToolPath)
+
+CompilationModeFlags = _reflection.GeneratedProtocolMessageType('CompilationModeFlags', (_message.Message,), dict(
+  DESCRIPTOR = _COMPILATIONMODEFLAGS,
+  __module__ = 'src.main.protobuf.crosstool_config_pb2'
+  # @@protoc_insertion_point(class_scope:com.google.devtools.build.lib.view.config.crosstool.CompilationModeFlags)
+  ))
+_sym_db.RegisterMessage(CompilationModeFlags)
+
+LinkingModeFlags = _reflection.GeneratedProtocolMessageType('LinkingModeFlags', (_message.Message,), dict(
+  DESCRIPTOR = _LINKINGMODEFLAGS,
+  __module__ = 'src.main.protobuf.crosstool_config_pb2'
+  # @@protoc_insertion_point(class_scope:com.google.devtools.build.lib.view.config.crosstool.LinkingModeFlags)
+  ))
+_sym_db.RegisterMessage(LinkingModeFlags)
+
+LipoModeFlags = _reflection.GeneratedProtocolMessageType('LipoModeFlags', (_message.Message,), dict(
+  DESCRIPTOR = _LIPOMODEFLAGS,
+  __module__ = 'src.main.protobuf.crosstool_config_pb2'
+  # @@protoc_insertion_point(class_scope:com.google.devtools.build.lib.view.config.crosstool.LipoModeFlags)
+  ))
+_sym_db.RegisterMessage(LipoModeFlags)
+
+MakeVariable = _reflection.GeneratedProtocolMessageType('MakeVariable', (_message.Message,), dict(
+  DESCRIPTOR = _MAKEVARIABLE,
+  __module__ = 'src.main.protobuf.crosstool_config_pb2'
+  # @@protoc_insertion_point(class_scope:com.google.devtools.build.lib.view.config.crosstool.MakeVariable)
+  ))
+_sym_db.RegisterMessage(MakeVariable)
+
+DefaultCpuToolchain = _reflection.GeneratedProtocolMessageType('DefaultCpuToolchain', (_message.Message,), dict(
+  DESCRIPTOR = _DEFAULTCPUTOOLCHAIN,
+  __module__ = 'src.main.protobuf.crosstool_config_pb2'
+  # @@protoc_insertion_point(class_scope:com.google.devtools.build.lib.view.config.crosstool.DefaultCpuToolchain)
+  ))
+_sym_db.RegisterMessage(DefaultCpuToolchain)
+
+CrosstoolRelease = _reflection.GeneratedProtocolMessageType('CrosstoolRelease', (_message.Message,), dict(
+  DESCRIPTOR = _CROSSTOOLRELEASE,
+  __module__ = 'src.main.protobuf.crosstool_config_pb2'
+  # @@protoc_insertion_point(class_scope:com.google.devtools.build.lib.view.config.crosstool.CrosstoolRelease)
+  ))
+_sym_db.RegisterMessage(CrosstoolRelease)
+
+
+DESCRIPTOR.has_options = True
+DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), _b('\n3com.google.devtools.build.lib.view.config.crosstool'))
+# @@protoc_insertion_point(module_scope)
diff --git a/third_party/protobuf/BUILD b/third_party/protobuf/BUILD
index ddeeb77..b6f988a 100644
--- a/third_party/protobuf/BUILD
+++ b/third_party/protobuf/BUILD
@@ -143,7 +143,7 @@
     deps = [":protobuf_lite"],
 )
 
-'''
+"""
 objc_library(
     name = "protobuf_objc",
     hdrs = ["objectivec/GPBProtocolBuffers.h"],
@@ -151,7 +151,7 @@
     non_arc_srcs = ["objectivec/GPBProtocolBuffers.m"],
     visibility = ["//visibility:public"],
 )
-'''
+"""
 
 RELATIVE_WELL_KNOWN_PROTOS = [
     # AUTOGEN(well_known_protos)
@@ -363,10 +363,10 @@
     name = "cc_test_protos",
     srcs = LITE_TEST_PROTOS + TEST_PROTOS,
     include = "src",
+    copts = COPTS,
     default_runtime = ":protobuf",
     protoc = ":protoc",
     deps = [":cc_wkt_protos"],
-    copts = COPTS,
 )
 
 COMMON_TEST_SRCS = [
@@ -386,12 +386,12 @@
         "src/google/protobuf/compiler/test_plugin.cc",
         "src/google/protobuf/testing/file.cc",
     ],
+    copts = COPTS,
     deps = [
         ":protobuf",
         ":protoc_lib",
         "//external:gtest",
     ],
-    copts = COPTS,
 )
 
 cc_test(
@@ -488,11 +488,11 @@
     name = "gen_well_known_protos_java",
     srcs = WELL_KNOWN_PROTOS,
     outs = [
-        "wellknown.srcjar"
+        "wellknown.srcjar",
     ],
     cmd = "$(location :protoc) --java_out=$(@D)/wellknown.jar" +
-        " -Ithird_party/protobuf/src $(SRCS) " +
-        " && mv $(@D)/wellknown.jar $(@D)/wellknown.srcjar",
+          " -Ithird_party/protobuf/src $(SRCS) " +
+          " && mv $(@D)/wellknown.jar $(@D)/wellknown.srcjar",
     tools = [":protoc"],
 )
 
@@ -543,7 +543,7 @@
     include = "python",
 )
 
-'''
+"""
 cc_binary(
     name = "internal/_api_implementation.so",
     srcs = ["python/google/protobuf/internal/api_implementation.cc"],
@@ -580,7 +580,7 @@
         ":use_fast_cpp_protos": ["//third_party/protobuf/util/python:python_headers"],
     }),
 )
-'''
+"""
 
 config_setting(
     name = "use_fast_cpp_protos",
@@ -603,6 +603,7 @@
     default_runtime = "",
     protoc = ":protoc",
     py_extra_srcs = [":python_srcs"],
+    py_imports = ["."],
     py_libs = ["//external:six"],
     srcs_version = "PY2AND3",
     visibility = ["//visibility:public"],
diff --git a/third_party/protobuf/protobuf.bzl b/third_party/protobuf/protobuf.bzl
index 29fdad6..842785c 100644
--- a/third_party/protobuf/protobuf.bzl
+++ b/third_party/protobuf/protobuf.bzl
@@ -90,7 +90,7 @@
         "deps": attr.label_list(providers = ["proto"]),
         "includes": attr.string_list(),
         "protoc": attr.label(
-            cfg = 'host',
+            cfg = "host",
             executable = True,
             single_file = True,
             mandatory = True,
@@ -180,7 +180,6 @@
       includes=includes,
       **kargs)
 
-
 def internal_copied_filegroup(
         name,
         srcs,
@@ -210,13 +209,13 @@
       srcs=outs,
       **kargs)
 
-
 def py_proto_library(
         name,
         srcs=[],
         deps=[],
         py_libs=[],
         py_extra_srcs=[],
+        py_imports=[],
         include=None,
         default_runtime="//google/protobuf:protobuf_python",
         protoc="//google/protobuf:protoc",
@@ -270,12 +269,13 @@
 
   if default_runtime and not default_runtime in py_libs + deps:
     py_libs = py_libs + [default_runtime]
-  py_libs = py_libs + ['@python_import_helpers//:google_protobuf_importer']
+  py_libs = py_libs
 
   native.py_library(
       name=name,
       srcs=outs+py_extra_srcs,
       deps=py_libs+deps,
+      imports=py_imports,
       **kargs)
 
 def internal_protobuf_py_tests(
diff --git a/third_party/python_import_helpers.BUILD b/third_party/python_import_helpers.BUILD
deleted file mode 100644
index 38a68ec..0000000
--- a/third_party/python_import_helpers.BUILD
+++ /dev/null
@@ -1,19 +0,0 @@
-# This repository is used to create helper __init__.py files which import things
-# under third_party at the root of the Python import namespace instead of
-# requiring third_party.xyz. in front of them.
-
-genrule(
-  name = 'google_protobuf_importer_init',
-  outs = ['google/__init__.py'],
-  cmd = 'echo "%s" > $@' % '\n'.join([
-    'import sys',
-    'import third_party.protobuf.google.protobuf',
-    'sys.modules[\'google.protobuf\'] = third_party.protobuf.google.protobuf',
-  ]),
-)
-
-py_library(
-  name = 'google_protobuf_importer',
-  visibility = ['//visibility:public'],
-  srcs = [':google_protobuf_importer_init'],
-)
diff --git a/tools/cpp/BUILD b/tools/cpp/BUILD
index 3bee68e..9f6bb19 100644
--- a/tools/cpp/BUILD
+++ b/tools/cpp/BUILD
@@ -81,6 +81,7 @@
 filegroup(
     name = "clang_3p6_compiler_files",
     srcs = [
+        "flags_compiler_inputs",
         "//tools/cpp/clang_3p6:clang",
         "//tools/cpp/clang_3p6:ld",
         "@clang_3p6_repo//:compiler_components",
@@ -197,7 +198,7 @@
     name = "cc-compiler-cortex-m4f",
     all_files = ":empty",
     compiler_files = ":empty",
-    cpu = "cortex-m4",
+    cpu = "cortex-m4f",
     dwp_files = ":empty",
     dynamic_runtime_libs = [":empty"],
     linker_files = "//motors/core:linkerscript",
@@ -206,3 +207,12 @@
     strip_files = ":empty",
     supports_param_files = 0,
 )
+
+py_binary(
+    name = "gen_crosstool",
+    srcs = ["gen_crosstool.py"],
+    main = "gen_crosstool.py",
+    deps = [
+        "//third_party/bazel:crosstool_config_proto_py",
+    ],
+)
diff --git a/tools/cpp/CROSSTOOL b/tools/cpp/CROSSTOOL
index b29c5ad..9306652 100644
--- a/tools/cpp/CROSSTOOL
+++ b/tools/cpp/CROSSTOOL
@@ -1,131 +1,187 @@
+# GENERATED FILE. DO NOT EDIT
+# Generated by tools/cpp/gen_crosstool.py
 major_version: "local"
 minor_version: ""
 default_target_cpu: "same_as_host"
-
 default_toolchain {
   cpu: "roborio"
   toolchain_identifier: "roborio_linux"
 }
-
 default_toolchain {
   cpu: "k8"
   toolchain_identifier: "k8_linux"
 }
-
 default_toolchain {
   cpu: "armeabi-v7a"
   toolchain_identifier: "stub_armeabi-v7a"
 }
-
 default_toolchain {
   cpu: "armhf-debian"
   toolchain_identifier: "clang_linux_armhf"
 }
-
 default_toolchain {
   cpu: "cortex-m4f"
   toolchain_identifier: "cortex-m4f"
 }
-
 toolchain {
+  toolchain_identifier: "stub_armeabi-v7a"
+  host_system_name: "armeabi-v7a"
+  target_system_name: "armeabi-v7a"
+  target_cpu: "armeabi-v7a"
+  target_libc: "armeabi-v7a"
+  compiler: "compiler"
   abi_version: "armeabi-v7a"
   abi_libc_version: "armeabi-v7a"
-  builtin_sysroot: ""
-  compiler: "compiler"
-  host_system_name: "armeabi-v7a"
-  needsPic: true
+  tool_path {
+    name: "ar"
+    path: "/bin/false"
+  }
+  tool_path {
+    name: "compat-ld"
+    path: "/bin/false"
+  }
+  tool_path {
+    name: "cpp"
+    path: "/bin/false"
+  }
+  tool_path {
+    name: "dwp"
+    path: "/bin/false"
+  }
+  tool_path {
+    name: "gcc"
+    path: "/bin/false"
+  }
+  tool_path {
+    name: "gcov"
+    path: "/bin/false"
+  }
+  tool_path {
+    name: "ld"
+    path: "/bin/false"
+  }
+  tool_path {
+    name: "nm"
+    path: "/bin/false"
+  }
+  tool_path {
+    name: "objcopy"
+    path: "/bin/false"
+  }
+  tool_path {
+    name: "objdump"
+    path: "/bin/false"
+  }
+  tool_path {
+    name: "strip"
+    path: "/bin/false"
+  }
   supports_gold_linker: false
-  supports_incremental_linker: false
-  supports_fission: false
-  supports_interface_shared_objects: false
+  supports_thin_archives: false
+  needsPic: true
+  builtin_sysroot: ""
   supports_normalizing_ar: false
   supports_start_end_lib: false
-  supports_thin_archives: false
-  target_libc: "armeabi-v7a"
-  target_cpu: "armeabi-v7a"
-  target_system_name: "armeabi-v7a"
-  toolchain_identifier: "stub_armeabi-v7a"
-
-  tool_path { name: "ar" path: "/bin/false" }
-  tool_path { name: "compat-ld" path: "/bin/false" }
-  tool_path { name: "cpp" path: "/bin/false" }
-  tool_path { name: "dwp" path: "/bin/false" }
-  tool_path { name: "gcc" path: "/bin/false" }
-  tool_path { name: "gcov" path: "/bin/false" }
-  tool_path { name: "ld" path: "/bin/false" }
-
-  tool_path { name: "nm" path: "/bin/false" }
-  tool_path { name: "objcopy" path: "/bin/false" }
-  tool_path { name: "objdump" path: "/bin/false" }
-  tool_path { name: "strip" path: "/bin/false" }
+  supports_interface_shared_objects: false
+  supports_incremental_linker: false
+  supports_fission: false
 }
-
 toolchain {
+  toolchain_identifier: "k8_linux"
+  host_system_name: "local"
+  target_system_name: "k8"
+  target_cpu: "k8"
+  target_libc: "local"
+  compiler: "clang"
   abi_version: "local"
   abi_libc_version: "local"
-  builtin_sysroot: ""
-  compiler: "clang"
-  host_system_name: "local"
-  needsPic: true
+  tool_path {
+    name: "ar"
+    path: "clang_3p6/x86_64-linux-gnu-ar"
+  }
+  tool_path {
+    name: "compat-ld"
+    path: "clang_3p6/x86_64-linux-gnu-ld"
+  }
+  tool_path {
+    name: "cpp"
+    path: "clang_3p6/x86_64-linux-gnu-cpp"
+  }
+  tool_path {
+    name: "dwp"
+    path: "clang_3p6/x86_64-linux-gnu-dwp"
+  }
+  tool_path {
+    name: "gcc"
+    path: "clang_3p6/x86_64-linux-gnu-clang-3.6"
+  }
+  tool_path {
+    name: "gcov"
+    path: "clang_3p6/x86_64-linux-gnu-gcov"
+  }
+  tool_path {
+    name: "ld"
+    path: "clang_3p6/x86_64-linux-gnu-ld"
+  }
+  tool_path {
+    name: "nm"
+    path: "clang_3p6/x86_64-linux-gnu-nm"
+  }
+  tool_path {
+    name: "objcopy"
+    path: "clang_3p6/x86_64-linux-gnu-objcopy"
+  }
+  tool_path {
+    name: "objdump"
+    path: "clang_3p6/x86_64-linux-gnu-objdump"
+  }
+  tool_path {
+    name: "strip"
+    path: "clang_3p6/x86_64-linux-gnu-strip"
+  }
   supports_gold_linker: false
-  supports_incremental_linker: false
-  supports_fission: false
-  supports_interface_shared_objects: false
-  supports_normalizing_ar: false
-  supports_start_end_lib: false
   supports_thin_archives: false
-  target_libc: "local"
-  target_cpu: "k8"
-  target_system_name: "k8"
-  toolchain_identifier: "k8_linux"
-
-  # These paths are relative to //tools/cpp.
-  tool_path { name: "ar" path: "clang_3p6/x86_64-linux-gnu-ar" }
-  tool_path { name: "compat-ld" path: "clang_3p6/x86_64-linux-gnu-ld" }
-  tool_path { name: "cpp" path: "clang_3p6/x86_64-linux-gnu-cpp" }
-  tool_path { name: "dwp" path: "clang_3p6/x86_64-linux-gnu-dwp" }
-  tool_path { name: "gcc" path: "clang_3p6/x86_64-linux-gnu-clang-3.6" }
-  tool_path { name: "gcov" path: "clang_3p6/x86_64-linux-gnu-gcov" }
-  # C(++) compiles invoke the compiler (as that is the one knowing where
-  # to find libraries), but we provide LD so other rules can invoke the linker.
-  tool_path { name: "ld" path: "clang_3p6/x86_64-linux-gnu-ld" }
-  tool_path { name: "nm" path: "clang_3p6/x86_64-linux-gnu-nm" }
-  tool_path { name: "objcopy" path: "clang_3p6/x86_64-linux-gnu-objcopy" }
-  objcopy_embed_flag: "-I"
-  objcopy_embed_flag: "binary"
-  tool_path { name: "objdump" path: "clang_3p6/x86_64-linux-gnu-objdump" }
-  tool_path { name: "strip" path: "clang_3p6/x86_64-linux-gnu-strip" }
-  linking_mode_flags { mode: DYNAMIC }
-
+  needsPic: true
   compiler_flag: "--sysroot=external/clang_3p6_repo/"
   compiler_flag: "-nostdinc"
   compiler_flag: "-isystem"
-  compiler_flag: "external/clang_3p6_repo/usr/include",
+  compiler_flag: "external/clang_3p6_repo/usr/include"
   compiler_flag: "-isystem"
-  compiler_flag: "external/clang_3p6_repo/usr/include/x86_64-linux-gnu",
+  compiler_flag: "external/clang_3p6_repo/usr/include/x86_64-linux-gnu"
   compiler_flag: "-isystem"
-  compiler_flag: "external/clang_3p6_repo/usr/lib/llvm-3.6/lib/clang/3.6.2/include",
-
+  compiler_flag: "external/clang_3p6_repo/usr/lib/llvm-3.6/lib/clang/3.6.2/include"
+  compiler_flag: "-D__STDC_FORMAT_MACROS"
+  compiler_flag: "-D__STDC_CONSTANT_MACROS"
+  compiler_flag: "-D__STDC_LIMIT_MACROS"
+  compiler_flag: "-D_FILE_OFFSET_BITS=64"
+  compiler_flag: "-DAOS_ARCHITECTURE_arm_frc"
+  compiler_flag: "-U_FORTIFY_SOURCE"
+  compiler_flag: "-D_FORTIFY_SOURCE=1"
+  compiler_flag: "-fstack-protector"
+  compiler_flag: "-fPIE"
+  compiler_flag: "-fcolor-diagnostics"
+  compiler_flag: "-fmessage-length=80"
+  compiler_flag: "-fmacro-backtrace-limit=0"
+  compiler_flag: "-Wall"
+  compiler_flag: "-Wextra"
+  compiler_flag: "-Wpointer-arith"
+  compiler_flag: "-Wstrict-aliasing"
+  compiler_flag: "-Wcast-qual"
+  compiler_flag: "-Wcast-align"
+  compiler_flag: "-Wwrite-strings"
+  compiler_flag: "-Wtype-limits"
+  compiler_flag: "-Wsign-compare"
+  compiler_flag: "-Wformat=2"
+  compiler_flag: "-Werror"
+  compiler_flag: "-fno-omit-frame-pointer"
+  compiler_flag: "-pipe"
+  compiler_flag: "-ggdb3"
   cxx_flag: "-isystem"
   cxx_flag: "external/clang_3p6_repo/usr/include/c++/4.9"
   cxx_flag: "-isystem"
   cxx_flag: "external/clang_3p6_repo/usr/include/x86_64-linux-gnu/c++/4.9"
   cxx_flag: "-isystem"
   cxx_flag: "external/clang_3p6_repo/usr/include/c++/4.9/backward"
-
-  # TODO(bazel-team): In theory, the path here ought to exactly match the path
-  # used by gcc. That works because bazel currently doesn't track files at
-  # absolute locations and has no remote execution, yet. However, this will need
-  # to be fixed, maybe with auto-detection?
-  cxx_builtin_include_directory: '%package(@clang_3p6_repo//usr)%/include/c++/4.9'
-  cxx_builtin_include_directory: '%package(@clang_3p6_repo//usr)%/include/x86_64-linux-gnu/c++/4.9'
-  cxx_builtin_include_directory: '%package(@clang_3p6_repo//usr)%/include/c++/4.9/backward'
-  cxx_builtin_include_directory: '%package(@clang_3p6_repo//usr)%/local/include'
-  cxx_builtin_include_directory: '%package(@clang_3p6_repo//usr)%/lib/llvm-3.6/lib/clang/3.6.2/include'
-  cxx_builtin_include_directory: '%package(@clang_3p6_repo//usr)%/include/x86_64-linux-gnu'
-  cxx_builtin_include_directory: '%package(@clang_3p6_repo//usr)%/include'
-  cxx_builtin_include_directory: '%package(@clang_3p6_repo//usr)%/lib/clang/3.6.2/include'
-
   linker_flag: "-nodefaultlibs"
   linker_flag: "--sysroot=external/clang_3p6_repo/"
   linker_flag: "-lstdc++"
@@ -137,10 +193,48 @@
   linker_flag: "-Lexternal/clang_3p6/lib/x86_64-linux-gnu"
   linker_flag: "-Lexternal/clang_3p6/usr/lib/x86_64-linux-gnu"
   linker_flag: "-Lexternal/clang_3p6/usr/lib/gcc/x86_64-linux-gnu"
-
+  linker_flag: "-no-canonical-prefixes"
+  linker_flag: "-fuse-ld=gold"
+  linker_flag: "-Wl,-z,relro,-z,now"
+  linker_flag: "-lm"
+  linker_flag: "-Wl,--build-id=md5"
+  linker_flag: "-Wl,--hash-style=gnu"
+  linker_flag: "-Wl,--warn-execstack"
+  linker_flag: "-Wl,--detect-odr-violations"
+  objcopy_embed_flag: "-I"
+  objcopy_embed_flag: "binary"
+  compilation_mode_flags {
+    mode: OPT
+    compiler_flag: "-O2"
+    compiler_flag: "-DNDEBUG"
+    compiler_flag: "-ffunction-sections"
+    compiler_flag: "-fdata-sections"
+    linker_flag: "-Wl,--gc-sections"
+  }
+  linking_mode_flags {
+    mode: DYNAMIC
+  }
+  cxx_builtin_include_directory: "%package(@clang_3p6_repo//usr)%/include/c++/4.9"
+  cxx_builtin_include_directory: "%package(@clang_3p6_repo//usr)%/include/x86_64-linux-gnu/c++/4.9"
+  cxx_builtin_include_directory: "%package(@clang_3p6_repo//usr)%/include/c++/4.9/backward"
+  cxx_builtin_include_directory: "%package(@clang_3p6_repo//usr)%/local/include"
+  cxx_builtin_include_directory: "%package(@clang_3p6_repo//usr)%/lib/llvm-3.6/lib/clang/3.6.2/include"
+  cxx_builtin_include_directory: "%package(@clang_3p6_repo//usr)%/include/x86_64-linux-gnu"
+  cxx_builtin_include_directory: "%package(@clang_3p6_repo//usr)%/include"
+  cxx_builtin_include_directory: "%package(@clang_3p6_repo//usr)%/lib/clang/3.6.2/include"
+  builtin_sysroot: ""
+  unfiltered_cxx_flag: "-no-canonical-prefixes"
+  unfiltered_cxx_flag: "-Wno-builtin-macro-redefined"
+  unfiltered_cxx_flag: "-D__DATE__=\"redacted\""
+  unfiltered_cxx_flag: "-D__TIMESTAMP__=\"redacted\""
+  unfiltered_cxx_flag: "-D__TIME__=\"redacted\""
+  supports_normalizing_ar: false
+  supports_start_end_lib: false
+  supports_interface_shared_objects: false
+  supports_incremental_linker: false
+  supports_fission: false
   feature {
     name: "opt"
-    implies: "all_modes"
     flag_set {
       action: "preprocess-assemble"
       action: "c-compile"
@@ -152,11 +246,10 @@
         flag: "-DAOS_DEBUG=0"
       }
     }
+    implies: "all_modes"
   }
-
   feature {
     name: "dbg"
-    implies: "all_modes"
     flag_set {
       action: "preprocess-assemble"
       action: "c-compile"
@@ -171,11 +264,10 @@
         flag: "-fno-omit-frame-pointer"
       }
     }
+    implies: "all_modes"
   }
-
   feature {
     name: "fastbuild"
-    implies: "all_modes"
     flag_set {
       action: "preprocess-assemble"
       action: "c-compile"
@@ -187,8 +279,8 @@
         flag: "-DAOS_DEBUG=0"
       }
     }
+    implies: "all_modes"
   }
-
   feature {
     name: "all_modes"
     flag_set {
@@ -218,53 +310,95 @@
       action: "c++-module-compile"
       action: "c-compile"
       flag_group {
-        # We always want to compile with -pthread semantics.
         flag: "-pthread"
       }
     }
   }
-
-  # Anticipated future default.
-  # This makes GCC and Clang do what we want when called through symlinks.
-  unfiltered_cxx_flag: "-no-canonical-prefixes"
-  linker_flag: "-no-canonical-prefixes"
-
-  # Things that the code wants defined.
+  feature {
+    name: "pie_for_linking"
+    flag_set {
+      action: "c++-link-executable"
+      flag_group {
+        flag: "-pie"
+      }
+    }
+    enabled: true
+  }
+}
+toolchain {
+  toolchain_identifier: "roborio_linux"
+  host_system_name: "roborio"
+  target_system_name: "roborio"
+  target_cpu: "roborio"
+  target_libc: "roborio"
+  compiler: "gcc"
+  abi_version: "roborio"
+  abi_libc_version: "roborio"
+  tool_path {
+    name: "ar"
+    path: "arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-ar"
+  }
+  tool_path {
+    name: "compat-ld"
+    path: "arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-ld"
+  }
+  tool_path {
+    name: "cpp"
+    path: "arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-cpp"
+  }
+  tool_path {
+    name: "dwp"
+    path: "/bin/false"
+  }
+  tool_path {
+    name: "gcc"
+    path: "arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-gcc"
+  }
+  tool_path {
+    name: "gcov"
+    path: "arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-gcov-4.9"
+  }
+  tool_path {
+    name: "ld"
+    path: "arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-ld"
+  }
+  tool_path {
+    name: "nm"
+    path: "arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-nm"
+  }
+  tool_path {
+    name: "objcopy"
+    path: "arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-objcopy"
+  }
+  tool_path {
+    name: "objdump"
+    path: "arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-objdump"
+  }
+  tool_path {
+    name: "strip"
+    path: "arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-strip"
+  }
+  supports_gold_linker: false
+  supports_thin_archives: false
+  needsPic: true
+  compiler_flag: "--sysroot=external/arm_frc_linux_gnueabi_repo/usr/arm-frc-linux-gnueabi"
+  compiler_flag: "-nostdinc"
+  compiler_flag: "-isystem"
+  compiler_flag: "external/arm_frc_linux_gnueabi_repo/usr/lib/x86_64-linux-gnu/gcc/arm-frc-linux-gnueabi/5.4.0/include"
+  compiler_flag: "-isystem"
+  compiler_flag: "external/arm_frc_linux_gnueabi_repo/usr/lib/x86_64-linux-gnu/gcc/arm-frc-linux-gnueabi/5.4.0/include-fixed"
+  compiler_flag: "-isystem"
+  compiler_flag: "external/arm_frc_linux_gnueabi_repo/usr/arm-frc-linux-gnueabi/usr/include"
+  compiler_flag: "-mfpu=neon"
   compiler_flag: "-D__STDC_FORMAT_MACROS"
   compiler_flag: "-D__STDC_CONSTANT_MACROS"
   compiler_flag: "-D__STDC_LIMIT_MACROS"
   compiler_flag: "-D_FILE_OFFSET_BITS=64"
-  # TODO(Brian): Rename this or something.
   compiler_flag: "-DAOS_ARCHITECTURE_arm_frc"
-
-  linker_flag: "-fuse-ld=gold"
-
-  # Make C++ compilation deterministic. Use linkstamping instead of these
-  # compiler symbols.
-  unfiltered_cxx_flag: "-Wno-builtin-macro-redefined"
-  unfiltered_cxx_flag: "-D__DATE__=\"redacted\""
-  unfiltered_cxx_flag: "-D__TIMESTAMP__=\"redacted\""
-  unfiltered_cxx_flag: "-D__TIME__=\"redacted\""
-
-  # Security hardening on by default.
-  # Conservative choice; -D_FORTIFY_SOURCE=2 may be unsafe in some cases.
-  # We need to undef it before redefining it as some distributions now have
-  # it enabled by default.
   compiler_flag: "-U_FORTIFY_SOURCE"
-  compiler_flag: "-D_FORTIFY_SOURCE=1"
   compiler_flag: "-fstack-protector"
   compiler_flag: "-fPIE"
-  linker_flag: "-Wl,-z,relro,-z,now"
-
-  # Pretty much everything needs this, including parts of the glibc STL...
-  linker_flag: "-lm"
-
-  # Enable coloring even if there's no attached terminal. Bazel removes the
-  # escape sequences if --nocolor is specified.
-  compiler_flag: "-fcolor-diagnostics"
-  compiler_flag: "-fmessage-length=80"
-  compiler_flag: "-fmacro-backtrace-limit=0"
-
+  compiler_flag: "-fdiagnostics-color=always"
   compiler_flag: "-Wall"
   compiler_flag: "-Wextra"
   compiler_flag: "-Wpointer-arith"
@@ -276,92 +410,11 @@
   compiler_flag: "-Wsign-compare"
   compiler_flag: "-Wformat=2"
   compiler_flag: "-Werror"
-
-  # Keep stack frames for debugging, even in opt mode.
+  compiler_flag: "-Wunused-local-typedefs"
   compiler_flag: "-fno-omit-frame-pointer"
-
-  # Don't use temp files while compiling.
+  compiler_flag: "-D__has_feature(x)=0"
   compiler_flag: "-pipe"
-
-  # Stamp the binary with a unique identifier.
-  linker_flag: "-Wl,--build-id=md5"
-  linker_flag: "-Wl,--hash-style=gnu"
-  linker_flag: "-Wl,--warn-execstack"
-  linker_flag: "-Wl,--detect-odr-violations"
-
-  # Enable debug symbols.
   compiler_flag: "-ggdb3"
-
-  compilation_mode_flags {
-    mode: OPT
-
-    compiler_flag: "-O2"
-
-    # Disable assertions
-    compiler_flag: "-DNDEBUG"
-
-    # Removal of unused code and data at link time (can this increase binary size in some cases?).
-    compiler_flag: "-ffunction-sections"
-    compiler_flag: "-fdata-sections"
-    linker_flag: "-Wl,--gc-sections"
-  }
-  feature {
-    name: "pie_for_linking"
-    enabled: true
-    flag_set {
-      action: "c++-link-executable"
-      flag_group {
-        flag: "-pie"
-      }
-    }
-  }
-}
-
-toolchain {
-  abi_version: "roborio"
-  abi_libc_version: "roborio"
-  builtin_sysroot: ""
-  compiler: "gcc"
-  host_system_name: "roborio"
-  needsPic: true
-  supports_gold_linker: false
-  supports_incremental_linker: false
-  supports_fission: false
-  supports_interface_shared_objects: false
-  supports_normalizing_ar: false
-  supports_start_end_lib: false
-  supports_thin_archives: false
-  target_libc: "roborio"
-  target_cpu: "roborio"
-  target_system_name: "roborio"
-  toolchain_identifier: "roborio_linux"
-
-  tool_path { name: "ar" path: "arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-ar" }
-  tool_path { name: "compat-ld" path: "arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-ld" }
-  tool_path { name: "cpp" path: "arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-cpp" }
-  tool_path { name: "dwp" path: "/bin/false" }
-  tool_path { name: "gcc" path: "arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-gcc" }
-  tool_path { name: "gcov" path: "arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-gcov-4.9" }
-  # C(++) compiles invoke the compiler (as that is the one knowing where
-  # to find libraries), but we provide LD so other rules can invoke the linker.
-  tool_path { name: "ld" path: "arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-ld" }
-  tool_path { name: "nm" path: "arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-nm" }
-  tool_path { name: "objcopy" path: "arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-objcopy" }
-  objcopy_embed_flag: "-I"
-  objcopy_embed_flag: "binary"
-  tool_path { name: "objdump" path: "arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-objdump" }
-  tool_path { name: "strip" path: "arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-strip" }
-  linking_mode_flags { mode: DYNAMIC }
-
-  compiler_flag: "--sysroot=external/arm_frc_linux_gnueabi_repo/usr/arm-frc-linux-gnueabi"
-  compiler_flag: "-nostdinc"
-  compiler_flag: "-isystem"
-  compiler_flag: "external/arm_frc_linux_gnueabi_repo/usr/lib/x86_64-linux-gnu/gcc/arm-frc-linux-gnueabi/5.4.0/include",
-  compiler_flag: "-isystem"
-  compiler_flag: "external/arm_frc_linux_gnueabi_repo/usr/lib/x86_64-linux-gnu/gcc/arm-frc-linux-gnueabi/5.4.0/include-fixed"
-  compiler_flag: "-isystem"
-  compiler_flag: "external/arm_frc_linux_gnueabi_repo/usr/arm-frc-linux-gnueabi/usr/include"
-
   cxx_flag: "-isystem"
   cxx_flag: "external/arm_frc_linux_gnueabi_repo/usr/arm-frc-linux-gnueabi/include/c++/5.4.0"
   cxx_flag: "-isystem"
@@ -376,11 +429,28 @@
   cxx_flag: "external/arm_frc_linux_gnueabi_repo/usr/arm-frc-linux-gnueabi/include"
   cxx_flag: "-isystem"
   cxx_flag: "external/arm_frc_linux_gnueabi_repo/usr/arm-frc-linux-gnueabi/usr/include"
-
-  # TODO(bazel-team): In theory, the path here ought to exactly match the path
-  # used by gcc. That works because bazel currently doesn't track files at
-  # absolute locations and has no remote execution, yet. However, this will need
-  # to be fixed, maybe with auto-detection?
+  linker_flag: "-lstdc++"
+  linker_flag: "-Ltools/cpp/arm-frc-linux-gnueabi/libs"
+  linker_flag: "-no-canonical-prefixes"
+  linker_flag: "-Wl,-z,relro,-z,now"
+  linker_flag: "-lm"
+  linker_flag: "-pass-exit-codes"
+  linker_flag: "-Wl,--build-id=md5"
+  linker_flag: "-Wl,--hash-style=gnu"
+  objcopy_embed_flag: "-I"
+  objcopy_embed_flag: "binary"
+  compilation_mode_flags {
+    mode: OPT
+    compiler_flag: "-O2"
+    compiler_flag: "-DNDEBUG"
+    compiler_flag: "-D_FORTIFY_SOURCE=1"
+    compiler_flag: "-ffunction-sections"
+    compiler_flag: "-fdata-sections"
+    linker_flag: "-Wl,--gc-sections"
+  }
+  linking_mode_flags {
+    mode: DYNAMIC
+  }
   cxx_builtin_include_directory: "%package(@arm_frc_linux_gnueabi_repo//usr/arm-frc-linux-gnueabi/include)%/c++/5.4.0"
   cxx_builtin_include_directory: "%package(@arm_frc_linux_gnueabi_repo//usr/arm-frc-linux-gnueabi/include)%/c++/5.4.0/arm-frc-linux-gnueabi"
   cxx_builtin_include_directory: "%package(@arm_frc_linux_gnueabi_repo//usr/arm-frc-linux-gnueabi/include)%/c++/5.4.0/backward"
@@ -388,13 +458,19 @@
   cxx_builtin_include_directory: "%package(@arm_frc_linux_gnueabi_repo//usr/lib/x86_64-linux-gnu/gcc/arm-frc-linux-gnueabi/5.4.0/include-fixed)%"
   cxx_builtin_include_directory: "%package(@arm_frc_linux_gnueabi_repo//usr/arm-frc-linux-gnueabi/include)%"
   cxx_builtin_include_directory: "%package(@arm_frc_linux_gnueabi_repo//usr/arm-frc-linux-gnueabi/usr/include)%"
-
-  linker_flag: "-lstdc++"
-  linker_flag: "-Ltools/cpp/arm-frc-linux-gnueabi/libs"
-
+  builtin_sysroot: ""
+  unfiltered_cxx_flag: "-no-canonical-prefixes"
+  unfiltered_cxx_flag: "-Wno-builtin-macro-redefined"
+  unfiltered_cxx_flag: "-D__DATE__=\"redacted\""
+  unfiltered_cxx_flag: "-D__TIMESTAMP__=\"redacted\""
+  unfiltered_cxx_flag: "-D__TIME__=\"redacted\""
+  supports_normalizing_ar: false
+  supports_start_end_lib: false
+  supports_interface_shared_objects: false
+  supports_incremental_linker: false
+  supports_fission: false
   feature {
     name: "opt"
-    implies: "all_modes"
     flag_set {
       action: "preprocess-assemble"
       action: "c-compile"
@@ -406,11 +482,10 @@
         flag: "-DAOS_DEBUG=0"
       }
     }
+    implies: "all_modes"
   }
-
   feature {
     name: "dbg"
-    implies: "all_modes"
     flag_set {
       action: "preprocess-assemble"
       action: "c-compile"
@@ -425,11 +500,10 @@
         flag: "-fno-omit-frame-pointer"
       }
     }
+    implies: "all_modes"
   }
-
   feature {
     name: "fastbuild"
-    implies: "all_modes"
     flag_set {
       action: "preprocess-assemble"
       action: "c-compile"
@@ -441,8 +515,8 @@
         flag: "-DAOS_DEBUG=0"
       }
     }
+    implies: "all_modes"
   }
-
   feature {
     name: "all_modes"
     flag_set {
@@ -472,54 +546,100 @@
       action: "c++-module-compile"
       action: "c-compile"
       flag_group {
-        # We always want to compile with -pthread semantics.
         flag: "-pthread"
       }
     }
   }
-
-  compiler_flag: "-mfpu=neon"
-  # TODO(brians): See if it will run with this enabled.
-  #compiler_flag: "-mhwdiv=arm,thumb"
-
-  # Anticipated future default.
-  # This makes GCC and Clang do what we want when called through symlinks.
-  unfiltered_cxx_flag: "-no-canonical-prefixes"
-  linker_flag: "-no-canonical-prefixes"
-
-  # Things that the code wants defined.
+  feature {
+    name: "pie_for_linking"
+    flag_set {
+      action: "c++-link-executable"
+      flag_group {
+        flag: "-pie"
+      }
+    }
+    enabled: true
+  }
+}
+toolchain {
+  toolchain_identifier: "clang_linux_armhf"
+  host_system_name: "linux"
+  target_system_name: "arm_a15"
+  target_cpu: "armhf-debian"
+  target_libc: "glibc_2.19"
+  compiler: "clang"
+  abi_version: "clang_3.6"
+  abi_libc_version: "glibc_2.19"
+  tool_path {
+    name: "ar"
+    path: "linaro_linux_gcc/arm-linux-gnueabihf-ar"
+  }
+  tool_path {
+    name: "compat-ld"
+    path: "linaro_linux_gcc/arm-linux-gnueabihf-ld"
+  }
+  tool_path {
+    name: "cpp"
+    path: "linaro_linux_gcc/clang_bin/clang"
+  }
+  tool_path {
+    name: "dwp"
+    path: "linaro_linux_gcc/arm-linux-gnueabihf-dwp"
+  }
+  tool_path {
+    name: "gcc"
+    path: "linaro_linux_gcc/clang_bin/clang"
+  }
+  tool_path {
+    name: "gcov"
+    path: "arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-gcov-4.9"
+  }
+  tool_path {
+    name: "ld"
+    path: "linaro_linux_gcc/arm-linux-gnueabihf-ld"
+  }
+  tool_path {
+    name: "nm"
+    path: "linaro_linux_gcc/arm-linux-gnueabihf-nm"
+  }
+  tool_path {
+    name: "objcopy"
+    path: "linaro_linux_gcc/arm-linux-gnueabihf-objcopy"
+  }
+  tool_path {
+    name: "objdump"
+    path: "linaro_linux_gcc/arm-linux-gnueabihf-objdump"
+  }
+  tool_path {
+    name: "strip"
+    path: "linaro_linux_gcc/arm-linux-gnueabihf-strip"
+  }
+  supports_gold_linker: false
+  supports_thin_archives: true
+  needsPic: true
+  compiler_flag: "-target"
+  compiler_flag: "armv7a-arm-linux-gnueabif"
+  compiler_flag: "--sysroot=external/linaro_linux_gcc_4_9_repo/arm-linux-gnueabihf/libc"
+  compiler_flag: "-mfloat-abi=hard"
+  compiler_flag: "-mfpu=vfpv3-d16"
+  compiler_flag: "-nostdinc"
+  compiler_flag: "-isystem"
+  compiler_flag: "/usr/lib/clang/3.6/include"
+  compiler_flag: "-isystem"
+  compiler_flag: "external/linaro_linux_gcc_4_9_repo/lib/gcc/arm-linux-gnueabihf/4.9.3/include"
+  compiler_flag: "-isystem"
+  compiler_flag: "external/linaro_linux_gcc_4_9_repo/arm-linux-gnueabihf/libc/usr/include"
+  compiler_flag: "-isystem"
+  compiler_flag: "external/linaro_linux_gcc_4_9_repo/lib/gcc/arm-linux-gnueabihf/4.9.3/include-fixed"
   compiler_flag: "-D__STDC_FORMAT_MACROS"
   compiler_flag: "-D__STDC_CONSTANT_MACROS"
   compiler_flag: "-D__STDC_LIMIT_MACROS"
   compiler_flag: "-D_FILE_OFFSET_BITS=64"
-  # TODO(Brian): Rename this or something.
-  compiler_flag: "-DAOS_ARCHITECTURE_arm_frc"
-
-  #linker_flag: "-fuse-ld=gold"
-
-  # Make C++ compilation deterministic. Use linkstamping instead of these
-  # compiler symbols.
-  unfiltered_cxx_flag: "-Wno-builtin-macro-redefined"
-  unfiltered_cxx_flag: "-D__DATE__=\"redacted\""
-  unfiltered_cxx_flag: "-D__TIMESTAMP__=\"redacted\""
-  unfiltered_cxx_flag: "-D__TIME__=\"redacted\""
-
-  # Security hardening on by default.
-  # Conservative choice; -D_FORTIFY_SOURCE=2 may be unsafe in some cases.
-  # We need to undef it before redefining it as some distributions now have
-  # it enabled by default.
+  compiler_flag: "-DAOS_ARCHITECTURE_armhf"
   compiler_flag: "-U_FORTIFY_SOURCE"
   compiler_flag: "-fstack-protector"
   compiler_flag: "-fPIE"
-  linker_flag: "-Wl,-z,relro,-z,now"
-
-  # Pretty much everything needs this, including parts of the glibc STL...
-  linker_flag: "-lm"
-
-  # Enable coloring even if there's no attached terminal. Bazel removes the
-  # escape sequences if --nocolor is specified.
   compiler_flag: "-fdiagnostics-color=always"
-
   compiler_flag: "-Wall"
   compiler_flag: "-Wextra"
   compiler_flag: "-Wpointer-arith"
@@ -532,103 +652,9 @@
   compiler_flag: "-Wformat=2"
   compiler_flag: "-Werror"
   compiler_flag: "-Wunused-local-typedefs"
-
-  # Keep stack frames for debugging, even in opt mode.
   compiler_flag: "-fno-omit-frame-pointer"
-  compiler_flag: "-D__has_feature(x)=0"
-
-  # Don't use temp files while compiling.
   compiler_flag: "-pipe"
-
-  # Have GCC return the exit code from ld.
-  linker_flag: "-pass-exit-codes"
-
-  # Stamp the binary with a unique identifier.
-  linker_flag: "-Wl,--build-id=md5"
-  linker_flag: "-Wl,--hash-style=gnu"
-  #linker_flag: "-Wl,--warn-execstack"
-  #linker_flag: "-Wl,--detect-odr-violations"
-
-  # Enable debug symbols.
   compiler_flag: "-ggdb3"
-
-  compilation_mode_flags {
-    mode: OPT
-
-    compiler_flag: "-O2"
-
-    # Disable assertions
-    compiler_flag: "-DNDEBUG"
-    compiler_flag: "-D_FORTIFY_SOURCE=1"
-
-    # Removal of unused code and data at link time (can this increase binary size in some cases?).
-    compiler_flag: "-ffunction-sections"
-    compiler_flag: "-fdata-sections"
-    linker_flag: "-Wl,--gc-sections"
-  }
-  feature {
-    name: "pie_for_linking"
-    enabled: true
-    flag_set {
-      action: "c++-link-executable"
-      flag_group {
-        flag: "-pie"
-      }
-    }
-  }
-}
-
-toolchain {
-  abi_version: "clang_3.6"
-  abi_libc_version: "glibc_2.19"
-  builtin_sysroot: ""
-  compiler: "clang"
-  host_system_name: "linux"
-  needsPic: true
-  supports_gold_linker: false
-  supports_incremental_linker: false
-  supports_fission: false
-  supports_interface_shared_objects: false
-  supports_normalizing_ar: true
-  supports_start_end_lib: false
-  supports_thin_archives: true
-  target_libc: "glibc_2.19"
-  target_cpu: "armhf-debian"
-  target_system_name: "arm_a15"
-  toolchain_identifier: "clang_linux_armhf"
-
-  tool_path { name: "ar" path: "linaro_linux_gcc/arm-linux-gnueabihf-ar" }
-  tool_path { name: "compat-ld" path: "linaro_linux_gcc/arm-linux-gnueabihf-ld" }
-  tool_path { name: "cpp" path: "linaro_linux_gcc/clang_bin/clang" }
-  tool_path { name: "dwp" path: "linaro_linux_gcc/arm-linux-gnueabihf-dwp" }
-  tool_path { name: "gcc" path: "linaro_linux_gcc/clang_bin/clang" }
-  tool_path { name: "gcov" path: "arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-gcov-4.9" }
-  # C(++) compiles invoke the compiler (as that is the one knowing where
-  # to find libraries), but we provide LD so other rules can invoke the linker.
-  tool_path { name: "ld" path: "linaro_linux_gcc/arm-linux-gnueabihf-ld" }
-  tool_path { name: "nm" path: "linaro_linux_gcc/arm-linux-gnueabihf-nm" }
-  tool_path { name: "objcopy" path: "linaro_linux_gcc/arm-linux-gnueabihf-objcopy" }
-  objcopy_embed_flag: "-I"
-  objcopy_embed_flag: "binary"
-  tool_path { name: "objdump" path: "linaro_linux_gcc/arm-linux-gnueabihf-objdump" }
-  tool_path { name: "strip" path: "linaro_linux_gcc/arm-linux-gnueabihf-strip" }
-  linking_mode_flags { mode: DYNAMIC }
-
-  compiler_flag: "-target"
-  compiler_flag: "armv7a-arm-linux-gnueabif"
-  compiler_flag: "--sysroot=external/linaro_linux_gcc_4_9_repo/arm-linux-gnueabihf/libc"
-  compiler_flag: "-mfloat-abi=hard"
-  compiler_flag: "-mfpu=vfpv3-d16"
-
-  compiler_flag: "-nostdinc"
-  compiler_flag: "-isystem"
-  compiler_flag: "/usr/lib/clang/3.6/include"
-  compiler_flag: "-isystem"
-  compiler_flag: "external/linaro_linux_gcc_4_9_repo/lib/gcc/arm-linux-gnueabihf/4.9.3/include"
-  compiler_flag: "-isystem"
-  compiler_flag: "external/linaro_linux_gcc_4_9_repo/arm-linux-gnueabihf/libc/usr/include"
-  compiler_flag: "-isystem"
-  compiler_flag: "external/linaro_linux_gcc_4_9_repo/lib/gcc/arm-linux-gnueabihf/4.9.3/include-fixed"
   cxx_flag: "-isystem"
   cxx_flag: "external/linaro_linux_gcc_4_9_repo/arm-linux-gnueabihf/include/c++/4.9.3/arm-linux-gnueabihf"
   cxx_flag: "-isystem"
@@ -637,19 +663,6 @@
   cxx_flag: "external/linaro_linux_gcc_4_9_repo/include/c++/4.9.3/arm-linux-gnueabihf"
   cxx_flag: "-isystem"
   cxx_flag: "external/linaro_linux_gcc_4_9_repo/include/c++/4.9.3"
-
-  cxx_builtin_include_directory: "%package(@linaro_linux_gcc_4_9_repo//include)%"
-  cxx_builtin_include_directory: "%package(@linaro_linux_gcc_4_9_repo//arm-linux-gnueabihf/libc/usr/include)%"
-  cxx_builtin_include_directory: "%package(@linaro_linux_gcc_4_9_repo//arm-linux-gnueabihf/libc/usr/lib/include)%"
-  cxx_builtin_include_directory: "%package(@linaro_linux_gcc_4_9_repo//arm-linux-gnueabihf/libc/lib/gcc/arm-linux-gnueabihf/4.9.3/include-fixed)%"
-  cxx_builtin_include_directory: "%package(@linaro_linux_gcc_4_9_repo//include)%/c++/4.9.3"
-  cxx_builtin_include_directory: "%package(@linaro_linux_gcc_4_9_repo//arm-linux-gnueabihf/libc/lib/gcc/arm-linux-gnueabihf/4.9.3/include)%"
-  cxx_builtin_include_directory: "%package(@linaro_linux_gcc_4_9_repo//arm-linux-gnueabihf/libc/lib/gcc/arm-linux-gnueabihf/4.9.3/include-fixed)%"
-  cxx_builtin_include_directory: "%package(@linaro_linux_gcc_4_9_repo//lib/gcc/arm-linux-gnueabihf/4.9.3/include)%"
-  cxx_builtin_include_directory: "%package(@linaro_linux_gcc_4_9_repo//lib/gcc/arm-linux-gnueabihf/4.9.3/include-fixed)%"
-  cxx_builtin_include_directory: "%package(@linaro_linux_gcc_4_9_repo//arm-linux-gnueabihf/include)%/c++/4.9.3"
-  cxx_builtin_include_directory: '/usr/lib/clang/3.6/include'
-
   linker_flag: "-target"
   linker_flag: "armv7a-arm-linux-gnueabif"
   linker_flag: "--sysroot=external/linaro_linux_gcc_4_9_repo/arm-linux-gnueabihf/libc"
@@ -660,10 +673,49 @@
   linker_flag: "-Lexternal/linaro_linux_gcc_4_9_repo/arm-linux-gnueabihf/libc/usr/lib"
   linker_flag: "-Bexternal/linaro_linux_gcc_4_9_repo/arm-linux-gnueabihf/bin"
   linker_flag: "-Wl,--dynamic-linker=/lib/ld-linux-armhf.so.3"
-
+  linker_flag: "-no-canonical-prefixes"
+  linker_flag: "-Wl,-z,relro,-z,now"
+  linker_flag: "-lm"
+  linker_flag: "-Wl,--build-id=md5"
+  linker_flag: "-Wl,--hash-style=gnu"
+  objcopy_embed_flag: "-I"
+  objcopy_embed_flag: "binary"
+  compilation_mode_flags {
+    mode: OPT
+    compiler_flag: "-O2"
+    compiler_flag: "-DNDEBUG"
+    compiler_flag: "-D_FORTIFY_SOURCE=1"
+    compiler_flag: "-ffunction-sections"
+    compiler_flag: "-fdata-sections"
+    linker_flag: "-Wl,--gc-sections"
+  }
+  linking_mode_flags {
+    mode: DYNAMIC
+  }
+  cxx_builtin_include_directory: "%package(@linaro_linux_gcc_4_9_repo//include)%"
+  cxx_builtin_include_directory: "%package(@linaro_linux_gcc_4_9_repo//arm-linux-gnueabihf/libc/usr/include)%"
+  cxx_builtin_include_directory: "%package(@linaro_linux_gcc_4_9_repo//arm-linux-gnueabihf/libc/usr/lib/include)%"
+  cxx_builtin_include_directory: "%package(@linaro_linux_gcc_4_9_repo//arm-linux-gnueabihf/libc/lib/gcc/arm-linux-gnueabihf/4.9.3/include-fixed)%"
+  cxx_builtin_include_directory: "%package(@linaro_linux_gcc_4_9_repo//include)%/c++/4.9.3"
+  cxx_builtin_include_directory: "%package(@linaro_linux_gcc_4_9_repo//arm-linux-gnueabihf/libc/lib/gcc/arm-linux-gnueabihf/4.9.3/include)%"
+  cxx_builtin_include_directory: "%package(@linaro_linux_gcc_4_9_repo//arm-linux-gnueabihf/libc/lib/gcc/arm-linux-gnueabihf/4.9.3/include-fixed)%"
+  cxx_builtin_include_directory: "%package(@linaro_linux_gcc_4_9_repo//lib/gcc/arm-linux-gnueabihf/4.9.3/include)%"
+  cxx_builtin_include_directory: "%package(@linaro_linux_gcc_4_9_repo//lib/gcc/arm-linux-gnueabihf/4.9.3/include-fixed)%"
+  cxx_builtin_include_directory: "%package(@linaro_linux_gcc_4_9_repo//arm-linux-gnueabihf/include)%/c++/4.9.3"
+  cxx_builtin_include_directory: "/usr/lib/clang/3.6/include"
+  builtin_sysroot: ""
+  unfiltered_cxx_flag: "-no-canonical-prefixes"
+  unfiltered_cxx_flag: "-Wno-builtin-macro-redefined"
+  unfiltered_cxx_flag: "-D__DATE__=\"redacted\""
+  unfiltered_cxx_flag: "-D__TIMESTAMP__=\"redacted\""
+  unfiltered_cxx_flag: "-D__TIME__=\"redacted\""
+  supports_normalizing_ar: true
+  supports_start_end_lib: false
+  supports_interface_shared_objects: false
+  supports_incremental_linker: false
+  supports_fission: false
   feature {
     name: "opt"
-    implies: "all_modes"
     flag_set {
       action: "preprocess-assemble"
       action: "c-compile"
@@ -675,11 +727,10 @@
         flag: "-DAOS_DEBUG=0"
       }
     }
+    implies: "all_modes"
   }
-
   feature {
     name: "dbg"
-    implies: "all_modes"
     flag_set {
       action: "preprocess-assemble"
       action: "c-compile"
@@ -694,11 +745,10 @@
         flag: "-fno-omit-frame-pointer"
       }
     }
+    implies: "all_modes"
   }
-
   feature {
     name: "fastbuild"
-    implies: "all_modes"
     flag_set {
       action: "preprocess-assemble"
       action: "c-compile"
@@ -710,8 +760,8 @@
         flag: "-DAOS_DEBUG=0"
       }
     }
+    implies: "all_modes"
   }
-
   feature {
     name: "all_modes"
     flag_set {
@@ -741,150 +791,152 @@
       action: "c++-module-compile"
       action: "c-compile"
       flag_group {
-        # We always want to compile with -pthread semantics.
         flag: "-pthread"
       }
     }
   }
-
-  # Anticipated future default.
-  # This makes GCC and Clang do what we want when called through symlinks.
-  unfiltered_cxx_flag: "-no-canonical-prefixes"
-  linker_flag: "-no-canonical-prefixes"
-
-  # Things that the code wants defined.
-  compiler_flag: "-D__STDC_FORMAT_MACROS"
-  compiler_flag: "-D__STDC_CONSTANT_MACROS"
-  compiler_flag: "-D__STDC_LIMIT_MACROS"
-  compiler_flag: "-D_FILE_OFFSET_BITS=64"
-  # TODO(Brian): Rename this or something.
-  compiler_flag: "-DAOS_ARCHITECTURE_armhf"
-
-  # Make C++ compilation deterministic. Use linkstamping instead of these
-  # compiler symbols.
-  unfiltered_cxx_flag: "-Wno-builtin-macro-redefined"
-  unfiltered_cxx_flag: "-D__DATE__=\"redacted\""
-  unfiltered_cxx_flag: "-D__TIMESTAMP__=\"redacted\""
-  unfiltered_cxx_flag: "-D__TIME__=\"redacted\""
-
-  # Security hardening on by default.
-  # Conservative choice; -D_FORTIFY_SOURCE=2 may be unsafe in some cases.
-  # We need to undef it before redefining it as some distributions now have
-  # it enabled by default.
-  compiler_flag: "-U_FORTIFY_SOURCE"
-  compiler_flag: "-fstack-protector"
-  compiler_flag: "-fPIE"
-  linker_flag: "-Wl,-z,relro,-z,now"
-
-  # Pretty much everything needs this, including parts of the glibc STL...
-  linker_flag: "-lm"
-
-  # Enable coloring even if there's no attached terminal. Bazel removes the
-  # escape sequences if --nocolor is specified.
-  compiler_flag: "-fdiagnostics-color=always"
-
-  compiler_flag: "-Wall"
-  compiler_flag: "-Wextra"
-  compiler_flag: "-Wpointer-arith"
-  compiler_flag: "-Wstrict-aliasing"
-  compiler_flag: "-Wcast-qual"
-  compiler_flag: "-Wcast-align"
-  compiler_flag: "-Wwrite-strings"
-  compiler_flag: "-Wtype-limits"
-  compiler_flag: "-Wsign-compare"
-  compiler_flag: "-Wformat=2"
-  compiler_flag: "-Werror"
-  compiler_flag: "-Wunused-local-typedefs"
-
-  # Keep stack frames for debugging, even in opt mode.
-  compiler_flag: "-fno-omit-frame-pointer"
-
-  # Don't use temp files while compiling.
-  compiler_flag: "-pipe"
-
-  # Stamp the binary with a unique identifier.
-  linker_flag: "-Wl,--build-id=md5"
-  linker_flag: "-Wl,--hash-style=gnu"
-  #linker_flag: "-Wl,--warn-execstack"
-  #linker_flag: "-Wl,--detect-odr-violations"
-
-  # Enable debug symbols.
-  compiler_flag: "-ggdb3"
-
-  compilation_mode_flags {
-    mode: OPT
-
-    compiler_flag: "-O2"
-
-    # Disable assertions
-    compiler_flag: "-DNDEBUG"
-    compiler_flag: "-D_FORTIFY_SOURCE=1"
-
-    # Removal of unused code and data at link time (can this increase binary size in some cases?).
-    compiler_flag: "-ffunction-sections"
-    compiler_flag: "-fdata-sections"
-    linker_flag: "-Wl,--gc-sections"
-  }
   feature {
     name: "pie_for_linking"
-    enabled: true
     flag_set {
       action: "c++-link-executable"
       flag_group {
         flag: "-pie"
       }
     }
+    enabled: true
   }
 }
-
 toolchain {
+  toolchain_identifier: "cortex-m4f"
+  host_system_name: "local"
+  target_system_name: "cortex-m4f"
+  target_cpu: "cortex-m4f"
+  target_libc: "cortex-m4f"
+  compiler: "gcc"
   abi_version: "cortex-m4f"
   abi_libc_version: "cortex-m4f"
-  builtin_sysroot: ""
-  compiler: "gcc"
-  host_system_name: "local"
-  needsPic: false
+  tool_path {
+    name: "ar"
+    path: "/usr/bin/arm-none-eabi-ar"
+  }
+  tool_path {
+    name: "compat-ld"
+    path: "/usr/bin/arm-none-eabi-ld"
+  }
+  tool_path {
+    name: "cpp"
+    path: "/usr/bin/arm-none-eabi-cpp"
+  }
+  tool_path {
+    name: "dwp"
+    path: "/usr/bin/arm-none-eabi-dwp"
+  }
+  tool_path {
+    name: "gcc"
+    path: "/usr/bin/arm-none-eabi-gcc"
+  }
+  tool_path {
+    name: "gcov"
+    path: "/usr/bin/arm-none-eabi-gcov"
+  }
+  tool_path {
+    name: "ld"
+    path: "/usr/bin/arm-none-eabi-ld"
+  }
+  tool_path {
+    name: "nm"
+    path: "/usr/bin/arm-none-eabi-nm"
+  }
+  tool_path {
+    name: "objcopy"
+    path: "/usr/bin/arm-none-eabi-objcopy"
+  }
+  tool_path {
+    name: "objdump"
+    path: "/usr/bin/arm-none-eabi-objdump"
+  }
+  tool_path {
+    name: "strip"
+    path: "/usr/bin/arm-none-eabi-strip"
+  }
   supports_gold_linker: false
-  supports_incremental_linker: false
-  supports_fission: false
-  supports_interface_shared_objects: false
-  supports_normalizing_ar: false
-  supports_start_end_lib: false
   supports_thin_archives: false
-  target_libc: "cortex-m4f"
-  target_cpu: "cortex-m4f"
-  target_system_name: "cortex-m4f"
-  toolchain_identifier: "cortex-m4f"
-
-  tool_path { name: "ar" path: "/usr/bin/arm-none-eabi-ar" }
-  tool_path { name: "compat-ld" path: "/usr/bin/arm-none-eabi-ld" }
-  tool_path { name: "cpp" path: "/usr/bin/arm-none-eabi-cpp" }
-  tool_path { name: "dwp" path: "/usr/bin/arm-none-eabi-dwp" }
-  tool_path { name: "gcc" path: "/usr/bin/arm-none-eabi-gcc" }
-  tool_path { name: "gcov" path: "/usr/bin/arm-none-eabi-gcov" }
-  # C(++) compiles invoke the compiler (as that is the one knowing where
-  # to find libraries), but we provide LD so other rules can invoke the linker.
-  tool_path { name: "ld" path: "/usr/bin/arm-none-eabi-ld" }
-  tool_path { name: "nm" path: "/usr/bin/arm-none-eabi-nm" }
-  tool_path { name: "objcopy" path: "/usr/bin/arm-none-eabi-objcopy" }
+  needsPic: false
+  compiler_flag: "-D__STDC_FORMAT_MACROS"
+  compiler_flag: "-D__STDC_CONSTANT_MACROS"
+  compiler_flag: "-D__STDC_LIMIT_MACROS"
+  compiler_flag: "-D__MK64FX512__"
+  compiler_flag: "-DF_CPU=120000000"
+  compiler_flag: "-Wl,--gc-sections"
+  compiler_flag: "-D__have_long32"
+  compiler_flag: "-fstack-protector"
+  compiler_flag: "-mcpu=cortex-m4"
+  compiler_flag: "-mfpu=fpv4-sp-d16"
+  compiler_flag: "-mthumb"
+  compiler_flag: "-mfloat-abi=hard"
+  compiler_flag: "-fno-strict-aliasing"
+  compiler_flag: "-fmessage-length=80"
+  compiler_flag: "-fmax-errors=20"
+  compiler_flag: "-Wall"
+  compiler_flag: "-Wextra"
+  compiler_flag: "-Wpointer-arith"
+  compiler_flag: "-Wcast-qual"
+  compiler_flag: "-Wwrite-strings"
+  compiler_flag: "-Wtype-limits"
+  compiler_flag: "-Wsign-compare"
+  compiler_flag: "-Wformat=2"
+  compiler_flag: "-Werror"
+  compiler_flag: "-Wstrict-aliasing=2"
+  compiler_flag: "-Wdouble-promotion"
+  compiler_flag: "-pipe"
+  compiler_flag: "-g"
+  compiler_flag: "-fno-common"
+  compiler_flag: "-ffreestanding"
+  compiler_flag: "-fbuiltin"
+  linker_flag: "-no-canonical-prefixes"
+  linker_flag: "-mcpu=cortex-m4"
+  linker_flag: "-mfpu=fpv4-sp-d16"
+  linker_flag: "-mthumb"
+  linker_flag: "-mfloat-abi=hard"
+  linker_flag: "-fno-strict-aliasing"
+  linker_flag: "--specs=nano.specs"
+  linker_flag: "-lgcc"
+  linker_flag: "-lstdc++"
+  linker_flag: "-lm"
+  linker_flag: "-lc"
+  linker_flag: "-Tmotors/core/mk64fx512.ld"
   objcopy_embed_flag: "-I"
   objcopy_embed_flag: "binary"
-  tool_path { name: "objdump" path: "/usr/bin/arm-none-eabi-objdump" }
-  tool_path { name: "strip" path: "/usr/bin/arm-none-eabi-strip" }
-  linking_mode_flags { mode: FULLY_STATIC }
-
-  # TODO(bazel-team): In theory, the path here ought to exactly match the path
-  # used by gcc. That works because bazel currently doesn't track files at
-  # absolute locations and has no remote execution, yet. However, this will need
-  # to be fixed, maybe with auto-detection?
-  cxx_builtin_include_directory: '/usr/lib/gcc/arm-none-eabi/4.8/include'
-  cxx_builtin_include_directory: '/usr/lib/gcc/arm-none-eabi/4.8/include-fixed'
-  cxx_builtin_include_directory: '/usr/lib/arm-none-eabi/include'
-  cxx_builtin_include_directory: '/usr/include/newlib',
-
+  compilation_mode_flags {
+    mode: OPT
+    compiler_flag: "-O2"
+    compiler_flag: "-finline-functions"
+    compiler_flag: "-ffast-math"
+    compiler_flag: "-funroll-loops"
+    compiler_flag: "-DNDEBUG"
+    compiler_flag: "-ffunction-sections"
+    linker_flag: "-Wl,--gc-sections"
+  }
+  linking_mode_flags {
+    mode: FULLY_STATIC
+  }
+  cxx_builtin_include_directory: "/usr/lib/gcc/arm-none-eabi/4.8/include"
+  cxx_builtin_include_directory: "/usr/lib/gcc/arm-none-eabi/4.8/include-fixed"
+  cxx_builtin_include_directory: "/usr/lib/arm-none-eabi/include"
+  cxx_builtin_include_directory: "/usr/include/newlib"
+  builtin_sysroot: ""
+  unfiltered_cxx_flag: "-no-canonical-prefixes"
+  unfiltered_cxx_flag: "-Wno-builtin-macro-redefined"
+  unfiltered_cxx_flag: "-D__DATE__=\"redacted\""
+  unfiltered_cxx_flag: "-D__TIMESTAMP__=\"redacted\""
+  unfiltered_cxx_flag: "-D__TIME__=\"redacted\""
+  supports_normalizing_ar: false
+  supports_start_end_lib: false
+  supports_interface_shared_objects: false
+  supports_incremental_linker: false
+  supports_fission: false
   feature {
     name: "dbg"
-    implies: "all_modes"
     flag_set {
       action: "preprocess-assemble"
       action: "c-compile"
@@ -896,8 +948,8 @@
         flag: "-fno-omit-frame-pointer"
       }
     }
+    implies: "all_modes"
   }
-
   feature {
     name: "opt"
     implies: "all_modes"
@@ -906,7 +958,6 @@
     name: "fastbuild"
     implies: "all_modes"
   }
-
   feature {
     name: "all_modes"
     flag_set {
@@ -929,145 +980,28 @@
       }
     }
   }
-
-  # Anticipated future default.
-  # This makes GCC and Clang do what we want when called through symlinks.
-  unfiltered_cxx_flag: "-no-canonical-prefixes"
-  linker_flag: "-no-canonical-prefixes"
-
-  # Things that the code wants defined.
-  compiler_flag: "-D__STDC_FORMAT_MACROS"
-  compiler_flag: "-D__STDC_CONSTANT_MACROS"
-  compiler_flag: "-D__STDC_LIMIT_MACROS"
-
-  # Some identifiers for what MCU we're using.
-  compiler_flag: "-D__MK64FX512__"
-  compiler_flag: "-DF_CPU=120000000"
-
-  compiler_flag: "-Wl,--gc-sections"
-
-  # Newlib's stdint.h does this, but GCC's freestanding stdint.h doesn't use
-  # newlib's so we have to do it manually...
-  compiler_flag: "-D__have_long32"
-
-  # Make C++ compilation deterministic. Use linkstamping instead of these
-  # compiler symbols.
-  unfiltered_cxx_flag: "-Wno-builtin-macro-redefined"
-  unfiltered_cxx_flag: "-D__DATE__=\"redacted\""
-  unfiltered_cxx_flag: "-D__TIMESTAMP__=\"redacted\""
-  unfiltered_cxx_flag: "-D__TIME__=\"redacted\""
-
-  # Security hardening on by default.
-  # Conservative choice; -D_FORTIFY_SOURCE=2 may be unsafe in some cases.
-  # We need to undef it before redefining it as some distributions now have
-  # it enabled by default.
-  compiler_flag: "-fstack-protector"
-  compiler_flag: "-mcpu=cortex-m4"
-  compiler_flag: "-mfpu=fpv4-sp-d16"
-  compiler_flag: "-mthumb"
-  compiler_flag: "-mfloat-abi=hard"
-  compiler_flag: "-fno-strict-aliasing"
-  linker_flag: "-mcpu=cortex-m4"
-  linker_flag: "-mfpu=fpv4-sp-d16"
-  linker_flag: "-mthumb"
-  linker_flag: "-mfloat-abi=hard"
-  linker_flag: "-fno-strict-aliasing"
-  linker_flag: "--specs=nano.specs"
-
-  # Pretty much everything needs this, including parts of the glibc STL...
-  linker_flag: "-lgcc"
-  linker_flag: "-lstdc++"
-  linker_flag: "-lm"
-  linker_flag: "-lc"
-  linker_flag: "-Tmotors/core/mk64fx512.ld"
-
-  compiler_flag: "-fmessage-length=80"
-  compiler_flag: "-fmax-errors=20"
-
-  compiler_flag: "-Wall"
-  compiler_flag: "-Wextra"
-  compiler_flag: "-Wpointer-arith"
-  compiler_flag: "-Wcast-qual"
-  compiler_flag: "-Wwrite-strings"
-  compiler_flag: "-Wtype-limits"
-  compiler_flag: "-Wsign-compare"
-  compiler_flag: "-Wformat=2"
-  compiler_flag: "-Werror"
-  compiler_flag: "-Wstrict-aliasing=2"
-
-  # Be annoying about using doubles places we probably didn't mean to, because
-  # the FPU only does single-precision.
-  compiler_flag: "-Wdouble-promotion"
-
-  # Don't use temp files while compiling.
-  compiler_flag: "-pipe"
-
-  # Stamp the binary with a unique identifier.
-  # TODO(austin): Put these back in.
-  #linker_flag: "-Wl,--build-id=md5"
-  #linker_flag: "-Wl,--hash-style=gnu"
-
-  # Enable debug symbols.
-  compiler_flag: "-g"
-
-  # Common symbols are weird and not what we want, so just give multiple
-  # declaration errors instead.
-  compiler_flag: "-fno-common"
-
-  # We're not a hosted environment (no file IO, main is called from our code,
-  # etc).
-  compiler_flag: "-ffreestanding"
-  # However, we still want to optimize things like memcpy.
-  compiler_flag: "-fbuiltin"
-
-  compilation_mode_flags {
-    mode: OPT
-
-    # Freescale recommends this combination for reducing cycle count.
-    # http://www.nxp.com/assets/documents/data/en/application-notes/AN4808.pdf
-    compiler_flag: "-O2"
-    compiler_flag: "-finline-functions"
-
-    # This is definitely worth it for us. It makes the FPU a lot more useful,
-    # especially with complex arithmetic, which matters a lot.
-    compiler_flag: "-ffast-math"
-
-    # It seems like this is a good idea, at least for the number crunching code.
-    # Might want to look into moving it to copts on specific rules if the code
-    # size increase becomes a problem.
-    compiler_flag: "-funroll-loops"
-
-    # Disable assertions
-    compiler_flag: "-DNDEBUG"
-
-    # Removal of unused code and data at link time (can this increase binary size in some cases?).
-    compiler_flag: "-ffunction-sections"
-    #compiler_flag: "-fdata-sections"
-    linker_flag: "-Wl,--gc-sections"
-  }
-
   feature {
-    name: 'include_paths'
+    name: "include_paths"
     flag_set {
-      action: 'preprocess-assemble'
-      action: 'c-compile'
-      action: 'c++-compile'
-      action: 'c++-header-parsing'
-      action: 'c++-header-preprocessing'
-      action: 'c++-module-compile'
+      action: "preprocess-assemble"
+      action: "c-compile"
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-header-preprocessing"
+      action: "c++-module-compile"
       flag_group {
-        iterate_over: 'quote_include_paths'
-        flag: '-iquote'
-        flag: '%{quote_include_paths}'
+        flag: "-iquote"
+        flag: "%{quote_include_paths}"
+        iterate_over: "quote_include_paths"
       }
       flag_group {
-        iterate_over: 'include_paths'
-        flag: '-I%{include_paths}'
+        flag: "-I%{include_paths}"
+        iterate_over: "include_paths"
       }
       flag_group {
-        iterate_over: 'system_include_paths'
-        flag: '-I'
-        flag: '%{system_include_paths}'
+        flag: "-I"
+        flag: "%{system_include_paths}"
+        iterate_over: "system_include_paths"
       }
     }
   }
diff --git a/tools/cpp/cortex_m4f_crosstool.pb b/tools/cpp/cortex_m4f_crosstool.pb
new file mode 100644
index 0000000..ec02440
--- /dev/null
+++ b/tools/cpp/cortex_m4f_crosstool.pb
@@ -0,0 +1,235 @@
+toolchain {
+  abi_version: "%NAME%"
+  abi_libc_version: "%NAME%"
+  builtin_sysroot: ""
+  compiler: "gcc"
+  host_system_name: "local"
+  needsPic: false
+  supports_gold_linker: false
+  supports_incremental_linker: false
+  supports_fission: false
+  supports_interface_shared_objects: false
+  supports_normalizing_ar: false
+  supports_start_end_lib: false
+  supports_thin_archives: false
+  target_libc: "%NAME%"
+  target_cpu: "%NAME%"
+  target_system_name: "%NAME%"
+  toolchain_identifier: "%NAME%"
+
+  tool_path { name: "ar" path: "/usr/bin/arm-none-eabi-ar" }
+  tool_path { name: "compat-ld" path: "/usr/bin/arm-none-eabi-ld" }
+  tool_path { name: "cpp" path: "/usr/bin/arm-none-eabi-cpp" }
+  tool_path { name: "dwp" path: "/usr/bin/arm-none-eabi-dwp" }
+  tool_path { name: "gcc" path: "/usr/bin/arm-none-eabi-gcc" }
+  tool_path { name: "gcov" path: "/usr/bin/arm-none-eabi-gcov" }
+  # C(++) compiles invoke the compiler (as that is the one knowing where
+  # to find libraries), but we provide LD so other rules can invoke the linker.
+  tool_path { name: "ld" path: "/usr/bin/arm-none-eabi-ld" }
+  tool_path { name: "nm" path: "/usr/bin/arm-none-eabi-nm" }
+  tool_path { name: "objcopy" path: "/usr/bin/arm-none-eabi-objcopy" }
+  objcopy_embed_flag: "-I"
+  objcopy_embed_flag: "binary"
+  tool_path { name: "objdump" path: "/usr/bin/arm-none-eabi-objdump" }
+  tool_path { name: "strip" path: "/usr/bin/arm-none-eabi-strip" }
+  linking_mode_flags { mode: FULLY_STATIC }
+
+  # TODO(bazel-team): In theory, the path here ought to exactly match the path
+  # used by gcc. That works because bazel currently doesn't track files at
+  # absolute locations and has no remote execution, yet. However, this will need
+  # to be fixed, maybe with auto-detection?
+  cxx_builtin_include_directory: '/usr/lib/gcc/arm-none-eabi/4.8/include'
+  cxx_builtin_include_directory: '/usr/lib/gcc/arm-none-eabi/4.8/include-fixed'
+  cxx_builtin_include_directory: '/usr/lib/arm-none-eabi/include'
+  cxx_builtin_include_directory: '/usr/include/newlib',
+
+  feature {
+    name: "dbg"
+    implies: "all_modes"
+    flag_set {
+      action: "preprocess-assemble"
+      action: "c-compile"
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-header-preprocessing"
+      action: "c++-module-compile"
+      flag_group {
+        flag: "-fno-omit-frame-pointer"
+      }
+    }
+  }
+
+  feature {
+    name: "opt"
+    implies: "all_modes"
+  }
+  feature {
+    name: "fastbuild"
+    implies: "all_modes"
+  }
+
+  feature {
+    name: "all_modes"
+    flag_set {
+      action: "preprocess-assemble"
+      action: "assemble"
+      action: "c-compile"
+      flag_group {
+        flag: "--std=gnu99"
+      }
+    }
+    flag_set {
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-header-preprocessing"
+      action: "c++-module-compile"
+      flag_group {
+        flag: "--std=gnu++11"
+        flag: "-fno-exceptions"
+        flag: "-fno-rtti"
+      }
+    }
+  }
+
+  # Anticipated future default.
+  # This makes GCC and Clang do what we want when called through symlinks.
+  unfiltered_cxx_flag: "-no-canonical-prefixes"
+  linker_flag: "-no-canonical-prefixes"
+
+  # Things that the code wants defined.
+  compiler_flag: "-D__STDC_FORMAT_MACROS"
+  compiler_flag: "-D__STDC_CONSTANT_MACROS"
+  compiler_flag: "-D__STDC_LIMIT_MACROS"
+
+  # Some identifiers for what MCU we're using.
+  compiler_flag: "-D%CPU%"
+  compiler_flag: "-DF_CPU=%F_CPU%"
+
+  compiler_flag: "-Wl,--gc-sections"
+
+  # Newlib's stdint.h does this, but GCC's freestanding stdint.h doesn't use
+  # newlib's so we have to do it manually...
+  compiler_flag: "-D__have_long32"
+
+  # Make C++ compilation deterministic. Use linkstamping instead of these
+  # compiler symbols.
+  unfiltered_cxx_flag: "-Wno-builtin-macro-redefined"
+  unfiltered_cxx_flag: "-D__DATE__=\"redacted\""
+  unfiltered_cxx_flag: "-D__TIMESTAMP__=\"redacted\""
+  unfiltered_cxx_flag: "-D__TIME__=\"redacted\""
+
+  # Security hardening on by default.
+  # Conservative choice; -D_FORTIFY_SOURCE=2 may be unsafe in some cases.
+  # We need to undef it before redefining it as some distributions now have
+  # it enabled by default.
+  compiler_flag: "-fstack-protector"
+  compiler_flag: "-mcpu=cortex-m4"
+  compiler_flag: "-mfpu=fpv4-sp-d16"
+  compiler_flag: "-mthumb"
+  compiler_flag: "-mfloat-abi=hard"
+  compiler_flag: "-fno-strict-aliasing"
+  linker_flag: "-mcpu=cortex-m4"
+  linker_flag: "-mfpu=fpv4-sp-d16"
+  linker_flag: "-mthumb"
+  linker_flag: "-mfloat-abi=hard"
+  linker_flag: "-fno-strict-aliasing"
+  linker_flag: "--specs=nano.specs"
+
+  # Pretty much everything needs this, including parts of the glibc STL...
+  linker_flag: "-lgcc"
+  linker_flag: "-lstdc++"
+  linker_flag: "-lm"
+  linker_flag: "-lc"
+  linker_flag: "-Tmotors/core/mk64fx512.ld"
+
+  compiler_flag: "-fmessage-length=80"
+  compiler_flag: "-fmax-errors=20"
+
+  compiler_flag: "-Wall"
+  compiler_flag: "-Wextra"
+  compiler_flag: "-Wpointer-arith"
+  compiler_flag: "-Wcast-qual"
+  compiler_flag: "-Wwrite-strings"
+  compiler_flag: "-Wtype-limits"
+  compiler_flag: "-Wsign-compare"
+  compiler_flag: "-Wformat=2"
+  compiler_flag: "-Werror"
+  compiler_flag: "-Wstrict-aliasing=2"
+
+  # Be annoying about using doubles places we probably didn't mean to, because
+  # the FPU only does single-precision.
+  compiler_flag: "-Wdouble-promotion"
+
+  # Don't use temp files while compiling.
+  compiler_flag: "-pipe"
+
+  # Stamp the binary with a unique identifier.
+  # TODO(austin): Put these back in.
+  #linker_flag: "-Wl,--build-id=md5"
+  #linker_flag: "-Wl,--hash-style=gnu"
+
+  # Enable debug symbols.
+  compiler_flag: "-g"
+
+  # Common symbols are weird and not what we want, so just give multiple
+  # declaration errors instead.
+  compiler_flag: "-fno-common"
+
+  # We're not a hosted environment (no file IO, main is called from our code,
+  # etc).
+  compiler_flag: "-ffreestanding"
+  # However, we still want to optimize things like memcpy.
+  compiler_flag: "-fbuiltin"
+
+  compilation_mode_flags {
+    mode: OPT
+
+    # Freescale recommends this combination for reducing cycle count.
+    # http://www.nxp.com/assets/documents/data/en/application-notes/AN4808.pdf
+    compiler_flag: "-O2"
+    compiler_flag: "-finline-functions"
+
+    # This is definitely worth it for us. It makes the FPU a lot more useful,
+    # especially with complex arithmetic, which matters a lot.
+    compiler_flag: "-ffast-math"
+
+    # It seems like this is a good idea, at least for the number crunching code.
+    # Might want to look into moving it to copts on specific rules if the code
+    # size increase becomes a problem.
+    compiler_flag: "-funroll-loops"
+
+    # Disable assertions
+    compiler_flag: "-DNDEBUG"
+
+    # Removal of unused code and data at link time (can this increase binary size in some cases?).
+    compiler_flag: "-ffunction-sections"
+    #compiler_flag: "-fdata-sections"
+    linker_flag: "-Wl,--gc-sections"
+  }
+
+  feature {
+    name: 'include_paths'
+    flag_set {
+      action: 'preprocess-assemble'
+      action: 'c-compile'
+      action: 'c++-compile'
+      action: 'c++-header-parsing'
+      action: 'c++-header-preprocessing'
+      action: 'c++-module-compile'
+      flag_group {
+        iterate_over: 'quote_include_paths'
+        flag: '-iquote'
+        flag: '%{quote_include_paths}'
+      }
+      flag_group {
+        iterate_over: 'include_paths'
+        flag: '-I%{include_paths}'
+      }
+      flag_group {
+        iterate_over: 'system_include_paths'
+        flag: '-I'
+        flag: '%{system_include_paths}'
+      }
+    }
+  }
+}
diff --git a/tools/cpp/gen_crosstool.py b/tools/cpp/gen_crosstool.py
new file mode 100644
index 0000000..af28c56
--- /dev/null
+++ b/tools/cpp/gen_crosstool.py
@@ -0,0 +1,58 @@
+#!/usr/bin/python3
+
+# Usage: gen_crosstool <base> <cortex_m4f> <output>
+# Example: bazel run //tools/cpp:gen_crosstool $(readlink -f tools/cpp/static_crosstool.pb) $(readlink -f tools/cpp/cortex_m4f_crosstool.pb) $(readlink -f tools/cpp/CROSSTOOL)
+
+import sys
+
+from third_party.bazel.protos import crosstool_config_pb2
+from google.protobuf import text_format
+from google.protobuf.descriptor import FieldDescriptor
+
+def process_string(string, substitutions):
+  for a, b in substitutions.items():
+    string = string.replace(a, b)
+  return string
+
+def rename_message_contents(proto, substitutions):
+  for descriptor, value in proto.ListFields():
+    if descriptor.type == FieldDescriptor.TYPE_STRING:
+      if descriptor.label == FieldDescriptor.LABEL_REPEATED:
+        new_value = []
+        for string in value:
+          new_value.append(process_string(string, substitutions))
+        value[:] = new_value
+      else:
+        setattr(proto, descriptor.name, process_string(value, substitutions))
+    if descriptor.type == FieldDescriptor.TYPE_MESSAGE:
+      if descriptor.label == FieldDescriptor.LABEL_REPEATED:
+        for sub_proto in value:
+          rename_message_contents(sub_proto, substitutions)
+      else:
+        rename_message_contents(value, substitutions)
+
+def add_m4f_toolchain(new_toolchain, m4f_proto, substitutions):
+  new_toolchain.CopyFrom(m4f_proto.toolchain[0])
+  rename_message_contents(new_toolchain, substitutions)
+
+def main(args):
+  crosstool_proto = crosstool_config_pb2.CrosstoolRelease()
+  with open(args[0], 'r') as f:
+    text_format.Merge(f.read(), crosstool_proto)
+
+  m4f_proto = crosstool_config_pb2.CrosstoolRelease()
+  with open(args[1], 'r') as f:
+    text_format.Merge(f.read(), m4f_proto)
+  add_m4f_toolchain(crosstool_proto.toolchain.add(), m4f_proto, {
+      '%NAME%': 'cortex-m4f',
+      '%CPU%': '__MK64FX512__',
+      '%F_CPU%': '120000000',
+      })
+
+  with open(args[2], 'w') as f:
+    f.write('# GENERATED FILE. DO NOT EDIT\n')
+    f.write('# Generated by tools/cpp/gen_crosstool.py\n')
+    f.write(text_format.MessageToString(crosstool_proto))
+
+if __name__ == '__main__':
+  sys.exit(main(sys.argv[1:]))
diff --git a/tools/cpp/static_crosstool.pb b/tools/cpp/static_crosstool.pb
new file mode 100644
index 0000000..99a36f9
--- /dev/null
+++ b/tools/cpp/static_crosstool.pb
@@ -0,0 +1,838 @@
+major_version: "local"
+minor_version: ""
+default_target_cpu: "same_as_host"
+
+default_toolchain {
+  cpu: "roborio"
+  toolchain_identifier: "roborio_linux"
+}
+
+default_toolchain {
+  cpu: "k8"
+  toolchain_identifier: "k8_linux"
+}
+
+default_toolchain {
+  cpu: "armeabi-v7a"
+  toolchain_identifier: "stub_armeabi-v7a"
+}
+
+default_toolchain {
+  cpu: "armhf-debian"
+  toolchain_identifier: "clang_linux_armhf"
+}
+
+default_toolchain {
+  cpu: "cortex-m4f"
+  toolchain_identifier: "cortex-m4f"
+}
+
+toolchain {
+  abi_version: "armeabi-v7a"
+  abi_libc_version: "armeabi-v7a"
+  builtin_sysroot: ""
+  compiler: "compiler"
+  host_system_name: "armeabi-v7a"
+  needsPic: true
+  supports_gold_linker: false
+  supports_incremental_linker: false
+  supports_fission: false
+  supports_interface_shared_objects: false
+  supports_normalizing_ar: false
+  supports_start_end_lib: false
+  supports_thin_archives: false
+  target_libc: "armeabi-v7a"
+  target_cpu: "armeabi-v7a"
+  target_system_name: "armeabi-v7a"
+  toolchain_identifier: "stub_armeabi-v7a"
+
+  tool_path { name: "ar" path: "/bin/false" }
+  tool_path { name: "compat-ld" path: "/bin/false" }
+  tool_path { name: "cpp" path: "/bin/false" }
+  tool_path { name: "dwp" path: "/bin/false" }
+  tool_path { name: "gcc" path: "/bin/false" }
+  tool_path { name: "gcov" path: "/bin/false" }
+  tool_path { name: "ld" path: "/bin/false" }
+
+  tool_path { name: "nm" path: "/bin/false" }
+  tool_path { name: "objcopy" path: "/bin/false" }
+  tool_path { name: "objdump" path: "/bin/false" }
+  tool_path { name: "strip" path: "/bin/false" }
+}
+
+toolchain {
+  abi_version: "local"
+  abi_libc_version: "local"
+  builtin_sysroot: ""
+  compiler: "clang"
+  host_system_name: "local"
+  needsPic: true
+  supports_gold_linker: false
+  supports_incremental_linker: false
+  supports_fission: false
+  supports_interface_shared_objects: false
+  supports_normalizing_ar: false
+  supports_start_end_lib: false
+  supports_thin_archives: false
+  target_libc: "local"
+  target_cpu: "k8"
+  target_system_name: "k8"
+  toolchain_identifier: "k8_linux"
+
+  # These paths are relative to //tools/cpp.
+  tool_path { name: "ar" path: "clang_3p6/x86_64-linux-gnu-ar" }
+  tool_path { name: "compat-ld" path: "clang_3p6/x86_64-linux-gnu-ld" }
+  tool_path { name: "cpp" path: "clang_3p6/x86_64-linux-gnu-cpp" }
+  tool_path { name: "dwp" path: "clang_3p6/x86_64-linux-gnu-dwp" }
+  tool_path { name: "gcc" path: "clang_3p6/x86_64-linux-gnu-clang-3.6" }
+  tool_path { name: "gcov" path: "clang_3p6/x86_64-linux-gnu-gcov" }
+  # C(++) compiles invoke the compiler (as that is the one knowing where
+  # to find libraries), but we provide LD so other rules can invoke the linker.
+  tool_path { name: "ld" path: "clang_3p6/x86_64-linux-gnu-ld" }
+  tool_path { name: "nm" path: "clang_3p6/x86_64-linux-gnu-nm" }
+  tool_path { name: "objcopy" path: "clang_3p6/x86_64-linux-gnu-objcopy" }
+  objcopy_embed_flag: "-I"
+  objcopy_embed_flag: "binary"
+  tool_path { name: "objdump" path: "clang_3p6/x86_64-linux-gnu-objdump" }
+  tool_path { name: "strip" path: "clang_3p6/x86_64-linux-gnu-strip" }
+  linking_mode_flags { mode: DYNAMIC }
+
+  compiler_flag: "--sysroot=external/clang_3p6_repo/"
+  compiler_flag: "-nostdinc"
+  compiler_flag: "-isystem"
+  compiler_flag: "external/clang_3p6_repo/usr/include",
+  compiler_flag: "-isystem"
+  compiler_flag: "external/clang_3p6_repo/usr/include/x86_64-linux-gnu",
+  compiler_flag: "-isystem"
+  compiler_flag: "external/clang_3p6_repo/usr/lib/llvm-3.6/lib/clang/3.6.2/include",
+
+  cxx_flag: "-isystem"
+  cxx_flag: "external/clang_3p6_repo/usr/include/c++/4.9"
+  cxx_flag: "-isystem"
+  cxx_flag: "external/clang_3p6_repo/usr/include/x86_64-linux-gnu/c++/4.9"
+  cxx_flag: "-isystem"
+  cxx_flag: "external/clang_3p6_repo/usr/include/c++/4.9/backward"
+
+  # TODO(bazel-team): In theory, the path here ought to exactly match the path
+  # used by gcc. That works because bazel currently doesn't track files at
+  # absolute locations and has no remote execution, yet. However, this will need
+  # to be fixed, maybe with auto-detection?
+  cxx_builtin_include_directory: '%package(@clang_3p6_repo//usr)%/include/c++/4.9'
+  cxx_builtin_include_directory: '%package(@clang_3p6_repo//usr)%/include/x86_64-linux-gnu/c++/4.9'
+  cxx_builtin_include_directory: '%package(@clang_3p6_repo//usr)%/include/c++/4.9/backward'
+  cxx_builtin_include_directory: '%package(@clang_3p6_repo//usr)%/local/include'
+  cxx_builtin_include_directory: '%package(@clang_3p6_repo//usr)%/lib/llvm-3.6/lib/clang/3.6.2/include'
+  cxx_builtin_include_directory: '%package(@clang_3p6_repo//usr)%/include/x86_64-linux-gnu'
+  cxx_builtin_include_directory: '%package(@clang_3p6_repo//usr)%/include'
+  cxx_builtin_include_directory: '%package(@clang_3p6_repo//usr)%/lib/clang/3.6.2/include'
+
+  linker_flag: "-nodefaultlibs"
+  linker_flag: "--sysroot=external/clang_3p6_repo/"
+  linker_flag: "-lstdc++"
+  linker_flag: "-lc"
+  linker_flag: "-lgcc"
+  linker_flag: "-lgcc_s"
+  linker_flag: "-Bexternal/clang_3p6_repo/usr/bin/"
+  linker_flag: "-Ltools/cpp/clang_3p6/clang_more_libs"
+  linker_flag: "-Lexternal/clang_3p6/lib/x86_64-linux-gnu"
+  linker_flag: "-Lexternal/clang_3p6/usr/lib/x86_64-linux-gnu"
+  linker_flag: "-Lexternal/clang_3p6/usr/lib/gcc/x86_64-linux-gnu"
+
+  feature {
+    name: "opt"
+    implies: "all_modes"
+    flag_set {
+      action: "preprocess-assemble"
+      action: "c-compile"
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-header-preprocessing"
+      action: "c++-module-compile"
+      flag_group {
+        flag: "-DAOS_DEBUG=0"
+      }
+    }
+  }
+
+  feature {
+    name: "dbg"
+    implies: "all_modes"
+    flag_set {
+      action: "preprocess-assemble"
+      action: "c-compile"
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-header-preprocessing"
+      action: "c++-module-compile"
+      flag_group {
+        flag: "-DAOS_DEBUG=1"
+      }
+      flag_group {
+        flag: "-fno-omit-frame-pointer"
+      }
+    }
+  }
+
+  feature {
+    name: "fastbuild"
+    implies: "all_modes"
+    flag_set {
+      action: "preprocess-assemble"
+      action: "c-compile"
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-header-preprocessing"
+      action: "c++-module-compile"
+      flag_group {
+        flag: "-DAOS_DEBUG=0"
+      }
+    }
+  }
+
+  feature {
+    name: "all_modes"
+    flag_set {
+      action: "preprocess-assemble"
+      action: "assemble"
+      action: "c-compile"
+      flag_group {
+        flag: "-std=gnu99"
+      }
+    }
+    flag_set {
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-header-preprocessing"
+      action: "c++-module-compile"
+      flag_group {
+        flag: "-std=gnu++1y"
+      }
+    }
+    flag_set {
+      action: "preprocess-assemble"
+      action: "assemble"
+      action: "c++-link"
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-header-preprocessing"
+      action: "c++-module-compile"
+      action: "c-compile"
+      flag_group {
+        # We always want to compile with -pthread semantics.
+        flag: "-pthread"
+      }
+    }
+  }
+
+  # Anticipated future default.
+  # This makes GCC and Clang do what we want when called through symlinks.
+  unfiltered_cxx_flag: "-no-canonical-prefixes"
+  linker_flag: "-no-canonical-prefixes"
+
+  # Things that the code wants defined.
+  compiler_flag: "-D__STDC_FORMAT_MACROS"
+  compiler_flag: "-D__STDC_CONSTANT_MACROS"
+  compiler_flag: "-D__STDC_LIMIT_MACROS"
+  compiler_flag: "-D_FILE_OFFSET_BITS=64"
+  # TODO(Brian): Rename this or something.
+  compiler_flag: "-DAOS_ARCHITECTURE_arm_frc"
+
+  linker_flag: "-fuse-ld=gold"
+
+  # Make C++ compilation deterministic. Use linkstamping instead of these
+  # compiler symbols.
+  unfiltered_cxx_flag: "-Wno-builtin-macro-redefined"
+  unfiltered_cxx_flag: "-D__DATE__=\"redacted\""
+  unfiltered_cxx_flag: "-D__TIMESTAMP__=\"redacted\""
+  unfiltered_cxx_flag: "-D__TIME__=\"redacted\""
+
+  # Security hardening on by default.
+  # Conservative choice; -D_FORTIFY_SOURCE=2 may be unsafe in some cases.
+  # We need to undef it before redefining it as some distributions now have
+  # it enabled by default.
+  compiler_flag: "-U_FORTIFY_SOURCE"
+  compiler_flag: "-D_FORTIFY_SOURCE=1"
+  compiler_flag: "-fstack-protector"
+  compiler_flag: "-fPIE"
+  linker_flag: "-Wl,-z,relro,-z,now"
+
+  # Pretty much everything needs this, including parts of the glibc STL...
+  linker_flag: "-lm"
+
+  # Enable coloring even if there's no attached terminal. Bazel removes the
+  # escape sequences if --nocolor is specified.
+  compiler_flag: "-fcolor-diagnostics"
+  compiler_flag: "-fmessage-length=80"
+  compiler_flag: "-fmacro-backtrace-limit=0"
+
+  compiler_flag: "-Wall"
+  compiler_flag: "-Wextra"
+  compiler_flag: "-Wpointer-arith"
+  compiler_flag: "-Wstrict-aliasing"
+  compiler_flag: "-Wcast-qual"
+  compiler_flag: "-Wcast-align"
+  compiler_flag: "-Wwrite-strings"
+  compiler_flag: "-Wtype-limits"
+  compiler_flag: "-Wsign-compare"
+  compiler_flag: "-Wformat=2"
+  compiler_flag: "-Werror"
+
+  # Keep stack frames for debugging, even in opt mode.
+  compiler_flag: "-fno-omit-frame-pointer"
+
+  # Don't use temp files while compiling.
+  compiler_flag: "-pipe"
+
+  # Stamp the binary with a unique identifier.
+  linker_flag: "-Wl,--build-id=md5"
+  linker_flag: "-Wl,--hash-style=gnu"
+  linker_flag: "-Wl,--warn-execstack"
+  linker_flag: "-Wl,--detect-odr-violations"
+
+  # Enable debug symbols.
+  compiler_flag: "-ggdb3"
+
+  compilation_mode_flags {
+    mode: OPT
+
+    compiler_flag: "-O2"
+
+    # Disable assertions
+    compiler_flag: "-DNDEBUG"
+
+    # Removal of unused code and data at link time (can this increase binary size in some cases?).
+    compiler_flag: "-ffunction-sections"
+    compiler_flag: "-fdata-sections"
+    linker_flag: "-Wl,--gc-sections"
+  }
+  feature {
+    name: "pie_for_linking"
+    enabled: true
+    flag_set {
+      action: "c++-link-executable"
+      flag_group {
+        flag: "-pie"
+      }
+    }
+  }
+}
+
+toolchain {
+  abi_version: "roborio"
+  abi_libc_version: "roborio"
+  builtin_sysroot: ""
+  compiler: "gcc"
+  host_system_name: "roborio"
+  needsPic: true
+  supports_gold_linker: false
+  supports_incremental_linker: false
+  supports_fission: false
+  supports_interface_shared_objects: false
+  supports_normalizing_ar: false
+  supports_start_end_lib: false
+  supports_thin_archives: false
+  target_libc: "roborio"
+  target_cpu: "roborio"
+  target_system_name: "roborio"
+  toolchain_identifier: "roborio_linux"
+
+  tool_path { name: "ar" path: "arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-ar" }
+  tool_path { name: "compat-ld" path: "arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-ld" }
+  tool_path { name: "cpp" path: "arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-cpp" }
+  tool_path { name: "dwp" path: "/bin/false" }
+  tool_path { name: "gcc" path: "arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-gcc" }
+  tool_path { name: "gcov" path: "arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-gcov-4.9" }
+  # C(++) compiles invoke the compiler (as that is the one knowing where
+  # to find libraries), but we provide LD so other rules can invoke the linker.
+  tool_path { name: "ld" path: "arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-ld" }
+  tool_path { name: "nm" path: "arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-nm" }
+  tool_path { name: "objcopy" path: "arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-objcopy" }
+  objcopy_embed_flag: "-I"
+  objcopy_embed_flag: "binary"
+  tool_path { name: "objdump" path: "arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-objdump" }
+  tool_path { name: "strip" path: "arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-strip" }
+  linking_mode_flags { mode: DYNAMIC }
+
+  compiler_flag: "--sysroot=external/arm_frc_linux_gnueabi_repo/usr/arm-frc-linux-gnueabi"
+  compiler_flag: "-nostdinc"
+  compiler_flag: "-isystem"
+  compiler_flag: "external/arm_frc_linux_gnueabi_repo/usr/lib/x86_64-linux-gnu/gcc/arm-frc-linux-gnueabi/5.4.0/include",
+  compiler_flag: "-isystem"
+  compiler_flag: "external/arm_frc_linux_gnueabi_repo/usr/lib/x86_64-linux-gnu/gcc/arm-frc-linux-gnueabi/5.4.0/include-fixed"
+  compiler_flag: "-isystem"
+  compiler_flag: "external/arm_frc_linux_gnueabi_repo/usr/arm-frc-linux-gnueabi/usr/include"
+
+  cxx_flag: "-isystem"
+  cxx_flag: "external/arm_frc_linux_gnueabi_repo/usr/arm-frc-linux-gnueabi/include/c++/5.4.0"
+  cxx_flag: "-isystem"
+  cxx_flag: "external/arm_frc_linux_gnueabi_repo/usr/arm-frc-linux-gnueabi/include/c++/5.4.0/arm-frc-linux-gnueabi"
+  cxx_flag: "-isystem"
+  cxx_flag: "external/arm_frc_linux_gnueabi_repo/usr/arm-frc-linux-gnueabi/include/c++/5.4.0/backward"
+  cxx_flag: "-isystem"
+  cxx_flag: "external/arm_frc_linux_gnueabi_repo/usr/lib/x86_64-linux-gnu/gcc/arm-frc-linux-gnueabi/5.4.0/include"
+  cxx_flag: "-isystem"
+  cxx_flag: "external/arm_frc_linux_gnueabi_repo/usr/lib/x86_64-linux-gnu/gcc/arm-frc-linux-gnueabi/5.4.0/include-fixed"
+  cxx_flag: "-isystem"
+  cxx_flag: "external/arm_frc_linux_gnueabi_repo/usr/arm-frc-linux-gnueabi/include"
+  cxx_flag: "-isystem"
+  cxx_flag: "external/arm_frc_linux_gnueabi_repo/usr/arm-frc-linux-gnueabi/usr/include"
+
+  # TODO(bazel-team): In theory, the path here ought to exactly match the path
+  # used by gcc. That works because bazel currently doesn't track files at
+  # absolute locations and has no remote execution, yet. However, this will need
+  # to be fixed, maybe with auto-detection?
+  cxx_builtin_include_directory: "%package(@arm_frc_linux_gnueabi_repo//usr/arm-frc-linux-gnueabi/include)%/c++/5.4.0"
+  cxx_builtin_include_directory: "%package(@arm_frc_linux_gnueabi_repo//usr/arm-frc-linux-gnueabi/include)%/c++/5.4.0/arm-frc-linux-gnueabi"
+  cxx_builtin_include_directory: "%package(@arm_frc_linux_gnueabi_repo//usr/arm-frc-linux-gnueabi/include)%/c++/5.4.0/backward"
+  cxx_builtin_include_directory: "%package(@arm_frc_linux_gnueabi_repo//usr/lib/x86_64-linux-gnu/gcc/arm-frc-linux-gnueabi/5.4.0/include)%"
+  cxx_builtin_include_directory: "%package(@arm_frc_linux_gnueabi_repo//usr/lib/x86_64-linux-gnu/gcc/arm-frc-linux-gnueabi/5.4.0/include-fixed)%"
+  cxx_builtin_include_directory: "%package(@arm_frc_linux_gnueabi_repo//usr/arm-frc-linux-gnueabi/include)%"
+  cxx_builtin_include_directory: "%package(@arm_frc_linux_gnueabi_repo//usr/arm-frc-linux-gnueabi/usr/include)%"
+
+  linker_flag: "-lstdc++"
+  linker_flag: "-Ltools/cpp/arm-frc-linux-gnueabi/libs"
+
+  feature {
+    name: "opt"
+    implies: "all_modes"
+    flag_set {
+      action: "preprocess-assemble"
+      action: "c-compile"
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-header-preprocessing"
+      action: "c++-module-compile"
+      flag_group {
+        flag: "-DAOS_DEBUG=0"
+      }
+    }
+  }
+
+  feature {
+    name: "dbg"
+    implies: "all_modes"
+    flag_set {
+      action: "preprocess-assemble"
+      action: "c-compile"
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-header-preprocessing"
+      action: "c++-module-compile"
+      flag_group {
+        flag: "-DAOS_DEBUG=1"
+      }
+      flag_group {
+        flag: "-fno-omit-frame-pointer"
+      }
+    }
+  }
+
+  feature {
+    name: "fastbuild"
+    implies: "all_modes"
+    flag_set {
+      action: "preprocess-assemble"
+      action: "c-compile"
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-header-preprocessing"
+      action: "c++-module-compile"
+      flag_group {
+        flag: "-DAOS_DEBUG=0"
+      }
+    }
+  }
+
+  feature {
+    name: "all_modes"
+    flag_set {
+      action: "preprocess-assemble"
+      action: "assemble"
+      action: "c-compile"
+      flag_group {
+        flag: "-std=gnu99"
+      }
+    }
+    flag_set {
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-header-preprocessing"
+      action: "c++-module-compile"
+      flag_group {
+        flag: "-std=gnu++1y"
+      }
+    }
+    flag_set {
+      action: "preprocess-assemble"
+      action: "assemble"
+      action: "c++-link"
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-header-preprocessing"
+      action: "c++-module-compile"
+      action: "c-compile"
+      flag_group {
+        # We always want to compile with -pthread semantics.
+        flag: "-pthread"
+      }
+    }
+  }
+
+  compiler_flag: "-mfpu=neon"
+  # TODO(brians): See if it will run with this enabled.
+  #compiler_flag: "-mhwdiv=arm,thumb"
+
+  # Anticipated future default.
+  # This makes GCC and Clang do what we want when called through symlinks.
+  unfiltered_cxx_flag: "-no-canonical-prefixes"
+  linker_flag: "-no-canonical-prefixes"
+
+  # Things that the code wants defined.
+  compiler_flag: "-D__STDC_FORMAT_MACROS"
+  compiler_flag: "-D__STDC_CONSTANT_MACROS"
+  compiler_flag: "-D__STDC_LIMIT_MACROS"
+  compiler_flag: "-D_FILE_OFFSET_BITS=64"
+  # TODO(Brian): Rename this or something.
+  compiler_flag: "-DAOS_ARCHITECTURE_arm_frc"
+
+  #linker_flag: "-fuse-ld=gold"
+
+  # Make C++ compilation deterministic. Use linkstamping instead of these
+  # compiler symbols.
+  unfiltered_cxx_flag: "-Wno-builtin-macro-redefined"
+  unfiltered_cxx_flag: "-D__DATE__=\"redacted\""
+  unfiltered_cxx_flag: "-D__TIMESTAMP__=\"redacted\""
+  unfiltered_cxx_flag: "-D__TIME__=\"redacted\""
+
+  # Security hardening on by default.
+  # Conservative choice; -D_FORTIFY_SOURCE=2 may be unsafe in some cases.
+  # We need to undef it before redefining it as some distributions now have
+  # it enabled by default.
+  compiler_flag: "-U_FORTIFY_SOURCE"
+  compiler_flag: "-fstack-protector"
+  compiler_flag: "-fPIE"
+  linker_flag: "-Wl,-z,relro,-z,now"
+
+  # Pretty much everything needs this, including parts of the glibc STL...
+  linker_flag: "-lm"
+
+  # Enable coloring even if there's no attached terminal. Bazel removes the
+  # escape sequences if --nocolor is specified.
+  compiler_flag: "-fdiagnostics-color=always"
+
+  compiler_flag: "-Wall"
+  compiler_flag: "-Wextra"
+  compiler_flag: "-Wpointer-arith"
+  compiler_flag: "-Wstrict-aliasing"
+  compiler_flag: "-Wcast-qual"
+  compiler_flag: "-Wcast-align"
+  compiler_flag: "-Wwrite-strings"
+  compiler_flag: "-Wtype-limits"
+  compiler_flag: "-Wsign-compare"
+  compiler_flag: "-Wformat=2"
+  compiler_flag: "-Werror"
+  compiler_flag: "-Wunused-local-typedefs"
+
+  # Keep stack frames for debugging, even in opt mode.
+  compiler_flag: "-fno-omit-frame-pointer"
+  compiler_flag: "-D__has_feature(x)=0"
+
+  # Don't use temp files while compiling.
+  compiler_flag: "-pipe"
+
+  # Have GCC return the exit code from ld.
+  linker_flag: "-pass-exit-codes"
+
+  # Stamp the binary with a unique identifier.
+  linker_flag: "-Wl,--build-id=md5"
+  linker_flag: "-Wl,--hash-style=gnu"
+  #linker_flag: "-Wl,--warn-execstack"
+  #linker_flag: "-Wl,--detect-odr-violations"
+
+  # Enable debug symbols.
+  compiler_flag: "-ggdb3"
+
+  compilation_mode_flags {
+    mode: OPT
+
+    compiler_flag: "-O2"
+
+    # Disable assertions
+    compiler_flag: "-DNDEBUG"
+    compiler_flag: "-D_FORTIFY_SOURCE=1"
+
+    # Removal of unused code and data at link time (can this increase binary size in some cases?).
+    compiler_flag: "-ffunction-sections"
+    compiler_flag: "-fdata-sections"
+    linker_flag: "-Wl,--gc-sections"
+  }
+  feature {
+    name: "pie_for_linking"
+    enabled: true
+    flag_set {
+      action: "c++-link-executable"
+      flag_group {
+        flag: "-pie"
+      }
+    }
+  }
+}
+
+toolchain {
+  abi_version: "clang_3.6"
+  abi_libc_version: "glibc_2.19"
+  builtin_sysroot: ""
+  compiler: "clang"
+  host_system_name: "linux"
+  needsPic: true
+  supports_gold_linker: false
+  supports_incremental_linker: false
+  supports_fission: false
+  supports_interface_shared_objects: false
+  supports_normalizing_ar: true
+  supports_start_end_lib: false
+  supports_thin_archives: true
+  target_libc: "glibc_2.19"
+  target_cpu: "armhf-debian"
+  target_system_name: "arm_a15"
+  toolchain_identifier: "clang_linux_armhf"
+
+  tool_path { name: "ar" path: "linaro_linux_gcc/arm-linux-gnueabihf-ar" }
+  tool_path { name: "compat-ld" path: "linaro_linux_gcc/arm-linux-gnueabihf-ld" }
+  tool_path { name: "cpp" path: "linaro_linux_gcc/clang_bin/clang" }
+  tool_path { name: "dwp" path: "linaro_linux_gcc/arm-linux-gnueabihf-dwp" }
+  tool_path { name: "gcc" path: "linaro_linux_gcc/clang_bin/clang" }
+  tool_path { name: "gcov" path: "arm-frc-linux-gnueabi/arm-frc-linux-gnueabi-gcov-4.9" }
+  # C(++) compiles invoke the compiler (as that is the one knowing where
+  # to find libraries), but we provide LD so other rules can invoke the linker.
+  tool_path { name: "ld" path: "linaro_linux_gcc/arm-linux-gnueabihf-ld" }
+  tool_path { name: "nm" path: "linaro_linux_gcc/arm-linux-gnueabihf-nm" }
+  tool_path { name: "objcopy" path: "linaro_linux_gcc/arm-linux-gnueabihf-objcopy" }
+  objcopy_embed_flag: "-I"
+  objcopy_embed_flag: "binary"
+  tool_path { name: "objdump" path: "linaro_linux_gcc/arm-linux-gnueabihf-objdump" }
+  tool_path { name: "strip" path: "linaro_linux_gcc/arm-linux-gnueabihf-strip" }
+  linking_mode_flags { mode: DYNAMIC }
+
+  compiler_flag: "-target"
+  compiler_flag: "armv7a-arm-linux-gnueabif"
+  compiler_flag: "--sysroot=external/linaro_linux_gcc_4_9_repo/arm-linux-gnueabihf/libc"
+  compiler_flag: "-mfloat-abi=hard"
+  compiler_flag: "-mfpu=vfpv3-d16"
+
+  compiler_flag: "-nostdinc"
+  compiler_flag: "-isystem"
+  compiler_flag: "/usr/lib/clang/3.6/include"
+  compiler_flag: "-isystem"
+  compiler_flag: "external/linaro_linux_gcc_4_9_repo/lib/gcc/arm-linux-gnueabihf/4.9.3/include"
+  compiler_flag: "-isystem"
+  compiler_flag: "external/linaro_linux_gcc_4_9_repo/arm-linux-gnueabihf/libc/usr/include"
+  compiler_flag: "-isystem"
+  compiler_flag: "external/linaro_linux_gcc_4_9_repo/lib/gcc/arm-linux-gnueabihf/4.9.3/include-fixed"
+  cxx_flag: "-isystem"
+  cxx_flag: "external/linaro_linux_gcc_4_9_repo/arm-linux-gnueabihf/include/c++/4.9.3/arm-linux-gnueabihf"
+  cxx_flag: "-isystem"
+  cxx_flag: "external/linaro_linux_gcc_4_9_repo/arm-linux-gnueabihf/include/c++/4.9.3"
+  cxx_flag: "-isystem"
+  cxx_flag: "external/linaro_linux_gcc_4_9_repo/include/c++/4.9.3/arm-linux-gnueabihf"
+  cxx_flag: "-isystem"
+  cxx_flag: "external/linaro_linux_gcc_4_9_repo/include/c++/4.9.3"
+
+  cxx_builtin_include_directory: "%package(@linaro_linux_gcc_4_9_repo//include)%"
+  cxx_builtin_include_directory: "%package(@linaro_linux_gcc_4_9_repo//arm-linux-gnueabihf/libc/usr/include)%"
+  cxx_builtin_include_directory: "%package(@linaro_linux_gcc_4_9_repo//arm-linux-gnueabihf/libc/usr/lib/include)%"
+  cxx_builtin_include_directory: "%package(@linaro_linux_gcc_4_9_repo//arm-linux-gnueabihf/libc/lib/gcc/arm-linux-gnueabihf/4.9.3/include-fixed)%"
+  cxx_builtin_include_directory: "%package(@linaro_linux_gcc_4_9_repo//include)%/c++/4.9.3"
+  cxx_builtin_include_directory: "%package(@linaro_linux_gcc_4_9_repo//arm-linux-gnueabihf/libc/lib/gcc/arm-linux-gnueabihf/4.9.3/include)%"
+  cxx_builtin_include_directory: "%package(@linaro_linux_gcc_4_9_repo//arm-linux-gnueabihf/libc/lib/gcc/arm-linux-gnueabihf/4.9.3/include-fixed)%"
+  cxx_builtin_include_directory: "%package(@linaro_linux_gcc_4_9_repo//lib/gcc/arm-linux-gnueabihf/4.9.3/include)%"
+  cxx_builtin_include_directory: "%package(@linaro_linux_gcc_4_9_repo//lib/gcc/arm-linux-gnueabihf/4.9.3/include-fixed)%"
+  cxx_builtin_include_directory: "%package(@linaro_linux_gcc_4_9_repo//arm-linux-gnueabihf/include)%/c++/4.9.3"
+  cxx_builtin_include_directory: '/usr/lib/clang/3.6/include'
+
+  linker_flag: "-target"
+  linker_flag: "armv7a-arm-linux-gnueabif"
+  linker_flag: "--sysroot=external/linaro_linux_gcc_4_9_repo/arm-linux-gnueabihf/libc"
+  linker_flag: "-lstdc++"
+  linker_flag: "-Ltools/cpp/linaro_linux_gcc/clang_more_libs"
+  linker_flag: "-Lexternal/linaro_linux_gcc_4_9_repo/arm-linux-gnueabihf/lib"
+  linker_flag: "-Lexternal/linaro_linux_gcc_4_9_repo/arm-linux-gnueabihf/libc/lib"
+  linker_flag: "-Lexternal/linaro_linux_gcc_4_9_repo/arm-linux-gnueabihf/libc/usr/lib"
+  linker_flag: "-Bexternal/linaro_linux_gcc_4_9_repo/arm-linux-gnueabihf/bin"
+  linker_flag: "-Wl,--dynamic-linker=/lib/ld-linux-armhf.so.3"
+
+  feature {
+    name: "opt"
+    implies: "all_modes"
+    flag_set {
+      action: "preprocess-assemble"
+      action: "c-compile"
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-header-preprocessing"
+      action: "c++-module-compile"
+      flag_group {
+        flag: "-DAOS_DEBUG=0"
+      }
+    }
+  }
+
+  feature {
+    name: "dbg"
+    implies: "all_modes"
+    flag_set {
+      action: "preprocess-assemble"
+      action: "c-compile"
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-header-preprocessing"
+      action: "c++-module-compile"
+      flag_group {
+        flag: "-DAOS_DEBUG=1"
+      }
+      flag_group {
+        flag: "-fno-omit-frame-pointer"
+      }
+    }
+  }
+
+  feature {
+    name: "fastbuild"
+    implies: "all_modes"
+    flag_set {
+      action: "preprocess-assemble"
+      action: "c-compile"
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-header-preprocessing"
+      action: "c++-module-compile"
+      flag_group {
+        flag: "-DAOS_DEBUG=0"
+      }
+    }
+  }
+
+  feature {
+    name: "all_modes"
+    flag_set {
+      action: "preprocess-assemble"
+      action: "assemble"
+      action: "c-compile"
+      flag_group {
+        flag: "-std=gnu99"
+      }
+    }
+    flag_set {
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-header-preprocessing"
+      action: "c++-module-compile"
+      flag_group {
+        flag: "-std=gnu++1y"
+      }
+    }
+    flag_set {
+      action: "preprocess-assemble"
+      action: "assemble"
+      action: "c++-link"
+      action: "c++-compile"
+      action: "c++-header-parsing"
+      action: "c++-header-preprocessing"
+      action: "c++-module-compile"
+      action: "c-compile"
+      flag_group {
+        # We always want to compile with -pthread semantics.
+        flag: "-pthread"
+      }
+    }
+  }
+
+  # Anticipated future default.
+  # This makes GCC and Clang do what we want when called through symlinks.
+  unfiltered_cxx_flag: "-no-canonical-prefixes"
+  linker_flag: "-no-canonical-prefixes"
+
+  # Things that the code wants defined.
+  compiler_flag: "-D__STDC_FORMAT_MACROS"
+  compiler_flag: "-D__STDC_CONSTANT_MACROS"
+  compiler_flag: "-D__STDC_LIMIT_MACROS"
+  compiler_flag: "-D_FILE_OFFSET_BITS=64"
+  # TODO(Brian): Rename this or something.
+  compiler_flag: "-DAOS_ARCHITECTURE_armhf"
+
+  # Make C++ compilation deterministic. Use linkstamping instead of these
+  # compiler symbols.
+  unfiltered_cxx_flag: "-Wno-builtin-macro-redefined"
+  unfiltered_cxx_flag: "-D__DATE__=\"redacted\""
+  unfiltered_cxx_flag: "-D__TIMESTAMP__=\"redacted\""
+  unfiltered_cxx_flag: "-D__TIME__=\"redacted\""
+
+  # Security hardening on by default.
+  # Conservative choice; -D_FORTIFY_SOURCE=2 may be unsafe in some cases.
+  # We need to undef it before redefining it as some distributions now have
+  # it enabled by default.
+  compiler_flag: "-U_FORTIFY_SOURCE"
+  compiler_flag: "-fstack-protector"
+  compiler_flag: "-fPIE"
+  linker_flag: "-Wl,-z,relro,-z,now"
+
+  # Pretty much everything needs this, including parts of the glibc STL...
+  linker_flag: "-lm"
+
+  # Enable coloring even if there's no attached terminal. Bazel removes the
+  # escape sequences if --nocolor is specified.
+  compiler_flag: "-fdiagnostics-color=always"
+
+  compiler_flag: "-Wall"
+  compiler_flag: "-Wextra"
+  compiler_flag: "-Wpointer-arith"
+  compiler_flag: "-Wstrict-aliasing"
+  compiler_flag: "-Wcast-qual"
+  compiler_flag: "-Wcast-align"
+  compiler_flag: "-Wwrite-strings"
+  compiler_flag: "-Wtype-limits"
+  compiler_flag: "-Wsign-compare"
+  compiler_flag: "-Wformat=2"
+  compiler_flag: "-Werror"
+  compiler_flag: "-Wunused-local-typedefs"
+
+  # Keep stack frames for debugging, even in opt mode.
+  compiler_flag: "-fno-omit-frame-pointer"
+
+  # Don't use temp files while compiling.
+  compiler_flag: "-pipe"
+
+  # Stamp the binary with a unique identifier.
+  linker_flag: "-Wl,--build-id=md5"
+  linker_flag: "-Wl,--hash-style=gnu"
+  #linker_flag: "-Wl,--warn-execstack"
+  #linker_flag: "-Wl,--detect-odr-violations"
+
+  # Enable debug symbols.
+  compiler_flag: "-ggdb3"
+
+  compilation_mode_flags {
+    mode: OPT
+
+    compiler_flag: "-O2"
+
+    # Disable assertions
+    compiler_flag: "-DNDEBUG"
+    compiler_flag: "-D_FORTIFY_SOURCE=1"
+
+    # Removal of unused code and data at link time (can this increase binary size in some cases?).
+    compiler_flag: "-ffunction-sections"
+    compiler_flag: "-fdata-sections"
+    linker_flag: "-Wl,--gc-sections"
+  }
+  feature {
+    name: "pie_for_linking"
+    enabled: true
+    flag_set {
+      action: "c++-link-executable"
+      flag_group {
+        flag: "-pie"
+      }
+    }
+  }
+}