#######################################################################
# 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)
