diff options
-rwxr-xr-x | Modules/CPack.STGZ_Header.sh.in | 89 | ||||
-rw-r--r-- | Source/CPack/cmCPackGenericGenerator.cxx | 18 | ||||
-rw-r--r-- | Source/CPack/cmCPackGenericGenerator.h | 3 | ||||
-rw-r--r-- | Source/CPack/cmCPackSTGZGenerator.cxx | 98 | ||||
-rw-r--r-- | Source/CPack/cmCPackSTGZGenerator.h | 2 | ||||
-rw-r--r-- | Source/CPack/cpack.cxx | 6 | ||||
-rw-r--r-- | Source/cmFileCommand.cxx | 4 |
7 files changed, 188 insertions, 32 deletions
diff --git a/Modules/CPack.STGZ_Header.sh.in b/Modules/CPack.STGZ_Header.sh.in new file mode 100755 index 0000000..24f0428 --- /dev/null +++ b/Modules/CPack.STGZ_Header.sh.in @@ -0,0 +1,89 @@ +#!/bin/sh + +# Display usage +cpack_usage() +{ + cat <<EOF +Usage: $0 [options] +Options: [defaults in brackets after descriptions] + --help print this message + --prefix=dir directory in which to install + --include-subdir include the @CPACK_PACKAGE_FILE_NAME@ subdirectory + --exclude-subdir exclude the @CPACK_PACKAGE_FILE_NAME@ subdirectory +EOF + exit 1 +} + +# Display version +cpack_version() +{ + echo "@CPACK_PACKAGE_NAME@ Installer Version: @CPACK_PACKAGE_VERSION@, Copyright (c) @CPACK_PACKAGE_VENDOR@" +} + +# Helper function to fix windows paths. +cpack_fix_slashes () +{ + echo "$1" | sed 's/\\/\//g' +} + + +for a in "$@CPACK_AT_SIGN@"; do + if echo $a | grep "^--prefix=" > /dev/null 2> /dev/null; then + cpack_prefix_dir=`echo $a | sed "s/^--prefix=//"` + cpack_prefix_dir=`cpack_fix_slashes "${cpack_prefix_dir}"` + fi + if echo $a | grep "^--help" > /dev/null 2> /dev/null; then + cpack_usage + fi + if echo $a | grep "^--version" > /dev/null 2> /dev/null; then + cpack_version + exit 2 + fi + if echo $a | grep "^--include-subdir" > /dev/null 2> /dev/null; then + cpack_include_subdir=TRUE + fi + if echo $a | grep "^--exclude-subdir" > /dev/null 2> /dev/null; then + cpack_include_subdir=FALSE + fi +done + +cpack_version +echo "This is a self-extracting archive." +toplevel="`pwd`" +if [ "x${cpack_prefix_dir}x" != "xx" ] +then + toplevel="${cpack_prefix_dir}" +fi + +echo "The archive will be extracted to: ${toplevel}" +echo "" + +if [ "x${cpack_include_subdir}x" == "xx" ] +then + echo "If you want to stop extracting, please press <ctrl-C>." + echo "Include the subdirectory @CPACK_PACKAGE_FILE_NAME@" [Yn]: + read line + if [ "x${line}x" != "xnx" -a "x${line}x" != "xNx" ] + then + cpack_include_subdir=TRUE + fi +fi + +if [ "x${cpack_include_subdir}x" == "xTRUEx" ] +then + toplevel="${toplevel}/@CPACK_PACKAGE_FILE_NAME@" + mkdir -p "${toplevel}" +fi +echo "Extracting... Please wait..." +echo "" + +# take the archive portion of this file and pipe it to tar +# the NUMERIC parameter in this command should be one more +# than the number of lines in this header file +tail -n +###CPACK_HEADER_LENGTH### "$0" | gunzip | (cd "${toplevel}" && tar xf -) + +exit 0 +#----------------------------------------------------------- +# Start of TAR.GZ file +#-----------------------------------------------------------; + diff --git a/Source/CPack/cmCPackGenericGenerator.cxx b/Source/CPack/cmCPackGenericGenerator.cxx index 7d7975e..1f8aca6 100644 --- a/Source/CPack/cmCPackGenericGenerator.cxx +++ b/Source/CPack/cmCPackGenericGenerator.cxx @@ -532,10 +532,17 @@ int cmCPackGenericGenerator::ProcessGenerator() } //---------------------------------------------------------------------- -int cmCPackGenericGenerator::Initialize(const char* name, cmMakefile* mf) +int cmCPackGenericGenerator::Initialize(const char* name, cmMakefile* mf, + const char* argv0) { this->MakefileMap = mf; this->Name = name; + if ( !this->FindRunningCMake(argv0) ) + { + cmCPackLogger(cmCPackLog::LOG_ERROR, + "Cannot initialize the generator" << std::endl); + return 0; + } return this->InitializeInternal(); } @@ -762,6 +769,15 @@ std::string cmCPackGenericGenerator::FindTemplate(const char* name) } //---------------------------------------------------------------------- +bool cmCPackGenericGenerator::ConfigureString(const std::string& inString, + std::string& outString) +{ + this->MakefileMap->ConfigureString(inString, + outString, true, false); + return true; +} + +//---------------------------------------------------------------------- bool cmCPackGenericGenerator::ConfigureFile(const char* inName, const char* outName) { diff --git a/Source/CPack/cmCPackGenericGenerator.h b/Source/CPack/cmCPackGenericGenerator.h index 40e8740..6867613 100644 --- a/Source/CPack/cmCPackGenericGenerator.h +++ b/Source/CPack/cmCPackGenericGenerator.h @@ -68,7 +68,7 @@ public: /** * Initialize generator */ - int Initialize(const char* name, cmMakefile* mf); + int Initialize(const char* name, cmMakefile* mf, const char* argv0); /** * Construct generator @@ -100,6 +100,7 @@ protected: virtual std::string FindTemplate(const char* name); virtual bool ConfigureFile(const char* inName, const char* outName); + virtual bool ConfigureString(const std::string& input, std::string& output); virtual int InitializeInternal(); bool GeneratorVerbose; diff --git a/Source/CPack/cmCPackSTGZGenerator.cxx b/Source/CPack/cmCPackSTGZGenerator.cxx index 1ce9935..d31b120 100644 --- a/Source/CPack/cmCPackSTGZGenerator.cxx +++ b/Source/CPack/cmCPackSTGZGenerator.cxx @@ -24,6 +24,11 @@ #include "cmMakefile.h" #include "cmCPackLog.h" +#include "CPack/cmCPackSTGZGeneratorEncodedHeader.h" + +#include <cmsys/ios/sstream> +#include <sys/types.h> +#include <sys/stat.h> //---------------------------------------------------------------------- cmCPackSTGZGenerator::cmCPackSTGZGenerator() @@ -39,36 +44,81 @@ cmCPackSTGZGenerator::~cmCPackSTGZGenerator() int cmCPackSTGZGenerator::InitializeInternal() { this->SetOptionIfNotSet("CPACK_INCLUDE_TOPLEVEL_DIRECTORY", "0"); + + std::string inFile = this->FindTemplate("CPack.STGZ_Header.sh.in"); + if ( inFile.empty() ) + { + cmCPackLogger(cmCPackLog::LOG_ERROR, "Cannot find template file: " + << inFile.c_str() << std::endl); + return 0; + } + this->SetOptionIfNotSet("CPACK_STGZ_HEADER_FILE", inFile.c_str()); + this->SetOption("CPACK_AT_SIGN", "@"); + return this->Superclass::InitializeInternal(); } //---------------------------------------------------------------------- +int cmCPackSTGZGenerator::CompressFiles(const char* outFileName, + const char* toplevel, const std::vector<std::string>& files) +{ + if ( !this->Superclass::CompressFiles(outFileName, toplevel, files) ) + { + return 0; + } + return cmSystemTools::SetPermissions(outFileName, +#if defined( _MSC_VER ) || defined( __MINGW32__ ) + S_IREAD | S_IWRITE | S_IEXEC +#elif defined( __BORLANDC__ ) + S_IRUSR | S_IWUSR | S_IXUSR +#else + S_IRUSR | S_IWUSR | S_IXUSR | + S_IRGRP | S_IWGRP | S_IXGRP | + S_IROTH | S_IWOTH | S_IXOTH +#endif + ); +} + +//---------------------------------------------------------------------- int cmCPackSTGZGenerator::GenerateHeader(std::ostream* os) { cmCPackLogger(cmCPackLog::LOG_DEBUG, "Writing header" << std::endl); - *os - << "#!/bin/sh" << std::endl - << "echo \"" << this->GetOption("CPACK_PACKAGE_NAME") - << " - self-extracting archive.\"" << std::endl - << "echo \"If you want to stop extracting, please press <ctrl-C>.\"" - << std::endl - << "read line" << std::endl - << "echo \"Extracting... Please wait...\"" << std::endl - << "echo \"\"" << std::endl - << "" << std::endl - << "# take the archive portion of this file and pipe it to tar" - << std::endl - << "# the NUMERIC parameter in this command should be one more" - << std::endl - << "# than the number of lines in this header file" << std::endl - << "tail +18 \"$0\" | gunzip | tar xf -" << std::endl - << "" << std::endl - << "exit 0" << std::endl - << "echo \"\"" << std::endl - << "#-----------------------------------------------------------" - << std::endl - << "# Start of TAR.GZ file" << std::endl - << "#-----------------------------------------------------------" - << std::endl; + cmsys_ios::ostringstream str; + int counter = 0; + + const char headerLengthTag[] = "###CPACK_HEADER_LENGTH###"; + + // Create the header + std::string inFile = this->GetOption("CPACK_STGZ_HEADER_FILE"); + std::string line; + std::ifstream ifs(inFile.c_str()); + std::string packageHeaderText; + while ( cmSystemTools::GetLineFromStream(ifs, line) ) + { + packageHeaderText += line + "\n"; + } + + // Configure in the values + std::string res; + this->ConfigureString(packageHeaderText, res); + + // Count the lines + const char* ptr = res.c_str(); + while ( *ptr ) + { + if ( *ptr == '\n' ) + { + counter ++; + } + ++ptr; + } + counter ++; + cmCPackLogger(cmCPackLog::LOG_ERROR, "Counter: " << counter << std::endl); + char buffer[1024]; + sprintf(buffer, "%d", counter); + cmSystemTools::ReplaceString(res, headerLengthTag, buffer); + + // Write in file + *os << res.c_str(); return this->Superclass::GenerateHeader(os); } diff --git a/Source/CPack/cmCPackSTGZGenerator.h b/Source/CPack/cmCPackSTGZGenerator.h index 050da9d..5d7ead8 100644 --- a/Source/CPack/cmCPackSTGZGenerator.h +++ b/Source/CPack/cmCPackSTGZGenerator.h @@ -37,6 +37,8 @@ public: virtual ~cmCPackSTGZGenerator(); protected: + int CompressFiles(const char* outFileName, const char* toplevel, + const std::vector<std::string>& files); virtual int InitializeInternal(); int GenerateHeader(std::ostream* os); virtual const char* GetOutputExtension() { return "sh"; } diff --git a/Source/CPack/cpack.cxx b/Source/CPack/cpack.cxx index 8dff672..fa4afb1 100644 --- a/Source/CPack/cpack.cxx +++ b/Source/CPack/cpack.cxx @@ -338,11 +338,7 @@ int main (int argc, char *argv[]) << generator.c_str() << std::endl); parsed = 0; } - if ( parsed && !cpackGenerator->Initialize(gen, mf) ) - { - parsed = 0; - } - if ( parsed && !cpackGenerator->FindRunningCMake(argv[0]) ) + if ( parsed && !cpackGenerator->Initialize(gen, mf, argv[0]) ) { cmCPack_Log(&log, cmCPackLog::LOG_ERROR, "Cannot initialize the generator" << std::endl); diff --git a/Source/cmFileCommand.cxx b/Source/cmFileCommand.cxx index 2808c58..68bc52d 100644 --- a/Source/cmFileCommand.cxx +++ b/Source/cmFileCommand.cxx @@ -108,7 +108,9 @@ bool cmFileCommand::HandleWriteCommand(std::vector<std::string> const& args, } if ( !this->Makefile->CanIWriteThisFile(fileName.c_str()) ) { - std::string e = "attempted to write a file: " + fileName + " into a source directory."; + std::string e + = "attempted to write a file: " + fileName + + " into a source directory."; this->SetError(e.c_str()); cmSystemTools::SetFatalErrorOccured(); return false; |