Răsfoiți Sursa

separgs: Add a NATIVE_COMMAND mode

Christian Pfeiffer 8 ani în urmă
părinte
comite
2a207aaca1

+ 1 - 1
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

+ 6 - 3
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
 
 ::

+ 5 - 0
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.

+ 7 - 0
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;

+ 19 - 0
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()

+ 1 - 0
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)