diff options
author | Andy Cedilnik <andy.cedilnik@kitware.com> | 2006-04-02 15:20:58 (GMT) |
---|---|---|
committer | Andy Cedilnik <andy.cedilnik@kitware.com> | 2006-04-02 15:20:58 (GMT) |
commit | d342d51c0cc2ab2dc0f1053817a5a98b14a3fcf4 (patch) | |
tree | 31ee8a0969c5a3538d178a9dfa207f6fc26838dd /Source/CPack/cmCPackZIPGenerator.cxx | |
parent | c0fe6aa97af5fa668fecf839e3baaafe4ffc2ad0 (diff) | |
download | CMake-d342d51c0cc2ab2dc0f1053817a5a98b14a3fcf4.zip CMake-d342d51c0cc2ab2dc0f1053817a5a98b14a3fcf4.tar.gz CMake-d342d51c0cc2ab2dc0f1053817a5a98b14a3fcf4.tar.bz2 |
ENH: Add ZIP generator and add support for including or excluding the toplevel directory
Diffstat (limited to 'Source/CPack/cmCPackZIPGenerator.cxx')
-rw-r--r-- | Source/CPack/cmCPackZIPGenerator.cxx | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/Source/CPack/cmCPackZIPGenerator.cxx b/Source/CPack/cmCPackZIPGenerator.cxx new file mode 100644 index 0000000..0781991 --- /dev/null +++ b/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; +} |