import filecmp
import os
import subprocess
from sys import executable as python_cmd

Import('*')

if env['platform'] == 'windows':
    SConscript('getopt/SConscript')

SConscript('util/xmlpool/SConscript')
SConscript('util/SConscript')
SConscript('compiler/SConscript')

if env['hostonly']:
    # We are just compiling the things necessary on the host for cross
    # compilation
    Return()


def write_git_sha1_h_file(filename):
    """Mesa looks for a git_sha1.h file at compile time in order to display
    the current git hash id in the GL_VERSION string.  This function tries
    to retrieve the git hashid and write the header file.  An empty file
    will be created if anything goes wrong."""

    tempfile = "git_sha1.h.tmp"
    with open(tempfile, "w") as f:
        args = [ python_cmd, Dir('#').abspath + '/bin/git_sha1_gen.py' ]
        try:
            subprocess.Popen(args, stdout=f).wait()
        except:
            print("Warning: exception in write_git_sha1_h_file()")
            return

    if not os.path.exists(filename) or not filecmp.cmp(tempfile, filename):
        # The filename does not exist or it's different from the new file,
        # so replace old file with new.
        if os.path.exists(filename):
            os.remove(filename)
        os.rename(tempfile, filename)
    return


# Create the git_sha1.h header file
write_git_sha1_h_file("git_sha1.h")
# and update CPPPATH so the git_sha1.h header can be found
env.Append(CPPPATH = ["#" + env['build_dir']])



if env['platform'] != 'windows':
    SConscript('loader/SConscript')

# When env['gles'] is set, the targets defined in mapi/glapi/SConscript are not
# used.  libgl-xlib and libgl-gdi adapt themselves to use the targets defined
# in mapi/glapi-shared/SConscript.  mesa/SConscript also adapts itself to
# enable OpenGL ES support.
SConscript('mapi/glapi/gen/SConscript')
SConscript('mapi/glapi/SConscript')

# Haiku C++ libGL dispatch (renderers depend on libgl)
if env['platform'] in ['haiku']:
    SConscript('hgl/SConscript')

SConscript('mesa/SConscript')

if not env['embedded']:
    if env['platform'] not in ('cygwin', 'darwin', 'freebsd', 'haiku', 'windows'):
        SConscript('glx/SConscript')
    if env['platform'] == 'haiku':
        SConscript('egl/SConscript')

    if env['gles']:
        SConscript('mapi/shared-glapi/SConscript')

SConscript('gallium/SConscript')

