separgs: Add a NATIVE_COMMAND mode

This commit is contained in:
Christian Pfeiffer 2017-04-26 20:34:06 +02:00
parent 81841426fc
commit 2a207aaca1
6 changed files with 39 additions and 4 deletions

View File

@ -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

View File

@ -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
::

View File

@ -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.

View File

@ -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;

View File

@ -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()

View File

@ -4,3 +4,4 @@ run_cmake(EmptyCommand)
run_cmake(PlainCommand)
run_cmake(UnixCommand)
run_cmake(WindowsCommand)
run_cmake(NativeCommand)