This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "CMake".
The branch, master has been updated via 0865a24fc1c47d75f1381659ba398e6944c9a724 (commit) via 01b9d039e71aaaf69cf23330fc4129e888e40ea0 (commit) via 9c7bf6974f7e50e795e0ca960834909e14cdd7a0 (commit) via 5202075c66c242e00fc0da118b63428009d1947e (commit) via 208ac575312717223bfc61f57072ff61db790b86 (commit) via badc892ff8ea48b499694bc1dc94b5bac272531b (commit) via 31f73eb12dd0888efc61c0333539d1354c7268ce (commit) via f95dceccb5ccb1ba3ce54173dc4a0b7fdc4144a3 (commit) via a3deae71990e0fd6b495bb3e925755cdbcaf89eb (commit) via 9f66fe9a01451cb5a6e883b05dbc05d6c6c6f4f7 (commit) via 64e973e991636f296cb2bf4f3c0e4ec26463a7b1 (commit) via c5b5bb270f54dab4ff529688a26ea8aa271fa0e1 (commit) via c2cc91a4a549346d5d8a76a5c4ac497e28b4bd3b (commit) from fda9a94fe6061908e1d66c111f9030baa62cccf7 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=0865a24fc1c47d75f1381659ba398e6944c9a724 commit 0865a24fc1c47d75f1381659ba398e6944c9a724 Merge: 01b9d03 badc892 Author: Brad King <brad.k...@kitware.com> AuthorDate: Thu Sep 14 07:41:02 2017 -0400 Commit: Brad King <brad.k...@kitware.com> CommitDate: Thu Sep 14 07:41:02 2017 -0400 Merge branch 'release-3.9' https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=01b9d039e71aaaf69cf23330fc4129e888e40ea0 commit 01b9d039e71aaaf69cf23330fc4129e888e40ea0 Merge: 9c7bf69 31f73eb Author: Brad King <brad.k...@kitware.com> AuthorDate: Thu Sep 14 11:39:08 2017 +0000 Commit: Kitware Robot <kwro...@kitware.com> CommitDate: Thu Sep 14 07:39:24 2017 -0400 Merge topic 'get_filename_component-fix-program-split' 31f73eb1 get_filename_component: Revise PROGRAM/PROGRAM_ARGS split semantics Acked-by: Kitware Robot <kwro...@kitware.com> Merge-request: !1251 https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=9c7bf6974f7e50e795e0ca960834909e14cdd7a0 commit 9c7bf6974f7e50e795e0ca960834909e14cdd7a0 Merge: 5202075 c2cc91a Author: Brad King <brad.k...@kitware.com> AuthorDate: Thu Sep 14 11:38:08 2017 +0000 Commit: Kitware Robot <kwro...@kitware.com> CommitDate: Thu Sep 14 07:38:29 2017 -0400 Merge topic 'remove-nmcl' c2cc91a4 Platforms: Remove Windows-NMcl Acked-by: Kitware Robot <kwro...@kitware.com> Merge-request: !1255 https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=5202075c66c242e00fc0da118b63428009d1947e commit 5202075c66c242e00fc0da118b63428009d1947e Merge: 208ac57 a3deae7 Author: Brad King <brad.k...@kitware.com> AuthorDate: Thu Sep 14 11:37:30 2017 +0000 Commit: Kitware Robot <kwro...@kitware.com> CommitDate: Thu Sep 14 07:37:58 2017 -0400 Merge topic 'bootstrap-twice-in-source' a3deae71 bootstrap: Fix running multiple times in-source Acked-by: Kitware Robot <kwro...@kitware.com> Merge-request: !1258 https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=208ac575312717223bfc61f57072ff61db790b86 commit 208ac575312717223bfc61f57072ff61db790b86 Merge: fda9a94 64e973e Author: Brad King <brad.k...@kitware.com> AuthorDate: Thu Sep 14 11:37:05 2017 +0000 Commit: Kitware Robot <kwro...@kitware.com> CommitDate: Thu Sep 14 07:37:16 2017 -0400 Merge topic 'vs-fix-config-map' 64e973e9 Merge branch 'backport-vs-fix-config-map' into vs-fix-config-map c5b5bb27 VS: Do not consider MAP_IMPORTED_CONFIG_<CONFIG> on non-imported targets Acked-by: Kitware Robot <kwro...@kitware.com> Merge-request: !1256 https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=31f73eb12dd0888efc61c0333539d1354c7268ce commit 31f73eb12dd0888efc61c0333539d1354c7268ce Author: Brad King <brad.k...@kitware.com> AuthorDate: Mon Sep 11 11:05:20 2017 -0400 Commit: Brad King <brad.k...@kitware.com> CommitDate: Wed Sep 13 10:47:04 2017 -0400 get_filename_component: Revise PROGRAM/PROGRAM_ARGS split semantics The KWSys `SystemTools::SplitProgramFromArgs` implementation goes into an infinite loop when the value is just " " (a space). Since the "program path with unquoted spaces plus command-line arguments" operation it is trying to provide is poorly defined (string parsing should not depend on filesystem content), just stop using it. Instead consider the main two use cases the old approach tried to handle: * The value is the name or absolute path of a program with no quoting or escaping, but also no command-line arguments. In this case we can use the value as given with no parsing, and assume no arguments. * The value is a command-line string containing the program name/path plus arguments. In this case we now assume that the command line is properly quoted or escaped. Fixes: #17262 diff --git a/Help/release/dev/get_filename_component-fix-program-split.rst b/Help/release/dev/get_filename_component-fix-program-split.rst new file mode 100644 index 0000000..55c8719 --- /dev/null +++ b/Help/release/dev/get_filename_component-fix-program-split.rst @@ -0,0 +1,9 @@ +get_filename_component-fix-program-split +---------------------------------------- + +* The :command:`get_filename_component` ``PROGRAM`` mode semantics + have been revised to not tolerate unquoted spaces in the path + to the program while also accepting arguments. While technically + incompatible with the old behavior, it is expected that behavior + under typical use cases with properly-quoted command-lines has + not changed. diff --git a/Source/cmGetFilenameComponentCommand.cxx b/Source/cmGetFilenameComponentCommand.cxx index c23684c..1b358ab 100644 --- a/Source/cmGetFilenameComponentCommand.cxx +++ b/Source/cmGetFilenameComponentCommand.cxx @@ -60,7 +60,30 @@ bool cmGetFilenameComponentCommand::InitialPass( } } } - cmSystemTools::SplitProgramFromArgs(filename, result, programArgs); + + // First assume the path to the program was specified with no + // arguments and with no quoting or escaping for spaces. + // Only bother doing this if there is non-whitespace. + if (!cmSystemTools::TrimWhitespace(filename).empty()) { + result = cmSystemTools::FindProgram(filename); + } + + // If that failed then assume a command-line string was given + // and split the program part from the rest of the arguments. + if (result.empty()) { + std::string program; + if (cmSystemTools::SplitProgramFromArgs(filename, program, + programArgs)) { + if (cmSystemTools::FileExists(program)) { + result = program; + } else { + result = cmSystemTools::FindProgram(program); + } + } + if (result.empty()) { + programArgs.clear(); + } + } } else if (args[2] == "EXT") { result = cmSystemTools::GetFilenameExtension(filename); } else if (args[2] == "NAME_WE") { diff --git a/Source/cmSystemTools.cxx b/Source/cmSystemTools.cxx index 5c63d98..2635d6d 100644 --- a/Source/cmSystemTools.cxx +++ b/Source/cmSystemTools.cxx @@ -603,6 +603,56 @@ std::vector<std::string> cmSystemTools::ParseArguments(const char* command) return args; } +bool cmSystemTools::SplitProgramFromArgs(std::string const& command, + std::string& program, + std::string& args) +{ + const char* c = command.c_str(); + + // Skip leading whitespace. + while (isspace(static_cast<unsigned char>(*c))) { + ++c; + } + + // Parse one command-line element up to an unquoted space. + bool in_escape = false; + bool in_double = false; + bool in_single = false; + for (; *c; ++c) { + if (in_single) { + if (*c == '\'') { + in_single = false; + } else { + program += *c; + } + } else if (in_escape) { + in_escape = false; + program += *c; + } else if (*c == '\\') { + in_escape = true; + } else if (in_double) { + if (*c == '"') { + in_double = false; + } else { + program += *c; + } + } else if (*c == '"') { + in_double = true; + } else if (*c == '\'') { + in_single = true; + } else if (isspace(static_cast<unsigned char>(*c))) { + break; + } else { + program += *c; + } + } + + // The remainder of the command line holds unparsed arguments. + args = c; + + return !in_single && !in_escape && !in_double; +} + size_t cmSystemTools::CalculateCommandLineLengthLimit() { size_t sz = diff --git a/Source/cmSystemTools.h b/Source/cmSystemTools.h index 9bec361..e7082e6 100644 --- a/Source/cmSystemTools.h +++ b/Source/cmSystemTools.h @@ -255,6 +255,11 @@ public: static void ParseUnixCommandLine(const char* command, std::vector<std::string>& args); + /** Split a command-line string into the parsed command and the unparsed + arguments. Returns false on unfinished quoting or escaping. */ + static bool SplitProgramFromArgs(std::string const& command, + std::string& program, std::string& args); + /** * Handle response file in an argument list and return a new argument list * **/ diff --git a/Tests/RunCMake/get_filename_component/KnownComponents.cmake b/Tests/RunCMake/get_filename_component/KnownComponents.cmake index 7dfb55d..ac77ac3 100644 --- a/Tests/RunCMake/get_filename_component/KnownComponents.cmake +++ b/Tests/RunCMake/get_filename_component/KnownComponents.cmake @@ -80,6 +80,17 @@ get_filename_component(test_program_name "/ arg1 arg2" PROGRAM check("PROGRAM with args output: name" "${test_program_name}" "/") check("PROGRAM with args output: args" "${test_program_args}" " arg1 arg2") +get_filename_component(test_program_name " " PROGRAM) +check("PROGRAM with just a space" "${test_program_name}" "") + +get_filename_component(test_program_name "${CMAKE_CURRENT_LIST_FILE}" PROGRAM) +check("PROGRAM specified explicitly without quoting" "${test_program_name}" "${CMAKE_CURRENT_LIST_FILE}") + +get_filename_component(test_program_name "\"${CMAKE_CURRENT_LIST_FILE}\" arg1 arg2" PROGRAM + PROGRAM_ARGS test_program_args) +check("PROGRAM specified explicitly with arguments: name" "${test_program_name}" "${CMAKE_CURRENT_LIST_FILE}") +check("PROGRAM specified explicitly with arguments: args" "${test_program_args}" " arg1 arg2") + list(APPEND non_cache_vars test_program_name) list(APPEND non_cache_vars test_program_args) https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=64e973e991636f296cb2bf4f3c0e4ec26463a7b1 commit 64e973e991636f296cb2bf4f3c0e4ec26463a7b1 Merge: 420874b c5b5bb2 Author: Brad King <brad.k...@kitware.com> AuthorDate: Wed Sep 13 09:43:24 2017 -0400 Commit: Brad King <brad.k...@kitware.com> CommitDate: Wed Sep 13 09:43:24 2017 -0400 Merge branch 'backport-vs-fix-config-map' into vs-fix-config-map https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=c2cc91a4a549346d5d8a76a5c4ac497e28b4bd3b commit c2cc91a4a549346d5d8a76a5c4ac497e28b4bd3b Author: Christian Pfeiffer <cpfeif...@live.de> AuthorDate: Wed Sep 13 14:41:39 2017 +0200 Commit: Christian Pfeiffer <cpfeif...@live.de> CommitDate: Wed Sep 13 14:52:45 2017 +0200 Platforms: Remove Windows-NMcl Since commit v2.8.10~148^2~2 (Modernize MSVC compiler information files, 2012-08-23), the Windows-NMcl platform has been broken. It's most likely not needed anymore. diff --git a/Modules/Platform/Windows-NMcl.cmake b/Modules/Platform/Windows-NMcl.cmake deleted file mode 100644 index 7add0b0..0000000 --- a/Modules/Platform/Windows-NMcl.cmake +++ /dev/null @@ -1,4 +0,0 @@ -# this is for the numega compiler which is really a front -# end for visual studio, but adds memory checking code. - -include(Platform/Windows-cl) ----------------------------------------------------------------------- Summary of changes: .../get_filename_component-fix-program-split.rst | 9 ++++ Modules/Platform/Windows-NMcl.cmake | 4 -- Source/cmGetFilenameComponentCommand.cxx | 25 +++++++++- Source/cmGlobalVisualStudio71Generator.cxx | 14 ++++-- Source/cmGlobalVisualStudio8Generator.cxx | 14 ++++-- Source/cmSystemTools.cxx | 50 ++++++++++++++++++++ Source/cmSystemTools.h | 5 ++ .../get_filename_component/KnownComponents.cmake | 11 +++++ bootstrap | 6 +++ 9 files changed, 125 insertions(+), 13 deletions(-) create mode 100644 Help/release/dev/get_filename_component-fix-program-split.rst delete mode 100644 Modules/Platform/Windows-NMcl.cmake hooks/post-receive -- CMake _______________________________________________ Cmake-commits mailing list Cmake-commits@cmake.org http://public.kitware.com/mailman/listinfo/cmake-commits