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."""

    args = [ 'git', 'rev-parse', '--short=10', 'HEAD' ]
    try:
        (commit, foo) = subprocess.Popen(args, stdout=subprocess.PIPE).communicate()
    except:
        print "Warning: exception in write_git_sha1_h_file()"
        # git log command didn't work
        if not os.path.exists(filename):
            dirname = os.path.dirname(filename)
            if dirname and not os.path.exists(dirname):
                os.makedirs(dirname)
            # create an empty file if none already exists
            f = open(filename, "w")
            f.close()
        return

    # note that commit[:-1] removes the trailing newline character
    commit = '#define MESA_GIT_SHA1 "git-%s"\n' % commit[:-1]
    tempfile = "git_sha1.h.tmp"
    f = open(tempfile, "w")
    f.write(commit)
    f.close()
    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')

