ENH: More cleanups and add stgz header script, so it does not have to be hard-coded. Also, the user can overwrite it
This commit is contained in:
parent
77771481dd
commit
4709c76f0f
89
Modules/CPack.STGZ_Header.sh.in
Executable file
89
Modules/CPack.STGZ_Header.sh.in
Executable file
@ -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
|
||||||
|
#-----------------------------------------------------------;
|
||||||
|
|
@ -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->MakefileMap = mf;
|
||||||
this->Name = name;
|
this->Name = name;
|
||||||
|
if ( !this->FindRunningCMake(argv0) )
|
||||||
|
{
|
||||||
|
cmCPackLogger(cmCPackLog::LOG_ERROR,
|
||||||
|
"Cannot initialize the generator" << std::endl);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
return this->InitializeInternal();
|
return this->InitializeInternal();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -761,6 +768,15 @@ std::string cmCPackGenericGenerator::FindTemplate(const char* name)
|
|||||||
return ffile;
|
return ffile;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
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,
|
bool cmCPackGenericGenerator::ConfigureFile(const char* inName,
|
||||||
const char* outName)
|
const char* outName)
|
||||||
|
@ -68,7 +68,7 @@ public:
|
|||||||
/**
|
/**
|
||||||
* Initialize generator
|
* Initialize generator
|
||||||
*/
|
*/
|
||||||
int Initialize(const char* name, cmMakefile* mf);
|
int Initialize(const char* name, cmMakefile* mf, const char* argv0);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Construct generator
|
* Construct generator
|
||||||
@ -100,6 +100,7 @@ protected:
|
|||||||
|
|
||||||
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 char* inName, const char* outName);
|
||||||
|
virtual bool ConfigureString(const std::string& input, std::string& output);
|
||||||
virtual int InitializeInternal();
|
virtual int InitializeInternal();
|
||||||
|
|
||||||
bool GeneratorVerbose;
|
bool GeneratorVerbose;
|
||||||
|
@ -24,6 +24,11 @@
|
|||||||
#include "cmMakefile.h"
|
#include "cmMakefile.h"
|
||||||
#include "cmCPackLog.h"
|
#include "cmCPackLog.h"
|
||||||
|
|
||||||
|
#include "CPack/cmCPackSTGZGeneratorEncodedHeader.h"
|
||||||
|
|
||||||
|
#include <cmsys/ios/sstream>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
cmCPackSTGZGenerator::cmCPackSTGZGenerator()
|
cmCPackSTGZGenerator::cmCPackSTGZGenerator()
|
||||||
@ -39,36 +44,81 @@ cmCPackSTGZGenerator::~cmCPackSTGZGenerator()
|
|||||||
int cmCPackSTGZGenerator::InitializeInternal()
|
int cmCPackSTGZGenerator::InitializeInternal()
|
||||||
{
|
{
|
||||||
this->SetOptionIfNotSet("CPACK_INCLUDE_TOPLEVEL_DIRECTORY", "0");
|
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();
|
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)
|
int cmCPackSTGZGenerator::GenerateHeader(std::ostream* os)
|
||||||
{
|
{
|
||||||
cmCPackLogger(cmCPackLog::LOG_DEBUG, "Writing header" << std::endl);
|
cmCPackLogger(cmCPackLog::LOG_DEBUG, "Writing header" << std::endl);
|
||||||
*os
|
cmsys_ios::ostringstream str;
|
||||||
<< "#!/bin/sh" << std::endl
|
int counter = 0;
|
||||||
<< "echo \"" << this->GetOption("CPACK_PACKAGE_NAME")
|
|
||||||
<< " - self-extracting archive.\"" << std::endl
|
const char headerLengthTag[] = "###CPACK_HEADER_LENGTH###";
|
||||||
<< "echo \"If you want to stop extracting, please press <ctrl-C>.\""
|
|
||||||
<< std::endl
|
// Create the header
|
||||||
<< "read line" << std::endl
|
std::string inFile = this->GetOption("CPACK_STGZ_HEADER_FILE");
|
||||||
<< "echo \"Extracting... Please wait...\"" << std::endl
|
std::string line;
|
||||||
<< "echo \"\"" << std::endl
|
std::ifstream ifs(inFile.c_str());
|
||||||
<< "" << std::endl
|
std::string packageHeaderText;
|
||||||
<< "# take the archive portion of this file and pipe it to tar"
|
while ( cmSystemTools::GetLineFromStream(ifs, line) )
|
||||||
<< std::endl
|
{
|
||||||
<< "# the NUMERIC parameter in this command should be one more"
|
packageHeaderText += line + "\n";
|
||||||
<< std::endl
|
}
|
||||||
<< "# than the number of lines in this header file" << std::endl
|
|
||||||
<< "tail +18 \"$0\" | gunzip | tar xf -" << std::endl
|
// Configure in the values
|
||||||
<< "" << std::endl
|
std::string res;
|
||||||
<< "exit 0" << std::endl
|
this->ConfigureString(packageHeaderText, res);
|
||||||
<< "echo \"\"" << std::endl
|
|
||||||
<< "#-----------------------------------------------------------"
|
// Count the lines
|
||||||
<< std::endl
|
const char* ptr = res.c_str();
|
||||||
<< "# Start of TAR.GZ file" << std::endl
|
while ( *ptr )
|
||||||
<< "#-----------------------------------------------------------"
|
{
|
||||||
<< std::endl;
|
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);
|
return this->Superclass::GenerateHeader(os);
|
||||||
}
|
}
|
||||||
|
@ -37,6 +37,8 @@ public:
|
|||||||
virtual ~cmCPackSTGZGenerator();
|
virtual ~cmCPackSTGZGenerator();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
int CompressFiles(const char* outFileName, const char* toplevel,
|
||||||
|
const std::vector<std::string>& files);
|
||||||
virtual int InitializeInternal();
|
virtual int InitializeInternal();
|
||||||
int GenerateHeader(std::ostream* os);
|
int GenerateHeader(std::ostream* os);
|
||||||
virtual const char* GetOutputExtension() { return "sh"; }
|
virtual const char* GetOutputExtension() { return "sh"; }
|
||||||
|
@ -338,11 +338,7 @@ int main (int argc, char *argv[])
|
|||||||
<< generator.c_str() << std::endl);
|
<< generator.c_str() << std::endl);
|
||||||
parsed = 0;
|
parsed = 0;
|
||||||
}
|
}
|
||||||
if ( parsed && !cpackGenerator->Initialize(gen, mf) )
|
if ( parsed && !cpackGenerator->Initialize(gen, mf, argv[0]) )
|
||||||
{
|
|
||||||
parsed = 0;
|
|
||||||
}
|
|
||||||
if ( parsed && !cpackGenerator->FindRunningCMake(argv[0]) )
|
|
||||||
{
|
{
|
||||||
cmCPack_Log(&log, cmCPackLog::LOG_ERROR,
|
cmCPack_Log(&log, cmCPackLog::LOG_ERROR,
|
||||||
"Cannot initialize the generator" << std::endl);
|
"Cannot initialize the generator" << std::endl);
|
||||||
|
@ -108,7 +108,9 @@ bool cmFileCommand::HandleWriteCommand(std::vector<std::string> const& args,
|
|||||||
}
|
}
|
||||||
if ( !this->Makefile->CanIWriteThisFile(fileName.c_str()) )
|
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());
|
this->SetError(e.c_str());
|
||||||
cmSystemTools::SetFatalErrorOccured();
|
cmSystemTools::SetFatalErrorOccured();
|
||||||
return false;
|
return false;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user