Use path to apitrace executable instead.
authorJosé Fonseca <jose.r.fonseca@gmail.com>
Fri, 2 Mar 2012 11:50:44 +0000 (11:50 +0000)
committerJosé Fonseca <jose.r.fonseca@gmail.com>
Fri, 2 Mar 2012 11:50:44 +0000 (11:50 +0000)
CMakeLists.txt
README.markdown
apps/CMakeLists.txt
driver.py

index 1cd54f0da69cd31295ad939b29fb32a0e56dabe6..cd7f9d114453ba84dc6a11b4434f614370746e9c 100644 (file)
@@ -64,12 +64,7 @@ if (MSVC)
        add_definitions (-wd4244) # conversion' conversion from 'type1' to 'type2', possible loss of data
 endif ()
 
-if (NOT APITRACE_BINARY_DIR) 
-    set (APITRACE_BINARY_DIR "${CMAKE_BINARY_DIR}/.." CACHE PATH "apitrace build directory")
-endif ()
-if (NOT EXISTS ${APITRACE_BINARY_DIR})
-    message (SEND_ERROR "Invalid APITRACE_BINARY_DIR")
-endif ()
+find_program (APITRACE_EXECUTABLE apitrace DOC "apitrace executable")
 
 enable_testing()
 
index 91ff21af18d6e0d4e1e2980231a61d2951ff4d55..28204282f236c039f845b8a1af123426c77c837c 100644 (file)
@@ -6,10 +6,16 @@ In addition to apitrace requirements, it also requires:
 
 * GLEW
 
-To run the test suite do:
+To run the test suite do on Unices:
 
-    cmake -DAPITRACE_BINARY_DIR=/path/to/apitrace/build/ .
+    cmake -DAPITRACE_EXECUTABLE=/path/to/apitrace -H. -B./build
     export CTEST_OUTPUT_ON_FAILURE=1
-    make all test
+    make -C ./build all test
 
-Detailed log will be written to `Testing/Temporary/LastTest.log`.
+Or on Windows:
+
+    cmake -G "Visual Studio 10" -H. -B.\build
+    cmake --build .\build --target ALL_BUILD
+    cmake --build .\build --target RUN_TESTS
+
+A detailed log will be written to `Testing/Temporary/LastTest.log`.
index 4d425f649e224ff6710ca712f61a077829a92a09..5736c21f65af7d1cea1e97208f4ef9da5ddd09f0 100644 (file)
@@ -14,7 +14,7 @@ function (ADD_APP_TEST)
         NAME app_${TEST_NAME}
         COMMAND
         python ${CMAKE_SOURCE_DIR}/driver.py
-            --build ${APITRACE_BINARY_DIR}
+            --apitrace ${APITRACE_EXECUTABLE}
             --api ${api}
             --ref-dump ${CMAKE_CURRENT_SOURCE_DIR}/${TEST_REF}
             --
index 2eab23ca2de18e60d7d6369c9890f3999f9c7adc..1d005b6e09df9429fb3deb99d044758476ec7a2c 100755 (executable)
--- a/driver.py
+++ b/driver.py
@@ -31,7 +31,6 @@ import optparse
 import os.path
 import platform
 import re
-import shutil
 import subprocess
 import sys
 import time
@@ -87,26 +86,52 @@ def popen(command, *args, **kwargs):
     return subprocess.Popen(command, *args, env=env, **kwargs)
 
 
-def _get_build_path(path):
-    if options.build is not None:
-        path = os.path.abspath(os.path.join(options.build, path))
+def which(executable):
+    dirs = os.environ['PATH'].split(os.path.pathsep)
+    for dir in dirs:
+        path = os.path.join(dir, executable)
+        if os.path.exists(path):
+            return path
+    return None
+
+
+def _get_bin_path():
+    if os.path.exists(options.apitrace):
+        apitrace_abspath = os.path.abspath(options.apitrace)
+    else:
+        apitrace_abspath = which(options.apitrace)
+        if apitrace_abspath is None:
+            sys.stderr.write('error: could not determine the absolute path of\n' % options.apitrace)
+            sys.exit(1)
+    return os.path.dirname(apitrace_abspath)
+
+
+def _get_build_program(program):
+    bin_path = _get_bin_path()
+    if platform.system() == 'Windows':
+        program += '.exe'
+    path = os.path.join(bin_path, program)
     if not os.path.exists(path):
         sys.stderr.write('error: %s does not exist\n' % path)
         sys.exit(1)
     return path
 
-def _get_build_program(program):
-    if platform.system() == 'Windows':
-        program += '.exe'
-    return _get_build_path(program)
-
-def _get_source_path(path):
-    cache = _get_build_path('CMakeCache.txt')
-    for line in open(cache, 'rt'):
-        if line.startswith('CMAKE_HOME_DIRECTORY:INTERNAL='):
-            _, source_root = line.strip().split('=', 1)
-            return os.path.join(source_root, path)
-    return None
+def _get_scripts_path():
+    bin_path = _get_bin_path()
+
+    try_paths = [
+        'scripts',
+        '../lib/scripts',
+        '../lib/apitrace/scripts',
+    ]
+
+    for try_path in try_paths:
+        path = os.path.join(bin_path, try_path)
+        if os.path.exists(path):
+            return os.path.abspath(path)
+
+    sys.stderr.write('error: could not find scripts directory\n')
+    sys.exit(1)
 
 
 class TraceChecker:
@@ -263,36 +288,23 @@ class TestCase:
         cmd = self.cmd
         env = os.environ.copy()
         
-        system = platform.system()
-        local_wrapper = None
-        if system == 'Windows':
-            wrapper = _get_build_path('wrappers/opengl32.dll')
-            local_wrapper = os.path.join(os.path.dirname(self.cmd[0]), os.path.basename(wrapper))
-            shutil.copy(wrapper, local_wrapper)
-            env['TRACE_FILE'] = str(self.trace_file)
-        else:
-            apitrace = _get_build_program('apitrace')
-            cmd = [
-                apitrace, 'trace', 
-                '--api', self.api_map[self.api],
-                '--output', self.trace_file,
-                '--'
-            ] + cmd
+        cmd = [
+            options.apitrace, 'trace', 
+            '--api', self.api_map[self.api],
+            '--output', self.trace_file,
+            '--'
+        ] + cmd
         if self.max_frames is not None:
             env['TRACE_FRAMES'] = str(self.max_frames)
 
-        try:
-            p = popen(cmd, env=env, cwd=self.cwd)
-            p.wait()
-        finally:
-            if local_wrapper is not None:
-                os.remove(local_wrapper)
+        p = popen(cmd, env=env, cwd=self.cwd)
+        p.wait()
 
         if not os.path.exists(self.trace_file):
             fail('no trace file generated\n')
     
     def checkTrace(self):
-        cmd = [_get_build_program('apitrace'), 'dump', '--color=never', self.trace_file]
+        cmd = [options.apitrace, 'dump', '--color=never', self.trace_file]
         p = popen(cmd, stdout=subprocess.PIPE)
 
         checker = TraceChecker(p.stdout, self.ref_dump, self.verbose)
@@ -488,6 +500,10 @@ class TestCase:
 def main():
     global options
 
+    default_apitrace = 'apitrace'
+    if platform.system() == 'Windows':
+        default_apitrace += '.exe'
+
     # Parse command line options
     optparser = optparse.OptionParser(
         usage='\n\t%prog [options] -- [TRACE|PROGRAM] ...',
@@ -502,9 +518,9 @@ def main():
         type='string', dest='api', default='gl',
         help='api to trace')
     optparser.add_option(
-        '-B', '--build', metavar='PATH',
-        type='string', dest='build', default='..',
-        help='path to apitrace build')
+        '--apitrace', metavar='PROGRAM',
+        type='string', dest='apitrace', default=default_apitrace,
+        help='path to apitrace executable')
     optparser.add_option(
         '-C', '--directory', metavar='PATH',
         type='string', dest='cwd', default=None,
@@ -525,7 +541,9 @@ def main():
     if not os.path.exists(options.results):
         os.makedirs(options.results)
 
-    sys.path.insert(0, _get_source_path('scripts'))
+    print _get_scripts_path()
+
+    sys.path.insert(0, _get_scripts_path())
 
     test = TestCase()
     test.verbose = options.verbose