#!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.

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',
                    gem5_root + '/ext',
                    '#src',
                    '#examples/common',
                    ])

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

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

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

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

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

# the SystemC SConscript makes certain assumptions, we need to fulfill these
# assumptions before calling the SConscript.
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")

# An option not to link source files in the build directory.
# Not enabled by default.
AddOption('--no-duplicate-sources', action='store_false', default=True,
          dest='duplicate_sources',
          help='Do not create symlinks to sources in the build directory')

env.SConsignFile('build/systemc/sconsign')
SConscript(gem5_root + '/ext/systemc/SConscript',
           variant_dir='build/systemc',
           exports='env', duplicate=GetOption('duplicate_sources'))

# 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'],
                       duplicate=GetOption('duplicate_sources'))

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

Default(ex_master + ex_slave)
