#######################################################################
# SConscript for shared-glapi/es1api/es2api

from sys import executable as python_cmd

Import('*')

def mapi_objects(env, printer, mode):
    """Return mapi objects built for the given printer and mode."""
    mapi_sources = {
        'glapi': [
            'entry.c',
            'mapi_glapi.c',
            'stub.c',
            'table.c',
            'u_current.c',
            'u_execmem.c',
        ],
        'bridge': ['entry.c'],
    }
    mapi_defines = {
        'glapi': ['MAPI_MODE_GLAPI'],
        'bridge': ['MAPI_MODE_BRIDGE'],
    }

    header_name = '%s-tmp.h' % (printer)

    # generate ABI header
    header = env.CodeGenerate(
        target = header_name,
        script = '../mapi/mapi_abi.py',
        source = '../glapi/gen/gl_and_es_API.xml',
        command = python_cmd + ' $SCRIPT ' + \
                '--printer %s --mode lib $SOURCE > $TARGET' % (printer),
    )

    cpppath = [
        header[0].dir,
        '#/include',
        '#/src/mapi',
    ]
    
    cppdefines = mapi_defines[mode] + [
        'MAPI_ABI_HEADER=\\"%s\\"' % (header_name),
    ]

    if env['platform'] == 'windows':
        if mode == 'glapi':
            cppdefines += [
                '_GLAPI_DLL_EXPORTS', # declare _glapi_* as __declspec(dllexport) in glapi.h
            ]
        else:
            cppdefines += [
                '_GDI32_', # prevent gl* being declared __declspec(dllimport) in MS headers
                'BUILD_GL32', # declare gl* as __declspec(dllexport) in Mesa headers
            ]

    objects = []
    for s in mapi_sources[mode]:
        o = env.SharedObject(
            target = '%s-%s' % (printer, s[:-2]),
            source = '../mapi/' + s,
            CPPPATH = cpppath,
            CPPDEFINES = cppdefines,
        )
        objects.append(o[0])

    env.Depends(objects, header)

    return objects

env = env.Clone()

env['SHLIBPREFIX'] = 'lib'
env['LIBPREFIX'] = 'lib'

shared_glapi_objects = mapi_objects(env, 'shared-glapi', 'glapi')
shared_glapi = env.SharedLibrary(
    target = 'glapi',
    source = shared_glapi_objects,
)

# manually add LIBPREFIX on windows
if env['platform'] == 'windows':
    libs = ['libglapi']
else:
    libs = ['glapi']

es1api_objects = mapi_objects(env, 'es1api', 'bridge')
es1api = env.SharedLibrary(
    target = 'GLESv1_CM',
    source = es1api_objects,
    LIBPATH = ['.'],
    LIBS = libs,
)

es2api_objects = mapi_objects(env, 'es2api', 'bridge')
es2api = env.SharedLibrary(
    target = 'GLESv2',
    source = es2api_objects,
    LIBPATH = ['.'],
    LIBS = libs,
)

env.InstallSharedLibrary(shared_glapi, version=(0, 0, 0))
env.InstallSharedLibrary(es1api, version=(1, 0, 0))
env.InstallSharedLibrary(es2api, version=(2, 0, 0))

if env['platform'] == 'windows':
    shared_glapi = env.FindIxes(shared_glapi, 'LIBPREFIX', 'LIBSUFFIX')
else:
    shared_glapi = env.FindIxes(shared_glapi, 'SHLIBPREFIX', 'SHLIBSUFFIX')

# build glapi bridge as a convenience libarary for libgl-xlib/libgl-gdi
bridge_glapi_objects = mapi_objects(env, 'glapi', 'bridge')
bridge_glapi = env.ConvenienceLibrary(
    target = 'glapi_bridge',
    source = bridge_glapi_objects,
)

Export(['shared_glapi', 'bridge_glapi'])
