#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;
programPath = processDir;
programPath.join(programFilename);
- if (programPath.exists()) {
+ if (tryPath(programPath, verbose)) {
return programPath;
}
// Try absolute install directory
programPath = APITRACE_PROGRAMS_INSTALL_DIR;
programPath.join(programFilename);
- if (programPath.exists()) {
+ if (tryPath(programPath, verbose)) {
return programPath;
}
#endif
}
os::String
-findWrapper(const char *wrapperFilename)
+findWrapper(const char *wrapperFilename, bool verbose)
{
os::String wrapperPath;
// 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 (wrapperPath.exists()) {
+ 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 (tryLib(wrapperPath, verbose)) {
+ return wrapperPath;
+ }
+#endif
+
// Try relative install directory
wrapperPath = processDir;
#if defined(_WIN32)
wrapperPath.join("../lib/apitrace/wrappers");
#endif
wrapperPath.join(wrapperFilename);
- if (wrapperPath.exists()) {
+ if (tryPath(wrapperPath, verbose)) {
return wrapperPath;
}
// Try absolute install directory
wrapperPath = APITRACE_WRAPPERS_INSTALL_DIR;
wrapperPath.join(wrapperFilename);
- if (wrapperPath.exists()) {
+ if (tryPath(wrapperPath, verbose)) {
return wrapperPath;
}
#endif
}
os::String
-findScript(const char *scriptFilename)
+findScript(const char *scriptFilename, bool verbose)
{
os::String scriptPath;
scriptPath = APITRACE_SOURCE_DIR;
scriptPath.join("scripts");
scriptPath.join(scriptFilename);
- if (scriptPath.exists()) {
+ if (tryPath(scriptPath, verbose)) {
return scriptPath;
}
#endif
scriptPath.join("../lib/apitrace/scripts");
#endif
scriptPath.join(scriptFilename);
- if (scriptPath.exists()) {
+ if (tryPath(scriptPath, verbose)) {
return scriptPath;
}
// Try absolute install directory
scriptPath = APITRACE_SCRIPTS_INSTALL_DIR;
scriptPath.join(scriptFilename);
- if (scriptPath.exists()) {
+ if (tryPath(scriptPath, verbose)) {
return scriptPath;
}
#endif