#######################################################################
# SConscript for Mesa


Import('*')
from sys import executable as python_cmd

env = env.Clone()

env.MSVC2013Compat()

env.Append(CPPPATH = [
    '../compiler/nir',  # for generated nir_opcodes.h, etc
    '../compiler/glsl',  # for generated headers
    '#/src',
    Dir('../mapi'), # src/mapi build path
    '#/src/mapi',
    Dir('.'), # src/mesa build path
    '#/src/mesa',
    Dir('main'),  # src/mesa/main/ build path
    '#/src/mesa/main',
    '#/src/gallium/include',
    '#/src/gallium/auxiliary',
])

if env['platform'] == 'windows':
    env.Append(CPPDEFINES = [
        '_GDI32_', # prevent gl* being declared __declspec(dllimport) in MS headers
        'BUILD_GL32', # declare gl* as __declspec(dllexport) in Mesa headers
    ])
    if not env['gles']:
        # prevent _glapi_* from being declared __declspec(dllimport)
        env.Append(CPPDEFINES = ['_GLAPI_NO_EXPORTS'])
else:
    env.Append(CPPDEFINES = [
        ('HAVE_DLOPEN', '1'),
    ])

# parse Makefile.sources
source_lists = env.ParseSourceList('Makefile.sources')

env.Append(YACCFLAGS = ['-d', '-p', '_mesa_program_'])
env.CFile('program/lex.yy.c', 'program/program_lexer.l')
env.CFile('program/program_parse.tab.c', 'program/program_parse.y')

mesa_sources = (
    source_lists['MESA_FILES'] +
    source_lists['PROGRAM_FILES'] +
    source_lists['STATETRACKER_FILES']
)

GLAPI = '#src/mapi/glapi/'

get_hash_header = env.CodeGenerate(
      target = 'main/get_hash.h',
      script = 'main/get_hash_generator.py',
      source = [GLAPI + 'gen/gl_and_es_API.xml'] + env.Glob(GLAPI + 'gen/*.xml'),
      command = python_cmd + ' $SCRIPT ' + ' -f $SOURCE > $TARGET'
)

format_info = env.CodeGenerate(
      target = 'main/format_info.h',
      script = 'main/format_info.py',
      source = 'main/formats.csv',
      command = python_cmd + ' $SCRIPT ' + ' $SOURCE > $TARGET'
)

format_pack = env.CodeGenerate(
      target = 'main/format_pack.c',
      script = 'main/format_pack.py',
      source = 'main/formats.csv',
      command = python_cmd + ' $SCRIPT ' + ' $SOURCE > $TARGET'
)

format_unpack = env.CodeGenerate(
      target = 'main/format_unpack.c',
      script = 'main/format_unpack.py',
      source = 'main/formats.csv',
      command = python_cmd + ' $SCRIPT ' + ' $SOURCE > $TARGET'
)

#
# Assembly sources
#
if env['platform'] not in ('cygwin', 'darwin', 'windows', 'haiku'):
    if env['machine'] == 'x86':
        env.Append(CPPDEFINES = [
            'USE_X86_ASM',
            'USE_MMX_ASM',
            'USE_3DNOW_ASM',
            'USE_SSE_ASM',
        ])
        mesa_sources += source_lists['X86_FILES']
    elif env['machine'] == 'x86_64':
        env.Append(CPPDEFINES = [
            'USE_X86_64_ASM',
        ])
        mesa_sources += source_lists['X86_64_FILES']
    elif env['machine'] == 'sparc':
        mesa_sources += source_lists['SPARC_FILES']
    else:
        pass

    # Generate matypes.h
    if env['machine'] in ('x86', 'x86_64'):
        # See http://www.scons.org/wiki/UsingCodeGenerators
        gen_matypes = env.Program(
            target = 'gen_matypes',
            source = 'x86/gen_matypes.c',
        )
        matypes = env.Command(
            'matypes.h',
            gen_matypes,
            gen_matypes[0].abspath + ' > $TARGET',
        )
        # Add the dir containing the generated header (somewhere inside  the
        # build dir) to the include path
        env.Prepend(CPPPATH = [matypes[0].dir])


#
# Libraries
#

mesa = env.ConvenienceLibrary(
    target = 'mesa',
    source = mesa_sources,
)

env.Alias('mesa', mesa)

Export('mesa')

SConscript('drivers/SConscript')
