Do not embed build directory in binaries
authorVictor Westerhuis <victor@westerhu.is>
Sat, 19 Nov 2022 20:45:39 +0000 (21:45 +0100)
committerBastian Germann <bage@debian.org>
Tue, 18 Mar 2025 19:39:02 +0000 (20:39 +0100)
This makes the opencv core module build reproducibly.

Gbp-Pq: Name 0008-Do-not-embed-build-directory-in-binaries.patch

modules/core/CMakeLists.txt
modules/core/include/opencv2/core/private.hpp
modules/core/include/opencv2/core/utility.hpp
modules/core/src/utils/datafile.cpp

index 16f32c994a65799f94f3c248935d2999c0b1e384..960b64917a54c4ced3d96dbe2e974897871a1d3b 100644 (file)
@@ -215,16 +215,6 @@ if(OPENCV_OTHER_INSTALL_PATH)
 ")
 endif()
 
-set(OPENCV_DATA_CONFIG_STR "${OPENCV_DATA_CONFIG_STR}
-#define OPENCV_BUILD_DIR \"${CMAKE_BINARY_DIR}\"
-")
-
-file(RELATIVE_PATH SOURCE_DIR_RELATIVE ${CMAKE_BINARY_DIR} ${CMAKE_SOURCE_DIR})
-set(OPENCV_DATA_CONFIG_STR "${OPENCV_DATA_CONFIG_STR}
-#define OPENCV_DATA_BUILD_DIR_SEARCH_PATHS \\
-    \"${SOURCE_DIR_RELATIVE}/\"
-")
-
 if(WIN32)
   file(RELATIVE_PATH INSTALL_DATA_DIR_RELATIVE "${CMAKE_INSTALL_PREFIX}/${OPENCV_BIN_INSTALL_PATH}" "${CMAKE_INSTALL_PREFIX}/${OPENCV_OTHER_INSTALL_PATH}")
 else()
index 02ac1ba1e3cb44bfe49426c9c88c9df9ab40a0be..cd06be273ee8a51b23bfac0747ba74dfda60120a 100644 (file)
@@ -825,10 +825,10 @@ Search directories:
 2. Check path specified by configuration parameter with "_HINT" suffix (name of environment variable).
 3. Check path specified by configuration parameter (name of environment variable).
    If parameter value is not empty and nothing is found then stop searching.
-4. Detects build/install path based on:
+4. Detects install path based on:
    a. current working directory (CWD)
    b. and/or binary module location (opencv_core/opencv_world, doesn't work with static linkage)
-5. Scan `<source>/{,data}` directories if build directory is detected or the current directory is in source tree.
+5. Scan `<source>/{,data}` directories if the current directory is in source tree.
 6. Scan `<install>/share/OpenCV` directory if install directory is detected.
 
 @param relative_path Relative path to data file
index e491352bcf6cc24a808860b34102435a8d325a2b..5d913c8fe29006a4ad9c71d6e1e0e73d47bd1d1c 100644 (file)
@@ -1165,10 +1165,10 @@ Search directories:
 2. OPENCV_SAMPLES_DATA_PATH_HINT environment variable
 3. OPENCV_SAMPLES_DATA_PATH environment variable
    If parameter value is not empty and nothing is found then stop searching.
-4. Detects build/install path based on:
+4. Detects install path based on:
    a. current working directory (CWD)
    b. and/or binary module location (opencv_core/opencv_world, doesn't work with static linkage)
-5. Scan `<source>/{,data,samples/data}` directories if build directory is detected or the current directory is in source tree.
+5. Scan `<source>/{,data,samples/data}` directories if the current directory is in source tree.
 6. Scan `<install>/share/OpenCV` directory if install directory is detected.
 
 @see cv::utils::findDataFile
index 3af83a5d8f20ee230696e6fa377046abbb20bebd..6bda857d2877a5a34936ab5b1f1d03466a188e6e 100644 (file)
@@ -280,32 +280,8 @@ cv::String findDataFile(const cv::String& relative_path,
 
 
     // Steps: 4, 5, 6
-    cv::String cwd = utils::fs::getcwd();
-    cv::String build_dir(OPENCV_BUILD_DIR);
-    bool has_tested_build_directory = false;
-    if (isSubDirectory(build_dir, cwd) || isSubDirectory(utils::fs::canonical(build_dir), utils::fs::canonical(cwd)))
-    {
-        CV_LOG_DEBUG(NULL, "utils::findDataFile(): the current directory is build sub-directory: " << cwd);
-        const char* build_subdirs[] = { OPENCV_DATA_BUILD_DIR_SEARCH_PATHS };
-        for (size_t k = 0; k < sizeof(build_subdirs)/sizeof(build_subdirs[0]); k++)
-        {
-            CV_LOG_DEBUG(NULL, "utils::findDataFile(): <build>/" << build_subdirs[k]);
-            cv::String datapath = utils::fs::join(build_dir, build_subdirs[k]);
-            if (utils::fs::isDirectory(datapath))
-            {
-                for(size_t i = search_subdir.size(); i > 0; i--)
-                {
-                    const cv::String& subdir = search_subdir[i - 1];
-                    cv::String prefix = utils::fs::join(datapath, subdir);
-                    TRY_FILE_WITH_PREFIX(prefix);
-                }
-            }
-        }
-        has_tested_build_directory = true;
-    }
-
     cv::String source_dir;
-    cv::String try_source_dir = cwd;
+    cv::String try_source_dir = utils::fs::getcwd();
     for (int levels = 0; levels < 3; ++levels)
     {
         if (utils::fs::exists(utils::fs::join(try_source_dir, "modules/core/include/opencv2/core/version.hpp")))
@@ -341,28 +317,6 @@ cv::String findDataFile(const cv::String& relative_path,
         CV_LOG_INFO(NULL, "Can't detect module binaries location");
     }
 
-    if (!has_tested_build_directory &&
-        (isSubDirectory(build_dir, module_path) || isSubDirectory(utils::fs::canonical(build_dir), utils::fs::canonical(module_path)))
-    )
-    {
-        CV_LOG_DEBUG(NULL, "utils::findDataFile(): the binary module directory is build sub-directory: " << module_path);
-        const char* build_subdirs[] = { OPENCV_DATA_BUILD_DIR_SEARCH_PATHS };
-        for (size_t k = 0; k < sizeof(build_subdirs)/sizeof(build_subdirs[0]); k++)
-        {
-            CV_LOG_DEBUG(NULL, "utils::findDataFile(): <build>/" << build_subdirs[k]);
-            cv::String datapath = utils::fs::join(build_dir, build_subdirs[k]);
-            if (utils::fs::isDirectory(datapath))
-            {
-                for(size_t i = search_subdir.size(); i > 0; i--)
-                {
-                    const cv::String& subdir = search_subdir[i - 1];
-                    cv::String prefix = utils::fs::join(datapath, subdir);
-                    TRY_FILE_WITH_PREFIX(prefix);
-                }
-            }
-        }
-    }
-
 #if defined OPENCV_INSTALL_DATA_DIR_RELATIVE
     if (!module_path.empty())  // require module path
     {