# Copyright (c) 2009 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import os

# MkStub builder for autogenerated GLES2 API entry points
def MkStubEmitter(target, source, env):
  source.insert(0, "entry_points")
  source.insert(1, "mkstubs.py")
  return target, source
def MkStubGenerator(source, target, env, for_signature):
  arguments = " ".join(str(src) for src in source[2:])
  return "./mkstubs.py %s" % arguments
mk_stub_builder = Builder(emitter=MkStubEmitter,
                          generator=MkStubGenerator,
                          src_suffix=".in", suffix="")

env = Environment()
for key in Split('CC CXX AR RANLIB LD NM CFLAGS CCFLAGS'):
  value = os.environ.get(key)
  if value != None:
    env[key] = Split(value)
# Fix issue with scons not passing some vars through the environment.
for key in Split('SYSROOT'):
  if os.environ.has_key(key):
    env['ENV'][key] = os.environ[key]
env.Append(BUILDERS={"MkStub": mk_stub_builder},
           CCFLAGS=["-Iinclude", "-Wall"])

# Build Rules
env.MkStub(['gles2_stub.c.in'])

# Khronos recomended names
env.SharedLibrary('libEGL.so', 'egl_stub.c')
env.SharedLibrary('libGLESv2.so', 'gles2_stub.c')

# Other commonly used names
env.SharedLibrary('libegl13.so', 'egl_stub.c')
env.SharedLibrary('libgles20.so', 'gles2_stub.c')


