#===========================================================================
# CmdDB build script
#
# Copyright (c) 2016-2019 by Qualcomm Technologies, Incorporated
# All Rights Reserved
# Qualcomm Proprietary/GTDR
#===========================================================================
import os
import re
import fnmatch
import itertools

#--------------------------------------------------------------------------- 
# Utility routine to search arc export and hsr file
#--------------------------------------------------------------------------- 
def cmd_db_arc_files(path='.', exportf=True):
    ver_files = []

    files = [f for f in os.listdir(path)]
    ptrn = re.compile(r'arc(_v[0-9]+)?_export.csv$') if exportf else \
           re.compile(r'arc(_v[0-9]+)?_hsr.csv$')

    for f in files:
        m = ptrn.match(f)
        if m is None:
            continue
        ver = m.group(1)
        if ver is None:
            ver = 1.0
        else:
            ver = float(ver[len('_v'):])
            ver = ver/10.0 if ver > 10.0 else ver

        ver_files.append((ver, os.path.join(path, f)))

    # Only one default file - mark specially for using with all versions.
    if len(ver_files) == 1 and ver_files[0][0] == 1.0:
        ver_files[0] = (0.0, ver_files[0][1])

    # sort on version (first in tuple)
    return sorted(ver_files)


#--------------------------------------------------------------------------- 
# Build setup
#--------------------------------------------------------------------------- 

Import('env')
env = env.Clone()

SRCPATH = ".."
env.VariantDir('${BUILDPATH}', SRCPATH, duplicate=0)
env.Append(CFLAGS = '${ARMCC_STDC99_CMD}')

if env['MSM_ID'] in ['8250']:
    env.Append(CPPDEFINES = 'SM8250_TARGET_CONFIG')
    env.Append(CPPDEFINES = 'DDR_OFFLOADED_INIT')

if env['MSM_ID'] in ['8350']:
    env.Append(CPPDEFINES = 'SM8350_TARGET_CONFIG')
    env.Append(CPPDEFINES = 'DDR_OFFLOADED_INIT')

if env['MSM_ID'] in ['Saipan']:
    env.Append(CPPDEFINES = 'Saipan_TARGET_CONFIG')
    env.Append(CPPDEFINES = 'DDR_OFFLOADED_INIT')
	
if env['MSM_ID'] in ['bitra']:
    env.Append(CPPDEFINES = 'bitra_TARGET_CONFIG')
    env.Append(CPPDEFINES = 'DDR_OFFLOADED_INIT')

if env['MSM_ID'] not in ['8250', 'Saipan', '8350', 'bitra']:
    env.Append(CFLAGS = '-DCMD_DB_IN_DDR') #No need since address translation in HW MMU


# FEATURE CONFIG:
#env.Append(CPPDEFINES=['RPMH_OFFTARGET_TEST'])
#env.Append(CPPDEFINES=['OFFTARGET_MSM_ID'])

CBSP_API = [
  'POWER',
  'SYSTEMDRIVERS',
  # needs to be last also contains wrong comdef.h
  'KERNEL',
]

if env.has_key('ADSP_PROC') or env.has_key('MODEM_PROC'):
    env['RPMH_IMAGE_OS'] = 'dal'
elif env.has_key('AOP_IMAGE'):
    env['RPMH_IMAGE_OS'] = 'rex'
else:
    env['RPMH_IMAGE_OS'] = 'stubs'

env.RequirePublicApi(CBSP_API)
env.RequireRestrictedApi(CBSP_API)
env.RequireProtectedApi(CBSP_API)

if env['MSM_ID'] in ['Saipan']:
	if not env.PathExists('${BUILD_ROOT}/core/power/cmd_db/target/${CHIPSET_PMIC}'):
		env['MSM_ID'] = 'stubs'
		env.PrintWarning('!!Using stubbed config/target for CMDDB!!')
else:
	if not env.PathExists('${BUILD_ROOT}/core/power/cmd_db/target/${MSM_ID}'):
		env['MSM_ID'] = 'stubs'
		env.PrintWarning('!!Using stubbed config/target for CMDDB!!')
		
if env['MSM_ID'] in ['Saipan']:
	env.PublishPrivateApi('CMD_DB', [
		'${BUILD_ROOT}/core/power/cmd_db/common',
		'${BUILD_ROOT}/core/power/cmd_db/target/${CHIPSET_PMIC}',
		])
else:
	env.PublishPrivateApi('CMD_DB', [
		'${BUILD_ROOT}/core/power/cmd_db/common',
		'${BUILD_ROOT}/core/power/cmd_db/target/${MSM_ID}',
		])

COMMONPATH = os.path.join('..', 'common')
if env['MSM_ID'] in ['Saipan']:
	TARGETPATH = os.path.join('..', 'target', env['CHIPSET_PMIC'])
else:
	TARGETPATH = os.path.join('..', 'target', env['MSM_ID'])

source_patterns = ['*.c', '*.cpp']
sources = []

#common sources
for root, dirnames, filenames in os.walk(COMMONPATH):
    matches = itertools.chain(*[fnmatch.filter(filenames, pattern) for pattern in source_patterns])
    matches = ['${BUILDPATH}' + os.path.join(root, filename)[2:] for filename in matches]
    sources.extend(matches)

#target sources
for root, dirnames, filenames in os.walk(TARGETPATH):
    matches = itertools.chain(*[fnmatch.filter(filenames, pattern) for pattern in source_patterns])
    matches = ['${BUILDPATH}' + os.path.join(root, filename)[2:] for filename in matches]
    sources.extend(matches)

# Adding settings files to R-init builder - the builder detects presence
# of any .rinit files
if 'USES_RINIT_PARSER' in env:
    rinit_path = '${BUILD_ROOT}/core/power/cmd_db/target/${MSM_ID}'
    if env.PathExists(rinit_path):
        env.AddRinitInfo('CORE_AOP', {'files' : rinit_path})

# Adding cmd_db arc export and hsrs for consistency check
if 'USES_CMD_DB_CHECK' in env:
    if env['BUILD_ID'] not in ['AAAAANAZO'] and \
       env['MSM_ID'] not in ['Saipan', 'stubs', '8350']:         # Once fixed remove Saipan check
        target_data_path = '${BUILD_ROOT}/core/power/cmd_db/scripts/${MSM_ID}'		
        target_data_path = env.RealPath(target_data_path)
        params = {
            'arc_cmd_db' : cmd_db_arc_files(target_data_path, True),
            'arc_hsr' : cmd_db_arc_files(target_data_path, False)
        }
        env.AddCmdDBCheck('CORE_AOP', params)

        # Adding manifest/output file for scons
        checker_op_files = ['${BUILDPATH}/target/${MSM_ID}/cmd_db_verify.txt']
        checker_out = env.CmdDBChecker(checker_op_files, None)
        sources.append(checker_out)


env.AddBinaryLibrary(['CORE_AOP'],'${BUILDPATH}/cmd_db', sources)
