# 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')
