Bladeren bron

separgs: Add a NATIVE_COMMAND mode

Christian Pfeiffer 8 jaren geleden
bovenliggende
commit
2a207aaca1

+ 1 - 1
Auxiliary/vim/syntax/cmake.vim

@@ -320,7 +320,7 @@ syn keyword cmakeKWremove
             \ contained
             \ contained
 
 
 syn keyword cmakeKWseparate_arguments
 syn keyword cmakeKWseparate_arguments
-            \ MSDN UNIX_COMMAND VARIABLE WINDOWS WINDOWS_COMMAND _COMMAND
+            \ MSDN NATIVE_COMMAND UNIX_COMMAND VARIABLE WINDOWS WINDOWS_COMMAND _COMMAND
             \ contained
             \ contained
 
 
 syn keyword cmakeKWset
 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
 stores a semicolon-separated list of the arguments in ``<var>``.  The
 entire command line must be given in one "<args>" argument.
 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 the next literal character (``\"`` is ``"``); there are no special
 escapes (``\n`` is just ``n``).
 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
 syntax the runtime library uses to construct argv at startup.  It
 separates arguments by whitespace that is not double-quoted.
 separates arguments by whitespace that is not double-quoted.
 Backslashes are literal unless they precede double-quotes.  See the
 Backslashes are literal unless they precede double-quotes.  See the
 MSDN article `Parsing C Command-Line Arguments`_ for details.
 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
 .. _`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) {
     if (doing == DoingVariable) {
       var = args[i];
       var = args[i];
       doing = DoingMode;
       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") {
     } else if (doing == DoingMode && args[i] == "UNIX_COMMAND") {
       mode = ModeUnix;
       mode = ModeUnix;
       doing = DoingCommand;
       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(PlainCommand)
 run_cmake(UnixCommand)
 run_cmake(UnixCommand)
 run_cmake(WindowsCommand)
 run_cmake(WindowsCommand)
+run_cmake(NativeCommand)