perf test: Support external tests for separate objdir

Extend the searching for the test files so that it works when running
perf from a separate objdir, and also when the perf executable is
symlinked.

Signed-off-by: Andi Kleen <ak@linux.intel.com>
Acked-by: Namhyung Kim <namhyung@kernel.org>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Link: https://lore.kernel.org/r/20240813213651.1057362-2-ak@linux.intel.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
Andi Kleen
2024-08-13 14:36:49 -07:00
committed by Arnaldo Carvalho de Melo
parent 00dc514612
commit f133c76409

View File

@@ -29,16 +29,45 @@
static int shell_tests__dir_fd(void)
{
char path[PATH_MAX], *exec_path;
static const char * const devel_dirs[] = { "./tools/perf/tests/shell", "./tests/shell", };
struct stat st;
char path[PATH_MAX], path2[PATH_MAX], *exec_path;
static const char * const devel_dirs[] = {
"./tools/perf/tests/shell",
"./tests/shell",
"./source/tests/shell"
};
int fd;
char *p;
for (size_t i = 0; i < ARRAY_SIZE(devel_dirs); ++i) {
int fd = open(devel_dirs[i], O_PATH);
fd = open(devel_dirs[i], O_PATH);
if (fd >= 0)
return fd;
}
/* Use directory of executable */
if (readlink("/proc/self/exe", path2, sizeof path2) < 0)
return -1;
/* Follow another level of symlink if there */
if (lstat(path2, &st) == 0 && (st.st_mode & S_IFMT) == S_IFLNK) {
scnprintf(path, sizeof(path), path2);
if (readlink(path, path2, sizeof path2) < 0)
return -1;
}
/* Get directory */
p = strrchr(path2, '/');
if (p)
*p = 0;
scnprintf(path, sizeof(path), "%s/tests/shell", path2);
fd = open(path, O_PATH);
if (fd >= 0)
return fd;
scnprintf(path, sizeof(path), "%s/source/tests/shell", path2);
fd = open(path, O_PATH);
if (fd >= 0)
return fd;
/* Then installed path. */
exec_path = get_argv_exec_path();
scnprintf(path, sizeof(path), "%s/tests/shell", exec_path);