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:]))
