#######################################################################
# Top-level SConstruct
#
# For example, invoke scons as
#
#   scons build=debug llvm=yes machine=x86
#
# to set configuration variables. Or you can write those options to a file
# named config.py:
#
#   # config.py
#   build='debug'
#   llvm=True
#   machine='x86'
#
# Invoke
#
#   scons -h
#
# to get the full list of options. See scons manpage for more info.
#

from __future__ import print_function
import os
import os.path
import sys
import SCons.Util

import common

#######################################################################
# Minimal scons version

EnsureSConsVersion(2, 4)
EnsurePythonVersion(2, 7)


#######################################################################
# Configuration options

opts = Variables('config.py')
common.AddOptions(opts)

env = Environment(
	options = opts,
	tools = ['gallium'],
	toolpath = ['#scons'],
	ENV = os.environ,
)

# XXX: This creates a many problems as it saves...
#opts.Save('config.py', env)

# Backwards compatability with old target configuration variable
try:
    targets = ARGUMENTS['targets']
except KeyError:
    pass
else:
    targets = targets.split(',')
    print('scons: warning: targets option is deprecated; pass the targets on their own such as')
    print()
    print('  scons %s' % ' '.join(targets))
    print()
    COMMAND_LINE_TARGETS.append(targets)


Help(opts.GenerateHelpText(env))


#######################################################################
# Print a deprecation warning for using scons on non-windows

if common.host_platform != 'windows' and env['platform'] != 'windows':
    if env['force_scons']:
        print("WARNING: Scons is deprecated for non-windows platforms (including cygwin) "
              "please use meson instead.", file=sys.stderr)
    else:
        print("ERROR: Scons is deprecated for non-windows platforms (including cygwin) "
              "please use meson instead. If you really need to use scons you "
              "can add `force_scons=1` to the scons command line.", file=sys.stderr)
        sys.exit(1)
else:
    print("WARNING: Scons support is in the process of being deprecated on "
          "on windows platforms (including mingw). If you haven't already "
          "please try using meson for windows builds. Be sure to report any "
          "issues you run into", file=sys.stderr)


#######################################################################
# Environment setup

with open("VERSION") as f:
  mesa_version = f.read().strip()
env.Append(CPPDEFINES = [
    ('PACKAGE_VERSION', '\\"%s\\"' % mesa_version),
    ('PACKAGE_BUGREPORT', '\\"https://gitlab.freedesktop.org/mesa/mesa/issues\\"'),
])

# Includes
env.Prepend(CPPPATH = [
	'#/include',
])
env.Append(CPPPATH = [
	'#/src/gallium/include',
	'#/src/gallium/auxiliary',
	'#/src/gallium/drivers',
	'#/src/gallium/winsys',
])

# for debugging
#print env.Dump()


# Add a check target for running tests
check = env.Alias('check')
env.AlwaysBuild(check)


#######################################################################
# Invoke host SConscripts
#
# For things that are meant to be run on the native host build machine, instead
# of the target machine.
#

# Create host environent
if env['crosscompile'] and not env['embedded']:
    host_env = Environment(
        options = opts,
        # no tool used
        tools = [],
        toolpath = ['#scons'],
        ENV = os.environ,
    )

    # Override options
    host_env['platform'] = common.host_platform
    host_env['machine'] = common.host_machine
    host_env['toolchain'] = 'default'
    host_env['llvm'] = False

    host_env.Tool('gallium')

    host_env['hostonly'] = True
    assert host_env['crosscompile'] == False

    target_env = env
    env = host_env
    Export('env')

    SConscript(
        'src/SConscript',
        variant_dir = host_env['build_dir'],
        duplicate = 0, # http://www.scons.org/doc/0.97/HTML/scons-user/x2261.html
    )

    env = target_env

Export('env')

#######################################################################
# Invoke SConscripts

# TODO: Build several variants at the same time?
# http://www.scons.org/wiki/SimultaneousVariantBuilds

SConscript(
	'src/SConscript',
	variant_dir = env['build_dir'],
	duplicate = 0 # http://www.scons.org/doc/0.97/HTML/scons-user/x2261.html
)


########################################################################
# List all aliases

try:
    from SCons.Node.Alias import default_ans
except ImportError:
    pass
else:
    aliases = sorted(default_ans.keys())
    env.Help('\n')
    env.Help('Recognized targets:\n')
    for alias in aliases:
        env.Help('    %s\n' % alias)
