浏览代码

Merge branch 'master' into cmake_role-vs-fix

Kyle Edwards 6 年之前
父节点
当前提交
e795be115e
共有 100 个文件被更改,包括 722 次插入533 次删除
  1. 1 1
      Auxiliary/cmake.m4
  2. 0 3
      CMakeCPack.cmake
  3. 0 10
      CMakeCPackOptions.cmake.in
  4. 11 3
      Help/command/cmake_parse_arguments.rst
  5. 34 2
      Help/command/list.rst
  6. 1 3
      Help/generator/Xcode.rst
  7. 8 0
      Help/manual/cmake-policies.7.rst
  8. 1 0
      Help/manual/cmake-properties.7.rst
  9. 30 0
      Help/policy/CMP0089.rst
  10. 46 0
      Help/prop_tgt/VS_NO_SOLUTION_DEPLOY.rst
  11. 7 0
      Help/release/dev/0-sample-topic.rst
  12. 4 0
      Help/release/dev/FindCups-imported-target.rst
  13. 5 0
      Help/release/dev/add-xlclang.rst
  14. 6 0
      Help/release/dev/cmake_parse_arguments-keywords_missing_values.rst
  15. 8 0
      Help/release/dev/deprecate-policy-old.rst
  16. 4 0
      Help/release/dev/list-prepend-and-pop-subcommands.rst
  17. 4 0
      Help/release/dev/require-xcode-5.rst
  18. 6 0
      Help/release/dev/vs-wince-no-deploy.rst
  19. 2 0
      Help/release/index.rst
  20. 0 1
      Help/variable/CMAKE_LANG_COMPILER_ID.rst
  21. 2 6
      Help/variable/CMAKE_MAKE_PROGRAM.rst
  22. 2 0
      Help/variable/CMAKE_POLICY_WARNING_CMPNNNN.rst
  23. 1 2
      Modules/CMakeCompilerIdDetection.cmake
  24. 2 1
      Modules/CMakeDetermineCCompiler.cmake
  25. 2 1
      Modules/CMakeDetermineCXXCompiler.cmake
  26. 0 7
      Modules/CMakeFortranCompilerId.F.in
  27. 4 2
      Modules/CMakeParseImplicitIncludeInfo.cmake
  28. 98 13
      Modules/Compiler/CrayPrgEnv.cmake
  29. 2 2
      Modules/Compiler/GNU-FindBinUtils.cmake
  30. 4 12
      Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake
  31. 4 12
      Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake
  32. 0 1
      Modules/Compiler/MIPSpro-C.cmake
  33. 0 1
      Modules/Compiler/MIPSpro-CXX.cmake
  34. 0 15
      Modules/Compiler/MIPSpro-DetermineCompiler.cmake
  35. 0 3
      Modules/Compiler/MIPSpro-Fortran.cmake
  36. 1 1
      Modules/Compiler/XL-C-DetermineCompiler.cmake
  37. 8 29
      Modules/Compiler/XL-C.cmake
  38. 1 1
      Modules/Compiler/XL-CXX-DetermineCompiler.cmake
  39. 7 32
      Modules/Compiler/XL-CXX.cmake
  40. 0 22
      Modules/Compiler/XL.cmake
  41. 8 0
      Modules/Compiler/XLClang-C-DetermineCompiler.cmake
  42. 17 0
      Modules/Compiler/XLClang-C.cmake
  43. 8 0
      Modules/Compiler/XLClang-CXX-DetermineCompiler.cmake
  44. 20 0
      Modules/Compiler/XLClang-CXX.cmake
  45. 22 0
      Modules/Compiler/XLClang.cmake
  46. 39 9
      Modules/FindCups.cmake
  47. 0 1
      Modules/FindOpenMP.cmake
  48. 2 3
      Modules/FortranCInterface/CMakeLists.txt
  49. 8 1
      Modules/Internal/CPack/CPackRPM.cmake
  50. 22 0
      Modules/Platform/AIX-XL.cmake
  51. 2 0
      Modules/Platform/AIX-XLClang-C.cmake
  52. 2 0
      Modules/Platform/AIX-XLClang-CXX.cmake
  53. 15 0
      Modules/Platform/AIX-XLClang.cmake
  54. 4 68
      Modules/Platform/CrayLinuxEnvironment.cmake
  55. 26 8
      README.rst
  56. 0 3
      Source/CMakeLists.txt
  57. 2 2
      Source/CMakeVersion.cmake
  58. 4 4
      Source/CPack/IFW/cmCPackIFWGenerator.cxx
  59. 1 1
      Source/CPack/OSXScriptLauncher.cxx
  60. 3 4
      Source/CPack/WiX/cmCPackWIXGenerator.cxx
  61. 2 3
      Source/CPack/cmCPackCygwinBinaryGenerator.cxx
  62. 2 2
      Source/CPack/cmCPackDragNDropGenerator.cxx
  63. 10 10
      Source/CPack/cmCPackGenerator.cxx
  64. 3 2
      Source/CPack/cmCPackGenerator.h
  65. 3 0
      Source/CPack/cmCPackGeneratorFactory.h
  66. 3 0
      Source/CPack/cmCPackLog.h
  67. 7 8
      Source/CPack/cmCPackNSISGenerator.cxx
  68. 5 5
      Source/CPack/cmCPackOSXX11Generator.cxx
  69. 23 37
      Source/CPack/cmCPackPKGGenerator.cxx
  70. 2 2
      Source/CPack/cmCPackPackageMakerGenerator.cxx
  71. 2 2
      Source/CPack/cmCPackProductBuildGenerator.cxx
  72. 1 1
      Source/CPack/cpack.cxx
  73. 1 1
      Source/CTest/cmCTestBZR.cxx
  74. 11 5
      Source/CTest/cmCTestBuildAndTestHandler.cxx
  75. 10 7
      Source/CTest/cmCTestBuildHandler.cxx
  76. 1 1
      Source/CTest/cmCTestBuildHandler.h
  77. 1 1
      Source/CTest/cmCTestCVS.cxx
  78. 1 1
      Source/CTest/cmCTestConfigureHandler.cxx
  79. 13 10
      Source/CTest/cmCTestCoverageHandler.cxx
  80. 2 0
      Source/CTest/cmCTestCurl.h
  81. 1 1
      Source/CTest/cmCTestGIT.cxx
  82. 1 1
      Source/CTest/cmCTestHG.cxx
  83. 2 0
      Source/CTest/cmCTestHandlerCommand.cxx
  84. 3 0
      Source/CTest/cmCTestLaunch.h
  85. 5 5
      Source/CTest/cmCTestMemCheckHandler.cxx
  86. 4 5
      Source/CTest/cmCTestMultiProcessHandler.cxx
  87. 5 6
      Source/CTest/cmCTestP4.cxx
  88. 13 74
      Source/CTest/cmCTestRunTest.cxx
  89. 0 5
      Source/CTest/cmCTestRunTest.h
  90. 2 2
      Source/CTest/cmCTestSVN.cxx
  91. 20 21
      Source/CTest/cmCTestScriptHandler.cxx
  92. 10 11
      Source/CTest/cmCTestSubmitHandler.cxx
  93. 1 1
      Source/CTest/cmCTestTestHandler.cxx
  94. 2 1
      Source/CTest/cmCTestTestHandler.h
  95. 8 5
      Source/CTest/cmProcess.cxx
  96. 2 2
      Source/CTest/cmProcess.h
  97. 13 0
      Source/Checks/cm_cxx17_check.cpp
  98. 1 1
      Source/CursesDialog/ccmake.cxx
  99. 3 1
      Source/CursesDialog/cmCursesForm.h
  100. 2 3
      Source/CursesDialog/cmCursesLongMessageForm.cxx

+ 1 - 1
Auxiliary/cmake.m4

@@ -13,7 +13,7 @@ fi
 # $2: language (e.g. C/CXX/Fortran)
 # $2: language (e.g. C/CXX/Fortran)
 # $3: The compiler ID, defaults to GNU.
 # $3: The compiler ID, defaults to GNU.
 #     Possible values are: GNU, Intel, Clang, SunPro, HP, XL, VisualAge, PGI,
 #     Possible values are: GNU, Intel, Clang, SunPro, HP, XL, VisualAge, PGI,
-#     PathScale, Cray, SCO, MIPSpro, MSVC
+#     PathScale, Cray, SCO, MSVC
 # $4: optional extra arguments to cmake, e.g. "-DCMAKE_SIZEOF_VOID_P=8"
 # $4: optional extra arguments to cmake, e.g. "-DCMAKE_SIZEOF_VOID_P=8"
 # $5: optional path to cmake binary
 # $5: optional path to cmake binary
 AC_DEFUN([CMAKE_FIND_PACKAGE], [
 AC_DEFUN([CMAKE_FIND_PACKAGE], [

+ 0 - 3
CMakeCPack.cmake

@@ -102,9 +102,6 @@ if(CMake_INSTALL_COMPONENTS)
   if(WIN32 AND NOT CYGWIN)
   if(WIN32 AND NOT CYGWIN)
       list(APPEND _CPACK_IFW_COMPONENTS_ALL cmcldeps)
       list(APPEND _CPACK_IFW_COMPONENTS_ALL cmcldeps)
   endif()
   endif()
-  if(APPLE)
-    list(APPEND _CPACK_IFW_COMPONENTS_ALL cmakexbuild)
-  endif()
   if(CMAKE_INSTALL_DEFAULT_COMPONENT_NAME)
   if(CMAKE_INSTALL_DEFAULT_COMPONENT_NAME)
     set(_CPACK_IFW_COMPONENT_UNSPECIFIED_NAME
     set(_CPACK_IFW_COMPONENT_UNSPECIFIED_NAME
       ${CMAKE_INSTALL_DEFAULT_COMPONENT_NAME})
       ${CMAKE_INSTALL_DEFAULT_COMPONENT_NAME})

+ 0 - 10
CMakeCPackOptions.cmake.in

@@ -109,16 +109,6 @@ if(CPACK_GENERATOR MATCHES "IFW")
   set(CPACK_IFW_COMPONENT_CMCLDEPS_VERSION
   set(CPACK_IFW_COMPONENT_CMCLDEPS_VERSION
     "@CMake_IFW_ROOT_COMPONENT_VERSION@")
     "@CMake_IFW_ROOT_COMPONENT_VERSION@")
 
 
-  set(CPACK_COMPONENT_CMAKEXBUILD_DISPLAY_NAME "cmakexbuild")
-  set(CPACK_COMPONENT_CMAKEXBUILD_DESCRIPTION
-    "The \"cmakexbuild\" executable is a wrapper program for \"xcodebuild\"")
-  set(CPACK_COMPONENT_CMAKEXBUILD_REQUIRED TRUE)
-  set(CPACK_COMPONENT_CMAKEXBUILD_GROUP Tools)
-  set(CPACK_IFW_COMPONENT_CMAKEXBUILD_NAME "CMakeXBuild")
-  set(CPACK_IFW_COMPONENT_CMAKEXBUILD_PRIORITY 85)
-  set(CPACK_IFW_COMPONENT_CMAKEXBUILD_VERSION
-    "@CMake_IFW_ROOT_COMPONENT_VERSION@")
-
   # Dialogs
   # Dialogs
   set(CPACK_COMPONENT_GROUP_DIALOGS_DISPLAY_NAME "Interactive Dialogs")
   set(CPACK_COMPONENT_GROUP_DIALOGS_DISPLAY_NAME "Interactive Dialogs")
   set(CPACK_COMPONENT_GROUP_DIALOGS_DESCRIPTION
   set(CPACK_COMPONENT_GROUP_DIALOGS_DESCRIPTION

+ 11 - 3
Help/command/cmake_parse_arguments.rst

@@ -59,6 +59,11 @@ All remaining arguments are collected in a variable
 where recognized. This can be checked afterwards to see
 where recognized. This can be checked afterwards to see
 whether your macro was called with unrecognized parameters.
 whether your macro was called with unrecognized parameters.
 
 
+``<one_value_keywords>`` and ``<multi_value_keywords>`` that where given no
+values at all are collected in a variable ``<prefix>_KEYWORDS_MISSING_VALUES``
+that will be undefined if all keywords received values. This can be checked
+to see if there where keywords without any values given.
+
 As an example here a ``my_install()`` macro, which takes similar arguments
 As an example here a ``my_install()`` macro, which takes similar arguments
 as the real :command:`install` command:
 as the real :command:`install` command:
 
 
@@ -77,7 +82,7 @@ Assume ``my_install()`` has been called like this:
 
 
 .. code-block:: cmake
 .. code-block:: cmake
 
 
-   my_install(TARGETS foo bar DESTINATION bin OPTIONAL blub)
+   my_install(TARGETS foo bar DESTINATION bin OPTIONAL blub CONFIGURATIONS)
 
 
 After the ``cmake_parse_arguments`` call the macro will have set or undefined
 After the ``cmake_parse_arguments`` call the macro will have set or undefined
 the following variables::
 the following variables::
@@ -89,6 +94,8 @@ the following variables::
    MY_INSTALL_TARGETS = "foo;bar"
    MY_INSTALL_TARGETS = "foo;bar"
    MY_INSTALL_CONFIGURATIONS <UNDEFINED> # was not used
    MY_INSTALL_CONFIGURATIONS <UNDEFINED> # was not used
    MY_INSTALL_UNPARSED_ARGUMENTS = "blub" # nothing expected after "OPTIONAL"
    MY_INSTALL_UNPARSED_ARGUMENTS = "blub" # nothing expected after "OPTIONAL"
+   MY_INSTALL_KEYWORDS_MISSING_VALUES = "CONFIGURATIONS"
+            # No value for "CONFIGURATIONS" given
 
 
 You can then continue and process these variables.
 You can then continue and process these variables.
 
 
@@ -97,5 +104,6 @@ one_value_keyword another recognized keyword follows, this is
 interpreted as the beginning of the new option.  E.g.
 interpreted as the beginning of the new option.  E.g.
 ``my_install(TARGETS foo DESTINATION OPTIONAL)`` would result in
 ``my_install(TARGETS foo DESTINATION OPTIONAL)`` would result in
 ``MY_INSTALL_DESTINATION`` set to ``"OPTIONAL"``, but as ``OPTIONAL``
 ``MY_INSTALL_DESTINATION`` set to ``"OPTIONAL"``, but as ``OPTIONAL``
-is a keyword itself ``MY_INSTALL_DESTINATION`` will be empty and
-``MY_INSTALL_OPTIONAL`` will therefore be set to ``TRUE``.
+is a keyword itself ``MY_INSTALL_DESTINATION`` will be empty (but added
+to ``MY_INSTALL_KEYWORDS_MISSING_VALUES``) and ``MY_INSTALL_OPTIONAL`` will
+therefore be set to ``TRUE``.

+ 34 - 2
Help/command/list.rst

@@ -21,6 +21,9 @@ Synopsis
     list(`APPEND`_ <list> [<element>...])
     list(`APPEND`_ <list> [<element>...])
     list(`FILTER`_ <list> {INCLUDE | EXCLUDE} REGEX <regex>)
     list(`FILTER`_ <list> {INCLUDE | EXCLUDE} REGEX <regex>)
     list(`INSERT`_ <list> <index> [<element>...])
     list(`INSERT`_ <list> <index> [<element>...])
+    list(`POP_BACK`_ <list> [<out-var>...])
+    list(`POP_FRONT`_ <list> [<out-var>...])
+    list(`PREPEND`_ <list> [<element>...])
     list(`REMOVE_ITEM`_ <list> <value>...)
     list(`REMOVE_ITEM`_ <list> <value>...)
     list(`REMOVE_AT`_ <list> <index>...)
     list(`REMOVE_AT`_ <list> <index>...)
     list(`REMOVE_DUPLICATES`_ <list>)
     list(`REMOVE_DUPLICATES`_ <list>)
@@ -33,8 +36,9 @@ Synopsis
 Introduction
 Introduction
 ^^^^^^^^^^^^
 ^^^^^^^^^^^^
 
 
-The list subcommands ``APPEND``, ``INSERT``, ``FILTER``, ``REMOVE_AT``,
-``REMOVE_ITEM``, ``REMOVE_DUPLICATES``, ``REVERSE`` and ``SORT`` may create
+The list subcommands ``APPEND``, ``INSERT``, ``FILTER``, ``PREPEND``,
+``POP_BACK``, ``POP_FRONT``, ``REMOVE_AT``, ``REMOVE_ITEM``,
+``REMOVE_DUPLICATES``, ``REVERSE`` and ``SORT`` may create
 new values for the list within the current CMake variable scope.  Similar to
 new values for the list within the current CMake variable scope.  Similar to
 the :command:`set` command, the LIST command creates new variable values in
 the :command:`set` command, the LIST command creates new variable values in
 the current scope, even if the list itself is actually defined in a parent
 the current scope, even if the list itself is actually defined in a parent
@@ -142,6 +146,34 @@ For more information on regular expressions see also the
 
 
 Inserts elements to the list to the specified location.
 Inserts elements to the list to the specified location.
 
 
+.. _POP_BACK:
+
+.. code-block:: cmake
+
+  list(POP_BACK <list> [<out-var>...])
+
+If no variable name is given, removes exactly one element. Otherwise,
+assign the last element's value to the given variable and removes it,
+up to the last variable name given.
+
+.. _POP_FRONT:
+
+.. code-block:: cmake
+
+  list(POP_FRONT <list> [<out-var>...])
+
+If no variable name is given, removes exactly one element. Otherwise,
+assign the first element's value to the given variable and removes it,
+up to the last variable name given.
+
+.. _PREPEND:
+
+.. code-block:: cmake
+
+  list(PREPEND <list> [<element> ...])
+
+Insert elements to the 0th position in the list.
+
 .. _REMOVE_ITEM:
 .. _REMOVE_ITEM:
 
 
 .. code-block:: cmake
 .. code-block:: cmake

+ 1 - 3
Help/generator/Xcode.rst

@@ -3,9 +3,7 @@ Xcode
 
 
 Generate Xcode project files.
 Generate Xcode project files.
 
 
-This supports Xcode 3.0 and above.  Support for Xcode versions prior
-to Xcode 5 is deprecated and will be dropped in a future version of
-CMake.
+This supports Xcode 5.0 and above.
 
 
 Toolset Selection
 Toolset Selection
 ^^^^^^^^^^^^^^^^^
 ^^^^^^^^^^^^^^^^^

+ 8 - 0
Help/manual/cmake-policies.7.rst

@@ -51,6 +51,14 @@ The :variable:`CMAKE_MINIMUM_REQUIRED_VERSION` variable may also be used
 to determine whether to report an error on use of deprecated macros or
 to determine whether to report an error on use of deprecated macros or
 functions.
 functions.
 
 
+Policies Introduced by CMake 3.15
+=================================
+
+.. toctree::
+   :maxdepth: 1
+
+   CMP0089: Compiler id for IBM Clang-based XL compilers is now XLClang. </policy/CMP0089>
+
 Policies Introduced by CMake 3.14
 Policies Introduced by CMake 3.14
 =================================
 =================================
 
 

+ 1 - 0
Help/manual/cmake-properties.7.rst

@@ -334,6 +334,7 @@ Properties on Targets
    /prop_tgt/VS_IOT_STARTUP_TASK
    /prop_tgt/VS_IOT_STARTUP_TASK
    /prop_tgt/VS_KEYWORD
    /prop_tgt/VS_KEYWORD
    /prop_tgt/VS_MOBILE_EXTENSIONS_VERSION
    /prop_tgt/VS_MOBILE_EXTENSIONS_VERSION
+   /prop_tgt/VS_NO_SOLUTION_DEPLOY
    /prop_tgt/VS_SCC_AUXPATH
    /prop_tgt/VS_SCC_AUXPATH
    /prop_tgt/VS_SCC_LOCALPATH
    /prop_tgt/VS_SCC_LOCALPATH
    /prop_tgt/VS_SCC_PROJECTNAME
    /prop_tgt/VS_SCC_PROJECTNAME

+ 30 - 0
Help/policy/CMP0089.rst

@@ -0,0 +1,30 @@
+CMP0089
+-------
+
+Compiler id for IBM Clang-based XL compilers is now ``XLClang``.
+
+CMake 3.15 and above recognize that IBM's Clang-based XL compilers
+that define ``__ibmxl__`` are a new front-end distinct from ``xlc``
+with a different command line and set of capabilities.
+CMake now prefers to present this to projects by setting the
+:variable:`CMAKE_<LANG>_COMPILER_ID` variable to ``XLClang`` instead
+of ``XL``.  However, existing projects may assume the compiler id for
+Clang-based XL is just ``XL`` as it was in CMake versions prior to 3.15.
+Therefore this policy determines for Clang-based XL compilers which
+compiler id to report in the :variable:`CMAKE_<LANG>_COMPILER_ID`
+variable after language ``<LANG>`` is enabled by the :command:`project`
+or :command:`enable_language` command.  The policy must be set prior
+to the invocation of either command.
+
+The OLD behavior for this policy is to use compiler id ``XL``.  The
+NEW behavior for this policy is to use compiler id ``XLClang``.
+
+This policy was introduced in CMake version 3.15.  Use the
+:command:`cmake_policy` command to set this policy to OLD or NEW explicitly.
+Unlike most policies, CMake version |release| does *not* warn
+by default when this policy is not set and simply uses OLD behavior.
+See documentation of the
+:variable:`CMAKE_POLICY_WARNING_CMP0089 <CMAKE_POLICY_WARNING_CMP<NNNN>>`
+variable to control the warning.
+
+.. include:: DEPRECATED.txt

+ 46 - 0
Help/prop_tgt/VS_NO_SOLUTION_DEPLOY.rst

@@ -0,0 +1,46 @@
+VS_NO_SOLUTION_DEPLOY
+---------------------
+
+Specify that the target should not be marked for deployment to a Windows CE
+or Windows Phone device in the generated Visual Studio solution.
+
+Be default, all EXE and shared library (DLL) targets are marked to deploy to
+the target device in the generated Visual Studio solution.
+
+Generator expressions are supported.
+
+There are reasons one might want to exclude a target / generated project from
+deployment:
+
+- The library or executable may not be necessary in the primary deploy/debug
+  scenario, and excluding from deployment saves time in the
+  develop/download/debug cycle.
+- There may be insufficient space on the target device to accommodate all of
+  the build products.
+- Visual Studio 2013 requires a target device IP address be entered for each
+  target marked for deployment.  For large numbers of targets, this can be
+  tedious.
+  NOTE: Visual Studio *will* deploy all project dependencies of a project
+  tagged for deployment to the IP address configured for that project even
+  if those dependencies are not tagged for deployment.
+
+
+Example 1
+^^^^^^^^^
+
+This shows setting the variable for the target foo.
+
+.. code-block:: cmake
+
+  add_library(foo SHARED foo.cpp)
+  set_property(TARGET foo PROPERTY VS_NO_SOLUTION_DEPLOY ON)
+
+Example 2
+^^^^^^^^^
+
+This shows setting the variable for the Release configuration only.
+
+.. code-block:: cmake
+
+  add_library(foo SHARED foo.cpp)
+  set_property(TARGET foo PROPERTY VS_NO_SOLUTION_DEPLOY "$<CONFIG:Release>")

+ 7 - 0
Help/release/dev/0-sample-topic.rst

@@ -0,0 +1,7 @@
+0-sample-topic
+--------------
+
+* This is a sample release note for the change in a topic.
+  Developers should add similar notes for each topic branch
+  making a noteworthy change.  Each document should be named
+  and titled to match the topic name to avoid merge conflicts.

+ 4 - 0
Help/release/dev/FindCups-imported-target.rst

@@ -0,0 +1,4 @@
+FindCups-imported-target
+------------------------
+
+* The :module:`FindCups` module now provides imported targets.

+ 5 - 0
Help/release/dev/add-xlclang.rst

@@ -0,0 +1,5 @@
+add-xlclang
+-----------
+
+* IBM Clang-based XL compilers that define ``__ibmxl__`` now use the
+  compiler id ``XLClang`` instead of ``XL``.  See policy :policy:`CMP0089`.

+ 6 - 0
Help/release/dev/cmake_parse_arguments-keywords_missing_values.rst

@@ -0,0 +1,6 @@
+cmake_parse_arguments-keywords_missing_values
+---------------------------------------------
+
+* The :command:`cmake_parse_arguments` command gained an additional
+  ``<prefix>_KEYWORDS_MISSING_VALUES`` output variable to report
+  keyword arguments that were given by the caller with no values.

+ 8 - 0
Help/release/dev/deprecate-policy-old.rst

@@ -0,0 +1,8 @@
+deprecate-policy-old
+--------------------
+
+* An explicit deprecation diagnostic was added for policy ``CMP0066``
+  (``CMP0065`` and below were already deprecated).
+  The :manual:`cmake-policies(7)` manual explains that the OLD behaviors
+  of all policies are deprecated and that projects should port to the
+  NEW behaviors.

+ 4 - 0
Help/release/dev/list-prepend-and-pop-subcommands.rst

@@ -0,0 +1,4 @@
+list-prepend-and-pop-subcommands
+--------------------------------
+
+* :command:`list` learned new sub-commands ``PREPEND``, ``POP_FRONT`` and ``POP_BACK``.

+ 4 - 0
Help/release/dev/require-xcode-5.rst

@@ -0,0 +1,4 @@
+require-xcode-5
+---------------
+
+* The :generator:`Xcode` generator now requires at least Xcode 5.

+ 6 - 0
Help/release/dev/vs-wince-no-deploy.rst

@@ -0,0 +1,6 @@
+vs_wince_no_deploy
+------------------
+
+* A :prop_tgt:`VS_NO_SOLUTION_DEPLOY` target property was added to
+  tell :ref:`Visual Studio Generators` whether to deploy an artifact
+  to the WinCE or Windows Phone target device.

+ 2 - 0
Help/release/index.rst

@@ -7,6 +7,8 @@ CMake Release Notes
   This file should include the adjacent "dev.txt" file
   This file should include the adjacent "dev.txt" file
   in development versions but not in release versions.
   in development versions but not in release versions.
 
 
+.. include:: dev.txt
+
 Releases
 Releases
 ========
 ========
 
 

+ 0 - 1
Help/variable/CMAKE_LANG_COMPILER_ID.rst

@@ -24,7 +24,6 @@ include:
   HP = Hewlett-Packard Compiler (hp.com)
   HP = Hewlett-Packard Compiler (hp.com)
   IAR = IAR Systems (iar.com)
   IAR = IAR Systems (iar.com)
   Intel = Intel Compiler (intel.com)
   Intel = Intel Compiler (intel.com)
-  MIPSpro = SGI MIPSpro (sgi.com)
   MSVC = Microsoft Visual Studio (microsoft.com)
   MSVC = Microsoft Visual Studio (microsoft.com)
   NVIDIA = NVIDIA CUDA Compiler (nvidia.com)
   NVIDIA = NVIDIA CUDA Compiler (nvidia.com)
   OpenWatcom = Open Watcom (openwatcom.org)
   OpenWatcom = Open Watcom (openwatcom.org)

+ 2 - 6
Help/variable/CMAKE_MAKE_PROGRAM.rst

@@ -19,15 +19,11 @@ to configure the project:
   This generator stores ``CMAKE_MAKE_PROGRAM`` in the CMake cache
   This generator stores ``CMAKE_MAKE_PROGRAM`` in the CMake cache
   so that it may be edited by the user.
   so that it may be edited by the user.
 
 
-* The :generator:`Xcode` generator sets this to ``xcodebuild`` (or possibly an
-  otherwise undocumented ``cmakexbuild`` wrapper implementing some
-  workarounds).
+* The :generator:`Xcode` generator sets this to ``xcodebuild``.
 
 
   This generator prefers to lookup the build tool at build time
   This generator prefers to lookup the build tool at build time
   rather than to store ``CMAKE_MAKE_PROGRAM`` in the CMake cache
   rather than to store ``CMAKE_MAKE_PROGRAM`` in the CMake cache
-  ahead of time.  This is because ``xcodebuild`` is easy to find,
-  the ``cmakexbuild`` wrapper is needed only for older Xcode versions,
-  and the path to ``cmakexbuild`` may be outdated if CMake itself moves.
+  ahead of time.  This is because ``xcodebuild`` is easy to find.
 
 
   For compatibility with versions of CMake prior to 3.2, if
   For compatibility with versions of CMake prior to 3.2, if
   a user or project explicitly adds ``CMAKE_MAKE_PROGRAM`` to
   a user or project explicitly adds ``CMAKE_MAKE_PROGRAM`` to

+ 2 - 0
Help/variable/CMAKE_POLICY_WARNING_CMPNNNN.rst

@@ -21,6 +21,8 @@ warn by default:
   policy :policy:`CMP0067`.
   policy :policy:`CMP0067`.
 * ``CMAKE_POLICY_WARNING_CMP0082`` controls the warning for
 * ``CMAKE_POLICY_WARNING_CMP0082`` controls the warning for
   policy :policy:`CMP0082`.
   policy :policy:`CMP0082`.
+* ``CMAKE_POLICY_WARNING_CMP0089`` controls the warning for
+  policy :policy:`CMP0089`.
 
 
 This variable should not be set by a project in CMake code.  Project
 This variable should not be set by a project in CMake code.  Project
 developers running CMake may set this variable in their cache to
 developers running CMake may set this variable in their cache to

+ 1 - 2
Modules/CMakeCompilerIdDetection.cmake

@@ -57,6 +57,7 @@ function(compiler_id_detection outvar lang)
       HP
       HP
       Compaq
       Compaq
       zOS
       zOS
+      XLClang
       XL
       XL
       VisualAge
       VisualAge
       PGI
       PGI
@@ -86,8 +87,6 @@ function(compiler_id_detection outvar lang)
         SDCC
         SDCC
       )
       )
     endif()
     endif()
-    list(APPEND ordered_compilers
-      MIPSpro)
 
 
     #Currently the only CUDA compilers are NVIDIA
     #Currently the only CUDA compilers are NVIDIA
     if(lang STREQUAL CUDA)
     if(lang STREQUAL CUDA)

+ 2 - 1
Modules/CMakeDetermineCCompiler.cmake

@@ -139,8 +139,9 @@ if (CMAKE_CROSSCOMPILING  AND NOT _CMAKE_TOOLCHAIN_PREFIX)
 
 
   if(CMAKE_C_COMPILER_ID MATCHES "GNU|Clang|QCC")
   if(CMAKE_C_COMPILER_ID MATCHES "GNU|Clang|QCC")
     get_filename_component(COMPILER_BASENAME "${CMAKE_C_COMPILER}" NAME)
     get_filename_component(COMPILER_BASENAME "${CMAKE_C_COMPILER}" NAME)
-    if (COMPILER_BASENAME MATCHES "^(.+-)(clang|g?cc)(-[0-9]+\\.[0-9]+\\.[0-9]+)?(\\.exe)?$")
+    if (COMPILER_BASENAME MATCHES "^(.+-)(clang|g?cc)(-[0-9]+(\\.[0-9]+)*)?(-[^.]+)?(\\.exe)?$")
       set(_CMAKE_TOOLCHAIN_PREFIX ${CMAKE_MATCH_1})
       set(_CMAKE_TOOLCHAIN_PREFIX ${CMAKE_MATCH_1})
+      set(_CMAKE_COMPILER_SUFFIX ${CMAKE_MATCH_5})
     elseif(CMAKE_C_COMPILER_ID MATCHES "Clang")
     elseif(CMAKE_C_COMPILER_ID MATCHES "Clang")
       if(CMAKE_C_COMPILER_TARGET)
       if(CMAKE_C_COMPILER_TARGET)
         set(_CMAKE_TOOLCHAIN_PREFIX ${CMAKE_C_COMPILER_TARGET}-)
         set(_CMAKE_TOOLCHAIN_PREFIX ${CMAKE_C_COMPILER_TARGET}-)

+ 2 - 1
Modules/CMakeDetermineCXXCompiler.cmake

@@ -136,8 +136,9 @@ if (CMAKE_CROSSCOMPILING  AND NOT  _CMAKE_TOOLCHAIN_PREFIX)
 
 
   if("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU|Clang|QCC")
   if("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU|Clang|QCC")
     get_filename_component(COMPILER_BASENAME "${CMAKE_CXX_COMPILER}" NAME)
     get_filename_component(COMPILER_BASENAME "${CMAKE_CXX_COMPILER}" NAME)
-    if (COMPILER_BASENAME MATCHES "^(.+-)(clan)?[gc]\\+\\+(-[0-9]+\\.[0-9]+\\.[0-9]+)?(\\.exe)?$")
+    if (COMPILER_BASENAME MATCHES "^(.+-)(clan)?[gc]\\+\\+(-[0-9]+(\\.[0-9]+)*)?(-[^.]+)?(\\.exe)?$")
       set(_CMAKE_TOOLCHAIN_PREFIX ${CMAKE_MATCH_1})
       set(_CMAKE_TOOLCHAIN_PREFIX ${CMAKE_MATCH_1})
+      set(_CMAKE_COMPILER_SUFFIX ${CMAKE_MATCH_5})
     elseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
     elseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
       if(CMAKE_CXX_COMPILER_TARGET)
       if(CMAKE_CXX_COMPILER_TARGET)
         set(_CMAKE_TOOLCHAIN_PREFIX ${CMAKE_CXX_COMPILER_TARGET}-)
         set(_CMAKE_TOOLCHAIN_PREFIX ${CMAKE_CXX_COMPILER_TARGET}-)

+ 0 - 7
Modules/CMakeFortranCompilerId.F.in

@@ -96,13 +96,6 @@
 # if defined(__FLANG_PATCHLEVEL__)
 # if defined(__FLANG_PATCHLEVEL__)
 #  define COMPILER_VERSION_PATCH DEC(__FLANG_PATCHLEVEL__)
 #  define COMPILER_VERSION_PATCH DEC(__FLANG_PATCHLEVEL__)
 # endif
 # endif
-#elif defined(_SGI_COMPILER_VERSION) || defined(_COMPILER_VERSION)
-        PRINT *, 'INFO:compiler[MIPSpro]'
-#       if 0
-!       This compiler is either not known or is too old to define an
-!       identification macro.  Try to identify the platform and guess that
-!       it is the native compiler.
-#       endif
 #elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__)
 #elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__)
         PRINT *, 'INFO:compiler[VisualAge]'
         PRINT *, 'INFO:compiler[VisualAge]'
 #elif defined(__hpux) || defined(__hpux__)
 #elif defined(__hpux) || defined(__hpux__)

+ 4 - 2
Modules/CMakeParseImplicitIncludeInfo.cmake

@@ -92,13 +92,15 @@ function(cmake_parse_implicit_include_line line lang id_var log_var state_var)
   endif()
   endif()
 
 
   # XL compiler
   # XL compiler
-  if("${CMAKE_${lang}_COMPILER_ID}" STREQUAL "XL" AND "${line}" MATCHES "^/"
+  if(("${CMAKE_${lang}_COMPILER_ID}" STREQUAL "XL"
+      OR "${CMAKE_${lang}_COMPILER_ID}" STREQUAL "XLClang")
+     AND "${line}" MATCHES "^/"
      AND ( ("${lang}" STREQUAL "Fortran" AND
      AND ( ("${lang}" STREQUAL "Fortran" AND
             "${line}" MATCHES "/xl[fF]entry " AND
             "${line}" MATCHES "/xl[fF]entry " AND
             "${line}" MATCHES "OSVAR\\([^ ]+\\)")
             "${line}" MATCHES "OSVAR\\([^ ]+\\)")
            OR
            OR
             (  ("${lang}" STREQUAL "C" OR "${lang}" STREQUAL "CXX") AND
             (  ("${lang}" STREQUAL "C" OR "${lang}" STREQUAL "CXX") AND
-            "${line}" MATCHES "/xl[cC]entry " AND
+            "${line}" MATCHES "/xl[cC]2?entry " AND
             "${line}" MATCHES " -qosvar=")
             "${line}" MATCHES " -qosvar=")
          )  )
          )  )
     # -qnostdinc cancels other stdinc flags, even if present
     # -qnostdinc cancels other stdinc flags, even if present

+ 98 - 13
Modules/Compiler/CrayPrgEnv.cmake

@@ -1,8 +1,93 @@
 # Guard against multiple inclusions
 # Guard against multiple inclusions
-if(__craylinux_crayprgenv)
+if(__cmake_craype_crayprgenv)
   return()
   return()
 endif()
 endif()
-set(__craylinux_crayprgenv 1)
+set(__cmake_craype_crayprgenv 1)
+
+# CrayPrgEnv: loaded when compiling through the Cray compiler wrapper.
+# The compiler wrapper can run on a front-end node or a compute node.
+
+cmake_policy(PUSH)
+cmake_policy(SET CMP0057 NEW)  # if IN_LIST
+
+# One-time setup of the craype environment.  First, check the wrapper config.
+# The wrapper's selection of a compiler (gcc, clang, intel, etc.) and
+# default include/library paths is selected using the "module" command.
+# The CRAYPE_LINK_TYPE environment variable partly controls if static
+# or dynamic binaries are generated (see __cmake_craype_linktype below).
+# Running cmake and then changing module and/or linktype configuration
+# may cause build problems (since the data in the cmake cache may no
+# longer be correct after the change).  We can look for this and warn
+# the user about it.  Second, use the "module" provided PKG_CONFIG_PATH-like
+# environment variable to add additional prefixes to the system prefix
+# path.
+function(__cmake_craype_setupenv)
+  if(NOT DEFINED __cmake_craype_setupenv_done)  # only done once per run
+    set(__cmake_craype_setupenv_done 1 PARENT_SCOPE)
+    unset(__cmake_check)
+    set(CMAKE_CRAYPE_LINKTYPE "$ENV{CRAYPE_LINK_TYPE}" CACHE STRING
+        "saved value of CRAYPE_LINK_TYPE environment variable")
+    set(CMAKE_CRAYPE_LOADEDMODULES "$ENV{LOADEDMODULES}" CACHE STRING
+        "saved value of LOADEDMODULES environment variable")
+    mark_as_advanced(CMAKE_CRAYPE_LINKTYPE CMAKE_CRAYPE_LOADEDMODULES)
+    if (NOT "${CMAKE_CRAYPE_LINKTYPE}" STREQUAL "$ENV{CRAYPE_LINK_TYPE}")
+      string(APPEND __cmake_check "CRAYPE_LINK_TYPE ")
+    endif()
+    if (NOT "${CMAKE_CRAYPE_LOADEDMODULES}" STREQUAL "$ENV{LOADEDMODULES}")
+      string(APPEND __cmake_check "LOADEDMODULES ")
+    endif()
+    if(DEFINED __cmake_check)
+      message(STATUS "NOTE: ${__cmake_check}changed since initial config!")
+      message(STATUS "NOTE: this may cause unexpected build errors.")
+    endif()
+    # loop over variables of interest
+    foreach(pkgcfgvar PKG_CONFIG_PATH PKG_CONFIG_PATH_DEFAULT
+            PE_PKG_CONFIG_PATH)
+      file(TO_CMAKE_PATH "$ENV{${pkgcfgvar}}" pkgcfg)
+      foreach(path ${pkgcfg})
+        string(REGEX REPLACE "(.*)/lib[^/]*/pkgconfig$" "\\1" path "${path}")
+        if(NOT "${path}" STREQUAL "" AND
+           NOT "${path}" IN_LIST CMAKE_SYSTEM_PREFIX_PATH)
+          list(APPEND CMAKE_SYSTEM_PREFIX_PATH "${path}")
+        endif()
+      endforeach()
+    endforeach()
+    # push it up out of this function into the parent scope
+    set(CMAKE_SYSTEM_PREFIX_PATH "${CMAKE_SYSTEM_PREFIX_PATH}" PARENT_SCOPE)
+  endif()
+endfunction()
+
+# The wrapper disables dynamic linking by default.  Dynamic linking is
+# enabled either by setting $ENV{CRAYPE_LINK_TYPE} to "dynamic" or by
+# specifying "-dynamic" to the wrapper when linking.  Specifying "-static"
+# to the wrapper when linking takes priority over $ENV{CRAYPE_LINK_TYPE}.
+# Furthermore, if you specify multiple "-dynamic" and "-static" flags to
+# the wrapper when linking, the last one will win.  In this case, the
+# wrapper will also print a warning like:
+#  Warning: -dynamic was already seen on command line, overriding with -static.
+#
+# note that cmake applies both CMAKE_${lang}_FLAGS and CMAKE_EXE_LINKER_FLAGS
+# (in that order) to the linking command, so -dynamic can appear in either
+# variable.
+function(__cmake_craype_linktype lang rv)
+  # start with ENV, but allow flags to override
+  if("$ENV{CRAYPE_LINK_TYPE}" STREQUAL "dynamic")
+    set(linktype dynamic)
+  else()
+    set(linktype static)
+  endif()
+  # combine flags and convert to a list so we can apply the flags in order
+  set(linkflags "${CMAKE_${lang}_FLAGS} ${CMAKE_EXE_LINKER_FLAGS}")
+  string(REPLACE " " ";" linkflags "${linkflags}")
+  foreach(flag IN LISTS linkflags)
+    if("${flag}" STREQUAL "-dynamic")
+      set(linktype dynamic)
+    elseif("${flag}" STREQUAL "-static")
+      set(linktype static)
+    endif()
+  endforeach()
+  set(${rv} ${linktype} PARENT_SCOPE)
+endfunction()
 
 
 macro(__CrayPrgEnv_setup lang)
 macro(__CrayPrgEnv_setup lang)
   if(DEFINED ENV{CRAYPE_VERSION})
   if(DEFINED ENV{CRAYPE_VERSION})
@@ -13,25 +98,25 @@ macro(__CrayPrgEnv_setup lang)
     message(STATUS "Cray Programming Environment (unknown version) ${lang}")
     message(STATUS "Cray Programming Environment (unknown version) ${lang}")
   endif()
   endif()
 
 
+  # setup the craype environment
+  __cmake_craype_setupenv()
+
   # Flags for the Cray wrappers
   # Flags for the Cray wrappers
   set(CMAKE_STATIC_LIBRARY_LINK_${lang}_FLAGS "-static")
   set(CMAKE_STATIC_LIBRARY_LINK_${lang}_FLAGS "-static")
   set(CMAKE_SHARED_LIBRARY_CREATE_${lang}_FLAGS "-shared")
   set(CMAKE_SHARED_LIBRARY_CREATE_${lang}_FLAGS "-shared")
   set(CMAKE_SHARED_LIBRARY_LINK_${lang}_FLAGS "-dynamic")
   set(CMAKE_SHARED_LIBRARY_LINK_${lang}_FLAGS "-dynamic")
 
 
-  # If the link type is not explicitly specified in the environment then
-  # the Cray wrappers assume that the code will be built statically so
-  # we check the following condition(s) are NOT met
-  #  Compiler flags are explicitly dynamic
-  #  Env var is dynamic and compiler flags are not explicitly static
-  if(NOT (((CMAKE_${lang}_FLAGS MATCHES "(^| )-dynamic($| )") OR
-         (CMAKE_EXE_LINKER_FLAGS MATCHES "(^| )-dynamic($| )"))
-         OR
-         (("$ENV{CRAYPE_LINK_TYPE}" STREQUAL "dynamic") AND
-          NOT ((CMAKE_${lang}_FLAGS MATCHES "(^| )-static($| )") OR
-               (CMAKE_EXE_LINKER_FLAGS MATCHES "(^| )-static($| )")))))
+  # determine linktype from environment and compiler flags
+  __cmake_craype_linktype(${lang} __cmake_craype_${lang}_linktype)
+
+  # switch off shared libs if we get a static linktype
+  if("${__cmake_craype_${lang}_linktype}" STREQUAL "static")
     set_property(GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS FALSE)
     set_property(GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS FALSE)
     set(BUILD_SHARED_LIBS FALSE CACHE BOOL "")
     set(BUILD_SHARED_LIBS FALSE CACHE BOOL "")
     set(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
     set(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
     set(CMAKE_LINK_SEARCH_START_STATIC TRUE)
     set(CMAKE_LINK_SEARCH_START_STATIC TRUE)
   endif()
   endif()
+
 endmacro()
 endmacro()
+
+cmake_policy(POP)

+ 2 - 2
Modules/Compiler/GNU-FindBinUtils.cmake

@@ -18,7 +18,7 @@ get_filename_component(__gcc_hints "${CMAKE_${_CMAKE_PROCESSING_LANGUAGE}_COMPIL
 find_program(CMAKE_${_CMAKE_PROCESSING_LANGUAGE}_COMPILER_AR NAMES
 find_program(CMAKE_${_CMAKE_PROCESSING_LANGUAGE}_COMPILER_AR NAMES
     "${_CMAKE_TOOLCHAIN_PREFIX}gcc-ar-${__version_x_y}"
     "${_CMAKE_TOOLCHAIN_PREFIX}gcc-ar-${__version_x_y}"
     "${_CMAKE_TOOLCHAIN_PREFIX}gcc-ar-${__version_x}"
     "${_CMAKE_TOOLCHAIN_PREFIX}gcc-ar-${__version_x}"
-    "${_CMAKE_TOOLCHAIN_PREFIX}gcc-ar"
+    "${_CMAKE_TOOLCHAIN_PREFIX}gcc-ar${_CMAKE_COMPILER_SUFFIX}"
     HINTS ${__gcc_hints}
     HINTS ${__gcc_hints}
     DOC "A wrapper around 'ar' adding the appropriate '--plugin' option for the GCC compiler"
     DOC "A wrapper around 'ar' adding the appropriate '--plugin' option for the GCC compiler"
 )
 )
@@ -28,7 +28,7 @@ mark_as_advanced(CMAKE_${_CMAKE_PROCESSING_LANGUAGE}_COMPILER_AR)
 find_program(CMAKE_${_CMAKE_PROCESSING_LANGUAGE}_COMPILER_RANLIB NAMES
 find_program(CMAKE_${_CMAKE_PROCESSING_LANGUAGE}_COMPILER_RANLIB NAMES
     "${_CMAKE_TOOLCHAIN_PREFIX}gcc-ranlib-${__version_x_y}"
     "${_CMAKE_TOOLCHAIN_PREFIX}gcc-ranlib-${__version_x_y}"
     "${_CMAKE_TOOLCHAIN_PREFIX}gcc-ranlib-${__version_x}"
     "${_CMAKE_TOOLCHAIN_PREFIX}gcc-ranlib-${__version_x}"
-    "${_CMAKE_TOOLCHAIN_PREFIX}gcc-ranlib"
+    "${_CMAKE_TOOLCHAIN_PREFIX}gcc-ranlib${_CMAKE_COMPILER_SUFFIX}"
     HINTS ${__gcc_hints}
     HINTS ${__gcc_hints}
     DOC "A wrapper around 'ranlib' adding the appropriate '--plugin' option for the GCC compiler"
     DOC "A wrapper around 'ranlib' adding the appropriate '--plugin' option for the GCC compiler"
 )
 )

+ 4 - 12
Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake

@@ -1,14 +1,6 @@
 
 
 set(_compiler_id_version_compute "
 set(_compiler_id_version_compute "
-# if defined(__ibmxl__)
-#  define @PREFIX@COMPILER_VERSION_MAJOR @MACRO_DEC@(__ibmxl_version__)
-#  define @PREFIX@COMPILER_VERSION_MINOR @MACRO_DEC@(__ibmxl_release__)
-#  define @PREFIX@COMPILER_VERSION_PATCH @MACRO_DEC@(__ibmxl_modification__)
-#  define @PREFIX@COMPILER_VERSION_TWEAK @MACRO_DEC@(__ibmxl_ptf_fix_level__)
-# else
-   /* __IBMC__ = VRP */
-#  define @PREFIX@COMPILER_VERSION_MAJOR @MACRO_DEC@(__IBMC__/100)
-#  define @PREFIX@COMPILER_VERSION_MINOR @MACRO_DEC@(__IBMC__/10 % 10)
-#  define @PREFIX@COMPILER_VERSION_PATCH @MACRO_DEC@(__IBMC__    % 10)
-# endif
-")
+  /* __IBMC__ = VRP */
+# define @PREFIX@COMPILER_VERSION_MAJOR @MACRO_DEC@(__IBMC__/100)
+# define @PREFIX@COMPILER_VERSION_MINOR @MACRO_DEC@(__IBMC__/10 % 10)
+# define @PREFIX@COMPILER_VERSION_PATCH @MACRO_DEC@(__IBMC__    % 10)")

+ 4 - 12
Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake

@@ -1,14 +1,6 @@
 
 
 set(_compiler_id_version_compute "
 set(_compiler_id_version_compute "
-# if defined(__ibmxl__)
-#  define @PREFIX@COMPILER_VERSION_MAJOR @MACRO_DEC@(__ibmxl_version__)
-#  define @PREFIX@COMPILER_VERSION_MINOR @MACRO_DEC@(__ibmxl_release__)
-#  define @PREFIX@COMPILER_VERSION_PATCH @MACRO_DEC@(__ibmxl_modification__)
-#  define @PREFIX@COMPILER_VERSION_TWEAK @MACRO_DEC@(__ibmxl_ptf_fix_level__)
-# else
-   /* __IBMCPP__ = VRP */
-#  define @PREFIX@COMPILER_VERSION_MAJOR @MACRO_DEC@(__IBMCPP__/100)
-#  define @PREFIX@COMPILER_VERSION_MINOR @MACRO_DEC@(__IBMCPP__/10 % 10)
-#  define @PREFIX@COMPILER_VERSION_PATCH @MACRO_DEC@(__IBMCPP__    % 10)
-# endif
-")
+  /* __IBMCPP__ = VRP */
+# define @PREFIX@COMPILER_VERSION_MAJOR @MACRO_DEC@(__IBMCPP__/100)
+# define @PREFIX@COMPILER_VERSION_MINOR @MACRO_DEC@(__IBMCPP__/10 % 10)
+# define @PREFIX@COMPILER_VERSION_PATCH @MACRO_DEC@(__IBMCPP__    % 10)")

+ 0 - 1
Modules/Compiler/MIPSpro-C.cmake

@@ -1 +0,0 @@
-set(CMAKE_C_VERBOSE_FLAG "-v")

+ 0 - 1
Modules/Compiler/MIPSpro-CXX.cmake

@@ -1 +0,0 @@
-set(CMAKE_CXX_VERBOSE_FLAG "-v")

+ 0 - 15
Modules/Compiler/MIPSpro-DetermineCompiler.cmake

@@ -1,15 +0,0 @@
-
-set(_compiler_id_pp_test "defined(_SGI_COMPILER_VERSION) || defined(_COMPILER_VERSION)")
-
-set(_compiler_id_version_compute "
-# if defined(_SGI_COMPILER_VERSION)
-  /* _SGI_COMPILER_VERSION = VRP */
-#  define @PREFIX@COMPILER_VERSION_MAJOR @MACRO_DEC@(_SGI_COMPILER_VERSION/100)
-#  define @PREFIX@COMPILER_VERSION_MINOR @MACRO_DEC@(_SGI_COMPILER_VERSION/10 % 10)
-#  define @PREFIX@COMPILER_VERSION_PATCH @MACRO_DEC@(_SGI_COMPILER_VERSION    % 10)
-# else
-  /* _COMPILER_VERSION = VRP */
-#  define @PREFIX@COMPILER_VERSION_MAJOR @MACRO_DEC@(_COMPILER_VERSION/100)
-#  define @PREFIX@COMPILER_VERSION_MINOR @MACRO_DEC@(_COMPILER_VERSION/10 % 10)
-#  define @PREFIX@COMPILER_VERSION_PATCH @MACRO_DEC@(_COMPILER_VERSION    % 10)
-# endif")

+ 0 - 3
Modules/Compiler/MIPSpro-Fortran.cmake

@@ -1,3 +0,0 @@
-set(CMAKE_Fortran_VERBOSE_FLAG "-v")
-set(CMAKE_Fortran_FORMAT_FIXED_FLAG "-fixedform")
-set(CMAKE_Fortran_FORMAT_FREE_FLAG "-freeform")

+ 1 - 1
Modules/Compiler/XL-C-DetermineCompiler.cmake

@@ -1,4 +1,4 @@
 
 
-set(_compiler_id_pp_test "defined(__ibmxl__) || (defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ >= 800)")
+set(_compiler_id_pp_test "defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ >= 800")
 
 
 include("${CMAKE_CURRENT_LIST_DIR}/IBMCPP-C-DetermineVersionInternal.cmake")
 include("${CMAKE_CURRENT_LIST_DIR}/IBMCPP-C-DetermineVersionInternal.cmake")

+ 8 - 29
Modules/Compiler/XL-C.cmake

@@ -6,36 +6,15 @@ string(APPEND CMAKE_C_FLAGS_MINSIZEREL_INIT " -DNDEBUG")
 # -qthreaded = Ensures that all optimizations will be thread-safe
 # -qthreaded = Ensures that all optimizations will be thread-safe
 string(APPEND CMAKE_C_FLAGS_INIT " -qthreaded")
 string(APPEND CMAKE_C_FLAGS_INIT " -qthreaded")
 
 
-# XL v13.1.1 for Linux ppc64 little-endian switched to using a clang based
-# front end and accepts the -std= option while only reserving -qlanglevel= for
-# compatibility.  All other versions (previous versions on Linux ppc64
-# little-endian, all versions on Linux ppc64 big-endian, all versions on AIX
-# and BGQ, etc) are derived from the UNIX compiler and only accept the
-# -qlanglvl option.
 if (CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 10.1)
 if (CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 10.1)
-  if (CMAKE_SYSTEM MATCHES "Linux.*ppc64le" AND
-      CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 13.1.1)
-    set(CMAKE_C90_STANDARD_COMPILE_OPTION  "-std=c89")
-    set(CMAKE_C90_EXTENSION_COMPILE_OPTION "-std=gnu89")
-    set(CMAKE_C99_STANDARD_COMPILE_OPTION  "-std=c99")
-    set(CMAKE_C99_EXTENSION_COMPILE_OPTION "-std=gnu99")
-    if (CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 13.1.2)
-      set(CMAKE_C11_STANDARD_COMPILE_OPTION  "-std=c11")
-      set(CMAKE_C11_EXTENSION_COMPILE_OPTION "-std=gnu11")
-    else ()
-      set(CMAKE_C11_STANDARD_COMPILE_OPTION "-qlanglvl=extc1x")
-      set(CMAKE_C11_EXTENSION_COMPILE_OPTION "-qlanglvl=extc1x")
-    endif ()
-  else ()
-    set(CMAKE_C90_STANDARD_COMPILE_OPTION "-qlanglvl=stdc89")
-    set(CMAKE_C90_EXTENSION_COMPILE_OPTION "-qlanglvl=extc89")
-    set(CMAKE_C99_STANDARD_COMPILE_OPTION "-qlanglvl=stdc99")
-    set(CMAKE_C99_EXTENSION_COMPILE_OPTION "-qlanglvl=extc99")
-    if (CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 12.1)
-      set(CMAKE_C11_STANDARD_COMPILE_OPTION "-qlanglvl=extc1x")
-      set(CMAKE_C11_EXTENSION_COMPILE_OPTION "-qlanglvl=extc1x")
-    endif ()
+  set(CMAKE_C90_STANDARD_COMPILE_OPTION "-qlanglvl=stdc89")
+  set(CMAKE_C90_EXTENSION_COMPILE_OPTION "-qlanglvl=extc89")
+  set(CMAKE_C99_STANDARD_COMPILE_OPTION "-qlanglvl=stdc99")
+  set(CMAKE_C99_EXTENSION_COMPILE_OPTION "-qlanglvl=extc99")
+  if (CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 12.1)
+    set(CMAKE_C11_STANDARD_COMPILE_OPTION "-qlanglvl=extc1x")
+    set(CMAKE_C11_EXTENSION_COMPILE_OPTION "-qlanglvl=extc1x")
   endif ()
   endif ()
 endif()
 endif()
 
 
-__compiler_check_default_language_standard(C 10.1 90)
+__compiler_check_default_language_standard(C 10.1 90 11.1 99)

+ 1 - 1
Modules/Compiler/XL-CXX-DetermineCompiler.cmake

@@ -1,4 +1,4 @@
 
 
-set(_compiler_id_pp_test "defined(__ibmxl__) || (defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ >= 800)")
+set(_compiler_id_pp_test "defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ >= 800")
 
 
 include("${CMAKE_CURRENT_LIST_DIR}/IBMCPP-CXX-DetermineVersionInternal.cmake")
 include("${CMAKE_CURRENT_LIST_DIR}/IBMCPP-CXX-DetermineVersionInternal.cmake")

+ 7 - 32
Modules/Compiler/XL-CXX.cmake

@@ -6,41 +6,16 @@ string(APPEND CMAKE_CXX_FLAGS_MINSIZEREL_INIT " -DNDEBUG")
 # -qthreaded = Ensures that all optimizations will be thread-safe
 # -qthreaded = Ensures that all optimizations will be thread-safe
 string(APPEND CMAKE_CXX_FLAGS_INIT " -qthreaded")
 string(APPEND CMAKE_CXX_FLAGS_INIT " -qthreaded")
 
 
-# XL v13.1.1 for Linux ppc64 little-endian switched to using a clang based
-# front end and accepts the -std= option while only reserving -qlanglevel= for
-# compatibility.  All other versions (previous versions on Linux ppc64
-# little-endian, all versions on Linux ppc64 big-endian, all versions on AIX
-# and BGQ, etc) are derived from the UNIX compiler and only accept the
-# -qlanglvl option.
 if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 10.1)
 if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 10.1)
-  if (CMAKE_SYSTEM MATCHES "Linux.*ppc64")
-    if (CMAKE_SYSTEM MATCHES "Linux.*ppc64le" AND
-        CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 13.1.1)
-      set(CMAKE_CXX98_STANDARD_COMPILE_OPTION "-std=c++98")
-      set(CMAKE_CXX98_EXTENSION_COMPILE_OPTION "-std=gnu++98")
-      if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 13.1.2)
-        set(CMAKE_CXX11_STANDARD_COMPILE_OPTION "-std=c++11")
-        set(CMAKE_CXX11_EXTENSION_COMPILE_OPTION "-std=gnu++11")
-        set(CMAKE_CXX14_STANDARD_COMPILE_OPTION "-std=c++1y")
-        set(CMAKE_CXX14_EXTENSION_COMPILE_OPTION "-qlanglvl=extended1y")
-      else ()
-        set(CMAKE_CXX11_STANDARD_COMPILE_OPTION "-qlanglvl=extended0x")
-        set(CMAKE_CXX11_EXTENSION_COMPILE_OPTION "-qlanglvl=extended0x")
-      endif ()
-    else ()
-      # The non-clang based Linux ppc64 compiler, both big-endian and
-      # little-endian lacks, the non-extension language level flags
-      set(CMAKE_CXX98_STANDARD_COMPILE_OPTION "-qlanglvl=extended")
-      set(CMAKE_CXX98_EXTENSION_COMPILE_OPTION "-qlanglvl=extended")
-      set(CMAKE_CXX11_STANDARD_COMPILE_OPTION "-qlanglvl=extended0x")
-      set(CMAKE_CXX11_EXTENSION_COMPILE_OPTION "-qlanglvl=extended0x")
-    endif ()
-  else ()
+  if(CMAKE_SYSTEM MATCHES "Linux")
+    set(CMAKE_CXX98_STANDARD_COMPILE_OPTION "")
+    set(CMAKE_CXX98_EXTENSION_COMPILE_OPTION "")
+  else()
     set(CMAKE_CXX98_STANDARD_COMPILE_OPTION "-qlanglvl=strict98")
     set(CMAKE_CXX98_STANDARD_COMPILE_OPTION "-qlanglvl=strict98")
     set(CMAKE_CXX98_EXTENSION_COMPILE_OPTION "-qlanglvl=extended")
     set(CMAKE_CXX98_EXTENSION_COMPILE_OPTION "-qlanglvl=extended")
-    set(CMAKE_CXX11_STANDARD_COMPILE_OPTION "-qlanglvl=extended0x")
-    set(CMAKE_CXX11_EXTENSION_COMPILE_OPTION "-qlanglvl=extended0x")
-  endif ()
+  endif()
+  set(CMAKE_CXX11_STANDARD_COMPILE_OPTION "-qlanglvl=extended0x")
+  set(CMAKE_CXX11_EXTENSION_COMPILE_OPTION "-qlanglvl=extended0x")
 endif ()
 endif ()
 
 
 __compiler_check_default_language_standard(CXX 10.1 98)
 __compiler_check_default_language_standard(CXX 10.1 98)

+ 0 - 22
Modules/Compiler/XL.cmake

@@ -10,12 +10,6 @@ set(__COMPILER_XL 1)
 
 
 include(Compiler/CMakeCommonCompilerMacros)
 include(Compiler/CMakeCommonCompilerMacros)
 
 
-# Find the CreateExportList program that comes with this toolchain.
-find_program(CMAKE_XL_CreateExportList
-  NAMES CreateExportList
-  DOC "IBM XL CreateExportList tool"
-  )
-
 macro(__compiler_xl lang)
 macro(__compiler_xl lang)
   # Feature flags.
   # Feature flags.
   set(CMAKE_${lang}_VERBOSE_FLAG "-V")
   set(CMAKE_${lang}_VERBOSE_FLAG "-V")
@@ -35,20 +29,4 @@ macro(__compiler_xl lang)
   set(CMAKE_${lang}_CREATE_ASSEMBLY_SOURCE     "<CMAKE_${lang}_COMPILER> <DEFINES> <INCLUDES> <FLAGS> -S <SOURCE> -o <ASSEMBLY_SOURCE>")
   set(CMAKE_${lang}_CREATE_ASSEMBLY_SOURCE     "<CMAKE_${lang}_COMPILER> <DEFINES> <INCLUDES> <FLAGS> -S <SOURCE> -o <ASSEMBLY_SOURCE>")
 
 
   set(CMAKE_DEPFILE_FLAGS_${lang} "-MF <DEPFILE> -qmakedep=gcc")
   set(CMAKE_DEPFILE_FLAGS_${lang} "-MF <DEPFILE> -qmakedep=gcc")
-
-  # CMAKE_XL_CreateExportList is part of the AIX XL compilers but not the linux ones.
-  # If we found the tool, we'll use it to create exports, otherwise stick with the regular
-  # create shared library compile line.
-  if (CMAKE_XL_CreateExportList)
-    # The compiler front-end passes all object files, archive files, and shared
-    # library files named on the command line to CreateExportList to create a
-    # list of all symbols to be exported from the shared library.  This causes
-    # all archive members to be copied into the shared library whether they are
-    # needed or not.  Instead we run the tool ourselves to pass only the object
-    # files so that we export only the symbols actually provided by the sources.
-    set(CMAKE_${lang}_CREATE_SHARED_LIBRARY
-      "${CMAKE_XL_CreateExportList} <OBJECT_DIR>/objects.exp <OBJECTS>"
-      "<CMAKE_${lang}_COMPILER> <CMAKE_SHARED_LIBRARY_${lang}_FLAGS> -Wl,-bE:<OBJECT_DIR>/objects.exp <LANGUAGE_COMPILE_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_${lang}_FLAGS> <SONAME_FLAG><TARGET_SONAME> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>"
-      )
-  endif()
 endmacro()
 endmacro()

+ 8 - 0
Modules/Compiler/XLClang-C-DetermineCompiler.cmake

@@ -0,0 +1,8 @@
+set(_compiler_id_pp_test "defined(__ibmxl__) && defined(__clang__)")
+
+set(_compiler_id_version_compute "
+# define @PREFIX@COMPILER_VERSION_MAJOR @MACRO_DEC@(__ibmxl_version__)
+# define @PREFIX@COMPILER_VERSION_MINOR @MACRO_DEC@(__ibmxl_release__)
+# define @PREFIX@COMPILER_VERSION_PATCH @MACRO_DEC@(__ibmxl_modification__)
+# define @PREFIX@COMPILER_VERSION_TWEAK @MACRO_DEC@(__ibmxl_ptf_fix_level__)
+")

+ 17 - 0
Modules/Compiler/XLClang-C.cmake

@@ -0,0 +1,17 @@
+include(Compiler/XLClang)
+__compiler_xlclang(C)
+
+if (CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 13.1.1)
+  set(CMAKE_C90_STANDARD_COMPILE_OPTION  "-std=c89")
+  set(CMAKE_C90_EXTENSION_COMPILE_OPTION "-std=gnu89")
+  set(CMAKE_C99_STANDARD_COMPILE_OPTION  "-std=c99")
+  set(CMAKE_C99_EXTENSION_COMPILE_OPTION "-std=gnu99")
+  set(CMAKE_C11_STANDARD_COMPILE_OPTION  "-qlanglvl=extc1x")
+  set(CMAKE_C11_EXTENSION_COMPILE_OPTION "-qlanglvl=extc1x")
+  if (CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 13.1.2)
+    set(CMAKE_C11_STANDARD_COMPILE_OPTION  "-std=c11")
+    set(CMAKE_C11_EXTENSION_COMPILE_OPTION "-std=gnu11")
+  endif ()
+endif()
+
+__compiler_check_default_language_standard(C 13.1.1 99)

+ 8 - 0
Modules/Compiler/XLClang-CXX-DetermineCompiler.cmake

@@ -0,0 +1,8 @@
+set(_compiler_id_pp_test "defined(__ibmxl__) && defined(__clang__)")
+
+set(_compiler_id_version_compute "
+# define @PREFIX@COMPILER_VERSION_MAJOR @MACRO_DEC@(__ibmxl_version__)
+# define @PREFIX@COMPILER_VERSION_MINOR @MACRO_DEC@(__ibmxl_release__)
+# define @PREFIX@COMPILER_VERSION_PATCH @MACRO_DEC@(__ibmxl_modification__)
+# define @PREFIX@COMPILER_VERSION_TWEAK @MACRO_DEC@(__ibmxl_ptf_fix_level__)
+")

+ 20 - 0
Modules/Compiler/XLClang-CXX.cmake

@@ -0,0 +1,20 @@
+include(Compiler/XLClang)
+__compiler_xlclang(CXX)
+
+if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 13.1.1)
+  set(CMAKE_CXX98_STANDARD_COMPILE_OPTION  "")
+  set(CMAKE_CXX98_EXTENSION_COMPILE_OPTION "")
+  set(CMAKE_CXX11_STANDARD_COMPILE_OPTION  "-qlanglvl=extended0x")
+  set(CMAKE_CXX11_EXTENSION_COMPILE_OPTION "-qlanglvl=extended0x")
+  if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 13.1.2)
+    set(CMAKE_CXX11_STANDARD_COMPILE_OPTION  "-std=c++11")
+    set(CMAKE_CXX11_EXTENSION_COMPILE_OPTION "-std=gnu++11")
+    set(CMAKE_CXX14_STANDARD_COMPILE_OPTION  "-std=c++1y")
+    set(CMAKE_CXX14_EXTENSION_COMPILE_OPTION "-std=gnu++1y")
+  endif ()
+endif()
+
+__compiler_check_default_language_standard(CXX 13.1.1 98)
+
+set(CMAKE_CXX_COMPILE_OBJECT
+  "<CMAKE_CXX_COMPILER> -x c++ <DEFINES> <INCLUDES> <FLAGS> -o <OBJECT> -c <SOURCE>")

+ 22 - 0
Modules/Compiler/XLClang.cmake

@@ -0,0 +1,22 @@
+# Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
+# file Copyright.txt or https://cmake.org/licensing for details.
+
+
+# This module is shared by multiple languages; use include blocker.
+if(__COMPILER_XLCLANG)
+  return()
+endif()
+set(__COMPILER_XLCLANG 1)
+
+include(Compiler/XL)
+
+macro(__compiler_xlclang lang)
+  __compiler_xl(${lang})
+
+  # Feature flags.
+  set(CMAKE_${lang}_VERBOSE_FLAG "-V")
+  set(CMAKE_${lang}_COMPILE_OPTIONS_PIC "-fPIC")
+  set(CMAKE_${lang}_COMPILE_OPTIONS_PIE "-fPIC")
+  set(CMAKE_${lang}_RESPONSE_FILE_FLAG "@")
+  set(CMAKE_${lang}_RESPONSE_FILE_LINK_FLAG "@")
+endmacro()

+ 39 - 9
Modules/FindCups.cmake

@@ -5,18 +5,38 @@
 FindCups
 FindCups
 --------
 --------
 
 
-Try to find the Cups printing system
+Find the CUPS printing system.
 
 
-Once done this will define
+Set CUPS_REQUIRE_IPP_DELETE_ATTRIBUTE to TRUE if you need a version which
+features this function (i.e. at least 1.1.19)
 
 
-::
+Imported targets
+^^^^^^^^^^^^^^^^
 
 
-  CUPS_FOUND - system has Cups
-  CUPS_INCLUDE_DIR - the Cups include directory
-  CUPS_LIBRARIES - Libraries needed to use Cups
-  CUPS_VERSION_STRING - version of Cups found (since CMake 2.8.8)
-  Set CUPS_REQUIRE_IPP_DELETE_ATTRIBUTE to TRUE if you need a version which
-  features this function (i.e. at least 1.1.19)
+This module defines :prop_tgt:`IMPORTED` target ``Cups::Cups``, if Cups has
+been found.
+
+Result variables
+^^^^^^^^^^^^^^^^
+
+This module will set the following variables in your project:
+
+``CUPS_FOUND``
+  true if CUPS headers and libraries were found
+``CUPS_INCLUDE_DIRS``
+  the directory containing the Cups headers
+``CUPS_LIBRARIES``
+  the libraries to link against to use CUPS.
+``CUPS_VERSION_STRING``
+  the version of CUPS found (since CMake 2.8.8)
+
+Cache variables
+^^^^^^^^^^^^^^^
+
+The following cache variables may also be set:
+
+``CUPS_INCLUDE_DIR``
+  the directory containing the Cups headers
 #]=======================================================================]
 #]=======================================================================]
 
 
 find_path(CUPS_INCLUDE_DIR cups/cups.h )
 find_path(CUPS_INCLUDE_DIR cups/cups.h )
@@ -66,3 +86,13 @@ else ()
 endif ()
 endif ()
 
 
 mark_as_advanced(CUPS_INCLUDE_DIR CUPS_LIBRARIES)
 mark_as_advanced(CUPS_INCLUDE_DIR CUPS_LIBRARIES)
+
+if (CUPS_FOUND)
+    set(CUPS_INCLUDE_DIRS "${CUPS_INCLUDE_DIR}")
+    if (NOT TARGET Cups::Cups)
+        add_library(Cups::Cups INTERFACE IMPORTED)
+        set_target_properties(Cups::Cups PROPERTIES
+            INTERFACE_LINK_LIBRARIES      "${CUPS_LIBRARIES}"
+            INTERFACE_INCLUDE_DIRECTORIES "${CUPS_INCLUDE_DIR}")
+    endif ()
+endif ()

+ 0 - 1
Modules/FindOpenMP.cmake

@@ -96,7 +96,6 @@ function(_OPENMP_FLAG_CANDIDATES LANG)
     else()
     else()
       set(OMP_FLAG_Intel "-qopenmp")
       set(OMP_FLAG_Intel "-qopenmp")
     endif()
     endif()
-    set(OMP_FLAG_MIPSpro "-mp")
     set(OMP_FLAG_MSVC "-openmp")
     set(OMP_FLAG_MSVC "-openmp")
     set(OMP_FLAG_PathScale "-openmp")
     set(OMP_FLAG_PathScale "-openmp")
     set(OMP_FLAG_NAG "-openmp")
     set(OMP_FLAG_NAG "-openmp")

+ 2 - 3
Modules/FortranCInterface/CMakeLists.txt

@@ -15,11 +15,11 @@ int main() { return 0; }
 # List manglings of global symbol names to try.
 # List manglings of global symbol names to try.
 set(global_symbols
 set(global_symbols
   my_sub    # VisualAge
   my_sub    # VisualAge
-  my_sub_   # GNU, Intel, HP, SunPro, MIPSpro, PGI
+  my_sub_   # GNU, Intel, HP, SunPro, PGI
   my_sub__  # GNU g77
   my_sub__  # GNU g77
   MY_SUB    # Intel on Windows
   MY_SUB    # Intel on Windows
   mysub     # VisualAge
   mysub     # VisualAge
-  mysub_    # GNU, Intel, HP, SunPro, MIPSpro, PGI
+  mysub_    # GNU, Intel, HP, SunPro, PGI
   MYSUB     # Intel on Windows
   MYSUB     # Intel on Windows
   ${FortranCInterface_GLOBAL_SYMBOLS}
   ${FortranCInterface_GLOBAL_SYMBOLS}
   )
   )
@@ -48,7 +48,6 @@ set(module_symbols
 list(REMOVE_DUPLICATES module_symbols)
 list(REMOVE_DUPLICATES module_symbols)
 
 
 # Note that some compiler manglings cannot be invoked from C:
 # Note that some compiler manglings cannot be invoked from C:
-#   MIPSpro uses "MY_SUB.in.MY_MODULE"
 #   SunPro uses "my_module.my_sub_"
 #   SunPro uses "my_module.my_sub_"
 #   PathScale uses "MY_SUB.in.MY_MODULE"
 #   PathScale uses "MY_SUB.in.MY_MODULE"
 
 

+ 8 - 1
Modules/Internal/CPack/CPackRPM.cmake

@@ -63,6 +63,11 @@ function(get_unix_permissions_octal_notation PERMISSIONS_VAR RETURN_VAR)
   set(${RETURN_VAR} "${OWNER_PERMISSIONS}${GROUP_PERMISSIONS}${WORLD_PERMISSIONS}" PARENT_SCOPE)
   set(${RETURN_VAR} "${OWNER_PERMISSIONS}${GROUP_PERMISSIONS}${WORLD_PERMISSIONS}" PARENT_SCOPE)
 endfunction()
 endfunction()
 
 
+function(cpack_rpm_exact_regex regex_var string)
+  string(REGEX REPLACE "([][+.*()^])" "\\\\\\1" regex "${string}")
+  set("${regex_var}" "${regex}" PARENT_SCOPE)
+endfunction()
+
 function(cpack_rpm_prepare_relocation_paths)
 function(cpack_rpm_prepare_relocation_paths)
   # set appropriate prefix, remove possible trailing slash and convert backslashes to slashes
   # set appropriate prefix, remove possible trailing slash and convert backslashes to slashes
   if(CPACK_RPM_${CPACK_RPM_PACKAGE_COMPONENT}_PACKAGE_PREFIX)
   if(CPACK_RPM_${CPACK_RPM_PACKAGE_COMPONENT}_PACKAGE_PREFIX)
@@ -482,7 +487,9 @@ function(cpack_rpm_prepare_install_files INSTALL_FILES_LIST WDIR PACKAGE_PREFIXE
         # recalculate path length after conversion to canonical form
         # recalculate path length after conversion to canonical form
         string(LENGTH "${SYMLINK_POINT_}" SYMLINK_POINT_LENGTH_)
         string(LENGTH "${SYMLINK_POINT_}" SYMLINK_POINT_LENGTH_)
 
 
-        if(SYMLINK_POINT_ MATCHES "${WDIR}/.*")
+        cpack_rpm_exact_regex(IN_SYMLINK_POINT_REGEX "${WDIR}")
+        string(APPEND IN_SYMLINK_POINT_REGEX "/.*")
+        if(SYMLINK_POINT_ MATCHES "${IN_SYMLINK_POINT_REGEX}")
           # only symlinks that are pointing inside the packaging structure should be checked for relocation
           # only symlinks that are pointing inside the packaging structure should be checked for relocation
           string(SUBSTRING "${SYMLINK_POINT_}" ${WDR_LEN_} -1 SYMLINK_POINT_WD_)
           string(SUBSTRING "${SYMLINK_POINT_}" ${WDR_LEN_} -1 SYMLINK_POINT_WD_)
           cpack_rpm_symlink_get_relocation_prefixes("${F}" "${PACKAGE_PREFIXES}" "SYMLINK_RELOCATIONS")
           cpack_rpm_symlink_get_relocation_prefixes("${F}" "${PACKAGE_PREFIXES}" "SYMLINK_RELOCATIONS")

+ 22 - 0
Modules/Platform/AIX-XL.cmake

@@ -25,4 +25,26 @@ macro(__aix_compiler_xl lang)
   set(CMAKE_SHARED_MODULE_${lang}_FLAGS  " ")
   set(CMAKE_SHARED_MODULE_${lang}_FLAGS  " ")
 
 
   set(CMAKE_${lang}_LINK_FLAGS "-Wl,-bnoipath")
   set(CMAKE_${lang}_LINK_FLAGS "-Wl,-bnoipath")
+
+  # Find the CreateExportList program that comes with this toolchain.
+  find_program(CMAKE_XL_CreateExportList
+    NAMES CreateExportList
+    DOC "IBM XL CreateExportList tool"
+    )
+
+  # CMAKE_XL_CreateExportList is part of the AIX XL compilers but not the linux ones.
+  # If we found the tool, we'll use it to create exports, otherwise stick with the regular
+  # create shared library compile line.
+  if (CMAKE_XL_CreateExportList)
+    # The compiler front-end passes all object files, archive files, and shared
+    # library files named on the command line to CreateExportList to create a
+    # list of all symbols to be exported from the shared library.  This causes
+    # all archive members to be copied into the shared library whether they are
+    # needed or not.  Instead we run the tool ourselves to pass only the object
+    # files so that we export only the symbols actually provided by the sources.
+    set(CMAKE_${lang}_CREATE_SHARED_LIBRARY
+      "${CMAKE_XL_CreateExportList} <OBJECT_DIR>/objects.exp <OBJECTS>"
+      "<CMAKE_${lang}_COMPILER> <CMAKE_SHARED_LIBRARY_${lang}_FLAGS> -Wl,-bE:<OBJECT_DIR>/objects.exp <LANGUAGE_COMPILE_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_${lang}_FLAGS> <SONAME_FLAG><TARGET_SONAME> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>"
+      )
+  endif()
 endmacro()
 endmacro()

+ 2 - 0
Modules/Platform/AIX-XLClang-C.cmake

@@ -0,0 +1,2 @@
+include(Platform/AIX-XLClang)
+__aix_compiler_xlclang(C)

+ 2 - 0
Modules/Platform/AIX-XLClang-CXX.cmake

@@ -0,0 +1,2 @@
+include(Platform/AIX-XLClang)
+__aix_compiler_xlclang(CXX)

+ 15 - 0
Modules/Platform/AIX-XLClang.cmake

@@ -0,0 +1,15 @@
+# Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
+# file Copyright.txt or https://cmake.org/licensing for details.
+
+
+# This module is shared by multiple languages; use include blocker.
+if(__AIX_COMPILER_XLCLANG)
+  return()
+endif()
+set(__AIX_COMPILER_XLCLANG 1)
+
+include(Platform/AIX-XL)
+
+macro(__aix_compiler_xlclang lang)
+  __aix_compiler_xl(${lang})
+endmacro()

+ 4 - 68
Modules/Platform/CrayLinuxEnvironment.cmake

@@ -1,6 +1,5 @@
-# Compute Node Linux doesn't quite work the same as native Linux so all of this
-# needs to be custom.  We use the variables defined through Cray's environment
-# modules to set up the right paths for things.
+# CrayLinuxEnvironment: loaded by users cross-compiling on a Cray front-end
+# node by specifying "-DCMAKE_SYSTEM_NAME=CrayLinuxEnvironment" to cmake
 
 
 set(UNIX 1)
 set(UNIX 1)
 
 
@@ -30,13 +29,6 @@ endif()
 # Note: this may need to change in the future with 64-bit ARM
 # Note: this may need to change in the future with 64-bit ARM
 set(CMAKE_SYSTEM_PROCESSOR "x86_64")
 set(CMAKE_SYSTEM_PROCESSOR "x86_64")
 
 
-set(CMAKE_SHARED_LIBRARY_PREFIX "lib")
-set(CMAKE_SHARED_LIBRARY_SUFFIX ".so")
-set(CMAKE_STATIC_LIBRARY_PREFIX "lib")
-set(CMAKE_STATIC_LIBRARY_SUFFIX ".a")
-
-set(CMAKE_FIND_LIBRARY_PREFIXES "lib")
-
 # Don't override shared lib support if it's already been set and possibly
 # Don't override shared lib support if it's already been set and possibly
 # overridden elsewhere by the CrayPrgEnv module
 # overridden elsewhere by the CrayPrgEnv module
 if(NOT CMAKE_FIND_LIBRARY_SUFFIXES)
 if(NOT CMAKE_FIND_LIBRARY_SUFFIXES)
@@ -44,12 +36,9 @@ if(NOT CMAKE_FIND_LIBRARY_SUFFIXES)
   set_property(GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS TRUE)
   set_property(GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS TRUE)
 endif()
 endif()
 
 
-set(CMAKE_DL_LIBS dl)
+# The rest of this file is based on UnixPaths.cmake, adjusted for Cray
 
 
-# Note: Much of this is pulled from UnixPaths.cmake but adjusted to the Cray
-# environment accordingly
-
-# Get the install directory of the running cmake to the search directories
+# add the install directory of the running cmake to the search directories
 # CMAKE_ROOT is CMAKE_INSTALL_PREFIX/share/cmake, so we need to go two levels up
 # CMAKE_ROOT is CMAKE_INSTALL_PREFIX/share/cmake, so we need to go two levels up
 get_filename_component(__cmake_install_dir "${CMAKE_ROOT}" PATH)
 get_filename_component(__cmake_install_dir "${CMAKE_ROOT}" PATH)
 get_filename_component(__cmake_install_dir "${__cmake_install_dir}" PATH)
 get_filename_component(__cmake_install_dir "${__cmake_install_dir}" PATH)
@@ -81,7 +70,6 @@ if (NOT CMAKE_FIND_NO_INSTALL_PREFIX)
 endif()
 endif()
 
 
 list(APPEND CMAKE_SYSTEM_INCLUDE_PATH
 list(APPEND CMAKE_SYSTEM_INCLUDE_PATH
-  $ENV{SYSROOT_DIR}/usr/include
   $ENV{SYSROOT_DIR}/usr/include/X11
   $ENV{SYSROOT_DIR}/usr/include/X11
 )
 )
 list(APPEND CMAKE_SYSTEM_LIBRARY_PATH
 list(APPEND CMAKE_SYSTEM_LIBRARY_PATH
@@ -95,57 +83,5 @@ list(APPEND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES
   $ENV{SYSROOT_DIR}/lib64
   $ENV{SYSROOT_DIR}/lib64
 )
 )
 
 
-# Compute the intersection of several lists
-function(__cray_list_intersect OUTPUT INPUT0)
-  if(ARGC EQUAL 2)
-    list(APPEND ${OUTPUT} ${${INPUT0}})
-  else()
-    foreach(I IN LISTS ${INPUT0})
-      set(__is_common 1)
-      foreach(L IN LISTS ARGN)
-        list(FIND ${L} "${I}" __idx)
-        if(__idx EQUAL -1)
-          set(__is_common 0)
-          break()
-        endif()
-      endforeach()
-      if(__is_common)
-        list(APPEND ${OUTPUT}  "${I}")
-      endif()
-    endforeach()
-  endif()
-  set(${OUTPUT} ${${OUTPUT}} PARENT_SCOPE)
-endfunction()
-
-macro(__list_clean_dupes var)
-  if(${var})
-    list(REMOVE_DUPLICATES ${var})
-  endif()
-endmacro()
-
-get_property(__langs GLOBAL PROPERTY ENABLED_LANGUAGES)
-set(__cray_inc_path_vars)
-set(__cray_lib_path_vars)
-foreach(__lang IN LISTS __langs)
-  list(APPEND __cray_inc_path_vars CMAKE_${__lang}_IMPLICIT_INCLUDE_DIRECTORIES)
-  list(APPEND __cray_lib_path_vars CMAKE_${__lang}_IMPLICIT_LINK_DIRECTORIES)
-endforeach()
-if(__cray_inc_path_vars)
-  __cray_list_intersect(__cray_implicit_include_dirs ${__cray_inc_path_vars})
-  if(__cray_implicit_include_dirs)
-    list(INSERT CMAKE_SYSTEM_INCLUDE_PATH 0 ${__cray_implicit_include_dirs})
-  endif()
-endif()
-if(__cray_lib_path_vars)
-  __cray_list_intersect(__cray_implicit_library_dirs ${__cray_lib_path_vars})
-  if(__cray_implicit_library_dirs)
-    list(INSERT CMAKE_SYSTEM_LIBRARY_PATH 0 ${__cray_implicit_library_dirs})
-  endif()
-endif()
-__list_clean_dupes(CMAKE_SYSTEM_PREFIX_PATH)
-__list_clean_dupes(CMAKE_SYSTEM_INCLUDE_PATH)
-__list_clean_dupes(CMAKE_SYSTEM_LIBRARY_PATH)
-__list_clean_dupes(CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES)
-
 # Enable use of lib64 search path variants by default.
 # Enable use of lib64 search path variants by default.
 set_property(GLOBAL PROPERTY FIND_LIBRARY_USE_LIB64_PATHS TRUE)
 set_property(GLOBAL PROPERTY FIND_LIBRARY_USE_LIB64_PATHS TRUE)

+ 26 - 8
README.rst

@@ -57,21 +57,39 @@ You need to have a C++ compiler (supporting C++11) and a ``make`` installed.
 Run the ``bootstrap`` script you find in the source directory of CMake.
 Run the ``bootstrap`` script you find in the source directory of CMake.
 You can use the ``--help`` option to see the supported options.
 You can use the ``--help`` option to see the supported options.
 You may use the ``--prefix=<install_prefix>`` option to specify a custom
 You may use the ``--prefix=<install_prefix>`` option to specify a custom
-installation directory for CMake. You can run the ``bootstrap`` script from
-within the CMake source directory or any other build directory of your
-choice. Once this has finished successfully, run ``make`` and
-``make install``.  In summary::
+installation directory for CMake.  Once this has finished successfully,
+run ``make`` and ``make install``.
 
 
- $ ./bootstrap && make && sudo make install
+For example, if you simply want to build and install CMake from source,
+you can build directly in the source tree::
+
+  $ ./bootstrap && make && sudo make install
+
+Or, if you plan to develop CMake or otherwise run the test suite, create
+a separate build tree::
+
+  $ mkdir cmake-build && cd cmake-build
+  $ ../cmake-source/bootstrap && make
 
 
 Windows
 Windows
 ^^^^^^^
 ^^^^^^^
 
 
-You need to download and install a binary release of CMake in order to build
-CMake.  You can get these releases from the `CMake Download Page`_.  Then
-proceed with the instructions below.
+There are two ways for building CMake under Windows:
+
+1. Compile with MSVC from VS 2015 or later.
+   You need to download and install a binary release of CMake.  You can get
+   these releases from the `CMake Download Page`_.  Then proceed with the
+   instructions below for `Building CMake with CMake`_.
+
+2. Bootstrap with MinGW under MSYS2.
+   Download and install `MSYS2`_.  Then install the required build tools::
+
+     $ pacman -S --needed git base-devel mingw-w64-x86_64-gcc
+
+   and bootstrap as above.
 
 
 .. _`CMake Download Page`: https://cmake.org/cmake/resources/software.html
 .. _`CMake Download Page`: https://cmake.org/cmake/resources/software.html
+.. _`MSYS2`: https://www.msys2.org/
 
 
 Building CMake with CMake
 Building CMake with CMake
 -------------------------
 -------------------------

+ 0 - 3
Source/CMakeLists.txt

@@ -1060,9 +1060,6 @@ if(CPACK_ENABLE_FREEBSD_PKG AND FREEBSD_PKG_INCLUDE_DIRS AND FREEBSD_PKG_LIBRARI
 endif()
 endif()
 
 
 if(APPLE)
 if(APPLE)
-  add_executable(cmakexbuild cmakexbuild.cxx)
-  list(APPEND _tools cmakexbuild)
-  target_link_libraries(cmakexbuild CMakeLib)
   add_executable(OSXScriptLauncher
   add_executable(OSXScriptLauncher
     CPack/OSXScriptLauncher.cxx)
     CPack/OSXScriptLauncher.cxx)
   target_link_libraries(OSXScriptLauncher cmsys)
   target_link_libraries(OSXScriptLauncher cmsys)

+ 2 - 2
Source/CMakeVersion.cmake

@@ -1,5 +1,5 @@
 # CMake version number components.
 # CMake version number components.
 set(CMake_VERSION_MAJOR 3)
 set(CMake_VERSION_MAJOR 3)
 set(CMake_VERSION_MINOR 14)
 set(CMake_VERSION_MINOR 14)
-set(CMake_VERSION_PATCH 0)
-set(CMake_VERSION_RC 2)
+set(CMake_VERSION_PATCH 20190226)
+#set(CMake_VERSION_RC 1)

+ 4 - 4
Source/CPack/IFW/cmCPackIFWGenerator.cxx

@@ -85,8 +85,8 @@ int cmCPackIFWGenerator::PackageFiles()
     int retVal = 1;
     int retVal = 1;
     cmCPackIFWLogger(OUTPUT, "- Generate repository" << std::endl);
     cmCPackIFWLogger(OUTPUT, "- Generate repository" << std::endl);
     bool res = cmSystemTools::RunSingleCommand(
     bool res = cmSystemTools::RunSingleCommand(
-      ifwCmd.c_str(), &output, &output, &retVal, nullptr,
-      this->GeneratorVerbose, cmDuration::zero());
+      ifwCmd, &output, &output, &retVal, nullptr, this->GeneratorVerbose,
+      cmDuration::zero());
     if (!res || retVal) {
     if (!res || retVal) {
       cmGeneratedFileStream ofs(ifwTmpFile);
       cmGeneratedFileStream ofs(ifwTmpFile);
       ofs << "# Run command: " << ifwCmd << std::endl
       ofs << "# Run command: " << ifwCmd << std::endl
@@ -198,8 +198,8 @@ int cmCPackIFWGenerator::PackageFiles()
     int retVal = 1;
     int retVal = 1;
     cmCPackIFWLogger(OUTPUT, "- Generate package" << std::endl);
     cmCPackIFWLogger(OUTPUT, "- Generate package" << std::endl);
     bool res = cmSystemTools::RunSingleCommand(
     bool res = cmSystemTools::RunSingleCommand(
-      ifwCmd.c_str(), &output, &output, &retVal, nullptr,
-      this->GeneratorVerbose, cmDuration::zero());
+      ifwCmd, &output, &output, &retVal, nullptr, this->GeneratorVerbose,
+      cmDuration::zero());
     if (!res || retVal) {
     if (!res || retVal) {
       cmGeneratedFileStream ofs(ifwTmpFile);
       cmGeneratedFileStream ofs(ifwTmpFile);
       ofs << "# Run command: " << ifwCmd << std::endl
       ofs << "# Run command: " << ifwCmd << std::endl

+ 1 - 1
Source/CPack/OSXScriptLauncher.cxx

@@ -73,7 +73,7 @@ int main(int argc, char* argv[])
   args.push_back(nullptr);
   args.push_back(nullptr);
 
 
   cmsysProcess* cp = cmsysProcess_New();
   cmsysProcess* cp = cmsysProcess_New();
-  cmsysProcess_SetCommand(cp, &*args.begin());
+  cmsysProcess_SetCommand(cp, args.data());
   cmsysProcess_SetWorkingDirectory(cp, scriptDirectory.c_str());
   cmsysProcess_SetWorkingDirectory(cp, scriptDirectory.c_str());
   cmsysProcess_SetOption(cp, cmsysProcess_Option_HideWindow, 1);
   cmsysProcess_SetOption(cp, cmsysProcess_Option_HideWindow, 1);
   cmsysProcess_SetTimeout(cp, 0);
   cmsysProcess_SetTimeout(cp, 0);

+ 3 - 4
Source/CPack/WiX/cmCPackWIXGenerator.cxx

@@ -61,9 +61,8 @@ bool cmCPackWIXGenerator::RunWiXCommand(std::string const& command)
   std::string output;
   std::string output;
 
 
   int returnValue = 0;
   int returnValue = 0;
-  bool status = cmSystemTools::RunSingleCommand(command.c_str(), &output,
-                                                &output, &returnValue, 0,
-                                                cmSystemTools::OUTPUT_NONE);
+  bool status = cmSystemTools::RunSingleCommand(
+    command, &output, &output, &returnValue, 0, cmSystemTools::OUTPUT_NONE);
 
 
   cmsys::ofstream logFile(logFileName.c_str(), std::ios::app);
   cmsys::ofstream logFile(logFileName.c_str(), std::ios::app);
   logFile << command << std::endl;
   logFile << command << std::endl;
@@ -619,7 +618,7 @@ bool cmCPackWIXGenerator::GenerateMainSourceFileFromTemplate()
 
 
   std::string mainSourceFilePath = this->CPackTopLevel + "/main.wxs";
   std::string mainSourceFilePath = this->CPackTopLevel + "/main.wxs";
 
 
-  if (!ConfigureFile(wixTemplate.c_str(), mainSourceFilePath.c_str())) {
+  if (!ConfigureFile(wixTemplate, mainSourceFilePath)) {
     cmCPackLogger(cmCPackLog::LOG_ERROR,
     cmCPackLogger(cmCPackLog::LOG_ERROR,
                   "Failed creating '" << mainSourceFilePath
                   "Failed creating '" << mainSourceFilePath
                                       << "'' from template." << std::endl);
                                       << "'' from template." << std::endl);

+ 2 - 3
Source/CPack/cmCPackCygwinBinaryGenerator.cxx

@@ -44,10 +44,9 @@ int cmCPackCygwinBinaryGenerator::PackageFiles()
   // to create the file before the super class is called
   // to create the file before the super class is called
   {
   {
     cmGeneratedFileStream ofs(manifestFile.c_str());
     cmGeneratedFileStream ofs(manifestFile.c_str());
-    for (std::vector<std::string>::const_iterator i = files.begin();
-         i != files.end(); ++i) {
+    for (std::string const& file : files) {
       // remove the temp dir and replace with /usr
       // remove the temp dir and replace with /usr
-      ofs << (*i).substr(tempdir.size()) << "\n";
+      ofs << file.substr(tempdir.size()) << "\n";
     }
     }
     ofs << manifest << "\n";
     ofs << manifest << "\n";
   }
   }

+ 2 - 2
Source/CPack/cmCPackDragNDropGenerator.cxx

@@ -244,8 +244,8 @@ bool cmCPackDragNDropGenerator::RunCommand(std::ostringstream& command,
   int exit_code = 1;
   int exit_code = 1;
 
 
   bool result = cmSystemTools::RunSingleCommand(
   bool result = cmSystemTools::RunSingleCommand(
-    command.str().c_str(), output, output, &exit_code, nullptr,
-    this->GeneratorVerbose, cmDuration::zero());
+    command.str(), output, output, &exit_code, nullptr, this->GeneratorVerbose,
+    cmDuration::zero());
 
 
   if (!result || exit_code) {
   if (!result || exit_code) {
     cmCPackLogger(cmCPackLog::LOG_ERROR,
     cmCPackLogger(cmCPackLog::LOG_ERROR,

+ 10 - 10
Source/CPack/cmCPackGenerator.cxx

@@ -43,7 +43,8 @@ cmCPackGenerator::~cmCPackGenerator()
   this->MakefileMap = nullptr;
   this->MakefileMap = nullptr;
 }
 }
 
 
-void cmCPackGenerator::DisplayVerboseOutput(const char* msg, float progress)
+void cmCPackGenerator::DisplayVerboseOutput(const std::string& msg,
+                                            float progress)
 {
 {
   (void)progress;
   (void)progress;
   cmCPackLogger(cmCPackLog::LOG_VERBOSE, "" << msg << std::endl);
   cmCPackLogger(cmCPackLog::LOG_VERBOSE, "" << msg << std::endl);
@@ -278,7 +279,7 @@ int cmCPackGenerator::InstallProjectViaInstallCommands(
       std::string output;
       std::string output;
       int retVal = 1;
       int retVal = 1;
       bool resB = cmSystemTools::RunSingleCommand(
       bool resB = cmSystemTools::RunSingleCommand(
-        ic.c_str(), &output, &output, &retVal, nullptr, this->GeneratorVerbose,
+        ic, &output, &output, &retVal, nullptr, this->GeneratorVerbose,
         cmDuration::zero());
         cmDuration::zero());
       if (!resB || retVal) {
       if (!resB || retVal) {
         std::string tmpFile = this->GetOption("CPACK_TOPLEVEL_DIRECTORY");
         std::string tmpFile = this->GetOption("CPACK_TOPLEVEL_DIRECTORY");
@@ -387,8 +388,7 @@ int cmCPackGenerator::InstallProjectViaInstalledDirectories(
         }
         }
         /* If it is not a symlink then do a plain copy */
         /* If it is not a symlink then do a plain copy */
         else if (!(cmSystemTools::CopyFileIfDifferent(inFile, filePath) &&
         else if (!(cmSystemTools::CopyFileIfDifferent(inFile, filePath) &&
-                   cmSystemTools::CopyFileTime(inFile.c_str(),
-                                               filePath.c_str()))) {
+                   cmSystemTools::CopyFileTime(inFile, filePath))) {
           cmCPackLogger(cmCPackLog::LOG_ERROR,
           cmCPackLogger(cmCPackLog::LOG_ERROR,
                         "Problem copying file: " << inFile << " -> "
                         "Problem copying file: " << inFile << " -> "
                                                  << filePath << std::endl);
                                                  << filePath << std::endl);
@@ -647,8 +647,8 @@ int cmCPackGenerator::RunPreinstallTarget(
     std::string output;
     std::string output;
     int retVal = 1;
     int retVal = 1;
     bool resB = cmSystemTools::RunSingleCommand(
     bool resB = cmSystemTools::RunSingleCommand(
-      buildCommand.c_str(), &output, &output, &retVal,
-      installDirectory.c_str(), this->GeneratorVerbose, cmDuration::zero());
+      buildCommand, &output, &output, &retVal, installDirectory.c_str(),
+      this->GeneratorVerbose, cmDuration::zero());
     if (!resB || retVal) {
     if (!resB || retVal) {
       std::string tmpFile = this->GetOption("CPACK_TOPLEVEL_DIRECTORY");
       std::string tmpFile = this->GetOption("CPACK_TOPLEVEL_DIRECTORY");
       tmpFile += "/PreinstallOutput.log";
       tmpFile += "/PreinstallOutput.log";
@@ -689,7 +689,7 @@ int cmCPackGenerator::InstallCMakeProject(
   cm.SetHomeOutputDirectory("");
   cm.SetHomeOutputDirectory("");
   cm.GetCurrentSnapshot().SetDefaultDefinitions();
   cm.GetCurrentSnapshot().SetDefaultDefinitions();
   cm.AddCMakePaths();
   cm.AddCMakePaths();
-  cm.SetProgressCallback([this](const char* msg, float prog) {
+  cm.SetProgressCallback([this](const std::string& msg, float prog) {
     this->DisplayVerboseOutput(msg, prog);
     this->DisplayVerboseOutput(msg, prog);
   });
   });
   cm.SetTrace(this->Trace);
   cm.SetTrace(this->Trace);
@@ -1245,7 +1245,8 @@ bool cmCPackGenerator::ConfigureString(const std::string& inString,
   return true;
   return true;
 }
 }
 
 
-bool cmCPackGenerator::ConfigureFile(const char* inName, const char* outName,
+bool cmCPackGenerator::ConfigureFile(const std::string& inName,
+                                     const std::string& outName,
                                      bool copyOnly /* = false */)
                                      bool copyOnly /* = false */)
 {
 {
   return this->MakefileMap->ConfigureFile(inName, outName, copyOnly, true,
   return this->MakefileMap->ConfigureFile(inName, outName, copyOnly, true,
@@ -1254,9 +1255,8 @@ bool cmCPackGenerator::ConfigureFile(const char* inName, const char* outName,
 
 
 int cmCPackGenerator::CleanTemporaryDirectory()
 int cmCPackGenerator::CleanTemporaryDirectory()
 {
 {
-  std::string tempInstallDirectoryWithPostfix =
+  std::string tempInstallDirectory =
     this->GetOption("CPACK_TEMPORARY_INSTALL_DIRECTORY");
     this->GetOption("CPACK_TEMPORARY_INSTALL_DIRECTORY");
-  const char* tempInstallDirectory = tempInstallDirectoryWithPostfix.c_str();
   if (cmsys::SystemTools::FileExists(tempInstallDirectory)) {
   if (cmsys::SystemTools::FileExists(tempInstallDirectory)) {
     cmCPackLogger(cmCPackLog::LOG_OUTPUT,
     cmCPackLogger(cmCPackLog::LOG_OUTPUT,
                   "- Clean temporary : " << tempInstallDirectory << std::endl);
                   "- Clean temporary : " << tempInstallDirectory << std::endl);

+ 3 - 2
Source/CPack/cmCPackGenerator.h

@@ -96,7 +96,7 @@ public:
   void SetLogger(cmCPackLog* log) { this->Logger = log; }
   void SetLogger(cmCPackLog* log) { this->Logger = log; }
 
 
   //! Display verbose information via logger
   //! Display verbose information via logger
-  void DisplayVerboseOutput(const char* msg, float progress);
+  void DisplayVerboseOutput(const std::string& msg, float progress);
 
 
   bool ReadListFile(const char* moduleName);
   bool ReadListFile(const char* moduleName);
 
 
@@ -169,7 +169,8 @@ protected:
   virtual const char* GetPackagingInstallPrefix();
   virtual const char* GetPackagingInstallPrefix();
 
 
   virtual std::string FindTemplate(const char* name);
   virtual std::string FindTemplate(const char* name);
-  virtual bool ConfigureFile(const char* inName, const char* outName,
+  virtual bool ConfigureFile(const std::string& inName,
+                             const std::string& outName,
                              bool copyOnly = false);
                              bool copyOnly = false);
   virtual bool ConfigureString(const std::string& input, std::string& output);
   virtual bool ConfigureString(const std::string& input, std::string& output);
   virtual int InitializeInternal();
   virtual int InitializeInternal();

+ 3 - 0
Source/CPack/cmCPackGeneratorFactory.h

@@ -22,6 +22,9 @@ public:
   cmCPackGeneratorFactory();
   cmCPackGeneratorFactory();
   ~cmCPackGeneratorFactory();
   ~cmCPackGeneratorFactory();
 
 
+  cmCPackGeneratorFactory(const cmCPackGeneratorFactory&) = delete;
+  cmCPackGeneratorFactory& operator=(const cmCPackGeneratorFactory&) = delete;
+
   //! Get the generator
   //! Get the generator
   cmCPackGenerator* NewGenerator(const std::string& name);
   cmCPackGenerator* NewGenerator(const std::string& name);
   void DeleteGenerator(cmCPackGenerator* gen);
   void DeleteGenerator(cmCPackGenerator* gen);

+ 3 - 0
Source/CPack/cmCPackLog.h

@@ -26,6 +26,9 @@ public:
   cmCPackLog();
   cmCPackLog();
   ~cmCPackLog();
   ~cmCPackLog();
 
 
+  cmCPackLog(const cmCPackLog&) = delete;
+  cmCPackLog& operator=(const cmCPackLog&) = delete;
+
   enum __log_tags
   enum __log_tags
   {
   {
     NOTAG = 0,
     NOTAG = 0,

+ 7 - 8
Source/CPack/cmCPackNSISGenerator.cxx

@@ -292,9 +292,8 @@ int cmCPackNSISGenerator::PackageFiles()
     this->SetOption("CPACK_NSIS_DEFINES", defines.c_str());
     this->SetOption("CPACK_NSIS_DEFINES", defines.c_str());
   }
   }
 
 
-  this->ConfigureFile(nsisInInstallOptions.c_str(),
-                      nsisInstallOptions.c_str());
-  this->ConfigureFile(nsisInFileName.c_str(), nsisFileName.c_str());
+  this->ConfigureFile(nsisInInstallOptions, nsisInstallOptions);
+  this->ConfigureFile(nsisInFileName, nsisFileName);
   std::string nsisCmd = "\"";
   std::string nsisCmd = "\"";
   nsisCmd += this->GetOption("CPACK_INSTALLER_PROGRAM");
   nsisCmd += this->GetOption("CPACK_INSTALLER_PROGRAM");
   nsisCmd += "\" \"" + nsisFileName + "\"";
   nsisCmd += "\" \"" + nsisFileName + "\"";
@@ -302,8 +301,8 @@ int cmCPackNSISGenerator::PackageFiles()
   std::string output;
   std::string output;
   int retVal = 1;
   int retVal = 1;
   bool res = cmSystemTools::RunSingleCommand(
   bool res = cmSystemTools::RunSingleCommand(
-    nsisCmd.c_str(), &output, &output, &retVal, nullptr,
-    this->GeneratorVerbose, cmDuration::zero());
+    nsisCmd, &output, &output, &retVal, nullptr, this->GeneratorVerbose,
+    cmDuration::zero());
   if (!res || retVal) {
   if (!res || retVal) {
     cmGeneratedFileStream ofs(tmpFile);
     cmGeneratedFileStream ofs(tmpFile);
     ofs << "# Run command: " << nsisCmd << std::endl
     ofs << "# Run command: " << nsisCmd << std::endl
@@ -407,8 +406,8 @@ int cmCPackNSISGenerator::InitializeInternal()
   std::string output;
   std::string output;
   int retVal = 1;
   int retVal = 1;
   bool resS = cmSystemTools::RunSingleCommand(
   bool resS = cmSystemTools::RunSingleCommand(
-    nsisCmd.c_str(), &output, &output, &retVal, nullptr,
-    this->GeneratorVerbose, cmDuration::zero());
+    nsisCmd, &output, &output, &retVal, nullptr, this->GeneratorVerbose,
+    cmDuration::zero());
   cmsys::RegularExpression versionRex("v([0-9]+.[0-9]+)");
   cmsys::RegularExpression versionRex("v([0-9]+.[0-9]+)");
   cmsys::RegularExpression versionRexCVS("v(.*)\\.cvs");
   cmsys::RegularExpression versionRexCVS("v(.*)\\.cvs");
   if (!resS || retVal ||
   if (!resS || retVal ||
@@ -749,7 +748,7 @@ std::string cmCPackNSISGenerator::CreateComponentDescription(
     std::string output;
     std::string output;
     int retVal = -1;
     int retVal = -1;
     int res = cmSystemTools::RunSingleCommand(
     int res = cmSystemTools::RunSingleCommand(
-      cmd.c_str(), &output, &output, &retVal, dirName.c_str(),
+      cmd, &output, &output, &retVal, dirName.c_str(),
       cmSystemTools::OUTPUT_NONE, cmDuration::zero());
       cmSystemTools::OUTPUT_NONE, cmDuration::zero());
     if (!res || retVal) {
     if (!res || retVal) {
       std::string tmpFile = this->GetOption("CPACK_TOPLEVEL_DIRECTORY");
       std::string tmpFile = this->GetOption("CPACK_TOPLEVEL_DIRECTORY");

+ 5 - 5
Source/CPack/cmCPackOSXX11Generator.cxx

@@ -83,7 +83,7 @@ int cmCPackOSXX11Generator::PackageFiles()
       return 0;
       return 0;
     }
     }
     std::string destFileName = resourcesDirectory + "/" + iconFileName;
     std::string destFileName = resourcesDirectory + "/" + iconFileName;
-    this->ConfigureFile(iconFile, destFileName.c_str(), true);
+    this->ConfigureFile(iconFile, destFileName, true);
     this->SetOptionIfNotSet("CPACK_APPLE_GUI_ICON", iconFileName.c_str());
     this->SetOptionIfNotSet("CPACK_APPLE_GUI_ICON", iconFileName.c_str());
   }
   }
 
 
@@ -155,8 +155,8 @@ int cmCPackOSXX11Generator::PackageFiles()
   bool res = false;
   bool res = false;
   while (numTries > 0) {
   while (numTries > 0) {
     res = cmSystemTools::RunSingleCommand(
     res = cmSystemTools::RunSingleCommand(
-      dmgCmd.str().c_str(), &output, &output, &retVal, nullptr,
-      this->GeneratorVerbose, cmDuration::zero());
+      dmgCmd.str(), &output, &output, &retVal, nullptr, this->GeneratorVerbose,
+      cmDuration::zero());
     if (res && !retVal) {
     if (res && !retVal) {
       numTries = -1;
       numTries = -1;
       break;
       break;
@@ -236,7 +236,7 @@ bool cmCPackOSXX11Generator::CopyCreateResourceFile(const std::string& name)
   cmCPackLogger(cmCPackLog::LOG_VERBOSE, "Configure file: "
   cmCPackLogger(cmCPackLog::LOG_VERBOSE, "Configure file: "
                 << (inFileName ? inFileName : "(NULL)")
                 << (inFileName ? inFileName : "(NULL)")
                 << " to " << destFileName << std::endl);
                 << " to " << destFileName << std::endl);
-  this->ConfigureFile(inFileName, destFileName.c_str());
+  this->ConfigureFile(inFileName, destFileName);
   return true;
   return true;
 }
 }
 */
 */
@@ -266,7 +266,7 @@ bool cmCPackOSXX11Generator::CopyResourcePlistFile(
   cmCPackLogger(cmCPackLog::LOG_VERBOSE,
   cmCPackLogger(cmCPackLog::LOG_VERBOSE,
                 "Configure file: " << inFileName << " to " << destFileName
                 "Configure file: " << inFileName << " to " << destFileName
                                    << std::endl);
                                    << std::endl);
-  this->ConfigureFile(inFileName.c_str(), destFileName.c_str(), copyOnly);
+  this->ConfigureFile(inFileName, destFileName, copyOnly);
   return true;
   return true;
 }
 }
 
 

+ 23 - 37
Source/CPack/cmCPackPKGGenerator.cxx

@@ -66,21 +66,17 @@ void cmCPackPKGGenerator::WriteDistributionFile(const char* metapackageFile)
   xout.StartElement("choices-outline");
   xout.StartElement("choices-outline");
 
 
   // Emit the outline for the groups
   // Emit the outline for the groups
-  std::map<std::string, cmCPackComponentGroup>::iterator groupIt;
-  for (groupIt = this->ComponentGroups.begin();
-       groupIt != this->ComponentGroups.end(); ++groupIt) {
-    if (groupIt->second.ParentGroup == nullptr) {
-      CreateChoiceOutline(groupIt->second, xout);
+  for (auto const& group : this->ComponentGroups) {
+    if (group.second.ParentGroup == nullptr) {
+      CreateChoiceOutline(group.second, xout);
     }
     }
   }
   }
 
 
   // Emit the outline for the non-grouped components
   // Emit the outline for the non-grouped components
-  std::map<std::string, cmCPackComponent>::iterator compIt;
-  for (compIt = this->Components.begin(); compIt != this->Components.end();
-       ++compIt) {
-    if (!compIt->second.Group) {
+  for (auto const& comp : this->Components) {
+    if (!comp.second.Group) {
       xout.StartElement("line");
       xout.StartElement("line");
-      xout.Attribute("choice", compIt->first + "Choice");
+      xout.Attribute("choice", comp.first + "Choice");
       xout.Content(""); // Avoid self-closing tag.
       xout.Content(""); // Avoid self-closing tag.
       xout.EndElement();
       xout.EndElement();
     }
     }
@@ -94,13 +90,11 @@ void cmCPackPKGGenerator::WriteDistributionFile(const char* metapackageFile)
   xout.EndElement(); // choices-outline>
   xout.EndElement(); // choices-outline>
 
 
   // Create the actual choices
   // Create the actual choices
-  for (groupIt = this->ComponentGroups.begin();
-       groupIt != this->ComponentGroups.end(); ++groupIt) {
-    CreateChoice(groupIt->second, xout);
+  for (auto const& group : this->ComponentGroups) {
+    CreateChoice(group.second, xout);
   }
   }
-  for (compIt = this->Components.begin(); compIt != this->Components.end();
-       ++compIt) {
-    CreateChoice(compIt->second, xout);
+  for (auto const& comp : this->Components) {
+    CreateChoice(comp.second, xout);
   }
   }
 
 
   if (!this->PostFlightComponent.Name.empty()) {
   if (!this->PostFlightComponent.Name.empty()) {
@@ -111,7 +105,7 @@ void cmCPackPKGGenerator::WriteDistributionFile(const char* metapackageFile)
 
 
   // Create the distribution.dist file in the metapackage to turn it
   // Create the distribution.dist file in the metapackage to turn it
   // into a distribution package.
   // into a distribution package.
-  this->ConfigureFile(distributionTemplate.c_str(), distributionFile.c_str());
+  this->ConfigureFile(distributionTemplate, distributionFile);
 }
 }
 
 
 void cmCPackPKGGenerator::CreateChoiceOutline(
 void cmCPackPKGGenerator::CreateChoiceOutline(
@@ -119,17 +113,13 @@ void cmCPackPKGGenerator::CreateChoiceOutline(
 {
 {
   xout.StartElement("line");
   xout.StartElement("line");
   xout.Attribute("choice", group.Name + "Choice");
   xout.Attribute("choice", group.Name + "Choice");
-  std::vector<cmCPackComponentGroup*>::const_iterator groupIt;
-  for (groupIt = group.Subgroups.begin(); groupIt != group.Subgroups.end();
-       ++groupIt) {
-    CreateChoiceOutline(**groupIt, xout);
+  for (cmCPackComponentGroup* subgroup : group.Subgroups) {
+    CreateChoiceOutline(*subgroup, xout);
   }
   }
 
 
-  std::vector<cmCPackComponent*>::const_iterator compIt;
-  for (compIt = group.Components.begin(); compIt != group.Components.end();
-       ++compIt) {
+  for (cmCPackComponent* comp : group.Components) {
     xout.StartElement("line");
     xout.StartElement("line");
-    xout.Attribute("choice", (*compIt)->Name + "Choice");
+    xout.Attribute("choice", comp->Name + "Choice");
     xout.Content(""); // Avoid self-closing tag.
     xout.Content(""); // Avoid self-closing tag.
     xout.EndElement();
     xout.EndElement();
   }
   }
@@ -238,11 +228,9 @@ void cmCPackPKGGenerator::AddDependencyAttributes(
   }
   }
   visited.insert(&component);
   visited.insert(&component);
 
 
-  std::vector<cmCPackComponent*>::const_iterator dependIt;
-  for (dependIt = component.Dependencies.begin();
-       dependIt != component.Dependencies.end(); ++dependIt) {
-    out << " && choices['" << (*dependIt)->Name << "Choice'].selected";
-    AddDependencyAttributes(**dependIt, visited, out);
+  for (cmCPackComponent* depend : component.Dependencies) {
+    out << " && choices['" << depend->Name << "Choice'].selected";
+    AddDependencyAttributes(*depend, visited, out);
   }
   }
 }
 }
 
 
@@ -255,11 +243,9 @@ void cmCPackPKGGenerator::AddReverseDependencyAttributes(
   }
   }
   visited.insert(&component);
   visited.insert(&component);
 
 
-  std::vector<cmCPackComponent*>::const_iterator dependIt;
-  for (dependIt = component.ReverseDependencies.begin();
-       dependIt != component.ReverseDependencies.end(); ++dependIt) {
-    out << " || choices['" << (*dependIt)->Name << "Choice'].selected";
-    AddReverseDependencyAttributes(**dependIt, visited, out);
+  for (cmCPackComponent* depend : component.ReverseDependencies) {
+    out << " || choices['" << depend->Name << "Choice'].selected";
+    AddReverseDependencyAttributes(*depend, visited, out);
   }
   }
 }
 }
 
 
@@ -308,7 +294,7 @@ bool cmCPackPKGGenerator::CopyCreateResourceFile(const std::string& name,
   cmCPackLogger(cmCPackLog::LOG_VERBOSE,
   cmCPackLogger(cmCPackLog::LOG_VERBOSE,
                 "Configure file: " << (inFileName ? inFileName : "(NULL)")
                 "Configure file: " << (inFileName ? inFileName : "(NULL)")
                                    << " to " << destFileName << std::endl);
                                    << " to " << destFileName << std::endl);
-  this->ConfigureFile(inFileName, destFileName.c_str());
+  this->ConfigureFile(inFileName, destFileName);
   return true;
   return true;
 }
 }
 
 
@@ -336,7 +322,7 @@ bool cmCPackPKGGenerator::CopyResourcePlistFile(const std::string& name,
   cmCPackLogger(cmCPackLog::LOG_VERBOSE,
   cmCPackLogger(cmCPackLog::LOG_VERBOSE,
                 "Configure file: " << inFileName << " to " << destFileName
                 "Configure file: " << inFileName << " to " << destFileName
                                    << std::endl);
                                    << std::endl);
-  this->ConfigureFile(inFileName.c_str(), destFileName.c_str());
+  this->ConfigureFile(inFileName, destFileName);
   return true;
   return true;
 }
 }
 
 

+ 2 - 2
Source/CPack/cmCPackPackageMakerGenerator.cxx

@@ -295,8 +295,8 @@ int cmCPackPackageMakerGenerator::PackageFiles()
   bool res = false;
   bool res = false;
   while (numTries > 0) {
   while (numTries > 0) {
     res = cmSystemTools::RunSingleCommand(
     res = cmSystemTools::RunSingleCommand(
-      dmgCmd.str().c_str(), &output, &output, &retVal, nullptr,
-      this->GeneratorVerbose, cmDuration::zero());
+      dmgCmd.str(), &output, &output, &retVal, nullptr, this->GeneratorVerbose,
+      cmDuration::zero());
     if (res && !retVal) {
     if (res && !retVal) {
       numTries = -1;
       numTries = -1;
       break;
       break;

+ 2 - 2
Source/CPack/cmCPackProductBuildGenerator.cxx

@@ -145,8 +145,8 @@ bool cmCPackProductBuildGenerator::RunProductBuild(const std::string& command)
   std::string output;
   std::string output;
   int retVal = 1;
   int retVal = 1;
   bool res = cmSystemTools::RunSingleCommand(
   bool res = cmSystemTools::RunSingleCommand(
-    command.c_str(), &output, &output, &retVal, nullptr,
-    this->GeneratorVerbose, cmDuration::zero());
+    command, &output, &output, &retVal, nullptr, this->GeneratorVerbose,
+    cmDuration::zero());
   cmCPackLogger(cmCPackLog::LOG_VERBOSE, "Done running command" << std::endl);
   cmCPackLogger(cmCPackLog::LOG_VERBOSE, "Done running command" << std::endl);
   if (!res || retVal) {
   if (!res || retVal) {
     cmGeneratedFileStream ofs(tmpFile);
     cmGeneratedFileStream ofs(tmpFile);

+ 1 - 1
Source/CPack/cpack.cxx

@@ -90,7 +90,7 @@ int cpackDefinitionArgument(const char* argument, const char* cValue,
   return 1;
   return 1;
 }
 }
 
 
-static void cpackProgressCallback(const char* message, float /*unused*/)
+static void cpackProgressCallback(const std::string& message, float /*unused*/)
 {
 {
   std::cout << "-- " << message << std::endl;
   std::cout << "-- " << message << std::endl;
 }
 }

+ 1 - 1
Source/CTest/cmCTestBZR.cxx

@@ -365,7 +365,7 @@ bool cmCTestBZR::UpdateImpl()
   if (opts.empty()) {
   if (opts.empty()) {
     opts = this->CTest->GetCTestConfiguration("BZRUpdateOptions");
     opts = this->CTest->GetCTestConfiguration("BZRUpdateOptions");
   }
   }
-  std::vector<std::string> args = cmSystemTools::ParseArguments(opts.c_str());
+  std::vector<std::string> args = cmSystemTools::ParseArguments(opts);
 
 
   // TODO: if(this->CTest->GetTestModel() == cmCTest::NIGHTLY)
   // TODO: if(this->CTest->GetTestModel() == cmCTest::NIGHTLY)
 
 

+ 11 - 5
Source/CTest/cmCTestBuildAndTestHandler.cxx

@@ -118,7 +118,7 @@ public:
     : CM(cm)
     : CM(cm)
   {
   {
     cmSystemTools::SetMessageCallback(
     cmSystemTools::SetMessageCallback(
-      [&s](const char* msg, const char* /*unused*/) {
+      [&s](const std::string& msg, const char* /*unused*/) {
         s += msg;
         s += msg;
         s += "\n";
         s += "\n";
       });
       });
@@ -126,10 +126,11 @@ public:
     cmSystemTools::SetStdoutCallback([&s](std::string const& m) { s += m; });
     cmSystemTools::SetStdoutCallback([&s](std::string const& m) { s += m; });
     cmSystemTools::SetStderrCallback([&s](std::string const& m) { s += m; });
     cmSystemTools::SetStderrCallback([&s](std::string const& m) { s += m; });
 
 
-    this->CM.SetProgressCallback([&s](const char* msg, float /*unused*/) {
-      s += msg;
-      s += "\n";
-    });
+    this->CM.SetProgressCallback(
+      [&s](const std::string& msg, float /*unused*/) {
+        s += msg;
+        s += "\n";
+      });
   }
   }
 
 
   ~cmCTestBuildAndTestCaptureRAII()
   ~cmCTestBuildAndTestCaptureRAII()
@@ -139,6 +140,11 @@ public:
     cmSystemTools::SetStdoutCallback(nullptr);
     cmSystemTools::SetStdoutCallback(nullptr);
     cmSystemTools::SetMessageCallback(nullptr);
     cmSystemTools::SetMessageCallback(nullptr);
   }
   }
+
+  cmCTestBuildAndTestCaptureRAII(const cmCTestBuildAndTestCaptureRAII&) =
+    delete;
+  cmCTestBuildAndTestCaptureRAII& operator=(
+    const cmCTestBuildAndTestCaptureRAII&) = delete;
 };
 };
 
 
 int cmCTestBuildAndTestHandler::RunCMakeAndTest(std::string* outstring)
 int cmCTestBuildAndTestHandler::RunCMakeAndTest(std::string* outstring)

+ 10 - 7
Source/CTest/cmCTestBuildHandler.cxx

@@ -418,8 +418,8 @@ int cmCTestBuildHandler::ProcessHandler()
   int retVal = 0;
   int retVal = 0;
   int res = cmsysProcess_State_Exited;
   int res = cmsysProcess_State_Exited;
   if (!this->CTest->GetShowOnly()) {
   if (!this->CTest->GetShowOnly()) {
-    res = this->RunMakeCommand(makeCommand.c_str(), &retVal,
-                               buildDirectory.c_str(), 0, ofs);
+    res = this->RunMakeCommand(makeCommand, &retVal, buildDirectory.c_str(), 0,
+                               ofs);
   } else {
   } else {
     cmCTestOptionalLog(this->CTest, DEBUG,
     cmCTestOptionalLog(this->CTest, DEBUG,
                        "Build with command: " << makeCommand << std::endl,
                        "Build with command: " << makeCommand << std::endl,
@@ -680,6 +680,8 @@ class cmCTestBuildHandler::LaunchHelper
 public:
 public:
   LaunchHelper(cmCTestBuildHandler* handler);
   LaunchHelper(cmCTestBuildHandler* handler);
   ~LaunchHelper();
   ~LaunchHelper();
+  LaunchHelper(const LaunchHelper&) = delete;
+  LaunchHelper& operator=(const LaunchHelper&) = delete;
 
 
 private:
 private:
   cmCTestBuildHandler* Handler;
   cmCTestBuildHandler* Handler;
@@ -764,9 +766,10 @@ void cmCTestBuildHandler::LaunchHelper::WriteScrapeMatchers(
   }
   }
 }
 }
 
 
-int cmCTestBuildHandler::RunMakeCommand(const char* command, int* retVal,
-                                        const char* dir, int timeout,
-                                        std::ostream& ofs, Encoding encoding)
+int cmCTestBuildHandler::RunMakeCommand(const std::string& command,
+                                        int* retVal, const char* dir,
+                                        int timeout, std::ostream& ofs,
+                                        Encoding encoding)
 {
 {
   // First generate the command and arguments
   // First generate the command and arguments
   std::vector<std::string> args = cmSystemTools::ParseArguments(command);
   std::vector<std::string> args = cmSystemTools::ParseArguments(command);
@@ -800,7 +803,7 @@ int cmCTestBuildHandler::RunMakeCommand(const char* command, int* retVal,
 
 
   // Now create process object
   // Now create process object
   cmsysProcess* cp = cmsysProcess_New();
   cmsysProcess* cp = cmsysProcess_New();
-  cmsysProcess_SetCommand(cp, &*argv.begin());
+  cmsysProcess_SetCommand(cp, argv.data());
   cmsysProcess_SetWorkingDirectory(cp, dir);
   cmsysProcess_SetWorkingDirectory(cp, dir);
   cmsysProcess_SetOption(cp, cmsysProcess_Option_HideWindow, 1);
   cmsysProcess_SetOption(cp, cmsysProcess_Option_HideWindow, 1);
   cmsysProcess_SetTimeout(cp, timeout);
   cmsysProcess_SetTimeout(cp, timeout);
@@ -978,7 +981,7 @@ void cmCTestBuildHandler::ProcessBuffer(const char* data, size_t length,
       this->CurrentProcessingLine.insert(this->CurrentProcessingLine.end(),
       this->CurrentProcessingLine.insert(this->CurrentProcessingLine.end(),
                                          queue->begin(), it);
                                          queue->begin(), it);
       this->CurrentProcessingLine.push_back(0);
       this->CurrentProcessingLine.push_back(0);
-      const char* line = &*this->CurrentProcessingLine.begin();
+      const char* line = this->CurrentProcessingLine.data();
 
 
       // Process the line
       // Process the line
       int lineType = this->ProcessSingleLine(line);
       int lineType = this->ProcessSingleLine(line);

+ 1 - 1
Source/CTest/cmCTestBuildHandler.h

@@ -52,7 +52,7 @@ private:
 
 
   //! Run command specialized for make and configure. Returns process status
   //! Run command specialized for make and configure. Returns process status
   // and retVal is return value or exception.
   // and retVal is return value or exception.
-  int RunMakeCommand(const char* command, int* retVal, const char* dir,
+  int RunMakeCommand(const std::string& command, int* retVal, const char* dir,
                      int timeout, std::ostream& ofs,
                      int timeout, std::ostream& ofs,
                      Encoding encoding = cmProcessOutput::Auto);
                      Encoding encoding = cmProcessOutput::Auto);
 
 

+ 1 - 1
Source/CTest/cmCTestCVS.cxx

@@ -78,7 +78,7 @@ bool cmCTestCVS::UpdateImpl()
       opts = "-dP";
       opts = "-dP";
     }
     }
   }
   }
-  std::vector<std::string> args = cmSystemTools::ParseArguments(opts.c_str());
+  std::vector<std::string> args = cmSystemTools::ParseArguments(opts);
 
 
   // Specify the start time for nightly testing.
   // Specify the start time for nightly testing.
   if (this->CTest->GetTestModel() == cmCTest::NIGHTLY) {
   if (this->CTest->GetTestModel() == cmCTest::NIGHTLY) {

+ 1 - 1
Source/CTest/cmCTestConfigureHandler.cxx

@@ -61,7 +61,7 @@ int cmCTestConfigureHandler::ProcessHandler()
     cmCTestOptionalLog(this->CTest, HANDLER_VERBOSE_OUTPUT,
     cmCTestOptionalLog(this->CTest, HANDLER_VERBOSE_OUTPUT,
                        "Configure with command: " << cCommand << std::endl,
                        "Configure with command: " << cCommand << std::endl,
                        this->Quiet);
                        this->Quiet);
-    res = this->CTest->RunMakeCommand(cCommand.c_str(), output, &retVal,
+    res = this->CTest->RunMakeCommand(cCommand, output, &retVal,
                                       buildDirectory.c_str(),
                                       buildDirectory.c_str(),
                                       cmDuration::zero(), ofs);
                                       cmDuration::zero(), ofs);
 
 

+ 13 - 10
Source/CTest/cmCTestCoverageHandler.cxx

@@ -52,6 +52,8 @@ public:
     }
     }
     cmsysProcess_Delete(this->Process);
     cmsysProcess_Delete(this->Process);
   }
   }
+  cmCTestRunProcess(const cmCTestRunProcess&) = delete;
+  cmCTestRunProcess& operator=(const cmCTestRunProcess&) = delete;
   void SetCommand(const char* command)
   void SetCommand(const char* command)
   {
   {
     this->CommandLineStrings.clear();
     this->CommandLineStrings.clear();
@@ -72,7 +74,7 @@ public:
       args.push_back(cl.c_str());
       args.push_back(cl.c_str());
     }
     }
     args.push_back(nullptr); // null terminate
     args.push_back(nullptr); // null terminate
-    cmsysProcess_SetCommand(this->Process, &*args.begin());
+    cmsysProcess_SetCommand(this->Process, args.data());
     if (!this->WorkingDirectory.empty()) {
     if (!this->WorkingDirectory.empty()) {
       cmsysProcess_SetWorkingDirectory(this->Process,
       cmsysProcess_SetWorkingDirectory(this->Process,
                                        this->WorkingDirectory.c_str());
                                        this->WorkingDirectory.c_str());
@@ -223,7 +225,7 @@ bool cmCTestCoverageHandler::ShouldIDoCoverage(std::string const& file,
     checkDir = fBinDir;
     checkDir = fBinDir;
   }
   }
   std::string ndc = cmSystemTools::FileExistsInParentDirectories(
   std::string ndc = cmSystemTools::FileExistsInParentDirectories(
-    ".NoDartCoverage", fFile.c_str(), checkDir.c_str());
+    ".NoDartCoverage", fFile, checkDir);
   if (!ndc.empty()) {
   if (!ndc.empty()) {
     cmCTestOptionalLog(this->CTest, HANDLER_VERBOSE_OUTPUT,
     cmCTestOptionalLog(this->CTest, HANDLER_VERBOSE_OUTPUT,
                        "Found: " << ndc << " so skip coverage of " << file
                        "Found: " << ndc << " so skip coverage of " << file
@@ -254,8 +256,8 @@ bool cmCTestCoverageHandler::ShouldIDoCoverage(std::string const& file,
     return true;
     return true;
   }
   }
 
 
-  ndc = cmSystemTools::FileExistsInParentDirectories(
-    ".NoDartCoverage", fFile.c_str(), checkDir.c_str());
+  ndc = cmSystemTools::FileExistsInParentDirectories(".NoDartCoverage", fFile,
+                                                     checkDir);
   if (!ndc.empty()) {
   if (!ndc.empty()) {
     cmCTestOptionalLog(this->CTest, HANDLER_VERBOSE_OUTPUT,
     cmCTestOptionalLog(this->CTest, HANDLER_VERBOSE_OUTPUT,
                        "Found: " << ndc << " so skip coverage of: " << file
                        "Found: " << ndc << " so skip coverage of: " << file
@@ -786,6 +788,9 @@ struct cmCTestCoverageHandlerLocale
       cmSystemTools::UnsetEnv("LC_ALL");
       cmSystemTools::UnsetEnv("LC_ALL");
     }
     }
   }
   }
+  cmCTestCoverageHandlerLocale(const cmCTestCoverageHandlerLocale&) = delete;
+  cmCTestCoverageHandlerLocale& operator=(
+    const cmCTestCoverageHandlerLocale&) = delete;
   std::string lc_all;
   std::string lc_all;
 };
 };
 
 
@@ -999,7 +1004,7 @@ int cmCTestCoverageHandler::HandleGCovCoverage(
   static_cast<void>(locale_C);
   static_cast<void>(locale_C);
 
 
   std::vector<std::string> basecovargs =
   std::vector<std::string> basecovargs =
-    cmSystemTools::ParseArguments(gcovExtraFlags.c_str());
+    cmSystemTools::ParseArguments(gcovExtraFlags);
   basecovargs.insert(basecovargs.begin(), gcovCommand);
   basecovargs.insert(basecovargs.begin(), gcovCommand);
   basecovargs.emplace_back("-o");
   basecovargs.emplace_back("-o");
 
 
@@ -1058,8 +1063,7 @@ int cmCTestCoverageHandler::HandleGCovCoverage(
       this->Quiet);
       this->Quiet);
 
 
     std::vector<std::string> lines;
     std::vector<std::string> lines;
-
-    cmSystemTools::Split(output.c_str(), lines);
+    cmsys::SystemTools::Split(output, lines);
 
 
     for (std::string const& line : lines) {
     for (std::string const& line : lines) {
       std::string sourceFile;
       std::string sourceFile;
@@ -1373,7 +1377,7 @@ int cmCTestCoverageHandler::HandleLCovCoverage(
   static_cast<void>(locale_C);
   static_cast<void>(locale_C);
 
 
   std::vector<std::string> covargs =
   std::vector<std::string> covargs =
-    cmSystemTools::ParseArguments(lcovExtraFlags.c_str());
+    cmSystemTools::ParseArguments(lcovExtraFlags);
   covargs.insert(covargs.begin(), lcovCommand);
   covargs.insert(covargs.begin(), lcovCommand);
   const std::string command = joinCommandLine(covargs);
   const std::string command = joinCommandLine(covargs);
 
 
@@ -1435,8 +1439,7 @@ int cmCTestCoverageHandler::HandleLCovCoverage(
       this->Quiet);
       this->Quiet);
 
 
     std::vector<std::string> lines;
     std::vector<std::string> lines;
-
-    cmSystemTools::Split(output.c_str(), lines);
+    cmsys::SystemTools::Split(output, lines);
 
 
     for (std::string const& line : lines) {
     for (std::string const& line : lines) {
       std::string sourceFile;
       std::string sourceFile;

+ 2 - 0
Source/CTest/cmCTestCurl.h

@@ -16,6 +16,8 @@ class cmCTestCurl
 public:
 public:
   cmCTestCurl(cmCTest*);
   cmCTestCurl(cmCTest*);
   ~cmCTestCurl();
   ~cmCTestCurl();
+  cmCTestCurl(const cmCTestCurl&) = delete;
+  cmCTestCurl& operator=(const cmCTestCurl&) = delete;
   bool UploadFile(std::string const& local_file, std::string const& url,
   bool UploadFile(std::string const& local_file, std::string const& url,
                   std::string const& fields, std::string& response);
                   std::string const& fields, std::string& response);
   bool HttpRequest(std::string const& url, std::string const& fields,
   bool HttpRequest(std::string const& url, std::string const& fields,

+ 1 - 1
Source/CTest/cmCTestGIT.cxx

@@ -162,7 +162,7 @@ bool cmCTestGIT::UpdateByFetchAndReset()
   if (opts.empty()) {
   if (opts.empty()) {
     opts = this->CTest->GetCTestConfiguration("GITUpdateOptions");
     opts = this->CTest->GetCTestConfiguration("GITUpdateOptions");
   }
   }
-  std::vector<std::string> args = cmSystemTools::ParseArguments(opts.c_str());
+  std::vector<std::string> args = cmSystemTools::ParseArguments(opts);
   for (std::string const& arg : args) {
   for (std::string const& arg : args) {
     git_fetch.push_back(arg.c_str());
     git_fetch.push_back(arg.c_str());
   }
   }

+ 1 - 1
Source/CTest/cmCTestHG.cxx

@@ -144,7 +144,7 @@ bool cmCTestHG::UpdateImpl()
   if (opts.empty()) {
   if (opts.empty()) {
     opts = this->CTest->GetCTestConfiguration("HGUpdateOptions");
     opts = this->CTest->GetCTestConfiguration("HGUpdateOptions");
   }
   }
-  std::vector<std::string> args = cmSystemTools::ParseArguments(opts.c_str());
+  std::vector<std::string> args = cmSystemTools::ParseArguments(opts);
   for (std::string const& arg : args) {
   for (std::string const& arg : args) {
     hg_update.push_back(arg.c_str());
     hg_update.push_back(arg.c_str());
   }
   }

+ 2 - 0
Source/CTest/cmCTestHandlerCommand.cxx

@@ -76,6 +76,8 @@ public:
       }
       }
     }
     }
   }
   }
+  SaveRestoreErrorState(const SaveRestoreErrorState&) = delete;
+  SaveRestoreErrorState& operator=(const SaveRestoreErrorState&) = delete;
 
 
 private:
 private:
   bool InitialErrorState;
   bool InitialErrorState;

+ 3 - 0
Source/CTest/cmCTestLaunch.h

@@ -28,6 +28,9 @@ private:
   cmCTestLaunch(int argc, const char* const* argv);
   cmCTestLaunch(int argc, const char* const* argv);
   ~cmCTestLaunch();
   ~cmCTestLaunch();
 
 
+  cmCTestLaunch(const cmCTestLaunch&) = delete;
+  cmCTestLaunch& operator=(const cmCTestLaunch&) = delete;
+
   // Run the real command.
   // Run the real command.
   int Run();
   int Run();
   void RunChild();
   void RunChild();

+ 5 - 5
Source/CTest/cmCTestMemCheckHandler.cxx

@@ -520,7 +520,7 @@ bool cmCTestMemCheckHandler::InitializeMemoryChecking()
       this->CTest->GetCTestConfiguration("ValgrindCommandOptions");
       this->CTest->GetCTestConfiguration("ValgrindCommandOptions");
   }
   }
   this->MemoryTesterOptions =
   this->MemoryTesterOptions =
-    cmSystemTools::ParseArguments(memoryTesterOptions.c_str());
+    cmSystemTools::ParseArguments(memoryTesterOptions);
 
 
   this->MemoryTesterOutputFile =
   this->MemoryTesterOutputFile =
     this->CTest->GetBinaryDir() + "/Testing/Temporary/MemoryChecker.??.log";
     this->CTest->GetBinaryDir() + "/Testing/Temporary/MemoryChecker.??.log";
@@ -725,7 +725,7 @@ bool cmCTestMemCheckHandler::ProcessMemCheckSanitizerOutput(
   cmsys::RegularExpression leakWarning("(Direct|Indirect) leak of .*");
   cmsys::RegularExpression leakWarning("(Direct|Indirect) leak of .*");
   int defects = 0;
   int defects = 0;
   std::vector<std::string> lines;
   std::vector<std::string> lines;
-  cmSystemTools::Split(str.c_str(), lines);
+  cmsys::SystemTools::Split(str, lines);
   std::ostringstream ostr;
   std::ostringstream ostr;
   log.clear();
   log.clear();
   for (std::string const& l : lines) {
   for (std::string const& l : lines) {
@@ -755,7 +755,7 @@ bool cmCTestMemCheckHandler::ProcessMemCheckPurifyOutput(
   const std::string& str, std::string& log, std::vector<int>& results)
   const std::string& str, std::string& log, std::vector<int>& results)
 {
 {
   std::vector<std::string> lines;
   std::vector<std::string> lines;
-  cmSystemTools::Split(str.c_str(), lines);
+  cmsys::SystemTools::Split(str, lines);
   std::ostringstream ostr;
   std::ostringstream ostr;
   log.clear();
   log.clear();
 
 
@@ -798,7 +798,7 @@ bool cmCTestMemCheckHandler::ProcessMemCheckValgrindOutput(
   const std::string& str, std::string& log, std::vector<int>& results)
   const std::string& str, std::string& log, std::vector<int>& results)
 {
 {
   std::vector<std::string> lines;
   std::vector<std::string> lines;
-  cmSystemTools::Split(str.c_str(), lines);
+  cmsys::SystemTools::Split(str, lines);
   bool unlimitedOutput = false;
   bool unlimitedOutput = false;
   if (str.find("CTEST_FULL_OUTPUT") != std::string::npos ||
   if (str.find("CTEST_FULL_OUTPUT") != std::string::npos ||
       this->CustomMaximumFailedTestOutputSize == 0) {
       this->CustomMaximumFailedTestOutputSize == 0) {
@@ -937,7 +937,7 @@ bool cmCTestMemCheckHandler::ProcessMemCheckBoundsCheckerOutput(
   log.clear();
   log.clear();
   auto sttime = std::chrono::steady_clock::now();
   auto sttime = std::chrono::steady_clock::now();
   std::vector<std::string> lines;
   std::vector<std::string> lines;
-  cmSystemTools::Split(str.c_str(), lines);
+  cmsys::SystemTools::Split(str, lines);
   cmCTestOptionalLog(this->CTest, DEBUG,
   cmCTestOptionalLog(this->CTest, DEBUG,
                      "Start test: " << lines.size() << std::endl, this->Quiet);
                      "Start test: " << lines.size() << std::endl, this->Quiet);
   std::vector<std::string>::size_type cc;
   std::vector<std::string>::size_type cc;

+ 4 - 5
Source/CTest/cmCTestMultiProcessHandler.cxx

@@ -8,6 +8,7 @@
 #include "cmCTestTestHandler.h"
 #include "cmCTestTestHandler.h"
 #include "cmDuration.h"
 #include "cmDuration.h"
 #include "cmListFileCache.h"
 #include "cmListFileCache.h"
+#include "cmRange.h"
 #include "cmSystemTools.h"
 #include "cmSystemTools.h"
 #include "cmWorkingDirectory.h"
 #include "cmWorkingDirectory.h"
 
 
@@ -108,8 +109,8 @@ void cmCTestMultiProcessHandler::SetTestLoad(unsigned long load)
                             fake_load_value)) {
                             fake_load_value)) {
     if (!cmSystemTools::StringToULong(fake_load_value.c_str(),
     if (!cmSystemTools::StringToULong(fake_load_value.c_str(),
                                       &this->FakeLoadForTesting)) {
                                       &this->FakeLoadForTesting)) {
-      cmSystemTools::Error("Failed to parse fake load value: ",
-                           fake_load_value.c_str());
+      cmSystemTools::Error("Failed to parse fake load value: " +
+                           fake_load_value);
     }
     }
   }
   }
 }
 }
@@ -651,9 +652,7 @@ void cmCTestMultiProcessHandler::CreateParallelTestCostList()
 
 
   // Reverse iterate over the different dependency levels (deepest first).
   // Reverse iterate over the different dependency levels (deepest first).
   // Sort tests within each level by COST and append them to the cost list.
   // Sort tests within each level by COST and append them to the cost list.
-  for (std::list<TestSet>::reverse_iterator i = priorityStack.rbegin();
-       i != priorityStack.rend(); ++i) {
-    TestSet const& currentSet = *i;
+  for (TestSet const& currentSet : cmReverseRange(priorityStack)) {
     TestComparator comp(this);
     TestComparator comp(this);
 
 
     TestList sortedCopy;
     TestList sortedCopy;

+ 5 - 6
Source/CTest/cmCTestP4.cxx

@@ -5,6 +5,7 @@
 #include "cmCTest.h"
 #include "cmCTest.h"
 #include "cmCTestVC.h"
 #include "cmCTestVC.h"
 #include "cmProcessTools.h"
 #include "cmProcessTools.h"
+#include "cmRange.h"
 #include "cmSystemTools.h"
 #include "cmSystemTools.h"
 
 
 #include "cmsys/RegularExpression.hxx"
 #include "cmsys/RegularExpression.hxx"
@@ -323,8 +324,7 @@ void cmCTestP4::SetP4Options(std::vector<char const*>& CommandOptions)
     // The CTEST_P4_OPTIONS variable adds additional Perforce command line
     // The CTEST_P4_OPTIONS variable adds additional Perforce command line
     // options before the main command
     // options before the main command
     std::string opts = this->CTest->GetCTestConfiguration("P4Options");
     std::string opts = this->CTest->GetCTestConfiguration("P4Options");
-    std::vector<std::string> args =
-      cmSystemTools::ParseArguments(opts.c_str());
+    std::vector<std::string> args = cmSystemTools::ParseArguments(opts);
 
 
     P4Options.insert(P4Options.end(), args.begin(), args.end());
     P4Options.insert(P4Options.end(), args.begin(), args.end());
   }
   }
@@ -425,12 +425,11 @@ bool cmCTestP4::LoadRevisions()
 
 
   // p4 describe -s ...@1111111,2222222
   // p4 describe -s ...@1111111,2222222
   std::vector<char const*> p4_describe;
   std::vector<char const*> p4_describe;
-  for (std::vector<std::string>::reverse_iterator i = ChangeLists.rbegin();
-       i != ChangeLists.rend(); ++i) {
+  for (std::string const& i : cmReverseRange(ChangeLists)) {
     SetP4Options(p4_describe);
     SetP4Options(p4_describe);
     p4_describe.push_back("describe");
     p4_describe.push_back("describe");
     p4_describe.push_back("-s");
     p4_describe.push_back("-s");
-    p4_describe.push_back(i->c_str());
+    p4_describe.push_back(i.c_str());
     p4_describe.push_back(nullptr);
     p4_describe.push_back(nullptr);
 
 
     DescribeParser outDescribe(this, "p4_describe-out> ");
     DescribeParser outDescribe(this, "p4_describe-out> ");
@@ -501,7 +500,7 @@ bool cmCTestP4::UpdateImpl()
   if (opts.empty()) {
   if (opts.empty()) {
     opts = this->CTest->GetCTestConfiguration("P4UpdateOptions");
     opts = this->CTest->GetCTestConfiguration("P4UpdateOptions");
   }
   }
-  std::vector<std::string> args = cmSystemTools::ParseArguments(opts.c_str());
+  std::vector<std::string> args = cmSystemTools::ParseArguments(opts);
   for (std::string const& arg : args) {
   for (std::string const& arg : args) {
     p4_sync.push_back(arg.c_str());
     p4_sync.push_back(arg.c_str());
   }
   }

+ 13 - 74
Source/CTest/cmCTestRunTest.cxx

@@ -9,11 +9,10 @@
 #include "cmSystemTools.h"
 #include "cmSystemTools.h"
 #include "cmWorkingDirectory.h"
 #include "cmWorkingDirectory.h"
 
 
-#include "cm_zlib.h"
-#include "cmsys/Base64.h"
 #include "cmsys/RegularExpression.hxx"
 #include "cmsys/RegularExpression.hxx"
 #include <chrono>
 #include <chrono>
 #include <cmAlgorithms.h>
 #include <cmAlgorithms.h>
+#include <cstdint>
 #include <cstring>
 #include <cstring>
 #include <iomanip>
 #include <iomanip>
 #include <ratio>
 #include <ratio>
@@ -31,9 +30,6 @@ cmCTestRunTest::cmCTestRunTest(cmCTestMultiProcessHandler& multiHandler)
   this->TestResult.Status = cmCTestTestHandler::NOT_RUN;
   this->TestResult.Status = cmCTestTestHandler::NOT_RUN;
   this->TestResult.TestCount = 0;
   this->TestResult.TestCount = 0;
   this->TestResult.Properties = nullptr;
   this->TestResult.Properties = nullptr;
-  this->ProcessOutput.clear();
-  this->CompressedOutput.clear();
-  this->CompressionRatio = 2;
   this->NumberOfRunsLeft = 1; // default to 1 run of the test
   this->NumberOfRunsLeft = 1; // default to 1 run of the test
   this->RunUntilFail = false; // default to run the test once
   this->RunUntilFail = false; // default to run the test once
   this->RunAgain = false;     // default to not having to run again
   this->RunAgain = false;     // default to not having to run again
@@ -68,73 +64,8 @@ void cmCTestRunTest::CheckOutput(std::string const& line)
   }
   }
 }
 }
 
 
-// Streamed compression of test output.  The compressed data
-// is appended to this->CompressedOutput
-void cmCTestRunTest::CompressOutput()
-{
-  int ret;
-  z_stream strm;
-
-  unsigned char* in = reinterpret_cast<unsigned char*>(
-    const_cast<char*>(this->ProcessOutput.c_str()));
-  // zlib makes the guarantee that this is the maximum output size
-  int outSize = static_cast<int>(
-    static_cast<double>(this->ProcessOutput.size()) * 1.001 + 13.0);
-  unsigned char* out = new unsigned char[outSize];
-
-  strm.zalloc = Z_NULL;
-  strm.zfree = Z_NULL;
-  strm.opaque = Z_NULL;
-  ret = deflateInit(&strm, -1); // default compression level
-  if (ret != Z_OK) {
-    delete[] out;
-    return;
-  }
-
-  strm.avail_in = static_cast<uInt>(this->ProcessOutput.size());
-  strm.next_in = in;
-  strm.avail_out = outSize;
-  strm.next_out = out;
-  ret = deflate(&strm, Z_FINISH);
-
-  if (ret != Z_STREAM_END) {
-    cmCTestLog(this->CTest, ERROR_MESSAGE,
-               "Error during output compression. Sending uncompressed output."
-                 << std::endl);
-    delete[] out;
-    return;
-  }
-
-  (void)deflateEnd(&strm);
-
-  unsigned char* encoded_buffer =
-    new unsigned char[static_cast<int>(outSize * 1.5)];
-
-  size_t rlen = cmsysBase64_Encode(out, strm.total_out, encoded_buffer, 1);
-
-  this->CompressedOutput.clear();
-  for (size_t i = 0; i < rlen; i++) {
-    this->CompressedOutput += encoded_buffer[i];
-  }
-
-  if (strm.total_in) {
-    this->CompressionRatio =
-      static_cast<double>(strm.total_out) / static_cast<double>(strm.total_in);
-  }
-
-  delete[] encoded_buffer;
-  delete[] out;
-}
-
 bool cmCTestRunTest::EndTest(size_t completed, size_t total, bool started)
 bool cmCTestRunTest::EndTest(size_t completed, size_t total, bool started)
 {
 {
-  if ((!this->TestHandler->MemCheck &&
-       this->CTest->ShouldCompressTestOutput()) ||
-      (this->TestHandler->MemCheck &&
-       this->CTest->ShouldCompressTestOutput())) {
-    this->CompressOutput();
-  }
-
   this->WriteLogOutputTop(completed, total);
   this->WriteLogOutputTop(completed, total);
   std::string reason;
   std::string reason;
   bool passed = true;
   bool passed = true;
@@ -143,7 +74,7 @@ bool cmCTestRunTest::EndTest(size_t completed, size_t total, bool started)
   if (res != cmProcess::State::Expired) {
   if (res != cmProcess::State::Expired) {
     this->TimeoutIsForStopTime = false;
     this->TimeoutIsForStopTime = false;
   }
   }
-  int retVal = this->TestProcess->GetExitValue();
+  std::int64_t retVal = this->TestProcess->GetExitValue();
   bool forceFail = false;
   bool forceFail = false;
   bool skipped = false;
   bool skipped = false;
   bool outputTestErrorsToConsole = false;
   bool outputTestErrorsToConsole = false;
@@ -335,10 +266,18 @@ bool cmCTestRunTest::EndTest(size_t completed, size_t total, bool started)
   // if the test actually started and ran
   // if the test actually started and ran
   // record the results in TestResult
   // record the results in TestResult
   if (started) {
   if (started) {
-    bool compress = !this->TestHandler->MemCheck &&
-      this->CompressionRatio < 1 && this->CTest->ShouldCompressTestOutput();
+    std::string compressedOutput;
+    if (!this->TestHandler->MemCheck &&
+        this->CTest->ShouldCompressTestOutput()) {
+      std::string str = this->ProcessOutput;
+      if (this->CTest->CompressString(str)) {
+        compressedOutput = std::move(str);
+      }
+    }
+    bool compress = !compressedOutput.empty() &&
+      compressedOutput.length() < this->ProcessOutput.length();
     this->TestResult.Output =
     this->TestResult.Output =
-      compress ? this->CompressedOutput : this->ProcessOutput;
+      compress ? compressedOutput : this->ProcessOutput;
     this->TestResult.CompressOutput = compress;
     this->TestResult.CompressOutput = compress;
     this->TestResult.ReturnValue = this->TestProcess->GetExitValue();
     this->TestResult.ReturnValue = this->TestProcess->GetExitValue();
     if (!skipped) {
     if (!skipped) {

+ 0 - 5
Source/CTest/cmCTestRunTest.h

@@ -58,9 +58,6 @@ public:
   // Read and store output.  Returns true if it must be called again.
   // Read and store output.  Returns true if it must be called again.
   void CheckOutput(std::string const& line);
   void CheckOutput(std::string const& line);
 
 
-  // Compresses the output, writing to CompressedOutput
-  void CompressOutput();
-
   // launch the test process, return whether it started correctly
   // launch the test process, return whether it started correctly
   bool StartTest(size_t completed, size_t total);
   bool StartTest(size_t completed, size_t total);
   // capture and report the test results
   // capture and report the test results
@@ -105,8 +102,6 @@ private:
   cmCTest* CTest;
   cmCTest* CTest;
   std::unique_ptr<cmProcess> TestProcess;
   std::unique_ptr<cmProcess> TestProcess;
   std::string ProcessOutput;
   std::string ProcessOutput;
-  std::string CompressedOutput;
-  double CompressionRatio;
   // The test results
   // The test results
   cmCTestTestHandler::cmCTestTestResult TestResult;
   cmCTestTestHandler::cmCTestTestResult TestResult;
   cmCTestMultiProcessHandler& MultiTestHandler;
   cmCTestMultiProcessHandler& MultiTestHandler;

+ 2 - 2
Source/CTest/cmCTestSVN.cxx

@@ -242,7 +242,7 @@ bool cmCTestSVN::UpdateImpl()
   if (opts.empty()) {
   if (opts.empty()) {
     opts = this->CTest->GetCTestConfiguration("SVNUpdateOptions");
     opts = this->CTest->GetCTestConfiguration("SVNUpdateOptions");
   }
   }
-  std::vector<std::string> args = cmSystemTools::ParseArguments(opts.c_str());
+  std::vector<std::string> args = cmSystemTools::ParseArguments(opts);
 
 
   // Specify the start time for nightly testing.
   // Specify the start time for nightly testing.
   if (this->CTest->GetTestModel() == cmCTest::NIGHTLY) {
   if (this->CTest->GetTestModel() == cmCTest::NIGHTLY) {
@@ -277,7 +277,7 @@ bool cmCTestSVN::RunSVNCommand(std::vector<char const*> const& parameters,
   std::string userOptions = this->CTest->GetCTestConfiguration("SVNOptions");
   std::string userOptions = this->CTest->GetCTestConfiguration("SVNOptions");
 
 
   std::vector<std::string> parsedUserOptions =
   std::vector<std::string> parsedUserOptions =
-    cmSystemTools::ParseArguments(userOptions.c_str());
+    cmSystemTools::ParseArguments(userOptions);
   for (std::string const& opt : parsedUserOptions) {
   for (std::string const& opt : parsedUserOptions) {
     args.push_back(opt.c_str());
     args.push_back(opt.c_str());
   }
   }

+ 20 - 21
Source/CTest/cmCTestScriptHandler.cxx

@@ -199,7 +199,7 @@ int cmCTestScriptHandler::ExecuteScript(const std::string& total_script_arg)
 
 
   // Now create process object
   // Now create process object
   cmsysProcess* cp = cmsysProcess_New();
   cmsysProcess* cp = cmsysProcess_New();
-  cmsysProcess_SetCommand(cp, &*argv.begin());
+  cmsysProcess_SetCommand(cp, argv.data());
   // cmsysProcess_SetWorkingDirectory(cp, dir);
   // cmsysProcess_SetWorkingDirectory(cp, dir);
   cmsysProcess_SetOption(cp, cmsysProcess_Option_HideWindow, 1);
   cmsysProcess_SetOption(cp, cmsysProcess_Option_HideWindow, 1);
   // cmsysProcess_SetTimeout(cp, timeout);
   // cmsysProcess_SetTimeout(cp, timeout);
@@ -288,11 +288,12 @@ void cmCTestScriptHandler::CreateCMake()
       this->ParentMakefile->GetRecursionDepth());
       this->ParentMakefile->GetRecursionDepth());
   }
   }
 
 
-  this->CMake->SetProgressCallback([this](const char* m, float /*unused*/) {
-    if (m && *m) {
-      cmCTestLog(this->CTest, HANDLER_OUTPUT, "-- " << m << std::endl);
-    }
-  });
+  this->CMake->SetProgressCallback(
+    [this](const std::string& m, float /*unused*/) {
+      if (!m.empty()) {
+        cmCTestLog(this->CTest, HANDLER_OUTPUT, "-- " << m << std::endl);
+      }
+    });
 
 
   this->AddCTestCommand("ctest_build", new cmCTestBuildCommand);
   this->AddCTestCommand("ctest_build", new cmCTestBuildCommand);
   this->AddCTestCommand("ctest_configure", new cmCTestConfigureCommand);
   this->AddCTestCommand("ctest_configure", new cmCTestConfigureCommand);
@@ -330,7 +331,7 @@ int cmCTestScriptHandler::ReadInScript(const std::string& total_script_arg)
   }
   }
   // make sure the file exists
   // make sure the file exists
   if (!cmSystemTools::FileExists(script)) {
   if (!cmSystemTools::FileExists(script)) {
-    cmSystemTools::Error("Cannot find file: ", script.c_str());
+    cmSystemTools::Error("Cannot find file: " + script);
     return 1;
     return 1;
   }
   }
 
 
@@ -470,8 +471,8 @@ int cmCTestScriptHandler::ExtractVariables()
     msg += "\nCTEST_COMMAND = ";
     msg += "\nCTEST_COMMAND = ";
     msg += (!this->CTestCmd.empty()) ? this->CTestCmd.c_str() : "(Null)";
     msg += (!this->CTestCmd.empty()) ? this->CTestCmd.c_str() : "(Null)";
     cmSystemTools::Error(
     cmSystemTools::Error(
-      "Some required settings in the configuration file were missing:\n",
-      msg.c_str());
+      "Some required settings in the configuration file were missing:\n" +
+      msg);
     return 4;
     return 4;
   }
   }
 
 
@@ -607,12 +608,10 @@ int cmCTestScriptHandler::CheckOutSourceDir()
     cmCTestLog(this->CTest, HANDLER_VERBOSE_OUTPUT,
     cmCTestLog(this->CTest, HANDLER_VERBOSE_OUTPUT,
                "Run cvs: " << this->CVSCheckOut << std::endl);
                "Run cvs: " << this->CVSCheckOut << std::endl);
     res = cmSystemTools::RunSingleCommand(
     res = cmSystemTools::RunSingleCommand(
-      this->CVSCheckOut.c_str(), &output, &output, &retVal,
-      this->CTestRoot.c_str(), this->HandlerVerbose,
-      cmDuration::zero() /*this->TimeOut*/);
+      this->CVSCheckOut, &output, &output, &retVal, this->CTestRoot.c_str(),
+      this->HandlerVerbose, cmDuration::zero() /*this->TimeOut*/);
     if (!res || retVal != 0) {
     if (!res || retVal != 0) {
-      cmSystemTools::Error("Unable to perform cvs checkout:\n",
-                           output.c_str());
+      cmSystemTools::Error("Unable to perform cvs checkout:\n" + output);
       return 6;
       return 6;
     }
     }
   }
   }
@@ -675,11 +674,11 @@ int cmCTestScriptHandler::PerformExtraUpdates()
       cmCTestLog(this->CTest, HANDLER_VERBOSE_OUTPUT,
       cmCTestLog(this->CTest, HANDLER_VERBOSE_OUTPUT,
                  "Run Update: " << fullCommand << std::endl);
                  "Run Update: " << fullCommand << std::endl);
       res = cmSystemTools::RunSingleCommand(
       res = cmSystemTools::RunSingleCommand(
-        fullCommand.c_str(), &output, &output, &retVal, cvsArgs[0].c_str(),
+        fullCommand, &output, &output, &retVal, cvsArgs[0].c_str(),
         this->HandlerVerbose, cmDuration::zero() /*this->TimeOut*/);
         this->HandlerVerbose, cmDuration::zero() /*this->TimeOut*/);
       if (!res || retVal != 0) {
       if (!res || retVal != 0) {
-        cmSystemTools::Error("Unable to perform extra updates:\n", eu.c_str(),
-                             "\nWith output:\n", output.c_str());
+        cmSystemTools::Error("Unable to perform extra updates:\n" + eu +
+                             "\nWith output:\n" + output);
         return 0;
         return 0;
       }
       }
     }
     }
@@ -721,8 +720,8 @@ int cmCTestScriptHandler::RunConfigurationDashboard()
   if (!cmSystemTools::FileExists(this->BinaryDir) &&
   if (!cmSystemTools::FileExists(this->BinaryDir) &&
       this->SourceDir != this->BinaryDir) {
       this->SourceDir != this->BinaryDir) {
     if (!cmSystemTools::MakeDirectory(this->BinaryDir)) {
     if (!cmSystemTools::MakeDirectory(this->BinaryDir)) {
-      cmSystemTools::Error("Unable to create the binary directory:\n",
-                           this->BinaryDir.c_str());
+      cmSystemTools::Error("Unable to create the binary directory:\n" +
+                           this->BinaryDir);
       this->RestoreBackupDirectories();
       this->RestoreBackupDirectories();
       return 7;
       return 7;
     }
     }
@@ -779,7 +778,7 @@ int cmCTestScriptHandler::RunConfigurationDashboard()
     cmCTestLog(this->CTest, HANDLER_VERBOSE_OUTPUT,
     cmCTestLog(this->CTest, HANDLER_VERBOSE_OUTPUT,
                "Run cmake command: " << command << std::endl);
                "Run cmake command: " << command << std::endl);
     res = cmSystemTools::RunSingleCommand(
     res = cmSystemTools::RunSingleCommand(
-      command.c_str(), &output, &output, &retVal, this->BinaryDir.c_str(),
+      command, &output, &output, &retVal, this->BinaryDir.c_str(),
       this->HandlerVerbose, cmDuration::zero() /*this->TimeOut*/);
       this->HandlerVerbose, cmDuration::zero() /*this->TimeOut*/);
 
 
     if (!this->CMOutFile.empty()) {
     if (!this->CMOutFile.empty()) {
@@ -818,7 +817,7 @@ int cmCTestScriptHandler::RunConfigurationDashboard()
     cmCTestLog(this->CTest, HANDLER_VERBOSE_OUTPUT,
     cmCTestLog(this->CTest, HANDLER_VERBOSE_OUTPUT,
                "Run ctest command: " << command << std::endl);
                "Run ctest command: " << command << std::endl);
     res = cmSystemTools::RunSingleCommand(
     res = cmSystemTools::RunSingleCommand(
-      command.c_str(), &output, &output, &retVal, this->BinaryDir.c_str(),
+      command, &output, &output, &retVal, this->BinaryDir.c_str(),
       this->HandlerVerbose, cmDuration::zero() /*this->TimeOut*/);
       this->HandlerVerbose, cmDuration::zero() /*this->TimeOut*/);
 
 
     // did something critical fail in ctest
     // did something critical fail in ctest

+ 10 - 11
Source/CTest/cmCTestSubmitHandler.cxx

@@ -343,7 +343,7 @@ bool cmCTestSubmitHandler::SubmitUsingHTTP(
       if (!chunk.empty()) {
       if (!chunk.empty()) {
         cmCTestOptionalLog(this->CTest, DEBUG,
         cmCTestOptionalLog(this->CTest, DEBUG,
                            "CURL output: ["
                            "CURL output: ["
-                             << cmCTestLogWrite(&*chunk.begin(), chunk.size())
+                             << cmCTestLogWrite(chunk.data(), chunk.size())
                              << "]" << std::endl,
                              << "]" << std::endl,
                            this->Quiet);
                            this->Quiet);
         this->ParseResponse(chunk);
         this->ParseResponse(chunk);
@@ -352,7 +352,7 @@ bool cmCTestSubmitHandler::SubmitUsingHTTP(
         cmCTestOptionalLog(
         cmCTestOptionalLog(
           this->CTest, DEBUG,
           this->CTest, DEBUG,
           "CURL debug output: ["
           "CURL debug output: ["
-            << cmCTestLogWrite(&*chunkDebug.begin(), chunkDebug.size()) << "]"
+            << cmCTestLogWrite(chunkDebug.data(), chunkDebug.size()) << "]"
             << std::endl,
             << std::endl,
           this->Quiet);
           this->Quiet);
       }
       }
@@ -404,12 +404,11 @@ bool cmCTestSubmitHandler::SubmitUsingHTTP(
           res = ::curl_easy_perform(curl);
           res = ::curl_easy_perform(curl);
 
 
           if (!chunk.empty()) {
           if (!chunk.empty()) {
-            cmCTestOptionalLog(
-              this->CTest, DEBUG,
-              "CURL output: ["
-                << cmCTestLogWrite(&*chunk.begin(), chunk.size()) << "]"
-                << std::endl,
-              this->Quiet);
+            cmCTestOptionalLog(this->CTest, DEBUG,
+                               "CURL output: ["
+                                 << cmCTestLogWrite(chunk.data(), chunk.size())
+                                 << "]" << std::endl,
+                               this->Quiet);
             this->ParseResponse(chunk);
             this->ParseResponse(chunk);
           }
           }
 
 
@@ -433,11 +432,11 @@ bool cmCTestSubmitHandler::SubmitUsingHTTP(
         // avoid deref of begin for zero size array
         // avoid deref of begin for zero size array
         if (!chunk.empty()) {
         if (!chunk.empty()) {
           *this->LogFile << "   Curl output was: "
           *this->LogFile << "   Curl output was: "
-                         << cmCTestLogWrite(&*chunk.begin(), chunk.size())
+                         << cmCTestLogWrite(chunk.data(), chunk.size())
                          << std::endl;
                          << std::endl;
           cmCTestLog(this->CTest, ERROR_MESSAGE,
           cmCTestLog(this->CTest, ERROR_MESSAGE,
                      "CURL output: ["
                      "CURL output: ["
-                       << cmCTestLogWrite(&*chunk.begin(), chunk.size()) << "]"
+                       << cmCTestLogWrite(chunk.data(), chunk.size()) << "]"
                        << std::endl);
                        << std::endl);
         }
         }
         ::curl_easy_cleanup(curl);
         ::curl_easy_cleanup(curl);
@@ -486,7 +485,7 @@ void cmCTestSubmitHandler::ParseResponse(
   if (this->HasWarnings || this->HasErrors) {
   if (this->HasWarnings || this->HasErrors) {
     cmCTestLog(this->CTest, HANDLER_OUTPUT,
     cmCTestLog(this->CTest, HANDLER_OUTPUT,
                "   Server Response:\n"
                "   Server Response:\n"
-                 << cmCTestLogWrite(&*chunk.begin(), chunk.size()) << "\n");
+                 << cmCTestLogWrite(chunk.data(), chunk.size()) << "\n");
   }
   }
 }
 }
 
 

+ 1 - 1
Source/CTest/cmCTestTestHandler.cxx

@@ -1486,7 +1486,7 @@ int cmCTestTestHandler::ExecuteCommands(std::vector<std::string>& vec)
     int retVal = 0;
     int retVal = 0;
     cmCTestOptionalLog(this->CTest, HANDLER_VERBOSE_OUTPUT,
     cmCTestOptionalLog(this->CTest, HANDLER_VERBOSE_OUTPUT,
                        "Run command: " << it << std::endl, this->Quiet);
                        "Run command: " << it << std::endl, this->Quiet);
-    if (!cmSystemTools::RunSingleCommand(it.c_str(), nullptr, nullptr, &retVal,
+    if (!cmSystemTools::RunSingleCommand(it, nullptr, nullptr, &retVal,
                                          nullptr, cmSystemTools::OUTPUT_MERGE
                                          nullptr, cmSystemTools::OUTPUT_MERGE
                                          /*this->Verbose*/) ||
                                          /*this->Verbose*/) ||
         retVal != 0) {
         retVal != 0) {

+ 2 - 1
Source/CTest/cmCTestTestHandler.h

@@ -11,6 +11,7 @@
 
 
 #include "cmsys/RegularExpression.hxx"
 #include "cmsys/RegularExpression.hxx"
 #include <chrono>
 #include <chrono>
+#include <cstdint>
 #include <iosfwd>
 #include <iosfwd>
 #include <map>
 #include <map>
 #include <set>
 #include <set>
@@ -153,7 +154,7 @@ public:
     std::string Reason;
     std::string Reason;
     std::string FullCommandLine;
     std::string FullCommandLine;
     cmDuration ExecutionTime;
     cmDuration ExecutionTime;
-    int ReturnValue;
+    std::int64_t ReturnValue;
     int Status;
     int Status;
     std::string ExceptionStatus;
     std::string ExceptionStatus;
     bool CompressOutput;
     bool CompressOutput;

+ 8 - 5
Source/CTest/cmProcess.cxx

@@ -11,7 +11,9 @@
 #include <iostream>
 #include <iostream>
 #include <signal.h>
 #include <signal.h>
 #include <string>
 #include <string>
-#if !defined(_WIN32)
+#if defined(_WIN32)
+#  include "cm_kwiml.h"
+#else
 #  include <unistd.h>
 #  include <unistd.h>
 #endif
 #endif
 #include <utility>
 #include <utility>
@@ -199,7 +201,7 @@ bool cmProcess::Buffer::GetLine(std::string& line)
   for (size_type sz = this->size(); this->Last != sz; ++this->Last) {
   for (size_type sz = this->size(); this->Last != sz; ++this->Last) {
     if ((*this)[this->Last] == '\n' || (*this)[this->Last] == '\0') {
     if ((*this)[this->Last] == '\n' || (*this)[this->Last] == '\0') {
       // Extract the range first..last as a line.
       // Extract the range first..last as a line.
-      const char* text = &*this->begin() + this->First;
+      const char* text = this->data() + this->First;
       size_type length = this->Last - this->First;
       size_type length = this->Last - this->First;
       while (length && text[length - 1] == '\r') {
       while (length && text[length - 1] == '\r') {
         length--;
         length--;
@@ -229,7 +231,7 @@ bool cmProcess::Buffer::GetLast(std::string& line)
 {
 {
   // Return the partial last line, if any.
   // Return the partial last line, if any.
   if (!this->empty()) {
   if (!this->empty()) {
-    line.assign(&*this->begin(), this->size());
+    line.assign(this->data(), this->size());
     this->First = this->Last = 0;
     this->First = this->Last = 0;
     this->clear();
     this->clear();
     return true;
     return true;
@@ -353,7 +355,7 @@ void cmProcess::OnExit(int64_t exit_status, int term_signal)
   }
   }
 
 
   // Record exit information.
   // Record exit information.
-  this->ExitValue = static_cast<int>(exit_status);
+  this->ExitValue = exit_status;
   this->Signal = term_signal;
   this->Signal = term_signal;
   this->TotalTime = std::chrono::steady_clock::now() - this->StartTime;
   this->TotalTime = std::chrono::steady_clock::now() - this->StartTime;
   // Because of a processor clock scew the runtime may become slightly
   // Because of a processor clock scew the runtime may become slightly
@@ -539,7 +541,8 @@ std::string cmProcess::GetExitExceptionString()
     case STATUS_NO_MEMORY:
     case STATUS_NO_MEMORY:
     default:
     default:
       char buf[1024];
       char buf[1024];
-      _snprintf(buf, 1024, "Exit code 0x%x\n", this->ExitValue);
+      const char* fmt = "Exit code 0x%" KWIML_INT_PRIx64 "\n";
+      _snprintf(buf, 1024, fmt, this->ExitValue);
       exception_str.assign(buf);
       exception_str.assign(buf);
   }
   }
 #else
 #else

+ 2 - 2
Source/CTest/cmProcess.h

@@ -53,7 +53,7 @@ public:
   State GetProcessStatus();
   State GetProcessStatus();
   int GetId() { return this->Id; }
   int GetId() { return this->Id; }
   void SetId(int id) { this->Id = id; }
   void SetId(int id) { this->Id = id; }
-  int GetExitValue() { return this->ExitValue; }
+  int64_t GetExitValue() { return this->ExitValue; }
   cmDuration GetTotalTime() { return this->TotalTime; }
   cmDuration GetTotalTime() { return this->TotalTime; }
 
 
   enum class Exception
   enum class Exception
@@ -122,7 +122,7 @@ private:
   std::vector<std::string> Arguments;
   std::vector<std::string> Arguments;
   std::vector<const char*> ProcessArgs;
   std::vector<const char*> ProcessArgs;
   int Id;
   int Id;
-  int ExitValue;
+  int64_t ExitValue;
 };
 };
 
 
 #endif
 #endif

+ 13 - 0
Source/Checks/cm_cxx17_check.cpp

@@ -2,8 +2,21 @@
 #include <memory>
 #include <memory>
 #include <unordered_map>
 #include <unordered_map>
 
 
+#ifdef _MSC_VER
+#  include <comdef.h>
+#endif
+
 int main()
 int main()
 {
 {
   std::unique_ptr<int> u(new int(0));
   std::unique_ptr<int> u(new int(0));
+
+#ifdef _MSC_VER
+  // clang-cl has problems instantiating this constructor in C++17 mode
+  //  error: indirection requires pointer operand ('const _GUID' invalid)
+  //      return *_IID;
+  IUnknownPtr ptr{};
+  IDispatchPtr disp(ptr);
+#endif
+
   return *u;
   return *u;
 }
 }

+ 1 - 1
Source/CursesDialog/ccmake.cxx

@@ -150,7 +150,7 @@ int main(int argc, char const* const* argv)
   }
   }
 
 
   cmSystemTools::SetMessageCallback(
   cmSystemTools::SetMessageCallback(
-    [myform](const char* message, const char* title) {
+    [myform](const std::string& message, const char* title) {
       myform->AddError(message, title);
       myform->AddError(message, title);
     });
     });
 
 

+ 3 - 1
Source/CursesDialog/cmCursesForm.h

@@ -9,6 +9,8 @@
 
 
 #include "cmsys/FStream.hxx"
 #include "cmsys/FStream.hxx"
 
 
+#include <string>
+
 class cmCursesForm
 class cmCursesForm
 {
 {
 public:
 public:
@@ -34,7 +36,7 @@ public:
   // Description:
   // Description:
   // During a CMake run, an error handle should add errors
   // During a CMake run, an error handle should add errors
   // to be displayed afterwards.
   // to be displayed afterwards.
-  virtual void AddError(const char*, const char*) {}
+  virtual void AddError(const std::string&, const char*) {}
 
 
   // Description:
   // Description:
   // Turn debugging on. This will create ccmakelog.txt.
   // Turn debugging on. This will create ccmakelog.txt.

+ 2 - 3
Source/CursesDialog/cmCursesLongMessageForm.cxx

@@ -19,9 +19,8 @@ cmCursesLongMessageForm::cmCursesLongMessageForm(
   std::vector<std::string> const& messages, const char* title)
   std::vector<std::string> const& messages, const char* title)
 {
 {
   // Append all messages into on big string
   // Append all messages into on big string
-  std::vector<std::string>::const_iterator it;
-  for (it = messages.begin(); it != messages.end(); it++) {
-    this->Messages += (*it);
+  for (std::string const& message : messages) {
+    this->Messages += message;
     // Add one blank line after each message
     // Add one blank line after each message
     this->Messages += "\n\n";
     this->Messages += "\n\n";
   }
   }

部分文件因为文件数量过多而无法显示