import filecmp
import os
import subprocess

Import('*')

if env['platform'] == 'windows':
    SConscript('getopt/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 = [ 'sh', Dir('#').abspath + '/bin/git_sha1_gen.sh' ]
        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')

