diff --git a/tools/gen_merged_sql_metrics.py b/tools/gen_merged_sql_metrics.py
new file mode 100755
index 0000000..071423c
--- /dev/null
+++ b/tools/gen_merged_sql_metrics.py
@@ -0,0 +1,123 @@
+#!/usr/bin/env python
+# Copyright (C) 2019 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import argparse
+import os
+import sys
+
+# Converts the SQL metrics for trace processor into a C++ header with the SQL
+# as a string constant to allow trace processor to exectue the metrics.
+
+REPLACEMENT_HEADER = '''/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ *******************************************************************************
+ * AUTOGENERATED BY tools/gen_merged_sql_metrics - DO NOT EDIT
+ *******************************************************************************
+ */
+
+ #include <string.h>
+'''
+
+NAMESPACE_BEGIN = '''
+namespace perfetto {
+namespace trace_processor {
+namespace metrics {
+namespace sql_metrics {
+'''
+
+FILE_TO_SQL_STRUCT = '''
+struct FileToSql {
+  const char* filename;
+  const char* sql;
+};
+'''
+
+FIND_SQL_FN = '''
+inline const char* GetBundledMetric(const char* filename) {
+  for (const auto& filename_to_sql : sql_metrics::kFileToSql) {
+    if (strcmp(filename_to_sql.filename, filename) == 0) {
+      return filename_to_sql.sql;
+    }
+  }
+  return nullptr;
+}
+'''
+
+NAMESPACE_END = '''
+}  // namespace sql_metrics
+}  // namespace metrics
+}  // namespace trace_processor
+}  // namsepace perfetto
+'''
+
+def filename_to_variable(filename):
+  return "k" + "".join([x.capitalize() for x in filename.split("_")])
+
+def main():
+  parser = argparse.ArgumentParser()
+  parser.add_argument('--cpp_out', required=True)
+  parser.add_argument('sql_files', nargs='*')
+  args = parser.parse_args()
+
+  # Extract the SQL output from each file.
+  escaped_sql_outputs = {}
+  for file_name in args.sql_files:
+    with open(file_name, 'r') as f:
+      basename = os.path.basename(file_name)
+
+      # Escape any quote characters.
+      escaped_sql_outputs[basename] = "".join(f.readlines())
+
+  with open(args.cpp_out, 'w+') as output:
+    output.write(REPLACEMENT_HEADER)
+    output.write(NAMESPACE_BEGIN)
+
+    # Create the C++ variable for each SQL file.
+    for name, sql in escaped_sql_outputs.items():
+      variable = filename_to_variable(os.path.splitext(name)[0])
+      output.write('\nconst char {}[] = R"gendelimiter(\n{})gendelimiter";\n'
+        .format(variable, sql))
+
+    output.write(FILE_TO_SQL_STRUCT)
+
+    # Create mapping of filename to variable name for each variable.
+    output.write("\nconst FileToSql kFileToSql[] = {")
+    for name in escaped_sql_outputs.keys():
+      variable = filename_to_variable(os.path.splitext(name)[0])
+      output.write('\n  {{"{}", {}}},\n'.format(name, variable))
+    output.write("};\n")
+
+    output.write(FIND_SQL_FN)
+    output.write(NAMESPACE_END)
+
+  return 0
+
+if __name__ == '__main__':
+  sys.exit(main())
