[Cmake-commits] CMake branch, master, updated. v3.11.1-781-g18c7191

Kitware Robot kwrobot at kitware.com
Mon May 14 09:35:07 EDT 2018


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "CMake".

The branch, master has been updated
       via  18c71919ac16d82012d4ed2c240d592546bfc69c (commit)
       via  41653c6df67dcee3f1ee264dc67ed5204c86f5f1 (commit)
       via  a04ca510c1d79a52768a247af6f115aeb26e1837 (commit)
       via  ff13b0cdc2ac2db7f140aefb46feb6a31e4d6c96 (commit)
       via  322eab042948463c278b9ddec7f07f6ca84c5fe9 (commit)
       via  f739752ad6f2d661148faa3691189db9251d34b6 (commit)
       via  dd43e6fe895ab84206cab126699e7db7007cc688 (commit)
       via  43582cda573b1ec1ab1a971e7e4db63c45c8b7e4 (commit)
      from  653eb6ebdcd37b0f8178a1932f1fd00f7da581f1 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=18c71919ac16d82012d4ed2c240d592546bfc69c
commit 18c71919ac16d82012d4ed2c240d592546bfc69c
Merge: 41653c6 ff13b0c
Author:     Brad King <brad.king at kitware.com>
AuthorDate: Mon May 14 13:34:13 2018 +0000
Commit:     Kitware Robot <kwrobot at kitware.com>
CommitDate: Mon May 14 09:34:19 2018 -0400

    Merge topic 'xml-element-enhance'
    
    ff13b0cdc2 cmCTestLaunch: use cmXMLElement for XML generation
    
    Acked-by: Kitware Robot <kwrobot at kitware.com>
    Merge-request: !2057


https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=41653c6df67dcee3f1ee264dc67ed5204c86f5f1
commit 41653c6df67dcee3f1ee264dc67ed5204c86f5f1
Merge: a04ca51 322eab0
Author:     Brad King <brad.king at kitware.com>
AuthorDate: Mon May 14 13:33:01 2018 +0000
Commit:     Kitware Robot <kwrobot at kitware.com>
CommitDate: Mon May 14 09:33:06 2018 -0400

    Merge topic 'findjpeg_static_fix'
    
    322eab0429 FindJPEG: Add 'jpeg-static' to searched names
    
    Acked-by: Kitware Robot <kwrobot at kitware.com>
    Merge-request: !2059


https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=a04ca510c1d79a52768a247af6f115aeb26e1837
commit a04ca510c1d79a52768a247af6f115aeb26e1837
Merge: 653eb6e f739752
Author:     Brad King <brad.king at kitware.com>
AuthorDate: Mon May 14 13:31:50 2018 +0000
Commit:     Kitware Robot <kwrobot at kitware.com>
CommitDate: Mon May 14 09:32:04 2018 -0400

    Merge topic 'cpack-nuget'
    
    f739752ad6 CPack: Add NuGet support
    dd43e6fe89 Tests: Format `RunCPackVerifyResult.cmake` more consistently
    43582cda57 Tests: Fix comment for finding dpkg tool
    
    Acked-by: Kitware Robot <kwrobot at kitware.com>
    Merge-request: !1972


https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=ff13b0cdc2ac2db7f140aefb46feb6a31e4d6c96
commit ff13b0cdc2ac2db7f140aefb46feb6a31e4d6c96
Author:     Vitaly Stakhovsky <vvs31415 at gitlab.org>
AuthorDate: Wed May 9 12:34:36 2018 -0400
Commit:     Brad King <brad.king at kitware.com>
CommitDate: Fri May 11 11:33:13 2018 -0400

    cmCTestLaunch: use cmXMLElement for XML generation
    
    class `cmXMLElement` enhanced with more members; its use demonstrated

diff --git a/Source/CTest/cmCTestLaunch.cxx b/Source/CTest/cmCTestLaunch.cxx
index 30f76a9..e078645 100644
--- a/Source/CTest/cmCTestLaunch.cxx
+++ b/Source/CTest/cmCTestLaunch.cxx
@@ -347,28 +347,27 @@ void cmCTestLaunch::WriteXML()
   // Use cmGeneratedFileStream to atomically create the report file.
   cmGeneratedFileStream fxml(logXML.c_str());
   cmXMLWriter xml(fxml, 2);
-  xml.StartElement("Failure");
-  xml.Attribute("type", this->IsError() ? "Error" : "Warning");
-  this->WriteXMLAction(xml);
-  this->WriteXMLCommand(xml);
-  this->WriteXMLResult(xml);
-  this->WriteXMLLabels(xml);
-  xml.EndElement(); // Failure
+  cmXMLElement e2(xml, "Failure");
+  e2.Attribute("type", this->IsError() ? "Error" : "Warning");
+  this->WriteXMLAction(e2);
+  this->WriteXMLCommand(e2);
+  this->WriteXMLResult(e2);
+  this->WriteXMLLabels(e2);
 }
 
-void cmCTestLaunch::WriteXMLAction(cmXMLWriter& xml)
+void cmCTestLaunch::WriteXMLAction(cmXMLElement& e2)
 {
-  xml.Comment("Meta-information about the build action");
-  xml.StartElement("Action");
+  e2.Comment("Meta-information about the build action");
+  cmXMLElement e3(e2, "Action");
 
   // TargetName
   if (!this->OptionTargetName.empty()) {
-    xml.Element("TargetName", this->OptionTargetName);
+    e3.Element("TargetName", this->OptionTargetName);
   }
 
   // Language
   if (!this->OptionLanguage.empty()) {
-    xml.Element("Language", this->OptionLanguage);
+    e3.Element("Language", this->OptionLanguage);
   }
 
   // SourceFile
@@ -383,12 +382,12 @@ void cmCTestLaunch::WriteXMLAction(cmXMLWriter& xml)
       source = cmSystemTools::RelativePath(this->SourceDir, source);
     }
 
-    xml.Element("SourceFile", source);
+    e3.Element("SourceFile", source);
   }
 
   // OutputFile
   if (!this->OptionOutput.empty()) {
-    xml.Element("OutputFile", this->OptionOutput);
+    e3.Element("OutputFile", this->OptionOutput);
   }
 
   // OutputType
@@ -407,97 +406,88 @@ void cmCTestLaunch::WriteXMLAction(cmXMLWriter& xml)
     outputType = "object file";
   }
   if (outputType) {
-    xml.Element("OutputType", outputType);
+    e3.Element("OutputType", outputType);
   }
-
-  xml.EndElement(); // Action
 }
 
-void cmCTestLaunch::WriteXMLCommand(cmXMLWriter& xml)
+void cmCTestLaunch::WriteXMLCommand(cmXMLElement& e2)
 {
-  xml.Comment("Details of command");
-  xml.StartElement("Command");
+  e2.Comment("Details of command");
+  cmXMLElement e3(e2, "Command");
   if (!this->CWD.empty()) {
-    xml.Element("WorkingDirectory", this->CWD);
+    e3.Element("WorkingDirectory", this->CWD);
   }
   for (std::string const& realArg : this->RealArgs) {
-    xml.Element("Argument", realArg);
+    e3.Element("Argument", realArg);
   }
-  xml.EndElement(); // Command
 }
 
-void cmCTestLaunch::WriteXMLResult(cmXMLWriter& xml)
+void cmCTestLaunch::WriteXMLResult(cmXMLElement& e2)
 {
-  xml.Comment("Result of command");
-  xml.StartElement("Result");
+  e2.Comment("Result of command");
+  cmXMLElement e3(e2, "Result");
 
   // StdOut
-  xml.StartElement("StdOut");
-  this->DumpFileToXML(xml, this->LogOut);
-  xml.EndElement(); // StdOut
+  this->DumpFileToXML(e3, "StdOut", this->LogOut);
 
   // StdErr
-  xml.StartElement("StdErr");
-  this->DumpFileToXML(xml, this->LogErr);
-  xml.EndElement(); // StdErr
+  this->DumpFileToXML(e3, "StdErr", this->LogErr);
 
   // ExitCondition
-  xml.StartElement("ExitCondition");
+  cmXMLElement e4(e3, "ExitCondition");
   cmsysProcess* cp = this->Process;
   switch (cmsysProcess_GetState(cp)) {
     case cmsysProcess_State_Starting:
-      xml.Content("No process has been executed");
+      e4.Content("No process has been executed");
       break;
     case cmsysProcess_State_Executing:
-      xml.Content("The process is still executing");
+      e4.Content("The process is still executing");
       break;
     case cmsysProcess_State_Disowned:
-      xml.Content("Disowned");
+      e4.Content("Disowned");
       break;
     case cmsysProcess_State_Killed:
-      xml.Content("Killed by parent");
+      e4.Content("Killed by parent");
       break;
 
     case cmsysProcess_State_Expired:
-      xml.Content("Killed when timeout expired");
+      e4.Content("Killed when timeout expired");
       break;
     case cmsysProcess_State_Exited:
-      xml.Content(this->ExitCode);
+      e4.Content(this->ExitCode);
       break;
     case cmsysProcess_State_Exception:
-      xml.Content("Terminated abnormally: ");
-      xml.Content(cmsysProcess_GetExceptionString(cp));
+      e4.Content("Terminated abnormally: ");
+      e4.Content(cmsysProcess_GetExceptionString(cp));
       break;
     case cmsysProcess_State_Error:
-      xml.Content("Error administrating child process: ");
-      xml.Content(cmsysProcess_GetErrorString(cp));
+      e4.Content("Error administrating child process: ");
+      e4.Content(cmsysProcess_GetErrorString(cp));
       break;
-  };
-  xml.EndElement(); // ExitCondition
-
-  xml.EndElement(); // Result
+  }
 }
 
-void cmCTestLaunch::WriteXMLLabels(cmXMLWriter& xml)
+void cmCTestLaunch::WriteXMLLabels(cmXMLElement& e2)
 {
   this->LoadLabels();
   if (!this->Labels.empty()) {
-    xml.Comment("Interested parties");
-    xml.StartElement("Labels");
+    e2.Comment("Interested parties");
+    cmXMLElement e3(e2, "Labels");
     for (std::string const& label : this->Labels) {
-      xml.Element("Label", label);
+      e3.Element("Label", label);
     }
-    xml.EndElement(); // Labels
   }
 }
 
-void cmCTestLaunch::DumpFileToXML(cmXMLWriter& xml, std::string const& fname)
+void cmCTestLaunch::DumpFileToXML(cmXMLElement& e3, const char* tag,
+                                  std::string const& fname)
 {
   cmsys::ifstream fin(fname.c_str(), std::ios::in | std::ios::binary);
 
   std::string line;
   const char* sep = "";
 
+  cmXMLElement e4(e3, tag);
   while (cmSystemTools::GetLineFromStream(fin, line)) {
     if (MatchesFilterPrefix(line)) {
       continue;
@@ -507,8 +497,8 @@ void cmCTestLaunch::DumpFileToXML(cmXMLWriter& xml, std::string const& fname)
     } else if (this->Match(line, this->RegexWarning)) {
       line = "[CTest: warning matched] " + line;
     }
-    xml.Content(sep);
-    xml.Content(line);
+    e4.Content(sep);
+    e4.Content(line);
     sep = "\n";
   }
 }
diff --git a/Source/CTest/cmCTestLaunch.h b/Source/CTest/cmCTestLaunch.h
index 29986ff..debbe59 100644
--- a/Source/CTest/cmCTestLaunch.h
+++ b/Source/CTest/cmCTestLaunch.h
@@ -10,7 +10,7 @@
 #include <string>
 #include <vector>
 
-class cmXMLWriter;
+class cmXMLElement;
 
 /** \class cmCTestLaunch
  * \brief Launcher for make rules to report results for ctest
@@ -89,11 +89,11 @@ private:
 
   // Methods to generate the xml fragment.
   void WriteXML();
-  void WriteXMLAction(cmXMLWriter& xml);
-  void WriteXMLCommand(cmXMLWriter& xml);
-  void WriteXMLResult(cmXMLWriter& xml);
-  void WriteXMLLabels(cmXMLWriter& xml);
-  void DumpFileToXML(cmXMLWriter& xml, std::string const& fname);
+  void WriteXMLAction(cmXMLElement&);
+  void WriteXMLCommand(cmXMLElement&);
+  void WriteXMLResult(cmXMLElement&);
+  void WriteXMLLabels(cmXMLElement&);
+  void DumpFileToXML(cmXMLElement&, const char* tag, std::string const& fname);
 
   // Configuration
   void LoadConfig();
diff --git a/Source/cmXMLWriter.h b/Source/cmXMLWriter.h
index ff0df18..d124907 100644
--- a/Source/cmXMLWriter.h
+++ b/Source/cmXMLWriter.h
@@ -181,6 +181,12 @@ public:
   {
     xmlwr.Content(content);
   }
+  template <typename T>
+  void Element(std::string const& name, T const& value)
+  {
+    xmlwr.Element(name, value);
+  }
+  void Comment(const char* comment) { xmlwr.Comment(comment); }
 
 private:
   cmXMLWriter& xmlwr;

https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=322eab042948463c278b9ddec7f07f6ca84c5fe9
commit 322eab042948463c278b9ddec7f07f6ca84c5fe9
Author:     Michael Hofmann <kmhofmann at gmail.com>
AuthorDate: Thu May 10 11:25:15 2018 -0400
Commit:     Brad King <brad.king at kitware.com>
CommitDate: Fri May 11 09:57:52 2018 -0400

    FindJPEG: Add 'jpeg-static' to searched names
    
    A statically built libjpeg-turbo library will have a '-static' suffix;
    see the jpeg-static CMake target here:
    
        https://github.com/libjpeg-turbo/libjpeg-turbo/blob/1.5.3/CMakeLists.txt#L936
    
    On Windows the resulting .lib file is called 'jpeg-static.lib'.
    Consider this name while searching.

diff --git a/Modules/FindJPEG.cmake b/Modules/FindJPEG.cmake
index 9542f69..61a2213 100644
--- a/Modules/FindJPEG.cmake
+++ b/Modules/FindJPEG.cmake
@@ -51,7 +51,7 @@
 
 find_path(JPEG_INCLUDE_DIR jpeglib.h)
 
-set(jpeg_names ${JPEG_NAMES} jpeg libjpeg)
+set(jpeg_names ${JPEG_NAMES} jpeg jpeg-static libjpeg libjpeg-static)
 foreach(name ${JPEG_NAMES})
   list(APPEND jpeg_names_debug "${name}d")
 endforeach()

https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=f739752ad6f2d661148faa3691189db9251d34b6
commit f739752ad6f2d661148faa3691189db9251d34b6
Author:     Alex Turbov <i.zaufi at gmail.com>
AuthorDate: Mon May 7 23:47:28 2018 +0300
Commit:     Brad King <brad.king at kitware.com>
CommitDate: Fri May 11 09:28:44 2018 -0400

    CPack: Add NuGet support
    
    Create a CPack generator that uses `nuget.exe` to create packages:
    
        https://docs.microsoft.com/en-us/nuget/what-is-nuget
    
    NuGet packages could be easily produced from a `*.nuspec` file (running
    `nuget pack` in the directory w/ the spec file).  The spec filename does
    not affect the result `*.nupkg` name -- only `id` and `version` elements
    of the spec are used (by NuGet).
    
    Some implementation details:
    
    * Minimize C++ code -- use CMake script do to the job. It just let the
      base class (`cmCPackGenerator`) to preinstall everything to a temp
      directory, render the spec file and run `nuget pack` in it, harvesting
      `*.nupkg` files...;
    
    * Ignore package name (and use default paths) prepared by the base class
      (only `CPACK_TEMPORARY_DIRECTORY` is important) -- final package
      filename is a responsibility of NuGet, so after generation just scan the
      temp directory for the result `*.nupkg` file(s) and update
      `packageFileNames` data-member of the generator;
    
    * The generator supports _all-in-one_ (default), _one-group-per-package_
      and _one-component-per-package_ modes.

diff --git a/Help/manual/cmake-modules.7.rst b/Help/manual/cmake-modules.7.rst
index 070c6ed..3bfaa54 100644
--- a/Help/manual/cmake-modules.7.rst
+++ b/Help/manual/cmake-modules.7.rst
@@ -64,6 +64,7 @@ All Modules
    /module/CPackIFW
    /module/CPackIFWConfigureFile
    /module/CPackNSIS
+   /module/CPackNuGet
    /module/CPackPackageMaker
    /module/CPackProductBuild
    /module/CPackRPM
diff --git a/Help/module/CPackNuGet.rst b/Help/module/CPackNuGet.rst
new file mode 100644
index 0000000..a4cbb59
--- /dev/null
+++ b/Help/module/CPackNuGet.rst
@@ -0,0 +1 @@
+.. cmake-module:: ../../Modules/CPackNuGet.cmake
diff --git a/Help/release/dev/cpack-nuget.rst b/Help/release/dev/cpack-nuget.rst
new file mode 100644
index 0000000..03cb101
--- /dev/null
+++ b/Help/release/dev/cpack-nuget.rst
@@ -0,0 +1,7 @@
+cpack-nuget
+-----------
+
+* :manual:`cpack(1)` gained basic support for `NuGet`_.
+  See the :module:`CPackNuGet` module.
+
+.. _NuGet: https://docs.microsoft.com/en-us/nuget/what-is-nuget
diff --git a/Modules/CPack.NuGet.nuspec.in b/Modules/CPack.NuGet.nuspec.in
new file mode 100644
index 0000000..b7beb5d
--- /dev/null
+++ b/Modules/CPack.NuGet.nuspec.in
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
+    <metadata>
+        <!-- Required elements-->
+        <id>@CPACK_NUGET_PACKAGE_NAME@</id>
+        <version>@CPACK_NUGET_PACKAGE_VERSION@</version>
+        <description>@CPACK_NUGET_PACKAGE_DESCRIPTION@</description>
+        <authors>@CPACK_NUGET_PACKAGE_AUTHORS@</authors>
+
+        <!-- Optional elements -->
+        @_CPACK_NUGET_TITLE_TAG@
+        @_CPACK_NUGET_OWNERS_TAG@
+        @_CPACK_NUGET_PROJECTURL_TAG@
+        @_CPACK_NUGET_LICENSEURL_TAG@
+        @_CPACK_NUGET_ICONURL_TAG@
+        @_CPACK_NUGET_REQUIRELICENSEACCEPTANCE_TAG@
+        @_CPACK_NUGET_SUMMARY_TAG@
+        @_CPACK_NUGET_RELEASENOTES_TAG@
+        @_CPACK_NUGET_COPYRIGHT_TAG@
+        @_CPACK_NUGET_TAGS_TAG@
+        @_CPACK_NUGET_DEPENDENCIES_TAG@
+    </metadata>
+    @_CPACK_NUGET_FILES_TAG@
+</package>
diff --git a/Modules/CPack.cmake b/Modules/CPack.cmake
index 05fb78a..8070869 100644
--- a/Modules/CPack.cmake
+++ b/Modules/CPack.cmake
@@ -544,10 +544,11 @@ if(NOT CPACK_GENERATOR)
       option(CPACK_BINARY_TXZ  "Enable to build TXZ packages"     OFF)
     endif()
   else()
-    option(CPACK_BINARY_7Z   "Enable to build 7-Zip packages" OFF)
-    option(CPACK_BINARY_NSIS "Enable to build NSIS packages" ON)
-    option(CPACK_BINARY_WIX  "Enable to build WiX packages" OFF)
-    option(CPACK_BINARY_ZIP  "Enable to build ZIP packages" OFF)
+    option(CPACK_BINARY_7Z    "Enable to build 7-Zip packages" OFF)
+    option(CPACK_BINARY_NSIS  "Enable to build NSIS packages" ON)
+    option(CPACK_BINARY_NUGET "Enable to build NuGet packages" OFF)
+    option(CPACK_BINARY_WIX   "Enable to build WiX packages" OFF)
+    option(CPACK_BINARY_ZIP   "Enable to build ZIP packages" OFF)
   endif()
   option(CPACK_BINARY_IFW "Enable to build IFW packages" OFF)
 
@@ -559,6 +560,7 @@ if(NOT CPACK_GENERATOR)
   cpack_optional_append(CPACK_GENERATOR  CPACK_BINARY_FREEBSD      FREEBSD)
   cpack_optional_append(CPACK_GENERATOR  CPACK_BINARY_IFW          IFW)
   cpack_optional_append(CPACK_GENERATOR  CPACK_BINARY_NSIS         NSIS)
+  cpack_optional_append(CPACK_GENERATOR  CPACK_BINARY_NUGET        NuGet)
   cpack_optional_append(CPACK_GENERATOR  CPACK_BINARY_OSXX11       OSXX11)
   cpack_optional_append(CPACK_GENERATOR  CPACK_BINARY_PACKAGEMAKER PackageMaker)
   cpack_optional_append(CPACK_GENERATOR  CPACK_BINARY_PRODUCTBUILD productbuild)
@@ -611,6 +613,7 @@ mark_as_advanced(
   CPACK_BINARY_FREEBSD
   CPACK_BINARY_IFW
   CPACK_BINARY_NSIS
+  CPACK_BINARY_NUGET
   CPACK_BINARY_OSXX11
   CPACK_BINARY_PACKAGEMAKER
   CPACK_BINARY_PRODUCTBUILD
diff --git a/Modules/CPackNuGet.cmake b/Modules/CPackNuGet.cmake
new file mode 100644
index 0000000..29d4296
--- /dev/null
+++ b/Modules/CPackNuGet.cmake
@@ -0,0 +1,556 @@
+# Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
+# file Copyright.txt or https://cmake.org/licensing for details.
+
+#[=======================================================================[.rst:
+CPackNuGet
+----------
+
+When build a NuGet pacakge there is no direct way to control an output
+filename due a lack of the corresponding CLI option of NuGet, so there
+is no ``CPACK_NUGET_PACKAGE_FILENAME`` variable. To form the output filename
+NuGet uses the package name and the version according to its built-in rules.
+
+Also, be aware that including a top level directory
+(``CPACK_INCLUDE_TOPLEVEL_DIRECTORY``) is ignored by this generator.
+
+
+Variables specific to CPack NuGet generator
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+CPackNuGet may be used to create NuGet packages using :module:`CPack`.
+CPackNuGet is a :module:`CPack` generator thus it uses the ``CPACK_XXX``
+variables used by :module:`CPack`.
+
+CPackNuGet has specific features which are controlled by the specifics
+:code:`CPACK_NUGET_XXX` variables. In the "one per group" mode
+(see :variable:`CPACK_COMPONENTS_GROUPING`), ``<compName>`` placeholder
+in the variables below would contain a group name (uppercased and turned into
+a "C" identifier).
+
+List of CPackNuGet specific variables:
+
+.. variable:: CPACK_NUGET_COMPONENT_INSTALL
+
+ Enable component packaging for CPackNuGet
+
+ * Mandatory : NO
+ * Default   : OFF
+
+.. variable:: CPACK_NUGET_PACKAGE_NAME
+              CPACK_NUGET_<compName>_PACKAGE_NAME
+
+ The NUGET package name.
+
+ * Mandatory : YES
+ * Default   : :variable:`CPACK_PACKAGE_NAME`
+
+.. variable:: CPACK_NUGET_PACKAGE_VERSION
+              CPACK_NUGET_<compName>_PACKAGE_VERSION
+
+ The NuGet package version.
+
+ * Mandatory : YES
+ * Default   : :variable:`CPACK_PACKAGE_VERSION`
+
+.. variable:: CPACK_NUGET_PACKAGE_DESCRIPTION
+              CPACK_NUGET_<compName>_PACKAGE_DESCRIPTION
+
+ A long description of the package for UI display.
+
+ * Mandatory : YES
+ * Default   :
+    - :variable:`CPACK_COMPONENT_<compName>_DESCRIPTION`,
+    - ``CPACK_COMPONENT_GROUP_<groupName>_DESCRIPTION``,
+    - :variable:`CPACK_PACKAGE_DESCRIPTION`
+
+ .. variable:: CPACK_NUGET_PACKAGE_AUTHORS
+               CPACK_NUGET_<compName>_PACKAGE_AUTHORS
+
+ A comma-separated list of packages authors, matching the profile names
+ on nuget.org_. These are displayed in the NuGet Gallery on
+ nuget.org_ and are used to cross-reference packages by the same
+ authors.
+
+ * Mandatory : YES
+ * Default   : :variable:`CPACK_PACKAGE_VENDOR`
+
+.. variable:: CPACK_NUGET_PACKAGE_TITLE
+              CPACK_NUGET_<compName>_PACKAGE_TITLE
+
+ A human-friendly title of the package, typically used in UI displays
+ as on nuget.org_ and the Package Manager in Visual Studio. If not
+ specified, the package ID is used.
+
+ * Mandatory : NO
+ * Default   :
+    - :variable:`CPACK_COMPONENT_<compName>_DISPLAY_NAME`,
+    - ``CPACK_COMPONENT_GROUP_<groupName>_DISPLAY_NAME``
+
+.. variable:: CPACK_NUGET_PACKAGE_OWNERS
+              CPACK_NUGET_<compName>_PACKAGE_OWNERS
+
+ A comma-separated list of the package creators using profile names
+ on nuget.org_. This is often the same list as in authors,
+ and is ignored when uploading the package to nuget.org_.
+
+ * Mandatory : NO
+ * Default   : -
+
+.. variable:: CPACK_NUGET_PACKAGE_HOMEPAGE_URL
+              CPACK_NUGET_<compName>_PACKAGE_HOMEPAGE_URL
+
+ A URL for the package's home page, often shown in UI displays as well
+ as nuget.org_.
+
+ * Mandatory : NO
+ * Default   : :variable:`CPACK_PACKAGE_HOMEPAGE_URL`
+
+.. variable:: CPACK_NUGET_PACKAGE_LICENSEURL
+              CPACK_NUGET_<compName>_PACKAGE_LICENSEURL
+
+ A URL for the package's license, often shown in UI displays as well
+ as nuget.org_.
+
+ * Mandatory : NO
+ * Default   : -
+
+.. variable:: CPACK_NUGET_PACKAGE_ICONURL
+              CPACK_NUGET_<compName>_PACKAGE_ICONURL
+
+ A URL for a 64x64 image with transparency background to use as the
+ icon for the package in UI display.
+
+ * Mandatory : NO
+ * Default   : -
+
+.. variable:: CPACK_NUGET_PACKAGE_DESCRIPTION_SUMMARY
+              CPACK_NUGET_<compName>_PACKAGE_DESCRIPTION_SUMMARY
+
+ A short description of the package for UI display. If omitted, a
+ truncated version of description is used.
+
+ * Mandatory : NO
+ * Default   : :variable:`CPACK_PACKAGE_DESCRIPTION_SUMMARY`
+
+.. variable:: CPACK_NUGET_PACKAGE_RELEASE_NOTES
+              CPACK_NUGET_<compName>_PACKAGE_RELEASE_NOTES
+
+ A description of the changes made in this release of the package,
+ often used in UI like the Updates tab of the Visual Studio Package
+ Manager in place of the package description.
+
+ * Mandatory : NO
+ * Default   : -
+
+.. variable:: CPACK_NUGET_PACKAGE_COPYRIGHT
+              CPACK_NUGET_<compName>_PACKAGE_COPYRIGHT
+
+ Copyright details for the package.
+
+ * Mandatory : NO
+ * Default   : -
+
+.. variable:: CPACK_NUGET_PACKAGE_TAGS
+              CPACK_NUGET_<compName>_PACKAGE_TAGS
+
+ A space-delimited list of tags and keywords that describe the
+ package and aid discoverability of packages through search and
+ filtering.
+
+ * Mandatory : NO
+ * Default   : -
+
+.. variable:: CPACK_NUGET_PACKAGE_DEPENDENCIES
+              CPACK_NUGET_<compName>_PACKAGE_DEPENDENCIES
+
+ A list of package dependencies.
+
+ * Mandatory : NO
+ * Default   : -
+
+.. variable:: CPACK_NUGET_PACKAGE_DEPENDENCIES_<dependency>_VERSION
+              CPACK_NUGET_<compName>_PACKAGE_DEPENDENCIES_<dependency>_VERSION
+
+ A `version specification`_ for the particular dependency, where
+ ``<dependency>`` is an item of the dependency list (see above)
+ transformed with ``MAKE_C_IDENTIFIER`` function of :command:`string`
+ command.
+
+ * Mandatory : NO
+ * Default   : -
+
+.. variable:: CPACK_NUGET_PACKAGE_DEBUG
+
+ Enable debug messages while executing ``CPackNuGet.cmake``.
+
+ * Mandatory : NO
+ * Default   : OFF
+
+
+.. _nuget.org: http://nuget.org
+.. _version specification: https://docs.microsoft.com/en-us/nuget/reference/package-versioning#version-ranges-and-wildcards
+
+.. NuGet spec docs https://docs.microsoft.com/en-us/nuget/reference/nuspec
+
+#]=======================================================================]
+
+# Author: Alex Turbov
+
+if(CMAKE_BINARY_DIR)
+  message(FATAL_ERROR "CPackNuGet.cmake may only be used by CPack internally.")
+endif()
+
+function(_cpack_nuget_debug)
+    if(CPACK_NUGET_PACKAGE_DEBUG)
+        message("CPackNuGet:Debug: " ${ARGN})
+    endif()
+endfunction()
+
+function(_cpack_nuget_debug_var NAME)
+    if(CPACK_NUGET_PACKAGE_DEBUG)
+        message("CPackNuGet:Debug: ${NAME}=`${${NAME}}`")
+    endif()
+endfunction()
+
+function(_cpack_nuget_variable_fallback OUTPUT_VAR_NAME NUGET_VAR_NAME)
+    if(ARGN)
+        list(JOIN ARGN "`, `" _va_args)
+        set(_va_args ", ARGN: `${_va_args}`")
+    endif()
+    _cpack_nuget_debug(
+        "_cpack_nuget_variable_fallback: "
+        "OUTPUT_VAR_NAME=`${OUTPUT_VAR_NAME}`, "
+        "NUGET_VAR_NAME=`${NUGET_VAR_NAME}`"
+        "${_va_args}"
+      )
+
+    set(_options USE_CDATA)
+    set(_one_value_args LIST_GLUE)
+    set(_multi_value_args FALLBACK_VARS)
+    cmake_parse_arguments(PARSE_ARGV 0 _args "${_options}" "${_one_value_args}" "${_multi_value_args}")
+
+    if(CPACK_NUGET_PACKAGE_COMPONENT)
+        string(
+            TOUPPER "${CPACK_NUGET_PACKAGE_COMPONENT}"
+            CPACK_NUGET_PACKAGE_COMPONENT_UPPER
+          )
+    endif()
+
+    if(CPACK_NUGET_PACKAGE_COMPONENT
+      AND CPACK_NUGET_${CPACK_NUGET_PACKAGE_COMPONENT}_PACKAGE_${NUGET_VAR_NAME}
+      )
+        set(
+            _result
+            "${CPACK_NUGET_${CPACK_NUGET_PACKAGE_COMPONENT}_PACKAGE_${NUGET_VAR_NAME}}"
+          )
+        _cpack_nuget_debug(
+            "  CPACK_NUGET_${CPACK_NUGET_PACKAGE_COMPONENT}_PACKAGE_${NUGET_VAR_NAME}: "
+            "OUTPUT_VAR_NAME->${OUTPUT_VAR_NAME}=`${_result}`"
+          )
+
+    elseif(CPACK_NUGET_PACKAGE_COMPONENT_UPPER
+      AND CPACK_NUGET_${CPACK_NUGET_PACKAGE_COMPONENT_UPPER}_PACKAGE_${NUGET_VAR_NAME}
+      )
+        set(
+            _result
+            "${CPACK_NUGET_${CPACK_NUGET_PACKAGE_COMPONENT_UPPER}_PACKAGE_${NUGET_VAR_NAME}}"
+          )
+        _cpack_nuget_debug(
+            "  CPACK_NUGET_${CPACK_NUGET_PACKAGE_COMPONENT_UPPER}_PACKAGE_${NUGET_VAR_NAME}: "
+            "OUTPUT_VAR_NAME->${OUTPUT_VAR_NAME}=`${_result}`"
+          )
+
+    elseif(CPACK_NUGET_PACKAGE_${NUGET_VAR_NAME})
+        set(_result "${CPACK_NUGET_PACKAGE_${NUGET_VAR_NAME}}")
+        _cpack_nuget_debug(
+            "  CPACK_NUGET_PACKAGE_${NUGET_VAR_NAME}: "
+            "OUTPUT_VAR_NAME->${OUTPUT_VAR_NAME}=`${_result}`"
+          )
+
+    else()
+        foreach(_var IN LISTS _args_FALLBACK_VARS)
+            _cpack_nuget_debug("  Fallback: ${_var} ...")
+            if(${_var})
+                _cpack_nuget_debug("            ${_var}=`${${_var}}`")
+                set(_result "${${_var}}")
+                _cpack_nuget_debug(
+                    "  ${_var}: OUTPUT_VAR_NAME->${OUTPUT_VAR_NAME}=`${_result}`"
+                  )
+                break()
+            endif()
+        endforeach()
+    endif()
+
+    if(_result)
+        if(_args_USE_CDATA)
+            set(_value_before "<![CDATA[")
+            set(_value_after "]]>")
+        endif()
+
+        list(LENGTH _result _result_len)
+        if(_result_len GREATER 1 AND _args_LIST_GLUE)
+            list(JOIN _result "${_args_LIST_GLUE}" _result)
+        endif()
+
+        set(${OUTPUT_VAR_NAME} "${_value_before}${_result}${_value_after}" PARENT_SCOPE)
+    endif()
+
+endfunction()
+
+function(_cpack_nuget_variable_fallback_and_wrap_into_element ELEMENT NUGET_VAR_NAME)
+    set(_options)
+    set(_one_value_args)
+    set(_multi_value_args FALLBACK_VARS)
+    cmake_parse_arguments(PARSE_ARGV 0 _args "${_options}" "${_one_value_args}" "${_multi_value_args}")
+
+    _cpack_nuget_variable_fallback(_value ${NUGET_VAR_NAME} ${ARGN} USE_CDATA)
+
+    if(_value)
+        string(TOUPPER "${ELEMENT}" _ELEMENT_UP)
+        set(
+            _CPACK_NUGET_${_ELEMENT_UP}_TAG
+            "<${ELEMENT}>${_value}</${ELEMENT}>"
+            PARENT_SCOPE
+          )
+    endif()
+endfunction()
+
+# Print some debug info
+_cpack_nuget_debug("---[CPack NuGet Input Variables]---")
+_cpack_nuget_debug_var(CPACK_PACKAGE_NAME)
+_cpack_nuget_debug_var(CPACK_PACKAGE_VERSION)
+_cpack_nuget_debug_var(CPACK_TOPLEVEL_TAG)
+_cpack_nuget_debug_var(CPACK_TOPLEVEL_DIRECTORY)
+_cpack_nuget_debug_var(CPACK_TEMPORARY_DIRECTORY)
+_cpack_nuget_debug_var(CPACK_NUGET_GROUPS)
+if(CPACK_NUGET_GROUPS)
+    foreach(_group IN LISTS CPACK_NUGET_GROUPS)
+        string(MAKE_C_IDENTIFIER "${_group}" _group_up)
+        string(TOUPPER "${_group_up}" _group_up)
+        _cpack_nuget_debug_var(CPACK_NUGET_${_group_up}_GROUP_COMPONENTS)
+    endforeach()
+endif()
+_cpack_nuget_debug_var(CPACK_NUGET_COMPONENTS)
+_cpack_nuget_debug_var(CPACK_NUGET_ALL_IN_ONE)
+_cpack_nuget_debug_var(CPACK_NUGET_ORDINAL_MONOLITIC)
+_cpack_nuget_debug("-----------------------------------")
+
+function(_cpack_nuget_render_spec)
+    # Make a variable w/ upper-cased component name
+    if(CPACK_NUGET_PACKAGE_COMPONENT)
+        string(TOUPPER "${CPACK_NUGET_PACKAGE_COMPONENT}" CPACK_NUGET_PACKAGE_COMPONENT_UPPER)
+    endif()
+
+    # Set mandatory variables (not wrapped into XML elements)
+    # https://docs.microsoft.com/en-us/nuget/reference/nuspec#required-metadata-elements
+    if(CPACK_NUGET_PACKAGE_COMPONENT)
+        if(CPACK_NUGET_${CPACK_NUGET_PACKAGE_COMPONENT_UPPER}_PACKAGE_NAME)
+            set(
+                CPACK_NUGET_PACKAGE_NAME
+                "${CPACK_NUGET_${CPACK_NUGET_PACKAGE_COMPONENT_UPPER}_PACKAGE_NAME}"
+              )
+        elseif(NOT CPACK_NUGET_PACKAGE_COMPONENT STREQUAL "Unspecified")
+            set(
+                CPACK_NUGET_PACKAGE_NAME
+                "${CPACK_PACKAGE_NAME}.${CPACK_NUGET_PACKAGE_COMPONENT}"
+              )
+        else()
+            set(CPACK_NUGET_PACKAGE_NAME "${CPACK_PACKAGE_NAME}")
+        endif()
+    elseif(NOT CPACK_NUGET_PACKAGE_NAME)
+        set(CPACK_NUGET_PACKAGE_NAME "${CPACK_PACKAGE_NAME}")
+    endif()
+
+    _cpack_nuget_variable_fallback(
+        CPACK_NUGET_PACKAGE_VERSION VERSION
+        FALLBACK_VARS
+            CPACK_PACKAGE_VERSION
+      )
+    _cpack_nuget_variable_fallback(
+        CPACK_NUGET_PACKAGE_DESCRIPTION DESCRIPTION
+        FALLBACK_VARS
+            CPACK_COMPONENT_${CPACK_NUGET_PACKAGE_COMPONENT}_DESCRIPTION
+            CPACK_COMPONENT_${CPACK_NUGET_PACKAGE_COMPONENT_UPPER}_DESCRIPTION
+            CPACK_COMPONENT_GROUP_${CPACK_NUGET_PACKAGE_COMPONENT_UPPER}_DESCRIPTION
+            CPACK_PACKAGE_DESCRIPTION
+        USE_CDATA
+      )
+    _cpack_nuget_variable_fallback(
+        CPACK_NUGET_PACKAGE_AUTHORS AUTHORS
+        FALLBACK_VARS
+            CPACK_PACKAGE_VENDOR
+        USE_CDATA
+        LIST_GLUE ","
+      )
+
+    # Set optional variables (wrapped into XML elements)
+    # https://docs.microsoft.com/en-us/nuget/reference/nuspec#optional-metadata-elements
+    _cpack_nuget_variable_fallback_and_wrap_into_element(
+        title
+        TITLE
+        FALLBACK_VARS
+            CPACK_COMPONENT_${CPACK_NUGET_PACKAGE_COMPONENT}_DISPLAY_NAME
+            CPACK_COMPONENT_${CPACK_NUGET_PACKAGE_COMPONENT_UPPER}_DISPLAY_NAME
+            CPACK_COMPONENT_GROUP_${CPACK_NUGET_PACKAGE_COMPONENT_UPPER}_DISPLAY_NAME
+      )
+    _cpack_nuget_variable_fallback_and_wrap_into_element(owners OWNERS LIST_GLUE ",")
+    _cpack_nuget_variable_fallback_and_wrap_into_element(
+        projectUrl
+        HOMEPAGE_URL
+        FALLBACK_VARS
+            CPACK_PACKAGE_HOMEPAGE_URL
+      )
+    _cpack_nuget_variable_fallback_and_wrap_into_element(licenseUrl LICENSEURL)
+    _cpack_nuget_variable_fallback_and_wrap_into_element(iconUrl ICONURL)
+    _cpack_nuget_variable_fallback_and_wrap_into_element(
+        summary DESCRIPTION_SUMMARY
+        FALLBACK_VARS
+            CPACK_PACKAGE_DESCRIPTION_SUMMARY
+      )
+    if(CPACK_NUGET_PACKAGE_REQUIRE_LICENSE_ACCEPTANCE)
+        set(
+            _CPACK_NUGET_REQUIRELICENSEACCEPTANCE_TAG
+            "<requireLicenseAcceptance>true</requireLicenseAcceptance>"
+          )
+    endif()
+    _cpack_nuget_variable_fallback_and_wrap_into_element(releaseNotes RELEASE_NOTES)
+    _cpack_nuget_variable_fallback_and_wrap_into_element(copyright COPYRIGHT)
+    _cpack_nuget_variable_fallback_and_wrap_into_element(tags TAGS LIST_GLUE " ")
+
+    # Handle dependencies
+    _cpack_nuget_variable_fallback(_deps DEPENDENCIES)
+    set(_collected_deps)
+    foreach(_dep IN LISTS _deps)
+        _cpack_nuget_debug("  checking dependency `${_dep}`")
+
+        string(MAKE_C_IDENTIFIER "${_dep}" _dep_id)
+
+        _cpack_nuget_variable_fallback(_ver DEPENDENCIES_${_dep_id}_VERSION)
+
+        if(NOT _ver)
+            string(TOUPPER "${_dep_id}" _dep_id)
+            _cpack_nuget_variable_fallback(_ver DEPENDENCIES_${_dep_id}_VERSION)
+        endif()
+
+        if(_ver)
+            _cpack_nuget_debug("  got `${_dep}` dependency version ${_ver}")
+            list(APPEND _collected_deps "<dependency id=\"${_dep}\" version=\"${_ver}\" />")
+        endif()
+    endforeach()
+
+    # Render deps into the variable
+    if(_collected_deps)
+        set(_CPACK_NUGET_DEPENDENCIES_TAG "<dependencies>\n")
+        foreach(_line IN LISTS _collected_deps)
+            string(
+                APPEND _CPACK_NUGET_DEPENDENCIES_TAG
+                "            ${_line}\n"
+              )
+        endforeach()
+        string(APPEND _CPACK_NUGET_DEPENDENCIES_TAG "        </dependencies>")
+    endif()
+
+    # Render the spec file
+    # NOTE The spec filename doesn't matter. Being included into a package,
+    # NuGet will name it properly.
+    _cpack_nuget_debug("Rendering `${CPACK_TEMPORARY_DIRECTORY}/CPack.NuGet.nuspec` file...")
+    configure_file(
+        "${CMAKE_CURRENT_LIST_DIR}/CPack.NuGet.nuspec.in"
+        "${CPACK_TEMPORARY_DIRECTORY}/CPack.NuGet.nuspec"
+        @ONLY
+      )
+endfunction()
+
+function(_cpack_nuget_make_files_tag)
+    set(_files)
+    foreach(_comp IN LISTS ARGN)
+        string(APPEND _files "        <file src=\"${_comp}\\**\" target=\".\" />\n")
+    endforeach()
+    set(_CPACK_NUGET_FILES_TAG "<files>\n${_files}    </files>" PARENT_SCOPE)
+endfunction()
+
+find_program(NUGET_EXECUTABLE NuGet)
+_cpack_nuget_debug_var(NUGET_EXECUTABLE)
+if(NOT NUGET_EXECUTABLE)
+    message(FATAL_ERROR "NuGet executable not found")
+endif()
+
+# Add details for debug run
+if(CPACK_NUGET_PACKAGE_DEBUG)
+    list(APPEND CPACK_NUGET_PACK_ADDITIONAL_OPTIONS "-Verbosity" "detailed")
+endif()
+
+# Case one: ordinal all-in-one package
+if(CPACK_NUGET_ORDINAL_MONOLITIC)
+    # This variable `CPACK_NUGET_ALL_IN_ONE` set by C++ code:
+    # Meaning to pack all installed files into a single package
+    _cpack_nuget_debug("---[Making an ordinal monolitic package]---")
+    _cpack_nuget_render_spec()
+    execute_process(
+        COMMAND "${NUGET_EXECUTABLE}" pack ${CPACK_NUGET_PACK_ADDITIONAL_OPTIONS}
+        WORKING_DIRECTORY "${CPACK_TEMPORARY_DIRECTORY}"
+      )
+
+elseif(CPACK_NUGET_ALL_IN_ONE)
+    # This variable `CPACK_NUGET_ALL_IN_ONE` set by C++ code:
+    # Meaning to pack all installed components into a single package
+    _cpack_nuget_debug("---[Making a monolitic package from installed components]---")
+
+    # Prepare the `files` element which include files from several components
+    _cpack_nuget_make_files_tag(${CPACK_NUGET_COMPONENTS})
+    _cpack_nuget_render_spec()
+    execute_process(
+        COMMAND "${NUGET_EXECUTABLE}" pack ${CPACK_NUGET_PACK_ADDITIONAL_OPTIONS}
+        WORKING_DIRECTORY "${CPACK_TEMPORARY_DIRECTORY}"
+      )
+
+else()
+    # Is there any grouped component?
+    if(CPACK_NUGET_GROUPS)
+        _cpack_nuget_debug("---[Making grouped component(s) package(s)]---")
+        foreach(_group IN LISTS CPACK_NUGET_GROUPS)
+            _cpack_nuget_debug("Starting to make the pacakge for group `${_group}`")
+            string(MAKE_C_IDENTIFIER "${_group}" _group_up)
+            string(TOUPPER "${_group_up}" _group_up)
+
+            # Render a spec file which includes all components in the current group
+            unset(_CPACK_NUGET_FILES_TAG)
+            _cpack_nuget_make_files_tag(${CPACK_NUGET_${_group_up}_GROUP_COMPONENTS})
+            # Temporary set `CPACK_NUGET_PACKAGE_COMPONENT` to the group name
+            # to properly collect various per group settings
+            set(CPACK_NUGET_PACKAGE_COMPONENT ${_group})
+            _cpack_nuget_render_spec()
+            unset(CPACK_NUGET_PACKAGE_COMPONENT)
+            execute_process(
+                COMMAND "${NUGET_EXECUTABLE}" pack ${CPACK_NUGET_PACK_ADDITIONAL_OPTIONS}
+                WORKING_DIRECTORY "${CPACK_TEMPORARY_DIRECTORY}"
+              )
+        endforeach()
+    endif()
+    # Is there any single component package needed?
+    if(CPACK_NUGET_COMPONENTS)
+        _cpack_nuget_debug("---[Making single-component(s) package(s)]---")
+        foreach(_comp IN LISTS CPACK_NUGET_COMPONENTS)
+            _cpack_nuget_debug("Starting to make the pacakge for component `${_comp}`")
+            # Render a spec file which includes only given component
+            unset(_CPACK_NUGET_FILES_TAG)
+            _cpack_nuget_make_files_tag(${_comp})
+            # Temporary set `CPACK_NUGET_PACKAGE_COMPONENT` to the the current
+            # component name to properly collect various per group settings
+            set(CPACK_NUGET_PACKAGE_COMPONENT ${_comp})
+            _cpack_nuget_render_spec()
+            unset(CPACK_NUGET_PACKAGE_COMPONENT)
+            execute_process(
+                COMMAND "${NUGET_EXECUTABLE}" pack ${CPACK_NUGET_PACK_ADDITIONAL_OPTIONS}
+                WORKING_DIRECTORY "${CPACK_TEMPORARY_DIRECTORY}"
+              )
+        endforeach()
+    endif()
+endif()
+
+file(GLOB_RECURSE GEN_CPACK_OUTPUT_FILES "${CPACK_TEMPORARY_DIRECTORY}/*.nupkg")
+if(NOT GEN_CPACK_OUTPUT_FILES)
+    message(FATAL_ERROR "NuGet package was not generated at `${CPACK_TEMPORARY_DIRECTORY}`!")
+endif()
+
+_cpack_nuget_debug("Generated files: ${GEN_CPACK_OUTPUT_FILES}")
diff --git a/Source/CMakeLists.txt b/Source/CMakeLists.txt
index d9e07e5..316d50b 100644
--- a/Source/CMakeLists.txt
+++ b/Source/CMakeLists.txt
@@ -886,6 +886,7 @@ set(CPACK_SRCS
   CPack/cmCPackGenerator.cxx
   CPack/cmCPackLog.cxx
   CPack/cmCPackNSISGenerator.cxx
+  CPack/cmCPackNuGetGenerator.cxx
   CPack/cmCPackSTGZGenerator.cxx
   CPack/cmCPackTGZGenerator.cxx
   CPack/cmCPackTXZGenerator.cxx
diff --git a/Source/CPack/cmCPackGeneratorFactory.cxx b/Source/CPack/cmCPackGeneratorFactory.cxx
index 47e7527..a395a8f 100644
--- a/Source/CPack/cmCPackGeneratorFactory.cxx
+++ b/Source/CPack/cmCPackGeneratorFactory.cxx
@@ -15,6 +15,7 @@
 #include "cmCPackGenerator.h"
 #include "cmCPackLog.h"
 #include "cmCPackNSISGenerator.h"
+#include "cmCPackNuGetGenerator.h"
 #include "cmCPackSTGZGenerator.h"
 #include "cmCPackTGZGenerator.h"
 #include "cmCPackTXZGenerator.h"
@@ -105,6 +106,10 @@ cmCPackGeneratorFactory::cmCPackGeneratorFactory()
     this->RegisterGenerator("DEB", "Debian packages",
                             cmCPackDebGenerator::CreateGenerator);
   }
+  if (cmCPackNuGetGenerator::CanGenerate()) {
+    this->RegisterGenerator("NuGet", "NuGet packages",
+                            cmCPackNuGetGenerator::CreateGenerator);
+  }
 #ifdef __APPLE__
   if (cmCPackDragNDropGenerator::CanGenerate()) {
     this->RegisterGenerator("DragNDrop", "Mac OSX Drag And Drop",
diff --git a/Source/CPack/cmCPackNuGetGenerator.cxx b/Source/CPack/cmCPackNuGetGenerator.cxx
new file mode 100644
index 0000000..2ebfb3d
--- /dev/null
+++ b/Source/CPack/cmCPackNuGetGenerator.cxx
@@ -0,0 +1,140 @@
+/* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
+   file Copyright.txt or https://cmake.org/licensing for details.  */
+#include "cmCPackNuGetGenerator.h"
+
+#include "cmAlgorithms.h"
+#include "cmCPackComponentGroup.h"
+#include "cmCPackLog.h"
+#include "cmSystemTools.h"
+
+#include <algorithm>
+#include <iterator>
+#include <map>
+#include <ostream>
+#include <string>
+#include <utility>
+#include <vector>
+
+bool cmCPackNuGetGenerator::SupportsComponentInstallation() const
+{
+  return IsOn("CPACK_NUGET_COMPONENT_INSTALL");
+}
+
+int cmCPackNuGetGenerator::PackageFiles()
+{
+  cmCPackLogger(cmCPackLog::LOG_DEBUG, "Toplevel: " << toplevel << std::endl);
+
+  /* Reset package file name list it will be populated after the
+   * `CPackNuGet.cmake` run */
+  packageFileNames.clear();
+
+  /* Are we in the component packaging case */
+  if (WantsComponentInstallation()) {
+    if (componentPackageMethod == ONE_PACKAGE) {
+      // CASE 1 : COMPONENT ALL-IN-ONE package
+      // Meaning that all per-component pre-installed files
+      // goes into the single package.
+      this->SetOption("CPACK_NUGET_ALL_IN_ONE", "TRUE");
+      SetupGroupComponentVariables(true);
+    } else {
+      // CASE 2 : COMPONENT CLASSICAL package(s) (i.e. not all-in-one)
+      // There will be 1 package for each component group
+      // however one may require to ignore component group and
+      // in this case you'll get 1 package for each component.
+      SetupGroupComponentVariables(componentPackageMethod ==
+                                   ONE_PACKAGE_PER_COMPONENT);
+    }
+  } else {
+    // CASE 3 : NON COMPONENT package.
+    this->SetOption("CPACK_NUGET_ORDINAL_MONOLITIC", "TRUE");
+  }
+
+  auto retval = this->ReadListFile("CPackNuGet.cmake");
+  if (retval) {
+    AddGeneratedPackageNames();
+  } else {
+    cmCPackLogger(cmCPackLog::LOG_ERROR,
+                  "Error while execution CPackNuGet.cmake" << std::endl);
+  }
+
+  return retval;
+}
+
+void cmCPackNuGetGenerator::SetupGroupComponentVariables(bool ignoreGroup)
+{
+  // The default behavior is to have one package by component group
+  // unless CPACK_COMPONENTS_IGNORE_GROUP is specified.
+  if (!ignoreGroup) {
+    std::vector<std::string> groups;
+    for (auto const& compG : this->ComponentGroups) {
+      cmCPackLogger(cmCPackLog::LOG_VERBOSE,
+                    "Packaging component group: " << compG.first << std::endl);
+      groups.push_back(compG.first);
+      auto compGUp =
+        cmSystemTools::UpperCase(cmSystemTools::MakeCidentifier(compG.first));
+
+      // Collect components for this group
+      std::vector<std::string> components;
+      std::transform(begin(compG.second.Components),
+                     end(compG.second.Components),
+                     std::back_inserter(components),
+                     [](cmCPackComponent const* comp) { return comp->Name; });
+      this->SetOption("CPACK_NUGET_" + compGUp + "_GROUP_COMPONENTS",
+                      cmJoin(components, ";").c_str());
+    }
+    if (!groups.empty()) {
+      this->SetOption("CPACK_NUGET_GROUPS", cmJoin(groups, ";").c_str());
+    }
+
+    // Handle Orphan components (components not belonging to any groups)
+    std::vector<std::string> components;
+    for (auto const& comp : this->Components) {
+      // Does the component belong to a group?
+      if (comp.second.Group == nullptr) {
+        cmCPackLogger(
+          cmCPackLog::LOG_VERBOSE, "Component <"
+            << comp.second.Name
+            << "> does not belong to any group, package it separately."
+            << std::endl);
+        components.push_back(comp.first);
+      }
+    }
+    if (!components.empty()) {
+      this->SetOption("CPACK_NUGET_COMPONENTS",
+                      cmJoin(components, ";").c_str());
+    }
+
+  } else {
+    std::vector<std::string> components;
+    components.reserve(this->Components.size());
+    std::transform(begin(this->Components), end(this->Components),
+                   std::back_inserter(components),
+                   [](std::pair<std::string, cmCPackComponent> const& comp) {
+                     return comp.first;
+                   });
+    this->SetOption("CPACK_NUGET_COMPONENTS", cmJoin(components, ";").c_str());
+  }
+}
+
+void cmCPackNuGetGenerator::AddGeneratedPackageNames()
+{
+  const char* const files_list = this->GetOption("GEN_CPACK_OUTPUT_FILES");
+  if (!files_list) {
+    cmCPackLogger(
+      cmCPackLog::LOG_ERROR,
+      "Error while execution CPackNuGet.cmake: No NuGet package has generated"
+        << std::endl);
+    return;
+  }
+  // add the generated packages to package file names list
+  std::string fileNames{ files_list };
+  const char sep = ';';
+  std::string::size_type pos1 = 0;
+  std::string::size_type pos2 = fileNames.find(sep, pos1 + 1);
+  while (pos2 != std::string::npos) {
+    packageFileNames.push_back(fileNames.substr(pos1, pos2 - pos1));
+    pos1 = pos2 + 1;
+    pos2 = fileNames.find(sep, pos1 + 1);
+  }
+  packageFileNames.push_back(fileNames.substr(pos1, pos2 - pos1));
+}
diff --git a/Source/CPack/cmCPackNuGetGenerator.h b/Source/CPack/cmCPackNuGetGenerator.h
new file mode 100644
index 0000000..a59db2d
--- /dev/null
+++ b/Source/CPack/cmCPackNuGetGenerator.h
@@ -0,0 +1,37 @@
+/* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
+   file Copyright.txt or https://cmake.org/licensing for details.  */
+#ifndef cmCPackNuGetGenerator_h
+#define cmCPackNuGetGenerator_h
+
+#include "cmCPackGenerator.h"
+
+/** \class cmCPackNuGetGenerator
+ * \brief A generator for RPM packages
+ */
+class cmCPackNuGetGenerator : public cmCPackGenerator
+{
+public:
+  cmCPackTypeMacro(cmCPackNuGetGenerator, cmCPackGenerator);
+
+  // NOTE In fact, it is possible to have NuGet not only for Windows...
+  // https://docs.microsoft.com/en-us/nuget/install-nuget-client-tools
+  static bool CanGenerate() { return true; }
+
+protected:
+  bool SupportsComponentInstallation() const override;
+  int PackageFiles() override;
+
+  const char* GetOutputExtension() override { return ".nupkg"; }
+  bool SupportsAbsoluteDestination() const override { return false; }
+  /**
+   * The method used to prepare variables when component
+   * install is used.
+   */
+  void SetupGroupComponentVariables(bool ignoreGroup);
+  /**
+   * Populate \c packageFileNames vector of built packages.
+   */
+  void AddGeneratedPackageNames();
+};
+
+#endif
diff --git a/Tests/CMakeLists.txt b/Tests/CMakeLists.txt
index 6e3c3c4..fe8f2cc 100644
--- a/Tests/CMakeLists.txt
+++ b/Tests/CMakeLists.txt
@@ -154,6 +154,15 @@ if(BUILD_TESTING)
     set(CPACK_BINARY_DEB OFF)
   endif()
 
+  # Look for NuGet to use for tests.
+  find_program(NUGET_EXECUTABLE NAMES NuGet nuget)
+
+  if(NUGET_EXECUTABLE)
+    set(CPACK_BINARY_NUGET ON)
+  else()
+    set(CPACK_BINARY_NUGET OFF)
+  endif()
+
   #---------------------------------------------------------------------------
   # Add tests below here.
 
@@ -1032,6 +1041,12 @@ ${CMake_BINARY_DIR}/bin/cmake -DDIR=dev -P ${CMake_SOURCE_DIR}/Utilities/Release
     if(CPACK_BINARY_DEB)
       list(APPEND ACTIVE_CPACK_GENERATORS DEB)
     endif()
+    # Check whether if NuGet command is found
+    # before adding NuGet tests
+    if(CPACK_BINARY_NUGET)
+      list(APPEND ACTIVE_CPACK_GENERATORS NUGET)
+      set(CPACK_GENERATOR_STRING_NUGET NuGet)
+    endif()
 
     # ACTIVE_CPACK_GENERATORS variable
     # now contains the list of 'active generators'
@@ -1051,7 +1066,10 @@ ${CMake_BINARY_DIR}/bin/cmake -DDIR=dev -P ${CMake_SOURCE_DIR}/Utilities/Release
     list(APPEND CWAYLST "IgnoreGroup")
     list(APPEND CWAYLST "AllInOne")
     foreach(CPackGen IN LISTS ACTIVE_CPACK_GENERATORS)
-      set(CPackRun_CPackGen  "-DCPackGen=${CPackGen}")
+      if(NOT DEFINED CPACK_GENERATOR_STRING_${CPackGen})
+        set(CPACK_GENERATOR_STRING_${CPackGen} ${CPackGen})
+      endif()
+      set(CPackRun_CPackGen  "-DCPackGen=${CPACK_GENERATOR_STRING_${CPackGen}}")
       foreach(CPackComponentWay ${CWAYLST})
         set(CPackRun_CPackComponentWay "-DCPackComponentWay=${CPackComponentWay}")
         add_test(CPackComponentsForAll-${CPackGen}-${CPackComponentWay}
@@ -1062,7 +1080,7 @@ ${CMake_BINARY_DIR}/bin/cmake -DDIR=dev -P ${CMake_SOURCE_DIR}/Utilities/Release
           ${build_generator_args}
           --build-project CPackComponentsForAll
           --build-options ${build_options}
-             -DCPACK_GENERATOR:STRING=${CPackGen}
+             -DCPACK_GENERATOR:STRING=${CPACK_GENERATOR_STRING_${CPackGen}}
              -DCPACK_BINARY_${CPackGen}:BOOL=ON
              ${CPackRun_CPackComponentWay}
              ${CPackComponentsForAll_BUILD_OPTIONS}
diff --git a/Tests/CPackComponentsForAll/CMakeLists.txt b/Tests/CPackComponentsForAll/CMakeLists.txt
index 3440843..f2e4fcd 100644
--- a/Tests/CPackComponentsForAll/CMakeLists.txt
+++ b/Tests/CPackComponentsForAll/CMakeLists.txt
@@ -168,6 +168,18 @@ set(CPACK_RPM_RELOCATION_PATHS "${CMAKE_INSTALL_INCLUDEDIR}"
 # set CPACK_DEBIAN_FILE_NAME to use default package name format
 set(CPACK_DEBIAN_FILE_NAME "DEB-DEFAULT")
 
+# set some tags for NuGet packages
+# 1. all in one pacakge
+set(CPACK_NUGET_PACKAGE_TAGS "nuget" "unit" "test" "all-in-one")
+# 2. per component packages
+set(CPACK_NUGET_APPLICATIONS_PACKAGE_TAGS "nuget" "unit" "test" "applications")
+set(CPACK_NUGET_LIBRARIES_PACKAGE_TAGS "nuget" "unit" "test" "libraries")
+set(CPACK_NUGET_HEADERS_PACKAGE_TAGS "nuget" "unit" "test" "headers")
+set(CPACK_NUGET_UNSPECIFIED_PACKAGE_TAGS "nuget" "unit" "test" "uNsP3c1FiEd")
+# 3. per group packages
+set(CPACK_NUGET_RUNTIME_PACKAGE_TAGS "nuget" "unit" "test" "run-time")
+set(CPACK_NUGET_DEVELOPMENT_PACKAGE_TAGS "nuget" "unit" "test" "development")
+
 # We may use the CPack specific config file in order
 # to tailor CPack behavior on a CPack generator specific way
 # (Behavior would be different for RPM or TGZ or DEB ...)
diff --git a/Tests/CPackComponentsForAll/MyLibCPackConfig-AllInOne.cmake.in b/Tests/CPackComponentsForAll/MyLibCPackConfig-AllInOne.cmake.in
index 0bfbf14..1b9e658 100644
--- a/Tests/CPackComponentsForAll/MyLibCPackConfig-AllInOne.cmake.in
+++ b/Tests/CPackComponentsForAll/MyLibCPackConfig-AllInOne.cmake.in
@@ -13,6 +13,10 @@ if(CPACK_GENERATOR MATCHES "DEB")
    set(CPACK_DEB_COMPONENT_INSTALL "ON")
 endif()
 
+if(CPACK_GENERATOR MATCHES "NuGet")
+   set(CPACK_NUGET_COMPONENT_INSTALL "ON")
+endif()
+
 #
 # Choose grouping way
 #
diff --git a/Tests/CPackComponentsForAll/MyLibCPackConfig-IgnoreGroup.cmake.in b/Tests/CPackComponentsForAll/MyLibCPackConfig-IgnoreGroup.cmake.in
index 0ffe44d..a6f6ea9 100644
--- a/Tests/CPackComponentsForAll/MyLibCPackConfig-IgnoreGroup.cmake.in
+++ b/Tests/CPackComponentsForAll/MyLibCPackConfig-IgnoreGroup.cmake.in
@@ -52,6 +52,10 @@ if(CPACK_GENERATOR MATCHES "DEB")
    set(CPACK_DEB_COMPONENT_INSTALL "ON")
 endif()
 
+if(CPACK_GENERATOR MATCHES "NuGet")
+   set(CPACK_NUGET_COMPONENT_INSTALL "ON")
+endif()
+
 #
 # Choose grouping way
 #
diff --git a/Tests/CPackComponentsForAll/MyLibCPackConfig-OnePackPerGroup.cmake.in b/Tests/CPackComponentsForAll/MyLibCPackConfig-OnePackPerGroup.cmake.in
index ac65dc9..d41225d 100644
--- a/Tests/CPackComponentsForAll/MyLibCPackConfig-OnePackPerGroup.cmake.in
+++ b/Tests/CPackComponentsForAll/MyLibCPackConfig-OnePackPerGroup.cmake.in
@@ -18,6 +18,10 @@ if(CPACK_GENERATOR MATCHES "DragNDrop")
    set(CPACK_COMPONENTS_GROUPING "ONE_PER_GROUP")
 endif()
 
+if(CPACK_GENERATOR MATCHES "NuGet")
+   set(CPACK_NUGET_COMPONENT_INSTALL "ON")
+endif()
+
 #
 # Choose grouping way
 #
diff --git a/Tests/CPackComponentsForAll/RunCPackVerifyResult.cmake b/Tests/CPackComponentsForAll/RunCPackVerifyResult.cmake
index 2bfb5b0..253d128 100644
--- a/Tests/CPackComponentsForAll/RunCPackVerifyResult.cmake
+++ b/Tests/CPackComponentsForAll/RunCPackVerifyResult.cmake
@@ -70,6 +70,18 @@ elseif(CPackGen MATCHES "DEB")
     elseif(${CPackComponentWay} STREQUAL "AllInOne")
         set(expected_count 1)
     endif()
+elseif(CPackGen MATCHES "NuGet")
+    set(config_verbose -D "CPACK_NUGET_PACKAGE_DEBUG=1")
+    set(expected_file_mask "${CPackComponentsForAll_BINARY_DIR}/MyLib*1.0.2.nupkg")
+    if(${CPackComponentWay} STREQUAL "default")
+        set(expected_count 1)
+    elseif(${CPackComponentWay} STREQUAL "OnePackPerGroup")
+        set(expected_count 3)
+    elseif(${CPackComponentWay} STREQUAL "IgnoreGroup")
+        set(expected_count 4)
+    elseif(${CPackComponentWay} STREQUAL "AllInOne")
+        set(expected_count 1)
+    endif()
 endif()
 
 if(CPackGen MATCHES "DragNDrop")

https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=dd43e6fe895ab84206cab126699e7db7007cc688
commit dd43e6fe895ab84206cab126699e7db7007cc688
Author:     Alex Turbov <i.zaufi at gmail.com>
AuthorDate: Mon May 7 23:53:08 2018 +0300
Commit:     Brad King <brad.king at kitware.com>
CommitDate: Wed May 9 08:41:58 2018 -0400

    Tests: Format `RunCPackVerifyResult.cmake` more consistently

diff --git a/Tests/CPackComponentsForAll/RunCPackVerifyResult.cmake b/Tests/CPackComponentsForAll/RunCPackVerifyResult.cmake
index 2c3a849..2bfb5b0 100644
--- a/Tests/CPackComponentsForAll/RunCPackVerifyResult.cmake
+++ b/Tests/CPackComponentsForAll/RunCPackVerifyResult.cmake
@@ -38,57 +38,57 @@ set(config_verbose )
 
 if(CPackGen MATCHES "ZIP")
     set(expected_file_mask "${CPackComponentsForAll_BINARY_DIR}/MyLib-*.zip")
-    if (${CPackComponentWay} STREQUAL "default")
+    if(${CPackComponentWay} STREQUAL "default")
         set(expected_count 1)
-    elseif (${CPackComponentWay} STREQUAL "OnePackPerGroup")
+    elseif(${CPackComponentWay} STREQUAL "OnePackPerGroup")
         set(expected_count 3)
-    elseif (${CPackComponentWay} STREQUAL "IgnoreGroup")
+    elseif(${CPackComponentWay} STREQUAL "IgnoreGroup")
         set(expected_count 4)
-    elseif (${CPackComponentWay} STREQUAL "AllInOne")
+    elseif(${CPackComponentWay} STREQUAL "AllInOne")
         set(expected_count 1)
-    endif ()
-elseif (CPackGen MATCHES "RPM")
+    endif()
+elseif(CPackGen MATCHES "RPM")
     set(config_verbose -D "CPACK_RPM_PACKAGE_DEBUG=1")
     set(expected_file_mask "${CPackComponentsForAll_BINARY_DIR}/MyLib-*.rpm")
-    if (${CPackComponentWay} STREQUAL "default")
+    if(${CPackComponentWay} STREQUAL "default")
         set(expected_count 1)
-    elseif (${CPackComponentWay} STREQUAL "OnePackPerGroup")
+    elseif(${CPackComponentWay} STREQUAL "OnePackPerGroup")
         set(expected_count 3)
-    elseif (${CPackComponentWay} STREQUAL "IgnoreGroup")
+    elseif(${CPackComponentWay} STREQUAL "IgnoreGroup")
         set(expected_count 4)
-    elseif (${CPackComponentWay} STREQUAL "AllInOne")
+    elseif(${CPackComponentWay} STREQUAL "AllInOne")
         set(expected_count 1)
-    endif ()
-elseif (CPackGen MATCHES "DEB")
+    endif()
+elseif(CPackGen MATCHES "DEB")
     set(expected_file_mask "${CPackComponentsForAll_BINARY_DIR}/mylib*_1.0.2_*.deb")
-    if (${CPackComponentWay} STREQUAL "default")
+    if(${CPackComponentWay} STREQUAL "default")
         set(expected_count 1)
-    elseif (${CPackComponentWay} STREQUAL "OnePackPerGroup")
+    elseif(${CPackComponentWay} STREQUAL "OnePackPerGroup")
         set(expected_count 3)
-    elseif (${CPackComponentWay} STREQUAL "IgnoreGroup")
+    elseif(${CPackComponentWay} STREQUAL "IgnoreGroup")
         set(expected_count 4)
-    elseif (${CPackComponentWay} STREQUAL "AllInOne")
+    elseif(${CPackComponentWay} STREQUAL "AllInOne")
         set(expected_count 1)
-    endif ()
+    endif()
 endif()
 
 if(CPackGen MATCHES "DragNDrop")
     set(expected_file_mask "${CPackComponentsForAll_BINARY_DIR}/MyLib-*.dmg")
-    if (${CPackComponentWay} STREQUAL "default")
+    if(${CPackComponentWay} STREQUAL "default")
         set(expected_count 1)
-    elseif (${CPackComponentWay} STREQUAL "OnePackPerGroup")
+    elseif(${CPackComponentWay} STREQUAL "OnePackPerGroup")
         set(expected_count 3)
-    elseif (${CPackComponentWay} STREQUAL "IgnoreGroup")
+    elseif(${CPackComponentWay} STREQUAL "IgnoreGroup")
         set(expected_count 4)
-    elseif (${CPackComponentWay} STREQUAL "AllInOne")
+    elseif(${CPackComponentWay} STREQUAL "AllInOne")
         set(expected_count 1)
-    endif ()
+    endif()
 endif()
 
 # clean-up previously CPack generated files
 if(expected_file_mask)
   file(GLOB expected_file "${expected_file_mask}")
-  if (expected_file)
+  if(expected_file)
     file(REMOVE ${expected_file})
   endif()
 endif()
@@ -101,7 +101,7 @@ execute_process(COMMAND ${CMAKE_CPACK_COMMAND} ${config_verbose} -G ${CPackGen}
     ERROR_VARIABLE CPack_error
     WORKING_DIRECTORY ${CPackComponentsForAll_BINARY_DIR})
 
-if (CPack_result)
+if(CPack_result)
   message(FATAL_ERROR "error: CPack execution went wrong!, CPack_output=${CPack_output}, CPack_error=${CPack_error}")
 else ()
   message(STATUS "CPack_output=${CPack_output}")

https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=43582cda573b1ec1ab1a971e7e4db63c45c8b7e4
commit 43582cda573b1ec1ab1a971e7e4db63c45c8b7e4
Author:     Alex Turbov <i.zaufi at gmail.com>
AuthorDate: Sun May 6 18:15:20 2018 +0300
Commit:     Brad King <brad.king at kitware.com>
CommitDate: Wed May 9 08:41:58 2018 -0400

    Tests: Fix comment for finding dpkg tool

diff --git a/Tests/CMakeLists.txt b/Tests/CMakeLists.txt
index ea64646..6e3c3c4 100644
--- a/Tests/CMakeLists.txt
+++ b/Tests/CMakeLists.txt
@@ -145,8 +145,7 @@ if(BUILD_TESTING)
     set(CPACK_BINARY_RPM OFF)
   endif()
 
-  # Look for rpmbuild to use for tests.
-  # The tool does not work with spaces in the path.
+  # Look for dpkg to use for tests.
   find_program(DPKG_EXECUTABLE NAMES dpkg)
 
   if(DPKG_EXECUTABLE)

-----------------------------------------------------------------------

Summary of changes:
 Help/manual/cmake-modules.7.rst                    |    1 +
 Help/module/CPackNuGet.rst                         |    1 +
 Help/release/dev/cpack-nuget.rst                   |    7 +
 Modules/CPack.NuGet.nuspec.in                      |   24 +
 Modules/CPack.cmake                                |   11 +-
 Modules/CPackNuGet.cmake                           |  556 ++++++++++++++++++++
 Modules/FindJPEG.cmake                             |    2 +-
 Source/CMakeLists.txt                              |    1 +
 Source/CPack/cmCPackGeneratorFactory.cxx           |    5 +
 Source/CPack/cmCPackNuGetGenerator.cxx             |  140 +++++
 Source/CPack/cmCPackNuGetGenerator.h               |   37 ++
 Source/CTest/cmCTestLaunch.cxx                     |  100 ++--
 Source/CTest/cmCTestLaunch.h                       |   12 +-
 Source/cmXMLWriter.h                               |    6 +
 Tests/CMakeLists.txt                               |   25 +-
 Tests/CPackComponentsForAll/CMakeLists.txt         |   12 +
 .../MyLibCPackConfig-AllInOne.cmake.in             |    4 +
 .../MyLibCPackConfig-IgnoreGroup.cmake.in          |    4 +
 .../MyLibCPackConfig-OnePackPerGroup.cmake.in      |    4 +
 .../RunCPackVerifyResult.cmake                     |   60 ++-
 20 files changed, 918 insertions(+), 94 deletions(-)
 create mode 100644 Help/module/CPackNuGet.rst
 create mode 100644 Help/release/dev/cpack-nuget.rst
 create mode 100644 Modules/CPack.NuGet.nuspec.in
 create mode 100644 Modules/CPackNuGet.cmake
 create mode 100644 Source/CPack/cmCPackNuGetGenerator.cxx
 create mode 100644 Source/CPack/cmCPackNuGetGenerator.h


hooks/post-receive
-- 
CMake


More information about the Cmake-commits mailing list