Browse Source

ENH: Add ZIP generator and add support for including or excluding the toplevel directory

Andy Cedilnik 19 years ago
parent
commit
d342d51c0c

+ 1 - 0
Source/CMakeLists.txt

@@ -275,6 +275,7 @@ SET(CPACK_SRCS
   CPack/cmCPackTGZGenerator.cxx
   CPack/cmCPackNSISGenerator.cxx
   CPack/cmCPackPackageMakerGenerator.cxx
+  CPack/cmCPackZIPGenerator.cxx
   CPack/cmCPackGenericGenerator.cxx
   CPack/cmCPackLog.cxx
   )

+ 2 - 0
Source/CPack/cmCPackGenerators.cxx

@@ -19,6 +19,7 @@
 
 #include "cmCPackGenericGenerator.h"
 #include "cmCPackTGZGenerator.h"
+#include "cmCPackZIPGenerator.h"
 #include "cmCPackSTGZGenerator.h"
 #include "cmCPackNSISGenerator.h"
 #include "cmCPackPackageMakerGenerator.h"
@@ -31,6 +32,7 @@ cmCPackGenerators::cmCPackGenerators()
   this->RegisterGenerator("TGZ", cmCPackTGZGenerator::CreateGenerator);
   this->RegisterGenerator("STGZ", cmCPackSTGZGenerator::CreateGenerator);
   this->RegisterGenerator("NSIS", cmCPackNSISGenerator::CreateGenerator);
+  this->RegisterGenerator("ZIP", cmCPackZIPGenerator::CreateGenerator);
   this->RegisterGenerator("PackageMaker",
     cmCPackPackageMakerGenerator::CreateGenerator);
 }

+ 5 - 0
Source/CPack/cmCPackGenericGenerator.cxx

@@ -328,6 +328,11 @@ int cmCPackGenericGenerator::ProcessGenerator()
       << std::endl);
     cmSystemTools::RemoveFile(tempPackageFileName);
     }
+  if ( cmSystemTools::IsOn(this->GetOption(
+        "CPACK_INCLUDE_TOPLEVEL_DIRECTORY")) )
+    {
+    tempDirectory = this->GetOption("CPACK_TOPLEVEL_DIRECTORY");
+    }
   if ( !this->CompressFiles(tempPackageFileName,
       tempDirectory, gl.GetFiles()) )
     {

+ 8 - 0
Source/CPack/cmCPackNSISGenerator.cxx

@@ -122,6 +122,14 @@ int cmCPackNSISGenerator::Initialize(const char* name, cmMakefile* mf)
     {
     return res;
     }
+  if ( cmSystemTools::IsOn(this->GetOption(
+        "CPACK_INCLUDE_TOPLEVEL_DIRECTORY")) )
+    {
+    cmCPackLogger(cmCPackLog::LOG_ERROR, "NSIS Generator cannot work with CPACK_INCLUDE_TOPLEVEL_DIRECTORY. This option will be ignored."
+      << std::endl);
+    this->SetOption("CPACK_INCLUDE_TOPLEVEL_DIRECTORY", 0);
+    }
+
   cmCPackLogger(cmCPackLog::LOG_DEBUG, "cmCPackNSISGenerator::Initialize()"
     << std::endl);
   std::vector<std::string> path;

+ 4 - 0
Source/CPack/cmCPackPackageMakerGenerator.cxx

@@ -140,6 +140,10 @@ int cmCPackPackageMakerGenerator::CompressFiles(const char* outFileName,
 int cmCPackPackageMakerGenerator::Initialize(const char* name, cmMakefile* mf)
 {
   int res = this->Superclass::Initialize(name, mf);
+  if ( !res )
+    {
+    return res;
+    }
   cmCPackLogger(cmCPackLog::LOG_DEBUG,
     "cmCPackPackageMakerGenerator::Initialize()" << std::endl);
   std::vector<std::string> path;

+ 138 - 0
Source/CPack/cmCPackZIPGenerator.cxx

@@ -0,0 +1,138 @@
+/*=========================================================================
+
+  Program:   CMake - Cross-Platform Makefile Generator
+  Module:    $RCSfile$
+  Language:  C++
+  Date:      $Date$
+  Version:   $Revision$
+
+  Copyright (c) 2002 Kitware, Inc., Insight Consortium.  All rights reserved.
+  See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details.
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notices for more information.
+
+=========================================================================*/
+
+#include "cmCPackZIPGenerator.h"
+
+#include "cmake.h"
+#include "cmGlobalGenerator.h"
+#include "cmLocalGenerator.h"
+#include "cmSystemTools.h"
+#include "cmMakefile.h"
+#include "cmGeneratedFileStream.h"
+#include "cmCPackLog.h"
+
+#include <cmsys/SystemTools.hxx>
+
+//----------------------------------------------------------------------
+cmCPackZIPGenerator::cmCPackZIPGenerator()
+{
+}
+
+//----------------------------------------------------------------------
+cmCPackZIPGenerator::~cmCPackZIPGenerator()
+{
+}
+
+//----------------------------------------------------------------------
+int cmCPackZIPGenerator::Initialize(const char* name, cmMakefile* mf)
+{
+  int res = this->Superclass::Initialize(name, mf);
+  if ( !res )
+    {
+    return res;
+    }
+  std::vector<std::string> path;
+  std::string pkgPath = "c:/Program Files/WinZip";
+  path.push_back(pkgPath);
+  pkgPath = cmSystemTools::FindProgram("wzzip", path, false);
+  this->ZipStyle = cmCPackZIPGenerator::StyleUnkown;
+  bool found = false;
+  if ( pkgPath.empty() )
+    {
+    cmCPackLogger(cmCPackLog::LOG_DEBUG, "Cannot find WinZip" << std::endl);
+    }
+  else
+    {
+    this->ZipStyle = cmCPackZIPGenerator::StyleWinZip;
+    found = true;
+    }
+  if ( !found )
+    {
+    path.erase(path.begin(), path.end());
+    pkgPath = "c:/cygwin/bin";
+    path.push_back(pkgPath);
+    pkgPath = cmSystemTools::FindProgram("zip", path, false);
+    if ( pkgPath.empty() )
+      {
+      cmCPackLogger(cmCPackLog::LOG_DEBUG, "Cannot find unix ZIP" << std::endl);
+      }
+    else
+      {
+      this->ZipStyle = cmCPackZIPGenerator::StyleUnixZip;
+      found = true;
+      }
+    }
+  if ( !found )
+    {
+    cmCPackLogger(cmCPackLog::LOG_ERROR, "Cannot find a sutable ZIP program"
+      << std::endl);
+    return 0;
+    }
+  this->SetOption("CPACK_INSTALLER_PROGRAM", pkgPath.c_str());
+  cmCPackLogger(cmCPackLog::LOG_VERBOSE, "Found ZIP program: " << pkgPath.c_str()
+    << std::endl);
+  return 1;
+}
+
+//----------------------------------------------------------------------
+int cmCPackZIPGenerator::CompressFiles(const char* outFileName,
+  const char* toplevel, const std::vector<std::string>& files)
+{
+  cmOStringStream dmgCmd;
+  switch ( this->ZipStyle )
+    {
+  case cmCPackZIPGenerator::StyleWinZip:
+    dmgCmd << "\"" << this->GetOption("CPACK_INSTALLER_PROGRAM")
+      << "\" -P \"" << outFileName
+      << "\"";
+    break;
+  case cmCPackZIPGenerator::StyleUnixZip:
+    dmgCmd << "\"" << this->GetOption("CPACK_INSTALLER_PROGRAM")
+      << "\" \"" << outFileName
+      << "\"";
+    break;
+  default:
+    cmCPackLogger(cmCPackLog::LOG_ERROR, "Unknown ZIP style"
+      << std::endl);
+    return 0;
+    }
+  std::vector<std::string>::const_iterator fileIt;
+  for ( fileIt = files.begin(); fileIt != files.end(); ++ fileIt )
+    {
+    dmgCmd << " \""
+      << cmSystemTools::RelativePath(toplevel, fileIt->c_str())
+      << "\"";
+    }
+  std::string output;
+  int retVal = -1;
+  int res = cmSystemTools::RunSingleCommand(dmgCmd.str().c_str(), &output,
+    &retVal, toplevel, this->GeneratorVerbose, 0);
+  if ( !res || retVal )
+    {
+    std::string tmpFile = this->GetOption("CPACK_TOPLEVEL_DIRECTORY");
+    tmpFile += "/CompressZip.log";
+    cmGeneratedFileStream ofs(tmpFile.c_str());
+    ofs << "# Run command: " << dmgCmd.str().c_str() << std::endl
+      << "# Output:" << std::endl
+      << output.c_str() << std::endl;
+    cmCPackLogger(cmCPackLog::LOG_ERROR, "Problem running zip command: "
+      << dmgCmd.str().c_str() << std::endl
+      << "Please check " << tmpFile.c_str() << " for errors" << std::endl);
+    return 0;
+    }
+  return 1;
+}

+ 59 - 0
Source/CPack/cmCPackZIPGenerator.h

@@ -0,0 +1,59 @@
+/*=========================================================================
+
+  Program:   CMake - Cross-Platform Makefile Generator
+  Module:    $RCSfile$
+  Language:  C++
+  Date:      $Date$
+  Version:   $Revision$
+
+  Copyright (c) 2002 Kitware, Inc. All rights reserved.
+  See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details.
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notices for more information.
+
+=========================================================================*/
+
+#ifndef cmCPackZIPGenerator_h
+#define cmCPackZIPGenerator_h
+
+#include "cmCPackGenericGenerator.h"
+
+class cmCPackZIPGeneratorForward;
+
+/** \class cmCPackZIPGenerator
+ * \brief A generator for ZIP files
+ */
+class cmCPackZIPGenerator : public cmCPackGenericGenerator
+{
+public:
+  friend class cmCPackZIPGeneratorForward;
+  cmCPackTypeMacro(cmCPackZIPGenerator, cmCPackGenericGenerator);
+
+  /**
+   * Initialize generator
+   */
+  virtual int Initialize(const char* name, cmMakefile* mf);
+  /**
+   * Construct generator
+   */
+  cmCPackZIPGenerator();
+  virtual ~cmCPackZIPGenerator();
+
+  enum ZipStyles
+    {
+    StyleUnkown,
+    StyleWinZip,
+    StyleUnixZip
+    };
+
+protected:
+  int CompressFiles(const char* outFileName, const char* toplevel,
+    const std::vector<std::string>& files);
+  virtual const char* GetOutputExtension() { return "zip"; }
+
+  int ZipStyle;
+};
+
+#endif

+ 1 - 1
Source/CPack/cpack.cxx

@@ -338,7 +338,7 @@ int main (int argc, char *argv[])
           << generator.c_str() << std::endl);
         parsed = 0;
         }
-      if ( !cpackGenerator->Initialize(gen, mf) )
+      if ( parsed && !cpackGenerator->Initialize(gen, mf) )
         {
         parsed = 0;
         }