#==============================================================================
# Core Utils Libs build script
#
# Copyright (c) 2009 - 2016 Qualcomm Technologies, Inc.
# All Rights Reserved.
# Confidential and Proprietary - Qualcomm Technologies, Inc.
#
# $Header$
#==============================================================================
Import('env')
env = env.Clone()

#-------------------------------------------------------------------------------
# Helper routines
#-------------------------------------------------------------------------------

import os
# Maps env tags to OS names
def determine_os_name( env ):
  os_name = 'unknown'
  if 'USES_L4' in env or 'FEATURE_L4' in env:
    os_name = 'l4'
  # Order of QURT and Blast checks important. QURT builds define BLAST as well    
  elif 'USES_QURT' in env or 'FEATURE_QURT' in env:
    os_name = 'qurt'
  elif 'USES_BLAST' in env or 'FEATURE_BLAST' in env:
    os_name = 'blast'
  elif 'USES_REX' in env or 'FEATURE_REX' in env:
    os_name = 'rex'
  elif 'USES_PTHREAD' in env or 'FEATURE_PTHREAD' in env:
    os_name = 'pthread'
  print "** INFO: UTILS scons thinks the OS is", os_name
  return os_name


def find_os_file( env, base, files ):
  """
  Find the os-sepcific file or list of files under the given base.
  This looks for the os-specific file using the following search
  path and order:
 
  base/<os>/<file>
  base/dal/<file>

  This allows the build to selectively override individual files per OS,
  but have a default version if there is no override.
  """
  os_files = []
  found = []

  # Find OS specific overrides or the default
  search_path = [ os.path.join( base, determine_os_name( env ) ),
                  os.path.join( base, 'dal' ) ]
  
  for file in files:
    for path in search_path:
      if os.path.isfile( os.path.join( SRCPATH, path, file ) ):
        os_files.append( os.path.join( '${BUILDPATH}', path, file ) )
        found.append( file )
        break

  if len(files) != len(found) and 'SENSORS_DD_DEV_FLAG' not in env:
    assert False, "** ERROR: UTILS Scons can't find required OS file(s) %s" % list(set(files)-set(found))

  return os_files

#-------------------------------------------------------------------------------
# Source PATH
#-------------------------------------------------------------------------------
SRCPATH = ".."

env.VariantDir('${BUILDPATH}', SRCPATH, duplicate=0)

#-------------------------------------------------------------------------------
# Include dependencies
#-------------------------------------------------------------------------------
env.RequirePublicApi(['SERVICES','DEBUGTOOLS','POWER','STORAGE','KERNEL', 'SYSTEMDRIVERS'])
env.RequireRestrictedApi(['POWER','DAL','SERVICES','DEBUGTOOLS','KERNEL'])
env.RequireProtectedApi(['POWER_UTILS'])

#-------------------------------------------------------------------------------
# Sources, libraries
#-------------------------------------------------------------------------------

CORE_UTILS_SOURCES = [
    '${BUILDPATH}/src/CoreCond.c',
    '${BUILDPATH}/src/CoreEventNotification.c',
    '${BUILDPATH}/src/CoreHeap.c',
    '${BUILDPATH}/src/CoreMutex.c',
    '${BUILDPATH}/src/CoreOpaqueHandle.c',
    '${BUILDPATH}/src/CorePool.c',
    '${BUILDPATH}/src/CorePRSMList.c',
    '${BUILDPATH}/src/CoreReference.c',
    '${BUILDPATH}/src/CoreTLSEmu.c',
    '${BUILDPATH}/src/CoreWorkContainer.c',
    '${BUILDPATH}/src/CoreWorkQueue.c',
    '${BUILDPATH}/src/CoreErr.c',
    '${BUILDPATH}/src/asic/8974/apps/CoreCpu.c',
    find_os_file( env, 'os', ['CoreMutexImpl.c', 'CoreCondImpl.c', 
                              'CorePropertyImpl.c', 'CoreThreadImpl.c'])
    ]

if env['PROC'] in ['arm11', 'scorpion', 'arm9', 'qdsp6', 'sparrow']:
   CORE_UTILS_SOURCES.append('${BUILDPATH}/src/CoreConfig.c')

   # ADSP does not take the following files
   if env.DetermineProcessorName() not in ['adsp']:
     CORE_UTILS_SOURCES.append('${BUILDPATH}/src/CoreIni.c')
     CORE_UTILS_SOURCES.append('${BUILDPATH}/src/CoreFile.c')

if env['PROC'] in ['qdsp6']:
   CORE_UTILS_SOURCES.append('${BUILDPATH}/src/CoreAtomicOps.c')
if env['PROC'] in ['arm11', 'scorpion', 'sparrow']:
   CORE_UTILS_SOURCES.append('${BUILDPATH}/src/CoreIntrinsicsARM.s')
   CORE_UTILS_SOURCES.append('${BUILDPATH}/src/CoreAtomicOps.s')
elif env['PROC'] in ['arm9']:
   CORE_UTILS_SOURCES.append('${BUILDPATH}/src/CoreIntrinsicsARM.c')
   CORE_UTILS_SOURCES.append('${BUILDPATH}/src/CoreAtomicOps.c')
elif env['PROC'] in ['arm7']:
   CORE_UTILS_SOURCES.append('${BUILDPATH}/src/CoreIntrinsicsARM.c')
   CORE_UTILS_SOURCES.append('${BUILDPATH}/src/CoreAtomicOps.c')
   env.Append(CPPDEFINES=['FEATURE_CORE_LOW_MEM',
                          'FEATURE_NO_WORKLOOPS'])

#-------------------------------------------------------------------------------
# Compile and create library
#-------------------------------------------------------------------------------
image_tags = ['SINGLE_IMAGE', 'CBSP_SINGLE_IMAGE',
              'MODEM_IMAGE', 'CBSP_MODEM_IMAGE',
              'APPS_IMAGE', 'CBSP_APPS_IMAGE',
              'WCN_IMAGE', 'CBSP_WCN_IMAGE', 'CORE_WCN',
              'QDSP6_SW_IMAGE', 'CBSP_QDSP6_SW_IMAGE',
              'CORE_QDSP6_SENSOR_SW',
              'RPM_IMAGE', 'CORE_SPS', 'CORE_USER_PD',
              'CORE_ROOT_PD', 'CORE_QDSP6_SW']

try:
  env.AddBinaryLibrary(image_tags, '${BUILDPATH}/utils', CORE_UTILS_SOURCES)
except AttributeError:
  core_utils_obj = env.Object(CORE_UTILS_SOURCES)
  core_utils_lib = env.Library("${BUILDPATH}/utils", core_utils_obj)
  env.AddLibsToImage(image_tags, core_utils_lib)
