[PATCH i-g-t] lib/igt_core: Make build reproducible
From: Kamil Konieczny <hidden>
Date: 2026-09-09 13:34:16
Subsystem:
library code, the rest · Maintainers:
Andrew Morton, Linus Torvalds
Reference to build path break reproducibility, as a build could be done on different directories. It is used only when loading a data file containing screen image. Remove it from the function which use it and make a build reproducible. Also, try to make it work also for a developer running test file from a build dir by loading a data file from different possible locations. Closes: https://gitlab.freedesktop.org/drm/igt-gpu-tools/-/work_items/190 Cc: Karthik B S <redacted> Cc: Swati Sharma <redacted> Cc: "Zbigniew Kempczyński" <redacted> Signed-off-by: Kamil Konieczny <redacted> --- lib/igt_core.c | 63 ++++++++++++++++++++++++++++++++++++------------- lib/igt_core.h | 3 +-- lib/meson.build | 1 - 3 files changed, 47 insertions(+), 20 deletions(-)
diff --git a/lib/igt_core.c b/lib/igt_core.c
index af9d93762..87c1a7105 100644
--- a/lib/igt_core.c
+++ b/lib/igt_core.c@@ -366,6 +366,8 @@ enum { static int igt_exitcode = IGT_EXIT_SUCCESS; static const char *command_str; +static const char *command_full_path; +static char command_base_path[PATH_MAX]; static char* igt_log_domain_filter; static struct {
@@ -1125,6 +1127,17 @@ static int common_init(int *argc, char **argv, IGT_INIT_LIST_HEAD(&subgroup_descriptions); igt_vec_init(&hook_strs, sizeof(char *)); + command_full_path = argv[0]; + snprintf(command_base_path, ARRAY_SIZE(command_base_path), "%s", argv[0]); + if (strrchr(command_base_path, '/')) { + char *end = strrchr(command_base_path, '/'); + + *end = 0; + } + + if (!strlen(command_base_path)) + strcpy(command_base_path, "."); + command_str = argv[0]; if (strrchr(command_str, '/')) command_str = strrchr(command_str, '/') + 1;
@@ -3361,31 +3374,47 @@ void igt_reset_timeout(void) } /** - * __igt_fopen_data: - * @igt_srcdir: Directory path for source files. - * @igt_datadir: Directory path for data files - * @igt_imgdir: Directory path for image files. + * __igt_fopen_data_file: + * @dir: Directory path for source files. + * @rel: Relative path. * @filename: Name of the file to be opened. * - * This function attempts to open a data file from a list of specified - * directories. A file pointer to the opened file. If the file cannot - * be opened, it returns NULL and logs a critical error message. - * + * This function attempts to open a data file from a specified directory dir/dir2/. + * Returns a file pointer to the opened file or NULL. */ -FILE *__igt_fopen_data(const char *igt_srcdir, const char *igt_datadir, - const char *igt_imgdir, const char *filename) +static FILE *__igt_fopen_data_file(const char *dir, const char *rel, const char *filename) { char path[PATH_MAX]; FILE *fp; - const char *dirs[] = {igt_datadir, igt_srcdir, igt_imgdir, - getenv("IGT_DATA_PATH"), "./data"}; - for (int i = 0; i < ARRAY_SIZE(dirs); i++) { + snprintf(path, ARRAY_SIZE(path), "%s/%s/%s", dir, rel, filename); + fp = fopen(path, "r"); + + return fp; +} + +/** + * igt_fopen_data: + * @filename: Name of the file to be opened. + * + * This function attempts to open a data file from a list of known directories. + * + * Returns a file pointer to the opened file. If the file cannot be opened, it + * returns NULL and logs a critical error message. + */ +FILE *igt_fopen_data(const char *filename) +{ + static const char *igt_datadir = IGT_DATADIR; + static const char *igt_srcdir = IGT_SRCDIR; + static const char *reldirs[] = {".", "..", "./data", "../data", "../../data" }; + const char *dirs[] = {igt_datadir, igt_srcdir, command_base_path, + getenv("IGT_DATA_PATH"), "."}; + FILE *fp = NULL; + + for (int i = 0; i < ARRAY_SIZE(dirs) && !fp; i++) { if (dirs[i]) { - snprintf(path, sizeof(path), "%s/%s", dirs[i], filename); - fp = fopen(path, "r"); - if (fp) - break; + for (int j = 0; j < ARRAY_SIZE(reldirs) && !fp; j++) + fp = __igt_fopen_data_file(dirs[i], reldirs[j], filename); } }
diff --git a/lib/igt_core.h b/lib/igt_core.h
index afaf35aa8..c0908a8ed 100644
--- a/lib/igt_core.h
+++ b/lib/igt_core.h@@ -1532,8 +1532,7 @@ FILE *__igt_fopen_data(const char *igt_srcdir, const char *igt_datadir, * Open a datafile for test, first try from installation directory, * then from build directory, and finally from current directory. */ -#define igt_fopen_data(filename) \ - __igt_fopen_data(IGT_SRCDIR, IGT_DATADIR, IGT_IMGDIR, filename) +FILE *igt_fopen_data(const char *filename); int igt_system(const char *command); int igt_system_quiet(const char *command);
diff --git a/lib/meson.build b/lib/meson.build
index a7cde027e..917234ce8 100644
--- a/lib/meson.build
+++ b/lib/meson.build@@ -370,7 +370,6 @@ foreach f: lib_sources '-DIGT_DATADIR="@0@"'.format(join_paths(prefix, datadir)), '-DIGT_SRCDIR="@0@"'.format(srcdir), '-DIGT_LOG_DOMAIN="@0@"'.format(f.split('.')[0]), - '-DIGT_IMGDIR="@0@"'.format(imgdir), ]) lib_intermediates += lib
--
2.55.0