from sys import executable as python_cmd
import distutils.version

Import('*')

if not env['llvm']:
    print 'warning: LLVM disabled: not building llvmpipe'
    Return()

env = env.Clone()

env.Append(CPPPATH = ['.'])

env.CodeGenerate(
	target = 'lp_tile_soa.c',
	script = 'lp_tile_soa.py',
	source = ['#src/gallium/auxiliary/util/u_format.csv'],
	command = python_cmd + ' $SCRIPT $SOURCE > $TARGET'
)

# XXX: Our dependency scanner only finds depended modules in relative dirs.
env.Depends('lp_tile_soa.c', [
    '#src/gallium/auxiliary/util/u_format_parse.py', 
    '#src/gallium/auxiliary/util/u_format_pack.py', 
])


lp_tile_soa_os = env.SharedObject('lp_tile_soa.c')


llvmpipe = env.ConvenienceLibrary(
	target = 'llvmpipe',
	source = [
		'lp_bld_alpha.c',
		'lp_bld_blend.c',
		'lp_bld_blend_aos.c',
		'lp_bld_blend_logicop.c',
		'lp_bld_blend_soa.c',
		'lp_bld_depth.c',
		'lp_bld_interp.c',
		'lp_clear.c',
		'lp_context.c',
		'lp_draw_arrays.c',
		'lp_fence.c',
		'lp_flush.c',
		'lp_jit.c',
		'lp_memory.c',
		'lp_perf.c',
		'lp_query.c',
		'lp_rast.c',
		'lp_rast_debug.c',
		'lp_rast_tri.c',
		'lp_scene.c',
		'lp_scene_queue.c',
		'lp_screen.c',
		'lp_setup.c',
		'lp_setup_line.c',
		'lp_setup_point.c',
		'lp_setup_tri.c',
		'lp_setup_vbuf.c',
		'lp_state_blend.c',
		'lp_state_clip.c',
		'lp_state_derived.c',
		'lp_state_fs.c',
		'lp_state_setup.c',
		'lp_state_gs.c',
		'lp_state_rasterizer.c',
		'lp_state_sampler.c',
                'lp_state_so.c',
		'lp_state_surface.c',
		'lp_state_vertex.c',
		'lp_state_vs.c',
		'lp_surface.c',
		'lp_tex_sample.c',
		'lp_texture.c',
		'lp_tile_image.c',
        lp_tile_soa_os,
	])

env.Alias('llvmpipe', llvmpipe)


if not env['embedded']:
    env = env.Clone()

    env.Prepend(LIBS = [llvmpipe] + gallium)

    tests = [
        'format',
        'blend',
        'conv',
        'printf',
    ]

    if not env['msvc']:
        tests.append('arit')

    for test in tests:
        testname = 'lp_test_' + test
        target = env.Program(
            target = testname,
            source = [testname + '.c', 'lp_test_main.c'],
        )
        env.InstallProgram(target)
        
        # http://www.scons.org/wiki/UnitTests
        alias = env.Alias(testname, [target], target[0].abspath)
        AlwaysBuild(alias)

Export('llvmpipe')
