[PATCH] RFC: New "apitrace diff" command.

Carl Worth cworth at cworth.org
Wed Nov 2 17:31:02 PDT 2011


This is a requset-for-comments commit.

The stuff changing the name of the define for the install directory should
obviously be a separate commit, for example.

And the stubbed out support for the Windows platform should be fixed as well.

This is one example of a command that merely executes an existing,
external script.

I would be happy for any comments.
---

So, obviously not ready to commit in its current form, but I thought I
would at least let you see what I'm working on.

This is on top of the previously-mentioned apitrace-trace branch, and
is also available in the rfc-apitrace-diff branch of my repository.

-Carl

 CMakeLists.txt       |   25 +++++++-----
 cli/CMakeLists.txt   |    2 +
 cli/cli.hpp          |    5 ++
 cli/cli_common.cpp   |   59 ++++++++++++++++++++++++++++
 cli/cli_diff.cpp     |  106 ++++++++++++++++++++++++++++++++++++++++++++++++++
 cli/cli_main.cpp     |    1 +
 cli/cli_trace.cpp    |   47 ----------------------
 common/os.hpp        |    3 +
 common/os_posix.cpp  |   16 ++++++++
 common/os_win32.cpp  |    8 ++++
 gui/traceprocess.cpp |    4 +-
 scripts/tracediff.sh |    2 +-
 12 files changed, 218 insertions(+), 60 deletions(-)
 create mode 100644 cli/cli_common.cpp
 create mode 100644 cli/cli_diff.cpp

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 6caf62e..d659efa 100755
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -194,9 +194,9 @@ endif ()
 if (APPLE)
     # MacOSX uses fat binaries, so no need to have per-architecture wrapper
     # directories
-    set (WRAPPER_INSTALL_DIR lib/apitrace)
+    set (LIB_INSTALL_DIR lib/apitrace)
 else ()
-    set (WRAPPER_INSTALL_DIR lib/apitrace/${CMAKE_SYSTEM_PROCESSOR})
+    set (LIB_INSTALL_DIR lib/apitrace/${CMAKE_SYSTEM_PROCESSOR})
 endif ()
 
 # Expose the binary/install directories to source
@@ -207,7 +207,7 @@ endif ()
 add_definitions(
     -DAPITRACE_BINARY_DIR="${CMAKE_BINARY_DIR}"
     -DAPITRACE_INSTALL_PREFIX="${CMAKE_INSTALL_PREFIX}"
-    -DAPITRACE_WRAPPER_INSTALL_DIR="${CMAKE_INSTALL_PREFIX}/${WRAPPER_INSTALL_DIR}"
+    -DAPITRACE_LIB_INSTALL_DIR="${CMAKE_INSTALL_PREFIX}/${LIB_INSTALL_DIR}"
 )
 
 
@@ -285,7 +285,7 @@ if (WIN32)
             RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/wrappers
             LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/wrappers
         )
-        install (TARGETS ddraw LIBRARY DESTINATION ${WRAPPER_INSTALL_DIR})
+        install (TARGETS ddraw LIBRARY DESTINATION ${LIB_INSTALL_DIR})
     endif (DirectX_D3D_INCLUDE_DIR)
 
     # d3d8.dll
@@ -302,7 +302,7 @@ if (WIN32)
             RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/wrappers
             LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/wrappers
         )
-        install (TARGETS d3d8 LIBRARY DESTINATION ${WRAPPER_INSTALL_DIR})
+        install (TARGETS d3d8 LIBRARY DESTINATION ${LIB_INSTALL_DIR})
     endif (DirectX_D3D8_INCLUDE_DIR AND DirectX_D3DX9_INCLUDE_DIR)
 
     # d3d9.dll
@@ -319,7 +319,7 @@ if (WIN32)
             RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/wrappers
             LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/wrappers
         )
-        install (TARGETS d3d9 LIBRARY DESTINATION ${WRAPPER_INSTALL_DIR})
+        install (TARGETS d3d9 LIBRARY DESTINATION ${LIB_INSTALL_DIR})
     endif (DirectX_D3DX9_INCLUDE_DIR)
 
     # d3d10.dll
@@ -336,7 +336,7 @@ if (WIN32)
             RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/wrappers
             LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/wrappers
         )
-        install (TARGETS d3d10 LIBRARY DESTINATION ${WRAPPER_INSTALL_DIR})
+        install (TARGETS d3d10 LIBRARY DESTINATION ${LIB_INSTALL_DIR})
     endif (DirectX_D3D10_INCLUDE_DIR)
 
     # opengl32.dll
@@ -356,7 +356,7 @@ if (WIN32)
         RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/wrappers
         LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/wrappers
     )
-    install (TARGETS wgltrace LIBRARY DESTINATION ${WRAPPER_INSTALL_DIR})
+    install (TARGETS wgltrace LIBRARY DESTINATION ${LIB_INSTALL_DIR})
 
 elseif (APPLE)
     # OpenGL framework
@@ -383,7 +383,7 @@ elseif (APPLE)
 
     target_link_libraries (cgltrace dl)
 
-    install (TARGETS cgltrace LIBRARY DESTINATION ${WRAPPER_INSTALL_DIR})
+    install (TARGETS cgltrace LIBRARY DESTINATION ${LIB_INSTALL_DIR})
 else ()
     # libGL.so
     add_custom_command (
@@ -412,7 +412,7 @@ else ()
 
     target_link_libraries (glxtrace dl ${X11_X11_LIB})
 
-    install (TARGETS glxtrace LIBRARY DESTINATION ${WRAPPER_INSTALL_DIR})
+    install (TARGETS glxtrace LIBRARY DESTINATION ${LIB_INSTALL_DIR})
 endif ()
 
 
@@ -476,6 +476,11 @@ endif ()
 install (TARGETS glretrace RUNTIME DESTINATION bin) 
 
 ##############################################################################
+# Scripts
+
+install (PROGRAMS ${CMAKE_CURRENT_SOURCE_DIR}/scripts/tracediff.sh DESTINATION ${LIB_INSTALL_DIR}/scripts)
+
+##############################################################################
 # CLI
 
 add_subdirectory(cli)
diff --git a/cli/CMakeLists.txt b/cli/CMakeLists.txt
index fc52527..b9f2c50 100644
--- a/cli/CMakeLists.txt
+++ b/cli/CMakeLists.txt
@@ -1,5 +1,7 @@
 add_executable (apitrace
     cli_main.cpp
+    cli_common.cpp
+    cli_diff.cpp
     cli_dump.cpp
     cli_trace.cpp
 )
diff --git a/cli/cli.hpp b/cli/cli.hpp
index 9ab1600..9439216 100644
--- a/cli/cli.hpp
+++ b/cli/cli.hpp
@@ -28,6 +28,7 @@
 #ifndef _APITRACE_CLI_HPP_
 #define _APITRACE_CLI_HPP_
 
+#include "os_path.hpp"
 
 struct Command {
     const char *name;
@@ -40,7 +41,11 @@ struct Command {
     Function function;
 };
 
+extern const Command diff_command;
 extern const Command dump_command;
 extern const Command trace_command;
 
+os::Path
+find_private_binary(const char *filename);
+
 #endif /* _APITRACE_CLI_HPP_ */
diff --git a/cli/cli_common.cpp b/cli/cli_common.cpp
new file mode 100644
index 0000000..a2a63af
--- /dev/null
+++ b/cli/cli_common.cpp
@@ -0,0 +1,59 @@
+/*********************************************************************
+ *
+ * Copyright 2011 Intel Corporation
+ * All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use, copy,
+ * modify, merge, publish, distribute, sublicense, and/or sell copies
+ * of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ *********************************************************************/
+
+#include <iostream>
+
+#include "cli.hpp"
+
+os::Path
+find_private_binary(const char *filename)
+{
+    /* First look in the same directory from which this process is
+     * running, (to support developers running a compiled program that
+     * has not been installed. */
+    os::Path process_dir = os::getProcessName();
+
+    process_dir.trimFilename();
+
+    os::Path complete = process_dir;
+    complete.join(filename);
+
+    if (os::fileExists(complete))
+        return complete;
+
+    /* Second, look in the directory for installed wrappers. */
+    complete = APITRACE_LIB_INSTALL_DIR;
+    complete.join(filename);
+
+    if (os::fileExists(complete))
+        return complete;
+
+    std::cerr << "Error: Cannot find " << filename << " (looked in " <<
+        APITRACE_LIB_INSTALL_DIR << ").\n";
+
+    return "";
+}
diff --git a/cli/cli_diff.cpp b/cli/cli_diff.cpp
new file mode 100644
index 0000000..550e813
--- /dev/null
+++ b/cli/cli_diff.cpp
@@ -0,0 +1,106 @@
+/*********************************************************************
+ *
+ * Copyright 2011 Intel Corporation
+ * All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use, copy,
+ * modify, merge, publish, distribute, sublicense, and/or sell copies
+ * of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ *********************************************************************/
+
+#include <string.h>
+#include <iostream>
+
+#include "cli.hpp"
+
+static const char *synopsis = "Identify differences between two traces.";
+
+static void
+usage(void)
+{
+    std::cout
+        << "usage: apitrace diff <trace-1> <trace-2>\n"
+        << synopsis << "\n"
+        "\n"
+        "    Both input files should be the result of running 'apitrace trace'.\n";
+}
+
+static int
+command(int argc, char *argv[])
+{
+    int i;
+
+    for (i = 0; i < argc; ++i) {
+        const char *arg = argv[i];
+
+        if (arg[0] != '-') {
+            break;
+        }
+
+        if (!strcmp(arg, "--")) {
+            i++;
+            break;
+        } else if (!strcmp(arg, "--help")) {
+            usage();
+            return 0;
+        } else {
+            std::cerr << "error: unknown option " << arg << "\n";
+            usage();
+            return 1;
+        }
+    }
+
+    if (argc - i != 2) {
+        std::cerr << "Error: diff requires exactly two trace files as arguments.\n";
+        usage();
+        return 1;
+    }
+
+    char *file1, *file2;
+
+    file1 = argv[i];
+    file2 = argv[i+1];
+
+    os::Path command = find_private_binary("scripts/tracediff.sh");
+
+    char* args[4];
+
+    args[0] = (char *) command.str();
+    args[1] = file1;
+    args[2] = file2;
+    args[3] = NULL;
+
+#ifdef _WIN32
+    std::cerr << "The 'apitrace diff' command is not yet supported on this O/S.\n";
+#else
+    execv(command.str(), args);
+#endif
+
+    std::cerr << "Error: Failed to execute " << argv[0] << "\n";
+
+    return 1;
+}
+
+const Command diff_command = {
+    "diff",
+    synopsis,
+    usage,
+    command
+};
diff --git a/cli/cli_main.cpp b/cli/cli_main.cpp
index a3abf54..421748c 100644
--- a/cli/cli_main.cpp
+++ b/cli/cli_main.cpp
@@ -66,6 +66,7 @@ const Command help_command = {
 };
 
 static const Command * commands[] = {
+    &diff_command,
     &dump_command,
     &trace_command,
     &help_command
diff --git a/cli/cli_trace.cpp b/cli/cli_trace.cpp
index 4eb9a15..0da08ed 100644
--- a/cli/cli_trace.cpp
+++ b/cli/cli_trace.cpp
@@ -29,8 +29,6 @@
 
 #include "cli.hpp"
 
-#include "os_path.hpp"
-
 static const char *synopsis = "Generate a new trace by executing the given program.";
 
 static void
@@ -59,51 +57,6 @@ usage(void)
 #endif
 
 static int
-file_exists(const char *path)
-{
-    struct stat st;
-    int err;
-
-    err = stat(path, &st);
-    if (err)
-        return 0;
-
-    if (! S_ISREG(st.st_mode))
-        return 0;
-
-    return 1;
-}
-
-static os::Path
-find_private_binary(const char *filename)
-{
-    /* First look in the same directory from which this process is
-     * running, (to support developers running a compiled program that
-     * has not been installed. */
-    os::Path process_dir = os::getProcessName();
-
-    process_dir.trimFilename();
-
-    os::Path complete = process_dir;
-    complete.join(filename);
-
-    if (file_exists(complete))
-        return complete;
-
-    /* Second, look in the directory for installed wrappers. */
-    complete = APITRACE_WRAPPER_INSTALL_DIR;
-    complete.join(filename);
-
-    if (file_exists(complete))
-        return complete;
-
-    std::cerr << "Error: Cannot find " << filename << " (looked in " <<
-        APITRACE_WRAPPER_INSTALL_DIR << ").\n";
-
-    return "";
-}
-
-static int
 do_trace_posix(int argc, char *argv[])
 {
     os::Path binary = find_private_binary(CLI_TRACE_BINARY);
diff --git a/common/os.hpp b/common/os.hpp
index 6a3b8c8..24e3b1f 100644
--- a/common/os.hpp
+++ b/common/os.hpp
@@ -84,6 +84,9 @@ void abort(void);
 void setExceptionCallback(void (*callback)(void));
 void resetExceptionCallback(void);
 
+
+int fileExists(const char *path);
+
 } /* namespace os */
 
 #endif /* _OS_HPP_ */
diff --git a/common/os_posix.cpp b/common/os_posix.cpp
index 21a7e36..9ea531a 100644
--- a/common/os_posix.cpp
+++ b/common/os_posix.cpp
@@ -245,5 +245,21 @@ resetExceptionCallback(void)
     gCallback = NULL;
 }
 
+int
+fileExists(const char *path)
+{
+    struct stat st;
+    int err;
+
+    err = stat(path, &st);
+    if (err)
+        return 0;
+
+    if (! S_ISREG(st.st_mode))
+        return 0;
+
+    return 1;
+}
+
 } /* namespace os */
 
diff --git a/common/os_win32.cpp b/common/os_win32.cpp
index f33e175..f2c07b9 100644
--- a/common/os_win32.cpp
+++ b/common/os_win32.cpp
@@ -25,6 +25,7 @@
 
 #include <windows.h>
 
+#include <iostream>
 #include <assert.h>
 #include <string.h>
 #include <stdio.h>
@@ -180,5 +181,12 @@ resetExceptionCallback(void)
     gCallback = NULL;
 }
 
+int
+fileExists(const char *path)
+{
+    std::cerr << "Internal error: No support yet for fileExists() on this O/S.\n";
+
+    return 0;
+}
 
 } /* namespace os */
diff --git a/gui/traceprocess.cpp b/gui/traceprocess.cpp
index 6bdd1c4..a648441 100644
--- a/gui/traceprocess.cpp
+++ b/gui/traceprocess.cpp
@@ -18,8 +18,8 @@ findPreloader()
         return libPath;
 #endif
 
-#ifdef APITRACE_WRAPPER_INSTALL_DIR
-    libPath = QString::fromLatin1(APITRACE_WRAPPER_INSTALL_DIR "/glxtrace.so");
+#ifdef APITRACE_LIB_INSTALL_DIR
+    libPath = QString::fromLatin1(APITRACE_LIB_INSTALL_DIR "/glxtrace.so");
     fi = QFileInfo(libPath);
     if (fi.exists())
         return libPath;
diff --git a/scripts/tracediff.sh b/scripts/tracediff.sh
index b3b9220..57d59f8 100755
--- a/scripts/tracediff.sh
+++ b/scripts/tracediff.sh
@@ -26,7 +26,7 @@
 
 set -e
 
-APITRACE=${APITRACE:-`dirname "$0"`/../apitrace}
+APITRACE=${APITRACE:-apitrace}
 
 $APITRACE dump
 
-- 
1.7.7



More information about the apitrace mailing list