]> git.cworth.org Git - apitrace/blobdiff - cli/cli_resources.cpp
retrace: Implement glxCopySubBufferMESA
[apitrace] / cli / cli_resources.cpp
index 255a98b662a700a440750a62e200553c4b193b16..d6d0a55d6d5038fe773c41a163934f93f88bf3bf 100644 (file)
 
 #include "cli_resources.hpp"
 
+#ifdef __GLIBC__
+
+#include <dlfcn.h>
+
+static bool
+tryLib(const os::String &path, bool verbose)
+{
+    void *handle = dlopen(path.str(), RTLD_LAZY);
+    bool exists = (handle != NULL);
+    if (verbose) {
+        if (exists) {
+            std::cerr << "info: found " << path.str() << "\n";
+        } else {
+            std::cerr << "info: did not find " << dlerror() << "\n";
+        }
+    }
+    if (exists)
+        dlclose(handle);
+    return exists;
+}
+#endif
+
+static bool
+tryPath(const os::String &path, bool verbose)
+{
+    bool exists = path.exists();
+    if (verbose) {
+        std::cerr << "info: " << (exists ? "found" : "did not find") << " " << path.str() << "\n";
+    }
+    return exists;
+}
 
 os::String
-findProgram(const char*programFilename)
+findProgram(const char *programFilename, bool verbose)
 {
     os::String programPath;
 
@@ -43,7 +74,7 @@ findProgram(const char*programFilename)
 
     programPath = processDir;
     programPath.join(programFilename);
-    if (programPath.exists()) {
+    if (tryPath(programPath, verbose)) {
         return programPath;
     }
 
@@ -51,7 +82,7 @@ findProgram(const char*programFilename)
     // Try absolute install directory
     programPath = APITRACE_PROGRAMS_INSTALL_DIR;
     programPath.join(programFilename);
-    if (programPath.exists()) {
+    if (tryPath(programPath, verbose)) {
         return programPath;
     }
 #endif
@@ -60,7 +91,7 @@ findProgram(const char*programFilename)
 }
 
 os::String
-findWrapper(const char *wrapperFilename)
+findWrapper(const char *wrapperFilename, bool verbose)
 {
     os::String wrapperPath;
 
@@ -70,11 +101,29 @@ findWrapper(const char *wrapperFilename)
     // Try relative build directory
     // XXX: Just make build and install directory layout match
     wrapperPath = processDir;
+#if defined(APITRACE_CONFIGURATION_SUBDIR)
+    // Go from `Debug\apitrace.exe` to `wrappers\Debug\foo.dll` on MSVC builds.
+    wrapperPath.join("..");
     wrapperPath.join("wrappers");
+    wrapperPath.join(APITRACE_CONFIGURATION_SUBDIR);
+#else
+    wrapperPath.join("wrappers");
+#endif
+    wrapperPath.join(wrapperFilename);
+    if (tryPath(wrapperPath, verbose)) {
+        return wrapperPath;
+    }
+
+#ifdef __GLIBC__
+    // We want to take advantage of $LIB dynamic string token expansion in
+    // glibc dynamic linker to handle multilib layout for us
+    wrapperPath = processDir;
+    wrapperPath.join("../$LIB/apitrace/wrappers");
     wrapperPath.join(wrapperFilename);
-    if (wrapperPath.exists()) {
+    if (tryLib(wrapperPath, verbose)) {
         return wrapperPath;
     }
+#endif
 
     // Try relative install directory
     wrapperPath = processDir;
@@ -86,7 +135,7 @@ findWrapper(const char *wrapperFilename)
     wrapperPath.join("../lib/apitrace/wrappers");
 #endif
     wrapperPath.join(wrapperFilename);
-    if (wrapperPath.exists()) {
+    if (tryPath(wrapperPath, verbose)) {
         return wrapperPath;
     }
 
@@ -94,7 +143,7 @@ findWrapper(const char *wrapperFilename)
     // Try absolute install directory
     wrapperPath = APITRACE_WRAPPERS_INSTALL_DIR;
     wrapperPath.join(wrapperFilename);
-    if (wrapperPath.exists()) {
+    if (tryPath(wrapperPath, verbose)) {
         return wrapperPath;
     }
 #endif
@@ -103,7 +152,7 @@ findWrapper(const char *wrapperFilename)
 }
 
 os::String
-findScript(const char *scriptFilename)
+findScript(const char *scriptFilename, bool verbose)
 {
     os::String scriptPath;
 
@@ -112,12 +161,14 @@ findScript(const char *scriptFilename)
 
     // Try relative build directory
     // XXX: Just make build and install directory layout match
-    scriptPath = processDir;
+#if defined(APITRACE_SOURCE_DIR)
+    scriptPath = APITRACE_SOURCE_DIR;
     scriptPath.join("scripts");
     scriptPath.join(scriptFilename);
-    if (scriptPath.exists()) {
+    if (tryPath(scriptPath, verbose)) {
         return scriptPath;
     }
+#endif
 
     // Try relative install directory
     scriptPath = processDir;
@@ -129,7 +180,7 @@ findScript(const char *scriptFilename)
     scriptPath.join("../lib/apitrace/scripts");
 #endif
     scriptPath.join(scriptFilename);
-    if (scriptPath.exists()) {
+    if (tryPath(scriptPath, verbose)) {
         return scriptPath;
     }
 
@@ -137,7 +188,7 @@ findScript(const char *scriptFilename)
     // Try absolute install directory
     scriptPath = APITRACE_SCRIPTS_INSTALL_DIR;
     scriptPath.join(scriptFilename);
-    if (scriptPath.exists()) {
+    if (tryPath(scriptPath, verbose)) {
         return scriptPath;
     }
 #endif