summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Pfeiffer <cpfeiffer@live.de>2017-04-26 18:34:06 (GMT)
committerChristian Pfeiffer <cpfeiffer@live.de>2017-04-26 18:34:06 (GMT)
commit2a207aaca1d8414624dd4cfe8fcb19d03fe84546 (patch)
tree1366f0906caef3d94cb289ea080e18006632c874
parent81841426fc12864008999893c11e555df06df292 (diff)
downloadCMake-2a207aaca1d8414624dd4cfe8fcb19d03fe84546.zip
CMake-2a207aaca1d8414624dd4cfe8fcb19d03fe84546.tar.gz
CMake-2a207aaca1d8414624dd4cfe8fcb19d03fe84546.tar.bz2
separgs: Add a NATIVE_COMMAND mode
-rw-r--r--Auxiliary/vim/syntax/cmake.vim2
-rw-r--r--Help/command/separate_arguments.rst9
-rw-r--r--Help/release/dev/separgs-native.rst5
-rw-r--r--Source/cmSeparateArgumentsCommand.cxx7
-rw-r--r--Tests/RunCMake/separate_arguments/NativeCommand.cmake19
-rw-r--r--Tests/RunCMake/separate_arguments/RunCMakeTest.cmake1
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)