diff options
author | Brad King <brad.king@kitware.com> | 2018-03-09 12:37:57 (GMT) |
---|---|---|
committer | Kitware Robot <kwrobot@kitware.com> | 2018-03-09 12:38:07 (GMT) |
commit | f8adde152f768660211e3e7e5990bc79a5de0458 (patch) | |
tree | 5e64ac2b7565d18764082a5167f22a1698c21f26 | |
parent | 72abc75519e498e75f29a96577474277d4dd5da5 (diff) | |
parent | 87a6816bafdf545e81a468b393173353164039a5 (diff) | |
download | CMake-f8adde152f768660211e3e7e5990bc79a5de0458.zip CMake-f8adde152f768660211e3e7e5990bc79a5de0458.tar.gz CMake-f8adde152f768660211e3e7e5990bc79a5de0458.tar.bz2 |
Merge topic 'sort_glob_output'
87a6816baf Add test for sorting and deduping of file(GLOB) result
b688d4fd22 file(GLOB): Ensure entire file list is sorted
Acked-by: Kitware Robot <kwrobot@kitware.com>
Merge-request: !1821
-rw-r--r-- | Source/cmFileCommand.cxx | 19 | ||||
-rw-r--r-- | Tests/RunCMake/file/GLOB-sort-dedup-stderr.txt | 2 | ||||
-rw-r--r-- | Tests/RunCMake/file/GLOB-sort-dedup.cmake | 21 | ||||
-rw-r--r-- | Tests/RunCMake/file/RunCMakeTest.cmake | 1 |
4 files changed, 31 insertions, 12 deletions
diff --git a/Source/cmFileCommand.cxx b/Source/cmFileCommand.cxx index b5215a5..90b943b 100644 --- a/Source/cmFileCommand.cxx +++ b/Source/cmFileCommand.cxx @@ -757,8 +757,7 @@ bool cmFileCommand::HandleGlobCommand(std::vector<std::string> const& args, } } - std::ostringstream outputStream; - bool first = true; + std::vector<std::string> files; bool warnFollowedSymlinks = false; while (i != args.end()) { if (*i == "LIST_DIRECTORIES") { @@ -848,15 +847,8 @@ bool cmFileCommand::HandleGlobCommand(std::vector<std::string> const& args, warnFollowedSymlinks = true; } - std::vector<std::string>& files = g.GetFiles(); - std::sort(files.begin(), files.end()); - for (std::string const& file : files) { - if (!first) { - outputStream << ";"; - } - outputStream << file; - first = false; - } + std::vector<std::string>& foundFiles = g.GetFiles(); + files.insert(files.end(), foundFiles.begin(), foundFiles.end()); ++i; } } @@ -880,7 +872,10 @@ bool cmFileCommand::HandleGlobCommand(std::vector<std::string> const& args, } break; } - this->Makefile->AddDefinition(variable, outputStream.str().c_str()); + + std::sort(files.begin(), files.end()); + files.erase(std::unique(files.begin(), files.end()), files.end()); + this->Makefile->AddDefinition(variable, cmJoin(files, ";").c_str()); return true; } diff --git a/Tests/RunCMake/file/GLOB-sort-dedup-stderr.txt b/Tests/RunCMake/file/GLOB-sort-dedup-stderr.txt new file mode 100644 index 0000000..d2565e4 --- /dev/null +++ b/Tests/RunCMake/file/GLOB-sort-dedup-stderr.txt @@ -0,0 +1,2 @@ +content: 7[ ] +1aAb/\.hide;1aAb/1\.log;1aAb/1\.txt;1aAb/xkcd\.txt;a/1\.log;a/1\.txt;a/boot\.ini diff --git a/Tests/RunCMake/file/GLOB-sort-dedup.cmake b/Tests/RunCMake/file/GLOB-sort-dedup.cmake new file mode 100644 index 0000000..1e1c579 --- /dev/null +++ b/Tests/RunCMake/file/GLOB-sort-dedup.cmake @@ -0,0 +1,21 @@ +file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/test/a") +file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/test/1aAb") + +file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/test/a/1.log" "") +file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/test/a/1.txt" "") +file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/test/a/boot.ini" "") + +file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/test/1aAb/.hide" "") +file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/test/1aAb/1.txt" "") +file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/test/1aAb/1.log" "") +file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/test/1aAb/xkcd.txt" "") + +file(GLOB CONTENT_LIST + LIST_DIRECTORIES false + RELATIVE "${CMAKE_CURRENT_BINARY_DIR}/test" + "${CMAKE_CURRENT_BINARY_DIR}/test/a/*" + "${CMAKE_CURRENT_BINARY_DIR}/test/*/*" + ) +list(LENGTH CONTENT_LIST CONTENT_COUNT) +message("content: ${CONTENT_COUNT} ") +message("${CONTENT_LIST}") diff --git a/Tests/RunCMake/file/RunCMakeTest.cmake b/Tests/RunCMake/file/RunCMakeTest.cmake index 27305d0..4aab32d 100644 --- a/Tests/RunCMake/file/RunCMakeTest.cmake +++ b/Tests/RunCMake/file/RunCMakeTest.cmake @@ -38,6 +38,7 @@ run_cmake(GLOB_RECURSE) run_cmake(GLOB_RECURSE-noexp-FOLLOW_SYMLINKS) # tests are valid both for GLOB and GLOB_RECURSE +run_cmake(GLOB-sort-dedup) run_cmake(GLOB-error-FOLLOW_SYMLINKS) run_cmake(GLOB-error-LIST_DIRECTORIES-not-boolean) run_cmake(GLOB-error-LIST_DIRECTORIES-no-arg) |