#!python

# Copyright (c) 2016, Dresden University of Technology (TU Dresden)
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
# 1. Redistributions of source code must retain the above copyright notice,
#    this list of conditions and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in the
#    documentation and/or other materials provided with the distribution.
#
# 3. Neither the name of the copyright holder nor the names of its
#    contributors may be used to endorse or promote products derived from
#    this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER
# OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
# Authors: Christian Menard

import os
import sys


gem5_arch = 'ARM'
gem5_variant = 'opt'
#gem5_variant = 'debug'

gem5_root = Dir('#../..').srcnode().abspath

env = Environment()

#Make the gem5 root available in SConscripts
env['GEM5_ROOT'] = gem5_root

shlibsuffix = env['SHLIBSUFFIX']

# add include dirs
env.Append(CPPPATH=[gem5_root + '/build/' + gem5_arch,
                    gem5_root + '/util/systemc/gem5_within_systemc',
                    gem5_root + '/ext/systemc/src',
                    '#src',
                    '#examples/common',
                    ])

env.Append(CXXFLAGS=['-std=c++11',
                     '-DSC_INCLUDE_DYNAMIC_PROCESSES',
                     '-DTRACING_ON',
                     ])

if gem5_variant == 'debug':
    env.Append(CXXFLAGS=['-g', '-DDEBUG'])

deps = [] # keep track of all dependencies required for building the binaries

deps += SConscript('src/SConscript', variant_dir='build/tlm', exports='env')

deps += SConscript('examples/common/SConscript',
                   variant_dir='build/examples/common',
                   exports=['env'])

# the SystemC SConscript makes certain assumptions, we need to fulfill these
# assumptions before calling the SConscript.
main = env
sys.path.append(gem5_root + '/src/python')
AddOption('--no-colors', dest='use_colors', action='store_false',
          help="Don't add color to abbreviated scons output")

SConscript(gem5_root + '/ext/systemc/SConscript',
           variant_dir='build/systemc',
           exports='main')

# By adding libraries as dependencies instead of using LIBS, we avoid that
# the user needs to set the LD_LIBRARY_PATH
deps.append(File('build/systemc/libsystemc' + shlibsuffix))
deps.append(File(os.path.join(gem5_root, 'build', gem5_arch,
             'libgem5_' + gem5_variant + shlibsuffix)))

ex_master = SConscript('examples/master_port/SConscript',
                       variant_dir='build/examples/master_port',
                       exports=['env', 'deps'])

ex_slave = SConscript('examples/slave_port/SConscript',
                      variant_dir='build/examples/slave_port',
                      exports=['env', 'deps'])

Default(ex_master + ex_slave)
