diff options
author | Christian Pfeiffer <cpfeiffer@live.de> | 2017-04-26 18:34:06 (GMT) |
---|---|---|
committer | Christian Pfeiffer <cpfeiffer@live.de> | 2017-04-26 18:34:06 (GMT) |
commit | 2a207aaca1d8414624dd4cfe8fcb19d03fe84546 (patch) | |
tree | 1366f0906caef3d94cb289ea080e18006632c874 | |
parent | 81841426fc12864008999893c11e555df06df292 (diff) | |
download | CMake-2a207aaca1d8414624dd4cfe8fcb19d03fe84546.zip CMake-2a207aaca1d8414624dd4cfe8fcb19d03fe84546.tar.gz CMake-2a207aaca1d8414624dd4cfe8fcb19d03fe84546.tar.bz2 |
separgs: Add a NATIVE_COMMAND mode
-rw-r--r-- | Auxiliary/vim/syntax/cmake.vim | 2 | ||||
-rw-r--r-- | Help/command/separate_arguments.rst | 9 | ||||
-rw-r--r-- | Help/release/dev/separgs-native.rst | 5 | ||||
-rw-r--r-- | Source/cmSeparateArgumentsCommand.cxx | 7 | ||||
-rw-r--r-- | Tests/RunCMake/separate_arguments/NativeCommand.cmake | 19 | ||||
-rw-r--r-- | Tests/RunCMake/separate_arguments/RunCMakeTest.cmake | 1 |
6 files changed, 39 insertions, 4 deletions
diff --git a/Auxiliary/vim/syntax/cmake.vim b/Auxiliary/vim/syntax/cmake.vim index 1f19cb7..aca7c41 100644 --- a/Auxiliary/vim/syntax/cmake.vim +++ b/Auxiliary/vim/syntax/cmake.vim @@ -320,7 +320,7 @@ syn keyword cmakeKWremove \ contained syn keyword cmakeKWseparate_arguments - \ MSDN UNIX_COMMAND VARIABLE WINDOWS WINDOWS_COMMAND _COMMAND + \ MSDN NATIVE_COMMAND UNIX_COMMAND VARIABLE WINDOWS WINDOWS_COMMAND _COMMAND \ contained syn keyword cmakeKWset diff --git a/Help/command/separate_arguments.rst b/Help/command/separate_arguments.rst index 1fd3cd1..47982a5 100644 --- a/Help/command/separate_arguments.rst +++ b/Help/command/separate_arguments.rst @@ -5,9 +5,9 @@ Parse space-separated arguments into a semicolon-separated list. :: - separate_arguments(<var> <UNIX|WINDOWS>_COMMAND "<args>") + separate_arguments(<var> <NATIVE|UNIX|WINDOWS>_COMMAND "<args>") -Parses a unix- or windows-style command-line string "<args>" and +Parses a UNIX- or Windows-style command-line string "<args>" and stores a semicolon-separated list of the arguments in ``<var>``. The entire command line must be given in one "<args>" argument. @@ -16,12 +16,15 @@ recognizes both single-quote and double-quote pairs. A backslash escapes the next literal character (``\"`` is ``"``); there are no special escapes (``\n`` is just ``n``). -The ``WINDOWS_COMMAND`` mode parses a windows command-line using the same +The ``WINDOWS_COMMAND`` mode parses a Windows command-line using the same syntax the runtime library uses to construct argv at startup. It separates arguments by whitespace that is not double-quoted. Backslashes are literal unless they precede double-quotes. See the MSDN article `Parsing C Command-Line Arguments`_ for details. +The ``NATIVE_COMMAND`` mode parses a Windows command-line if the host +system is Windows, and a UNIX command-line otherwise. + .. _`Parsing C Command-Line Arguments`: https://msdn.microsoft.com/library/a1y7w461.aspx :: diff --git a/Help/release/dev/separgs-native.rst b/Help/release/dev/separgs-native.rst new file mode 100644 index 0000000..943f08e --- /dev/null +++ b/Help/release/dev/separgs-native.rst @@ -0,0 +1,5 @@ +separgs-native +------------------- + +* A ``NATIVE_COMMAND`` mode was added to :command:`separate_arguments` + performing argument separation depening on the host operating system. diff --git a/Source/cmSeparateArgumentsCommand.cxx b/Source/cmSeparateArgumentsCommand.cxx index b27d227..7b222a0 100644 --- a/Source/cmSeparateArgumentsCommand.cxx +++ b/Source/cmSeparateArgumentsCommand.cxx @@ -40,6 +40,13 @@ bool cmSeparateArgumentsCommand::InitialPass( if (doing == DoingVariable) { var = args[i]; doing = DoingMode; + } else if (doing == DoingMode && args[i] == "NATIVE_COMMAND") { +#ifdef _WIN32 + mode = ModeWindows; +#else + mode = ModeUnix; +#endif + doing = DoingCommand; } else if (doing == DoingMode && args[i] == "UNIX_COMMAND") { mode = ModeUnix; doing = DoingCommand; diff --git a/Tests/RunCMake/separate_arguments/NativeCommand.cmake b/Tests/RunCMake/separate_arguments/NativeCommand.cmake new file mode 100644 index 0000000..1cb009e --- /dev/null +++ b/Tests/RunCMake/separate_arguments/NativeCommand.cmake @@ -0,0 +1,19 @@ +set(unix_cmd "a \"b c\" 'd e' \";\" \\ \\'\\\" '\\'' \"\\\"\"") +set(unix_exp "a;b c;d e;\;; '\";';\"") + +set(windows_cmd "a \"b c\" 'd e' \";\" \\ \"c:\\windows\\path\\\\\" \\\"") +set(windows_exp "a;b c;'d;e';\;;\\;c:\\windows\\path\\;\"") + +if(CMAKE_HOST_WIN32) + set(native_cmd "${windows_cmd}") + set(native_exp "${windows_exp}") +else() + set(native_cmd "${unix_cmd}") + set(native_exp "${unix_exp}") +endif() +separate_arguments(native_out NATIVE_COMMAND "${native_cmd}") + +if(NOT "${native_out}" STREQUAL "${native_exp}") + message(FATAL_ERROR "separate_arguments native-style failed. " + "Expected\n [${native_exp}]\nbut got\n [${native_out}]\n") +endif() diff --git a/Tests/RunCMake/separate_arguments/RunCMakeTest.cmake b/Tests/RunCMake/separate_arguments/RunCMakeTest.cmake index 0917d87..07951bb 100644 --- a/Tests/RunCMake/separate_arguments/RunCMakeTest.cmake +++ b/Tests/RunCMake/separate_arguments/RunCMakeTest.cmake @@ -4,3 +4,4 @@ run_cmake(EmptyCommand) run_cmake(PlainCommand) run_cmake(UnixCommand) run_cmake(WindowsCommand) +run_cmake(NativeCommand) |