import common

Import('*')

from sys import executable as python_cmd

env = env.Clone()

env.Prepend(CPPPATH = [
    '#src/mapi',
    '#src/mesa',
    '#src/glsl',
])

if env['platform'] == 'windows':
    env.Prepend(CPPPATH = ['#src/talloc'])

sources = [
    'glcpp/glcpp-lex.c',
    'glcpp/glcpp-parse.c',
    'glcpp/pp.c',
    'ast_expr.cpp',
    'ast_function.cpp',
    'ast_to_hir.cpp',
    'ast_type.cpp',
    'glsl_lexer.cpp',
    'glsl_parser.cpp',
    'glsl_parser_extras.cpp',
    'glsl_types.cpp',
    'glsl_symbol_table.cpp',
    'hir_field_selection.cpp',
    'ir_basic_block.cpp',
    'ir_clone.cpp',
    'ir_constant_expression.cpp',
    'ir.cpp',
    'ir_expression_flattening.cpp',
    'ir_function_can_inline.cpp',
    'ir_function.cpp',
    'ir_hierarchical_visitor.cpp',
    'ir_hv_accept.cpp',
    'ir_import_prototypes.cpp',
    'ir_print_visitor.cpp',
    'ir_reader.cpp',
    'ir_rvalue_visitor.cpp',
    'ir_set_program_inouts.cpp',
    'ir_validate.cpp',
    'ir_variable.cpp',
    'ir_variable_refcount.cpp',
    'linker.cpp',
    'link_functions.cpp',
    'loop_analysis.cpp',
    'loop_controls.cpp',
    'loop_unroll.cpp',
    'lower_discard.cpp',
    'lower_if_to_cond_assign.cpp',
    'lower_instructions.cpp',
    'lower_jumps.cpp',
    'lower_mat_op_to_vec.cpp',
    'lower_noise.cpp',
    'lower_variable_index_to_cond_assign.cpp',
    'lower_vec_index_to_cond_assign.cpp',
    'lower_vec_index_to_swizzle.cpp',
    'lower_vector.cpp',
    'opt_algebraic.cpp',
    'opt_constant_folding.cpp',
    'opt_constant_propagation.cpp',
    'opt_constant_variable.cpp',
    'opt_copy_propagation.cpp',
    'opt_dead_code.cpp',
    'opt_dead_code_local.cpp',
    'opt_dead_functions.cpp',
    'opt_discard_simplification.cpp',
    'opt_function_inlining.cpp',
    'opt_if_simplification.cpp',
    'opt_noop_swizzle.cpp',
    'opt_redundant_jumps.cpp',
    'opt_structure_splitting.cpp',
    'opt_swizzle_swizzle.cpp',
    'opt_tree_grafting.cpp',
    's_expression.cpp',
    'strtod.c',
] 


if env['platform'] == common.host_platform:
    if env['msvc']:
        env.Prepend(CPPPATH = ['#/src/getopt'])
        env.PrependUnique(LIBS = [getopt])

    if env['platform'] == 'windows':
        env.Prepend(CPPPATH = ['#src/talloc'])
        env.Prepend(LIBS = [talloc])
    else:
        env.Prepend(LIBS = ['talloc'])

    builtin_compiler = env.Program(
        target = 'builtin_compiler',
        source = sources + ['main.cpp', 'builtin_stubs.cpp',
                            '#src/mesa/program/hash_table.c',
                            '#src/mesa/program/symbol_table.c'],
    )

    builtin_glsl_function = env.CodeGenerate(
        target = 'builtin_function.cpp',
        script = 'builtins/tools/generate_builtins.py',
        source = builtin_compiler,
        command = python_cmd + ' $SCRIPT $SOURCE > $TARGET'
    )

    env.Depends(builtin_glsl_function, ['builtins/tools/generate_builtins.py', 'builtins/tools/texture_builtins.py'] + Glob('builtins/ir/*'))

    if env['msvc']:
        # There is no LD_LIBRARY_PATH equivalent on Windows. We need to ensure
        # talloc.dll is on the same dir as builtin_function.
        talloc_dll_src = talloc.dir.File('talloc.dll')
        talloc_dll_dst = builtin_compiler[0].dir.File('talloc.dll')
        talloc_dll = env.Command(talloc_dll_dst, talloc_dll_src, Copy(talloc_dll_dst, talloc_dll_src))
        env.Depends('builtin_function.cpp', talloc_dll)

    Export('builtin_glsl_function')

    if common.cross_compiling:
        Return()

sources += builtin_glsl_function

glsl = env.ConvenienceLibrary(
    target = 'glsl',
    source = sources,
)

Export('glsl')

# FIXME: We can't build the programs because there's a cyclic dependency between tis directory and src/mesa
Return()

env = env.Clone()

if env['platform'] == 'windows':
    env.PrependUnique(LIBS = [
        'user32',
    ])

env.Prepend(LIBS = [glsl, talloc])

env.Program(
    target = 'glsl2',
    source = [
        'main.cpp',
    ]
)

env.Program(
    target = 'glcpp',
    source = ['glcpp/glcpp.c'],
)
