#!/usr/bin/python

# Copyright (c) 2011 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 common, logging, os, re, shutil
from autotest_lib.client.bin import test, utils

# changing this version number will force a delete of piglit/ and remake
version = 3

# TODO(ihf) piglit only builds on x86, Tegra2 only supports GLES
def setup(topdir):
    sysroot = os.environ.get("SYSROOT", "")
    # This gets the proper lib directory of "lib" or "lib64" from an
    # environment variable defined by the ebuild
    glut_libdir = os.environ.get("GLUT_LIBDIR", "")  + '/'
    if glut_libdir == "/":
        glut_libdir = '/usr/lib/'
    glut_libpath = sysroot + glut_libdir + 'libglut.so'
    logging.debug('INFO: piglit sysroot = %s' % sysroot)
    logging.debug('INFO: glut_libpath = %s' % glut_libpath)
    tarball = 'piglit.tar.gz'
    srcdir = os.path.join(topdir, 'src')
    tarball_path = os.path.join(srcdir, tarball)
    dst_path = os.path.join(topdir, 'piglit')
    # in-source build, clean/overwrite destination
    shutil.rmtree(dst_path, ignore_errors=True)
    if utils.target_is_x86():
        utils.extract_tarball_to_dir(tarball_path, dst_path)
        # patch in files now
        utils.system('patch -p0 < ' +
                     os.path.join(srcdir,
                     'monitor_tests_for_GPU_hang_and_SW_rasterization.patch'))
        utils.system('patch -p0 < ' +
                     os.path.join(srcdir,
                     'lib_path.patch'))

        shutil.copyfile(os.path.join(srcdir, 'cros-driver.tests'),
                        os.path.join(dst_path, 'tests/cros-driver.tests'))
        os.chdir(dst_path)
        # we have to tell cmake where to find glut
        cmd = 'cmake  -DCMAKE_FIND_ROOT_PATH=' + sysroot
        cmd += ' -DGLUT_INCLUDE_DIR=' + sysroot + '/usr/include'
        cmd += ' -DGLUT_glut_LIBRARY=' + glut_libpath
        # By default Piglit requires Waffle on Linux. Use GLUT instead.
        cmd += ' -DPIGLIT_USE_WAFFLE=0'
        utils.run(cmd)
        utils.make('-j %d' % utils.count_cpus())
        # strip symbols from all binaries to save space
        # TODO(ihf): strip everything once issue 30287 is resolved
        #utils.run("find bin/ -type f \! -name 'fbo-depth-sample-compare' "
        #          " -exec strip {} \;")
        os.chdir(topdir)
    else:
        logging.warning('WARNING: Skip piglit build. OpenGL/x86 boards only')
        dst_path = os.path.join(topdir, 'piglit')
        # still create an empty directory
        if not os.path.exists(dst_path):
            os.makedirs(dst_path)

pwd = os.getcwd()
# delete piglit directory when new version is set
utils.update_version(pwd+'/piglit', False, version, setup, pwd)
