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
ci/unstable
Felix Geyer 9 years ago
parent 18ca9bac2d
commit 2e9e55ed25

2
debian/changelog vendored

@ -2,6 +2,8 @@ cmake (3.5.2-2) UNRELEASED; urgency=medium
* Make FindLibArchive compatible with libarchive 3.2. (Closes: #828092) * Make FindLibArchive compatible with libarchive 3.2. (Closes: #828092)
- Add FindLibArchive_Support_libarchive_3.2.patch - 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 <fgeyer@debian.org> Tue, 28 Jun 2016 19:33:54 +0200 -- Felix Geyer <fgeyer@debian.org> Tue, 28 Jun 2016 19:33:54 +0200

@ -0,0 +1,121 @@
From edcccde7d65944b3744c4567bd1d452211829702 Mon Sep 17 00:00:00 2001
From: Reiner Herrmann <reiner@reiner-h.de>
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 ``<globbing-expressions>`` and
store it into the ``<variable>``. 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<std::string> const& args,
std::vector<std::string>::size_type cc;
std::vector<std::string>& 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}")

@ -2,3 +2,4 @@ FindBoost_add_-lpthread_#563479.diff
qt_import_dir_variable.diff qt_import_dir_variable.diff
fix-ftbfs-on-kfreebsd.patch fix-ftbfs-on-kfreebsd.patch
FindLibArchive_Support_libarchive_3.2.patch FindLibArchive_Support_libarchive_3.2.patch
file_Sort_GLOB_results_to_make_it_deterministic.patch

Loading…
Cancel
Save