#######################################################################
# 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
        '_GLAPI_NO_EXPORTS', # prevent _glapi_* from being declared __declspec(dllimport)
    ])

# 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['PROGRAM_NIR_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'
)

format_fallback = env.CodeGenerate(
      target = 'main/format_fallback.c',
      script = 'main/format_fallback.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])


# The marshal_generated.c file is generated from the GL/ES API.xml file
env.CodeGenerate(
    target = 'main/marshal_generated.c',
    script = GLAPI + 'gen/gl_marshal.py',
    source = [GLAPI + 'gen/gl_and_es_API.xml'] + env.Glob(GLAPI + 'gen/*.xml'),
    command = python_cmd + ' $SCRIPT -f $SOURCE > $TARGET'
    )

# The marshal_generated.h file is generated from the GL/ES API.xml file
env.CodeGenerate(
    target = 'main/marshal_generated.h',
    script = GLAPI + 'gen/gl_marshal_h.py',
    source = [GLAPI + 'gen/gl_and_es_API.xml'] + env.Glob(GLAPI + 'gen/*.xml'),
    command = python_cmd + ' $SCRIPT -f $SOURCE > $TARGET'
    )

#
# Libraries
#

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

env.Alias('mesa', mesa)

Export('mesa')

SConscript('drivers/SConscript')
