Android toolchain benchmark suite initialization

Move Android toolchain benchmark suite from external/toolchain-utils to
this directory.

Test: None.
Change-Id: I5069c508b80d817d87cea87c5886488979202570
diff --git a/set_flags.py b/set_flags.py
new file mode 100644
index 0000000..a243c7c
--- /dev/null
+++ b/set_flags.py
@@ -0,0 +1,128 @@
+# Copyright 2017 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+"""Helper functions to put user defined flags to mk/bp files"""
+
+from __future__ import print_function
+
+import config
+import os
+import subprocess
+
+
+# Find the makefile/blueprint based on the benchmark, and make a copy of
+# it for restoring later.
+def backup_file(bench, file_type):
+  mk_file = os.path.join(config.android_home, config.bench_dict[bench],
+                         'Android.' + file_type)
+  try:
+    # Make a copy of the makefile/blueprint so that we can recover it after
+    # building the benchmark
+    subprocess.check_call([
+        'cp', mk_file,
+        os.path.join(config.android_home, config.bench_dict[bench],
+                     'tmp_makefile')
+    ])
+  except subprocess.CalledProcessError():
+    raise OSError('Cannot backup Android.%s file for %s' % (file_type, bench))
+
+
+# Insert lines to add LOCAL_CFLAGS/LOCAL_LDFLAGS to the benchmarks
+# makefile/blueprint
+def replace_flags(bench, android_type, file_type, cflags, ldflags):
+  # Use format ["Flag1", "Flag2"] for bp file
+  if file_type == 'bp':
+    if cflags:
+      cflags = '\", \"'.join(cflags.split())
+    if ldflags:
+      ldflags = '\", \"'.join(ldflags.split())
+
+  if not cflags:
+    cflags = ''
+  else:
+    cflags = '\"' + cflags + '\",'
+  if not ldflags:
+    ldflags = ''
+  else:
+    ldflags = '\"' + ldflags + '\",'
+
+  # Two different diffs are used for aosp or internal android repo.
+  if android_type == 'aosp':
+    bench_diff = bench + '_flags_aosp.diff'
+  else:
+    bench_diff = bench + '_flags_internal.diff'
+
+  # Replace CFLAGS_FOR_BENCH_SUITE marker with proper cflags
+  output = ''
+  with open(bench_diff) as f:
+    for line in f:
+      line = line.replace('CFLAGS_FOR_BENCH_SUITE', cflags)
+      line = line.replace('LDFLAGS_FOR_BENCH_SUITE', ldflags)
+      output += line
+
+  with open('modified.diff', 'w') as f:
+    f.write(output)
+
+
+def apply_patches(bench):
+  bench_dir = os.path.join(config.android_home, config.bench_dict[bench])
+  bench_diff = 'modified.diff'
+  flags_patch = os.path.join(
+      os.path.dirname(os.path.realpath(__file__)), bench_diff)
+  try:
+    subprocess.check_call(['git', '-C', bench_dir, 'apply', flags_patch])
+  except subprocess.CalledProcessError:
+    raise OSError('Patch for adding flags for %s does not succeed.' % (bench))
+
+
+def replace_flags_in_dir(bench, cflags, ldflags):
+  bench_mk = os.path.join(config.android_home, config.bench_dict[bench],
+                          'Android.mk')
+
+  if not cflags:
+    cflags = ''
+  if not ldflags:
+    ldflags = ''
+
+  output = ''
+  with open(bench_mk) as f:
+    for line in f:
+      line = line.replace('$(CFLAGS_FOR_BENCH_SUITE)', cflags)
+      line = line.replace('$(LDFLAGS_FOR_BENCH_SUITE)', ldflags)
+      output += line
+  with open(bench_mk, 'w') as f:
+    f.write(output)
+
+
+def add_flags_Panorama(cflags, ldflags):
+  backup_file('Panorama', 'mk')
+  replace_flags_in_dir('Panorama', cflags, ldflags)
+
+
+def add_flags_Synthmark(cflags, ldflags):
+  backup_file('Synthmark', 'mk')
+  replace_flags_in_dir('Synthmark', cflags, ldflags)
+
+
+def add_flags_Skia(cflags, ldflags):
+  backup_file('Skia', 'bp')
+  replace_flags('Skia', config.android_type, 'bp', cflags, ldflags)
+  apply_patches('Skia')
+
+
+def add_flags_Binder(cflags, ldflags):
+  backup_file('Binder', 'bp')
+  replace_flags('Binder', config.android_type, 'bp', cflags, ldflags)
+  apply_patches('Binder')
+
+
+def add_flags_Hwui(cflags, ldflags):
+  backup_file('Hwui', 'bp')
+  replace_flags('Hwui', config.android_type, 'bp', cflags, ldflags)
+  apply_patches('Hwui')
+
+
+def add_flags_Dex2oat(cflags, ldflags):
+  backup_file('Dex2oat', 'bp')
+  replace_flags('Dex2oat', config.android_type, 'bp', cflags, ldflags)
+  apply_patches('Dex2oat')