From 2e9e55ed25c1d2675e191026037fcf73a301f496 Mon Sep 17 00:00:00 2001 From: Felix Geyer Date: Tue, 28 Jun 2016 19:39:45 +0200 Subject: [PATCH] Backport patch to make file(GLOB) order deterministic. * Backport patch to make file(GLOB) order deterministic. (Closes: #824263) - Add file_Sort_GLOB_results_to_make_it_deterministic.patch --- debian/changelog | 2 + ...LOB_results_to_make_it_deterministic.patch | 121 ++++++++++++++++++ debian/patches/series | 1 + 3 files changed, 124 insertions(+) create mode 100644 debian/patches/file_Sort_GLOB_results_to_make_it_deterministic.patch diff --git a/debian/changelog b/debian/changelog index 0d9e64ef6..ac2938ce0 100644 --- a/debian/changelog +++ b/debian/changelog @@ -2,6 +2,8 @@ cmake (3.5.2-2) UNRELEASED; urgency=medium * Make FindLibArchive compatible with libarchive 3.2. (Closes: #828092) - Add FindLibArchive_Support_libarchive_3.2.patch + * Backport patch to make file(GLOB) order deterministic. (Closes: #824263) + - Add file_Sort_GLOB_results_to_make_it_deterministic.patch -- Felix Geyer Tue, 28 Jun 2016 19:33:54 +0200 diff --git a/debian/patches/file_Sort_GLOB_results_to_make_it_deterministic.patch b/debian/patches/file_Sort_GLOB_results_to_make_it_deterministic.patch new file mode 100644 index 000000000..229fa76db --- /dev/null +++ b/debian/patches/file_Sort_GLOB_results_to_make_it_deterministic.patch @@ -0,0 +1,121 @@ +From edcccde7d65944b3744c4567bd1d452211829702 Mon Sep 17 00:00:00 2001 +From: Reiner Herrmann +Date: Sat, 14 May 2016 12:30:36 +0200 +Subject: [PATCH] file: Sort GLOB results to make it deterministic (#14491) + +Even though the `file(GLOB)` documentation specifically warns against +using it to collect a list of source files, projects often do it anyway. +Since it uses `readdir()`, the list of files will be unsorted. +This list is often passed directly to add_executable / add_library. +Linking binaries with an unsorted list will make it unreproducible, +which means that the produced binary will differ depending on the +unpredictable `readdir()` order. + +To solve those reproducibility issues in a lot of programs (which don't +explicitly `list(SORT)` the list manually), sort the resulting list of +the `file(GLOB)` command. + +A more detailed rationale about reproducible builds is available +[here](https://reproducible-builds.org/). +--- + Help/command/file.rst | 5 +++-- + Source/cmFileCommand.cxx | 1 + + Tests/RunCMake/file/GLOB.cmake | 3 --- + Tests/RunCMake/file/GLOB_RECURSE-cyclic-recursion.cmake | 3 --- + Tests/RunCMake/file/GLOB_RECURSE.cmake | 3 --- + 5 files changed, 4 insertions(+), 11 deletions(-) + +diff --git a/Help/command/file.rst b/Help/command/file.rst +index 96ac6c7..256d16d 100644 +--- a/Help/command/file.rst ++++ b/Help/command/file.rst +@@ -103,8 +103,9 @@ Generate a list of files that match the ```` and + store it into the ````. Globbing expressions are similar to + regular expressions, but much simpler. If ``RELATIVE`` flag is + specified, the results will be returned as relative paths to the given +-path. No specific order of results is defined. If order is important then +-sort the list explicitly (e.g. using the :command:`list(SORT)` command). ++path. No specific order of results is defined other than that it is ++deterministic. If order is important then sort the list explicitly ++(e.g. using the :command:`list(SORT)` command). + + By default ``GLOB`` lists directories - directories are omited in result if + ``LIST_DIRECTORIES`` is set to false. +diff --git a/Source/cmFileCommand.cxx b/Source/cmFileCommand.cxx +index 5363a99..4e72f36 100644 +--- a/Source/cmFileCommand.cxx ++++ b/Source/cmFileCommand.cxx +@@ -1028,6 +1028,7 @@ bool cmFileCommand::HandleGlobCommand(std::vector const& args, + + std::vector::size_type cc; + std::vector& files = g.GetFiles(); ++ std::sort(files.begin(), files.end()); + for ( cc = 0; cc < files.size(); cc ++ ) + { + if ( !first ) +diff --git a/Tests/RunCMake/file/GLOB.cmake b/Tests/RunCMake/file/GLOB.cmake +index 3d577e3..c524e42 100644 +--- a/Tests/RunCMake/file/GLOB.cmake ++++ b/Tests/RunCMake/file/GLOB.cmake +@@ -12,17 +12,14 @@ file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/test/dir 2/non_empty_dir/dir 2 subdir fi + file(GLOB CONTENT_LIST "${CMAKE_CURRENT_BINARY_DIR}/test/*/*") + list(LENGTH CONTENT_LIST CONTENT_COUNT) + message("content: ${CONTENT_COUNT} ") +-list(SORT CONTENT_LIST) + message("${CONTENT_LIST}") + + file(GLOB CONTENT_LIST LIST_DIRECTORIES true "${CMAKE_CURRENT_BINARY_DIR}/test/*/*") + list(LENGTH CONTENT_LIST CONTENT_COUNT) + message("content: ${CONTENT_COUNT} ") +-list(SORT CONTENT_LIST) + message("${CONTENT_LIST}") + + file(GLOB CONTENT_LIST LIST_DIRECTORIES false "${CMAKE_CURRENT_BINARY_DIR}/test/*/*") + list(LENGTH CONTENT_LIST CONTENT_COUNT) + message("content: ${CONTENT_COUNT} ") +-list(SORT CONTENT_LIST) + message("${CONTENT_LIST}") +diff --git a/Tests/RunCMake/file/GLOB_RECURSE-cyclic-recursion.cmake b/Tests/RunCMake/file/GLOB_RECURSE-cyclic-recursion.cmake +index a8c6784..fb8be42 100644 +--- a/Tests/RunCMake/file/GLOB_RECURSE-cyclic-recursion.cmake ++++ b/Tests/RunCMake/file/GLOB_RECURSE-cyclic-recursion.cmake +@@ -7,17 +7,14 @@ execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink "${CMAKE_CURRENT_BINA + file(GLOB_RECURSE CONTENT_LIST FOLLOW_SYMLINKS "${CMAKE_CURRENT_BINARY_DIR}/test/*") + list(LENGTH CONTENT_LIST CONTENT_COUNT) + message("content: ${CONTENT_COUNT} ") +-list(SORT CONTENT_LIST) + message("${CONTENT_LIST}") + + file(GLOB_RECURSE CONTENT_LIST LIST_DIRECTORIES false FOLLOW_SYMLINKS "${CMAKE_CURRENT_BINARY_DIR}/test/*") + list(LENGTH CONTENT_LIST CONTENT_COUNT) + message("content: ${CONTENT_COUNT} ") +-list(SORT CONTENT_LIST) + message("${CONTENT_LIST}") + + file(GLOB_RECURSE CONTENT_LIST LIST_DIRECTORIES true FOLLOW_SYMLINKS "${CMAKE_CURRENT_BINARY_DIR}/test/*") + list(LENGTH CONTENT_LIST CONTENT_COUNT) + message("content: ${CONTENT_COUNT} ") +-list(SORT CONTENT_LIST) + message("${CONTENT_LIST}") +diff --git a/Tests/RunCMake/file/GLOB_RECURSE.cmake b/Tests/RunCMake/file/GLOB_RECURSE.cmake +index 6db377b..530930f 100644 +--- a/Tests/RunCMake/file/GLOB_RECURSE.cmake ++++ b/Tests/RunCMake/file/GLOB_RECURSE.cmake +@@ -12,17 +12,14 @@ file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/test/dir 2/non_empty_dir/dir 2 subdir fi + file(GLOB_RECURSE CONTENT_LIST "${CMAKE_CURRENT_BINARY_DIR}/test/*/*") + list(LENGTH CONTENT_LIST CONTENT_COUNT) + message("content: ${CONTENT_COUNT} ") +-list(SORT CONTENT_LIST) + message("${CONTENT_LIST}") + + file(GLOB_RECURSE CONTENT_LIST LIST_DIRECTORIES false "${CMAKE_CURRENT_BINARY_DIR}/test/*/*") + list(LENGTH CONTENT_LIST CONTENT_COUNT) + message("content: ${CONTENT_COUNT} ") +-list(SORT CONTENT_LIST) + message("${CONTENT_LIST}") + + file(GLOB_RECURSE CONTENT_LIST LIST_DIRECTORIES true "${CMAKE_CURRENT_BINARY_DIR}/test/*/*") + list(LENGTH CONTENT_LIST CONTENT_COUNT) + message("content: ${CONTENT_COUNT} ") +-list(SORT CONTENT_LIST) + message("${CONTENT_LIST}") diff --git a/debian/patches/series b/debian/patches/series index 604347896..09e89d217 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -2,3 +2,4 @@ FindBoost_add_-lpthread_#563479.diff qt_import_dir_variable.diff fix-ftbfs-on-kfreebsd.patch FindLibArchive_Support_libarchive_3.2.patch +file_Sort_GLOB_results_to_make_it_deterministic.patch