Merge topic 'clang-format-source'

d9fd2f54 Revise C++ coding style using clang-format
82df6dea Empty commit at end of history preceding clang-format style transition
6a13f43f CONTRIBUTING: Add a section on coding style
bf451d9f Add a script to run clang-format on the entire source tree
1e90d78f Configure clang-format for CMake source tree
da60adc3 Tell Git to use a distinct conflict marker size in `.rst` files
This commit is contained in:
Brad King 2016-05-17 09:33:02 -04:00 committed by CMake Topic Stage
commit 7d2a0aa76c
1454 changed files with 62516 additions and 83728 deletions

9
.clang-format Normal file
View File

@ -0,0 +1,9 @@
---
# This configuration requires clang-format 3.8 or higher.
BasedOnStyle: Mozilla
AlignOperands: false
AlwaysBreakAfterReturnType: None
AlwaysBreakAfterDefinitionReturnType: None
ColumnLimit: 79
Standard: Cpp03
...

2
.gitattributes vendored
View File

@ -21,3 +21,5 @@ configure crlf=input
*.cxx whitespace=tab-in-indent *.cxx whitespace=tab-in-indent
*.txt whitespace=tab-in-indent *.txt whitespace=tab-in-indent
*.cmake whitespace=tab-in-indent *.cmake whitespace=tab-in-indent
*.rst whitespace=tab-in-indent conflict-marker-size=79

View File

@ -23,6 +23,16 @@ Please base all new work on the ``master`` branch. Then use
``git format-patch`` to produce patches suitable to post to ``git format-patch`` to produce patches suitable to post to
the mailing list. the mailing list.
Code Style
==========
We use `clang-format`_ to define our style for C++ code in the CMake source
tree. See the `.clang-format`_ configuration file for our style settings.
Use ``clang-format`` version 3.8 or higher to format source files.
.. _`clang-format`: http://clang.llvm.org/docs/ClangFormat.html
.. _`.clang-format`: .clang-format
License License
======= =======

View File

@ -1,19 +1,18 @@
#ifdef __cplusplus #ifdef __cplusplus
# error "A C++ compiler has been selected for C." #error "A C++ compiler has been selected for C."
#endif #endif
#ifdef __CLASSIC_C__ #ifdef __CLASSIC_C__
# define const #define const
#endif #endif
#include "CMakeCompilerABI.h" #include "CMakeCompilerABI.h"
#ifdef __CLASSIC_C__ #ifdef __CLASSIC_C__
int main(argc, argv) int argc; char *argv[]; int main(argc, argv) int argc;
char* argv[];
#else #else
int main(int argc, char *argv[]) int main(int argc, char* argv[])
#endif #endif
{ {
int require = 0; int require = 0;

View File

@ -1,11 +1,9 @@
#ifndef __cplusplus #ifndef __cplusplus
# error "A C compiler has been selected for C++." #error "A C compiler has been selected for C++."
#endif #endif
#include "CMakeCompilerABI.h" #include "CMakeCompilerABI.h"
int main(int argc, char* argv[]) int main(int argc, char* argv[])
{ {
int require = 0; int require = 0;

View File

@ -2,33 +2,31 @@
/* Size of a pointer-to-data in bytes. */ /* Size of a pointer-to-data in bytes. */
#define SIZEOF_DPTR (sizeof(void*)) #define SIZEOF_DPTR (sizeof(void*))
const char info_sizeof_dptr[] = { const char info_sizeof_dptr[] = {
'I', 'N', 'F', 'O', ':', 's', 'i', 'z', 'e', 'o', 'f', '_', 'd', 'p', 't', 'r', '[', 'I', 'N', 'F', 'O', ':', 's', 'i', 'z', 'e', 'o', 'f', '_', 'd', 'p', 't',
('0' + ((SIZEOF_DPTR / 10)%10)), 'r', '[', ('0' + ((SIZEOF_DPTR / 10) % 10)), ('0' + (SIZEOF_DPTR % 10)), ']',
('0' + (SIZEOF_DPTR % 10)), '\0'
']','\0'
/* clang-format needs this comment to break after the opening brace */ /* clang-format needs this comment to break after the opening brace */
}; };
/* Application Binary Interface. */ /* Application Binary Interface. */
#if defined(__sgi) && defined(_ABIO32) #if defined(__sgi) && defined(_ABIO32)
# define ABI_ID "ELF O32" #define ABI_ID "ELF O32"
#elif defined(__sgi) && defined(_ABIN32) #elif defined(__sgi) && defined(_ABIN32)
# define ABI_ID "ELF N32" #define ABI_ID "ELF N32"
#elif defined(__sgi) && defined(_ABI64) #elif defined(__sgi) && defined(_ABI64)
# define ABI_ID "ELF 64" #define ABI_ID "ELF 64"
/* Check for (some) ARM ABIs. /* Check for (some) ARM ABIs.
* See e.g. http://wiki.debian.org/ArmEabiPort for some information on this. */ * See e.g. http://wiki.debian.org/ArmEabiPort for some information on this. */
#elif defined(__GNU__) && defined(__ELF__) && defined(__ARM_EABI__) #elif defined(__GNU__) && defined(__ELF__) && defined(__ARM_EABI__)
# define ABI_ID "ELF ARMEABI" #define ABI_ID "ELF ARMEABI"
#elif defined(__GNU__) && defined(__ELF__) && defined(__ARMEB__) #elif defined(__GNU__) && defined(__ELF__) && defined(__ARMEB__)
# define ABI_ID "ELF ARM" #define ABI_ID "ELF ARM"
#elif defined(__GNU__) && defined(__ELF__) && defined(__ARMEL__) #elif defined(__GNU__) && defined(__ELF__) && defined(__ARMEL__)
# define ABI_ID "ELF ARM" #define ABI_ID "ELF ARM"
#elif defined(__ELF__) #elif defined(__ELF__)
# define ABI_ID "ELF" #define ABI_ID "ELF"
#endif #endif
#if defined(ABI_ID) #if defined(ABI_ID)

View File

@ -6,11 +6,13 @@ void* runner(void*);
int res = 0; int res = 0;
#ifdef __CLASSIC_C__ #ifdef __CLASSIC_C__
int main(){ int main()
{
int ac; int ac;
char*av[]; char* av[];
#else #else
int main(int ac, char*av[]){ int main(int ac, char* av[])
{
#endif #endif
pthread_t tid[2]; pthread_t tid[2];
pthread_create(&tid[0], 0, runner, (void*)1); pthread_create(&tid[0], 0, runner, (void*)1);
@ -22,17 +24,18 @@ int main(int ac, char*av[]){
pthread_join(tid[0], 0); pthread_join(tid[0], 0);
pthread_join(tid[1], 0); pthread_join(tid[1], 0);
if(ac > 1000){return *av[0];} if (ac > 1000) {
return *av[0];
}
return res; return res;
} }
void* runner(void* args) void* runner(void* args)
{ {
int cc; int cc;
for ( cc = 0; cc < 10; cc ++ ) for (cc = 0; cc < 10; cc++) {
{
printf("%p CC: %d\n", args, cc); printf("%p CC: %d\n", args, cc);
} }
res ++; res++;
return 0; return 0;
} }

View File

@ -3,17 +3,19 @@
#ifdef __cplusplus #ifdef __cplusplus
extern "C" extern "C"
#endif #endif
char CHECK_FUNCTION_EXISTS(); char
CHECK_FUNCTION_EXISTS();
#ifdef __CLASSIC_C__ #ifdef __CLASSIC_C__
int main(){ int main()
{
int ac; int ac;
char*av[]; char* av[];
#else #else
int main(int ac, char*av[]){ int main(int ac, char* av[])
{
#endif #endif
CHECK_FUNCTION_EXISTS(); CHECK_FUNCTION_EXISTS();
if(ac > 1000) if (ac > 1000) {
{
return *av[0]; return *av[0];
} }
return 0; return 0;
@ -21,6 +23,6 @@ int main(int ac, char*av[]){
#else /* CHECK_FUNCTION_EXISTS */ #else /* CHECK_FUNCTION_EXISTS */
# error "CHECK_FUNCTION_EXISTS has to specify the function" #error "CHECK_FUNCTION_EXISTS has to specify the function"
#endif /* CHECK_FUNCTION_EXISTS */ #endif /* CHECK_FUNCTION_EXISTS */

View File

@ -3,18 +3,22 @@
extern int CHECK_VARIABLE_EXISTS; extern int CHECK_VARIABLE_EXISTS;
#ifdef __CLASSIC_C__ #ifdef __CLASSIC_C__
int main(){ int main()
{
int ac; int ac;
char*av[]; char* av[];
#else #else
int main(int ac, char*av[]){ int main(int ac, char* av[])
{
#endif #endif
if(ac > 1000){return *av[0];} if (ac > 1000) {
return *av[0];
}
return CHECK_VARIABLE_EXISTS; return CHECK_VARIABLE_EXISTS;
} }
#else /* CHECK_VARIABLE_EXISTS */ #else /* CHECK_VARIABLE_EXISTS */
# error "CHECK_VARIABLE_EXISTS has to specify the variable" #error "CHECK_VARIABLE_EXISTS has to specify the variable"
#endif /* CHECK_VARIABLE_EXISTS */ #endif /* CHECK_VARIABLE_EXISTS */

View File

@ -1 +1,3 @@
void my_module_(void) {} void my_module_(void)
{
}

View File

@ -1 +1,3 @@
void mymodule_(void) {} void mymodule_(void)
{
}

View File

@ -1,6 +1,6 @@
#include <iostream> #include <iostream>
int main(int,char *[]) int main(int, char* [])
{ {
return 0; return 0;
} }

View File

@ -1,7 +1,8 @@
int main(int, char*[]) int main(int, char* [])
{ {
int i; int i;
for(int i=0; i < 1; ++i); for (int i = 0; i < 1; ++i)
;
(void)i; (void)i;
return 0; return 0;
} }

View File

@ -1,10 +1,9 @@
#include <sstream> #include <sstream>
int main(int, char*[]) int main(int, char* [])
{ {
std::ostringstream os; std::ostringstream os;
os << "12345"; os << "12345";
if(os.str().size() == 5) if (os.str().size() == 5) {
{
return 0; return 0;
} }
return -1; return -1;

View File

@ -1,5 +1,5 @@
#include <list> #include <list>
int main(int, char*[]) int main(int, char* [])
{ {
std::list<int>(); std::list<int>();
return 0; return 0;

View File

@ -39,19 +39,19 @@ cmCPackIFWGenerator::~cmCPackIFWGenerator()
{ {
} }
bool cmCPackIFWGenerator::IsVersionLess(const char *version) bool cmCPackIFWGenerator::IsVersionLess(const char* version)
{ {
return cmSystemTools::VersionCompare(cmSystemTools::OP_LESS, return cmSystemTools::VersionCompare(cmSystemTools::OP_LESS,
FrameworkVersion.data(), version); FrameworkVersion.data(), version);
} }
bool cmCPackIFWGenerator::IsVersionGreater(const char *version) bool cmCPackIFWGenerator::IsVersionGreater(const char* version)
{ {
return cmSystemTools::VersionCompare(cmSystemTools::OP_GREATER, return cmSystemTools::VersionCompare(cmSystemTools::OP_GREATER,
FrameworkVersion.data(), version); FrameworkVersion.data(), version);
} }
bool cmCPackIFWGenerator::IsVersionEqual(const char *version) bool cmCPackIFWGenerator::IsVersionEqual(const char* version)
{ {
return cmSystemTools::VersionCompare(cmSystemTools::OP_EQUAL, return cmSystemTools::VersionCompare(cmSystemTools::OP_EQUAL,
FrameworkVersion.data(), version); FrameworkVersion.data(), version);
@ -72,51 +72,41 @@ int cmCPackIFWGenerator::PackageFiles()
ifwTmpFile += "/IFWOutput.log"; ifwTmpFile += "/IFWOutput.log";
// Run repogen // Run repogen
if (!Installer.Repositories.empty()) if (!Installer.Repositories.empty()) {
{
std::string ifwCmd = RepoGen; std::string ifwCmd = RepoGen;
if(IsVersionLess("2.0.0")) if (IsVersionLess("2.0.0")) {
{
ifwCmd += " -c " + this->toplevel + "/config/config.xml"; ifwCmd += " -c " + this->toplevel + "/config/config.xml";
} }
ifwCmd += " -p " + this->toplevel + "/packages"; ifwCmd += " -p " + this->toplevel + "/packages";
if(!PkgsDirsVector.empty()) if (!PkgsDirsVector.empty()) {
{ for (std::vector<std::string>::iterator it = PkgsDirsVector.begin();
for(std::vector<std::string>::iterator it = PkgsDirsVector.begin(); it != PkgsDirsVector.end(); ++it) {
it != PkgsDirsVector.end(); ++it)
{
ifwCmd += " -p " + *it; ifwCmd += " -p " + *it;
} }
} }
if (!OnlineOnly && !DownloadedPackages.empty()) if (!OnlineOnly && !DownloadedPackages.empty()) {
{
ifwCmd += " -i "; ifwCmd += " -i ";
std::set<cmCPackIFWPackage*>::iterator it std::set<cmCPackIFWPackage*>::iterator it = DownloadedPackages.begin();
= DownloadedPackages.begin();
ifwCmd += (*it)->Name; ifwCmd += (*it)->Name;
++it; ++it;
while(it != DownloadedPackages.end()) while (it != DownloadedPackages.end()) {
{
ifwCmd += "," + (*it)->Name; ifwCmd += "," + (*it)->Name;
++it; ++it;
} }
} }
ifwCmd += " " + this->toplevel + "/repository"; ifwCmd += " " + this->toplevel + "/repository";
cmCPackLogger(cmCPackLog::LOG_VERBOSE, "Execute: " << ifwCmd cmCPackLogger(cmCPackLog::LOG_VERBOSE, "Execute: " << ifwCmd << std::endl);
<< std::endl);
std::string output; std::string output;
int retVal = 1; int retVal = 1;
cmCPackLogger(cmCPackLog::LOG_OUTPUT, cmCPackLogger(cmCPackLog::LOG_OUTPUT, "- Generate repository"
"- Generate repository" << std::endl); << std::endl);
bool res = cmSystemTools::RunSingleCommand( bool res = cmSystemTools::RunSingleCommand(
ifwCmd.c_str(), &output, &output, ifwCmd.c_str(), &output, &output, &retVal, 0, this->GeneratorVerbose, 0);
&retVal, 0, this->GeneratorVerbose, 0); if (!res || retVal) {
if ( !res || retVal )
{
cmGeneratedFileStream ofs(ifwTmpFile.c_str()); cmGeneratedFileStream ofs(ifwTmpFile.c_str());
ofs << "# Run command: " << ifwCmd << std::endl ofs << "# Run command: " << ifwCmd << std::endl
<< "# Output:" << std::endl << "# Output:" << std::endl
@ -127,8 +117,8 @@ int cmCPackIFWGenerator::PackageFiles()
<< std::endl); << std::endl);
return 0; return 0;
} }
cmCPackLogger(cmCPackLog::LOG_OUTPUT, "- repository: " << this->toplevel cmCPackLogger(cmCPackLog::LOG_OUTPUT, "- repository: "
<< "/repository generated" << std::endl); << this->toplevel << "/repository generated" << std::endl);
} }
// Run binary creator // Run binary creator
@ -137,39 +127,30 @@ int cmCPackIFWGenerator::PackageFiles()
ifwCmd += " -c " + this->toplevel + "/config/config.xml"; ifwCmd += " -c " + this->toplevel + "/config/config.xml";
ifwCmd += " -p " + this->toplevel + "/packages"; ifwCmd += " -p " + this->toplevel + "/packages";
if(!PkgsDirsVector.empty()) if (!PkgsDirsVector.empty()) {
{ for (std::vector<std::string>::iterator it = PkgsDirsVector.begin();
for(std::vector<std::string>::iterator it = PkgsDirsVector.begin(); it != PkgsDirsVector.end(); ++it) {
it != PkgsDirsVector.end(); ++it)
{
ifwCmd += " -p " + *it; ifwCmd += " -p " + *it;
} }
} }
if (OnlineOnly) if (OnlineOnly) {
{
ifwCmd += " --online-only"; ifwCmd += " --online-only";
} } else if (!DownloadedPackages.empty() &&
else if (!DownloadedPackages.empty() && !Installer.Repositories.empty()) !Installer.Repositories.empty()) {
{
ifwCmd += " -e "; ifwCmd += " -e ";
std::set<cmCPackIFWPackage*>::iterator it std::set<cmCPackIFWPackage*>::iterator it = DownloadedPackages.begin();
= DownloadedPackages.begin();
ifwCmd += (*it)->Name; ifwCmd += (*it)->Name;
++it; ++it;
while(it != DownloadedPackages.end()) while (it != DownloadedPackages.end()) {
{
ifwCmd += "," + (*it)->Name; ifwCmd += "," + (*it)->Name;
++it; ++it;
} }
} } else if (!DependentPackages.empty()) {
else if (!DependentPackages.empty())
{
ifwCmd += " -i "; ifwCmd += " -i ";
// Binary // Binary
std::set<cmCPackIFWPackage*>::iterator bit = BinaryPackages.begin(); std::set<cmCPackIFWPackage*>::iterator bit = BinaryPackages.begin();
while(bit != BinaryPackages.end()) while (bit != BinaryPackages.end()) {
{
ifwCmd += (*bit)->Name + ","; ifwCmd += (*bit)->Name + ",";
++bit; ++bit;
} }
@ -177,31 +158,24 @@ int cmCPackIFWGenerator::PackageFiles()
DependenceMap::iterator it = DependentPackages.begin(); DependenceMap::iterator it = DependentPackages.begin();
ifwCmd += it->second.Name; ifwCmd += it->second.Name;
++it; ++it;
while(it != DependentPackages.end()) while (it != DependentPackages.end()) {
{
ifwCmd += "," + it->second.Name; ifwCmd += "," + it->second.Name;
++it; ++it;
} }
} }
// TODO: set correct name for multipackages // TODO: set correct name for multipackages
if (!this->packageFileNames.empty()) if (!this->packageFileNames.empty()) {
{
ifwCmd += " " + packageFileNames[0]; ifwCmd += " " + packageFileNames[0];
} } else {
else
{
ifwCmd += " installer"; ifwCmd += " installer";
} }
cmCPackLogger(cmCPackLog::LOG_VERBOSE, "Execute: " << ifwCmd cmCPackLogger(cmCPackLog::LOG_VERBOSE, "Execute: " << ifwCmd << std::endl);
<< std::endl);
std::string output; std::string output;
int retVal = 1; int retVal = 1;
cmCPackLogger(cmCPackLog::LOG_OUTPUT, "- Generate package" << std::endl); cmCPackLogger(cmCPackLog::LOG_OUTPUT, "- Generate package" << std::endl);
bool res = cmSystemTools::RunSingleCommand( bool res = cmSystemTools::RunSingleCommand(
ifwCmd.c_str(), &output, &output, ifwCmd.c_str(), &output, &output, &retVal, 0, this->GeneratorVerbose, 0);
&retVal, 0, this->GeneratorVerbose, 0); if (!res || retVal) {
if ( !res || retVal )
{
cmGeneratedFileStream ofs(ifwTmpFile.c_str()); cmGeneratedFileStream ofs(ifwTmpFile.c_str());
ofs << "# Run command: " << ifwCmd << std::endl ofs << "# Run command: " << ifwCmd << std::endl
<< "# Output:" << std::endl << "# Output:" << std::endl
@ -217,14 +191,13 @@ int cmCPackIFWGenerator::PackageFiles()
return 1; return 1;
} }
const char *cmCPackIFWGenerator::GetPackagingInstallPrefix() const char* cmCPackIFWGenerator::GetPackagingInstallPrefix()
{ {
const char *defPrefix = cmCPackGenerator::GetPackagingInstallPrefix(); const char* defPrefix = cmCPackGenerator::GetPackagingInstallPrefix();
std::string tmpPref = defPrefix ? defPrefix : ""; std::string tmpPref = defPrefix ? defPrefix : "";
if(this->Components.empty()) if (this->Components.empty()) {
{
tmpPref += "packages/" + GetRootPackageName() + "/data"; tmpPref += "packages/" + GetRootPackageName() + "/data";
} }
@ -233,7 +206,7 @@ const char *cmCPackIFWGenerator::GetPackagingInstallPrefix()
return this->GetOption("CPACK_IFW_PACKAGING_INSTALL_PREFIX"); return this->GetOption("CPACK_IFW_PACKAGING_INSTALL_PREFIX");
} }
const char *cmCPackIFWGenerator::GetOutputExtension() const char* cmCPackIFWGenerator::GetOutputExtension()
{ {
return ExecutableSuffix.c_str(); return ExecutableSuffix.c_str();
} }
@ -246,27 +219,21 @@ int cmCPackIFWGenerator::InitializeInternal()
const std::string RepoGenOpt = "CPACK_IFW_REPOGEN_EXECUTABLE"; const std::string RepoGenOpt = "CPACK_IFW_REPOGEN_EXECUTABLE";
const std::string FrameworkVersionOpt = "CPACK_IFW_FRAMEWORK_VERSION"; const std::string FrameworkVersionOpt = "CPACK_IFW_FRAMEWORK_VERSION";
if(!this->IsSet(BinCreatorOpt) || if (!this->IsSet(BinCreatorOpt) || !this->IsSet(RepoGenOpt) ||
!this->IsSet(RepoGenOpt) || !this->IsSet(FrameworkVersionOpt)) {
!this->IsSet(FrameworkVersionOpt))
{
this->ReadListFile("CPackIFW.cmake"); this->ReadListFile("CPackIFW.cmake");
} }
// Look 'binarycreator' executable (needs) // Look 'binarycreator' executable (needs)
const char *BinCreatorStr = this->GetOption(BinCreatorOpt); const char* BinCreatorStr = this->GetOption(BinCreatorOpt);
if(!BinCreatorStr || cmSystemTools::IsNOTFOUND(BinCreatorStr)) if (!BinCreatorStr || cmSystemTools::IsNOTFOUND(BinCreatorStr)) {
{
BinCreator = ""; BinCreator = "";
} } else {
else
{
BinCreator = BinCreatorStr; BinCreator = BinCreatorStr;
} }
if (BinCreator.empty()) if (BinCreator.empty()) {
{
cmCPackLogger(cmCPackLog::LOG_ERROR, cmCPackLogger(cmCPackLog::LOG_ERROR,
"Cannot find QtIFW compiler \"binarycreator\": " "Cannot find QtIFW compiler \"binarycreator\": "
"likely it is not installed, or not in your PATH" "likely it is not installed, or not in your PATH"
@ -276,24 +243,17 @@ int cmCPackIFWGenerator::InitializeInternal()
// Look 'repogen' executable (optional) // Look 'repogen' executable (optional)
const char *RepoGenStr = this->GetOption(RepoGenOpt); const char* RepoGenStr = this->GetOption(RepoGenOpt);
if(!RepoGenStr || cmSystemTools::IsNOTFOUND(RepoGenStr)) if (!RepoGenStr || cmSystemTools::IsNOTFOUND(RepoGenStr)) {
{
RepoGen = ""; RepoGen = "";
} } else {
else
{
RepoGen = RepoGenStr; RepoGen = RepoGenStr;
} }
// Framework version // Framework version
if(const char* FrameworkVersionSrt = if (const char* FrameworkVersionSrt = this->GetOption(FrameworkVersionOpt)) {
this->GetOption(FrameworkVersionOpt))
{
FrameworkVersion = FrameworkVersionSrt; FrameworkVersion = FrameworkVersionSrt;
} } else {
else
{
FrameworkVersion = "1.9.9"; FrameworkVersion = "1.9.9";
} }
@ -304,28 +264,20 @@ int cmCPackIFWGenerator::InitializeInternal()
// Additional packages dirs // Additional packages dirs
PkgsDirsVector.clear(); PkgsDirsVector.clear();
if(const char* dirs = this->GetOption("CPACK_IFW_PACKAGES_DIRECTORIES")) if (const char* dirs = this->GetOption("CPACK_IFW_PACKAGES_DIRECTORIES")) {
{ cmSystemTools::ExpandListArgument(dirs, PkgsDirsVector);
cmSystemTools::ExpandListArgument(dirs,
PkgsDirsVector);
} }
// Installer // Installer
Installer.Generator = this; Installer.Generator = this;
Installer.ConfigureFromOptions(); Installer.ConfigureFromOptions();
if (const char* ifwDownloadAll = if (const char* ifwDownloadAll = this->GetOption("CPACK_IFW_DOWNLOAD_ALL")) {
this->GetOption("CPACK_IFW_DOWNLOAD_ALL"))
{
OnlineOnly = cmSystemTools::IsOn(ifwDownloadAll); OnlineOnly = cmSystemTools::IsOn(ifwDownloadAll);
} } else if (const char* cpackDownloadAll =
else if (const char* cpackDownloadAll = this->GetOption("CPACK_DOWNLOAD_ALL")) {
this->GetOption("CPACK_DOWNLOAD_ALL"))
{
OnlineOnly = cmSystemTools::IsOn(cpackDownloadAll); OnlineOnly = cmSystemTools::IsOn(cpackDownloadAll);
} } else {
else
{
OnlineOnly = false; OnlineOnly = false;
} }
@ -338,28 +290,22 @@ int cmCPackIFWGenerator::InitializeInternal()
} }
// Executable suffix // Executable suffix
if(const char *optExeSuffix = this->GetOption("CMAKE_EXECUTABLE_SUFFIX")) if (const char* optExeSuffix = this->GetOption("CMAKE_EXECUTABLE_SUFFIX")) {
{
ExecutableSuffix = optExeSuffix; ExecutableSuffix = optExeSuffix;
if(ExecutableSuffix.empty()) if (ExecutableSuffix.empty()) {
{
std::string sysName(this->GetOption("CMAKE_SYSTEM_NAME")); std::string sysName(this->GetOption("CMAKE_SYSTEM_NAME"));
if(sysName == "Linux") if (sysName == "Linux") {
{
ExecutableSuffix = ".run"; ExecutableSuffix = ".run";
} }
} }
} } else {
else
{
ExecutableSuffix = cmCPackGenerator::GetOutputExtension(); ExecutableSuffix = cmCPackGenerator::GetOutputExtension();
} }
return this->Superclass::InitializeInternal(); return this->Superclass::InitializeInternal();
} }
std::string std::string cmCPackIFWGenerator::GetComponentInstallDirNameSuffix(
cmCPackIFWGenerator::GetComponentInstallDirNameSuffix(
const std::string& componentName) const std::string& componentName)
{ {
const std::string prefix = "packages/"; const std::string prefix = "packages/";
@ -369,92 +315,78 @@ cmCPackIFWGenerator::GetComponentInstallDirNameSuffix(
return std::string(prefix + GetRootPackageName() + suffix); return std::string(prefix + GetRootPackageName() + suffix);
} }
return prefix return prefix + GetComponentPackageName(&Components[componentName]) + suffix;
+ GetComponentPackageName(&Components[componentName])
+ suffix;
} }
cmCPackComponent* cmCPackComponent* cmCPackIFWGenerator::GetComponent(
cmCPackIFWGenerator::GetComponent(const std::string &projectName, const std::string& projectName, const std::string& componentName)
const std::string &componentName)
{ {
ComponentsMap::iterator cit = Components.find(componentName); ComponentsMap::iterator cit = Components.find(componentName);
if ( cit != Components.end() ) return &(cit->second); if (cit != Components.end())
return &(cit->second);
cmCPackComponent* component cmCPackComponent* component =
= cmCPackGenerator::GetComponent(projectName, componentName); cmCPackGenerator::GetComponent(projectName, componentName);
if(!component) return component; if (!component)
return component;
std::string name = GetComponentPackageName(component); std::string name = GetComponentPackageName(component);
PackagesMap::iterator pit = Packages.find(name); PackagesMap::iterator pit = Packages.find(name);
if(pit != Packages.end()) return component; if (pit != Packages.end())
return component;
cmCPackIFWPackage *package = &Packages[name]; cmCPackIFWPackage* package = &Packages[name];
package->Name = name; package->Name = name;
package->Generator = this; package->Generator = this;
if(package->ConfigureFromComponent(component)) if (package->ConfigureFromComponent(component)) {
{
package->Installer = &Installer; package->Installer = &Installer;
Installer.Packages.insert( Installer.Packages.insert(
std::pair<std::string, cmCPackIFWPackage*>( std::pair<std::string, cmCPackIFWPackage*>(name, package));
name, package));
ComponentPackages.insert( ComponentPackages.insert(
std::pair<cmCPackComponent*, cmCPackIFWPackage*>( std::pair<cmCPackComponent*, cmCPackIFWPackage*>(component, package));
component, package)); if (component->IsDownloaded) {
if(component->IsDownloaded)
{
DownloadedPackages.insert(package); DownloadedPackages.insert(package);
} } else {
else
{
BinaryPackages.insert(package); BinaryPackages.insert(package);
} }
} } else {
else
{
Packages.erase(name); Packages.erase(name);
cmCPackLogger(cmCPackLog::LOG_ERROR, cmCPackLogger(cmCPackLog::LOG_ERROR, "Cannot configure package \""
"Cannot configure package \"" << name << << name << "\" for component \"" << component->Name << "\""
"\" for component \"" << component->Name << "\""
<< std::endl); << std::endl);
} }
return component; return component;
} }
cmCPackComponentGroup* cmCPackComponentGroup* cmCPackIFWGenerator::GetComponentGroup(
cmCPackIFWGenerator::GetComponentGroup(const std::string &projectName, const std::string& projectName, const std::string& groupName)
const std::string &groupName)
{ {
cmCPackComponentGroup* group cmCPackComponentGroup* group =
= cmCPackGenerator::GetComponentGroup(projectName, groupName); cmCPackGenerator::GetComponentGroup(projectName, groupName);
if(!group) return group; if (!group)
return group;
std::string name = GetGroupPackageName(group); std::string name = GetGroupPackageName(group);
PackagesMap::iterator pit = Packages.find(name); PackagesMap::iterator pit = Packages.find(name);
if(pit != Packages.end()) return group; if (pit != Packages.end())
return group;
cmCPackIFWPackage *package = &Packages[name]; cmCPackIFWPackage* package = &Packages[name];
package->Name = name; package->Name = name;
package->Generator = this; package->Generator = this;
if(package->ConfigureFromGroup(group)) if (package->ConfigureFromGroup(group)) {
{
package->Installer = &Installer; package->Installer = &Installer;
Installer.Packages.insert( Installer.Packages.insert(
std::pair<std::string, cmCPackIFWPackage*>( std::pair<std::string, cmCPackIFWPackage*>(name, package));
name, package));
GroupPackages.insert( GroupPackages.insert(
std::pair<cmCPackComponentGroup*, cmCPackIFWPackage*>( std::pair<cmCPackComponentGroup*, cmCPackIFWPackage*>(group, package));
group, package));
BinaryPackages.insert(package); BinaryPackages.insert(package);
} } else {
else
{
Packages.erase(name); Packages.erase(name);
cmCPackLogger(cmCPackLog::LOG_ERROR, cmCPackLogger(cmCPackLog::LOG_ERROR, "Cannot configure package \""
"Cannot configure package \"" << name << << name << "\" for component group \"" << group->Name
"\" for component group \"" << group->Name << "\"" << "\"" << std::endl);
<< std::endl);
} }
return group; return group;
} }
@ -485,53 +417,44 @@ std::string cmCPackIFWGenerator::GetRootPackageName()
// Default value // Default value
std::string name = "root"; std::string name = "root";
if (const char* optIFW_PACKAGE_GROUP = if (const char* optIFW_PACKAGE_GROUP =
this->GetOption("CPACK_IFW_PACKAGE_GROUP")) this->GetOption("CPACK_IFW_PACKAGE_GROUP")) {
{
// Configure from root group // Configure from root group
cmCPackIFWPackage package; cmCPackIFWPackage package;
package.Generator = this; package.Generator = this;
package.ConfigureFromGroup(optIFW_PACKAGE_GROUP); package.ConfigureFromGroup(optIFW_PACKAGE_GROUP);
name = package.Name; name = package.Name;
} } else if (const char* optIFW_PACKAGE_NAME =
else if (const char* optIFW_PACKAGE_NAME = this->GetOption("CPACK_IFW_PACKAGE_NAME")) {
this->GetOption("CPACK_IFW_PACKAGE_NAME"))
{
// Configure from root package name // Configure from root package name
name = optIFW_PACKAGE_NAME; name = optIFW_PACKAGE_NAME;
} } else if (const char* optPACKAGE_NAME =
else if (const char* optPACKAGE_NAME = this->GetOption("CPACK_PACKAGE_NAME")) {
this->GetOption("CPACK_PACKAGE_NAME"))
{
// Configure from package name // Configure from package name
name = optPACKAGE_NAME; name = optPACKAGE_NAME;
} }
return name; return name;
} }
std::string std::string cmCPackIFWGenerator::GetGroupPackageName(
cmCPackIFWGenerator::GetGroupPackageName(cmCPackComponentGroup *group) const cmCPackComponentGroup* group) const
{ {
std::string name; std::string name;
if (!group) return name; if (!group)
if (cmCPackIFWPackage* package = GetGroupPackage(group)) return name;
{ if (cmCPackIFWPackage* package = GetGroupPackage(group)) {
return package->Name; return package->Name;
} }
const char* option = GetOption( const char* option =
"CPACK_IFW_COMPONENT_GROUP_" GetOption("CPACK_IFW_COMPONENT_GROUP_" +
+ cmsys::SystemTools::UpperCase(group->Name) cmsys::SystemTools::UpperCase(group->Name) + "_NAME");
+ "_NAME");
name = option ? option : group->Name; name = option ? option : group->Name;
if(group->ParentGroup) if (group->ParentGroup) {
{
cmCPackIFWPackage* package = GetGroupPackage(group->ParentGroup); cmCPackIFWPackage* package = GetGroupPackage(group->ParentGroup);
bool dot = !ResolveDuplicateNames; bool dot = !ResolveDuplicateNames;
if(dot && name.substr(0, package->Name.size()) == package->Name) if (dot && name.substr(0, package->Name.size()) == package->Name) {
{
dot = false; dot = false;
} }
if(dot) if (dot) {
{
name = package->Name + "." + name; name = package->Name + "." + name;
} }
} }
@ -539,34 +462,29 @@ cmCPackIFWGenerator::GetGroupPackageName(cmCPackComponentGroup *group) const
} }
std::string cmCPackIFWGenerator::GetComponentPackageName( std::string cmCPackIFWGenerator::GetComponentPackageName(
cmCPackComponent *component) const cmCPackComponent* component) const
{ {
std::string name; std::string name;
if (!component) return name; if (!component)
if (cmCPackIFWPackage* package = GetComponentPackage(component)) return name;
{ if (cmCPackIFWPackage* package = GetComponentPackage(component)) {
return package->Name; return package->Name;
} }
std::string prefix = "CPACK_IFW_COMPONENT_" std::string prefix = "CPACK_IFW_COMPONENT_" +
+ cmsys::SystemTools::UpperCase(component->Name) cmsys::SystemTools::UpperCase(component->Name) + "_";
+ "_";
const char* option = GetOption(prefix + "NAME"); const char* option = GetOption(prefix + "NAME");
name = option ? option : component->Name; name = option ? option : component->Name;
if(component->Group) if (component->Group) {
{
cmCPackIFWPackage* package = GetGroupPackage(component->Group); cmCPackIFWPackage* package = GetGroupPackage(component->Group);
if((componentPackageMethod == ONE_PACKAGE_PER_GROUP) if ((componentPackageMethod == ONE_PACKAGE_PER_GROUP) ||
|| IsOn(prefix + "COMMON")) IsOn(prefix + "COMMON")) {
{
return package->Name; return package->Name;
} }
bool dot = !ResolveDuplicateNames; bool dot = !ResolveDuplicateNames;
if(dot && name.substr(0, package->Name.size()) == package->Name) if (dot && name.substr(0, package->Name.size()) == package->Name) {
{
dot = false; dot = false;
} }
if(dot) if (dot) {
{
name = package->Name + "." + name; name = package->Name + "." + name;
} }
} }
@ -574,32 +492,29 @@ std::string cmCPackIFWGenerator::GetComponentPackageName(
} }
cmCPackIFWPackage* cmCPackIFWGenerator::GetGroupPackage( cmCPackIFWPackage* cmCPackIFWGenerator::GetGroupPackage(
cmCPackComponentGroup *group) const cmCPackComponentGroup* group) const
{ {
std::map<cmCPackComponentGroup*, cmCPackIFWPackage*>::const_iterator pit std::map<cmCPackComponentGroup*, cmCPackIFWPackage*>::const_iterator pit =
= GroupPackages.find(group); GroupPackages.find(group);
return pit != GroupPackages.end() ? pit->second : 0; return pit != GroupPackages.end() ? pit->second : 0;
} }
cmCPackIFWPackage* cmCPackIFWGenerator::GetComponentPackage( cmCPackIFWPackage* cmCPackIFWGenerator::GetComponentPackage(
cmCPackComponent *component) const cmCPackComponent* component) const
{ {
std::map<cmCPackComponent*, cmCPackIFWPackage*>::const_iterator pit std::map<cmCPackComponent*, cmCPackIFWPackage*>::const_iterator pit =
= ComponentPackages.find(component); ComponentPackages.find(component);
return pit != ComponentPackages.end() ? pit->second : 0; return pit != ComponentPackages.end() ? pit->second : 0;
} }
void cmCPackIFWGenerator::WriteGeneratedByToStrim(cmXMLWriter &xout) void cmCPackIFWGenerator::WriteGeneratedByToStrim(cmXMLWriter& xout)
{ {
std::stringstream comment; std::stringstream comment;
comment << "Generated by CPack " << CMake_VERSION << " IFW generator " comment << "Generated by CPack " << CMake_VERSION << " IFW generator "
<< "for QtIFW "; << "for QtIFW ";
if(IsVersionLess("2.0")) if (IsVersionLess("2.0")) {
{
comment << "less 2.0"; comment << "less 2.0";
} } else {
else
{
comment << FrameworkVersion; comment << FrameworkVersion;
} }
comment << " tools at " << cmTimestamp().CurrentTime("", true); comment << " tools at " << cmTimestamp().CurrentTime("", true);

View File

@ -49,17 +49,17 @@ public:
/** /**
* Compare \a version with QtIFW framework version * Compare \a version with QtIFW framework version
*/ */
bool IsVersionLess(const char *version); bool IsVersionLess(const char* version);
/** /**
* Compare \a version with QtIFW framework version * Compare \a version with QtIFW framework version
*/ */
bool IsVersionGreater(const char *version); bool IsVersionGreater(const char* version);
/** /**
* Compare \a version with QtIFW framework version * Compare \a version with QtIFW framework version
*/ */
bool IsVersionEqual(const char *version); bool IsVersionEqual(const char* version);
protected: protected:
// cmCPackGenerator reimplementation // cmCPackGenerator reimplementation
@ -90,8 +90,7 @@ protected:
* *
* @return Pointer to component * @return Pointer to component
*/ */
virtual cmCPackComponent* GetComponent( virtual cmCPackComponent* GetComponent(const std::string& projectName,
const std::string& projectName,
const std::string& componentName); const std::string& componentName);
/** /**
@ -104,8 +103,7 @@ protected:
* @return Pointer to component group * @return Pointer to component group
*/ */
virtual cmCPackComponentGroup* GetComponentGroup( virtual cmCPackComponentGroup* GetComponentGroup(
const std::string& projectName, const std::string& projectName, const std::string& groupName);
const std::string& groupName);
enum cmCPackGenerator::CPackSetDestdirSupport SupportsSetDestdir() const; enum cmCPackGenerator::CPackSetDestdirSupport SupportsSetDestdir() const;
virtual bool SupportsAbsoluteDestination() const; virtual bool SupportsAbsoluteDestination() const;
@ -118,11 +116,11 @@ protected:
std::string GetRootPackageName(); std::string GetRootPackageName();
std::string GetGroupPackageName(cmCPackComponentGroup *group) const; std::string GetGroupPackageName(cmCPackComponentGroup* group) const;
std::string GetComponentPackageName(cmCPackComponent *component) const; std::string GetComponentPackageName(cmCPackComponent* component) const;
cmCPackIFWPackage* GetGroupPackage(cmCPackComponentGroup *group) const; cmCPackIFWPackage* GetGroupPackage(cmCPackComponentGroup* group) const;
cmCPackIFWPackage* GetComponentPackage(cmCPackComponent *component) const; cmCPackIFWPackage* GetComponentPackage(cmCPackComponent* component) const;
void WriteGeneratedByToStrim(cmXMLWriter& xout); void WriteGeneratedByToStrim(cmXMLWriter& xout);

View File

@ -20,299 +20,229 @@
#include <cmXMLWriter.h> #include <cmXMLWriter.h>
#ifdef cmCPackLogger #ifdef cmCPackLogger
# undef cmCPackLogger #undef cmCPackLogger
#endif #endif
#define cmCPackLogger(logType, msg) \ #define cmCPackLogger(logType, msg) \
do { \ do { \
std::ostringstream cmCPackLog_msg; \ std::ostringstream cmCPackLog_msg; \
cmCPackLog_msg << msg; \ cmCPackLog_msg << msg; \
if(Generator) { \ if (Generator) { \
Generator->Logger->Log(logType, __FILE__, __LINE__, \ Generator->Logger->Log(logType, __FILE__, __LINE__, \
cmCPackLog_msg.str().c_str()); \ cmCPackLog_msg.str().c_str()); \
} \ } \
} while ( 0 ) } while (0)
cmCPackIFWInstaller::cmCPackIFWInstaller() : cmCPackIFWInstaller::cmCPackIFWInstaller()
Generator(0) : Generator(0)
{ {
} }
const char *cmCPackIFWInstaller::GetOption(const std::string &op) const const char* cmCPackIFWInstaller::GetOption(const std::string& op) const
{ {
return Generator ? Generator->GetOption(op) : 0; return Generator ? Generator->GetOption(op) : 0;
} }
bool cmCPackIFWInstaller::IsOn(const std::string &op) const bool cmCPackIFWInstaller::IsOn(const std::string& op) const
{ {
return Generator ? Generator->IsOn(op) : false; return Generator ? Generator->IsOn(op) : false;
} }
bool cmCPackIFWInstaller::IsVersionLess(const char *version) bool cmCPackIFWInstaller::IsVersionLess(const char* version)
{ {
return Generator ? Generator->IsVersionLess(version) : false; return Generator ? Generator->IsVersionLess(version) : false;
} }
bool cmCPackIFWInstaller::IsVersionGreater(const char *version) bool cmCPackIFWInstaller::IsVersionGreater(const char* version)
{ {
return Generator ? Generator->IsVersionGreater(version) : false; return Generator ? Generator->IsVersionGreater(version) : false;
} }
bool cmCPackIFWInstaller::IsVersionEqual(const char *version) bool cmCPackIFWInstaller::IsVersionEqual(const char* version)
{ {
return Generator ? Generator->IsVersionEqual(version) : false; return Generator ? Generator->IsVersionEqual(version) : false;
} }
void cmCPackIFWInstaller::ConfigureFromOptions() void cmCPackIFWInstaller::ConfigureFromOptions()
{ {
// Name; // Name;
if (const char* optIFW_PACKAGE_NAME = if (const char* optIFW_PACKAGE_NAME =
this->GetOption("CPACK_IFW_PACKAGE_NAME")) this->GetOption("CPACK_IFW_PACKAGE_NAME")) {
{
Name = optIFW_PACKAGE_NAME; Name = optIFW_PACKAGE_NAME;
} } else if (const char* optPACKAGE_NAME =
else if (const char* optPACKAGE_NAME = this->GetOption("CPACK_PACKAGE_NAME")) {
this->GetOption("CPACK_PACKAGE_NAME"))
{
Name = optPACKAGE_NAME; Name = optPACKAGE_NAME;
} } else {
else
{
Name = "Your package"; Name = "Your package";
} }
// Title; // Title;
if (const char* optIFW_PACKAGE_TITLE = if (const char* optIFW_PACKAGE_TITLE =
GetOption("CPACK_IFW_PACKAGE_TITLE")) GetOption("CPACK_IFW_PACKAGE_TITLE")) {
{
Title = optIFW_PACKAGE_TITLE; Title = optIFW_PACKAGE_TITLE;
} } else if (const char* optPACKAGE_DESCRIPTION_SUMMARY =
else if (const char* optPACKAGE_DESCRIPTION_SUMMARY = GetOption("CPACK_PACKAGE_DESCRIPTION_SUMMARY")) {
GetOption("CPACK_PACKAGE_DESCRIPTION_SUMMARY"))
{
Title = optPACKAGE_DESCRIPTION_SUMMARY; Title = optPACKAGE_DESCRIPTION_SUMMARY;
} } else {
else
{
Title = "Your package description"; Title = "Your package description";
} }
// Version; // Version;
if (const char* option = GetOption("CPACK_PACKAGE_VERSION")) if (const char* option = GetOption("CPACK_PACKAGE_VERSION")) {
{
Version = option; Version = option;
} } else {
else
{
Version = "1.0.0"; Version = "1.0.0";
} }
// Publisher // Publisher
if(const char* optIFW_PACKAGE_PUBLISHER = if (const char* optIFW_PACKAGE_PUBLISHER =
GetOption("CPACK_IFW_PACKAGE_PUBLISHER")) GetOption("CPACK_IFW_PACKAGE_PUBLISHER")) {
{
Publisher = optIFW_PACKAGE_PUBLISHER; Publisher = optIFW_PACKAGE_PUBLISHER;
} } else if (const char* optPACKAGE_VENDOR =
else if(const char* optPACKAGE_VENDOR = GetOption("CPACK_PACKAGE_VENDOR")) GetOption("CPACK_PACKAGE_VENDOR")) {
{
Publisher = optPACKAGE_VENDOR; Publisher = optPACKAGE_VENDOR;
} }
// ProductUrl // ProductUrl
if(const char* option = GetOption("CPACK_IFW_PRODUCT_URL")) if (const char* option = GetOption("CPACK_IFW_PRODUCT_URL")) {
{
ProductUrl = option; ProductUrl = option;
} }
// ApplicationIcon // ApplicationIcon
if(const char* option = GetOption("CPACK_IFW_PACKAGE_ICON")) if (const char* option = GetOption("CPACK_IFW_PACKAGE_ICON")) {
{ if (cmSystemTools::FileExists(option)) {
if(cmSystemTools::FileExists(option))
{
InstallerApplicationIcon = option; InstallerApplicationIcon = option;
} } else {
else
{
// TODO: implement warning // TODO: implement warning
} }
} }
// WindowIcon // WindowIcon
if(const char* option = GetOption("CPACK_IFW_PACKAGE_WINDOW_ICON")) if (const char* option = GetOption("CPACK_IFW_PACKAGE_WINDOW_ICON")) {
{ if (cmSystemTools::FileExists(option)) {
if(cmSystemTools::FileExists(option))
{
InstallerWindowIcon = option; InstallerWindowIcon = option;
} } else {
else
{
// TODO: implement warning // TODO: implement warning
} }
} }
// Logo // Logo
if(const char* option = GetOption("CPACK_IFW_PACKAGE_LOGO")) if (const char* option = GetOption("CPACK_IFW_PACKAGE_LOGO")) {
{ if (cmSystemTools::FileExists(option)) {
if(cmSystemTools::FileExists(option))
{
Logo = option; Logo = option;
} } else {
else
{
// TODO: implement warning // TODO: implement warning
} }
} }
// Start menu // Start menu
if (const char* optIFW_START_MENU_DIR = if (const char* optIFW_START_MENU_DIR =
this->GetOption("CPACK_IFW_PACKAGE_START_MENU_DIRECTORY")) this->GetOption("CPACK_IFW_PACKAGE_START_MENU_DIRECTORY")) {
{
StartMenuDir = optIFW_START_MENU_DIR; StartMenuDir = optIFW_START_MENU_DIR;
} } else {
else
{
StartMenuDir = Name; StartMenuDir = Name;
} }
// Default target directory for installation // Default target directory for installation
if (const char* optIFW_TARGET_DIRECTORY = if (const char* optIFW_TARGET_DIRECTORY =
GetOption("CPACK_IFW_TARGET_DIRECTORY")) GetOption("CPACK_IFW_TARGET_DIRECTORY")) {
{
TargetDir = optIFW_TARGET_DIRECTORY; TargetDir = optIFW_TARGET_DIRECTORY;
} } else if (const char* optPACKAGE_INSTALL_DIRECTORY =
else if (const char *optPACKAGE_INSTALL_DIRECTORY = GetOption("CPACK_PACKAGE_INSTALL_DIRECTORY")) {
GetOption("CPACK_PACKAGE_INSTALL_DIRECTORY"))
{
TargetDir = "@ApplicationsDir@/"; TargetDir = "@ApplicationsDir@/";
TargetDir += optPACKAGE_INSTALL_DIRECTORY; TargetDir += optPACKAGE_INSTALL_DIRECTORY;
} } else {
else
{
TargetDir = "@RootDir@/usr/local"; TargetDir = "@RootDir@/usr/local";
} }
// Default target directory for installation with administrator rights // Default target directory for installation with administrator rights
if (const char* option = GetOption("CPACK_IFW_ADMIN_TARGET_DIRECTORY")) if (const char* option = GetOption("CPACK_IFW_ADMIN_TARGET_DIRECTORY")) {
{
AdminTargetDir = option; AdminTargetDir = option;
} }
// Repositories // Repositories
Repositories.clear(); Repositories.clear();
RepositoryStruct Repo; RepositoryStruct Repo;
if(const char *site = this->GetOption("CPACK_DOWNLOAD_SITE")) if (const char* site = this->GetOption("CPACK_DOWNLOAD_SITE")) {
{
Repo.Url = site; Repo.Url = site;
Repositories.push_back(Repo); Repositories.push_back(Repo);
} }
if(const char *RepoAllStr = this->GetOption("CPACK_IFW_REPOSITORIES_ALL")) if (const char* RepoAllStr = this->GetOption("CPACK_IFW_REPOSITORIES_ALL")) {
{
std::vector<std::string> RepoAllVector; std::vector<std::string> RepoAllVector;
cmSystemTools::ExpandListArgument(RepoAllStr, cmSystemTools::ExpandListArgument(RepoAllStr, RepoAllVector);
RepoAllVector); for (std::vector<std::string>::iterator rit = RepoAllVector.begin();
for(std::vector<std::string>::iterator rit != RepoAllVector.end(); ++rit) {
rit = RepoAllVector.begin(); rit != RepoAllVector.end(); ++rit) std::string prefix =
{ "CPACK_IFW_REPOSITORY_" + cmsys::SystemTools::UpperCase(*rit) + "_";
std::string prefix = "CPACK_IFW_REPOSITORY_"
+ cmsys::SystemTools::UpperCase(*rit)
+ "_";
// Url // Url
if (const char* url = GetOption(prefix + "URL")) if (const char* url = GetOption(prefix + "URL")) {
{
Repo.Url = url; Repo.Url = url;
} } else {
else
{
Repo.Url = ""; Repo.Url = "";
} }
// Enabled // Enabled
if (IsOn(prefix + "DISABLED")) if (IsOn(prefix + "DISABLED")) {
{
Repo.Enabled = "0"; Repo.Enabled = "0";
} } else {
else
{
Repo.Enabled = ""; Repo.Enabled = "";
} }
// Username // Username
if (const char* username = GetOption(prefix + "USERNAME")) if (const char* username = GetOption(prefix + "USERNAME")) {
{
Repo.Username = username; Repo.Username = username;
} } else {
else
{
Repo.Username = ""; Repo.Username = "";
} }
// Password // Password
if (const char* password = GetOption(prefix + "PASSWORD")) if (const char* password = GetOption(prefix + "PASSWORD")) {
{
Repo.Password = password; Repo.Password = password;
} } else {
else
{
Repo.Password = ""; Repo.Password = "";
} }
// DisplayName // DisplayName
if (const char* displayName = GetOption(prefix + "DISPLAY_NAME")) if (const char* displayName = GetOption(prefix + "DISPLAY_NAME")) {
{
Repo.DisplayName = displayName; Repo.DisplayName = displayName;
} } else {
else
{
Repo.DisplayName = ""; Repo.DisplayName = "";
} }
if(!Repo.Url.empty()) if (!Repo.Url.empty()) {
{
Repositories.push_back(Repo); Repositories.push_back(Repo);
} }
} }
} }
// Maintenance tool // Maintenance tool
if(const char* optIFW_MAINTENANCE_TOOL = if (const char* optIFW_MAINTENANCE_TOOL =
this->GetOption("CPACK_IFW_PACKAGE_MAINTENANCE_TOOL_NAME")) this->GetOption("CPACK_IFW_PACKAGE_MAINTENANCE_TOOL_NAME")) {
{
MaintenanceToolName = optIFW_MAINTENANCE_TOOL; MaintenanceToolName = optIFW_MAINTENANCE_TOOL;
} }
// Maintenance tool ini file // Maintenance tool ini file
if(const char* optIFW_MAINTENANCE_TOOL_INI = if (const char* optIFW_MAINTENANCE_TOOL_INI =
this->GetOption("CPACK_IFW_PACKAGE_MAINTENANCE_TOOL_INI_FILE")) this->GetOption("CPACK_IFW_PACKAGE_MAINTENANCE_TOOL_INI_FILE")) {
{
MaintenanceToolIniFile = optIFW_MAINTENANCE_TOOL_INI; MaintenanceToolIniFile = optIFW_MAINTENANCE_TOOL_INI;
} }
// Allow non-ASCII characters // Allow non-ASCII characters
if(this->GetOption("CPACK_IFW_PACKAGE_ALLOW_NON_ASCII_CHARACTERS")) if (this->GetOption("CPACK_IFW_PACKAGE_ALLOW_NON_ASCII_CHARACTERS")) {
{ if (IsOn("CPACK_IFW_PACKAGE_ALLOW_NON_ASCII_CHARACTERS")) {
if(IsOn("CPACK_IFW_PACKAGE_ALLOW_NON_ASCII_CHARACTERS"))
{
AllowNonAsciiCharacters = "true"; AllowNonAsciiCharacters = "true";
} } else {
else
{
AllowNonAsciiCharacters = "false"; AllowNonAsciiCharacters = "false";
} }
} }
// Space in path // Space in path
if(this->GetOption("CPACK_IFW_PACKAGE_ALLOW_SPACE_IN_PATH")) if (this->GetOption("CPACK_IFW_PACKAGE_ALLOW_SPACE_IN_PATH")) {
{ if (IsOn("CPACK_IFW_PACKAGE_ALLOW_SPACE_IN_PATH")) {
if(IsOn("CPACK_IFW_PACKAGE_ALLOW_SPACE_IN_PATH"))
{
AllowSpaceInPath = "true"; AllowSpaceInPath = "true";
} } else {
else
{
AllowSpaceInPath = "false"; AllowSpaceInPath = "false";
} }
} }
// Control script // Control script
if(const char* optIFW_CONTROL_SCRIPT = if (const char* optIFW_CONTROL_SCRIPT =
this->GetOption("CPACK_IFW_PACKAGE_CONTROL_SCRIPT")) this->GetOption("CPACK_IFW_PACKAGE_CONTROL_SCRIPT")) {
{
ControlScript = optIFW_CONTROL_SCRIPT; ControlScript = optIFW_CONTROL_SCRIPT;
} }
} }
@ -320,8 +250,7 @@ void cmCPackIFWInstaller::ConfigureFromOptions()
void cmCPackIFWInstaller::GenerateInstallerFile() void cmCPackIFWInstaller::GenerateInstallerFile()
{ {
// Lazy directory initialization // Lazy directory initialization
if(Directory.empty() && Generator) if (Directory.empty() && Generator) {
{
Directory = Generator->toplevel; Directory = Generator->toplevel;
} }
@ -339,41 +268,36 @@ void cmCPackIFWInstaller::GenerateInstallerFile()
xout.Element("Version", Version); xout.Element("Version", Version);
xout.Element("Title", Title); xout.Element("Title", Title);
if(!Publisher.empty()) if (!Publisher.empty()) {
{
xout.Element("Publisher", Publisher); xout.Element("Publisher", Publisher);
} }
if(!ProductUrl.empty()) if (!ProductUrl.empty()) {
{
xout.Element("ProductUrl", ProductUrl); xout.Element("ProductUrl", ProductUrl);
} }
// ApplicationIcon // ApplicationIcon
if(!InstallerApplicationIcon.empty()) if (!InstallerApplicationIcon.empty()) {
{
std::string name = std::string name =
cmSystemTools::GetFilenameName(InstallerApplicationIcon); cmSystemTools::GetFilenameName(InstallerApplicationIcon);
std::string path = Directory + "/config/" + name; std::string path = Directory + "/config/" + name;
name = cmSystemTools::GetFilenameWithoutExtension(name); name = cmSystemTools::GetFilenameWithoutExtension(name);
cmsys::SystemTools::CopyFileIfDifferent( cmsys::SystemTools::CopyFileIfDifferent(InstallerApplicationIcon.data(),
InstallerApplicationIcon.data(), path.data()); path.data());
xout.Element("InstallerApplicationIcon", name); xout.Element("InstallerApplicationIcon", name);
} }
// WindowIcon // WindowIcon
if(!InstallerWindowIcon.empty()) if (!InstallerWindowIcon.empty()) {
{
std::string name = cmSystemTools::GetFilenameName(InstallerWindowIcon); std::string name = cmSystemTools::GetFilenameName(InstallerWindowIcon);
std::string path = Directory + "/config/" + name; std::string path = Directory + "/config/" + name;
cmsys::SystemTools::CopyFileIfDifferent( cmsys::SystemTools::CopyFileIfDifferent(InstallerWindowIcon.data(),
InstallerWindowIcon.data(), path.data()); path.data());
xout.Element("InstallerWindowIcon", name); xout.Element("InstallerWindowIcon", name);
} }
// Logo // Logo
if(!Logo.empty()) if (!Logo.empty()) {
{
std::string name = cmSystemTools::GetFilenameName(Logo); std::string name = cmSystemTools::GetFilenameName(Logo);
std::string path = Directory + "/config/" + name; std::string path = Directory + "/config/" + name;
cmsys::SystemTools::CopyFileIfDifferent(Logo.data(), path.data()); cmsys::SystemTools::CopyFileIfDifferent(Logo.data(), path.data());
@ -381,51 +305,42 @@ void cmCPackIFWInstaller::GenerateInstallerFile()
} }
// Start menu // Start menu
if(!IsVersionLess("2.0")) if (!IsVersionLess("2.0")) {
{
xout.Element("StartMenuDir", StartMenuDir); xout.Element("StartMenuDir", StartMenuDir);
} }
// Target dir // Target dir
if(!TargetDir.empty()) if (!TargetDir.empty()) {
{
xout.Element("TargetDir", TargetDir); xout.Element("TargetDir", TargetDir);
} }
// Admin target dir // Admin target dir
if(!AdminTargetDir.empty()) if (!AdminTargetDir.empty()) {
{
xout.Element("AdminTargetDir", AdminTargetDir); xout.Element("AdminTargetDir", AdminTargetDir);
} }
// Remote repositories // Remote repositories
if (!Repositories.empty()) if (!Repositories.empty()) {
{
xout.StartElement("RemoteRepositories"); xout.StartElement("RemoteRepositories");
for(std::vector<RepositoryStruct>::iterator for (std::vector<RepositoryStruct>::iterator rit = Repositories.begin();
rit = Repositories.begin(); rit != Repositories.end(); ++rit) rit != Repositories.end(); ++rit) {
{
xout.StartElement("Repository"); xout.StartElement("Repository");
// Url // Url
xout.Element("Url", rit->Url); xout.Element("Url", rit->Url);
// Enabled // Enabled
if(!rit->Enabled.empty()) if (!rit->Enabled.empty()) {
{
xout.Element("Enabled", rit->Enabled); xout.Element("Enabled", rit->Enabled);
} }
// Username // Username
if(!rit->Username.empty()) if (!rit->Username.empty()) {
{
xout.Element("Username", rit->Username); xout.Element("Username", rit->Username);
} }
// Password // Password
if(!rit->Password.empty()) if (!rit->Password.empty()) {
{
xout.Element("Password", rit->Password); xout.Element("Password", rit->Password);
} }
// DisplayName // DisplayName
if(!rit->DisplayName.empty()) if (!rit->DisplayName.empty()) {
{
xout.Element("DisplayName", rit->DisplayName); xout.Element("DisplayName", rit->DisplayName);
} }
xout.EndElement(); xout.EndElement();
@ -434,40 +349,32 @@ void cmCPackIFWInstaller::GenerateInstallerFile()
} }
// Maintenance tool // Maintenance tool
if(!IsVersionLess("2.0") && !MaintenanceToolName.empty()) if (!IsVersionLess("2.0") && !MaintenanceToolName.empty()) {
{
xout.Element("MaintenanceToolName", MaintenanceToolName); xout.Element("MaintenanceToolName", MaintenanceToolName);
} }
// Maintenance tool ini file // Maintenance tool ini file
if(!IsVersionLess("2.0") && !MaintenanceToolIniFile.empty()) if (!IsVersionLess("2.0") && !MaintenanceToolIniFile.empty()) {
{
xout.Element("MaintenanceToolIniFile", MaintenanceToolIniFile); xout.Element("MaintenanceToolIniFile", MaintenanceToolIniFile);
} }
// Different allows // Different allows
if(IsVersionLess("2.0")) if (IsVersionLess("2.0")) {
{
// CPack IFW default policy // CPack IFW default policy
xout.Comment("CPack IFW default policy for QtIFW less 2.0"); xout.Comment("CPack IFW default policy for QtIFW less 2.0");
xout.Element("AllowNonAsciiCharacters", "true"); xout.Element("AllowNonAsciiCharacters", "true");
xout.Element("AllowSpaceInPath", "true"); xout.Element("AllowSpaceInPath", "true");
} } else {
else if (!AllowNonAsciiCharacters.empty()) {
{
if(!AllowNonAsciiCharacters.empty())
{
xout.Element("AllowNonAsciiCharacters", AllowNonAsciiCharacters); xout.Element("AllowNonAsciiCharacters", AllowNonAsciiCharacters);
} }
if(!AllowSpaceInPath.empty()) if (!AllowSpaceInPath.empty()) {
{
xout.Element("AllowSpaceInPath", AllowSpaceInPath); xout.Element("AllowSpaceInPath", AllowSpaceInPath);
} }
} }
// Control script (copy to config dir) // Control script (copy to config dir)
if(!IsVersionLess("2.0") && !ControlScript.empty()) if (!IsVersionLess("2.0") && !ControlScript.empty()) {
{
std::string name = cmSystemTools::GetFilenameName(ControlScript); std::string name = cmSystemTools::GetFilenameName(ControlScript);
std::string path = Directory + "/config/" + name; std::string path = Directory + "/config/" + name;
cmsys::SystemTools::CopyFileIfDifferent(ControlScript.data(), path.data()); cmsys::SystemTools::CopyFileIfDifferent(ControlScript.data(), path.data());
@ -480,20 +387,16 @@ void cmCPackIFWInstaller::GenerateInstallerFile()
void cmCPackIFWInstaller::GeneratePackageFiles() void cmCPackIFWInstaller::GeneratePackageFiles()
{ {
if (Packages.empty() || Generator->IsOnePackage()) if (Packages.empty() || Generator->IsOnePackage()) {
{
// Generate default package // Generate default package
cmCPackIFWPackage package; cmCPackIFWPackage package;
package.Generator = Generator; package.Generator = Generator;
package.Installer = this; package.Installer = this;
// Check package group // Check package group
if (const char* option = GetOption("CPACK_IFW_PACKAGE_GROUP")) if (const char* option = GetOption("CPACK_IFW_PACKAGE_GROUP")) {
{
package.ConfigureFromGroup(option); package.ConfigureFromGroup(option);
package.ForcedInstallation = "true"; package.ForcedInstallation = "true";
} } else {
else
{
package.ConfigureFromOptions(); package.ConfigureFromOptions();
} }
package.GeneratePackageFile(); package.GeneratePackageFile();
@ -501,15 +404,15 @@ void cmCPackIFWInstaller::GeneratePackageFiles()
} }
// Generate packages meta information // Generate packages meta information
for(PackagesMap::iterator pit = Packages.begin(); for (PackagesMap::iterator pit = Packages.begin(); pit != Packages.end();
pit != Packages.end(); ++pit) ++pit) {
{
cmCPackIFWPackage* package = pit->second; cmCPackIFWPackage* package = pit->second;
package->GeneratePackageFile(); package->GeneratePackageFile();
} }
} }
void cmCPackIFWInstaller::WriteGeneratedByToStrim(cmXMLWriter &xout) void cmCPackIFWInstaller::WriteGeneratedByToStrim(cmXMLWriter& xout)
{ {
if(Generator) Generator->WriteGeneratedByToStrim(xout); if (Generator)
Generator->WriteGeneratedByToStrim(xout);
} }

View File

@ -103,9 +103,9 @@ public:
const char* GetOption(const std::string& op) const; const char* GetOption(const std::string& op) const;
bool IsOn(const std::string& op) const; bool IsOn(const std::string& op) const;
bool IsVersionLess(const char *version); bool IsVersionLess(const char* version);
bool IsVersionGreater(const char *version); bool IsVersionGreater(const char* version);
bool IsVersionEqual(const char *version); bool IsVersionEqual(const char* version);
void ConfigureFromOptions(); void ConfigureFromOptions();

View File

@ -22,21 +22,21 @@
//----------------------------------------------------------------- Logger --- //----------------------------------------------------------------- Logger ---
#ifdef cmCPackLogger #ifdef cmCPackLogger
# undef cmCPackLogger #undef cmCPackLogger
#endif #endif
#define cmCPackLogger(logType, msg) \ #define cmCPackLogger(logType, msg) \
do { \ do { \
std::ostringstream cmCPackLog_msg; \ std::ostringstream cmCPackLog_msg; \
cmCPackLog_msg << msg; \ cmCPackLog_msg << msg; \
if(Generator) { \ if (Generator) { \
Generator->Logger->Log(logType, __FILE__, __LINE__, \ Generator->Logger->Log(logType, __FILE__, __LINE__, \
cmCPackLog_msg.str().c_str()); \ cmCPackLog_msg.str().c_str()); \
} \ } \
} while ( 0 ) } while (0)
//---------------------------------------------------------- CompareStruct --- //---------------------------------------------------------- CompareStruct ---
cmCPackIFWPackage::CompareStruct::CompareStruct() : cmCPackIFWPackage::CompareStruct::CompareStruct()
Type(CompareNone) : Type(CompareNone)
{ {
} }
@ -46,32 +46,23 @@ cmCPackIFWPackage::DependenceStruct::DependenceStruct()
} }
cmCPackIFWPackage::DependenceStruct::DependenceStruct( cmCPackIFWPackage::DependenceStruct::DependenceStruct(
const std::string &dependence) const std::string& dependence)
{ {
// Search compare section // Search compare section
size_t pos = std::string::npos; size_t pos = std::string::npos;
if((pos = dependence.find("<=")) != std::string::npos) if ((pos = dependence.find("<=")) != std::string::npos) {
{
Compare.Type = CompareLessOrEqual; Compare.Type = CompareLessOrEqual;
Compare.Value = dependence.substr(pos + 2); Compare.Value = dependence.substr(pos + 2);
} } else if ((pos = dependence.find(">=")) != std::string::npos) {
else if((pos = dependence.find(">=")) != std::string::npos)
{
Compare.Type = CompareGreaterOrEqual; Compare.Type = CompareGreaterOrEqual;
Compare.Value = dependence.substr(pos + 2); Compare.Value = dependence.substr(pos + 2);
} } else if ((pos = dependence.find("<")) != std::string::npos) {
else if((pos = dependence.find("<")) != std::string::npos)
{
Compare.Type = CompareLess; Compare.Type = CompareLess;
Compare.Value = dependence.substr(pos + 1); Compare.Value = dependence.substr(pos + 1);
} } else if ((pos = dependence.find("=")) != std::string::npos) {
else if((pos = dependence.find("=")) != std::string::npos)
{
Compare.Type = CompareEqual; Compare.Type = CompareEqual;
Compare.Value = dependence.substr(pos + 1); Compare.Value = dependence.substr(pos + 1);
} } else if ((pos = dependence.find(">")) != std::string::npos) {
else if((pos = dependence.find(">")) != std::string::npos)
{
Compare.Type = CompareGreater; Compare.Type = CompareGreater;
Compare.Value = dependence.substr(pos + 1); Compare.Value = dependence.substr(pos + 1);
} }
@ -80,28 +71,20 @@ cmCPackIFWPackage::DependenceStruct::DependenceStruct(
std::string cmCPackIFWPackage::DependenceStruct::NameWithCompare() const std::string cmCPackIFWPackage::DependenceStruct::NameWithCompare() const
{ {
if (Compare.Type == CompareNone) return Name; if (Compare.Type == CompareNone)
return Name;
std::string result = Name; std::string result = Name;
if (Compare.Type == CompareLessOrEqual) if (Compare.Type == CompareLessOrEqual) {
{
result += "<="; result += "<=";
} } else if (Compare.Type == CompareGreaterOrEqual) {
else if (Compare.Type == CompareGreaterOrEqual)
{
result += ">="; result += ">=";
} } else if (Compare.Type == CompareLess) {
else if (Compare.Type == CompareLess)
{
result += "<"; result += "<";
} } else if (Compare.Type == CompareEqual) {
else if (Compare.Type == CompareEqual)
{
result += "="; result += "=";
} } else if (Compare.Type == CompareGreater) {
else if (Compare.Type == CompareGreater)
{
result += ">"; result += ">";
} }
@ -111,45 +94,45 @@ std::string cmCPackIFWPackage::DependenceStruct::NameWithCompare() const
} }
//------------------------------------------------------ cmCPackIFWPackage --- //------------------------------------------------------ cmCPackIFWPackage ---
cmCPackIFWPackage::cmCPackIFWPackage() : cmCPackIFWPackage::cmCPackIFWPackage()
Generator(0), : Generator(0)
Installer(0) , Installer(0)
{ {
} }
const char *cmCPackIFWPackage::GetOption(const std::string &op) const const char* cmCPackIFWPackage::GetOption(const std::string& op) const
{ {
const char *option = Generator ? Generator->GetOption(op) : 0; const char* option = Generator ? Generator->GetOption(op) : 0;
return option && *option ? option : 0; return option && *option ? option : 0;
} }
bool cmCPackIFWPackage::IsOn(const std::string &op) const bool cmCPackIFWPackage::IsOn(const std::string& op) const
{ {
return Generator ? Generator->IsOn(op) : false; return Generator ? Generator->IsOn(op) : false;
} }
bool cmCPackIFWPackage::IsVersionLess(const char *version) bool cmCPackIFWPackage::IsVersionLess(const char* version)
{ {
return Generator ? Generator->IsVersionLess(version) : false; return Generator ? Generator->IsVersionLess(version) : false;
} }
bool cmCPackIFWPackage::IsVersionGreater(const char *version) bool cmCPackIFWPackage::IsVersionGreater(const char* version)
{ {
return Generator ? Generator->IsVersionGreater(version) : false; return Generator ? Generator->IsVersionGreater(version) : false;
} }
bool cmCPackIFWPackage::IsVersionEqual(const char *version) bool cmCPackIFWPackage::IsVersionEqual(const char* version)
{ {
return Generator ? Generator->IsVersionEqual(version) : false; return Generator ? Generator->IsVersionEqual(version) : false;
} }
std::string cmCPackIFWPackage::GetComponentName(cmCPackComponent *component) std::string cmCPackIFWPackage::GetComponentName(cmCPackComponent* component)
{ {
if (!component) return ""; if (!component)
const char* option = GetOption( return "";
"CPACK_IFW_COMPONENT_" const char* option =
+ cmsys::SystemTools::UpperCase(component->Name) GetOption("CPACK_IFW_COMPONENT_" +
+ "_NAME"); cmsys::SystemTools::UpperCase(component->Name) + "_NAME");
return option ? option : component->Name; return option ? option : component->Name;
} }
@ -177,33 +160,24 @@ int cmCPackIFWPackage::ConfigureFromOptions()
Name = Generator->GetRootPackageName(); Name = Generator->GetRootPackageName();
// Display name // Display name
if (const char *option = this->GetOption("CPACK_PACKAGE_NAME")) if (const char* option = this->GetOption("CPACK_PACKAGE_NAME")) {
{
DisplayName = option; DisplayName = option;
} } else {
else
{
DisplayName = "Your package"; DisplayName = "Your package";
} }
// Description // Description
if (const char* option = if (const char* option =
this->GetOption("CPACK_PACKAGE_DESCRIPTION_SUMMARY")) this->GetOption("CPACK_PACKAGE_DESCRIPTION_SUMMARY")) {
{
Description = option; Description = option;
} } else {
else
{
Description = "Your package description"; Description = "Your package description";
} }
// Version // Version
if(const char* option = GetOption("CPACK_PACKAGE_VERSION")) if (const char* option = GetOption("CPACK_PACKAGE_VERSION")) {
{
Version = option; Version = option;
} } else {
else
{
Version = "1.0.0"; Version = "1.0.0";
} }
@ -212,16 +186,16 @@ int cmCPackIFWPackage::ConfigureFromOptions()
return 1; return 1;
} }
int cmCPackIFWPackage::ConfigureFromComponent(cmCPackComponent *component) int cmCPackIFWPackage::ConfigureFromComponent(cmCPackComponent* component)
{ {
if(!component) return 0; if (!component)
return 0;
// Restore defaul configuration // Restore defaul configuration
DefaultConfiguration(); DefaultConfiguration();
std::string prefix = "CPACK_IFW_COMPONENT_" std::string prefix = "CPACK_IFW_COMPONENT_" +
+ cmsys::SystemTools::UpperCase(component->Name) cmsys::SystemTools::UpperCase(component->Name) + "_";
+ "_";
// Display name // Display name
DisplayName = component->DisplayName; DisplayName = component->DisplayName;
@ -230,55 +204,40 @@ int cmCPackIFWPackage::ConfigureFromComponent(cmCPackComponent *component)
Description = component->Description; Description = component->Description;
// Version // Version
if(const char* optVERSION = GetOption(prefix + "VERSION")) if (const char* optVERSION = GetOption(prefix + "VERSION")) {
{
Version = optVERSION; Version = optVERSION;
} } else if (const char* optPACKAGE_VERSION =
else if(const char* optPACKAGE_VERSION = GetOption("CPACK_PACKAGE_VERSION")) {
GetOption("CPACK_PACKAGE_VERSION"))
{
Version = optPACKAGE_VERSION; Version = optPACKAGE_VERSION;
} } else {
else
{
Version = "1.0.0"; Version = "1.0.0";
} }
// Script // Script
if (const char* option = GetOption(prefix + "SCRIPT")) if (const char* option = GetOption(prefix + "SCRIPT")) {
{
Script = option; Script = option;
} }
// CMake dependencies // CMake dependencies
if (!component->Dependencies.empty()) if (!component->Dependencies.empty()) {
{
std::vector<cmCPackComponent*>::iterator dit; std::vector<cmCPackComponent*>::iterator dit;
for(dit = component->Dependencies.begin(); for (dit = component->Dependencies.begin();
dit != component->Dependencies.end(); dit != component->Dependencies.end(); ++dit) {
++dit)
{
Dependencies.insert(Generator->ComponentPackages[*dit]); Dependencies.insert(Generator->ComponentPackages[*dit]);
} }
} }
// QtIFW dependencies // QtIFW dependencies
if(const char* option = this->GetOption(prefix + "DEPENDS")) if (const char* option = this->GetOption(prefix + "DEPENDS")) {
{
std::vector<std::string> deps; std::vector<std::string> deps;
cmSystemTools::ExpandListArgument(option, cmSystemTools::ExpandListArgument(option, deps);
deps); for (std::vector<std::string>::iterator dit = deps.begin();
for(std::vector<std::string>::iterator dit != deps.end(); ++dit) {
dit = deps.begin(); dit != deps.end(); ++dit)
{
DependenceStruct dep(*dit); DependenceStruct dep(*dit);
if (!Generator->Packages.count(dep.Name)) if (!Generator->Packages.count(dep.Name)) {
{
bool hasDep = Generator->DependentPackages.count(dep.Name) > 0; bool hasDep = Generator->DependentPackages.count(dep.Name) > 0;
DependenceStruct &depRef = DependenceStruct& depRef = Generator->DependentPackages[dep.Name];
Generator->DependentPackages[dep.Name]; if (!hasDep) {
if(!hasDep)
{
depRef = dep; depRef = dep;
} }
AlienDependencies.insert(&depRef); AlienDependencies.insert(&depRef);
@ -287,13 +246,13 @@ int cmCPackIFWPackage::ConfigureFromComponent(cmCPackComponent *component)
} }
// Licenses // Licenses
if (const char* option = this->GetOption(prefix + "LICENSES")) if (const char* option = this->GetOption(prefix + "LICENSES")) {
{
Licenses.clear(); Licenses.clear();
cmSystemTools::ExpandListArgument( option, Licenses ); cmSystemTools::ExpandListArgument(option, Licenses);
if ( Licenses.size() % 2 != 0 ) if (Licenses.size() % 2 != 0) {
{ cmCPackLogger(
cmCPackLogger(cmCPackLog::LOG_WARNING, prefix << "LICENSES" cmCPackLog::LOG_WARNING, prefix
<< "LICENSES"
<< " should contain pairs of <display_name> and <file_path>." << " should contain pairs of <display_name> and <file_path>."
<< std::endl); << std::endl);
Licenses.clear(); Licenses.clear();
@ -301,8 +260,7 @@ int cmCPackIFWPackage::ConfigureFromComponent(cmCPackComponent *component)
} }
// Priority // Priority
if(const char* option = this->GetOption(prefix + "PRIORITY")) if (const char* option = this->GetOption(prefix + "PRIORITY")) {
{
SortingPriority = option; SortingPriority = option;
} }
@ -318,50 +276,43 @@ int cmCPackIFWPackage::ConfigureFromComponent(cmCPackComponent *component)
return 1; return 1;
} }
int int cmCPackIFWPackage::ConfigureFromGroup(cmCPackComponentGroup* group)
cmCPackIFWPackage::ConfigureFromGroup(cmCPackComponentGroup *group)
{ {
if(!group) return 0; if (!group)
return 0;
// Restore defaul configuration // Restore defaul configuration
DefaultConfiguration(); DefaultConfiguration();
std::string prefix = "CPACK_IFW_COMPONENT_GROUP_" std::string prefix = "CPACK_IFW_COMPONENT_GROUP_" +
+ cmsys::SystemTools::UpperCase(group->Name) cmsys::SystemTools::UpperCase(group->Name) + "_";
+ "_";
DisplayName = group->DisplayName; DisplayName = group->DisplayName;
Description = group->Description; Description = group->Description;
// Version // Version
if(const char* optVERSION = GetOption(prefix + "VERSION")) if (const char* optVERSION = GetOption(prefix + "VERSION")) {
{
Version = optVERSION; Version = optVERSION;
} } else if (const char* optPACKAGE_VERSION =
else if(const char* optPACKAGE_VERSION = GetOption("CPACK_PACKAGE_VERSION")) {
GetOption("CPACK_PACKAGE_VERSION"))
{
Version = optPACKAGE_VERSION; Version = optPACKAGE_VERSION;
} } else {
else
{
Version = "1.0.0"; Version = "1.0.0";
} }
// Script // Script
if (const char* option = GetOption(prefix + "SCRIPT")) if (const char* option = GetOption(prefix + "SCRIPT")) {
{
Script = option; Script = option;
} }
// Licenses // Licenses
if (const char* option = this->GetOption(prefix + "LICENSES")) if (const char* option = this->GetOption(prefix + "LICENSES")) {
{
Licenses.clear(); Licenses.clear();
cmSystemTools::ExpandListArgument( option, Licenses ); cmSystemTools::ExpandListArgument(option, Licenses);
if ( Licenses.size() % 2 != 0 ) if (Licenses.size() % 2 != 0) {
{ cmCPackLogger(
cmCPackLogger(cmCPackLog::LOG_WARNING, prefix << "LICENSES" cmCPackLog::LOG_WARNING, prefix
<< "LICENSES"
<< " should contain pairs of <display_name> and <file_path>." << " should contain pairs of <display_name> and <file_path>."
<< std::endl); << std::endl);
Licenses.clear(); Licenses.clear();
@ -369,34 +320,28 @@ cmCPackIFWPackage::ConfigureFromGroup(cmCPackComponentGroup *group)
} }
// Priority // Priority
if(const char* option = this->GetOption(prefix + "PRIORITY")) if (const char* option = this->GetOption(prefix + "PRIORITY")) {
{
SortingPriority = option; SortingPriority = option;
} }
return 1; return 1;
} }
int cmCPackIFWPackage::ConfigureFromGroup(const std::string &groupName) int cmCPackIFWPackage::ConfigureFromGroup(const std::string& groupName)
{ {
// Group configuration // Group configuration
cmCPackComponentGroup group; cmCPackComponentGroup group;
std::string prefix = "CPACK_COMPONENT_GROUP_" std::string prefix =
+ cmsys::SystemTools::UpperCase(groupName) "CPACK_COMPONENT_GROUP_" + cmsys::SystemTools::UpperCase(groupName) + "_";
+ "_";
if (const char *option = GetOption(prefix + "DISPLAY_NAME")) if (const char* option = GetOption(prefix + "DISPLAY_NAME")) {
{
group.DisplayName = option; group.DisplayName = option;
} } else {
else
{
group.DisplayName = group.Name; group.DisplayName = group.Name;
} }
if (const char* option = GetOption(prefix + "DESCRIPTION")) if (const char* option = GetOption(prefix + "DESCRIPTION")) {
{
group.Description = option; group.Description = option;
} }
group.IsBold = IsOn(prefix + "BOLD_TITLE"); group.IsBold = IsOn(prefix + "BOLD_TITLE");
@ -406,12 +351,9 @@ int cmCPackIFWPackage::ConfigureFromGroup(const std::string &groupName)
group.Name = groupName; group.Name = groupName;
if(Generator) if (Generator) {
{
Name = Generator->GetGroupPackageName(&group); Name = Generator->GetGroupPackageName(&group);
} } else {
else
{
Name = group.Name; Name = group.Name;
} }
@ -421,14 +363,10 @@ int cmCPackIFWPackage::ConfigureFromGroup(const std::string &groupName)
void cmCPackIFWPackage::GeneratePackageFile() void cmCPackIFWPackage::GeneratePackageFile()
{ {
// Lazy directory initialization // Lazy directory initialization
if (Directory.empty()) if (Directory.empty()) {
{ if (Installer) {
if(Installer)
{
Directory = Installer->Directory + "/packages/" + Name; Directory = Installer->Directory + "/packages/" + Name;
} } else if (Generator) {
else if (Generator)
{
Directory = Generator->toplevel + "/packages/" + Name; Directory = Generator->toplevel + "/packages/" + Name;
} }
} }
@ -448,18 +386,14 @@ void cmCPackIFWPackage::GeneratePackageFile()
xout.Element("Name", Name); xout.Element("Name", Name);
xout.Element("Version", Version); xout.Element("Version", Version);
if (!ReleaseDate.empty()) if (!ReleaseDate.empty()) {
{
xout.Element("ReleaseDate", ReleaseDate); xout.Element("ReleaseDate", ReleaseDate);
} } else {
else
{
xout.Element("ReleaseDate", cmTimestamp().CurrentTime("%Y-%m-%d", true)); xout.Element("ReleaseDate", cmTimestamp().CurrentTime("%Y-%m-%d", true));
} }
// Script (copy to meta dir) // Script (copy to meta dir)
if(!Script.empty()) if (!Script.empty()) {
{
std::string name = cmSystemTools::GetFilenameName(Script); std::string name = cmSystemTools::GetFilenameName(Script);
std::string path = Directory + "/meta/" + name; std::string path = Directory + "/meta/" + name;
cmsys::SystemTools::CopyFileIfDifferent(Script.data(), path.data()); cmsys::SystemTools::CopyFileIfDifferent(Script.data(), path.data());
@ -468,25 +402,21 @@ void cmCPackIFWPackage::GeneratePackageFile()
// Dependencies // Dependencies
std::set<DependenceStruct> compDepSet; std::set<DependenceStruct> compDepSet;
for(std::set<DependenceStruct*>::iterator ait = AlienDependencies.begin(); for (std::set<DependenceStruct*>::iterator ait = AlienDependencies.begin();
ait != AlienDependencies.end(); ++ait) ait != AlienDependencies.end(); ++ait) {
{
compDepSet.insert(*(*ait)); compDepSet.insert(*(*ait));
} }
for(std::set<cmCPackIFWPackage*>::iterator it = Dependencies.begin(); for (std::set<cmCPackIFWPackage*>::iterator it = Dependencies.begin();
it != Dependencies.end(); ++it) it != Dependencies.end(); ++it) {
{
compDepSet.insert(DependenceStruct((*it)->Name)); compDepSet.insert(DependenceStruct((*it)->Name));
} }
// Write dependencies // Write dependencies
if (!compDepSet.empty()) if (!compDepSet.empty()) {
{
std::stringstream dependencies; std::stringstream dependencies;
std::set<DependenceStruct>::iterator it = compDepSet.begin(); std::set<DependenceStruct>::iterator it = compDepSet.begin();
dependencies << it->NameWithCompare(); dependencies << it->NameWithCompare();
++it; ++it;
while(it != compDepSet.end()) while (it != compDepSet.end()) {
{
dependencies << "," << it->NameWithCompare(); dependencies << "," << it->NameWithCompare();
++it; ++it;
} }
@ -495,18 +425,15 @@ void cmCPackIFWPackage::GeneratePackageFile()
// Licenses (copy to meta dir) // Licenses (copy to meta dir)
std::vector<std::string> licenses = Licenses; std::vector<std::string> licenses = Licenses;
for(size_t i = 1; i < licenses.size(); i += 2) for (size_t i = 1; i < licenses.size(); i += 2) {
{
std::string name = cmSystemTools::GetFilenameName(licenses[i]); std::string name = cmSystemTools::GetFilenameName(licenses[i]);
std::string path = Directory + "/meta/" + name; std::string path = Directory + "/meta/" + name;
cmsys::SystemTools::CopyFileIfDifferent(licenses[i].data(), path.data()); cmsys::SystemTools::CopyFileIfDifferent(licenses[i].data(), path.data());
licenses[i] = name; licenses[i] = name;
} }
if(!licenses.empty()) if (!licenses.empty()) {
{
xout.StartElement("Licenses"); xout.StartElement("Licenses");
for(size_t i = 0; i < licenses.size(); i += 2) for (size_t i = 0; i < licenses.size(); i += 2) {
{
xout.StartElement("License"); xout.StartElement("License");
xout.Attribute("name", licenses[i]); xout.Attribute("name", licenses[i]);
xout.Attribute("file", licenses[i + 1]); xout.Attribute("file", licenses[i + 1]);
@ -515,23 +442,18 @@ void cmCPackIFWPackage::GeneratePackageFile()
xout.EndElement(); xout.EndElement();
} }
if (!ForcedInstallation.empty()) if (!ForcedInstallation.empty()) {
{
xout.Element("ForcedInstallation", ForcedInstallation); xout.Element("ForcedInstallation", ForcedInstallation);
} }
if (!Virtual.empty()) if (!Virtual.empty()) {
{
xout.Element("Virtual", Virtual); xout.Element("Virtual", Virtual);
} } else if (!Default.empty()) {
else if (!Default.empty())
{
xout.Element("Default", Default); xout.Element("Default", Default);
} }
// Priority // Priority
if(!SortingPriority.empty()) if (!SortingPriority.empty()) {
{
xout.Element("SortingPriority", SortingPriority); xout.Element("SortingPriority", SortingPriority);
} }
@ -539,7 +461,8 @@ void cmCPackIFWPackage::GeneratePackageFile()
xout.EndDocument(); xout.EndDocument();
} }
void cmCPackIFWPackage::WriteGeneratedByToStrim(cmXMLWriter &xout) void cmCPackIFWPackage::WriteGeneratedByToStrim(cmXMLWriter& xout)
{ {
if(Generator) Generator->WriteGeneratedByToStrim(xout); if (Generator)
Generator->WriteGeneratedByToStrim(xout);
} }

View File

@ -50,14 +50,14 @@ public:
struct DependenceStruct struct DependenceStruct
{ {
DependenceStruct(); DependenceStruct();
DependenceStruct(const std::string &dependence); DependenceStruct(const std::string& dependence);
std::string Name; std::string Name;
CompareStruct Compare; CompareStruct Compare;
std::string NameWithCompare() const; std::string NameWithCompare() const;
bool operator < (const DependenceStruct &other) const bool operator<(const DependenceStruct& other) const
{ {
return Name < other.Name; return Name < other.Name;
} }
@ -113,18 +113,18 @@ public:
const char* GetOption(const std::string& op) const; const char* GetOption(const std::string& op) const;
bool IsOn(const std::string& op) const; bool IsOn(const std::string& op) const;
bool IsVersionLess(const char *version); bool IsVersionLess(const char* version);
bool IsVersionGreater(const char *version); bool IsVersionGreater(const char* version);
bool IsVersionEqual(const char *version); bool IsVersionEqual(const char* version);
std::string GetComponentName(cmCPackComponent *component); std::string GetComponentName(cmCPackComponent* component);
void DefaultConfiguration(); void DefaultConfiguration();
int ConfigureFromOptions(); int ConfigureFromOptions();
int ConfigureFromComponent(cmCPackComponent *component); int ConfigureFromComponent(cmCPackComponent* component);
int ConfigureFromGroup(cmCPackComponentGroup *group); int ConfigureFromGroup(cmCPackComponentGroup* group);
int ConfigureFromGroup(const std::string &groupName); int ConfigureFromGroup(const std::string& groupName);
void GeneratePackageFile(); void GeneratePackageFile();

View File

@ -26,64 +26,57 @@
int main(int argc, char* argv[]) int main(int argc, char* argv[])
{ {
//if ( cmsys::SystemTools::FileExists( // if ( cmsys::SystemTools::FileExists(
std::string cwd = cmsys::SystemTools::GetCurrentWorkingDirectory(); std::string cwd = cmsys::SystemTools::GetCurrentWorkingDirectory();
cmsys::ofstream ofs("/tmp/output.txt"); cmsys::ofstream ofs("/tmp/output.txt");
CFStringRef fileName; CFStringRef fileName;
CFBundleRef appBundle; CFBundleRef appBundle;
CFURLRef scriptFileURL; CFURLRef scriptFileURL;
UInt8 *path; UInt8* path;
//get CF URL for script // get CF URL for script
if (! (appBundle = CFBundleGetMainBundle())) if (!(appBundle = CFBundleGetMainBundle())) {
{
DebugError("Cannot get main bundle"); DebugError("Cannot get main bundle");
return 1; return 1;
} }
fileName = CFSTR("RuntimeScript"); fileName = CFSTR("RuntimeScript");
if (! (scriptFileURL = CFBundleCopyResourceURL(appBundle, fileName, NULL, if (!(scriptFileURL =
NULL))) CFBundleCopyResourceURL(appBundle, fileName, NULL, NULL))) {
{
DebugError("CFBundleCopyResourceURL failed"); DebugError("CFBundleCopyResourceURL failed");
return 1; return 1;
} }
//create path string // create path string
if (! (path = new UInt8[PATH_MAX])) if (!(path = new UInt8[PATH_MAX])) {
{
return 1; return 1;
} }
//get the file system path of the url as a cstring // get the file system path of the url as a cstring
//in an encoding suitable for posix apis // in an encoding suitable for posix apis
if ( CFURLGetFileSystemRepresentation(scriptFileURL, true, path, if (CFURLGetFileSystemRepresentation(scriptFileURL, true, path, PATH_MAX) ==
PATH_MAX) == false) false) {
{
DebugError("CFURLGetFileSystemRepresentation failed"); DebugError("CFURLGetFileSystemRepresentation failed");
return 1; return 1;
} }
//dispose of the CF variable // dispose of the CF variable
CFRelease(scriptFileURL); CFRelease(scriptFileURL);
std::string fullScriptPath = reinterpret_cast<char*>(path); std::string fullScriptPath = reinterpret_cast<char*>(path);
delete [] path; delete[] path;
if (!cmsys::SystemTools::FileExists(fullScriptPath.c_str())) {
if (! cmsys::SystemTools::FileExists(fullScriptPath.c_str()))
{
return 1; return 1;
} }
std::string scriptDirectory = cmsys::SystemTools::GetFilenamePath( std::string scriptDirectory =
fullScriptPath); cmsys::SystemTools::GetFilenamePath(fullScriptPath);
ofs << fullScriptPath.c_str() << std::endl; ofs << fullScriptPath.c_str() << std::endl;
std::vector<const char*> args; std::vector<const char*> args;
args.push_back(fullScriptPath.c_str()); args.push_back(fullScriptPath.c_str());
int cc; int cc;
for ( cc = 1; cc < argc; ++ cc ) for (cc = 1; cc < argc; ++cc) {
{
args.push_back(argv[cc]); args.push_back(argv[cc]);
} }
args.push_back(0); args.push_back(0);
@ -98,15 +91,12 @@ int main(int argc, char* argv[])
std::vector<char> tempOutput; std::vector<char> tempOutput;
char* data; char* data;
int length; int length;
while(cmsysProcess_WaitForData(cp, &data, &length, 0)) while (cmsysProcess_WaitForData(cp, &data, &length, 0)) {
{
// Translate NULL characters in the output into valid text. // Translate NULL characters in the output into valid text.
// Visual Studio 7 puts these characters in the output of its // Visual Studio 7 puts these characters in the output of its
// build process. // build process.
for(int i=0; i < length; ++i) for (int i = 0; i < length; ++i) {
{ if (data[i] == '\0') {
if(data[i] == '\0')
{
data[i] = ' '; data[i] = ' ';
} }
} }
@ -116,27 +106,19 @@ int main(int argc, char* argv[])
cmsysProcess_WaitForExit(cp, 0); cmsysProcess_WaitForExit(cp, 0);
bool result = true; bool result = true;
if(cmsysProcess_GetState(cp) == cmsysProcess_State_Exited) if (cmsysProcess_GetState(cp) == cmsysProcess_State_Exited) {
{ if (cmsysProcess_GetExitValue(cp) != 0) {
if ( cmsysProcess_GetExitValue(cp) != 0 )
{
result = false; result = false;
} }
} } else if (cmsysProcess_GetState(cp) == cmsysProcess_State_Exception) {
else if(cmsysProcess_GetState(cp) == cmsysProcess_State_Exception)
{
const char* exception_str = cmsysProcess_GetExceptionString(cp); const char* exception_str = cmsysProcess_GetExceptionString(cp);
std::cerr << exception_str << std::endl; std::cerr << exception_str << std::endl;
result = false; result = false;
} } else if (cmsysProcess_GetState(cp) == cmsysProcess_State_Error) {
else if(cmsysProcess_GetState(cp) == cmsysProcess_State_Error)
{
const char* error_str = cmsysProcess_GetErrorString(cp); const char* error_str = cmsysProcess_GetErrorString(cp);
std::cerr << error_str << std::endl; std::cerr << error_str << std::endl;
result = false; result = false;
} } else if (cmsysProcess_GetState(cp) == cmsysProcess_State_Expired) {
else if(cmsysProcess_GetState(cp) == cmsysProcess_State_Expired)
{
const char* error_str = "Process terminated due to timeout\n"; const char* error_str = "Process terminated due to timeout\n";
std::cerr << error_str << std::endl; std::cerr << error_str << std::endl;
result = false; result = false;

File diff suppressed because it is too large Load Diff

View File

@ -42,25 +42,16 @@ protected:
virtual int PackageFiles(); virtual int PackageFiles();
virtual const char* GetOutputExtension() virtual const char* GetOutputExtension() { return ".msi"; }
{
return ".msi";
}
virtual enum CPackSetDestdirSupport SupportsSetDestdir() const virtual enum CPackSetDestdirSupport SupportsSetDestdir() const
{ {
return SETDESTDIR_UNSUPPORTED; return SETDESTDIR_UNSUPPORTED;
} }
virtual bool SupportsAbsoluteDestination() const virtual bool SupportsAbsoluteDestination() const { return false; }
{
return false;
}
virtual bool SupportsComponentInstallation() const virtual bool SupportsComponentInstallation() const { return true; }
{
return true;
}
private: private:
typedef std::map<std::string, std::string> id_map_t; typedef std::map<std::string, std::string> id_map_t;
@ -77,11 +68,10 @@ private:
void CreateWiXProductFragmentIncludeFile(); void CreateWiXProductFragmentIncludeFile();
void CopyDefinition( void CopyDefinition(cmWIXSourceWriter& source, std::string const& name);
cmWIXSourceWriter &source, std::string const& name);
void AddDefinition(cmWIXSourceWriter& source, void AddDefinition(cmWIXSourceWriter& source, std::string const& name,
std::string const& name, std::string const& value); std::string const& value);
bool CreateWiXSourceFiles(); bool CreateWiXSourceFiles();
@ -89,19 +79,15 @@ private:
bool GenerateMainSourceFileFromTemplate(); bool GenerateMainSourceFileFromTemplate();
bool CreateFeatureHierarchy( bool CreateFeatureHierarchy(cmWIXFeaturesSourceWriter& featureDefinitions);
cmWIXFeaturesSourceWriter& featureDefinitions);
bool AddComponentsToFeature( bool AddComponentsToFeature(
std::string const& rootPath, std::string const& rootPath, std::string const& featureId,
std::string const& featureId,
cmWIXDirectoriesSourceWriter& directoryDefinitions, cmWIXDirectoriesSourceWriter& directoryDefinitions,
cmWIXFilesSourceWriter& fileDefinitions, cmWIXFilesSourceWriter& fileDefinitions,
cmWIXFeaturesSourceWriter& featureDefinitions, cmWIXFeaturesSourceWriter& featureDefinitions, cmWIXShortcuts& shortcuts);
cmWIXShortcuts& shortcuts);
bool CreateShortcuts( bool CreateShortcuts(std::string const& cpackComponentName,
std::string const& cpackComponentName,
std::string const& featureId, std::string const& featureId,
cmWIXShortcuts const& shortcuts, cmWIXShortcuts const& shortcuts,
bool emitUninstallShortcut, bool emitUninstallShortcut,
@ -109,12 +95,9 @@ private:
cmWIXFeaturesSourceWriter& featureDefinitions); cmWIXFeaturesSourceWriter& featureDefinitions);
bool CreateShortcutsOfSpecificType( bool CreateShortcutsOfSpecificType(
cmWIXShortcuts::Type type, cmWIXShortcuts::Type type, std::string const& cpackComponentName,
std::string const& cpackComponentName, std::string const& featureId, std::string const& idPrefix,
std::string const& featureId, cmWIXShortcuts const& shortcuts, bool emitUninstallShortcut,
std::string const& idPrefix,
cmWIXShortcuts const& shortcuts,
bool emitUninstallShortcut,
cmWIXFilesSourceWriter& fileDefinitions, cmWIXFilesSourceWriter& fileDefinitions,
cmWIXFeaturesSourceWriter& featureDefinitions); cmWIXFeaturesSourceWriter& featureDefinitions);
@ -126,13 +109,13 @@ private:
bool RunWiXCommand(std::string const& command); bool RunWiXCommand(std::string const& command);
bool RunCandleCommand( bool RunCandleCommand(std::string const& sourceFile,
std::string const& sourceFile, std::string const& objectFile); std::string const& objectFile);
bool RunLightCommand(std::string const& objectFiles); bool RunLightCommand(std::string const& objectFiles);
void AddDirectoryAndFileDefinitons(std::string const& topdir, void AddDirectoryAndFileDefinitons(
std::string const& directoryId, std::string const& topdir, std::string const& directoryId,
cmWIXDirectoriesSourceWriter& directoryDefinitions, cmWIXDirectoriesSourceWriter& directoryDefinitions,
cmWIXFilesSourceWriter& fileDefinitions, cmWIXFilesSourceWriter& fileDefinitions,
cmWIXFeaturesSourceWriter& featureDefinitions, cmWIXFeaturesSourceWriter& featureDefinitions,
@ -154,22 +137,20 @@ private:
std::string CreateNewIdForPath(std::string const& path); std::string CreateNewIdForPath(std::string const& path);
static std::string CreateHashedId( static std::string CreateHashedId(std::string const& path,
std::string const& path, std::string const& normalizedFilename); std::string const& normalizedFilename);
std::string NormalizeComponentForId( std::string NormalizeComponentForId(std::string const& component,
std::string const& component, size_t& replacementCount); size_t& replacementCount);
static bool IsLegalIdCharacter(char c); static bool IsLegalIdCharacter(char c);
void CollectExtensions( void CollectExtensions(std::string const& variableName,
std::string const& variableName, extension_set_t& extensions); extension_set_t& extensions);
void AddCustomFlags( void AddCustomFlags(std::string const& variableName, std::ostream& stream);
std::string const& variableName, std::ostream& stream);
std::string RelativePathWithoutComponentPrefix( std::string RelativePathWithoutComponentPrefix(std::string const& path);
std::string const& path);
std::vector<std::string> WixSources; std::vector<std::string> WixSources;
id_map_t PathToIdMap; id_map_t PathToIdMap;

View File

@ -17,14 +17,12 @@
#include <cmSystemTools.h> #include <cmSystemTools.h>
cmWIXAccessControlList::cmWIXAccessControlList( cmWIXAccessControlList::cmWIXAccessControlList(
cmCPackLog *logger, cmCPackLog* logger, cmInstalledFile const& installedFile,
cmInstalledFile const& installedFile, cmWIXSourceWriter& sourceWriter)
cmWIXSourceWriter &sourceWriter): : Logger(logger)
Logger(logger), , InstalledFile(installedFile)
InstalledFile(installedFile), , SourceWriter(sourceWriter)
SourceWriter(sourceWriter)
{ {
} }
bool cmWIXAccessControlList::Apply() bool cmWIXAccessControlList::Apply()
@ -32,20 +30,17 @@ bool cmWIXAccessControlList::Apply()
std::vector<std::string> entries; std::vector<std::string> entries;
this->InstalledFile.GetPropertyAsList("CPACK_WIX_ACL", entries); this->InstalledFile.GetPropertyAsList("CPACK_WIX_ACL", entries);
for(size_t i = 0; i < entries.size(); ++i) for (size_t i = 0; i < entries.size(); ++i) {
{
this->CreatePermissionElement(entries[i]); this->CreatePermissionElement(entries[i]);
} }
return true; return true;
} }
void cmWIXAccessControlList::CreatePermissionElement( void cmWIXAccessControlList::CreatePermissionElement(std::string const& entry)
std::string const& entry)
{ {
std::string::size_type pos = entry.find('='); std::string::size_type pos = entry.find('=');
if(pos == std::string::npos) if (pos == std::string::npos) {
{
this->ReportError(entry, "Did not find mandatory '='"); this->ReportError(entry, "Did not find mandatory '='");
return; return;
} }
@ -56,13 +51,10 @@ void cmWIXAccessControlList::CreatePermissionElement(
pos = user_and_domain.find('@'); pos = user_and_domain.find('@');
std::string user; std::string user;
std::string domain; std::string domain;
if(pos != std::string::npos) if (pos != std::string::npos) {
{
user = user_and_domain.substr(0, pos); user = user_and_domain.substr(0, pos);
domain = user_and_domain.substr(pos + 1); domain = user_and_domain.substr(pos + 1);
} } else {
else
{
user = user_and_domain; user = user_and_domain;
} }
@ -71,31 +63,26 @@ void cmWIXAccessControlList::CreatePermissionElement(
this->SourceWriter.BeginElement("Permission"); this->SourceWriter.BeginElement("Permission");
this->SourceWriter.AddAttribute("User", user); this->SourceWriter.AddAttribute("User", user);
if(!domain.empty()) if (!domain.empty()) {
{
this->SourceWriter.AddAttribute("Domain", domain); this->SourceWriter.AddAttribute("Domain", domain);
} }
for(size_t i = 0; i < permissions.size(); ++i) for (size_t i = 0; i < permissions.size(); ++i) {
{
this->EmitBooleanAttribute(entry, this->EmitBooleanAttribute(entry,
cmSystemTools::TrimWhitespace(permissions[i])); cmSystemTools::TrimWhitespace(permissions[i]));
} }
this->SourceWriter.EndElement("Permission"); this->SourceWriter.EndElement("Permission");
} }
void cmWIXAccessControlList::ReportError( void cmWIXAccessControlList::ReportError(std::string const& entry,
std::string const& entry,
std::string const& message) std::string const& message)
{ {
cmCPackLogger(cmCPackLog::LOG_ERROR, cmCPackLogger(cmCPackLog::LOG_ERROR, "Failed processing ACL entry '"
"Failed processing ACL entry '" << entry << << entry << "': " << message << std::endl);
"': " << message << std::endl);
} }
bool cmWIXAccessControlList::IsBooleanAttribute(std::string const& name) bool cmWIXAccessControlList::IsBooleanAttribute(std::string const& name)
{ {
static const char* validAttributes[] = static const char* validAttributes[] = {
{
/* clang-format needs this comment to break after the opening brace */ /* clang-format needs this comment to break after the opening brace */
"Append", "Append",
"ChangePermission", "ChangePermission",
@ -128,19 +115,18 @@ bool cmWIXAccessControlList::IsBooleanAttribute(std::string const& name)
}; };
size_t i = 0; size_t i = 0;
while(validAttributes[i]) while (validAttributes[i]) {
{ if (name == validAttributes[i++])
if(name == validAttributes[i++]) return true; return true;
} }
return false; return false;
} }
void cmWIXAccessControlList::EmitBooleanAttribute( void cmWIXAccessControlList::EmitBooleanAttribute(std::string const& entry,
std::string const& entry, std::string const& name) std::string const& name)
{ {
if(!this->IsBooleanAttribute(name)) if (!this->IsBooleanAttribute(name)) {
{
std::stringstream message; std::stringstream message;
message << "Unknown boolean attribute '" << name << "'"; message << "Unknown boolean attribute '" << name << "'";
this->ReportError(entry, message.str()); this->ReportError(entry, message.str());

View File

@ -21,10 +21,9 @@
class cmWIXAccessControlList class cmWIXAccessControlList
{ {
public: public:
cmWIXAccessControlList( cmWIXAccessControlList(cmCPackLog* logger,
cmCPackLog *logger,
cmInstalledFile const& installedFile, cmInstalledFile const& installedFile,
cmWIXSourceWriter &sourceWriter); cmWIXSourceWriter& sourceWriter);
bool Apply(); bool Apply();
@ -35,12 +34,11 @@ private:
bool IsBooleanAttribute(std::string const& name); bool IsBooleanAttribute(std::string const& name);
void EmitBooleanAttribute( void EmitBooleanAttribute(std::string const& entry, std::string const& name);
std::string const& entry, std::string const& name);
cmCPackLog* Logger; cmCPackLog* Logger;
cmInstalledFile const& InstalledFile; cmInstalledFile const& InstalledFile;
cmWIXSourceWriter &SourceWriter; cmWIXSourceWriter& SourceWriter;
}; };
#endif #endif

View File

@ -12,11 +12,10 @@
#include "cmWIXDirectoriesSourceWriter.h" #include "cmWIXDirectoriesSourceWriter.h"
cmWIXDirectoriesSourceWriter::cmWIXDirectoriesSourceWriter(cmCPackLog* logger, cmWIXDirectoriesSourceWriter::cmWIXDirectoriesSourceWriter(
std::string const& filename): cmCPackLog* logger, std::string const& filename)
cmWIXSourceWriter(logger, filename) : cmWIXSourceWriter(logger, filename)
{ {
} }
void cmWIXDirectoriesSourceWriter::EmitStartMenuFolder( void cmWIXDirectoriesSourceWriter::EmitStartMenuFolder(
@ -60,21 +59,16 @@ size_t cmWIXDirectoriesSourceWriter::BeginInstallationPrefixDirectory(
cmSystemTools::SplitPath(installRootString.c_str(), installRoot); cmSystemTools::SplitPath(installRootString.c_str(), installRoot);
if(!installRoot.empty() && installRoot.back().empty()) if (!installRoot.empty() && installRoot.back().empty()) {
{
installRoot.pop_back(); installRoot.pop_back();
} }
for(size_t i = 1; i < installRoot.size(); ++i) for (size_t i = 1; i < installRoot.size(); ++i) {
{
BeginElement("Directory"); BeginElement("Directory");
if(i == installRoot.size() - 1) if (i == installRoot.size() - 1) {
{
AddAttribute("Id", "INSTALL_ROOT"); AddAttribute("Id", "INSTALL_ROOT");
} } else {
else
{
std::stringstream tmp; std::stringstream tmp;
tmp << "INSTALL_PREFIX_" << i; tmp << "INSTALL_PREFIX_" << i;
AddAttribute("Id", tmp.str()); AddAttribute("Id", tmp.str());
@ -88,8 +82,7 @@ size_t cmWIXDirectoriesSourceWriter::BeginInstallationPrefixDirectory(
void cmWIXDirectoriesSourceWriter::EndInstallationPrefixDirectory(size_t size) void cmWIXDirectoriesSourceWriter::EndInstallationPrefixDirectory(size_t size)
{ {
for(size_t i = 0; i < size; ++i) for (size_t i = 0; i < size; ++i) {
{
EndElement("Directory"); EndElement("Directory");
} }
} }

View File

@ -12,16 +12,14 @@
#include "cmWIXFeaturesSourceWriter.h" #include "cmWIXFeaturesSourceWriter.h"
cmWIXFeaturesSourceWriter::cmWIXFeaturesSourceWriter(cmCPackLog* logger, cmWIXFeaturesSourceWriter::cmWIXFeaturesSourceWriter(
std::string const& filename): cmCPackLog* logger, std::string const& filename)
cmWIXSourceWriter(logger, filename) : cmWIXSourceWriter(logger, filename)
{ {
} }
void cmWIXFeaturesSourceWriter::CreateCMakePackageRegistryEntry( void cmWIXFeaturesSourceWriter::CreateCMakePackageRegistryEntry(
std::string const& package, std::string const& package, std::string const& upgradeGuid)
std::string const& upgradeGuid)
{ {
BeginElement("Component"); BeginElement("Component");
AddAttribute("Id", "CM_PACKAGE_REGISTRY"); AddAttribute("Id", "CM_PACKAGE_REGISTRY");
@ -49,23 +47,22 @@ void cmWIXFeaturesSourceWriter::EmitFeatureForComponentGroup(
BeginElement("Feature"); BeginElement("Feature");
AddAttribute("Id", "CM_G_" + group.Name); AddAttribute("Id", "CM_G_" + group.Name);
if(group.IsExpandedByDefault) if (group.IsExpandedByDefault) {
{
AddAttribute("Display", "expand"); AddAttribute("Display", "expand");
} }
AddAttributeUnlessEmpty("Title", group.DisplayName); AddAttributeUnlessEmpty("Title", group.DisplayName);
AddAttributeUnlessEmpty("Description", group.Description); AddAttributeUnlessEmpty("Description", group.Description);
for(std::vector<cmCPackComponentGroup*>::const_iterator for (std::vector<cmCPackComponentGroup*>::const_iterator i =
i = group.Subgroups.begin(); i != group.Subgroups.end(); ++i) group.Subgroups.begin();
{ i != group.Subgroups.end(); ++i) {
EmitFeatureForComponentGroup(**i); EmitFeatureForComponentGroup(**i);
} }
for(std::vector<cmCPackComponent*>::const_iterator for (std::vector<cmCPackComponent*>::const_iterator i =
i = group.Components.begin(); i != group.Components.end(); ++i) group.Components.begin();
{ i != group.Components.end(); ++i) {
EmitFeatureForComponent(**i); EmitFeatureForComponent(**i);
} }
@ -81,13 +78,11 @@ void cmWIXFeaturesSourceWriter::EmitFeatureForComponent(
AddAttributeUnlessEmpty("Title", component.DisplayName); AddAttributeUnlessEmpty("Title", component.DisplayName);
AddAttributeUnlessEmpty("Description", component.Description); AddAttributeUnlessEmpty("Description", component.Description);
if(component.IsRequired) if (component.IsRequired) {
{
AddAttribute("Absent", "disallow"); AddAttribute("Absent", "disallow");
} }
if(component.IsHidden) if (component.IsHidden) {
{
AddAttribute("Display", "hidden"); AddAttribute("Display", "hidden");
} }

View File

@ -23,11 +23,9 @@
class cmWIXFeaturesSourceWriter : public cmWIXSourceWriter class cmWIXFeaturesSourceWriter : public cmWIXSourceWriter
{ {
public: public:
cmWIXFeaturesSourceWriter(cmCPackLog* logger, cmWIXFeaturesSourceWriter(cmCPackLog* logger, std::string const& filename);
std::string const& filename);
void CreateCMakePackageRegistryEntry( void CreateCMakePackageRegistryEntry(std::string const& package,
std::string const& package,
std::string const& upgradeGuid); std::string const& upgradeGuid);
void EmitFeatureForComponentGroup(const cmCPackComponentGroup& group); void EmitFeatureForComponentGroup(const cmCPackComponentGroup& group);

View File

@ -21,14 +21,12 @@
#include <sys/stat.h> #include <sys/stat.h>
cmWIXFilesSourceWriter::cmWIXFilesSourceWriter(cmCPackLog* logger, cmWIXFilesSourceWriter::cmWIXFilesSourceWriter(cmCPackLog* logger,
std::string const& filename): std::string const& filename)
cmWIXSourceWriter(logger, filename) : cmWIXSourceWriter(logger, filename)
{ {
} }
void cmWIXFilesSourceWriter::EmitShortcut( void cmWIXFilesSourceWriter::EmitShortcut(std::string const& id,
std::string const& id,
cmWIXShortcut const& shortcut, cmWIXShortcut const& shortcut,
std::string const& shortcutPrefix, std::string const& shortcutPrefix,
size_t shortcutIndex) size_t shortcutIndex)
@ -36,8 +34,7 @@ void cmWIXFilesSourceWriter::EmitShortcut(
std::stringstream shortcutId; std::stringstream shortcutId;
shortcutId << shortcutPrefix << id; shortcutId << shortcutPrefix << id;
if(shortcutIndex > 0) if (shortcutIndex > 0) {
{
shortcutId << "_" << shortcutIndex; shortcutId << "_" << shortcutIndex;
} }
@ -61,13 +58,11 @@ void cmWIXFilesSourceWriter::EmitRemoveFolder(std::string const& id)
} }
void cmWIXFilesSourceWriter::EmitInstallRegistryValue( void cmWIXFilesSourceWriter::EmitInstallRegistryValue(
std::string const& registryKey, std::string const& registryKey, std::string const& cpackComponentName,
std::string const& cpackComponentName,
std::string const& suffix) std::string const& suffix)
{ {
std::string valueName; std::string valueName;
if(!cpackComponentName.empty()) if (!cpackComponentName.empty()) {
{
valueName = cpackComponentName + "_"; valueName = cpackComponentName + "_";
} }
@ -97,12 +92,10 @@ void cmWIXFilesSourceWriter::EmitUninstallShortcut(
} }
std::string cmWIXFilesSourceWriter::EmitComponentCreateFolder( std::string cmWIXFilesSourceWriter::EmitComponentCreateFolder(
std::string const& directoryId, std::string const& directoryId, std::string const& guid,
std::string const& guid,
cmInstalledFile const* installedFile) cmInstalledFile const* installedFile)
{ {
std::string componentId = std::string componentId = std::string("CM_C_EMPTY_") + directoryId;
std::string("CM_C_EMPTY_") + directoryId;
BeginElement("DirectoryRef"); BeginElement("DirectoryRef");
AddAttribute("Id", directoryId); AddAttribute("Id", directoryId);
@ -113,8 +106,7 @@ std::string cmWIXFilesSourceWriter::EmitComponentCreateFolder(
BeginElement("CreateFolder"); BeginElement("CreateFolder");
if(installedFile) if (installedFile) {
{
cmWIXAccessControlList acl(Logger, *installedFile, *this); cmWIXAccessControlList acl(Logger, *installedFile, *this);
acl.Apply(); acl.Apply();
} }
@ -127,10 +119,8 @@ std::string cmWIXFilesSourceWriter::EmitComponentCreateFolder(
} }
std::string cmWIXFilesSourceWriter::EmitComponentFile( std::string cmWIXFilesSourceWriter::EmitComponentFile(
std::string const& directoryId, std::string const& directoryId, std::string const& id,
std::string const& id, std::string const& filePath, cmWIXPatch& patch,
std::string const& filePath,
cmWIXPatch &patch,
cmInstalledFile const* installedFile) cmInstalledFile const* installedFile)
{ {
std::string componentId = std::string("CM_C") + id; std::string componentId = std::string("CM_C") + id;
@ -143,14 +133,11 @@ std::string cmWIXFilesSourceWriter::EmitComponentFile(
AddAttribute("Id", componentId); AddAttribute("Id", componentId);
AddAttribute("Guid", "*"); AddAttribute("Guid", "*");
if(installedFile) if (installedFile) {
{ if (installedFile->GetPropertyAsBool("CPACK_NEVER_OVERWRITE")) {
if(installedFile->GetPropertyAsBool("CPACK_NEVER_OVERWRITE"))
{
AddAttribute("NeverOverwrite", "yes"); AddAttribute("NeverOverwrite", "yes");
} }
if(installedFile->GetPropertyAsBool("CPACK_PERMANENT")) if (installedFile->GetPropertyAsBool("CPACK_PERMANENT")) {
{
AddAttribute("Permanent", "yes"); AddAttribute("Permanent", "yes");
} }
} }
@ -163,13 +150,11 @@ std::string cmWIXFilesSourceWriter::EmitComponentFile(
mode_t fileMode = 0; mode_t fileMode = 0;
cmSystemTools::GetPermissions(filePath.c_str(), fileMode); cmSystemTools::GetPermissions(filePath.c_str(), fileMode);
if(!(fileMode & S_IWRITE)) if (!(fileMode & S_IWRITE)) {
{
AddAttribute("ReadOnly", "yes"); AddAttribute("ReadOnly", "yes");
} }
if(installedFile) if (installedFile) {
{
cmWIXAccessControlList acl(Logger, *installedFile, *this); cmWIXAccessControlList acl(Logger, *installedFile, *this);
acl.Apply(); acl.Apply();
} }

View File

@ -26,36 +26,27 @@
class cmWIXFilesSourceWriter : public cmWIXSourceWriter class cmWIXFilesSourceWriter : public cmWIXSourceWriter
{ {
public: public:
cmWIXFilesSourceWriter(cmCPackLog* logger, cmWIXFilesSourceWriter(cmCPackLog* logger, std::string const& filename);
std::string const& filename);
void EmitShortcut( void EmitShortcut(std::string const& id, cmWIXShortcut const& shortcut,
std::string const& id, std::string const& shortcutPrefix, size_t shortcutIndex);
cmWIXShortcut const& shortcut,
std::string const& shortcutPrefix,
size_t shortcutIndex);
void EmitRemoveFolder(std::string const& id); void EmitRemoveFolder(std::string const& id);
void EmitInstallRegistryValue( void EmitInstallRegistryValue(std::string const& registryKey,
std::string const& registryKey,
std::string const& cpackComponentName, std::string const& cpackComponentName,
std::string const& suffix); std::string const& suffix);
void EmitUninstallShortcut(std::string const& packageName); void EmitUninstallShortcut(std::string const& packageName);
std::string EmitComponentCreateFolder( std::string EmitComponentCreateFolder(std::string const& directoryId,
std::string const& directoryId,
std::string const& guid, std::string const& guid,
cmInstalledFile const* installedFile); cmInstalledFile const* installedFile);
std::string EmitComponentFile( std::string EmitComponentFile(std::string const& directoryId,
std::string const& directoryId,
std::string const& id, std::string const& id,
std::string const& filePath, std::string const& filePath, cmWIXPatch& patch,
cmWIXPatch &patch,
cmInstalledFile const* installedFile); cmInstalledFile const* installedFile);
}; };
#endif #endif

View File

@ -14,31 +14,29 @@
#include <CPack/cmCPackGenerator.h> #include <CPack/cmCPackGenerator.h>
cmWIXPatch::cmWIXPatch(cmCPackLog* logger): cmWIXPatch::cmWIXPatch(cmCPackLog* logger)
Logger(logger) : Logger(logger)
{ {
} }
bool cmWIXPatch::LoadFragments(std::string const& patchFilePath) bool cmWIXPatch::LoadFragments(std::string const& patchFilePath)
{ {
cmWIXPatchParser parser(Fragments, Logger); cmWIXPatchParser parser(Fragments, Logger);
if(!parser.ParseFile(patchFilePath.c_str())) if (!parser.ParseFile(patchFilePath.c_str())) {
{ cmCPackLogger(cmCPackLog::LOG_ERROR, "Failed parsing XML patch file: '"
cmCPackLogger(cmCPackLog::LOG_ERROR, << patchFilePath << "'" << std::endl);
"Failed parsing XML patch file: '" <<
patchFilePath << "'" << std::endl);
return false; return false;
} }
return true; return true;
} }
void cmWIXPatch::ApplyFragment( void cmWIXPatch::ApplyFragment(std::string const& id,
std::string const& id, cmWIXSourceWriter& writer) cmWIXSourceWriter& writer)
{ {
cmWIXPatchParser::fragment_map_t::iterator i = Fragments.find(id); cmWIXPatchParser::fragment_map_t::iterator i = Fragments.find(id);
if(i == Fragments.end()) return; if (i == Fragments.end())
return;
const cmWIXPatchElement& fragment = i->second; const cmWIXPatchElement& fragment = i->second;
@ -47,16 +45,15 @@ void cmWIXPatch::ApplyFragment(
Fragments.erase(i); Fragments.erase(i);
} }
void cmWIXPatch::ApplyElementChildren( void cmWIXPatch::ApplyElementChildren(const cmWIXPatchElement& element,
const cmWIXPatchElement& element, cmWIXSourceWriter& writer) cmWIXSourceWriter& writer)
{ {
for(cmWIXPatchElement::child_list_t::const_iterator for (cmWIXPatchElement::child_list_t::const_iterator j =
j = element.children.begin(); j != element.children.end(); ++j) element.children.begin();
{ j != element.children.end(); ++j) {
cmWIXPatchNode *node = *j; cmWIXPatchNode* node = *j;
switch(node->type()) switch (node->type()) {
{
case cmWIXPatchNode::ELEMENT: case cmWIXPatchNode::ELEMENT:
ApplyElement(dynamic_cast<const cmWIXPatchElement&>(*node), writer); ApplyElement(dynamic_cast<const cmWIXPatchElement&>(*node), writer);
break; break;
@ -67,14 +64,14 @@ void cmWIXPatch::ApplyElementChildren(
} }
} }
void cmWIXPatch::ApplyElement( void cmWIXPatch::ApplyElement(const cmWIXPatchElement& element,
const cmWIXPatchElement& element, cmWIXSourceWriter& writer) cmWIXSourceWriter& writer)
{ {
writer.BeginElement(element.name); writer.BeginElement(element.name);
for(cmWIXPatchElement::attributes_t::const_iterator for (cmWIXPatchElement::attributes_t::const_iterator i =
i = element.attributes.begin(); i != element.attributes.end(); ++i) element.attributes.begin();
{ i != element.attributes.end(); ++i) {
writer.AddAttribute(i->first, i->second); writer.AddAttribute(i->first, i->second);
} }
@ -86,11 +83,9 @@ void cmWIXPatch::ApplyElement(
bool cmWIXPatch::CheckForUnappliedFragments() bool cmWIXPatch::CheckForUnappliedFragments()
{ {
std::string fragmentList; std::string fragmentList;
for(cmWIXPatchParser::fragment_map_t::const_iterator for (cmWIXPatchParser::fragment_map_t::const_iterator i = Fragments.begin();
i = Fragments.begin(); i != Fragments.end(); ++i) i != Fragments.end(); ++i) {
{ if (!fragmentList.empty()) {
if(!fragmentList.empty())
{
fragmentList += ", "; fragmentList += ", ";
} }
@ -99,11 +94,10 @@ bool cmWIXPatch::CheckForUnappliedFragments()
fragmentList += "'"; fragmentList += "'";
} }
if(!fragmentList.empty()) if (!fragmentList.empty()) {
{
cmCPackLogger(cmCPackLog::LOG_ERROR, cmCPackLogger(cmCPackLog::LOG_ERROR,
"Some XML patch fragments did not have matching IDs: " << "Some XML patch fragments did not have matching IDs: "
fragmentList << std::endl); << fragmentList << std::endl);
return false; return false;
} }

View File

@ -44,5 +44,4 @@ private:
cmWIXPatchParser::fragment_map_t Fragments; cmWIXPatchParser::fragment_map_t Fragments;
}; };
#endif #endif

View File

@ -28,65 +28,50 @@ cmWIXPatchNode::Type cmWIXPatchElement::type()
cmWIXPatchNode::~cmWIXPatchNode() cmWIXPatchNode::~cmWIXPatchNode()
{ {
} }
cmWIXPatchElement::~cmWIXPatchElement() cmWIXPatchElement::~cmWIXPatchElement()
{ {
for(child_list_t::iterator i = children.begin(); i != children.end(); ++i) for (child_list_t::iterator i = children.begin(); i != children.end(); ++i) {
{
delete *i; delete *i;
} }
} }
cmWIXPatchParser::cmWIXPatchParser( cmWIXPatchParser::cmWIXPatchParser(fragment_map_t& fragments,
fragment_map_t& fragments, cmCPackLog* logger): cmCPackLog* logger)
Logger(logger), : Logger(logger)
State(BEGIN_DOCUMENT), , State(BEGIN_DOCUMENT)
Valid(true), , Valid(true)
Fragments(fragments) , Fragments(fragments)
{ {
} }
void cmWIXPatchParser::StartElement(const std::string& name, const char **atts) void cmWIXPatchParser::StartElement(const std::string& name, const char** atts)
{ {
if(State == BEGIN_DOCUMENT) if (State == BEGIN_DOCUMENT) {
{ if (name == "CPackWiXPatch") {
if(name == "CPackWiXPatch")
{
State = BEGIN_FRAGMENTS; State = BEGIN_FRAGMENTS;
} } else {
else
{
ReportValidationError("Expected root element 'CPackWiXPatch'"); ReportValidationError("Expected root element 'CPackWiXPatch'");
} }
} } else if (State == BEGIN_FRAGMENTS) {
else if(State == BEGIN_FRAGMENTS) if (name == "CPackWiXFragment") {
{
if(name == "CPackWiXFragment")
{
State = INSIDE_FRAGMENT; State = INSIDE_FRAGMENT;
StartFragment(atts); StartFragment(atts);
} } else {
else
{
ReportValidationError("Expected 'CPackWixFragment' element"); ReportValidationError("Expected 'CPackWixFragment' element");
} }
} } else if (State == INSIDE_FRAGMENT) {
else if(State == INSIDE_FRAGMENT) cmWIXPatchElement& parent = *ElementStack.back();
{
cmWIXPatchElement &parent = *ElementStack.back();
cmWIXPatchElement *element = new cmWIXPatchElement; cmWIXPatchElement* element = new cmWIXPatchElement;
parent.children.push_back(element); parent.children.push_back(element);
element->name = name; element->name = name;
for(size_t i = 0; atts[i]; i += 2) for (size_t i = 0; atts[i]; i += 2) {
{
std::string key = atts[i]; std::string key = atts[i];
std::string value = atts[i+1]; std::string value = atts[i + 1];
element->attributes[key] = value; element->attributes[key] = value;
} }
@ -95,26 +80,21 @@ void cmWIXPatchParser::StartElement(const std::string& name, const char **atts)
} }
} }
void cmWIXPatchParser::StartFragment(const char **attributes) void cmWIXPatchParser::StartFragment(const char** attributes)
{ {
for(size_t i = 0; attributes[i]; i += 2) for (size_t i = 0; attributes[i]; i += 2) {
{
std::string key = attributes[i]; std::string key = attributes[i];
std::string value = attributes[i+1]; std::string value = attributes[i + 1];
if(key == "Id") if (key == "Id") {
{ if (Fragments.find(value) != Fragments.end()) {
if(Fragments.find(value) != Fragments.end())
{
std::stringstream tmp; std::stringstream tmp;
tmp << "Invalid reuse of 'CPackWixFragment' 'Id': " << value; tmp << "Invalid reuse of 'CPackWixFragment' 'Id': " << value;
ReportValidationError(tmp.str()); ReportValidationError(tmp.str());
} }
ElementStack.push_back(&Fragments[value]); ElementStack.push_back(&Fragments[value]);
} } else {
else
{
ReportValidationError( ReportValidationError(
"The only allowed 'CPackWixFragment' attribute is 'Id'"); "The only allowed 'CPackWixFragment' attribute is 'Id'");
} }
@ -123,15 +103,11 @@ void cmWIXPatchParser::StartFragment(const char **attributes)
void cmWIXPatchParser::EndElement(const std::string& name) void cmWIXPatchParser::EndElement(const std::string& name)
{ {
if(State == INSIDE_FRAGMENT) if (State == INSIDE_FRAGMENT) {
{ if (name == "CPackWiXFragment") {
if(name == "CPackWiXFragment")
{
State = BEGIN_FRAGMENTS; State = BEGIN_FRAGMENTS;
ElementStack.clear(); ElementStack.clear();
} } else {
else
{
ElementStack.pop_back(); ElementStack.pop_back();
} }
} }
@ -141,18 +117,16 @@ void cmWIXPatchParser::CharacterDataHandler(const char* data, int length)
{ {
const char* whitespace = "\x20\x09\x0d\x0a"; const char* whitespace = "\x20\x09\x0d\x0a";
if(State == INSIDE_FRAGMENT) if (State == INSIDE_FRAGMENT) {
{ cmWIXPatchElement& parent = *ElementStack.back();
cmWIXPatchElement &parent = *ElementStack.back();
std::string text(data, length); std::string text(data, length);
std::string::size_type first = text.find_first_not_of(whitespace); std::string::size_type first = text.find_first_not_of(whitespace);
std::string::size_type last = text.find_last_not_of(whitespace); std::string::size_type last = text.find_last_not_of(whitespace);
if(first != std::string::npos && last != std::string::npos) if (first != std::string::npos && last != std::string::npos) {
{ cmWIXPatchText* text_node = new cmWIXPatchText;
cmWIXPatchText *text_node = new cmWIXPatchText;
text_node->text = text.substr(first, last - first + 1); text_node->text = text.substr(first, last - first + 1);
parent.children.push_back(text_node); parent.children.push_back(text_node);
@ -163,14 +137,15 @@ void cmWIXPatchParser::CharacterDataHandler(const char* data, int length)
void cmWIXPatchParser::ReportError(int line, int column, const char* msg) void cmWIXPatchParser::ReportError(int line, int column, const char* msg)
{ {
cmCPackLogger(cmCPackLog::LOG_ERROR, cmCPackLogger(cmCPackLog::LOG_ERROR,
"Error while processing XML patch file at " << line << ":" << column << "Error while processing XML patch file at "
": "<< msg << std::endl); << line << ":" << column << ": " << msg << std::endl);
Valid = false; Valid = false;
} }
void cmWIXPatchParser::ReportValidationError(std::string const& message) void cmWIXPatchParser::ReportValidationError(std::string const& message)
{ {
ReportError(XML_GetCurrentLineNumber(static_cast<XML_Parser>(this->Parser)), ReportError(
XML_GetCurrentLineNumber(static_cast<XML_Parser>(this->Parser)),
XML_GetCurrentColumnNumber(static_cast<XML_Parser>(this->Parser)), XML_GetCurrentColumnNumber(static_cast<XML_Parser>(this->Parser)),
message.c_str()); message.c_str());
} }

View File

@ -65,9 +65,9 @@ public:
cmWIXPatchParser(fragment_map_t& Fragments, cmCPackLog* logger); cmWIXPatchParser(fragment_map_t& Fragments, cmCPackLog* logger);
private: private:
virtual void StartElement(const std::string& name, const char **atts); virtual void StartElement(const std::string& name, const char** atts);
void StartFragment(const char **attributes); void StartFragment(const char** attributes);
virtual void EndElement(const std::string& name); virtual void EndElement(const std::string& name);

View File

@ -15,8 +15,8 @@
#include <cmVersion.h> #include <cmVersion.h>
cmWIXRichTextFormatWriter::cmWIXRichTextFormatWriter( cmWIXRichTextFormatWriter::cmWIXRichTextFormatWriter(
std::string const& filename): std::string const& filename)
File(filename.c_str(), std::ios::binary) : File(filename.c_str(), std::ios::binary)
{ {
StartGroup(); StartGroup();
WriteHeader(); WriteHeader();
@ -37,12 +37,10 @@ void cmWIXRichTextFormatWriter::AddText(std::string const& text)
{ {
typedef unsigned char rtf_byte_t; typedef unsigned char rtf_byte_t;
for(size_t i = 0; i < text.size(); ++i) for (size_t i = 0; i < text.size(); ++i) {
{
rtf_byte_t c = rtf_byte_t(text[i]); rtf_byte_t c = rtf_byte_t(text[i]);
switch(c) switch (c) {
{
case '\\': case '\\':
File << "\\\\"; File << "\\\\";
break; break;
@ -57,52 +55,30 @@ void cmWIXRichTextFormatWriter::AddText(std::string const& text)
break; break;
case '\r': case '\r':
continue; continue;
default: default: {
{ if (c <= 0x7F) {
if(c <= 0x7F)
{
File << c; File << c;
} } else {
else if (c <= 0xC0) {
{
if(c <= 0xC0)
{
EmitInvalidCodepoint(c); EmitInvalidCodepoint(c);
} } else if (c < 0xE0 && i + 1 < text.size()) {
else if(c < 0xE0 && i+1 < text.size()) EmitUnicodeCodepoint((text[i + 1] & 0x3F) | ((c & 0x1F) << 6));
{ i += 1;
EmitUnicodeCodepoint( } else if (c < 0xF0 && i + 2 < text.size()) {
(text[i+1] & 0x3F) | EmitUnicodeCodepoint((text[i + 2] & 0x3F) |
((c & 0x1F) << 6) ((text[i + 1] & 0x3F) << 6) |
); ((c & 0xF) << 12));
i+= 1;
}
else if(c < 0xF0 && i+2 < text.size())
{
EmitUnicodeCodepoint(
(text[i+2] & 0x3F) |
((text[i+1] & 0x3F) << 6) |
((c & 0xF) << 12)
);
i += 2; i += 2;
} } else if (c < 0xF8 && i + 3 < text.size()) {
else if(c < 0xF8 && i+3 < text.size())
{
EmitUnicodeCodepoint( EmitUnicodeCodepoint(
(text[i+3] & 0x3F) | (text[i + 3] & 0x3F) | ((text[i + 2] & 0x3F) << 6) |
((text[i+2] & 0x3F) << 6) | ((text[i + 1] & 0x3F) << 12) | ((c & 0x7) << 18));
((text[i+1] & 0x3F) << 12) |
((c & 0x7) << 18)
);
i += 3; i += 3;
} } else {
else
{
EmitInvalidCodepoint(c); EmitInvalidCodepoint(c);
} }
} }
} } break;
break;
} }
} }
} }
@ -190,16 +166,11 @@ void cmWIXRichTextFormatWriter::EndGroup()
void cmWIXRichTextFormatWriter::EmitUnicodeCodepoint(int c) void cmWIXRichTextFormatWriter::EmitUnicodeCodepoint(int c)
{ {
// Do not emit byte order mark (BOM) // Do not emit byte order mark (BOM)
if(c == 0xFEFF) if (c == 0xFEFF) {
{
return; return;
} } else if (c <= 0xFFFF) {
else if(c <= 0xFFFF)
{
EmitUnicodeSurrogate(c); EmitUnicodeSurrogate(c);
} } else {
else
{
c -= 0x10000; c -= 0x10000;
EmitUnicodeSurrogate(((c >> 10) & 0x3FF) + 0xD800); EmitUnicodeSurrogate(((c >> 10) & 0x3FF) + 0xD800);
EmitUnicodeSurrogate((c & 0x3FF) + 0xDC00); EmitUnicodeSurrogate((c & 0x3FF) + 0xDC00);
@ -209,12 +180,9 @@ void cmWIXRichTextFormatWriter::EmitUnicodeCodepoint(int c)
void cmWIXRichTextFormatWriter::EmitUnicodeSurrogate(int c) void cmWIXRichTextFormatWriter::EmitUnicodeSurrogate(int c)
{ {
ControlWord("u"); ControlWord("u");
if(c <= 32767) if (c <= 32767) {
{
File << c; File << c;
} } else {
else
{
File << (c - 65536); File << (c - 65536);
} }
File << "?"; File << "?";

View File

@ -14,8 +14,8 @@
#include "cmWIXFilesSourceWriter.h" #include "cmWIXFilesSourceWriter.h"
void cmWIXShortcuts::insert( void cmWIXShortcuts::insert(Type type, std::string const& id,
Type type, std::string const& id, cmWIXShortcut const& shortcut) cmWIXShortcut const& shortcut)
{ {
this->Shortcuts[type][id].push_back(shortcut); this->Shortcuts[type][id].push_back(shortcut);
} }
@ -26,15 +26,13 @@ bool cmWIXShortcuts::empty(Type type) const
} }
bool cmWIXShortcuts::EmitShortcuts( bool cmWIXShortcuts::EmitShortcuts(
Type type, Type type, std::string const& registryKey,
std::string const& registryKey,
std::string const& cpackComponentName, std::string const& cpackComponentName,
cmWIXFilesSourceWriter& fileDefinitions) const cmWIXFilesSourceWriter& fileDefinitions) const
{ {
shortcut_type_map_t::const_iterator i = this->Shortcuts.find(type); shortcut_type_map_t::const_iterator i = this->Shortcuts.find(type);
if(i == this->Shortcuts.end()) if (i == this->Shortcuts.end()) {
{
return false; return false;
} }
@ -43,8 +41,7 @@ bool cmWIXShortcuts::EmitShortcuts(
std::string shortcutPrefix; std::string shortcutPrefix;
std::string registrySuffix; std::string registrySuffix;
switch(type) switch (type) {
{
case START_MENU: case START_MENU:
shortcutPrefix = "CM_S"; shortcutPrefix = "CM_S";
break; break;
@ -60,63 +57,56 @@ bool cmWIXShortcuts::EmitShortcuts(
return false; return false;
} }
for(shortcut_id_map_t::const_iterator j = id_map.begin(); for (shortcut_id_map_t::const_iterator j = id_map.begin(); j != id_map.end();
j != id_map.end(); ++j) ++j) {
{
std::string const& id = j->first; std::string const& id = j->first;
shortcut_list_t const& shortcutList = j->second; shortcut_list_t const& shortcutList = j->second;
for(size_t shortcutListIndex = 0; for (size_t shortcutListIndex = 0; shortcutListIndex < shortcutList.size();
shortcutListIndex < shortcutList.size(); ++shortcutListIndex) ++shortcutListIndex) {
{
cmWIXShortcut const& shortcut = shortcutList[shortcutListIndex]; cmWIXShortcut const& shortcut = shortcutList[shortcutListIndex];
fileDefinitions.EmitShortcut(id, shortcut, fileDefinitions.EmitShortcut(id, shortcut, shortcutPrefix,
shortcutPrefix, shortcutListIndex); shortcutListIndex);
} }
} }
fileDefinitions.EmitInstallRegistryValue( fileDefinitions.EmitInstallRegistryValue(registryKey, cpackComponentName,
registryKey, cpackComponentName, registrySuffix); registrySuffix);
return true; return true;
} }
void cmWIXShortcuts::AddShortcutTypes(std::set<Type>& types) void cmWIXShortcuts::AddShortcutTypes(std::set<Type>& types)
{ {
for(shortcut_type_map_t::const_iterator i = this->Shortcuts.begin(); for (shortcut_type_map_t::const_iterator i = this->Shortcuts.begin();
i != this->Shortcuts.end(); ++i) i != this->Shortcuts.end(); ++i) {
{
types.insert(i->first); types.insert(i->first);
} }
} }
void cmWIXShortcuts::CreateFromProperties( void cmWIXShortcuts::CreateFromProperties(std::string const& id,
std::string const& id,
std::string const& directoryId, std::string const& directoryId,
cmInstalledFile const& installedFile) cmInstalledFile const& installedFile)
{ {
CreateFromProperty("CPACK_START_MENU_SHORTCUTS", CreateFromProperty("CPACK_START_MENU_SHORTCUTS", START_MENU, id, directoryId,
START_MENU, id, directoryId, installedFile); installedFile);
CreateFromProperty("CPACK_DESKTOP_SHORTCUTS", CreateFromProperty("CPACK_DESKTOP_SHORTCUTS", DESKTOP, id, directoryId,
DESKTOP, id, directoryId, installedFile); installedFile);
CreateFromProperty("CPACK_STARTUP_SHORTCUTS", CreateFromProperty("CPACK_STARTUP_SHORTCUTS", STARTUP, id, directoryId,
STARTUP, id, directoryId, installedFile); installedFile);
} }
void cmWIXShortcuts::CreateFromProperty( void cmWIXShortcuts::CreateFromProperty(std::string const& propertyName,
std::string const& propertyName, Type type, std::string const& id,
Type type,
std::string const& id,
std::string const& directoryId, std::string const& directoryId,
cmInstalledFile const& installedFile) cmInstalledFile const& installedFile)
{ {
std::vector<std::string> list; std::vector<std::string> list;
installedFile.GetPropertyAsList(propertyName, list); installedFile.GetPropertyAsList(propertyName, list);
for(size_t i = 0; i < list.size(); ++i) for (size_t i = 0; i < list.size(); ++i) {
{
cmWIXShortcut shortcut; cmWIXShortcut shortcut;
shortcut.label = list[i]; shortcut.label = list[i];
shortcut.workingDirectoryId = directoryId; shortcut.workingDirectoryId = directoryId;

View File

@ -45,23 +45,20 @@ public:
bool empty(Type type) const; bool empty(Type type) const;
bool EmitShortcuts( bool EmitShortcuts(Type type, std::string const& registryKey,
Type type,
std::string const& registryKey,
std::string const& cpackComponentName, std::string const& cpackComponentName,
cmWIXFilesSourceWriter& fileDefinitions) const; cmWIXFilesSourceWriter& fileDefinitions) const;
void AddShortcutTypes(std::set<Type>& types); void AddShortcutTypes(std::set<Type>& types);
void CreateFromProperties(std::string const& id, void CreateFromProperties(std::string const& id,
std::string const& directoryId, cmInstalledFile const& installedFile); std::string const& directoryId,
cmInstalledFile const& installedFile);
private: private:
typedef std::map<Type, shortcut_id_map_t> shortcut_type_map_t; typedef std::map<Type, shortcut_id_map_t> shortcut_type_map_t;
void CreateFromProperty( void CreateFromProperty(std::string const& propertyName, Type type,
std::string const& propertyName,
Type type,
std::string const& id, std::string const& id,
std::string const& directoryId, std::string const& directoryId,
cmInstalledFile const& installedFile); cmInstalledFile const& installedFile);

View File

@ -18,20 +18,17 @@
cmWIXSourceWriter::cmWIXSourceWriter(cmCPackLog* logger, cmWIXSourceWriter::cmWIXSourceWriter(cmCPackLog* logger,
std::string const& filename, std::string const& filename,
bool isIncludeFile): bool isIncludeFile)
Logger(logger), : Logger(logger)
File(filename.c_str()), , File(filename.c_str())
State(DEFAULT), , State(DEFAULT)
SourceFilename(filename) , SourceFilename(filename)
{ {
WriteXMLDeclaration(); WriteXMLDeclaration();
if(isIncludeFile) if (isIncludeFile) {
{
BeginElement("Include"); BeginElement("Include");
} } else {
else
{
BeginElement("Wix"); BeginElement("Wix");
} }
@ -40,11 +37,10 @@ cmWIXSourceWriter::cmWIXSourceWriter(cmCPackLog* logger,
cmWIXSourceWriter::~cmWIXSourceWriter() cmWIXSourceWriter::~cmWIXSourceWriter()
{ {
if(Elements.size() > 1) if (Elements.size() > 1) {
{ cmCPackLogger(cmCPackLog::LOG_ERROR, Elements.size() - 1
cmCPackLogger(cmCPackLog::LOG_ERROR, << " WiX elements were still open when closing '"
Elements.size() - 1 << " WiX elements were still open when closing '" << << SourceFilename << "'" << std::endl);
SourceFilename << "'" << std::endl);
return; return;
} }
@ -53,8 +49,7 @@ cmWIXSourceWriter::~cmWIXSourceWriter()
void cmWIXSourceWriter::BeginElement(std::string const& name) void cmWIXSourceWriter::BeginElement(std::string const& name)
{ {
if(State == BEGIN) if (State == BEGIN) {
{
File << ">"; File << ">";
} }
@ -68,31 +63,25 @@ void cmWIXSourceWriter::BeginElement(std::string const& name)
void cmWIXSourceWriter::EndElement(std::string const& name) void cmWIXSourceWriter::EndElement(std::string const& name)
{ {
if(Elements.empty()) if (Elements.empty()) {
{
cmCPackLogger(cmCPackLog::LOG_ERROR, cmCPackLogger(cmCPackLog::LOG_ERROR,
"can not end WiX element with no open elements in '" << "can not end WiX element with no open elements in '"
SourceFilename << "'" << std::endl); << SourceFilename << "'" << std::endl);
return; return;
} }
if(Elements.back() != name) if (Elements.back() != name) {
{ cmCPackLogger(cmCPackLog::LOG_ERROR, "WiX element <"
cmCPackLogger(cmCPackLog::LOG_ERROR, << Elements.back() << "> can not be closed by </" << name
"WiX element <" << Elements.back() << << "> in '" << SourceFilename << "'" << std::endl);
"> can not be closed by </" << name << "> in '" <<
SourceFilename << "'" << std::endl);
return; return;
} }
if(State == DEFAULT) if (State == DEFAULT) {
{
File << "\n"; File << "\n";
Indent(Elements.size()-1); Indent(Elements.size() - 1);
File << "</" << Elements.back() << ">"; File << "</" << Elements.back() << ">";
} } else {
else
{
File << "/>"; File << "/>";
} }
@ -102,16 +91,14 @@ void cmWIXSourceWriter::EndElement(std::string const& name)
void cmWIXSourceWriter::AddTextNode(std::string const& text) void cmWIXSourceWriter::AddTextNode(std::string const& text)
{ {
if(State == BEGIN) if (State == BEGIN) {
{
File << ">"; File << ">";
} }
if(Elements.empty()) if (Elements.empty()) {
{
cmCPackLogger(cmCPackLog::LOG_ERROR, cmCPackLogger(cmCPackLog::LOG_ERROR,
"can not add text without open WiX element in '" << "can not add text without open WiX element in '"
SourceFilename << "'" << std::endl); << SourceFilename << "'" << std::endl);
return; return;
} }
@ -119,11 +106,10 @@ void cmWIXSourceWriter::AddTextNode(std::string const& text)
State = DEFAULT; State = DEFAULT;
} }
void cmWIXSourceWriter::AddProcessingInstruction( void cmWIXSourceWriter::AddProcessingInstruction(std::string const& target,
std::string const& target, std::string const& content) std::string const& content)
{ {
if(State == BEGIN) if (State == BEGIN) {
{
File << ">"; File << ">";
} }
@ -134,19 +120,18 @@ void cmWIXSourceWriter::AddProcessingInstruction(
State = DEFAULT; State = DEFAULT;
} }
void cmWIXSourceWriter::AddAttribute( void cmWIXSourceWriter::AddAttribute(std::string const& key,
std::string const& key, std::string const& value) std::string const& value)
{ {
std::string utf8 = CMakeEncodingToUtf8(value); std::string utf8 = CMakeEncodingToUtf8(value);
File << " " << key << "=\"" << EscapeAttributeValue(utf8) << '"'; File << " " << key << "=\"" << EscapeAttributeValue(utf8) << '"';
} }
void cmWIXSourceWriter::AddAttributeUnlessEmpty( void cmWIXSourceWriter::AddAttributeUnlessEmpty(std::string const& key,
std::string const& key, std::string const& value) std::string const& value)
{ {
if(!value.empty()) if (!value.empty()) {
{
AddAttribute(key, value); AddAttribute(key, value);
} }
} }
@ -156,30 +141,26 @@ std::string cmWIXSourceWriter::CMakeEncodingToUtf8(std::string const& value)
#ifdef CMAKE_ENCODING_UTF8 #ifdef CMAKE_ENCODING_UTF8
return value; return value;
#else #else
if(value.empty()) if (value.empty()) {
{
return std::string(); return std::string();
} }
int characterCount = MultiByteToWideChar( int characterCount = MultiByteToWideChar(
CP_ACP, 0, value.c_str(), static_cast<int>(value.size()), 0, 0); CP_ACP, 0, value.c_str(), static_cast<int>(value.size()), 0, 0);
if(characterCount == 0) if (characterCount == 0) {
{
return std::string(); return std::string();
} }
std::vector<wchar_t> utf16(characterCount); std::vector<wchar_t> utf16(characterCount);
MultiByteToWideChar( MultiByteToWideChar(CP_ACP, 0, value.c_str(), static_cast<int>(value.size()),
CP_ACP, 0, value.c_str(), static_cast<int>(value.size()),
&utf16[0], static_cast<int>(utf16.size())); &utf16[0], static_cast<int>(utf16.size()));
int utf8ByteCount = WideCharToMultiByte( int utf8ByteCount = WideCharToMultiByte(
CP_UTF8, 0, &utf16[0], static_cast<int>(utf16.size()), 0, 0, 0, 0); CP_UTF8, 0, &utf16[0], static_cast<int>(utf16.size()), 0, 0, 0, 0);
if(utf8ByteCount == 0) if (utf8ByteCount == 0) {
{
return std::string(); return std::string();
} }
@ -192,7 +173,6 @@ std::string cmWIXSourceWriter::CMakeEncodingToUtf8(std::string const& value)
#endif #endif
} }
void cmWIXSourceWriter::WriteXMLDeclaration() void cmWIXSourceWriter::WriteXMLDeclaration()
{ {
File << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" << std::endl; File << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" << std::endl;
@ -200,24 +180,20 @@ void cmWIXSourceWriter::WriteXMLDeclaration()
void cmWIXSourceWriter::Indent(size_t count) void cmWIXSourceWriter::Indent(size_t count)
{ {
for(size_t i = 0; i < count; ++i) for (size_t i = 0; i < count; ++i) {
{
File << " "; File << " ";
} }
} }
std::string cmWIXSourceWriter::EscapeAttributeValue( std::string cmWIXSourceWriter::EscapeAttributeValue(std::string const& value)
std::string const& value)
{ {
std::string result; std::string result;
result.reserve(value.size()); result.reserve(value.size());
char c = 0; char c = 0;
for(size_t i = 0 ; i < value.size(); ++i) for (size_t i = 0; i < value.size(); ++i) {
{
c = value[i]; c = value[i];
switch(c) switch (c) {
{
case '<': case '<':
result += "&lt;"; result += "&lt;";
break; break;
@ -225,7 +201,7 @@ std::string cmWIXSourceWriter::EscapeAttributeValue(
result += "&gt;"; result += "&gt;";
break; break;
case '&': case '&':
result +="&amp;"; result += "&amp;";
break; break;
case '"': case '"':
result += "&quot;"; result += "&quot;";

View File

@ -26,8 +26,8 @@
class cmWIXSourceWriter class cmWIXSourceWriter
{ {
public: public:
cmWIXSourceWriter(cmCPackLog* logger, cmWIXSourceWriter(cmCPackLog* logger, std::string const& filename,
std::string const& filename, bool isIncludeFile = false); bool isIncludeFile = false);
~cmWIXSourceWriter(); ~cmWIXSourceWriter();
@ -37,14 +37,13 @@ public:
void AddTextNode(std::string const& text); void AddTextNode(std::string const& text);
void AddProcessingInstruction( void AddProcessingInstruction(std::string const& target,
std::string const& target, std::string const& content); std::string const& content);
void AddAttribute( void AddAttribute(std::string const& key, std::string const& value);
std::string const& key, std::string const& value);
void AddAttributeUnlessEmpty( void AddAttributeUnlessEmpty(std::string const& key,
std::string const& key, std::string const& value); std::string const& value);
static std::string CMakeEncodingToUtf8(std::string const& value); static std::string CMakeEncodingToUtf8(std::string const& value);

View File

@ -13,8 +13,7 @@
#include "cmCPack7zGenerator.h" #include "cmCPack7zGenerator.h"
cmCPack7zGenerator::cmCPack7zGenerator() cmCPack7zGenerator::cmCPack7zGenerator()
:cmCPackArchiveGenerator(cmArchiveWrite::CompressNone, : cmCPackArchiveGenerator(cmArchiveWrite::CompressNone, "7zip")
"7zip")
{ {
} }

View File

@ -40,45 +40,38 @@ int cmCPackArchiveGenerator::InitializeInternal()
this->SetOptionIfNotSet("CPACK_INCLUDE_TOPLEVEL_DIRECTORY", "1"); this->SetOptionIfNotSet("CPACK_INCLUDE_TOPLEVEL_DIRECTORY", "1");
return this->Superclass::InitializeInternal(); return this->Superclass::InitializeInternal();
} }
int cmCPackArchiveGenerator::addOneComponentToArchive(cmArchiveWrite& archive, int cmCPackArchiveGenerator::addOneComponentToArchive(
cmCPackComponent* component) cmArchiveWrite& archive, cmCPackComponent* component)
{ {
cmCPackLogger(cmCPackLog::LOG_VERBOSE, " - packaging component: " cmCPackLogger(cmCPackLog::LOG_VERBOSE,
<< component->Name " - packaging component: " << component->Name << std::endl);
<< std::endl);
// Add the files of this component to the archive // Add the files of this component to the archive
std::string localToplevel(this->GetOption("CPACK_TEMPORARY_DIRECTORY")); std::string localToplevel(this->GetOption("CPACK_TEMPORARY_DIRECTORY"));
localToplevel += "/"+ component->Name; localToplevel += "/" + component->Name;
std::string dir = cmSystemTools::GetCurrentWorkingDirectory(); std::string dir = cmSystemTools::GetCurrentWorkingDirectory();
// Change to local toplevel // Change to local toplevel
cmSystemTools::ChangeDirectory(localToplevel); cmSystemTools::ChangeDirectory(localToplevel);
std::string filePrefix; std::string filePrefix;
if (this->IsOn("CPACK_COMPONENT_INCLUDE_TOPLEVEL_DIRECTORY")) if (this->IsOn("CPACK_COMPONENT_INCLUDE_TOPLEVEL_DIRECTORY")) {
{
filePrefix = this->GetOption("CPACK_PACKAGE_FILE_NAME"); filePrefix = this->GetOption("CPACK_PACKAGE_FILE_NAME");
filePrefix += "/"; filePrefix += "/";
} }
const char* installPrefix = const char* installPrefix =
this->GetOption("CPACK_PACKAGING_INSTALL_PREFIX"); this->GetOption("CPACK_PACKAGING_INSTALL_PREFIX");
if(installPrefix && installPrefix[0] == '/' && installPrefix[1] != 0) if (installPrefix && installPrefix[0] == '/' && installPrefix[1] != 0) {
{
// add to file prefix and remove the leading '/' // add to file prefix and remove the leading '/'
filePrefix += installPrefix+1; filePrefix += installPrefix + 1;
filePrefix += "/"; filePrefix += "/";
} }
std::vector<std::string>::const_iterator fileIt; std::vector<std::string>::const_iterator fileIt;
for (fileIt = component->Files.begin(); fileIt != component->Files.end(); for (fileIt = component->Files.begin(); fileIt != component->Files.end();
++fileIt ) ++fileIt) {
{
std::string rp = filePrefix + *fileIt; std::string rp = filePrefix + *fileIt;
cmCPackLogger(cmCPackLog::LOG_DEBUG,"Adding file: " cmCPackLogger(cmCPackLog::LOG_DEBUG, "Adding file: " << rp << std::endl);
<< rp << std::endl);
archive.Add(rp, 0, 0, false); archive.Add(rp, 0, 0, false);
if (!archive) if (!archive) {
{
cmCPackLogger(cmCPackLog::LOG_ERROR, "ERROR while packaging files: " cmCPackLogger(cmCPackLog::LOG_ERROR, "ERROR while packaging files: "
<< archive.GetError() << archive.GetError() << std::endl);
<< std::endl);
return 0; return 0;
} }
} }
@ -92,24 +85,19 @@ int cmCPackArchiveGenerator::addOneComponentToArchive(cmArchiveWrite& archive,
* an declare and open the associated * an declare and open the associated
* cmArchiveWrite 'archive' object. * cmArchiveWrite 'archive' object.
*/ */
#define DECLARE_AND_OPEN_ARCHIVE(filename,archive) \ #define DECLARE_AND_OPEN_ARCHIVE(filename, archive) \
cmGeneratedFileStream gf; \ cmGeneratedFileStream gf; \
gf.Open(filename.c_str(), false, true); \ gf.Open(filename.c_str(), false, true); \
if (!GenerateHeader(&gf)) \ if (!GenerateHeader(&gf)) { \
{ \
cmCPackLogger(cmCPackLog::LOG_ERROR, \ cmCPackLogger(cmCPackLog::LOG_ERROR, \
"Problem to generate Header for archive < " \ "Problem to generate Header for archive < " \
<< filename \ << filename << ">." << std::endl); \
<< ">." << std::endl); \
return 0; \ return 0; \
} \ } \
cmArchiveWrite archive(gf,this->Compress, this->ArchiveFormat); \ cmArchiveWrite archive(gf, this->Compress, this->ArchiveFormat); \
if (!archive) \ if (!archive) { \
{ \
cmCPackLogger(cmCPackLog::LOG_ERROR, "Problem to create archive < " \ cmCPackLogger(cmCPackLog::LOG_ERROR, "Problem to create archive < " \
<< filename \ << filename << ">. ERROR =" << archive.GetError() \
<< ">. ERROR =" \
<< archive.GetError() \
<< std::endl); \ << std::endl); \
return 0; \ return 0; \
} }
@ -119,34 +107,28 @@ int cmCPackArchiveGenerator::PackageComponents(bool ignoreGroup)
packageFileNames.clear(); packageFileNames.clear();
// The default behavior is to have one package by component group // The default behavior is to have one package by component group
// unless CPACK_COMPONENTS_IGNORE_GROUP is specified. // unless CPACK_COMPONENTS_IGNORE_GROUP is specified.
if (!ignoreGroup) if (!ignoreGroup) {
{
std::map<std::string, cmCPackComponentGroup>::iterator compGIt; std::map<std::string, cmCPackComponentGroup>::iterator compGIt;
for (compGIt=this->ComponentGroups.begin(); for (compGIt = this->ComponentGroups.begin();
compGIt!=this->ComponentGroups.end(); ++compGIt) compGIt != this->ComponentGroups.end(); ++compGIt) {
{
cmCPackLogger(cmCPackLog::LOG_VERBOSE, "Packaging component group: " cmCPackLogger(cmCPackLog::LOG_VERBOSE, "Packaging component group: "
<< compGIt->first << compGIt->first << std::endl);
<< std::endl);
// Begin the archive for this group // Begin the archive for this group
std::string packageFileName= std::string(toplevel); std::string packageFileName = std::string(toplevel);
packageFileName += "/"+ packageFileName += "/" +
GetComponentPackageFileName(this->GetOption("CPACK_PACKAGE_FILE_NAME"), GetComponentPackageFileName(this->GetOption("CPACK_PACKAGE_FILE_NAME"),
compGIt->first, compGIt->first, true) +
true) this->GetOutputExtension();
+ this->GetOutputExtension();
// open a block in order to automatically close archive // open a block in order to automatically close archive
// at the end of the block // at the end of the block
{ {
DECLARE_AND_OPEN_ARCHIVE(packageFileName,archive); DECLARE_AND_OPEN_ARCHIVE(packageFileName, archive);
// now iterate over the component of this group // now iterate over the component of this group
std::vector<cmCPackComponent*>::iterator compIt; std::vector<cmCPackComponent*>::iterator compIt;
for (compIt=(compGIt->second).Components.begin(); for (compIt = (compGIt->second).Components.begin();
compIt!=(compGIt->second).Components.end(); compIt != (compGIt->second).Components.end(); ++compIt) {
++compIt)
{
// Add the files of this component to the archive // Add the files of this component to the archive
addOneComponentToArchive(archive,*compIt); addOneComponentToArchive(archive, *compIt);
} }
} }
// add the generated package to package file names list // add the generated package to package file names list
@ -154,32 +136,28 @@ int cmCPackArchiveGenerator::PackageComponents(bool ignoreGroup)
} }
// Handle Orphan components (components not belonging to any groups) // Handle Orphan components (components not belonging to any groups)
std::map<std::string, cmCPackComponent>::iterator compIt; std::map<std::string, cmCPackComponent>::iterator compIt;
for (compIt=this->Components.begin(); for (compIt = this->Components.begin(); compIt != this->Components.end();
compIt!=this->Components.end(); ++compIt ) ++compIt) {
{
// Does the component belong to a group? // Does the component belong to a group?
if (compIt->second.Group==NULL) if (compIt->second.Group == NULL) {
{ cmCPackLogger(
cmCPackLogger(cmCPackLog::LOG_VERBOSE, cmCPackLog::LOG_VERBOSE, "Component <"
"Component <"
<< compIt->second.Name << compIt->second.Name
<< "> does not belong to any group, package it separately." << "> does not belong to any group, package it separately."
<< std::endl); << std::endl);
std::string localToplevel( std::string localToplevel(
this->GetOption("CPACK_TEMPORARY_DIRECTORY") this->GetOption("CPACK_TEMPORARY_DIRECTORY"));
);
std::string packageFileName = std::string(toplevel); std::string packageFileName = std::string(toplevel);
localToplevel += "/"+ compIt->first; localToplevel += "/" + compIt->first;
packageFileName += "/"+ packageFileName += "/" + GetComponentPackageFileName(
GetComponentPackageFileName(this->GetOption("CPACK_PACKAGE_FILE_NAME"), this->GetOption("CPACK_PACKAGE_FILE_NAME"),
compIt->first, compIt->first, false) +
false) this->GetOutputExtension();
+ this->GetOutputExtension();
{ {
DECLARE_AND_OPEN_ARCHIVE(packageFileName,archive); DECLARE_AND_OPEN_ARCHIVE(packageFileName, archive);
// Add the files of this component to the archive // Add the files of this component to the archive
addOneComponentToArchive(archive,&(compIt->second)); addOneComponentToArchive(archive, &(compIt->second));
} }
// add the generated package to package file names list // add the generated package to package file names list
packageFileNames.push_back(packageFileName); packageFileNames.push_back(packageFileName);
@ -188,25 +166,22 @@ int cmCPackArchiveGenerator::PackageComponents(bool ignoreGroup)
} }
// CPACK_COMPONENTS_IGNORE_GROUPS is set // CPACK_COMPONENTS_IGNORE_GROUPS is set
// We build 1 package per component // We build 1 package per component
else else {
{
std::map<std::string, cmCPackComponent>::iterator compIt; std::map<std::string, cmCPackComponent>::iterator compIt;
for (compIt=this->Components.begin(); for (compIt = this->Components.begin(); compIt != this->Components.end();
compIt!=this->Components.end(); ++compIt ) ++compIt) {
{
std::string localToplevel(this->GetOption("CPACK_TEMPORARY_DIRECTORY")); std::string localToplevel(this->GetOption("CPACK_TEMPORARY_DIRECTORY"));
std::string packageFileName = std::string(toplevel); std::string packageFileName = std::string(toplevel);
localToplevel += "/"+ compIt->first; localToplevel += "/" + compIt->first;
packageFileName += "/"+ packageFileName += "/" +
GetComponentPackageFileName(this->GetOption("CPACK_PACKAGE_FILE_NAME"), GetComponentPackageFileName(this->GetOption("CPACK_PACKAGE_FILE_NAME"),
compIt->first, compIt->first, false) +
false) this->GetOutputExtension();
+ this->GetOutputExtension();
{ {
DECLARE_AND_OPEN_ARCHIVE(packageFileName,archive); DECLARE_AND_OPEN_ARCHIVE(packageFileName, archive);
// Add the files of this component to the archive // Add the files of this component to the archive
addOneComponentToArchive(archive,&(compIt->second)); addOneComponentToArchive(archive, &(compIt->second));
} }
// add the generated package to package file names list // add the generated package to package file names list
packageFileNames.push_back(packageFileName); packageFileNames.push_back(packageFileName);
@ -220,22 +195,21 @@ int cmCPackArchiveGenerator::PackageComponentsAllInOne()
// reset the package file names // reset the package file names
packageFileNames.clear(); packageFileNames.clear();
packageFileNames.push_back(std::string(toplevel)); packageFileNames.push_back(std::string(toplevel));
packageFileNames[0] += "/" packageFileNames[0] += "/" +
+std::string(this->GetOption("CPACK_PACKAGE_FILE_NAME")) std::string(this->GetOption("CPACK_PACKAGE_FILE_NAME")) +
+ this->GetOutputExtension(); this->GetOutputExtension();
cmCPackLogger(cmCPackLog::LOG_VERBOSE, cmCPackLogger(cmCPackLog::LOG_VERBOSE,
"Packaging all groups in one package..." "Packaging all groups in one package..."
"(CPACK_COMPONENTS_ALL_GROUPS_IN_ONE_PACKAGE is set)" "(CPACK_COMPONENTS_ALL_GROUPS_IN_ONE_PACKAGE is set)"
<< std::endl); << std::endl);
DECLARE_AND_OPEN_ARCHIVE(packageFileNames[0],archive); DECLARE_AND_OPEN_ARCHIVE(packageFileNames[0], archive);
// The ALL COMPONENTS in ONE package case // The ALL COMPONENTS in ONE package case
std::map<std::string, cmCPackComponent>::iterator compIt; std::map<std::string, cmCPackComponent>::iterator compIt;
for (compIt=this->Components.begin();compIt!=this->Components.end(); for (compIt = this->Components.begin(); compIt != this->Components.end();
++compIt ) ++compIt) {
{
// Add the files of this component to the archive // Add the files of this component to the archive
addOneComponentToArchive(archive,&(compIt->second)); addOneComponentToArchive(archive, &(compIt->second));
} }
// archive goes out of scope so it will finalized and closed. // archive goes out of scope so it will finalized and closed.
@ -244,47 +218,39 @@ int cmCPackArchiveGenerator::PackageComponentsAllInOne()
int cmCPackArchiveGenerator::PackageFiles() int cmCPackArchiveGenerator::PackageFiles()
{ {
cmCPackLogger(cmCPackLog::LOG_DEBUG, "Toplevel: " cmCPackLogger(cmCPackLog::LOG_DEBUG, "Toplevel: " << toplevel << std::endl);
<< toplevel << std::endl);
if (WantsComponentInstallation()) { if (WantsComponentInstallation()) {
// CASE 1 : COMPONENT ALL-IN-ONE package // CASE 1 : COMPONENT ALL-IN-ONE package
// If ALL COMPONENTS in ONE package has been requested // If ALL COMPONENTS in ONE package has been requested
// then the package file is unique and should be open here. // then the package file is unique and should be open here.
if (componentPackageMethod == ONE_PACKAGE) if (componentPackageMethod == ONE_PACKAGE) {
{
return PackageComponentsAllInOne(); return PackageComponentsAllInOne();
} }
// CASE 2 : COMPONENT CLASSICAL package(s) (i.e. not all-in-one) // CASE 2 : COMPONENT CLASSICAL package(s) (i.e. not all-in-one)
// There will be 1 package for each component group // There will be 1 package for each component group
// however one may require to ignore component group and // however one may require to ignore component group and
// in this case you'll get 1 package for each component. // in this case you'll get 1 package for each component.
else else {
{
return PackageComponents(componentPackageMethod == return PackageComponents(componentPackageMethod ==
ONE_PACKAGE_PER_COMPONENT); ONE_PACKAGE_PER_COMPONENT);
} }
} }
// CASE 3 : NON COMPONENT package. // CASE 3 : NON COMPONENT package.
DECLARE_AND_OPEN_ARCHIVE(packageFileNames[0],archive); DECLARE_AND_OPEN_ARCHIVE(packageFileNames[0], archive);
std::vector<std::string>::const_iterator fileIt; std::vector<std::string>::const_iterator fileIt;
std::string dir = cmSystemTools::GetCurrentWorkingDirectory(); std::string dir = cmSystemTools::GetCurrentWorkingDirectory();
cmSystemTools::ChangeDirectory(toplevel); cmSystemTools::ChangeDirectory(toplevel);
for ( fileIt = files.begin(); fileIt != files.end(); ++ fileIt ) for (fileIt = files.begin(); fileIt != files.end(); ++fileIt) {
{
// Get the relative path to the file // Get the relative path to the file
std::string rp = cmSystemTools::RelativePath(toplevel.c_str(), std::string rp =
fileIt->c_str()); cmSystemTools::RelativePath(toplevel.c_str(), fileIt->c_str());
archive.Add(rp, 0, 0, false); archive.Add(rp, 0, 0, false);
if(!archive) if (!archive) {
{
cmCPackLogger(cmCPackLog::LOG_ERROR, "Problem while adding file< " cmCPackLogger(cmCPackLog::LOG_ERROR, "Problem while adding file< "
<< *fileIt << *fileIt << "> to archive <" << packageFileNames[0]
<< "> to archive <" << "> .ERROR =" << archive.GetError() << std::endl);
<< packageFileNames[0] << "> .ERROR ="
<< archive.GetError()
<< std::endl);
return 0; return 0;
} }
} }
@ -298,16 +264,14 @@ int cmCPackArchiveGenerator::GenerateHeader(std::ostream*)
return 1; return 1;
} }
bool cmCPackArchiveGenerator::SupportsComponentInstallation() const { bool cmCPackArchiveGenerator::SupportsComponentInstallation() const
{
// The Component installation support should only // The Component installation support should only
// be activated if explicitly requested by the user // be activated if explicitly requested by the user
// (for backward compatibility reason) // (for backward compatibility reason)
if (IsOn("CPACK_ARCHIVE_COMPONENT_INSTALL")) if (IsOn("CPACK_ARCHIVE_COMPONENT_INSTALL")) {
{
return true; return true;
} } else {
else
{
return false; return false;
} }
} }

View File

@ -17,7 +17,6 @@
#include "cmArchiveWrite.h" #include "cmArchiveWrite.h"
/** \class cmCPackArchiveGenerator /** \class cmCPackArchiveGenerator
* \brief A generator base for libarchive generation. * \brief A generator base for libarchive generation.
* The generator itself uses the libarchive wrapper * The generator itself uses the libarchive wrapper
@ -25,7 +24,7 @@
* *
*/ */
class cmCPackArchiveGenerator : public cmCPackGenerator class cmCPackArchiveGenerator : public cmCPackGenerator
{ {
public: public:
cmTypeMacro(cmCPackArchiveGenerator, cmCPackGenerator); cmTypeMacro(cmCPackArchiveGenerator, cmCPackGenerator);
@ -38,6 +37,7 @@ public:
virtual int GenerateHeader(std::ostream* os); virtual int GenerateHeader(std::ostream* os);
// component support // component support
virtual bool SupportsComponentInstallation() const; virtual bool SupportsComponentInstallation() const;
protected: protected:
virtual int InitializeInternal(); virtual int InitializeInternal();
/** /**
@ -70,6 +70,6 @@ protected:
virtual const char* GetOutputExtension() = 0; virtual const char* GetOutputExtension() = 0;
cmArchiveWrite::Compress Compress; cmArchiveWrite::Compress Compress;
std::string ArchiveFormat; std::string ArchiveFormat;
}; };
#endif #endif

View File

@ -28,8 +28,7 @@ cmCPackBundleGenerator::~cmCPackBundleGenerator()
int cmCPackBundleGenerator::InitializeInternal() int cmCPackBundleGenerator::InitializeInternal()
{ {
const char* name = this->GetOption("CPACK_BUNDLE_NAME"); const char* name = this->GetOption("CPACK_BUNDLE_NAME");
if(0 == name) if (0 == name) {
{
cmCPackLogger(cmCPackLog::LOG_ERROR, cmCPackLogger(cmCPackLog::LOG_ERROR,
"CPACK_BUNDLE_NAME must be set to use the Bundle generator." "CPACK_BUNDLE_NAME must be set to use the Bundle generator."
<< std::endl); << std::endl);
@ -37,15 +36,12 @@ int cmCPackBundleGenerator::InitializeInternal()
return 0; return 0;
} }
if(this->GetOption("CPACK_BUNDLE_APPLE_CERT_APP")) if (this->GetOption("CPACK_BUNDLE_APPLE_CERT_APP")) {
{ const std::string codesign_path = cmSystemTools::FindProgram(
const std::string codesign_path = cmSystemTools::FindProgram("codesign", "codesign", std::vector<std::string>(), false);
std::vector<std::string>(), false);
if(codesign_path.empty()) if (codesign_path.empty()) {
{ cmCPackLogger(cmCPackLog::LOG_ERROR, "Cannot locate codesign command"
cmCPackLogger(cmCPackLog::LOG_ERROR,
"Cannot locate codesign command"
<< std::endl); << std::endl);
return 0; return 0;
} }
@ -69,33 +65,30 @@ int cmCPackBundleGenerator::ConstructBundle()
// Get required arguments ... // Get required arguments ...
const std::string cpack_bundle_name = this->GetOption("CPACK_BUNDLE_NAME") const std::string cpack_bundle_name = this->GetOption("CPACK_BUNDLE_NAME")
? this->GetOption("CPACK_BUNDLE_NAME") : ""; ? this->GetOption("CPACK_BUNDLE_NAME")
if(cpack_bundle_name.empty()) : "";
{ if (cpack_bundle_name.empty()) {
cmCPackLogger(cmCPackLog::LOG_ERROR, cmCPackLogger(cmCPackLog::LOG_ERROR, "CPACK_BUNDLE_NAME must be set."
"CPACK_BUNDLE_NAME must be set."
<< std::endl); << std::endl);
return 0; return 0;
} }
const std::string cpack_bundle_plist = this->GetOption("CPACK_BUNDLE_PLIST") const std::string cpack_bundle_plist = this->GetOption("CPACK_BUNDLE_PLIST")
? this->GetOption("CPACK_BUNDLE_PLIST") : ""; ? this->GetOption("CPACK_BUNDLE_PLIST")
if(cpack_bundle_plist.empty()) : "";
{ if (cpack_bundle_plist.empty()) {
cmCPackLogger(cmCPackLog::LOG_ERROR, cmCPackLogger(cmCPackLog::LOG_ERROR, "CPACK_BUNDLE_PLIST must be set."
"CPACK_BUNDLE_PLIST must be set."
<< std::endl); << std::endl);
return 0; return 0;
} }
const std::string cpack_bundle_icon = this->GetOption("CPACK_BUNDLE_ICON") const std::string cpack_bundle_icon = this->GetOption("CPACK_BUNDLE_ICON")
? this->GetOption("CPACK_BUNDLE_ICON") : ""; ? this->GetOption("CPACK_BUNDLE_ICON")
if(cpack_bundle_icon.empty()) : "";
{ if (cpack_bundle_icon.empty()) {
cmCPackLogger(cmCPackLog::LOG_ERROR, cmCPackLogger(cmCPackLog::LOG_ERROR, "CPACK_BUNDLE_ICON must be set."
"CPACK_BUNDLE_ICON must be set."
<< std::endl); << std::endl);
return 0; return 0;
@ -104,7 +97,8 @@ int cmCPackBundleGenerator::ConstructBundle()
// Get optional arguments ... // Get optional arguments ...
const std::string cpack_bundle_startup_command = const std::string cpack_bundle_startup_command =
this->GetOption("CPACK_BUNDLE_STARTUP_COMMAND") this->GetOption("CPACK_BUNDLE_STARTUP_COMMAND")
? this->GetOption("CPACK_BUNDLE_STARTUP_COMMAND") : ""; ? this->GetOption("CPACK_BUNDLE_STARTUP_COMMAND")
: "";
// The staging directory contains everything that will end-up inside the // The staging directory contains everything that will end-up inside the
// final disk image ... // final disk image ...
@ -112,25 +106,28 @@ int cmCPackBundleGenerator::ConstructBundle()
staging << toplevel; staging << toplevel;
std::ostringstream contents; std::ostringstream contents;
contents << staging.str() << "/" << cpack_bundle_name contents << staging.str() << "/" << cpack_bundle_name << ".app/"
<< ".app/" << "Contents"; << "Contents";
std::ostringstream application; std::ostringstream application;
application << contents.str() << "/" << "MacOS"; application << contents.str() << "/"
<< "MacOS";
std::ostringstream resources; std::ostringstream resources;
resources << contents.str() << "/" << "Resources"; resources << contents.str() << "/"
<< "Resources";
// Install a required, user-provided bundle metadata file ... // Install a required, user-provided bundle metadata file ...
std::ostringstream plist_source; std::ostringstream plist_source;
plist_source << cpack_bundle_plist; plist_source << cpack_bundle_plist;
std::ostringstream plist_target; std::ostringstream plist_target;
plist_target << contents.str() << "/" << "Info.plist"; plist_target << contents.str() << "/"
<< "Info.plist";
if(!this->CopyFile(plist_source, plist_target)) if (!this->CopyFile(plist_source, plist_target)) {
{ cmCPackLogger(
cmCPackLogger(cmCPackLog::LOG_ERROR, cmCPackLog::LOG_ERROR,
"Error copying plist. Check the value of CPACK_BUNDLE_PLIST." "Error copying plist. Check the value of CPACK_BUNDLE_PLIST."
<< std::endl); << std::endl);
@ -144,9 +141,9 @@ int cmCPackBundleGenerator::ConstructBundle()
std::ostringstream icon_target; std::ostringstream icon_target;
icon_target << resources.str() << "/" << cpack_bundle_name << ".icns"; icon_target << resources.str() << "/" << cpack_bundle_name << ".icns";
if(!this->CopyFile(icon_source, icon_target)) if (!this->CopyFile(icon_source, icon_target)) {
{ cmCPackLogger(
cmCPackLogger(cmCPackLog::LOG_ERROR, cmCPackLog::LOG_ERROR,
"Error copying bundle icon. Check the value of CPACK_BUNDLE_ICON." "Error copying bundle icon. Check the value of CPACK_BUNDLE_ICON."
<< std::endl); << std::endl);
@ -155,16 +152,14 @@ int cmCPackBundleGenerator::ConstructBundle()
// Optionally a user-provided startup command (could be an // Optionally a user-provided startup command (could be an
// executable or a script) ... // executable or a script) ...
if(!cpack_bundle_startup_command.empty()) if (!cpack_bundle_startup_command.empty()) {
{
std::ostringstream command_source; std::ostringstream command_source;
command_source << cpack_bundle_startup_command; command_source << cpack_bundle_startup_command;
std::ostringstream command_target; std::ostringstream command_target;
command_target << application.str() << "/" << cpack_bundle_name; command_target << application.str() << "/" << cpack_bundle_name;
if(!this->CopyFile(command_source, command_target)) if (!this->CopyFile(command_source, command_target)) {
{
cmCPackLogger(cmCPackLog::LOG_ERROR, cmCPackLogger(cmCPackLog::LOG_ERROR,
"Error copying startup command. " "Error copying startup command. "
" Check the value of CPACK_BUNDLE_STARTUP_COMMAND." " Check the value of CPACK_BUNDLE_STARTUP_COMMAND."
@ -181,13 +176,11 @@ int cmCPackBundleGenerator::ConstructBundle()
int cmCPackBundleGenerator::PackageFiles() int cmCPackBundleGenerator::PackageFiles()
{ {
if(!this->ConstructBundle()) if (!this->ConstructBundle()) {
{
return 0; return 0;
} }
if(!this->SignBundle(toplevel)) if (!this->SignBundle(toplevel)) {
{
return 0; return 0;
} }
@ -199,16 +192,15 @@ bool cmCPackBundleGenerator::SupportsComponentInstallation() const
return false; return false;
} }
int cmCPackBundleGenerator::SignBundle(const std::string& src_dir) int cmCPackBundleGenerator::SignBundle(const std::string& src_dir)
{ {
const std::string cpack_apple_cert_app = const std::string cpack_apple_cert_app =
this->GetOption("CPACK_BUNDLE_APPLE_CERT_APP") this->GetOption("CPACK_BUNDLE_APPLE_CERT_APP")
? this->GetOption("CPACK_BUNDLE_APPLE_CERT_APP") : ""; ? this->GetOption("CPACK_BUNDLE_APPLE_CERT_APP")
: "";
// codesign the application. // codesign the application.
if(!cpack_apple_cert_app.empty()) if (!cpack_apple_cert_app.empty()) {
{
std::string output; std::string output;
std::string bundle_path; std::string bundle_path;
bundle_path = src_dir + "/"; bundle_path = src_dir + "/";
@ -223,15 +215,15 @@ int cmCPackBundleGenerator::SignBundle(const std::string& src_dir)
const std::string sign_files = const std::string sign_files =
this->GetOption("CPACK_BUNDLE_APPLE_CODESIGN_FILES") this->GetOption("CPACK_BUNDLE_APPLE_CODESIGN_FILES")
? this->GetOption("CPACK_BUNDLE_APPLE_CODESIGN_FILES") : ""; ? this->GetOption("CPACK_BUNDLE_APPLE_CODESIGN_FILES")
: "";
std::vector<std::string> relFiles; std::vector<std::string> relFiles;
cmSystemTools::ExpandListArgument(sign_files, relFiles); cmSystemTools::ExpandListArgument(sign_files, relFiles);
// sign the files supplied by the user, ie. frameworks. // sign the files supplied by the user, ie. frameworks.
for(std::vector<std::string>::iterator it = relFiles.begin(); for (std::vector<std::string>::iterator it = relFiles.begin();
it != relFiles.end(); ++it) it != relFiles.end(); ++it) {
{
std::ostringstream temp_sign_file_cmd; std::ostringstream temp_sign_file_cmd;
temp_sign_file_cmd << this->GetOption("CPACK_COMMAND_CODESIGN"); temp_sign_file_cmd << this->GetOption("CPACK_COMMAND_CODESIGN");
temp_sign_file_cmd << " " << sign_parameter << " -s \"" temp_sign_file_cmd << " " << sign_parameter << " -s \""
@ -242,11 +234,10 @@ int cmCPackBundleGenerator::SignBundle(const std::string& src_dir)
temp_sign_file_cmd << bundle_path; temp_sign_file_cmd << bundle_path;
temp_sign_file_cmd << it->c_str() << "\""; temp_sign_file_cmd << it->c_str() << "\"";
if(!this->RunCommand(temp_sign_file_cmd, &output)) if (!this->RunCommand(temp_sign_file_cmd, &output)) {
{ cmCPackLogger(cmCPackLog::LOG_ERROR, "Error signing file:"
cmCPackLogger(cmCPackLog::LOG_ERROR, << bundle_path << it->c_str() << std::endl
"Error signing file:" << output << std::endl);
<< bundle_path << it->c_str() << std::endl << output << std::endl);
return 0; return 0;
} }
@ -259,11 +250,11 @@ int cmCPackBundleGenerator::SignBundle(const std::string& src_dir)
<< cpack_apple_cert_app; << cpack_apple_cert_app;
temp_sign_binary_cmd << "\" \"" << bundle_path << "\""; temp_sign_binary_cmd << "\" \"" << bundle_path << "\"";
if(!this->RunCommand(temp_sign_binary_cmd, &output)) if (!this->RunCommand(temp_sign_binary_cmd, &output)) {
{
cmCPackLogger(cmCPackLog::LOG_ERROR, cmCPackLogger(cmCPackLog::LOG_ERROR,
"Error signing the application binary." "Error signing the application binary." << std::endl
<< std::endl << output << std::endl); << output
<< std::endl);
return 0; return 0;
} }
@ -273,28 +264,27 @@ int cmCPackBundleGenerator::SignBundle(const std::string& src_dir)
temp_codesign_cmd << this->GetOption("CPACK_COMMAND_CODESIGN"); temp_codesign_cmd << this->GetOption("CPACK_COMMAND_CODESIGN");
temp_codesign_cmd << " " << sign_parameter << " -s \"" temp_codesign_cmd << " " << sign_parameter << " -s \""
<< cpack_apple_cert_app << "\""; << cpack_apple_cert_app << "\"";
if(this->GetOption("CPACK_BUNDLE_APPLE_ENTITLEMENTS")) if (this->GetOption("CPACK_BUNDLE_APPLE_ENTITLEMENTS")) {
{
temp_codesign_cmd << " --entitlements "; temp_codesign_cmd << " --entitlements ";
temp_codesign_cmd << this->GetOption("CPACK_BUNDLE_APPLE_ENTITLEMENTS"); temp_codesign_cmd << this->GetOption("CPACK_BUNDLE_APPLE_ENTITLEMENTS");
} }
temp_codesign_cmd << " \"" << bundle_path << "\""; temp_codesign_cmd << " \"" << bundle_path << "\"";
if(!this->RunCommand(temp_codesign_cmd, &output)) if (!this->RunCommand(temp_codesign_cmd, &output)) {
{
cmCPackLogger(cmCPackLog::LOG_ERROR, cmCPackLogger(cmCPackLog::LOG_ERROR,
"Error signing the application package." "Error signing the application package." << std::endl
<< std::endl << output << std::endl); << output
<< std::endl);
return 0; return 0;
} }
cmCPackLogger(cmCPackLog::LOG_OUTPUT, cmCPackLogger(cmCPackLog::LOG_OUTPUT, "- Application has been codesigned"
"- Application has been codesigned"
<< std::endl); << std::endl);
cmCPackLogger(cmCPackLog::LOG_VERBOSE, cmCPackLogger(cmCPackLog::LOG_VERBOSE,
(this->GetOption("CPACK_BUNDLE_APPLE_ENTITLEMENTS") (this->GetOption("CPACK_BUNDLE_APPLE_ENTITLEMENTS")
? "with entitlement sandboxing" : "without entitlement sandboxing") ? "with entitlement sandboxing"
: "without entitlement sandboxing")
<< std::endl); << std::endl);
} }

View File

@ -20,14 +20,12 @@
unsigned long cmCPackComponent::GetInstalledSize( unsigned long cmCPackComponent::GetInstalledSize(
const std::string& installDir) const const std::string& installDir) const
{ {
if (this->TotalSize != 0) if (this->TotalSize != 0) {
{
return this->TotalSize; return this->TotalSize;
} }
std::vector<std::string>::const_iterator fileIt; std::vector<std::string>::const_iterator fileIt;
for (fileIt = this->Files.begin(); fileIt != this->Files.end(); ++fileIt) for (fileIt = this->Files.begin(); fileIt != this->Files.end(); ++fileIt) {
{
std::string path = installDir; std::string path = installDir;
path += '/'; path += '/';
path += *fileIt; path += *fileIt;
@ -37,9 +35,9 @@ unsigned long cmCPackComponent::GetInstalledSize(
return this->TotalSize; return this->TotalSize;
} }
unsigned long unsigned long cmCPackComponent::GetInstalledSizeInKbytes(
cmCPackComponent::GetInstalledSizeInKbytes(const std::string& installDir) const const std::string& installDir) const
{ {
unsigned long result = (GetInstalledSize(installDir) + 512) / 1024; unsigned long result = (GetInstalledSize(installDir) + 512) / 1024;
return result? result : 1; return result ? result : 1;
} }

View File

@ -42,9 +42,15 @@ public:
class cmCPackComponent class cmCPackComponent
{ {
public: public:
cmCPackComponent() : Group(0), IsRequired(true), IsHidden(false), cmCPackComponent()
IsDisabledByDefault(false), IsDownloaded(false), : Group(0)
TotalSize(0) { } , IsRequired(true)
, IsHidden(false)
, IsDisabledByDefault(false)
, IsDownloaded(false)
, TotalSize(0)
{
}
/// The name of the component (used to reference the component). /// The name of the component (used to reference the component).
std::string Name; std::string Name;
@ -53,7 +59,7 @@ public:
std::string DisplayName; std::string DisplayName;
/// The component group that contains this component (if any). /// The component group that contains this component (if any).
cmCPackComponentGroup *Group; cmCPackComponentGroup* Group;
/// Whether this component group must always be installed. /// Whether this component group must always be installed.
bool IsRequired : 1; bool IsRequired : 1;
@ -73,17 +79,17 @@ public:
std::string Description; std::string Description;
/// The installation types that this component is a part of. /// The installation types that this component is a part of.
std::vector<cmCPackInstallationType *> InstallationTypes; std::vector<cmCPackInstallationType*> InstallationTypes;
/// If IsDownloaded is true, the name of the archive file that /// If IsDownloaded is true, the name of the archive file that
/// contains the files that are part of this component. /// contains the files that are part of this component.
std::string ArchiveFile; std::string ArchiveFile;
/// The components that this component depends on. /// The components that this component depends on.
std::vector<cmCPackComponent *> Dependencies; std::vector<cmCPackComponent*> Dependencies;
/// The components that depend on this component. /// The components that depend on this component.
std::vector<cmCPackComponent *> ReverseDependencies; std::vector<cmCPackComponent*> ReverseDependencies;
/// The list of installed files that are part of this component. /// The list of installed files that are part of this component.
std::vector<std::string> Files; std::vector<std::string> Files;
@ -100,7 +106,7 @@ public:
/// kilobytes. /// kilobytes.
unsigned long GetInstalledSizeInKbytes(const std::string& installDir) const; unsigned long GetInstalledSizeInKbytes(const std::string& installDir) const;
private: private:
mutable unsigned long TotalSize; mutable unsigned long TotalSize;
}; };
@ -110,7 +116,10 @@ public:
class cmCPackComponentGroup class cmCPackComponentGroup
{ {
public: public:
cmCPackComponentGroup() : ParentGroup(0) { } cmCPackComponentGroup()
: ParentGroup(0)
{
}
/// The name of the group (used to reference the group). /// The name of the group (used to reference the group).
std::string Name; std::string Name;
@ -131,7 +140,7 @@ public:
std::vector<cmCPackComponent*> Components; std::vector<cmCPackComponent*> Components;
/// The parent group of this component group (if any). /// The parent group of this component group (if any).
cmCPackComponentGroup *ParentGroup; cmCPackComponentGroup* ParentGroup;
/// The subgroups of this group. /// The subgroups of this group.
std::vector<cmCPackComponentGroup*> Subgroups; std::vector<cmCPackComponentGroup*> Subgroups;

View File

@ -45,8 +45,7 @@ int cmCPackCygwinBinaryGenerator::PackageFiles()
std::string manifest = "/usr/share/doc/"; std::string manifest = "/usr/share/doc/";
manifest += packageName; manifest += packageName;
manifest += "/MANIFEST"; manifest += "/MANIFEST";
std::string manifestFile std::string manifestFile = this->GetOption("CPACK_TEMPORARY_DIRECTORY");
= this->GetOption("CPACK_TEMPORARY_DIRECTORY");
// Create a MANIFEST file that contains all of the files in // Create a MANIFEST file that contains all of the files in
// the tar file // the tar file
std::string tempdir = manifestFile; std::string tempdir = manifestFile;
@ -55,9 +54,8 @@ int cmCPackCygwinBinaryGenerator::PackageFiles()
// to create the file before the super class is called // to create the file before the super class is called
{ {
cmGeneratedFileStream ofs(manifestFile.c_str()); cmGeneratedFileStream ofs(manifestFile.c_str());
for(std::vector<std::string>::const_iterator i = files.begin(); for (std::vector<std::string>::const_iterator i = files.begin();
i != files.end(); ++i) i != files.end(); ++i) {
{
// remove the temp dir and replace with /usr // remove the temp dir and replace with /usr
ofs << (*i).substr(tempdir.size()) << "\n"; ofs << (*i).substr(tempdir.size()) << "\n";
} }
@ -73,9 +71,8 @@ int cmCPackCygwinBinaryGenerator::PackageFiles()
const char* cmCPackCygwinBinaryGenerator::GetOutputExtension() const char* cmCPackCygwinBinaryGenerator::GetOutputExtension()
{ {
this->OutputExtension = "-"; this->OutputExtension = "-";
const char* patchNumber =this->GetOption("CPACK_CYGWIN_PATCH_NUMBER"); const char* patchNumber = this->GetOption("CPACK_CYGWIN_PATCH_NUMBER");
if(!patchNumber) if (!patchNumber) {
{
patchNumber = "1"; patchNumber = "1";
cmCPackLogger(cmCPackLog::LOG_WARNING, cmCPackLogger(cmCPackLog::LOG_WARNING,
"CPACK_CYGWIN_PATCH_NUMBER not specified using 1" "CPACK_CYGWIN_PATCH_NUMBER not specified using 1"

View File

@ -28,6 +28,7 @@ public:
*/ */
cmCPackCygwinBinaryGenerator(); cmCPackCygwinBinaryGenerator();
virtual ~cmCPackCygwinBinaryGenerator(); virtual ~cmCPackCygwinBinaryGenerator();
protected: protected:
virtual int InitializeInternal(); virtual int InitializeInternal();
int PackageFiles(); int PackageFiles();

View File

@ -25,8 +25,8 @@
// system tools because it is not implemented robustly enough to move // system tools because it is not implemented robustly enough to move
// files across directories. // files across directories.
#ifdef _WIN32 #ifdef _WIN32
# include <sys/stat.h> #include <sys/stat.h>
# include <windows.h> #include <windows.h>
#endif #endif
cmCPackCygwinSourceGenerator::cmCPackCygwinSourceGenerator() cmCPackCygwinSourceGenerator::cmCPackCygwinSourceGenerator()
@ -46,8 +46,8 @@ int cmCPackCygwinSourceGenerator::InitializeInternal()
int cmCPackCygwinSourceGenerator::PackageFiles() int cmCPackCygwinSourceGenerator::PackageFiles()
{ {
// Create a tar file of the sources // Create a tar file of the sources
std::string packageDirFileName std::string packageDirFileName =
= this->GetOption("CPACK_TEMPORARY_DIRECTORY"); this->GetOption("CPACK_TEMPORARY_DIRECTORY");
packageDirFileName += ".tar.bz2"; packageDirFileName += ".tar.bz2";
packageFileNames[0] = packageDirFileName; packageFileNames[0] = packageDirFileName;
std::string output; std::string output;
@ -55,8 +55,7 @@ int cmCPackCygwinSourceGenerator::PackageFiles()
// to create tar.bz2 file with the list of source // to create tar.bz2 file with the list of source
// files // files
this->Compress = cmArchiveWrite::CompressBZip2; this->Compress = cmArchiveWrite::CompressBZip2;
if ( !this->cmCPackTarBZip2Generator::PackageFiles() ) if (!this->cmCPackTarBZip2Generator::PackageFiles()) {
{
return 0; return 0;
} }
// Now create a tar file that contains the above .tar.bz2 file // Now create a tar file that contains the above .tar.bz2 file
@ -76,43 +75,37 @@ int cmCPackCygwinSourceGenerator::PackageFiles()
// to the toplevel cpack temp dir // to the toplevel cpack temp dir
// copy the patch file into place // copy the patch file into place
if(!this->GetOption("CPACK_CYGWIN_PATCH_FILE")) if (!this->GetOption("CPACK_CYGWIN_PATCH_FILE")) {
{
cmCPackLogger(cmCPackLog::LOG_ERROR, cmCPackLogger(cmCPackLog::LOG_ERROR,
"No patch file specified for cygwin sources."); "No patch file specified for cygwin sources.");
return 0; return 0;
} }
if(!cmSystemTools::CopyFileAlways( if (!cmSystemTools::CopyFileAlways(
this->GetOption("CPACK_CYGWIN_PATCH_FILE"), this->GetOption("CPACK_CYGWIN_PATCH_FILE"),
this->GetOption("CPACK_TOPLEVEL_DIRECTORY"))) this->GetOption("CPACK_TOPLEVEL_DIRECTORY"))) {
{
cmCPackLogger(cmCPackLog::LOG_ERROR, "problem copying: [" cmCPackLogger(cmCPackLog::LOG_ERROR, "problem copying: ["
<< this->GetOption("CPACK_CYGWIN_PATCH_FILE") << "]\nto\n[" << this->GetOption("CPACK_CYGWIN_PATCH_FILE") << "]\nto\n["
<< this->GetOption("CPACK_TOPLEVEL_DIRECTORY") << "]\n"); << this->GetOption("CPACK_TOPLEVEL_DIRECTORY") << "]\n");
return 0; return 0;
} }
if(!this->GetOption("CPACK_CYGWIN_BUILD_SCRIPT")) if (!this->GetOption("CPACK_CYGWIN_BUILD_SCRIPT")) {
{
cmCPackLogger(cmCPackLog::LOG_ERROR, cmCPackLogger(cmCPackLog::LOG_ERROR,
"No build script specified for cygwin sources."); "No build script specified for cygwin sources.");
return 0; return 0;
} }
// copy the build script into place // copy the build script into place
if(!cmSystemTools::CopyFileAlways( if (!cmSystemTools::CopyFileAlways(
this->GetOption("CPACK_CYGWIN_BUILD_SCRIPT"), this->GetOption("CPACK_CYGWIN_BUILD_SCRIPT"),
this->GetOption("CPACK_TOPLEVEL_DIRECTORY"))) this->GetOption("CPACK_TOPLEVEL_DIRECTORY"))) {
{
cmCPackLogger(cmCPackLog::LOG_ERROR, "problem copying: " cmCPackLogger(cmCPackLog::LOG_ERROR, "problem copying: "
<< this->GetOption("CPACK_CYGWIN_BUILD_SCRIPT") << "\nto\n" << this->GetOption("CPACK_CYGWIN_BUILD_SCRIPT") << "\nto\n"
<< this->GetOption("CPACK_TOPLEVEL_DIRECTORY") << "]\n"); << this->GetOption("CPACK_TOPLEVEL_DIRECTORY") << "]\n");
return 0; return 0;
} }
std::string outerTarFile std::string outerTarFile = this->GetOption("CPACK_TEMPORARY_DIRECTORY");
= this->GetOption("CPACK_TEMPORARY_DIRECTORY");
outerTarFile += "-"; outerTarFile += "-";
const char* patch = this->GetOption("CPACK_CYGWIN_PATCH_NUMBER"); const char* patch = this->GetOption("CPACK_CYGWIN_PATCH_NUMBER");
if(!patch) if (!patch) {
{
cmCPackLogger(cmCPackLog::LOG_WARNING, "CPACK_CYGWIN_PATCH_NUMBER" cmCPackLogger(cmCPackLog::LOG_WARNING, "CPACK_CYGWIN_PATCH_NUMBER"
<< " not specified, defaulting to 1\n"); << " not specified, defaulting to 1\n");
patch = "1"; patch = "1";
@ -126,8 +119,8 @@ int cmCPackCygwinSourceGenerator::PackageFiles()
this->GetOption("CPACK_CYGWIN_BUILD_SCRIPT")); this->GetOption("CPACK_CYGWIN_BUILD_SCRIPT"));
std::string patchFile = tmpDir; std::string patchFile = tmpDir;
patchFile += "/"; patchFile += "/";
patchFile += cmSystemTools::GetFilenameName( patchFile +=
this->GetOption("CPACK_CYGWIN_PATCH_FILE")); cmSystemTools::GetFilenameName(this->GetOption("CPACK_CYGWIN_PATCH_FILE"));
std::string file = cmSystemTools::GetFilenameName(compressOutFile); std::string file = cmSystemTools::GetFilenameName(compressOutFile);
std::string sourceTar = cmSystemTools::GetFilenamePath(compressOutFile); std::string sourceTar = cmSystemTools::GetFilenamePath(compressOutFile);
@ -146,8 +139,7 @@ int cmCPackCygwinSourceGenerator::PackageFiles()
packageFileNames[0] = outerTarFile; packageFileNames[0] = outerTarFile;
/* update the toplevel dir */ /* update the toplevel dir */
toplevel = tmpDir; toplevel = tmpDir;
if ( !this->cmCPackTarBZip2Generator::PackageFiles() ) if (!this->cmCPackTarBZip2Generator::PackageFiles()) {
{
return 0; return 0;
} }
return 1; return 1;
@ -164,8 +156,7 @@ const char* cmCPackCygwinSourceGenerator::GetOutputExtension()
{ {
this->OutputExtension = "-"; this->OutputExtension = "-";
const char* patch = this->GetOption("CPACK_CYGWIN_PATCH_NUMBER"); const char* patch = this->GetOption("CPACK_CYGWIN_PATCH_NUMBER");
if(!patch) if (!patch) {
{
cmCPackLogger(cmCPackLog::LOG_WARNING, "CPACK_CYGWIN_PATCH_NUMBER" cmCPackLogger(cmCPackLog::LOG_WARNING, "CPACK_CYGWIN_PATCH_NUMBER"
<< " not specified, defaulting to 1\n"); << " not specified, defaulting to 1\n");
patch = "1"; patch = "1";
@ -174,4 +165,3 @@ const char* cmCPackCygwinSourceGenerator::GetOutputExtension()
this->OutputExtension += "-src.tar.bz2"; this->OutputExtension += "-src.tar.bz2";
return this->OutputExtension.c_str(); return this->OutputExtension.c_str();
} }

View File

@ -28,6 +28,7 @@ public:
*/ */
cmCPackCygwinSourceGenerator(); cmCPackCygwinSourceGenerator();
virtual ~cmCPackCygwinSourceGenerator(); virtual ~cmCPackCygwinSourceGenerator();
protected: protected:
const char* GetPackagingInstallPrefix(); const char* GetPackagingInstallPrefix();
virtual int InitializeInternal(); virtual int InitializeInternal();

View File

@ -30,7 +30,8 @@
// a GNU ar. // a GNU ar.
// See http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=161593 for more info // See http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=161593 for more info
// Therefore we provide our own implementation of a BSD-ar: // Therefore we provide our own implementation of a BSD-ar:
static int ar_append(const char*archive,const std::vector<std::string>& files); static int ar_append(const char* archive,
const std::vector<std::string>& files);
cmCPackDebGenerator::cmCPackDebGenerator() cmCPackDebGenerator::cmCPackDebGenerator()
{ {
@ -43,8 +44,7 @@ cmCPackDebGenerator::~cmCPackDebGenerator()
int cmCPackDebGenerator::InitializeInternal() int cmCPackDebGenerator::InitializeInternal()
{ {
this->SetOptionIfNotSet("CPACK_PACKAGING_INSTALL_PREFIX", "/usr"); this->SetOptionIfNotSet("CPACK_PACKAGING_INSTALL_PREFIX", "/usr");
if (cmSystemTools::IsOff(this->GetOption("CPACK_SET_DESTDIR"))) if (cmSystemTools::IsOff(this->GetOption("CPACK_SET_DESTDIR"))) {
{
this->SetOption("CPACK_SET_DESTDIR", "I_ON"); this->SetOption("CPACK_SET_DESTDIR", "I_ON");
} }
return this->Superclass::InitializeInternal(); return this->Superclass::InitializeInternal();
@ -52,39 +52,34 @@ int cmCPackDebGenerator::InitializeInternal()
int cmCPackDebGenerator::PackageOnePack(std::string initialTopLevel, int cmCPackDebGenerator::PackageOnePack(std::string initialTopLevel,
std::string packageName) std::string packageName)
{ {
int retval = 1; int retval = 1;
// Begin the archive for this pack // Begin the archive for this pack
std::string localToplevel(initialTopLevel); std::string localToplevel(initialTopLevel);
std::string packageFileName( std::string packageFileName(cmSystemTools::GetParentDirectory(toplevel));
cmSystemTools::GetParentDirectory(toplevel) std::string outputFileName(cmsys::SystemTools::LowerCase(std::string(
); this->GetOption("CPACK_PACKAGE_FILE_NAME"))) +
std::string outputFileName( "-" + packageName + this->GetOutputExtension());
cmsys::SystemTools::LowerCase(
std::string(this->GetOption("CPACK_PACKAGE_FILE_NAME")))
+"-"+packageName + this->GetOutputExtension()
);
localToplevel += "/"+ packageName; localToplevel += "/" + packageName;
/* replace the TEMP DIRECTORY with the component one */ /* replace the TEMP DIRECTORY with the component one */
this->SetOption("CPACK_TEMPORARY_DIRECTORY",localToplevel.c_str()); this->SetOption("CPACK_TEMPORARY_DIRECTORY", localToplevel.c_str());
packageFileName += "/"+ outputFileName; packageFileName += "/" + outputFileName;
/* replace proposed CPACK_OUTPUT_FILE_NAME */ /* replace proposed CPACK_OUTPUT_FILE_NAME */
this->SetOption("CPACK_OUTPUT_FILE_NAME",outputFileName.c_str()); this->SetOption("CPACK_OUTPUT_FILE_NAME", outputFileName.c_str());
/* replace the TEMPORARY package file name */ /* replace the TEMPORARY package file name */
this->SetOption("CPACK_TEMPORARY_PACKAGE_FILE_NAME", this->SetOption("CPACK_TEMPORARY_PACKAGE_FILE_NAME",
packageFileName.c_str()); packageFileName.c_str());
// Tell CPackDeb.cmake the name of the component GROUP. // Tell CPackDeb.cmake the name of the component GROUP.
this->SetOption("CPACK_DEB_PACKAGE_COMPONENT",packageName.c_str()); this->SetOption("CPACK_DEB_PACKAGE_COMPONENT", packageName.c_str());
// Tell CPackDeb.cmake the path where the component is. // Tell CPackDeb.cmake the path where the component is.
std::string component_path = "/"; std::string component_path = "/";
component_path += packageName; component_path += packageName;
this->SetOption("CPACK_DEB_PACKAGE_COMPONENT_PART_PATH", this->SetOption("CPACK_DEB_PACKAGE_COMPONENT_PART_PATH",
component_path.c_str()); component_path.c_str());
if (!this->ReadListFile("CPackDeb.cmake")) if (!this->ReadListFile("CPackDeb.cmake")) {
{ cmCPackLogger(cmCPackLog::LOG_ERROR, "Error while execution CPackDeb.cmake"
cmCPackLogger(cmCPackLog::LOG_ERROR, << std::endl);
"Error while execution CPackDeb.cmake" << std::endl);
retval = 0; retval = 0;
return retval; return retval;
} }
@ -94,17 +89,16 @@ int cmCPackDebGenerator::PackageOnePack(std::string initialTopLevel,
findExpr += "/*"; findExpr += "/*";
gl.RecurseOn(); gl.RecurseOn();
gl.SetRecurseListDirs(true); gl.SetRecurseListDirs(true);
if ( !gl.FindFiles(findExpr) ) if (!gl.FindFiles(findExpr)) {
{
cmCPackLogger(cmCPackLog::LOG_ERROR, cmCPackLogger(cmCPackLog::LOG_ERROR,
"Cannot find any files in the installed directory" << std::endl); "Cannot find any files in the installed directory"
<< std::endl);
return 0; return 0;
} }
packageFiles = gl.GetFiles(); packageFiles = gl.GetFiles();
int res = createDeb(); int res = createDeb();
if (res != 1) if (res != 1) {
{
retval = 0; retval = 0;
} }
// add the generated package to package file names list // add the generated package to package file names list
@ -125,45 +119,38 @@ int cmCPackDebGenerator::PackageComponents(bool ignoreGroup)
// The default behavior is to have one package by component group // The default behavior is to have one package by component group
// unless CPACK_COMPONENTS_IGNORE_GROUP is specified. // unless CPACK_COMPONENTS_IGNORE_GROUP is specified.
if (!ignoreGroup) if (!ignoreGroup) {
{
std::map<std::string, cmCPackComponentGroup>::iterator compGIt; std::map<std::string, cmCPackComponentGroup>::iterator compGIt;
for (compGIt=this->ComponentGroups.begin(); for (compGIt = this->ComponentGroups.begin();
compGIt!=this->ComponentGroups.end(); ++compGIt) compGIt != this->ComponentGroups.end(); ++compGIt) {
{
cmCPackLogger(cmCPackLog::LOG_VERBOSE, "Packaging component group: " cmCPackLogger(cmCPackLog::LOG_VERBOSE, "Packaging component group: "
<< compGIt->first << compGIt->first << std::endl);
<< std::endl);
// Begin the archive for this group // Begin the archive for this group
retval &= PackageOnePack(initialTopLevel,compGIt->first); retval &= PackageOnePack(initialTopLevel, compGIt->first);
} }
// Handle Orphan components (components not belonging to any groups) // Handle Orphan components (components not belonging to any groups)
std::map<std::string, cmCPackComponent>::iterator compIt; std::map<std::string, cmCPackComponent>::iterator compIt;
for (compIt=this->Components.begin(); for (compIt = this->Components.begin(); compIt != this->Components.end();
compIt!=this->Components.end(); ++compIt ) ++compIt) {
{
// Does the component belong to a group? // Does the component belong to a group?
if (compIt->second.Group==NULL) if (compIt->second.Group == NULL) {
{ cmCPackLogger(
cmCPackLogger(cmCPackLog::LOG_VERBOSE, cmCPackLog::LOG_VERBOSE, "Component <"
"Component <"
<< compIt->second.Name << compIt->second.Name
<< "> does not belong to any group, package it separately." << "> does not belong to any group, package it separately."
<< std::endl); << std::endl);
// Begin the archive for this orphan component // Begin the archive for this orphan component
retval &= PackageOnePack(initialTopLevel,compIt->first); retval &= PackageOnePack(initialTopLevel, compIt->first);
} }
} }
} }
// CPACK_COMPONENTS_IGNORE_GROUPS is set // CPACK_COMPONENTS_IGNORE_GROUPS is set
// We build 1 package per component // We build 1 package per component
else else {
{
std::map<std::string, cmCPackComponent>::iterator compIt; std::map<std::string, cmCPackComponent>::iterator compIt;
for (compIt=this->Components.begin(); for (compIt = this->Components.begin(); compIt != this->Components.end();
compIt!=this->Components.end(); ++compIt ) ++compIt) {
{ retval &= PackageOnePack(initialTopLevel, compIt->first);
retval &= PackageOnePack(initialTopLevel,compIt->first);
} }
} }
return retval; return retval;
@ -186,38 +173,32 @@ int cmCPackDebGenerator::PackageComponentsAllInOne(
// The ALL GROUPS in ONE package case // The ALL GROUPS in ONE package case
std::string localToplevel(initialTopLevel); std::string localToplevel(initialTopLevel);
std::string packageFileName( std::string packageFileName(cmSystemTools::GetParentDirectory(toplevel));
cmSystemTools::GetParentDirectory(toplevel) std::string outputFileName(cmsys::SystemTools::LowerCase(std::string(
); this->GetOption("CPACK_PACKAGE_FILE_NAME"))) +
std::string outputFileName( this->GetOutputExtension());
cmsys::SystemTools::LowerCase(
std::string(this->GetOption("CPACK_PACKAGE_FILE_NAME")))
+ this->GetOutputExtension()
);
// all GROUP in one vs all COMPONENT in one // all GROUP in one vs all COMPONENT in one
localToplevel += "/"+compInstDirName; localToplevel += "/" + compInstDirName;
/* replace the TEMP DIRECTORY with the component one */ /* replace the TEMP DIRECTORY with the component one */
this->SetOption("CPACK_TEMPORARY_DIRECTORY",localToplevel.c_str()); this->SetOption("CPACK_TEMPORARY_DIRECTORY", localToplevel.c_str());
packageFileName += "/"+ outputFileName; packageFileName += "/" + outputFileName;
/* replace proposed CPACK_OUTPUT_FILE_NAME */ /* replace proposed CPACK_OUTPUT_FILE_NAME */
this->SetOption("CPACK_OUTPUT_FILE_NAME",outputFileName.c_str()); this->SetOption("CPACK_OUTPUT_FILE_NAME", outputFileName.c_str());
/* replace the TEMPORARY package file name */ /* replace the TEMPORARY package file name */
this->SetOption("CPACK_TEMPORARY_PACKAGE_FILE_NAME", this->SetOption("CPACK_TEMPORARY_PACKAGE_FILE_NAME",
packageFileName.c_str()); packageFileName.c_str());
if(!compInstDirName.empty()) if (!compInstDirName.empty()) {
{
// Tell CPackDeb.cmake the path where the component is. // Tell CPackDeb.cmake the path where the component is.
std::string component_path = "/"; std::string component_path = "/";
component_path += compInstDirName; component_path += compInstDirName;
this->SetOption("CPACK_DEB_PACKAGE_COMPONENT_PART_PATH", this->SetOption("CPACK_DEB_PACKAGE_COMPONENT_PART_PATH",
component_path.c_str()); component_path.c_str());
} }
if (!this->ReadListFile("CPackDeb.cmake")) if (!this->ReadListFile("CPackDeb.cmake")) {
{ cmCPackLogger(cmCPackLog::LOG_ERROR, "Error while execution CPackDeb.cmake"
cmCPackLogger(cmCPackLog::LOG_ERROR, << std::endl);
"Error while execution CPackDeb.cmake" << std::endl);
retval = 0; retval = 0;
return retval; return retval;
} }
@ -227,18 +208,16 @@ int cmCPackDebGenerator::PackageComponentsAllInOne(
findExpr += "/*"; findExpr += "/*";
gl.RecurseOn(); gl.RecurseOn();
gl.SetRecurseListDirs(true); gl.SetRecurseListDirs(true);
if ( !gl.FindFiles(findExpr) ) if (!gl.FindFiles(findExpr)) {
{
cmCPackLogger(cmCPackLog::LOG_ERROR, cmCPackLogger(cmCPackLog::LOG_ERROR,
"Cannot find any files in the installed directory" << std::endl); "Cannot find any files in the installed directory"
<< std::endl);
return 0; return 0;
} }
packageFiles = gl.GetFiles(); packageFiles = gl.GetFiles();
int res = createDeb(); int res = createDeb();
if (res != 1) if (res != 1) {
{
retval = 0; retval = 0;
} }
// add the generated package to package file names list // add the generated package to package file names list
@ -256,23 +235,20 @@ int cmCPackDebGenerator::PackageFiles()
// CASE 1 : COMPONENT ALL-IN-ONE package // CASE 1 : COMPONENT ALL-IN-ONE package
// If ALL GROUPS or ALL COMPONENTS in ONE package has been requested // If ALL GROUPS or ALL COMPONENTS in ONE package has been requested
// then the package file is unique and should be open here. // then the package file is unique and should be open here.
if (componentPackageMethod == ONE_PACKAGE) if (componentPackageMethod == ONE_PACKAGE) {
{
return PackageComponentsAllInOne("ALL_COMPONENTS_IN_ONE"); return PackageComponentsAllInOne("ALL_COMPONENTS_IN_ONE");
} }
// CASE 2 : COMPONENT CLASSICAL package(s) (i.e. not all-in-one) // CASE 2 : COMPONENT CLASSICAL package(s) (i.e. not all-in-one)
// There will be 1 package for each component group // There will be 1 package for each component group
// however one may require to ignore component group and // however one may require to ignore component group and
// in this case you'll get 1 package for each component. // in this case you'll get 1 package for each component.
else else {
{
return PackageComponents(componentPackageMethod == return PackageComponents(componentPackageMethod ==
ONE_PACKAGE_PER_COMPONENT); ONE_PACKAGE_PER_COMPONENT);
} }
} }
// CASE 3 : NON COMPONENT package. // CASE 3 : NON COMPONENT package.
else else {
{
return PackageComponentsAllInOne(""); return PackageComponentsAllInOne("");
} }
} }
@ -294,7 +270,7 @@ int cmCPackDebGenerator::createDeb()
// debian policy enforce lower case for package name // debian policy enforce lower case for package name
// mandatory entries: // mandatory entries:
std::string debian_pkg_name = cmsys::SystemTools::LowerCase( std::string debian_pkg_name = cmsys::SystemTools::LowerCase(
this->GetOption("GEN_CPACK_DEBIAN_PACKAGE_NAME") ); this->GetOption("GEN_CPACK_DEBIAN_PACKAGE_NAME"));
const char* debian_pkg_version = const char* debian_pkg_version =
this->GetOption("GEN_CPACK_DEBIAN_PACKAGE_VERSION"); this->GetOption("GEN_CPACK_DEBIAN_PACKAGE_VERSION");
const char* debian_pkg_section = const char* debian_pkg_section =
@ -305,8 +281,7 @@ int cmCPackDebGenerator::createDeb()
this->GetOption("GEN_CPACK_DEBIAN_PACKAGE_ARCHITECTURE"); this->GetOption("GEN_CPACK_DEBIAN_PACKAGE_ARCHITECTURE");
const char* maintainer = const char* maintainer =
this->GetOption("GEN_CPACK_DEBIAN_PACKAGE_MAINTAINER"); this->GetOption("GEN_CPACK_DEBIAN_PACKAGE_MAINTAINER");
const char* desc = const char* desc = this->GetOption("GEN_CPACK_DEBIAN_PACKAGE_DESCRIPTION");
this->GetOption("GEN_CPACK_DEBIAN_PACKAGE_DESCRIPTION");
// optional entries // optional entries
const char* debian_pkg_dep = const char* debian_pkg_dep =
@ -332,7 +307,6 @@ int cmCPackDebGenerator::createDeb()
const char* debian_pkg_source = const char* debian_pkg_source =
this->GetOption("GEN_CPACK_DEBIAN_PACKAGE_SOURCE"); this->GetOption("GEN_CPACK_DEBIAN_PACKAGE_SOURCE");
{ // the scope is needed for cmGeneratedFileStream { // the scope is needed for cmGeneratedFileStream
cmGeneratedFileStream out(ctlfilename.c_str()); cmGeneratedFileStream out(ctlfilename.c_str());
out << "Package: " << debian_pkg_name << "\n"; out << "Package: " << debian_pkg_name << "\n";
@ -340,48 +314,37 @@ int cmCPackDebGenerator::createDeb()
out << "Section: " << debian_pkg_section << "\n"; out << "Section: " << debian_pkg_section << "\n";
out << "Priority: " << debian_pkg_priority << "\n"; out << "Priority: " << debian_pkg_priority << "\n";
out << "Architecture: " << debian_pkg_arch << "\n"; out << "Architecture: " << debian_pkg_arch << "\n";
if(debian_pkg_source && *debian_pkg_source) if (debian_pkg_source && *debian_pkg_source) {
{
out << "Source: " << debian_pkg_source << "\n"; out << "Source: " << debian_pkg_source << "\n";
} }
if(debian_pkg_dep && *debian_pkg_dep) if (debian_pkg_dep && *debian_pkg_dep) {
{
out << "Depends: " << debian_pkg_dep << "\n"; out << "Depends: " << debian_pkg_dep << "\n";
} }
if(debian_pkg_rec && *debian_pkg_rec) if (debian_pkg_rec && *debian_pkg_rec) {
{
out << "Recommends: " << debian_pkg_rec << "\n"; out << "Recommends: " << debian_pkg_rec << "\n";
} }
if(debian_pkg_sug && *debian_pkg_sug) if (debian_pkg_sug && *debian_pkg_sug) {
{
out << "Suggests: " << debian_pkg_sug << "\n"; out << "Suggests: " << debian_pkg_sug << "\n";
} }
if(debian_pkg_url && *debian_pkg_url) if (debian_pkg_url && *debian_pkg_url) {
{
out << "Homepage: " << debian_pkg_url << "\n"; out << "Homepage: " << debian_pkg_url << "\n";
} }
if (debian_pkg_predep && *debian_pkg_predep) if (debian_pkg_predep && *debian_pkg_predep) {
{
out << "Pre-Depends: " << debian_pkg_predep << "\n"; out << "Pre-Depends: " << debian_pkg_predep << "\n";
} }
if (debian_pkg_enhances && *debian_pkg_enhances) if (debian_pkg_enhances && *debian_pkg_enhances) {
{
out << "Enhances: " << debian_pkg_enhances << "\n"; out << "Enhances: " << debian_pkg_enhances << "\n";
} }
if (debian_pkg_breaks && *debian_pkg_breaks) if (debian_pkg_breaks && *debian_pkg_breaks) {
{
out << "Breaks: " << debian_pkg_breaks << "\n"; out << "Breaks: " << debian_pkg_breaks << "\n";
} }
if (debian_pkg_conflicts && *debian_pkg_conflicts) if (debian_pkg_conflicts && *debian_pkg_conflicts) {
{
out << "Conflicts: " << debian_pkg_conflicts << "\n"; out << "Conflicts: " << debian_pkg_conflicts << "\n";
} }
if (debian_pkg_provides && *debian_pkg_provides) if (debian_pkg_provides && *debian_pkg_provides) {
{
out << "Provides: " << debian_pkg_provides << "\n"; out << "Provides: " << debian_pkg_provides << "\n";
} }
if (debian_pkg_replaces && *debian_pkg_replaces) if (debian_pkg_replaces && *debian_pkg_replaces) {
{
out << "Replaces: " << debian_pkg_replaces << "\n"; out << "Replaces: " << debian_pkg_replaces << "\n";
} }
unsigned long totalSize = 0; unsigned long totalSize = 0;
@ -390,8 +353,7 @@ int cmCPackDebGenerator::createDeb()
dirName += '/'; dirName += '/';
for (std::vector<std::string>::const_iterator fileIt = for (std::vector<std::string>::const_iterator fileIt =
packageFiles.begin(); packageFiles.begin();
fileIt != packageFiles.end(); ++ fileIt ) fileIt != packageFiles.end(); ++fileIt) {
{
totalSize += cmSystemTools::FileLength(*fileIt); totalSize += cmSystemTools::FileLength(*fileIt);
} }
} }
@ -403,12 +365,11 @@ int cmCPackDebGenerator::createDeb()
const std::string shlibsfilename = strGenWDIR + "/shlibs"; const std::string shlibsfilename = strGenWDIR + "/shlibs";
const char* debian_pkg_shlibs = this->GetOption( const char* debian_pkg_shlibs =
"GEN_CPACK_DEBIAN_PACKAGE_SHLIBS"); this->GetOption("GEN_CPACK_DEBIAN_PACKAGE_SHLIBS");
const bool gen_shibs = this->IsOn("CPACK_DEBIAN_PACKAGE_GENERATE_SHLIBS") const bool gen_shibs = this->IsOn("CPACK_DEBIAN_PACKAGE_GENERATE_SHLIBS") &&
&& debian_pkg_shlibs && *debian_pkg_shlibs; debian_pkg_shlibs && *debian_pkg_shlibs;
if( gen_shibs ) if (gen_shibs) {
{
cmGeneratedFileStream out(shlibsfilename.c_str()); cmGeneratedFileStream out(shlibsfilename.c_str());
out << debian_pkg_shlibs; out << debian_pkg_shlibs;
out << std::endl; out << std::endl;
@ -416,21 +377,17 @@ int cmCPackDebGenerator::createDeb()
const std::string postinst = strGenWDIR + "/postinst"; const std::string postinst = strGenWDIR + "/postinst";
const std::string postrm = strGenWDIR + "/postrm"; const std::string postrm = strGenWDIR + "/postrm";
if(this->IsOn("GEN_CPACK_DEBIAN_GENERATE_POSTINST")) if (this->IsOn("GEN_CPACK_DEBIAN_GENERATE_POSTINST")) {
{
cmGeneratedFileStream out(postinst.c_str()); cmGeneratedFileStream out(postinst.c_str());
out << out << "#!/bin/sh\n\n"
"#!/bin/sh\n\n"
"set -e\n\n" "set -e\n\n"
"if [ \"$1\" = \"configure\" ]; then\n" "if [ \"$1\" = \"configure\" ]; then\n"
"\tldconfig\n" "\tldconfig\n"
"fi\n"; "fi\n";
} }
if(this->IsOn("GEN_CPACK_DEBIAN_GENERATE_POSTRM")) if (this->IsOn("GEN_CPACK_DEBIAN_GENERATE_POSTRM")) {
{
cmGeneratedFileStream out(postrm.c_str()); cmGeneratedFileStream out(postrm.c_str());
out << out << "#!/bin/sh\n\n"
"#!/bin/sh\n\n"
"set -e\n\n" "set -e\n\n"
"if [ \"$1\" = \"remove\" ]; then\n" "if [ \"$1\" = \"remove\" ]; then\n"
"\tldconfig\n" "\tldconfig\n"
@ -440,25 +397,24 @@ int cmCPackDebGenerator::createDeb()
cmArchiveWrite::Compress tar_compression_type = cmArchiveWrite::CompressGZip; cmArchiveWrite::Compress tar_compression_type = cmArchiveWrite::CompressGZip;
const char* debian_compression_type = const char* debian_compression_type =
this->GetOption("GEN_CPACK_DEBIAN_COMPRESSION_TYPE"); this->GetOption("GEN_CPACK_DEBIAN_COMPRESSION_TYPE");
if(!debian_compression_type) if (!debian_compression_type) {
{
debian_compression_type = "gzip"; debian_compression_type = "gzip";
} }
std::string compression_suffix; std::string compression_suffix;
if(!strcmp(debian_compression_type, "lzma")) { if (!strcmp(debian_compression_type, "lzma")) {
compression_suffix = ".lzma"; compression_suffix = ".lzma";
tar_compression_type = cmArchiveWrite::CompressLZMA; tar_compression_type = cmArchiveWrite::CompressLZMA;
} else if(!strcmp(debian_compression_type, "xz")) { } else if (!strcmp(debian_compression_type, "xz")) {
compression_suffix = ".xz"; compression_suffix = ".xz";
tar_compression_type = cmArchiveWrite::CompressXZ; tar_compression_type = cmArchiveWrite::CompressXZ;
} else if(!strcmp(debian_compression_type, "bzip2")) { } else if (!strcmp(debian_compression_type, "bzip2")) {
compression_suffix = ".bz2"; compression_suffix = ".bz2";
tar_compression_type = cmArchiveWrite::CompressBZip2; tar_compression_type = cmArchiveWrite::CompressBZip2;
} else if(!strcmp(debian_compression_type, "gzip")) { } else if (!strcmp(debian_compression_type, "gzip")) {
compression_suffix = ".gz"; compression_suffix = ".gz";
tar_compression_type = cmArchiveWrite::CompressGZip; tar_compression_type = cmArchiveWrite::CompressGZip;
} else if(!strcmp(debian_compression_type, "none")) { } else if (!strcmp(debian_compression_type, "none")) {
compression_suffix = ""; compression_suffix = "";
tar_compression_type = cmArchiveWrite::CompressNone; tar_compression_type = cmArchiveWrite::CompressNone;
} else { } else {
@ -467,19 +423,16 @@ int cmCPackDebGenerator::createDeb()
<< debian_compression_type << std::endl); << debian_compression_type << std::endl);
} }
std::string filename_data_tar =
std::string filename_data_tar = strGenWDIR strGenWDIR + "/data.tar" + compression_suffix;
+ "/data.tar" + compression_suffix;
// atomic file generation for data.tar // atomic file generation for data.tar
{ {
cmGeneratedFileStream fileStream_data_tar; cmGeneratedFileStream fileStream_data_tar;
fileStream_data_tar.Open(filename_data_tar.c_str(), false, true); fileStream_data_tar.Open(filename_data_tar.c_str(), false, true);
if(!fileStream_data_tar) if (!fileStream_data_tar) {
{ cmCPackLogger(cmCPackLog::LOG_ERROR, "Error opening the file \""
cmCPackLogger(cmCPackLog::LOG_ERROR, << filename_data_tar << "\" for writing" << std::endl);
"Error opening the file \"" << filename_data_tar << "\" for writing"
<< std::endl);
return 0; return 0;
} }
cmArchiveWrite data_tar(fileStream_data_tar, tar_compression_type, "paxr"); cmArchiveWrite data_tar(fileStream_data_tar, tar_compression_type, "paxr");
@ -495,8 +448,7 @@ int cmCPackDebGenerator::createDeb()
// give /usr and /opt // give /usr and /opt
size_t topLevelLength = strGenWDIR.length(); size_t topLevelLength = strGenWDIR.length();
cmCPackLogger(cmCPackLog::LOG_DEBUG, "WDIR: \"" cmCPackLogger(cmCPackLog::LOG_DEBUG, "WDIR: \""
<< strGenWDIR << strGenWDIR << "\", length = " << topLevelLength
<< "\", length = " << topLevelLength
<< std::endl); << std::endl);
std::set<std::string> orderedFiles; std::set<std::string> orderedFiles;
@ -504,11 +456,9 @@ int cmCPackDebGenerator::createDeb()
for (std::vector<std::string>::const_iterator fileIt = for (std::vector<std::string>::const_iterator fileIt =
packageFiles.begin(); packageFiles.begin();
fileIt != packageFiles.end(); ++ fileIt ) fileIt != packageFiles.end(); ++fileIt) {
{
std::string currentPath = *fileIt; std::string currentPath = *fileIt;
while(currentPath != strGenWDIR) while (currentPath != strGenWDIR) {
{
// the last one IS strGenWDIR, but we do not want this one: // the last one IS strGenWDIR, but we do not want this one:
// XXX/application/usr/bin/myprogram with GEN_WDIR=XXX/application // XXX/application/usr/bin/myprogram with GEN_WDIR=XXX/application
// should not add XXX/application // should not add XXX/application
@ -517,26 +467,21 @@ int cmCPackDebGenerator::createDeb()
} }
} }
for (std::set<std::string>::const_iterator fileIt = orderedFiles.begin();
for (std::set<std::string>::const_iterator fileIt = fileIt != orderedFiles.end(); ++fileIt) {
orderedFiles.begin();
fileIt != orderedFiles.end(); ++ fileIt )
{
cmCPackLogger(cmCPackLog::LOG_DEBUG, "FILEIT: \"" << *fileIt << "\"" cmCPackLogger(cmCPackLog::LOG_DEBUG, "FILEIT: \"" << *fileIt << "\""
<< std::endl); << std::endl);
std::string::size_type slashPos = fileIt->find('/', topLevelLength+1); std::string::size_type slashPos = fileIt->find('/', topLevelLength + 1);
std::string relativeDir = fileIt->substr(topLevelLength, std::string relativeDir =
slashPos - topLevelLength); fileIt->substr(topLevelLength, slashPos - topLevelLength);
cmCPackLogger(cmCPackLog::LOG_DEBUG, "RELATIVEDIR: \"" << relativeDir cmCPackLogger(cmCPackLog::LOG_DEBUG, "RELATIVEDIR: \""
<< "\"" << std::endl); << relativeDir << "\"" << std::endl);
// do not recurse because the loop will do it // do not recurse because the loop will do it
if(!data_tar.Add(*fileIt, topLevelLength, ".", false)) if (!data_tar.Add(*fileIt, topLevelLength, ".", false)) {
{ cmCPackLogger(cmCPackLog::LOG_ERROR, "Problem adding file to tar:"
cmCPackLogger(cmCPackLog::LOG_ERROR, << std::endl
"Problem adding file to tar:" << std::endl << "#top level directory: " << strGenWDIR << std::endl
<< "#top level directory: "
<< strGenWDIR << std::endl
<< "#file: " << *fileIt << std::endl << "#file: " << *fileIt << std::endl
<< "#error:" << data_tar.GetError() << std::endl); << "#error:" << data_tar.GetError() << std::endl);
return 0; return 0;
@ -544,7 +489,6 @@ int cmCPackDebGenerator::createDeb()
} }
} // scope for file generation } // scope for file generation
std::string md5filename = strGenWDIR + "/md5sums"; std::string md5filename = strGenWDIR + "/md5sums";
{ {
// the scope is needed for cmGeneratedFileStream // the scope is needed for cmGeneratedFileStream
@ -555,18 +499,15 @@ int cmCPackDebGenerator::createDeb()
topLevelWithTrailingSlash += '/'; topLevelWithTrailingSlash += '/';
for (std::vector<std::string>::const_iterator fileIt = for (std::vector<std::string>::const_iterator fileIt =
packageFiles.begin(); packageFiles.begin();
fileIt != packageFiles.end(); ++ fileIt ) fileIt != packageFiles.end(); ++fileIt) {
{
// hash only regular files // hash only regular files
if( cmSystemTools::FileIsDirectory(*fileIt) if (cmSystemTools::FileIsDirectory(*fileIt) ||
|| cmSystemTools::FileIsSymlink(*fileIt)) cmSystemTools::FileIsSymlink(*fileIt)) {
{
continue; continue;
} }
char md5sum[33]; char md5sum[33];
if(!cmSystemTools::ComputeFileMD5(*fileIt, md5sum)) if (!cmSystemTools::ComputeFileMD5(*fileIt, md5sum)) {
{
cmCPackLogger(cmCPackLog::LOG_ERROR, "Problem computing the md5 of " cmCPackLogger(cmCPackLog::LOG_ERROR, "Problem computing the md5 of "
<< *fileIt << std::endl); << *fileIt << std::endl);
} }
@ -578,31 +519,27 @@ int cmCPackDebGenerator::createDeb()
// debian md5sums entries are like this: // debian md5sums entries are like this:
// 014f3604694729f3bf19263bac599765 usr/bin/ccmake // 014f3604694729f3bf19263bac599765 usr/bin/ccmake
// thus strip the full path (with the trailing slash) // thus strip the full path (with the trailing slash)
cmSystemTools::ReplaceString(output, cmSystemTools::ReplaceString(output, topLevelWithTrailingSlash.c_str(),
topLevelWithTrailingSlash.c_str(), ""); "");
out << output; out << output;
} }
// each line contains a eol. // each line contains a eol.
// Do not end the md5sum file with yet another (invalid) // Do not end the md5sum file with yet another (invalid)
} }
std::string filename_control_tar = strGenWDIR + "/control.tar.gz"; std::string filename_control_tar = strGenWDIR + "/control.tar.gz";
// atomic file generation for control.tar // atomic file generation for control.tar
{ {
cmGeneratedFileStream fileStream_control_tar; cmGeneratedFileStream fileStream_control_tar;
fileStream_control_tar.Open(filename_control_tar.c_str(), false, true); fileStream_control_tar.Open(filename_control_tar.c_str(), false, true);
if(!fileStream_control_tar) if (!fileStream_control_tar) {
{ cmCPackLogger(cmCPackLog::LOG_ERROR, "Error opening the file \""
cmCPackLogger(cmCPackLog::LOG_ERROR, << filename_control_tar << "\" for writing"
"Error opening the file \"" << filename_control_tar << std::endl);
<< "\" for writing" << std::endl);
return 0; return 0;
} }
cmArchiveWrite control_tar(fileStream_control_tar, cmArchiveWrite control_tar(fileStream_control_tar,
cmArchiveWrite::CompressGZip, cmArchiveWrite::CompressGZip, "paxr");
"paxr");
// sets permissions and uid/gid for the files // sets permissions and uid/gid for the files
control_tar.SetUIDAndGID(0u, 0u); control_tar.SetUIDAndGID(0u, 0u);
@ -623,27 +560,22 @@ int cmCPackDebGenerator::createDeb()
control_tar.SetPermissions(permission644); control_tar.SetPermissions(permission644);
// adds control and md5sums // adds control and md5sums
if( !control_tar.Add(md5filename, strGenWDIR.length(), ".") if (!control_tar.Add(md5filename, strGenWDIR.length(), ".") ||
|| !control_tar.Add(strGenWDIR + "/control", strGenWDIR.length(), ".")) !control_tar.Add(strGenWDIR + "/control", strGenWDIR.length(), ".")) {
{ cmCPackLogger(cmCPackLog::LOG_ERROR, "Error adding file to tar:"
cmCPackLogger(cmCPackLog::LOG_ERROR, << std::endl
"Error adding file to tar:" << std::endl << "#top level directory: " << strGenWDIR << std::endl
<< "#top level directory: "
<< strGenWDIR << std::endl
<< "#file: \"control\" or \"md5sums\"" << std::endl << "#file: \"control\" or \"md5sums\"" << std::endl
<< "#error:" << control_tar.GetError() << std::endl); << "#error:" << control_tar.GetError() << std::endl);
return 0; return 0;
} }
// adds generated shlibs file // adds generated shlibs file
if( gen_shibs ) if (gen_shibs) {
{ if (!control_tar.Add(shlibsfilename, strGenWDIR.length(), ".")) {
if( !control_tar.Add(shlibsfilename, strGenWDIR.length(), ".") ) cmCPackLogger(cmCPackLog::LOG_ERROR, "Error adding file to tar:"
{ << std::endl
cmCPackLogger(cmCPackLog::LOG_ERROR, << "#top level directory: " << strGenWDIR << std::endl
"Error adding file to tar:" << std::endl
<< "#top level directory: "
<< strGenWDIR << std::endl
<< "#file: \"shlibs\"" << std::endl << "#file: \"shlibs\"" << std::endl
<< "#error:" << control_tar.GetError() << std::endl); << "#error:" << control_tar.GetError() << std::endl);
return 0; return 0;
@ -651,15 +583,12 @@ int cmCPackDebGenerator::createDeb()
} }
// adds LDCONFIG related files // adds LDCONFIG related files
if(this->IsOn("GEN_CPACK_DEBIAN_GENERATE_POSTINST")) if (this->IsOn("GEN_CPACK_DEBIAN_GENERATE_POSTINST")) {
{
control_tar.SetPermissions(permission755); control_tar.SetPermissions(permission755);
if(!control_tar.Add(postinst, strGenWDIR.length(), ".")) if (!control_tar.Add(postinst, strGenWDIR.length(), ".")) {
{ cmCPackLogger(cmCPackLog::LOG_ERROR, "Error adding file to tar:"
cmCPackLogger(cmCPackLog::LOG_ERROR, << std::endl
"Error adding file to tar:" << std::endl << "#top level directory: " << strGenWDIR << std::endl
<< "#top level directory: "
<< strGenWDIR << std::endl
<< "#file: \"postinst\"" << std::endl << "#file: \"postinst\"" << std::endl
<< "#error:" << control_tar.GetError() << std::endl); << "#error:" << control_tar.GetError() << std::endl);
return 0; return 0;
@ -667,15 +596,12 @@ int cmCPackDebGenerator::createDeb()
control_tar.SetPermissions(permission644); control_tar.SetPermissions(permission644);
} }
if(this->IsOn("GEN_CPACK_DEBIAN_GENERATE_POSTRM")) if (this->IsOn("GEN_CPACK_DEBIAN_GENERATE_POSTRM")) {
{
control_tar.SetPermissions(permission755); control_tar.SetPermissions(permission755);
if(!control_tar.Add(postrm, strGenWDIR.length(), ".")) if (!control_tar.Add(postrm, strGenWDIR.length(), ".")) {
{ cmCPackLogger(cmCPackLog::LOG_ERROR, "Error adding file to tar:"
cmCPackLogger(cmCPackLog::LOG_ERROR, << std::endl
"Error adding file to tar:" << std::endl << "#top level directory: " << strGenWDIR << std::endl
<< "#top level directory: "
<< strGenWDIR << std::endl
<< "#file: \"postinst\"" << std::endl << "#file: \"postinst\"" << std::endl
<< "#error:" << control_tar.GetError() << std::endl); << "#error:" << control_tar.GetError() << std::endl);
return 0; return 0;
@ -688,48 +614,42 @@ int cmCPackDebGenerator::createDeb()
// -either a permission strictly defined by the Debian policies // -either a permission strictly defined by the Debian policies
const char* controlExtra = const char* controlExtra =
this->GetOption("GEN_CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA"); this->GetOption("GEN_CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA");
if( controlExtra ) if (controlExtra) {
{
// permissions are now controlled by the original file permissions // permissions are now controlled by the original file permissions
const bool permissionStrictPolicy = const bool permissionStrictPolicy =
this->IsSet("GEN_CPACK_DEBIAN_PACKAGE_CONTROL_STRICT_PERMISSION"); this->IsSet("GEN_CPACK_DEBIAN_PACKAGE_CONTROL_STRICT_PERMISSION");
static const char* strictFiles[] = { static const char* strictFiles[] = { "config", "postinst", "postrm",
"config", "postinst", "postrm", "preinst", "prerm" "preinst", "prerm" };
};
std::set<std::string> setStrictFiles( std::set<std::string> setStrictFiles(
strictFiles, strictFiles,
strictFiles + sizeof(strictFiles)/sizeof(strictFiles[0])); strictFiles + sizeof(strictFiles) / sizeof(strictFiles[0]));
// default // default
control_tar.ClearPermissions(); control_tar.ClearPermissions();
std::vector<std::string> controlExtraList; std::vector<std::string> controlExtraList;
cmSystemTools::ExpandListArgument(controlExtra, controlExtraList); cmSystemTools::ExpandListArgument(controlExtra, controlExtraList);
for(std::vector<std::string>::iterator i = controlExtraList.begin(); for (std::vector<std::string>::iterator i = controlExtraList.begin();
i != controlExtraList.end(); ++i) i != controlExtraList.end(); ++i) {
{ std::string filenamename = cmsys::SystemTools::GetFilenameName(*i);
std::string filenamename =
cmsys::SystemTools::GetFilenameName(*i);
std::string localcopy = strGenWDIR + "/" + filenamename; std::string localcopy = strGenWDIR + "/" + filenamename;
if(permissionStrictPolicy) if (permissionStrictPolicy) {
{ control_tar.SetPermissions(setStrictFiles.count(filenamename)
control_tar.SetPermissions(setStrictFiles.count(filenamename) ? ? permission755
permission755 : permission644); : permission644);
} }
// if we can copy the file, it means it does exist, let's add it: // if we can copy the file, it means it does exist, let's add it:
if( cmsys::SystemTools::CopyFileIfDifferent(*i, localcopy) ) if (cmsys::SystemTools::CopyFileIfDifferent(*i, localcopy)) {
{
control_tar.Add(localcopy, strGenWDIR.length(), "."); control_tar.Add(localcopy, strGenWDIR.length(), ".");
} }
} }
} }
} }
// ar -r your-package-name.deb debian-binary control.tar.* data.tar.* // ar -r your-package-name.deb debian-binary control.tar.* data.tar.*
// since debian packages require BSD ar (most Linux distros and even // since debian packages require BSD ar (most Linux distros and even
// FreeBSD and NetBSD ship GNU ar) we use a copy of OpenBSD ar here. // FreeBSD and NetBSD ship GNU ar) we use a copy of OpenBSD ar here.
@ -742,10 +662,9 @@ int cmCPackDebGenerator::createDeb()
outputFileName += "/"; outputFileName += "/";
outputFileName += this->GetOption("GEN_CPACK_OUTPUT_FILE_NAME"); outputFileName += this->GetOption("GEN_CPACK_OUTPUT_FILE_NAME");
int res = ar_append(outputFileName.c_str(), arFiles); int res = ar_append(outputFileName.c_str(), arFiles);
if ( res!=0 ) if (res != 0) {
{ std::string tmpFile =
std::string tmpFile = this->GetOption( this->GetOption("GEN_CPACK_TEMPORARY_PACKAGE_FILE_NAME");
"GEN_CPACK_TEMPORARY_PACKAGE_FILE_NAME");
tmpFile += "/Deb.log"; tmpFile += "/Deb.log";
cmGeneratedFileStream ofs(tmpFile.c_str()); cmGeneratedFileStream ofs(tmpFile.c_str());
ofs << "# Problem creating archive using: " << res << std::endl; ofs << "# Problem creating archive using: " << res << std::endl;
@ -755,20 +674,17 @@ int cmCPackDebGenerator::createDeb()
} }
bool cmCPackDebGenerator::SupportsComponentInstallation() const bool cmCPackDebGenerator::SupportsComponentInstallation() const
{ {
if (IsOn("CPACK_DEB_COMPONENT_INSTALL")) if (IsOn("CPACK_DEB_COMPONENT_INSTALL")) {
{
return true; return true;
} } else {
else
{
return false; return false;
} }
} }
std::string cmCPackDebGenerator::GetComponentInstallDirNameSuffix( std::string cmCPackDebGenerator::GetComponentInstallDirNameSuffix(
const std::string& componentName) const std::string& componentName)
{ {
if (componentPackageMethod == ONE_PACKAGE_PER_COMPONENT) { if (componentPackageMethod == ONE_PACKAGE_PER_COMPONENT) {
return componentName; return componentName;
} }
@ -778,18 +694,14 @@ std::string cmCPackDebGenerator::GetComponentInstallDirNameSuffix(
} }
// We have to find the name of the COMPONENT GROUP // We have to find the name of the COMPONENT GROUP
// the current COMPONENT belongs to. // the current COMPONENT belongs to.
std::string groupVar = "CPACK_COMPONENT_" + std::string groupVar =
cmSystemTools::UpperCase(componentName) + "_GROUP"; "CPACK_COMPONENT_" + cmSystemTools::UpperCase(componentName) + "_GROUP";
if (NULL != GetOption(groupVar)) if (NULL != GetOption(groupVar)) {
{
return std::string(GetOption(groupVar)); return std::string(GetOption(groupVar));
} } else {
else
{
return componentName; return componentName;
} }
} }
// The following code is taken from OpenBSD ar: // The following code is taken from OpenBSD ar:
// http://www.openbsd.org/cgi-bin/cvsweb/src/usr.bin/ar/ // http://www.openbsd.org/cgi-bin/cvsweb/src/usr.bin/ar/
@ -850,7 +762,8 @@ std::string cmCPackDebGenerator::GetComponentInstallDirNameSuffix(
#define HDR1 "%s%-13d%-12ld%-6u%-6u%-8o%-10lld%2s" #define HDR1 "%s%-13d%-12ld%-6u%-6u%-8o%-10lld%2s"
#define HDR2 "%-16.16s%-12ld%-6u%-6u%-8o%-10lld%2s" #define HDR2 "%-16.16s%-12ld%-6u%-6u%-8o%-10lld%2s"
struct ar_hdr { struct ar_hdr
{
char ar_name[16]; /* name */ char ar_name[16]; /* name */
char ar_date[12]; /* modification time */ char ar_date[12]; /* modification time */
char ar_uid[6]; /* user id */ char ar_uid[6]; /* user id */
@ -861,20 +774,22 @@ struct ar_hdr {
}; };
/* Set up file copy. */ /* Set up file copy. */
#define SETCF(from, fromname, to, toname, pad) { \ #define SETCF(from, fromname, to, toname, pad) \
{ \
cf.rFile = from; \ cf.rFile = from; \
cf.rname = fromname; \ cf.rname = fromname; \
cf.wFile = to; \ cf.wFile = to; \
cf.wname = toname; \ cf.wname = toname; \
cf.flags = pad; \ cf.flags = pad; \
} }
/* File copy structure. */ /* File copy structure. */
typedef struct { typedef struct
{
FILE* rFile; /* read file descriptor */ FILE* rFile; /* read file descriptor */
const char *rname; /* read name */ const char* rname; /* read name */
FILE* wFile; /* write file descriptor */ FILE* wFile; /* write file descriptor */
const char *wname; /* write name */ const char* wname; /* write name */
#define NOPAD 0x00 /* don't pad */ #define NOPAD 0x00 /* don't pad */
#define WPAD 0x02 /* pad on writes */ #define WPAD 0x02 /* pad on writes */
unsigned int flags; /* pad flags */ unsigned int flags; /* pad flags */
@ -882,10 +797,10 @@ typedef struct {
/* misc.c */ /* misc.c */
static const char * ar_rname(const char *path) static const char* ar_rname(const char* path)
{ {
const char *ind = strrchr(path, '/'); const char* ind = strrchr(path, '/');
return (ind ) ? ind + 1 : path; return (ind) ? ind + 1 : path;
} }
/* archive.c */ /* archive.c */
@ -908,12 +823,12 @@ static size_t ar_already_written;
* because 16-bit word addressed copies were faster?) Anyhow, it should * because 16-bit word addressed copies were faster?) Anyhow, it should
* have been ripped out long ago. * have been ripped out long ago.
*/ */
static int copy_ar(CF *cfp, off_t size) static int copy_ar(CF* cfp, off_t size)
{ {
static char pad = '\n'; static char pad = '\n';
off_t sz = size; off_t sz = size;
size_t nr, nw; size_t nr, nw;
char buf[8*1024]; char buf[8 * 1024];
if (sz == 0) if (sz == 0)
return 0; return 0;
@ -922,8 +837,9 @@ static int copy_ar(CF *cfp, off_t size)
FILE* to = cfp->wFile; FILE* to = cfp->wFile;
while (sz && while (sz &&
(nr = fread(buf, 1, sz < static_cast<off_t>(sizeof(buf)) (nr = fread(buf, 1, sz < static_cast<off_t>(sizeof(buf))
? static_cast<size_t>(sz) : sizeof(buf), from )) ? static_cast<size_t>(sz)
> 0) { : sizeof(buf),
from)) > 0) {
sz -= nr; sz -= nr;
for (size_t off = 0; off < nr; nr -= off, off += nw) for (size_t off = 0; off < nr; nr -= off, off += nw)
if ((nw = fwrite(buf + off, 1, nr, to)) < nr) if ((nw = fwrite(buf + off, 1, nr, to)) < nr)
@ -932,18 +848,18 @@ static int copy_ar(CF *cfp, off_t size)
if (sz) if (sz)
return -2; return -2;
if (cfp->flags & WPAD && (size + ar_already_written) & 1 if (cfp->flags & WPAD && (size + ar_already_written) & 1 &&
&& fwrite(&pad, 1, 1, to) != 1) fwrite(&pad, 1, 1, to) != 1)
return -4; return -4;
return 0; return 0;
} }
/* put_arobj -- Write an archive member to a file. */ /* put_arobj -- Write an archive member to a file. */
static int put_arobj(CF *cfp, struct stat *sb) static int put_arobj(CF* cfp, struct stat* sb)
{ {
int result = 0; int result = 0;
struct ar_hdr *hdr; struct ar_hdr* hdr;
/* If passed an sb structure, reading a file from disk. Get stat(2) /* If passed an sb structure, reading a file from disk. Get stat(2)
* information, build a name and construct a header. (Files are named * information, build a name and construct a header. (Files are named
@ -963,15 +879,13 @@ static int put_arobj(CF *cfp, struct stat *sb)
gid = USHRT_MAX; gid = USHRT_MAX;
} }
if (lname > sizeof(hdr->ar_name) || strchr(name, ' ')) if (lname > sizeof(hdr->ar_name) || strchr(name, ' '))
(void)sprintf(ar_hb, HDR1, AR_EFMT1, (int)lname, (void)sprintf(ar_hb, HDR1, AR_EFMT1, (int)lname, (long int)sb->st_mtime,
(long int)sb->st_mtime, (unsigned)uid, (unsigned)gid, (unsigned)uid, (unsigned)gid, (unsigned)sb->st_mode,
(unsigned)sb->st_mode, (long long)sb->st_size + lname, (long long)sb->st_size + lname, ARFMAG);
ARFMAG);
else { else {
lname = 0; lname = 0;
(void)sprintf(ar_hb, HDR2, name, (void)sprintf(ar_hb, HDR2, name, (long int)sb->st_mtime, (unsigned)uid,
(long int)sb->st_mtime, (unsigned)uid, (unsigned)gid, (unsigned)gid, (unsigned)sb->st_mode, (long long)sb->st_size,
(unsigned)sb->st_mode, (long long)sb->st_size,
ARFMAG); ARFMAG);
} }
off_t size = sb->st_size; off_t size = sb->st_size;
@ -995,19 +909,20 @@ static int put_arobj(CF *cfp, struct stat *sb)
* Append files to the archive - modifies original archive or creates * Append files to the archive - modifies original archive or creates
* a new archive if named archive does not exist. * a new archive if named archive does not exist.
*/ */
static int ar_append(const char* archive,const std::vector<std::string>& files) static int ar_append(const char* archive,
const std::vector<std::string>& files)
{ {
int eval = 0; int eval = 0;
FILE* aFile = cmSystemTools::Fopen(archive, "wb+"); FILE* aFile = cmSystemTools::Fopen(archive, "wb+");
if (aFile!=NULL) { if (aFile != NULL) {
fwrite(ARMAG, SARMAG, 1, aFile); fwrite(ARMAG, SARMAG, 1, aFile);
if (fseek(aFile, 0, SEEK_END) != -1) { if (fseek(aFile, 0, SEEK_END) != -1) {
CF cf; CF cf;
struct stat sb; struct stat sb;
/* Read from disk, write to an archive; pad on write. */ /* Read from disk, write to an archive; pad on write. */
SETCF(NULL, 0, aFile, archive, WPAD); SETCF(NULL, 0, aFile, archive, WPAD);
for(std::vector<std::string>::const_iterator fileIt = files.begin(); for (std::vector<std::string>::const_iterator fileIt = files.begin();
fileIt!=files.end(); ++fileIt) { fileIt != files.end(); ++fileIt) {
const char* filename = fileIt->c_str(); const char* filename = fileIt->c_str();
FILE* file = cmSystemTools::Fopen(filename, "rb"); FILE* file = cmSystemTools::Fopen(filename, "rb");
if (file == NULL) { if (file == NULL) {
@ -1018,18 +933,16 @@ static int ar_append(const char* archive,const std::vector<std::string>& files)
cf.rname = filename; cf.rname = filename;
int result = put_arobj(&cf, &sb); int result = put_arobj(&cf, &sb);
(void)fclose(file); (void)fclose(file);
if (result!=0) { if (result != 0) {
eval = -2; eval = -2;
break; break;
} }
} }
} } else {
else {
eval = -3; eval = -3;
} }
fclose(aFile); fclose(aFile);
} } else {
else {
eval = -4; eval = -4;
} }
return eval; return eval;

View File

@ -37,7 +37,7 @@ public:
std::vector<std::string> locations; std::vector<std::string> locations;
locations.push_back("/sw/bin"); // Fink locations.push_back("/sw/bin"); // Fink
locations.push_back("/opt/local/bin"); // MacPorts locations.push_back("/opt/local/bin"); // MacPorts
return cmSystemTools::FindProgram("dpkg",locations) != "" ? true : false; return cmSystemTools::FindProgram("dpkg", locations) != "" ? true : false;
#else #else
// legacy behavior on other systems // legacy behavior on other systems
return true; return true;
@ -70,7 +70,6 @@ protected:
private: private:
int createDeb(); int createDeb();
std::vector<std::string> packageFiles; std::vector<std::string> packageFiles;
}; };
#endif #endif

File diff suppressed because it is too large Load Diff

View File

@ -34,13 +34,12 @@ protected:
int PackageFiles(); int PackageFiles();
bool SupportsComponentInstallation() const; bool SupportsComponentInstallation() const;
bool CopyFile(std::ostringstream& source, std::ostringstream& target); bool CopyFile(std::ostringstream& source, std::ostringstream& target);
bool CreateEmptyFile(std::ostringstream& target, size_t size); bool CreateEmptyFile(std::ostringstream& target, size_t size);
bool RunCommand(std::ostringstream& command, std::string* output = 0); bool RunCommand(std::ostringstream& command, std::string* output = 0);
std::string std::string GetComponentInstallDirNameSuffix(
GetComponentInstallDirNameSuffix(const std::string& componentName); const std::string& componentName);
int CreateDMG(const std::string& src_dir, const std::string& output_file); int CreateDMG(const std::string& src_dir, const std::string& output_file);
@ -52,10 +51,9 @@ private:
bool WriteLicense(cmGeneratedFileStream& outputStream, int licenseNumber, bool WriteLicense(cmGeneratedFileStream& outputStream, int licenseNumber,
std::string licenseLanguage, std::string licenseFile, std::string licenseLanguage, std::string licenseFile,
std::string *error); std::string* error);
bool BreakLongLine(const std::string& line, bool BreakLongLine(const std::string& line, std::vector<std::string>& lines,
std::vector<std::string>& lines, std::string* error);
std::string *error);
void EscapeQuotesAndBackslashes(std::string& line); void EscapeQuotesAndBackslashes(std::string& line);
}; };

File diff suppressed because it is too large Load Diff

View File

@ -20,8 +20,8 @@
#include <vector> #include <vector>
#include "cmCPackComponentGroup.h" // cmCPackComponent and friends #include "cmCPackComponentGroup.h" // cmCPackComponent and friends
// Forward declarations are insufficient since we use them in // Forward declarations are insufficient since we use them in
// std::map data members below... // std::map data members below...
#define cmCPackTypeMacro(klass, superclass) \ #define cmCPackTypeMacro(klass, superclass) \
cmTypeMacro(klass, superclass); \ cmTypeMacro(klass, superclass); \
@ -32,17 +32,17 @@
do { \ do { \
std::ostringstream cmCPackLog_msg; \ std::ostringstream cmCPackLog_msg; \
cmCPackLog_msg << msg; \ cmCPackLog_msg << msg; \
this->Logger->Log(logType, __FILE__, __LINE__,\ this->Logger->Log(logType, __FILE__, __LINE__, \
cmCPackLog_msg.str().c_str());\ cmCPackLog_msg.str().c_str()); \
} while ( 0 ) } while (0)
#ifdef cerr #ifdef cerr
# undef cerr #undef cerr
#endif #endif
#define cerr no_cerr_use_cmCPack_Log #define cerr no_cerr_use_cmCPack_Log
#ifdef cout #ifdef cout
# undef cout #undef cout
#endif #endif
#define cout no_cout_use_cmCPack_Log #define cout no_cout_use_cmCPack_Log
@ -62,8 +62,10 @@ public:
* If verbose then more information is printed out * If verbose then more information is printed out
*/ */
void SetVerbose(bool val) void SetVerbose(bool val)
{ this->GeneratorVerbose = val ? {
cmSystemTools::OUTPUT_MERGE : cmSystemTools::OUTPUT_NONE; } this->GeneratorVerbose =
val ? cmSystemTools::OUTPUT_MERGE : cmSystemTools::OUTPUT_NONE;
}
/** /**
* Returns true if the generator may work on this system. * Returns true if the generator may work on this system.
@ -170,8 +172,7 @@ protected:
*/ */
virtual std::string GetComponentPackageFileName( virtual std::string GetComponentPackageFileName(
const std::string& initialPackageFileName, const std::string& initialPackageFileName,
const std::string& groupOrComponentName, const std::string& groupOrComponentName, bool isGroupName);
bool isGroupName);
/** /**
* Package the list of files and/or components which * Package the list of files and/or components which
@ -192,7 +193,6 @@ protected:
virtual bool ConfigureString(const std::string& input, std::string& output); virtual bool ConfigureString(const std::string& input, std::string& output);
virtual int InitializeInternal(); virtual int InitializeInternal();
//! Run install commands if specified //! Run install commands if specified
virtual int InstallProjectViaInstallCommands( virtual int InstallProjectViaInstallCommands(
bool setDestDir, const std::string& tempInstallDirectory); bool setDestDir, const std::string& tempInstallDirectory);
@ -207,7 +207,8 @@ protected:
* The various level of support of * The various level of support of
* CPACK_SET_DESTDIR used by the generator. * CPACK_SET_DESTDIR used by the generator.
*/ */
enum CPackSetDestdirSupport { enum CPackSetDestdirSupport
{
/* the generator works with or without it */ /* the generator works with or without it */
SETDESTDIR_SUPPORTED, SETDESTDIR_SUPPORTED,
/* the generator works best if automatically handled */ /* the generator works best if automatically handled */
@ -251,13 +252,11 @@ protected:
*/ */
virtual bool WantsComponentInstallation() const; virtual bool WantsComponentInstallation() const;
virtual cmCPackInstallationType* GetInstallationType( virtual cmCPackInstallationType* GetInstallationType(
const std::string& projectName, const std::string& projectName, const std::string& name);
const std::string& name);
virtual cmCPackComponent* GetComponent(const std::string& projectName, virtual cmCPackComponent* GetComponent(const std::string& projectName,
const std::string& name); const std::string& name);
virtual cmCPackComponentGroup* GetComponentGroup( virtual cmCPackComponentGroup* GetComponentGroup(
const std::string& projectName, const std::string& projectName, const std::string& name);
const std::string& name);
cmSystemTools::OutputOption GeneratorVerbose; cmSystemTools::OutputOption GeneratorVerbose;
std::string Name; std::string Name;
@ -324,6 +323,7 @@ protected:
ComponentPackageMethod componentPackageMethod; ComponentPackageMethod componentPackageMethod;
cmCPackLog* Logger; cmCPackLog* Logger;
private: private:
cmMakefile* MakefileMap; cmMakefile* MakefileMap;
}; };

View File

@ -24,131 +24,112 @@
#include "cmCPackZIPGenerator.h" #include "cmCPackZIPGenerator.h"
#ifdef __APPLE__ #ifdef __APPLE__
# include "cmCPackBundleGenerator.h" #include "cmCPackBundleGenerator.h"
# include "cmCPackDragNDropGenerator.h" #include "cmCPackDragNDropGenerator.h"
# include "cmCPackOSXX11Generator.h" #include "cmCPackOSXX11Generator.h"
# include "cmCPackPackageMakerGenerator.h" #include "cmCPackPackageMakerGenerator.h"
#endif #endif
#ifdef __CYGWIN__ #ifdef __CYGWIN__
# include "cmCPackCygwinBinaryGenerator.h" #include "cmCPackCygwinBinaryGenerator.h"
# include "cmCPackCygwinSourceGenerator.h" #include "cmCPackCygwinSourceGenerator.h"
#endif #endif
#if !defined(_WIN32) \ #if !defined(_WIN32) && !defined(__QNXNTO__) && !defined(__BEOS__) && \
&& !defined(__QNXNTO__) && !defined(__BEOS__) && !defined(__HAIKU__) !defined(__HAIKU__)
# include "cmCPackDebGenerator.h" #include "cmCPackDebGenerator.h"
# include "cmCPackRPMGenerator.h" #include "cmCPackRPMGenerator.h"
#endif #endif
#ifdef _WIN32 #ifdef _WIN32
# include "WiX/cmCPackWIXGenerator.h" #include "WiX/cmCPackWIXGenerator.h"
#endif #endif
#include "cmAlgorithms.h" #include "cmAlgorithms.h"
#include "cmCPackLog.h" #include "cmCPackLog.h"
cmCPackGeneratorFactory::cmCPackGeneratorFactory() cmCPackGeneratorFactory::cmCPackGeneratorFactory()
{ {
if (cmCPackTGZGenerator::CanGenerate()) if (cmCPackTGZGenerator::CanGenerate()) {
{
this->RegisterGenerator("TGZ", "Tar GZip compression", this->RegisterGenerator("TGZ", "Tar GZip compression",
cmCPackTGZGenerator::CreateGenerator); cmCPackTGZGenerator::CreateGenerator);
} }
if (cmCPackTXZGenerator::CanGenerate()) if (cmCPackTXZGenerator::CanGenerate()) {
{
this->RegisterGenerator("TXZ", "Tar XZ compression", this->RegisterGenerator("TXZ", "Tar XZ compression",
cmCPackTXZGenerator::CreateGenerator); cmCPackTXZGenerator::CreateGenerator);
} }
if (cmCPackSTGZGenerator::CanGenerate()) if (cmCPackSTGZGenerator::CanGenerate()) {
{
this->RegisterGenerator("STGZ", "Self extracting Tar GZip compression", this->RegisterGenerator("STGZ", "Self extracting Tar GZip compression",
cmCPackSTGZGenerator::CreateGenerator); cmCPackSTGZGenerator::CreateGenerator);
} }
if (cmCPackNSISGenerator::CanGenerate()) if (cmCPackNSISGenerator::CanGenerate()) {
{
this->RegisterGenerator("NSIS", "Null Soft Installer", this->RegisterGenerator("NSIS", "Null Soft Installer",
cmCPackNSISGenerator::CreateGenerator); cmCPackNSISGenerator::CreateGenerator);
this->RegisterGenerator("NSIS64", "Null Soft Installer (64-bit)", this->RegisterGenerator("NSIS64", "Null Soft Installer (64-bit)",
cmCPackNSISGenerator::CreateGenerator64); cmCPackNSISGenerator::CreateGenerator64);
} }
if (cmCPackIFWGenerator::CanGenerate()) if (cmCPackIFWGenerator::CanGenerate()) {
{
this->RegisterGenerator("IFW", "Qt Installer Framework", this->RegisterGenerator("IFW", "Qt Installer Framework",
cmCPackIFWGenerator::CreateGenerator); cmCPackIFWGenerator::CreateGenerator);
} }
#ifdef __CYGWIN__ #ifdef __CYGWIN__
if (cmCPackCygwinBinaryGenerator::CanGenerate()) if (cmCPackCygwinBinaryGenerator::CanGenerate()) {
{
this->RegisterGenerator("CygwinBinary", "Cygwin Binary Installer", this->RegisterGenerator("CygwinBinary", "Cygwin Binary Installer",
cmCPackCygwinBinaryGenerator::CreateGenerator); cmCPackCygwinBinaryGenerator::CreateGenerator);
} }
if (cmCPackCygwinSourceGenerator::CanGenerate()) if (cmCPackCygwinSourceGenerator::CanGenerate()) {
{
this->RegisterGenerator("CygwinSource", "Cygwin Source Installer", this->RegisterGenerator("CygwinSource", "Cygwin Source Installer",
cmCPackCygwinSourceGenerator::CreateGenerator); cmCPackCygwinSourceGenerator::CreateGenerator);
} }
#endif #endif
if (cmCPackZIPGenerator::CanGenerate()) if (cmCPackZIPGenerator::CanGenerate()) {
{
this->RegisterGenerator("ZIP", "ZIP file format", this->RegisterGenerator("ZIP", "ZIP file format",
cmCPackZIPGenerator::CreateGenerator); cmCPackZIPGenerator::CreateGenerator);
} }
if (cmCPack7zGenerator::CanGenerate()) if (cmCPack7zGenerator::CanGenerate()) {
{
this->RegisterGenerator("7Z", "7-Zip file format", this->RegisterGenerator("7Z", "7-Zip file format",
cmCPack7zGenerator::CreateGenerator); cmCPack7zGenerator::CreateGenerator);
} }
#ifdef _WIN32 #ifdef _WIN32
if (cmCPackWIXGenerator::CanGenerate()) if (cmCPackWIXGenerator::CanGenerate()) {
{
this->RegisterGenerator("WIX", "MSI file format via WiX tools", this->RegisterGenerator("WIX", "MSI file format via WiX tools",
cmCPackWIXGenerator::CreateGenerator); cmCPackWIXGenerator::CreateGenerator);
} }
#endif #endif
if (cmCPackTarBZip2Generator::CanGenerate()) if (cmCPackTarBZip2Generator::CanGenerate()) {
{
this->RegisterGenerator("TBZ2", "Tar BZip2 compression", this->RegisterGenerator("TBZ2", "Tar BZip2 compression",
cmCPackTarBZip2Generator::CreateGenerator); cmCPackTarBZip2Generator::CreateGenerator);
} }
if (cmCPackTarCompressGenerator::CanGenerate()) if (cmCPackTarCompressGenerator::CanGenerate()) {
{
this->RegisterGenerator("TZ", "Tar Compress compression", this->RegisterGenerator("TZ", "Tar Compress compression",
cmCPackTarCompressGenerator::CreateGenerator); cmCPackTarCompressGenerator::CreateGenerator);
} }
#ifdef __APPLE__ #ifdef __APPLE__
if (cmCPackDragNDropGenerator::CanGenerate()) if (cmCPackDragNDropGenerator::CanGenerate()) {
{
this->RegisterGenerator("DragNDrop", "Mac OSX Drag And Drop", this->RegisterGenerator("DragNDrop", "Mac OSX Drag And Drop",
cmCPackDragNDropGenerator::CreateGenerator); cmCPackDragNDropGenerator::CreateGenerator);
} }
if (cmCPackBundleGenerator::CanGenerate()) if (cmCPackBundleGenerator::CanGenerate()) {
{
this->RegisterGenerator("Bundle", "Mac OSX bundle", this->RegisterGenerator("Bundle", "Mac OSX bundle",
cmCPackBundleGenerator::CreateGenerator); cmCPackBundleGenerator::CreateGenerator);
} }
if (cmCPackPackageMakerGenerator::CanGenerate()) if (cmCPackPackageMakerGenerator::CanGenerate()) {
{
this->RegisterGenerator("PackageMaker", "Mac OSX Package Maker installer", this->RegisterGenerator("PackageMaker", "Mac OSX Package Maker installer",
cmCPackPackageMakerGenerator::CreateGenerator); cmCPackPackageMakerGenerator::CreateGenerator);
} }
if (cmCPackOSXX11Generator::CanGenerate()) if (cmCPackOSXX11Generator::CanGenerate()) {
{
this->RegisterGenerator("OSXX11", "Mac OSX X11 bundle", this->RegisterGenerator("OSXX11", "Mac OSX X11 bundle",
cmCPackOSXX11Generator::CreateGenerator); cmCPackOSXX11Generator::CreateGenerator);
} }
#endif #endif
#if !defined(_WIN32) \ #if !defined(_WIN32) && !defined(__QNXNTO__) && !defined(__BEOS__) && \
&& !defined(__QNXNTO__) && !defined(__BEOS__) && !defined(__HAIKU__) !defined(__HAIKU__)
if (cmCPackDebGenerator::CanGenerate()) if (cmCPackDebGenerator::CanGenerate()) {
{
this->RegisterGenerator("DEB", "Debian packages", this->RegisterGenerator("DEB", "Debian packages",
cmCPackDebGenerator::CreateGenerator); cmCPackDebGenerator::CreateGenerator);
} }
if (cmCPackRPMGenerator::CanGenerate()) if (cmCPackRPMGenerator::CanGenerate()) {
{
this->RegisterGenerator("RPM", "RPM packages", this->RegisterGenerator("RPM", "RPM packages",
cmCPackRPMGenerator::CreateGenerator); cmCPackRPMGenerator::CreateGenerator);
} }
@ -164,8 +145,7 @@ cmCPackGenerator* cmCPackGeneratorFactory::NewGenerator(
const std::string& name) const std::string& name)
{ {
cmCPackGenerator* gen = this->NewGeneratorInternal(name); cmCPackGenerator* gen = this->NewGeneratorInternal(name);
if ( !gen ) if (!gen) {
{
return 0; return 0;
} }
this->Generators.push_back(gen); this->Generators.push_back(gen);
@ -176,21 +156,19 @@ cmCPackGenerator* cmCPackGeneratorFactory::NewGenerator(
cmCPackGenerator* cmCPackGeneratorFactory::NewGeneratorInternal( cmCPackGenerator* cmCPackGeneratorFactory::NewGeneratorInternal(
const std::string& name) const std::string& name)
{ {
cmCPackGeneratorFactory::t_GeneratorCreatorsMap::iterator it cmCPackGeneratorFactory::t_GeneratorCreatorsMap::iterator it =
= this->GeneratorCreators.find(name); this->GeneratorCreators.find(name);
if ( it == this->GeneratorCreators.end() ) if (it == this->GeneratorCreators.end()) {
{
return 0; return 0;
} }
return (it->second)(); return (it->second)();
} }
void cmCPackGeneratorFactory::RegisterGenerator(const std::string& name, void cmCPackGeneratorFactory::RegisterGenerator(
const char* generatorDescription, const std::string& name, const char* generatorDescription,
CreateGeneratorCall* createGenerator) CreateGeneratorCall* createGenerator)
{ {
if ( !createGenerator ) if (!createGenerator) {
{
cmCPack_Log(this->Logger, cmCPackLog::LOG_ERROR, cmCPack_Log(this->Logger, cmCPackLog::LOG_ERROR,
"Cannot register generator" << std::endl); "Cannot register generator" << std::endl);
return; return;

View File

@ -44,7 +44,9 @@ public:
typedef std::map<std::string, std::string> DescriptionsMap; typedef std::map<std::string, std::string> DescriptionsMap;
const DescriptionsMap& GetGeneratorsList() const const DescriptionsMap& GetGeneratorsList() const
{ return this->GeneratorDescriptions; } {
return this->GeneratorDescriptions;
}
private: private:
cmCPackGenerator* NewGeneratorInternal(const std::string& name); cmCPackGenerator* NewGeneratorInternal(const std::string& name);

View File

@ -39,8 +39,7 @@ cmCPackLog::~cmCPackLog()
void cmCPackLog::SetLogOutputStream(std::ostream* os) void cmCPackLog::SetLogOutputStream(std::ostream* os)
{ {
if ( this->LogOutputCleanup && this->LogOutput ) if (this->LogOutputCleanup && this->LogOutput) {
{
delete this->LogOutput; delete this->LogOutput;
} }
this->LogOutputCleanup = false; this->LogOutputCleanup = false;
@ -49,27 +48,24 @@ void cmCPackLog::SetLogOutputStream(std::ostream* os)
bool cmCPackLog::SetLogOutputFile(const char* fname) bool cmCPackLog::SetLogOutputFile(const char* fname)
{ {
cmGeneratedFileStream *cg = 0; cmGeneratedFileStream* cg = 0;
if ( fname ) if (fname) {
{
cg = new cmGeneratedFileStream(fname); cg = new cmGeneratedFileStream(fname);
} }
if ( cg && !*cg ) if (cg && !*cg) {
{
delete cg; delete cg;
cg = 0; cg = 0;
} }
this->SetLogOutputStream(cg); this->SetLogOutputStream(cg);
if ( !cg ) if (!cg) {
{
return false; return false;
} }
this->LogOutputCleanup = true; this->LogOutputCleanup = true;
return true; return true;
} }
void cmCPackLog::Log(int tag, const char* file, int line, void cmCPackLog::Log(int tag, const char* file, int line, const char* msg,
const char* msg, size_t length) size_t length)
{ {
// By default no logging // By default no logging
bool display = false; bool display = false;
@ -86,135 +82,109 @@ void cmCPackLog::Log(int tag, const char* file, int line,
// When writing in file, add list of tags whenever tag changes. // When writing in file, add list of tags whenever tag changes.
std::string tagString; std::string tagString;
bool needTagString = false; bool needTagString = false;
if ( this->LogOutput && this->LastTag != tag ) if (this->LogOutput && this->LastTag != tag) {
{
needTagString = true; needTagString = true;
} }
if ( tag & LOG_OUTPUT ) if (tag & LOG_OUTPUT) {
{
output = true; output = true;
display = true; display = true;
if ( needTagString ) if (needTagString) {
{ if (!tagString.empty()) {
if (!tagString.empty()) { tagString += ","; } tagString += ",";
}
tagString = "VERBOSE"; tagString = "VERBOSE";
} }
} }
if ( tag & LOG_WARNING ) if (tag & LOG_WARNING) {
{
warning = true; warning = true;
display = true; display = true;
if ( needTagString ) if (needTagString) {
{ if (!tagString.empty()) {
if (!tagString.empty()) { tagString += ","; } tagString += ",";
}
tagString = "WARNING"; tagString = "WARNING";
} }
} }
if ( tag & LOG_ERROR ) if (tag & LOG_ERROR) {
{
error = true; error = true;
display = true; display = true;
if ( needTagString ) if (needTagString) {
{ if (!tagString.empty()) {
if (!tagString.empty()) { tagString += ","; } tagString += ",";
}
tagString = "ERROR"; tagString = "ERROR";
} }
} }
if ( tag & LOG_DEBUG && this->Debug ) if (tag & LOG_DEBUG && this->Debug) {
{
debug = true; debug = true;
display = true; display = true;
if ( needTagString ) if (needTagString) {
{ if (!tagString.empty()) {
if (!tagString.empty()) { tagString += ","; } tagString += ",";
}
tagString = "DEBUG"; tagString = "DEBUG";
} }
useFileAndLine = true; useFileAndLine = true;
} }
if ( tag & LOG_VERBOSE && this->Verbose ) if (tag & LOG_VERBOSE && this->Verbose) {
{
verbose = true; verbose = true;
display = true; display = true;
if ( needTagString ) if (needTagString) {
{ if (!tagString.empty()) {
if (!tagString.empty()) { tagString += ","; } tagString += ",";
}
tagString = "VERBOSE"; tagString = "VERBOSE";
} }
} }
if ( this->Quiet ) if (this->Quiet) {
{
display = false; display = false;
} }
if ( this->LogOutput ) if (this->LogOutput) {
{ if (needTagString) {
if ( needTagString ) *this->LogOutput << "[" << file << ":" << line << " " << tagString
{ << "] ";
*this->LogOutput << "[" << file << ":" << line << " "
<< tagString << "] ";
} }
this->LogOutput->write(msg, length); this->LogOutput->write(msg, length);
} }
this->LastTag = tag; this->LastTag = tag;
if ( !display ) if (!display) {
{
return; return;
} }
if ( this->NewLine ) if (this->NewLine) {
{ if (error && !this->ErrorPrefix.empty()) {
if ( error && !this->ErrorPrefix.empty() )
{
*this->DefaultError << this->ErrorPrefix; *this->DefaultError << this->ErrorPrefix;
} } else if (warning && !this->WarningPrefix.empty()) {
else if ( warning && !this->WarningPrefix.empty() )
{
*this->DefaultError << this->WarningPrefix; *this->DefaultError << this->WarningPrefix;
} } else if (output && !this->OutputPrefix.empty()) {
else if ( output && !this->OutputPrefix.empty() )
{
*this->DefaultOutput << this->OutputPrefix; *this->DefaultOutput << this->OutputPrefix;
} } else if (verbose && !this->VerbosePrefix.empty()) {
else if ( verbose && !this->VerbosePrefix.empty() )
{
*this->DefaultOutput << this->VerbosePrefix; *this->DefaultOutput << this->VerbosePrefix;
} } else if (debug && !this->DebugPrefix.empty()) {
else if ( debug && !this->DebugPrefix.empty() )
{
*this->DefaultOutput << this->DebugPrefix; *this->DefaultOutput << this->DebugPrefix;
} } else if (!this->Prefix.empty()) {
else if ( !this->Prefix.empty() )
{
*this->DefaultOutput << this->Prefix; *this->DefaultOutput << this->Prefix;
} }
if ( useFileAndLine ) if (useFileAndLine) {
{ if (error || warning) {
if ( error || warning )
{
*this->DefaultError << file << ":" << line << " "; *this->DefaultError << file << ":" << line << " ";
} } else {
else
{
*this->DefaultOutput << file << ":" << line << " "; *this->DefaultOutput << file << ":" << line << " ";
} }
} }
} }
if ( error || warning ) if (error || warning) {
{
this->DefaultError->write(msg, length); this->DefaultError->write(msg, length);
this->DefaultError->flush(); this->DefaultError->flush();
} } else {
else
{
this->DefaultOutput->write(msg, length); this->DefaultOutput->write(msg, length);
this->DefaultOutput->flush(); this->DefaultOutput->flush();
} }
if ( msg[length-1] == '\n' || length > 2 ) if (msg[length - 1] == '\n' || length > 2) {
{
this->NewLine = true; this->NewLine = true;
} }
if ( error ) if (error) {
{
cmSystemTools::SetErrorOccured(); cmSystemTools::SetErrorOccured();
} }
} }

View File

@ -19,20 +19,19 @@
do { \ do { \
std::ostringstream cmCPackLog_msg; \ std::ostringstream cmCPackLog_msg; \
cmCPackLog_msg << msg; \ cmCPackLog_msg << msg; \
(ctSelf)->Log(logType, __FILE__, __LINE__, cmCPackLog_msg.str().c_str());\ (ctSelf)->Log(logType, __FILE__, __LINE__, cmCPackLog_msg.str().c_str()); \
} while ( 0 ) } while (0)
#ifdef cerr #ifdef cerr
# undef cerr #undef cerr
#endif #endif
#define cerr no_cerr_use_cmCPack_Log #define cerr no_cerr_use_cmCPack_Log
#ifdef cout #ifdef cout
# undef cout #undef cout
#endif #endif
#define cout no_cout_use_cmCPack_Log #define cout no_cout_use_cmCPack_Log
/** \class cmCPackLog /** \class cmCPackLog
* \brief A container for CPack generators * \brief A container for CPack generators
* *
@ -45,7 +44,8 @@ public:
cmCPackLog(); cmCPackLog();
~cmCPackLog(); ~cmCPackLog();
enum __log_tags { enum __log_tags
{
NOTAG = 0, NOTAG = 0,
LOG_OUTPUT = 0x1, LOG_OUTPUT = 0x1,
LOG_VERBOSE = 0x2, LOG_VERBOSE = 0x2,
@ -126,11 +126,11 @@ private:
std::string WarningPrefix; std::string WarningPrefix;
std::string ErrorPrefix; std::string ErrorPrefix;
std::ostream *DefaultOutput; std::ostream* DefaultOutput;
std::ostream *DefaultError; std::ostream* DefaultError;
std::string LogOutputFileName; std::string LogOutputFileName;
std::ostream *LogOutput; std::ostream* LogOutput;
// Do we need to cleanup log output stream // Do we need to cleanup log output stream
bool LogOutputCleanup; bool LogOutputCleanup;
}; };
@ -139,13 +139,16 @@ class cmCPackLogWrite
{ {
public: public:
cmCPackLogWrite(const char* data, size_t length) cmCPackLogWrite(const char* data, size_t length)
: Data(data), Length(length) {} : Data(data)
, Length(length)
{
}
const char* Data; const char* Data;
size_t Length; size_t Length;
}; };
inline std::ostream& operator<< (std::ostream& os, const cmCPackLogWrite& c) inline std::ostream& operator<<(std::ostream& os, const cmCPackLogWrite& c)
{ {
os.write(c.Data, c.Length); os.write(c.Data, c.Length);
os.flush(); os.flush();

File diff suppressed because it is too large Load Diff

View File

@ -28,7 +28,9 @@ public:
cmCPackTypeMacro(cmCPackNSISGenerator, cmCPackGenerator); cmCPackTypeMacro(cmCPackNSISGenerator, cmCPackGenerator);
static cmCPackGenerator* CreateGenerator64() static cmCPackGenerator* CreateGenerator64()
{ return new cmCPackNSISGenerator(true); } {
return new cmCPackNSISGenerator(true);
}
/** /**
* Construct generator * Construct generator
@ -38,8 +40,7 @@ public:
protected: protected:
virtual int InitializeInternal(); virtual int InitializeInternal();
void CreateMenuLinks( std::ostringstream& str, void CreateMenuLinks(std::ostringstream& str, std::ostringstream& deleteStr);
std::ostringstream& deleteStr);
int PackageFiles(); int PackageFiles();
virtual const char* GetOutputExtension() { return ".exe"; } virtual const char* GetOutputExtension() { return ".exe"; }
virtual const char* GetOutputPostfix() { return "win32"; } virtual const char* GetOutputPostfix() { return "win32"; }
@ -54,27 +55,23 @@ protected:
/// Produce a string that contains the NSIS code to describe a /// Produce a string that contains the NSIS code to describe a
/// particular component. Any added macros will be emitted via /// particular component. Any added macros will be emitted via
/// macrosOut. /// macrosOut.
std::string std::string CreateComponentDescription(cmCPackComponent* component,
CreateComponentDescription(cmCPackComponent *component,
std::ostringstream& macrosOut); std::ostringstream& macrosOut);
/// Produce NSIS code that selects all of the components that this component /// Produce NSIS code that selects all of the components that this component
/// depends on, recursively. /// depends on, recursively.
std::string CreateSelectionDependenciesDescription std::string CreateSelectionDependenciesDescription(
(cmCPackComponent *component, cmCPackComponent* component, std::set<cmCPackComponent*>& visited);
std::set<cmCPackComponent *>& visited);
/// Produce NSIS code that de-selects all of the components that are /// Produce NSIS code that de-selects all of the components that are
/// dependent on this component, recursively. /// dependent on this component, recursively.
std::string CreateDeselectionDependenciesDescription std::string CreateDeselectionDependenciesDescription(
(cmCPackComponent *component, cmCPackComponent* component, std::set<cmCPackComponent*>& visited);
std::set<cmCPackComponent *>& visited);
/// Produce a string that contains the NSIS code to describe a /// Produce a string that contains the NSIS code to describe a
/// particular component group, including its components. Any /// particular component group, including its components. Any
/// added macros will be emitted via macrosOut. /// added macros will be emitted via macrosOut.
std::string std::string CreateComponentGroupDescription(cmCPackComponentGroup* group,
CreateComponentGroupDescription(cmCPackComponentGroup *group,
std::ostringstream& macrosOut); std::ostringstream& macrosOut);
/// Translations any newlines found in the string into \\r\\n, so that the /// Translations any newlines found in the string into \\r\\n, so that the

View File

@ -36,10 +36,9 @@ int cmCPackOSXX11Generator::PackageFiles()
// TODO: Use toplevel ? // TODO: Use toplevel ?
// It is used! Is this an obsolete comment? // It is used! Is this an obsolete comment?
const char* cpackPackageExecutables const char* cpackPackageExecutables =
= this->GetOption("CPACK_PACKAGE_EXECUTABLES"); this->GetOption("CPACK_PACKAGE_EXECUTABLES");
if ( cpackPackageExecutables ) if (cpackPackageExecutables) {
{
cmCPackLogger(cmCPackLog::LOG_DEBUG, "The cpackPackageExecutables: " cmCPackLogger(cmCPackLog::LOG_DEBUG, "The cpackPackageExecutables: "
<< cpackPackageExecutables << "." << std::endl); << cpackPackageExecutables << "." << std::endl);
std::ostringstream str; std::ostringstream str;
@ -47,20 +46,19 @@ int cmCPackOSXX11Generator::PackageFiles()
std::vector<std::string> cpackPackageExecutablesVector; std::vector<std::string> cpackPackageExecutablesVector;
cmSystemTools::ExpandListArgument(cpackPackageExecutables, cmSystemTools::ExpandListArgument(cpackPackageExecutables,
cpackPackageExecutablesVector); cpackPackageExecutablesVector);
if ( cpackPackageExecutablesVector.size() % 2 != 0 ) if (cpackPackageExecutablesVector.size() % 2 != 0) {
{ cmCPackLogger(
cmCPackLogger(cmCPackLog::LOG_ERROR, cmCPackLog::LOG_ERROR,
"CPACK_PACKAGE_EXECUTABLES should contain pairs of <executable> and " "CPACK_PACKAGE_EXECUTABLES should contain pairs of <executable> and "
"<icon name>." << std::endl); "<icon name>."
<< std::endl);
return 0; return 0;
} }
std::vector<std::string>::iterator it; std::vector<std::string>::iterator it;
for ( it = cpackPackageExecutablesVector.begin(); for (it = cpackPackageExecutablesVector.begin();
it != cpackPackageExecutablesVector.end(); it != cpackPackageExecutablesVector.end(); ++it) {
++it )
{
std::string cpackExecutableName = *it; std::string cpackExecutableName = *it;
++ it; ++it;
this->SetOptionIfNotSet("CPACK_EXECUTABLE_NAME", this->SetOptionIfNotSet("CPACK_EXECUTABLE_NAME",
cpackExecutableName.c_str()); cpackExecutableName.c_str());
} }
@ -68,9 +66,8 @@ int cmCPackOSXX11Generator::PackageFiles()
// Disk image directories // Disk image directories
std::string diskImageDirectory = toplevel; std::string diskImageDirectory = toplevel;
std::string diskImageBackgroundImageDir std::string diskImageBackgroundImageDir =
= diskImageDirectory + "/.background"; diskImageDirectory + "/.background";
// App bundle directories // App bundle directories
std::string packageDirFileName = toplevel; std::string packageDirFileName = toplevel;
@ -90,14 +87,12 @@ int cmCPackOSXX11Generator::PackageFiles()
const char* contDir = contentsDirectory.c_str(); const char* contDir = contentsDirectory.c_str();
const char* rsrcFile = resourceFileName.c_str(); const char* rsrcFile = resourceFileName.c_str();
const char* iconFile = this->GetOption("CPACK_PACKAGE_ICON"); const char* iconFile = this->GetOption("CPACK_PACKAGE_ICON");
if ( iconFile ) if (iconFile) {
{ std::string iconFileName = cmsys::SystemTools::GetFilenameName(iconFile);
std::string iconFileName = cmsys::SystemTools::GetFilenameName( if (!cmSystemTools::FileExists(iconFile)) {
iconFile);
if ( !cmSystemTools::FileExists(iconFile) )
{
cmCPackLogger(cmCPackLog::LOG_ERROR, "Cannot find icon file: " cmCPackLogger(cmCPackLog::LOG_ERROR, "Cannot find icon file: "
<< iconFile << ". Please check CPACK_PACKAGE_ICON setting." << iconFile
<< ". Please check CPACK_PACKAGE_ICON setting."
<< std::endl); << std::endl);
return 0; return 0;
} }
@ -109,25 +104,24 @@ int cmCPackOSXX11Generator::PackageFiles()
std::string applicationsLinkName = diskImageDirectory + "/Applications"; std::string applicationsLinkName = diskImageDirectory + "/Applications";
cmSystemTools::CreateSymlink("/Applications", applicationsLinkName.c_str()); cmSystemTools::CreateSymlink("/Applications", applicationsLinkName.c_str());
if ( if (!this->CopyResourcePlistFile("VolumeIcon.icns",
!this->CopyResourcePlistFile("VolumeIcon.icns",
diskImageDirectory.c_str(), diskImageDirectory.c_str(),
".VolumeIcon.icns", true ) || ".VolumeIcon.icns", true) ||
!this->CopyResourcePlistFile("DS_Store", diskImageDirectory.c_str(), !this->CopyResourcePlistFile("DS_Store", diskImageDirectory.c_str(),
".DS_Store", true ) || ".DS_Store", true) ||
!this->CopyResourcePlistFile("background.png", !this->CopyResourcePlistFile("background.png",
diskImageBackgroundImageDir.c_str(), "background.png", true ) || diskImageBackgroundImageDir.c_str(),
"background.png", true) ||
!this->CopyResourcePlistFile("RuntimeScript", dir) || !this->CopyResourcePlistFile("RuntimeScript", dir) ||
!this->CopyResourcePlistFile("OSXX11.Info.plist", contDir, !this->CopyResourcePlistFile("OSXX11.Info.plist", contDir,
"Info.plist" ) || "Info.plist") ||
!this->CopyResourcePlistFile("OSXX11.main.scpt", scrDir, !this->CopyResourcePlistFile("OSXX11.main.scpt", scrDir, "main.scpt",
"main.scpt", true ) || true) ||
!this->CopyResourcePlistFile("OSXScriptLauncher.rsrc", dir, !this->CopyResourcePlistFile("OSXScriptLauncher.rsrc", dir, rsrcFile,
rsrcFile, true) || true) ||
!this->CopyResourcePlistFile("OSXScriptLauncher", appdir, !this->CopyResourcePlistFile("OSXScriptLauncher", appdir,
this->GetOption("CPACK_PACKAGE_FILE_NAME"), true) this->GetOption("CPACK_PACKAGE_FILE_NAME"),
) true)) {
{
cmCPackLogger(cmCPackLog::LOG_ERROR, "Problem copying the resource files" cmCPackLogger(cmCPackLog::LOG_ERROR, "Problem copying the resource files"
<< std::endl); << std::endl);
return 0; return 0;
@ -143,20 +137,20 @@ int cmCPackOSXX11Generator::PackageFiles()
appScriptName += this->GetOption("CPACK_PACKAGE_FILE_NAME"); appScriptName += this->GetOption("CPACK_PACKAGE_FILE_NAME");
mode_t mode; mode_t mode;
if (cmsys::SystemTools::GetPermissions(runTimeScript.c_str(), mode)) if (cmsys::SystemTools::GetPermissions(runTimeScript.c_str(), mode)) {
{
mode |= (S_IXUSR | S_IXGRP | S_IXOTH); mode |= (S_IXUSR | S_IXGRP | S_IXOTH);
cmsys::SystemTools::SetPermissions(runTimeScript.c_str(), mode); cmsys::SystemTools::SetPermissions(runTimeScript.c_str(), mode);
cmCPackLogger(cmCPackLog::LOG_OUTPUT, "Setting: " << runTimeScript cmCPackLogger(cmCPackLog::LOG_OUTPUT,
<< " to permission: " << mode << std::endl); "Setting: " << runTimeScript << " to permission: " << mode
<< std::endl);
} }
if (cmsys::SystemTools::GetPermissions(appScriptName.c_str(), mode)) if (cmsys::SystemTools::GetPermissions(appScriptName.c_str(), mode)) {
{
mode |= (S_IXUSR | S_IXGRP | S_IXOTH); mode |= (S_IXUSR | S_IXGRP | S_IXOTH);
cmsys::SystemTools::SetPermissions(appScriptName.c_str(), mode); cmsys::SystemTools::SetPermissions(appScriptName.c_str(), mode);
cmCPackLogger(cmCPackLog::LOG_OUTPUT, "Setting: " << appScriptName cmCPackLogger(cmCPackLog::LOG_OUTPUT,
<< " to permission: " << mode << std::endl); "Setting: " << appScriptName << " to permission: " << mode
<< std::endl);
} }
std::string output; std::string output;
@ -165,38 +159,35 @@ int cmCPackOSXX11Generator::PackageFiles()
std::ostringstream dmgCmd; std::ostringstream dmgCmd;
dmgCmd << "\"" << this->GetOption("CPACK_INSTALLER_PROGRAM_DISK_IMAGE") dmgCmd << "\"" << this->GetOption("CPACK_INSTALLER_PROGRAM_DISK_IMAGE")
<< "\" create -ov -format UDZO -srcfolder \"" << "\" create -ov -format UDZO -srcfolder \""
<< diskImageDirectory.c_str() << diskImageDirectory.c_str() << "\" \"" << packageFileNames[0]
<< "\" \"" << packageFileNames[0] << "\""; << "\"";
cmCPackLogger(cmCPackLog::LOG_VERBOSE, cmCPackLogger(cmCPackLog::LOG_VERBOSE, "Compress disk image using command: "
"Compress disk image using command: "
<< dmgCmd.str().c_str() << std::endl); << dmgCmd.str().c_str() << std::endl);
// since we get random dashboard failures with this one // since we get random dashboard failures with this one
// try running it more than once // try running it more than once
int retVal = 1; int retVal = 1;
int numTries = 10; int numTries = 10;
bool res = false; bool res = false;
while(numTries > 0) while (numTries > 0) {
{ res =
res = cmSystemTools::RunSingleCommand( cmSystemTools::RunSingleCommand(dmgCmd.str().c_str(), &output, &output,
dmgCmd.str().c_str(), &output, &output,
&retVal, 0, this->GeneratorVerbose, 0); &retVal, 0, this->GeneratorVerbose, 0);
if ( res && !retVal ) if (res && !retVal) {
{
numTries = -1; numTries = -1;
break; break;
} }
cmSystemTools::Delay(500); cmSystemTools::Delay(500);
numTries--; numTries--;
} }
if ( !res || retVal ) if (!res || retVal) {
{
cmGeneratedFileStream ofs(tmpFile.c_str()); cmGeneratedFileStream ofs(tmpFile.c_str());
ofs << "# Run command: " << dmgCmd.str().c_str() << std::endl ofs << "# Run command: " << dmgCmd.str().c_str() << std::endl
<< "# Output:" << std::endl << "# Output:" << std::endl
<< output.c_str() << std::endl; << output.c_str() << std::endl;
cmCPackLogger(cmCPackLog::LOG_ERROR, "Problem running hdiutil command: " cmCPackLogger(cmCPackLog::LOG_ERROR, "Problem running hdiutil command: "
<< dmgCmd.str().c_str() << std::endl << dmgCmd.str().c_str() << std::endl
<< "Please check " << tmpFile.c_str() << " for errors" << std::endl); << "Please check " << tmpFile.c_str() << " for errors"
<< std::endl);
return 0; return 0;
} }
@ -205,12 +196,11 @@ int cmCPackOSXX11Generator::PackageFiles()
int cmCPackOSXX11Generator::InitializeInternal() int cmCPackOSXX11Generator::InitializeInternal()
{ {
cmCPackLogger(cmCPackLog::LOG_DEBUG, cmCPackLogger(cmCPackLog::LOG_DEBUG, "cmCPackOSXX11Generator::Initialize()"
"cmCPackOSXX11Generator::Initialize()" << std::endl); << std::endl);
std::vector<std::string> path; std::vector<std::string> path;
std::string pkgPath = cmSystemTools::FindProgram("hdiutil", path, false); std::string pkgPath = cmSystemTools::FindProgram("hdiutil", path, false);
if ( pkgPath.empty() ) if (pkgPath.empty()) {
{
cmCPackLogger(cmCPackLog::LOG_ERROR, "Cannot find hdiutil compiler" cmCPackLogger(cmCPackLog::LOG_ERROR, "Cannot find hdiutil compiler"
<< std::endl); << std::endl);
return 0; return 0;
@ -265,23 +255,21 @@ bool cmCPackOSXX11Generator::CopyCreateResourceFile(const std::string& name)
} }
*/ */
bool cmCPackOSXX11Generator::CopyResourcePlistFile(const std::string& name, bool cmCPackOSXX11Generator::CopyResourcePlistFile(
const std::string& dir, const char* outputFileName /* = 0 */, const std::string& name, const std::string& dir,
bool copyOnly /* = false */) const char* outputFileName /* = 0 */, bool copyOnly /* = false */)
{ {
std::string inFName = "CPack."; std::string inFName = "CPack.";
inFName += name; inFName += name;
inFName += ".in"; inFName += ".in";
std::string inFileName = this->FindTemplate(inFName.c_str()); std::string inFileName = this->FindTemplate(inFName.c_str());
if ( inFileName.empty() ) if (inFileName.empty()) {
{ cmCPackLogger(cmCPackLog::LOG_ERROR,
cmCPackLogger(cmCPackLog::LOG_ERROR, "Cannot find input file: " "Cannot find input file: " << inFName << std::endl);
<< inFName << std::endl);
return false; return false;
} }
if ( !outputFileName ) if (!outputFileName) {
{
outputFileName = name.c_str(); outputFileName = name.c_str();
} }
@ -289,8 +277,9 @@ bool cmCPackOSXX11Generator::CopyResourcePlistFile(const std::string& name,
destFileName += "/"; destFileName += "/";
destFileName += outputFileName; destFileName += outputFileName;
cmCPackLogger(cmCPackLog::LOG_VERBOSE, "Configure file: " cmCPackLogger(cmCPackLog::LOG_VERBOSE,
<< inFileName.c_str() << " to " << destFileName.c_str() << std::endl); "Configure file: " << inFileName.c_str() << " to "
<< destFileName.c_str() << std::endl);
this->ConfigureFile(inFileName.c_str(), destFileName.c_str(), copyOnly); this->ConfigureFile(inFileName.c_str(), destFileName.c_str(), copyOnly);
return true; return true;
} }

View File

@ -37,10 +37,11 @@ protected:
virtual const char* GetPackagingInstallPrefix(); virtual const char* GetPackagingInstallPrefix();
virtual const char* GetOutputExtension() { return ".dmg"; } virtual const char* GetOutputExtension() { return ".dmg"; }
//bool CopyCreateResourceFile(const std::string& name, // bool CopyCreateResourceFile(const std::string& name,
// const std::string& dir); // const std::string& dir);
bool CopyResourcePlistFile(const std::string& name, const std::string& dir, bool CopyResourcePlistFile(const std::string& name, const std::string& dir,
const char* outputFileName = 0, bool copyOnly = false); const char* outputFileName = 0,
bool copyOnly = false);
std::string InstallPrefix; std::string InstallPrefix;
}; };

File diff suppressed because it is too large Load Diff

View File

@ -37,8 +37,7 @@ public:
virtual bool SupportsComponentInstallation() const; virtual bool SupportsComponentInstallation() const;
protected: protected:
int CopyInstallScript(const std::string& resdir, int CopyInstallScript(const std::string& resdir, const std::string& script,
const std::string& script,
const std::string& name); const std::string& name);
virtual int InitializeInternal(); virtual int InitializeInternal();
int PackageFiles(); int PackageFiles();
@ -57,7 +56,7 @@ protected:
// Run PackageMaker with the given command line, which will (if // Run PackageMaker with the given command line, which will (if
// successful) produce the given package file. Returns true if // successful) produce the given package file. Returns true if
// PackageMaker succeeds, false otherwise. // PackageMaker succeeds, false otherwise.
bool RunPackageMaker(const char *command, const char *packageFile); bool RunPackageMaker(const char* command, const char* packageFile);
// Retrieve the name of package file that will be generated for this // Retrieve the name of package file that will be generated for this
// component. The name is just the file name with extension, and // component. The name is just the file name with extension, and
@ -68,8 +67,8 @@ protected:
// component. All of the files within this component are stored in // component. All of the files within this component are stored in
// the directory packageDir. Returns true if successful, false // the directory packageDir. Returns true if successful, false
// otherwise. // otherwise.
bool GenerateComponentPackage(const char *packageFile, bool GenerateComponentPackage(const char* packageFile,
const char *packageDir, const char* packageDir,
const cmCPackComponent& component); const cmCPackComponent& component);
// Writes a distribution.dist file, which turns a metapackage into a // Writes a distribution.dist file, which turns a metapackage into a
@ -82,15 +81,14 @@ protected:
// Subroutine of WriteDistributionFile that writes out the // Subroutine of WriteDistributionFile that writes out the
// dependency attributes for inter-component dependencies. // dependency attributes for inter-component dependencies.
void AddDependencyAttributes(const cmCPackComponent& component, void AddDependencyAttributes(const cmCPackComponent& component,
std::set<const cmCPackComponent *>& visited, std::set<const cmCPackComponent*>& visited,
std::ostringstream& out); std::ostringstream& out);
// Subroutine of WriteDistributionFile that writes out the // Subroutine of WriteDistributionFile that writes out the
// reverse dependency attributes for inter-component dependencies. // reverse dependency attributes for inter-component dependencies.
void void AddReverseDependencyAttributes(
AddReverseDependencyAttributes(const cmCPackComponent& component, const cmCPackComponent& component,
std::set<const cmCPackComponent *>& visited, std::set<const cmCPackComponent*>& visited, std::ostringstream& out);
std::ostringstream& out);
// Generates XML that encodes the hierarchy of component groups and // Generates XML that encodes the hierarchy of component groups and
// their components in a form that can be used by distribution // their components in a form that can be used by distribution

View File

@ -25,8 +25,7 @@ cmCPackRPMGenerator::~cmCPackRPMGenerator()
int cmCPackRPMGenerator::InitializeInternal() int cmCPackRPMGenerator::InitializeInternal()
{ {
this->SetOptionIfNotSet("CPACK_PACKAGING_INSTALL_PREFIX", "/usr"); this->SetOptionIfNotSet("CPACK_PACKAGING_INSTALL_PREFIX", "/usr");
if (cmSystemTools::IsOff(this->GetOption("CPACK_SET_DESTDIR"))) if (cmSystemTools::IsOff(this->GetOption("CPACK_SET_DESTDIR"))) {
{
this->SetOption("CPACK_SET_DESTDIR", "I_ON"); this->SetOption("CPACK_SET_DESTDIR", "I_ON");
} }
/* Replace space in CPACK_PACKAGE_NAME in order to avoid /* Replace space in CPACK_PACKAGE_NAME in order to avoid
@ -34,15 +33,15 @@ int cmCPackRPMGenerator::InitializeInternal()
* Moreover RPM file do not usually embed space in filename * Moreover RPM file do not usually embed space in filename
*/ */
if (this->GetOption("CPACK_PACKAGE_NAME")) { if (this->GetOption("CPACK_PACKAGE_NAME")) {
std::string packageName=this->GetOption("CPACK_PACKAGE_NAME"); std::string packageName = this->GetOption("CPACK_PACKAGE_NAME");
cmSystemTools::ReplaceString(packageName," ","-"); cmSystemTools::ReplaceString(packageName, " ", "-");
this->SetOption("CPACK_PACKAGE_NAME",packageName.c_str()); this->SetOption("CPACK_PACKAGE_NAME", packageName.c_str());
} }
/* same for CPACK_PACKAGE_FILE_NAME */ /* same for CPACK_PACKAGE_FILE_NAME */
if (this->GetOption("CPACK_PACKAGE_FILE_NAME")) { if (this->GetOption("CPACK_PACKAGE_FILE_NAME")) {
std::string packageName=this->GetOption("CPACK_PACKAGE_FILE_NAME"); std::string packageName = this->GetOption("CPACK_PACKAGE_FILE_NAME");
cmSystemTools::ReplaceString(packageName," ","-"); cmSystemTools::ReplaceString(packageName, " ", "-");
this->SetOption("CPACK_PACKAGE_FILE_NAME",packageName.c_str()); this->SetOption("CPACK_PACKAGE_FILE_NAME", packageName.c_str());
} }
return this->Superclass::InitializeInternal(); return this->Superclass::InitializeInternal();
} }
@ -53,14 +52,13 @@ void cmCPackRPMGenerator::AddGeneratedPackageNames()
std::string fileNames(this->GetOption("GEN_CPACK_OUTPUT_FILES")); std::string fileNames(this->GetOption("GEN_CPACK_OUTPUT_FILES"));
const char sep = ';'; const char sep = ';';
std::string::size_type pos1 = 0; std::string::size_type pos1 = 0;
std::string::size_type pos2 = fileNames.find(sep, pos1+1); std::string::size_type pos2 = fileNames.find(sep, pos1 + 1);
while(pos2 != std::string::npos) while (pos2 != std::string::npos) {
{ packageFileNames.push_back(fileNames.substr(pos1, pos2 - pos1));
packageFileNames.push_back(fileNames.substr(pos1, pos2-pos1)); pos1 = pos2 + 1;
pos1 = pos2+1; pos2 = fileNames.find(sep, pos1 + 1);
pos2 = fileNames.find(sep, pos1+1);
} }
packageFileNames.push_back(fileNames.substr(pos1, pos2-pos1)); packageFileNames.push_back(fileNames.substr(pos1, pos2 - pos1));
} }
int cmCPackRPMGenerator::PackageOnePack(std::string initialToplevel, int cmCPackRPMGenerator::PackageOnePack(std::string initialToplevel,
@ -69,36 +67,31 @@ int cmCPackRPMGenerator::PackageOnePack(std::string initialToplevel,
int retval = 1; int retval = 1;
// Begin the archive for this pack // Begin the archive for this pack
std::string localToplevel(initialToplevel); std::string localToplevel(initialToplevel);
std::string packageFileName( std::string packageFileName(cmSystemTools::GetParentDirectory(toplevel));
cmSystemTools::GetParentDirectory(toplevel)
);
std::string outputFileName( std::string outputFileName(
GetComponentPackageFileName(this->GetOption("CPACK_PACKAGE_FILE_NAME"), GetComponentPackageFileName(this->GetOption("CPACK_PACKAGE_FILE_NAME"),
packageName, packageName, true) +
true) this->GetOutputExtension());
+ this->GetOutputExtension()
);
localToplevel += "/"+ packageName; localToplevel += "/" + packageName;
/* replace the TEMP DIRECTORY with the component one */ /* replace the TEMP DIRECTORY with the component one */
this->SetOption("CPACK_TEMPORARY_DIRECTORY",localToplevel.c_str()); this->SetOption("CPACK_TEMPORARY_DIRECTORY", localToplevel.c_str());
packageFileName += "/"+ outputFileName; packageFileName += "/" + outputFileName;
/* replace proposed CPACK_OUTPUT_FILE_NAME */ /* replace proposed CPACK_OUTPUT_FILE_NAME */
this->SetOption("CPACK_OUTPUT_FILE_NAME",outputFileName.c_str()); this->SetOption("CPACK_OUTPUT_FILE_NAME", outputFileName.c_str());
/* replace the TEMPORARY package file name */ /* replace the TEMPORARY package file name */
this->SetOption("CPACK_TEMPORARY_PACKAGE_FILE_NAME", this->SetOption("CPACK_TEMPORARY_PACKAGE_FILE_NAME",
packageFileName.c_str()); packageFileName.c_str());
// Tell CPackRPM.cmake the name of the component NAME. // Tell CPackRPM.cmake the name of the component NAME.
this->SetOption("CPACK_RPM_PACKAGE_COMPONENT",packageName.c_str()); this->SetOption("CPACK_RPM_PACKAGE_COMPONENT", packageName.c_str());
// Tell CPackRPM.cmake the path where the component is. // Tell CPackRPM.cmake the path where the component is.
std::string component_path = "/"; std::string component_path = "/";
component_path += packageName; component_path += packageName;
this->SetOption("CPACK_RPM_PACKAGE_COMPONENT_PART_PATH", this->SetOption("CPACK_RPM_PACKAGE_COMPONENT_PART_PATH",
component_path.c_str()); component_path.c_str());
if (!this->ReadListFile("CPackRPM.cmake")) if (!this->ReadListFile("CPackRPM.cmake")) {
{ cmCPackLogger(cmCPackLog::LOG_ERROR, "Error while execution CPackRPM.cmake"
cmCPackLogger(cmCPackLog::LOG_ERROR, << std::endl);
"Error while execution CPackRPM.cmake" << std::endl);
retval = 0; retval = 0;
} }
@ -115,48 +108,40 @@ int cmCPackRPMGenerator::PackageComponents(bool ignoreGroup)
// The default behavior is to have one package by component group // The default behavior is to have one package by component group
// unless CPACK_COMPONENTS_IGNORE_GROUP is specified. // unless CPACK_COMPONENTS_IGNORE_GROUP is specified.
if (!ignoreGroup) if (!ignoreGroup) {
{
std::map<std::string, cmCPackComponentGroup>::iterator compGIt; std::map<std::string, cmCPackComponentGroup>::iterator compGIt;
for (compGIt=this->ComponentGroups.begin(); for (compGIt = this->ComponentGroups.begin();
compGIt!=this->ComponentGroups.end(); ++compGIt) compGIt != this->ComponentGroups.end(); ++compGIt) {
{
cmCPackLogger(cmCPackLog::LOG_VERBOSE, "Packaging component group: " cmCPackLogger(cmCPackLog::LOG_VERBOSE, "Packaging component group: "
<< compGIt->first << compGIt->first << std::endl);
<< std::endl); retval &= PackageOnePack(initialTopLevel, compGIt->first);
retval &= PackageOnePack(initialTopLevel,compGIt->first);
} }
// Handle Orphan components (components not belonging to any groups) // Handle Orphan components (components not belonging to any groups)
std::map<std::string, cmCPackComponent>::iterator compIt; std::map<std::string, cmCPackComponent>::iterator compIt;
for (compIt=this->Components.begin(); for (compIt = this->Components.begin(); compIt != this->Components.end();
compIt!=this->Components.end(); ++compIt ) ++compIt) {
{
// Does the component belong to a group? // Does the component belong to a group?
if (compIt->second.Group==NULL) if (compIt->second.Group == NULL) {
{ cmCPackLogger(
cmCPackLogger(cmCPackLog::LOG_VERBOSE, cmCPackLog::LOG_VERBOSE, "Component <"
"Component <"
<< compIt->second.Name << compIt->second.Name
<< "> does not belong to any group, package it separately." << "> does not belong to any group, package it separately."
<< std::endl); << std::endl);
retval &= PackageOnePack(initialTopLevel,compIt->first); retval &= PackageOnePack(initialTopLevel, compIt->first);
} }
} }
} }
// CPACK_COMPONENTS_IGNORE_GROUPS is set // CPACK_COMPONENTS_IGNORE_GROUPS is set
// We build 1 package per component // We build 1 package per component
else else {
{
std::map<std::string, cmCPackComponent>::iterator compIt; std::map<std::string, cmCPackComponent>::iterator compIt;
for (compIt=this->Components.begin(); for (compIt = this->Components.begin(); compIt != this->Components.end();
compIt!=this->Components.end(); ++compIt ) ++compIt) {
{ retval &= PackageOnePack(initialTopLevel, compIt->first);
retval &= PackageOnePack(initialTopLevel,compIt->first);
} }
} }
if(retval) if (retval) {
{
AddGeneratedPackageNames(); AddGeneratedPackageNames();
} }
@ -179,27 +164,23 @@ int cmCPackRPMGenerator::PackageComponentsAllInOne(
// The ALL GROUPS in ONE package case // The ALL GROUPS in ONE package case
std::string localToplevel(initialTopLevel); std::string localToplevel(initialTopLevel);
std::string packageFileName( std::string packageFileName(cmSystemTools::GetParentDirectory(toplevel));
cmSystemTools::GetParentDirectory(toplevel)
);
std::string outputFileName( std::string outputFileName(
std::string(this->GetOption("CPACK_PACKAGE_FILE_NAME")) std::string(this->GetOption("CPACK_PACKAGE_FILE_NAME")) +
+ this->GetOutputExtension() this->GetOutputExtension());
);
// all GROUP in one vs all COMPONENT in one // all GROUP in one vs all COMPONENT in one
localToplevel += "/"+compInstDirName; localToplevel += "/" + compInstDirName;
/* replace the TEMP DIRECTORY with the component one */ /* replace the TEMP DIRECTORY with the component one */
this->SetOption("CPACK_TEMPORARY_DIRECTORY",localToplevel.c_str()); this->SetOption("CPACK_TEMPORARY_DIRECTORY", localToplevel.c_str());
packageFileName += "/"+ outputFileName; packageFileName += "/" + outputFileName;
/* replace proposed CPACK_OUTPUT_FILE_NAME */ /* replace proposed CPACK_OUTPUT_FILE_NAME */
this->SetOption("CPACK_OUTPUT_FILE_NAME",outputFileName.c_str()); this->SetOption("CPACK_OUTPUT_FILE_NAME", outputFileName.c_str());
/* replace the TEMPORARY package file name */ /* replace the TEMPORARY package file name */
this->SetOption("CPACK_TEMPORARY_PACKAGE_FILE_NAME", this->SetOption("CPACK_TEMPORARY_PACKAGE_FILE_NAME",
packageFileName.c_str()); packageFileName.c_str());
if(!compInstDirName.empty()) if (!compInstDirName.empty()) {
{
// Tell CPackRPM.cmake the path where the component is. // Tell CPackRPM.cmake the path where the component is.
std::string component_path = "/"; std::string component_path = "/";
component_path += compInstDirName; component_path += compInstDirName;
@ -207,14 +188,11 @@ int cmCPackRPMGenerator::PackageComponentsAllInOne(
component_path.c_str()); component_path.c_str());
} }
if (this->ReadListFile("CPackRPM.cmake")) if (this->ReadListFile("CPackRPM.cmake")) {
{
AddGeneratedPackageNames(); AddGeneratedPackageNames();
} } else {
else cmCPackLogger(cmCPackLog::LOG_ERROR, "Error while execution CPackRPM.cmake"
{ << std::endl);
cmCPackLogger(cmCPackLog::LOG_ERROR,
"Error while execution CPackRPM.cmake" << std::endl);
retval = 0; retval = 0;
} }
@ -223,50 +201,43 @@ int cmCPackRPMGenerator::PackageComponentsAllInOne(
int cmCPackRPMGenerator::PackageFiles() int cmCPackRPMGenerator::PackageFiles()
{ {
cmCPackLogger(cmCPackLog::LOG_DEBUG, "Toplevel: " cmCPackLogger(cmCPackLog::LOG_DEBUG, "Toplevel: " << toplevel << std::endl);
<< toplevel << std::endl);
/* Are we in the component packaging case */ /* Are we in the component packaging case */
if (WantsComponentInstallation()) { if (WantsComponentInstallation()) {
// CASE 1 : COMPONENT ALL-IN-ONE package // CASE 1 : COMPONENT ALL-IN-ONE package
// If ALL COMPONENTS in ONE package has been requested // If ALL COMPONENTS in ONE package has been requested
// then the package file is unique and should be open here. // then the package file is unique and should be open here.
if (componentPackageMethod == ONE_PACKAGE) if (componentPackageMethod == ONE_PACKAGE) {
{
return PackageComponentsAllInOne("ALL_COMPONENTS_IN_ONE"); return PackageComponentsAllInOne("ALL_COMPONENTS_IN_ONE");
} }
// CASE 2 : COMPONENT CLASSICAL package(s) (i.e. not all-in-one) // CASE 2 : COMPONENT CLASSICAL package(s) (i.e. not all-in-one)
// There will be 1 package for each component group // There will be 1 package for each component group
// however one may require to ignore component group and // however one may require to ignore component group and
// in this case you'll get 1 package for each component. // in this case you'll get 1 package for each component.
else else {
{
return PackageComponents(componentPackageMethod == return PackageComponents(componentPackageMethod ==
ONE_PACKAGE_PER_COMPONENT); ONE_PACKAGE_PER_COMPONENT);
} }
} }
// CASE 3 : NON COMPONENT package. // CASE 3 : NON COMPONENT package.
else else {
{
return PackageComponentsAllInOne(""); return PackageComponentsAllInOne("");
} }
} }
bool cmCPackRPMGenerator::SupportsComponentInstallation() const bool cmCPackRPMGenerator::SupportsComponentInstallation() const
{ {
if (IsOn("CPACK_RPM_COMPONENT_INSTALL")) if (IsOn("CPACK_RPM_COMPONENT_INSTALL")) {
{
return true; return true;
} } else {
else
{
return false; return false;
} }
} }
std::string cmCPackRPMGenerator::GetComponentInstallDirNameSuffix( std::string cmCPackRPMGenerator::GetComponentInstallDirNameSuffix(
const std::string& componentName) const std::string& componentName)
{ {
if (componentPackageMethod == ONE_PACKAGE_PER_COMPONENT) { if (componentPackageMethod == ONE_PACKAGE_PER_COMPONENT) {
return componentName; return componentName;
} }
@ -276,14 +247,11 @@ std::string cmCPackRPMGenerator::GetComponentInstallDirNameSuffix(
} }
// We have to find the name of the COMPONENT GROUP // We have to find the name of the COMPONENT GROUP
// the current COMPONENT belongs to. // the current COMPONENT belongs to.
std::string groupVar = "CPACK_COMPONENT_" + std::string groupVar =
cmSystemTools::UpperCase(componentName) + "_GROUP"; "CPACK_COMPONENT_" + cmSystemTools::UpperCase(componentName) + "_GROUP";
if (NULL != GetOption(groupVar)) if (NULL != GetOption(groupVar)) {
{
return std::string(GetOption(groupVar)); return std::string(GetOption(groupVar));
} } else {
else
{
return componentName; return componentName;
} }
} }

View File

@ -37,10 +37,9 @@ 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"); std::string inFile = this->FindTemplate("CPack.STGZ_Header.sh.in");
if ( inFile.empty() ) if (inFile.empty()) {
{ cmCPackLogger(cmCPackLog::LOG_ERROR,
cmCPackLogger(cmCPackLog::LOG_ERROR, "Cannot find template file: " "Cannot find template file: " << inFile << std::endl);
<< inFile << std::endl);
return 0; return 0;
} }
this->SetOptionIfNotSet("CPACK_STGZ_HEADER_FILE", inFile.c_str()); this->SetOptionIfNotSet("CPACK_STGZ_HEADER_FILE", inFile.c_str());
@ -52,8 +51,7 @@ int cmCPackSTGZGenerator::InitializeInternal()
int cmCPackSTGZGenerator::PackageFiles() int cmCPackSTGZGenerator::PackageFiles()
{ {
bool retval = true; bool retval = true;
if ( !this->Superclass::PackageFiles() ) if (!this->Superclass::PackageFiles()) {
{
return 0; return 0;
} }
@ -61,11 +59,10 @@ int cmCPackSTGZGenerator::PackageFiles()
* have generated several packages (component packaging) * have generated several packages (component packaging)
* so we must iterate over generated packages. * so we must iterate over generated packages.
*/ */
for (std::vector<std::string>::iterator it=packageFileNames.begin(); for (std::vector<std::string>::iterator it = packageFileNames.begin();
it != packageFileNames.end(); ++it) it != packageFileNames.end(); ++it) {
{
retval &= cmSystemTools::SetPermissions((*it).c_str(), retval &= cmSystemTools::SetPermissions((*it).c_str(),
#if defined( _MSC_VER ) || defined( __MINGW32__ ) #if defined(_MSC_VER) || defined(__MINGW32__)
S_IREAD | S_IWRITE | S_IEXEC S_IREAD | S_IWRITE | S_IEXEC
#else #else
S_IRUSR | S_IWUSR | S_IXUSR | S_IRUSR | S_IWUSR | S_IXUSR |
@ -87,8 +84,7 @@ int cmCPackSTGZGenerator::GenerateHeader(std::ostream* os)
std::string line; std::string line;
cmsys::ifstream ilfs(inLicFile.c_str()); cmsys::ifstream ilfs(inLicFile.c_str());
std::string licenseText; std::string licenseText;
while ( cmSystemTools::GetLineFromStream(ilfs, line) ) while (cmSystemTools::GetLineFromStream(ilfs, line)) {
{
licenseText += line + "\n"; licenseText += line + "\n";
} }
this->SetOptionIfNotSet("CPACK_RESOURCE_FILE_LICENSE_CONTENT", this->SetOptionIfNotSet("CPACK_RESOURCE_FILE_LICENSE_CONTENT",
@ -100,8 +96,7 @@ int cmCPackSTGZGenerator::GenerateHeader(std::ostream* os)
std::string inFile = this->GetOption("CPACK_STGZ_HEADER_FILE"); std::string inFile = this->GetOption("CPACK_STGZ_HEADER_FILE");
cmsys::ifstream ifs(inFile.c_str()); cmsys::ifstream ifs(inFile.c_str());
std::string packageHeaderText; std::string packageHeaderText;
while ( cmSystemTools::GetLineFromStream(ifs, line) ) while (cmSystemTools::GetLineFromStream(ifs, line)) {
{
packageHeaderText += line + "\n"; packageHeaderText += line + "\n";
} }
@ -111,17 +106,15 @@ int cmCPackSTGZGenerator::GenerateHeader(std::ostream* os)
// Count the lines // Count the lines
const char* ptr = res.c_str(); const char* ptr = res.c_str();
while ( *ptr ) while (*ptr) {
{ if (*ptr == '\n') {
if ( *ptr == '\n' ) counter++;
{
counter ++;
} }
++ptr; ++ptr;
} }
counter ++; counter++;
cmCPackLogger(cmCPackLog::LOG_DEBUG, cmCPackLogger(cmCPackLog::LOG_DEBUG, "Number of lines: " << counter
"Number of lines: " << counter << std::endl); << std::endl);
char buffer[1024]; char buffer[1024];
sprintf(buffer, "%d", counter); sprintf(buffer, "%d", counter);
cmSystemTools::ReplaceString(res, headerLengthTag, buffer); cmSystemTools::ReplaceString(res, headerLengthTag, buffer);

View File

@ -13,12 +13,10 @@
#include "cmCPackTGZGenerator.h" #include "cmCPackTGZGenerator.h"
cmCPackTGZGenerator::cmCPackTGZGenerator() cmCPackTGZGenerator::cmCPackTGZGenerator()
:cmCPackArchiveGenerator(cmArchiveWrite::CompressGZip, : cmCPackArchiveGenerator(cmArchiveWrite::CompressGZip, "paxr")
"paxr")
{ {
} }
cmCPackTGZGenerator::~cmCPackTGZGenerator() cmCPackTGZGenerator::~cmCPackTGZGenerator()
{ {
} }

View File

@ -28,6 +28,7 @@ public:
*/ */
cmCPackTGZGenerator(); cmCPackTGZGenerator();
virtual ~cmCPackTGZGenerator(); virtual ~cmCPackTGZGenerator();
protected: protected:
virtual const char* GetOutputExtension() { return ".tar.gz"; } virtual const char* GetOutputExtension() { return ".tar.gz"; }
}; };

View File

@ -13,8 +13,7 @@
#include "cmCPackTXZGenerator.h" #include "cmCPackTXZGenerator.h"
cmCPackTXZGenerator::cmCPackTXZGenerator() cmCPackTXZGenerator::cmCPackTXZGenerator()
:cmCPackArchiveGenerator(cmArchiveWrite::CompressXZ, : cmCPackArchiveGenerator(cmArchiveWrite::CompressXZ, "paxr")
"paxr")
{ {
} }

View File

@ -28,6 +28,7 @@ public:
*/ */
cmCPackTXZGenerator(); cmCPackTXZGenerator();
virtual ~cmCPackTXZGenerator(); virtual ~cmCPackTXZGenerator();
protected: protected:
virtual const char* GetOutputExtension() { return ".tar.xz"; } virtual const char* GetOutputExtension() { return ".tar.xz"; }
}; };

View File

@ -13,12 +13,10 @@
#include "cmCPackTarBZip2Generator.h" #include "cmCPackTarBZip2Generator.h"
cmCPackTarBZip2Generator::cmCPackTarBZip2Generator() cmCPackTarBZip2Generator::cmCPackTarBZip2Generator()
:cmCPackArchiveGenerator(cmArchiveWrite::CompressBZip2, : cmCPackArchiveGenerator(cmArchiveWrite::CompressBZip2, "paxr")
"paxr")
{ {
} }
cmCPackTarBZip2Generator::~cmCPackTarBZip2Generator() cmCPackTarBZip2Generator::~cmCPackTarBZip2Generator()
{ {
} }

View File

@ -27,6 +27,7 @@ public:
*/ */
cmCPackTarBZip2Generator(); cmCPackTarBZip2Generator();
virtual ~cmCPackTarBZip2Generator(); virtual ~cmCPackTarBZip2Generator();
protected: protected:
virtual const char* GetOutputExtension() { return ".tar.bz2"; } virtual const char* GetOutputExtension() { return ".tar.bz2"; }
}; };

View File

@ -13,12 +13,10 @@
#include "cmCPackTarCompressGenerator.h" #include "cmCPackTarCompressGenerator.h"
cmCPackTarCompressGenerator::cmCPackTarCompressGenerator() cmCPackTarCompressGenerator::cmCPackTarCompressGenerator()
:cmCPackArchiveGenerator(cmArchiveWrite::CompressCompress, : cmCPackArchiveGenerator(cmArchiveWrite::CompressCompress, "paxr")
"paxr")
{ {
} }
cmCPackTarCompressGenerator::~cmCPackTarCompressGenerator() cmCPackTarCompressGenerator::~cmCPackTarCompressGenerator()
{ {
} }

View File

@ -13,12 +13,10 @@
#include "cmCPackZIPGenerator.h" #include "cmCPackZIPGenerator.h"
cmCPackZIPGenerator::cmCPackZIPGenerator() cmCPackZIPGenerator::cmCPackZIPGenerator()
:cmCPackArchiveGenerator(cmArchiveWrite::CompressNone, : cmCPackArchiveGenerator(cmArchiveWrite::CompressNone, "zip")
"zip")
{ {
} }
cmCPackZIPGenerator::~cmCPackZIPGenerator() cmCPackZIPGenerator::~cmCPackZIPGenerator()
{ {
} }

View File

@ -26,33 +26,28 @@
#include <cmsys/Encoding.hxx> #include <cmsys/Encoding.hxx>
#include <cmsys/SystemTools.hxx> #include <cmsys/SystemTools.hxx>
static const char * cmDocumentationName[][2] = static const char* cmDocumentationName[][2] = {
{ { 0, " cpack - Packaging driver provided by CMake." },
{0, { 0, 0 }
" cpack - Packaging driver provided by CMake."},
{0,0}
}; };
static const char * cmDocumentationUsage[][2] = static const char* cmDocumentationUsage[][2] = {
{ { 0, " cpack -G <generator> [options]" },
{0, { 0, 0 }
" cpack -G <generator> [options]"},
{0,0}
}; };
static const char * cmDocumentationOptions[][2] = static const char* cmDocumentationOptions[][2] = {
{ { "-G <generator>", "Use the specified generator to generate package." },
{"-G <generator>", "Use the specified generator to generate package."}, { "-C <Configuration>", "Specify the project configuration" },
{"-C <Configuration>", "Specify the project configuration"}, { "-D <var>=<value>", "Set a CPack variable." },
{"-D <var>=<value>", "Set a CPack variable."}, { "--config <config file>", "Specify the config file." },
{"--config <config file>", "Specify the config file."}, { "--verbose,-V", "enable verbose output" },
{"--verbose,-V","enable verbose output"}, { "--debug", "enable debug output (for CPack developers)" },
{"--debug","enable debug output (for CPack developers)"}, { "-P <package name>", "override/define CPACK_PACKAGE_NAME" },
{"-P <package name>","override/define CPACK_PACKAGE_NAME"}, { "-R <package version>", "override/define CPACK_PACKAGE_VERSION" },
{"-R <package version>","override/define CPACK_PACKAGE_VERSION"}, { "-B <package directory>", "override/define CPACK_PACKAGE_DIRECTORY" },
{"-B <package directory>","override/define CPACK_PACKAGE_DIRECTORY"}, { "--vendor <vendor name>", "override/define CPACK_PACKAGE_VENDOR" },
{"--vendor <vendor name>","override/define CPACK_PACKAGE_VENDOR"}, { 0, 0 }
{0,0}
}; };
int cpackUnknownArgument(const char*, void*) int cpackUnknownArgument(const char*, void*)
@ -64,7 +59,7 @@ struct cpackDefinitions
{ {
typedef std::map<std::string, std::string> MapType; typedef std::map<std::string, std::string> MapType;
MapType Map; MapType Map;
cmCPackLog *Log; cmCPackLog* Log;
}; };
int cpackDefinitionArgument(const char* argument, const char* cValue, int cpackDefinitionArgument(const char* argument, const char* cValue,
@ -74,8 +69,7 @@ int cpackDefinitionArgument(const char* argument, const char* cValue,
cpackDefinitions* def = static_cast<cpackDefinitions*>(call_data); cpackDefinitions* def = static_cast<cpackDefinitions*>(call_data);
std::string value = cValue; std::string value = cValue;
size_t pos = value.find_first_of("="); size_t pos = value.find_first_of("=");
if ( pos == std::string::npos ) if (pos == std::string::npos) {
{
cmCPack_Log(def->Log, cmCPackLog::LOG_ERROR, cmCPack_Log(def->Log, cmCPackLog::LOG_ERROR,
"Please specify CPack definitions as: KEY=VALUE" << std::endl); "Please specify CPack definitions as: KEY=VALUE" << std::endl);
return 0; return 0;
@ -88,9 +82,8 @@ int cpackDefinitionArgument(const char* argument, const char* cValue,
return 1; return 1;
} }
// this is CPack. // this is CPack.
int main (int argc, char const* const* argv) int main(int argc, char const* const* argv)
{ {
cmsys::Encoding::CommandLineArguments args = cmsys::Encoding::CommandLineArguments args =
cmsys::Encoding::CommandLineArguments::Main(argc, argv); cmsys::Encoding::CommandLineArguments::Main(argc, argv);
@ -107,10 +100,10 @@ int main (int argc, char const* const* argv)
cmSystemTools::EnableMSVCDebugHook(); cmSystemTools::EnableMSVCDebugHook();
if (cmSystemTools::GetCurrentWorkingDirectory().empty()) if (cmSystemTools::GetCurrentWorkingDirectory().empty()) {
{
cmCPack_Log(&log, cmCPackLog::LOG_ERROR, cmCPack_Log(&log, cmCPackLog::LOG_ERROR,
"Current working directory cannot be established." << std::endl); "Current working directory cannot be established."
<< std::endl);
return 1; return 1;
} }
@ -155,33 +148,30 @@ int main (int argc, char const* const* argv)
"CPack configuration file"); "CPack configuration file");
arg.AddArgument("-C", argT::SPACE_ARGUMENT, &cpackBuildConfig, arg.AddArgument("-C", argT::SPACE_ARGUMENT, &cpackBuildConfig,
"CPack build configuration"); "CPack build configuration");
arg.AddArgument("-G", argT::SPACE_ARGUMENT, arg.AddArgument("-G", argT::SPACE_ARGUMENT, &generator, "CPack generator");
&generator, "CPack generator"); arg.AddArgument("-P", argT::SPACE_ARGUMENT, &cpackProjectName,
arg.AddArgument("-P", argT::SPACE_ARGUMENT, "CPack project name");
&cpackProjectName, "CPack project name"); arg.AddArgument("-R", argT::SPACE_ARGUMENT, &cpackProjectVersion,
arg.AddArgument("-R", argT::SPACE_ARGUMENT, "CPack project version");
&cpackProjectVersion, "CPack project version"); arg.AddArgument("-B", argT::SPACE_ARGUMENT, &cpackProjectDirectory,
arg.AddArgument("-B", argT::SPACE_ARGUMENT, "CPack project directory");
&cpackProjectDirectory, "CPack project directory"); arg.AddArgument("--patch", argT::SPACE_ARGUMENT, &cpackProjectPatch,
arg.AddArgument("--patch", argT::SPACE_ARGUMENT, "CPack project patch");
&cpackProjectPatch, "CPack project patch"); arg.AddArgument("--vendor", argT::SPACE_ARGUMENT, &cpackProjectVendor,
arg.AddArgument("--vendor", argT::SPACE_ARGUMENT, "CPack project vendor");
&cpackProjectVendor, "CPack project vendor"); arg.AddCallback("-D", argT::SPACE_ARGUMENT, cpackDefinitionArgument,
arg.AddCallback("-D", argT::SPACE_ARGUMENT, &definitions, "CPack Definitions");
cpackDefinitionArgument, &definitions, "CPack Definitions");
arg.SetUnknownArgumentCallback(cpackUnknownArgument); arg.SetUnknownArgumentCallback(cpackUnknownArgument);
// Parse command line // Parse command line
int parsed = arg.Parse(); int parsed = arg.Parse();
// Setup logging // Setup logging
if ( verbose ) if (verbose) {
{
log.SetVerbose(verbose); log.SetVerbose(verbose);
cmCPack_Log(&log, cmCPackLog::LOG_OUTPUT, "Enable Verbose" << std::endl); cmCPack_Log(&log, cmCPackLog::LOG_OUTPUT, "Enable Verbose" << std::endl);
} }
if ( debug ) if (debug) {
{
log.SetDebug(debug); log.SetDebug(debug);
cmCPack_Log(&log, cmCPackLog::LOG_OUTPUT, "Enable Debug" << std::endl); cmCPack_Log(&log, cmCPackLog::LOG_OUTPUT, "Enable Debug" << std::endl);
} }
@ -202,8 +192,7 @@ int main (int argc, char const* const* argv)
#endif #endif
bool cpackConfigFileSpecified = true; bool cpackConfigFileSpecified = true;
if ( cpackConfigFile.empty() ) if (cpackConfigFile.empty()) {
{
cpackConfigFile = cmSystemTools::GetCurrentWorkingDirectory(); cpackConfigFile = cmSystemTools::GetCurrentWorkingDirectory();
cpackConfigFile += "/CPackConfig.cmake"; cpackConfigFile += "/CPackConfig.cmake";
cpackConfigFileSpecified = false; cpackConfigFileSpecified = false;
@ -220,26 +209,21 @@ int main (int argc, char const* const* argv)
* should launch cpack using "cpackConfigFile" if it exists * should launch cpack using "cpackConfigFile" if it exists
* in the current directory. * in the current directory.
*/ */
if((doc.CheckOptions(argc, argv,"-G")) && !(argc==1)) if ((doc.CheckOptions(argc, argv, "-G")) && !(argc == 1)) {
{
help = true; help = true;
} } else {
else
{
help = false; help = false;
} }
// This part is used for cpack documentation lookup as well. // This part is used for cpack documentation lookup as well.
cminst.AddCMakePaths(); cminst.AddCMakePaths();
if ( parsed && !help ) if (parsed && !help) {
{
// find out which system cpack is running on, so it can setup the search // find out which system cpack is running on, so it can setup the search
// paths, so FIND_XXX() commands can be used in scripts // paths, so FIND_XXX() commands can be used in scripts
std::string systemFile = std::string systemFile =
globalMF->GetModulesFile("CMakeDetermineSystem.cmake"); globalMF->GetModulesFile("CMakeDetermineSystem.cmake");
if (!globalMF->ReadListFile(systemFile.c_str())) if (!globalMF->ReadListFile(systemFile.c_str())) {
{
cmCPack_Log(&log, cmCPackLog::LOG_ERROR, cmCPack_Log(&log, cmCPackLog::LOG_ERROR,
"Error reading CMakeDetermineSystem.cmake" << std::endl); "Error reading CMakeDetermineSystem.cmake" << std::endl);
return 1; return 1;
@ -247,115 +231,91 @@ int main (int argc, char const* const* argv)
systemFile = systemFile =
globalMF->GetModulesFile("CMakeSystemSpecificInformation.cmake"); globalMF->GetModulesFile("CMakeSystemSpecificInformation.cmake");
if (!globalMF->ReadListFile(systemFile.c_str())) if (!globalMF->ReadListFile(systemFile.c_str())) {
{
cmCPack_Log(&log, cmCPackLog::LOG_ERROR, cmCPack_Log(&log, cmCPackLog::LOG_ERROR,
"Error reading CMakeSystemSpecificInformation.cmake" << std::endl); "Error reading CMakeSystemSpecificInformation.cmake"
<< std::endl);
return 1; return 1;
} }
if ( !cpackBuildConfig.empty() ) if (!cpackBuildConfig.empty()) {
{
globalMF->AddDefinition("CPACK_BUILD_CONFIG", cpackBuildConfig.c_str()); globalMF->AddDefinition("CPACK_BUILD_CONFIG", cpackBuildConfig.c_str());
} }
if ( cmSystemTools::FileExists(cpackConfigFile.c_str()) ) if (cmSystemTools::FileExists(cpackConfigFile.c_str())) {
{ cpackConfigFile = cmSystemTools::CollapseFullPath(cpackConfigFile);
cpackConfigFile =
cmSystemTools::CollapseFullPath(cpackConfigFile);
cmCPack_Log(&log, cmCPackLog::LOG_VERBOSE, cmCPack_Log(&log, cmCPackLog::LOG_VERBOSE,
"Read CPack configuration file: " << cpackConfigFile "Read CPack configuration file: " << cpackConfigFile
<< std::endl); << std::endl);
if ( !globalMF->ReadListFile(cpackConfigFile.c_str()) ) if (!globalMF->ReadListFile(cpackConfigFile.c_str())) {
{
cmCPack_Log(&log, cmCPackLog::LOG_ERROR, cmCPack_Log(&log, cmCPackLog::LOG_ERROR,
"Problem reading CPack config file: \"" "Problem reading CPack config file: \""
<< cpackConfigFile << "\"" << std::endl); << cpackConfigFile << "\"" << std::endl);
return 1; return 1;
} }
} } else if (cpackConfigFileSpecified) {
else if ( cpackConfigFileSpecified )
{
cmCPack_Log(&log, cmCPackLog::LOG_ERROR, cmCPack_Log(&log, cmCPackLog::LOG_ERROR,
"Cannot find CPack config file: \"" << "Cannot find CPack config file: \"" << cpackConfigFile
cpackConfigFile << "\"" << std::endl); << "\"" << std::endl);
return 1; return 1;
} }
if ( !generator.empty() ) if (!generator.empty()) {
{
globalMF->AddDefinition("CPACK_GENERATOR", generator.c_str()); globalMF->AddDefinition("CPACK_GENERATOR", generator.c_str());
} }
if ( !cpackProjectName.empty() ) if (!cpackProjectName.empty()) {
{
globalMF->AddDefinition("CPACK_PACKAGE_NAME", cpackProjectName.c_str()); globalMF->AddDefinition("CPACK_PACKAGE_NAME", cpackProjectName.c_str());
} }
if ( !cpackProjectVersion.empty() ) if (!cpackProjectVersion.empty()) {
{
globalMF->AddDefinition("CPACK_PACKAGE_VERSION", globalMF->AddDefinition("CPACK_PACKAGE_VERSION",
cpackProjectVersion.c_str()); cpackProjectVersion.c_str());
} }
if ( !cpackProjectVendor.empty() ) if (!cpackProjectVendor.empty()) {
{
globalMF->AddDefinition("CPACK_PACKAGE_VENDOR", globalMF->AddDefinition("CPACK_PACKAGE_VENDOR",
cpackProjectVendor.c_str()); cpackProjectVendor.c_str());
} }
// if this is not empty it has been set on the command line // if this is not empty it has been set on the command line
// go for it. Command line override values set in config file. // go for it. Command line override values set in config file.
if ( !cpackProjectDirectory.empty() ) if (!cpackProjectDirectory.empty()) {
{
globalMF->AddDefinition("CPACK_PACKAGE_DIRECTORY", globalMF->AddDefinition("CPACK_PACKAGE_DIRECTORY",
cpackProjectDirectory.c_str()); cpackProjectDirectory.c_str());
} }
// The value has not been set on the command line // The value has not been set on the command line
else else {
{
// get a default value (current working directory) // get a default value (current working directory)
cpackProjectDirectory = cmsys::SystemTools::GetCurrentWorkingDirectory(); cpackProjectDirectory = cmsys::SystemTools::GetCurrentWorkingDirectory();
// use default value iff no value has been provided by the config file // use default value iff no value has been provided by the config file
if (!globalMF->IsSet("CPACK_PACKAGE_DIRECTORY")) if (!globalMF->IsSet("CPACK_PACKAGE_DIRECTORY")) {
{
globalMF->AddDefinition("CPACK_PACKAGE_DIRECTORY", globalMF->AddDefinition("CPACK_PACKAGE_DIRECTORY",
cpackProjectDirectory.c_str()); cpackProjectDirectory.c_str());
} }
} }
cpackDefinitions::MapType::iterator cdit; cpackDefinitions::MapType::iterator cdit;
for ( cdit = definitions.Map.begin(); for (cdit = definitions.Map.begin(); cdit != definitions.Map.end();
cdit != definitions.Map.end(); ++cdit) {
++cdit )
{
globalMF->AddDefinition(cdit->first, cdit->second.c_str()); globalMF->AddDefinition(cdit->first, cdit->second.c_str());
} }
const char* cpackModulesPath = const char* cpackModulesPath =
globalMF->GetDefinition("CPACK_MODULE_PATH"); globalMF->GetDefinition("CPACK_MODULE_PATH");
if ( cpackModulesPath ) if (cpackModulesPath) {
{
globalMF->AddDefinition("CMAKE_MODULE_PATH", cpackModulesPath); globalMF->AddDefinition("CMAKE_MODULE_PATH", cpackModulesPath);
} }
const char* genList = globalMF->GetDefinition("CPACK_GENERATOR"); const char* genList = globalMF->GetDefinition("CPACK_GENERATOR");
if ( !genList ) if (!genList) {
{ cmCPack_Log(&log, cmCPackLog::LOG_ERROR, "CPack generator not specified"
cmCPack_Log(&log, cmCPackLog::LOG_ERROR, << std::endl);
"CPack generator not specified" << std::endl); } else {
}
else
{
std::vector<std::string> generatorsVector; std::vector<std::string> generatorsVector;
cmSystemTools::ExpandListArgument(genList, cmSystemTools::ExpandListArgument(genList, generatorsVector);
generatorsVector);
std::vector<std::string>::iterator it; std::vector<std::string>::iterator it;
for ( it = generatorsVector.begin(); for (it = generatorsVector.begin(); it != generatorsVector.end(); ++it) {
it != generatorsVector.end();
++it )
{
const char* gen = it->c_str(); const char* gen = it->c_str();
cmMakefile::ScopePushPop raii(globalMF.get()); cmMakefile::ScopePushPop raii(globalMF.get());
cmMakefile* mf = globalMF.get(); cmMakefile* mf = globalMF.get();
cmCPack_Log(&log, cmCPackLog::LOG_VERBOSE, cmCPack_Log(&log, cmCPackLog::LOG_VERBOSE,
"Specified generator: " << gen << std::endl); "Specified generator: " << gen << std::endl);
if ( parsed && !mf->GetDefinition("CPACK_PACKAGE_NAME") ) if (parsed && !mf->GetDefinition("CPACK_PACKAGE_NAME")) {
{
cmCPack_Log(&log, cmCPackLog::LOG_ERROR, cmCPack_Log(&log, cmCPackLog::LOG_ERROR,
"CPack project name not specified" << std::endl); "CPack project name not specified" << std::endl);
parsed = 0; parsed = 0;
@ -364,38 +324,37 @@ int main (int argc, char const* const* argv)
!(mf->GetDefinition("CPACK_PACKAGE_VERSION") || !(mf->GetDefinition("CPACK_PACKAGE_VERSION") ||
(mf->GetDefinition("CPACK_PACKAGE_VERSION_MAJOR") && (mf->GetDefinition("CPACK_PACKAGE_VERSION_MAJOR") &&
mf->GetDefinition("CPACK_PACKAGE_VERSION_MINOR") && mf->GetDefinition("CPACK_PACKAGE_VERSION_MINOR") &&
mf->GetDefinition("CPACK_PACKAGE_VERSION_PATCH")))) mf->GetDefinition("CPACK_PACKAGE_VERSION_PATCH")))) {
{
cmCPack_Log(&log, cmCPackLog::LOG_ERROR, cmCPack_Log(&log, cmCPackLog::LOG_ERROR,
"CPack project version not specified" << std::endl "CPack project version not specified"
<< std::endl
<< "Specify CPACK_PACKAGE_VERSION, or " << "Specify CPACK_PACKAGE_VERSION, or "
"CPACK_PACKAGE_VERSION_MAJOR, " "CPACK_PACKAGE_VERSION_MAJOR, "
"CPACK_PACKAGE_VERSION_MINOR, and CPACK_PACKAGE_VERSION_PATCH." "CPACK_PACKAGE_VERSION_MINOR, and "
"CPACK_PACKAGE_VERSION_PATCH."
<< std::endl); << std::endl);
parsed = 0; parsed = 0;
} }
if ( parsed ) if (parsed) {
{
cpackGenerator = generators.NewGenerator(gen); cpackGenerator = generators.NewGenerator(gen);
if ( !cpackGenerator ) if (!cpackGenerator) {
{
cmCPack_Log(&log, cmCPackLog::LOG_ERROR, cmCPack_Log(&log, cmCPackLog::LOG_ERROR,
"Cannot initialize CPack generator: " "Cannot initialize CPack generator: " << gen
<< gen << std::endl); << std::endl);
parsed = 0; parsed = 0;
} }
if ( parsed && !cpackGenerator->Initialize(gen, mf) ) if (parsed && !cpackGenerator->Initialize(gen, mf)) {
{
cmCPack_Log(&log, cmCPackLog::LOG_ERROR, cmCPack_Log(&log, cmCPackLog::LOG_ERROR,
"Cannot initialize the generator " << gen << std::endl); "Cannot initialize the generator " << gen
<< std::endl);
parsed = 0; parsed = 0;
} }
if ( !mf->GetDefinition("CPACK_INSTALL_COMMANDS") && if (!mf->GetDefinition("CPACK_INSTALL_COMMANDS") &&
!mf->GetDefinition("CPACK_INSTALLED_DIRECTORIES") && !mf->GetDefinition("CPACK_INSTALLED_DIRECTORIES") &&
!mf->GetDefinition("CPACK_INSTALL_CMAKE_PROJECTS") ) !mf->GetDefinition("CPACK_INSTALL_CMAKE_PROJECTS")) {
{ cmCPack_Log(
cmCPack_Log(&log, cmCPackLog::LOG_ERROR, &log, cmCPackLog::LOG_ERROR,
"Please specify build tree of the project that uses CMake " "Please specify build tree of the project that uses CMake "
"using CPACK_INSTALL_CMAKE_PROJECTS, specify " "using CPACK_INSTALL_CMAKE_PROJECTS, specify "
"CPACK_INSTALL_COMMANDS, or specify " "CPACK_INSTALL_COMMANDS, or specify "
@ -403,36 +362,33 @@ int main (int argc, char const* const* argv)
<< std::endl); << std::endl);
parsed = 0; parsed = 0;
} }
if ( parsed ) if (parsed) {
{
const char* projName = mf->GetDefinition("CPACK_PACKAGE_NAME"); const char* projName = mf->GetDefinition("CPACK_PACKAGE_NAME");
cmCPack_Log(&log, cmCPackLog::LOG_VERBOSE, "Use generator: " cmCPack_Log(&log, cmCPackLog::LOG_VERBOSE, "Use generator: "
<< cpackGenerator->GetNameOfClass() << std::endl); << cpackGenerator->GetNameOfClass() << std::endl);
cmCPack_Log(&log, cmCPackLog::LOG_VERBOSE, "For project: " cmCPack_Log(&log, cmCPackLog::LOG_VERBOSE,
<< projName << std::endl); "For project: " << projName << std::endl);
const char* projVersion = const char* projVersion =
mf->GetDefinition("CPACK_PACKAGE_VERSION"); mf->GetDefinition("CPACK_PACKAGE_VERSION");
if ( !projVersion ) if (!projVersion) {
{ const char* projVersionMajor =
const char* projVersionMajor mf->GetDefinition("CPACK_PACKAGE_VERSION_MAJOR");
= mf->GetDefinition("CPACK_PACKAGE_VERSION_MAJOR"); const char* projVersionMinor =
const char* projVersionMinor mf->GetDefinition("CPACK_PACKAGE_VERSION_MINOR");
= mf->GetDefinition("CPACK_PACKAGE_VERSION_MINOR"); const char* projVersionPatch =
const char* projVersionPatch mf->GetDefinition("CPACK_PACKAGE_VERSION_PATCH");
= mf->GetDefinition("CPACK_PACKAGE_VERSION_PATCH");
std::ostringstream ostr; std::ostringstream ostr;
ostr << projVersionMajor << "." << projVersionMinor << "." ostr << projVersionMajor << "." << projVersionMinor << "."
<< projVersionPatch; << projVersionPatch;
mf->AddDefinition("CPACK_PACKAGE_VERSION", mf->AddDefinition("CPACK_PACKAGE_VERSION", ostr.str().c_str());
ostr.str().c_str());
} }
int res = cpackGenerator->DoPackage(); int res = cpackGenerator->DoPackage();
if ( !res ) if (!res) {
{
cmCPack_Log(&log, cmCPackLog::LOG_ERROR, cmCPack_Log(&log, cmCPackLog::LOG_ERROR,
"Error when generating package: " << projName << std::endl); "Error when generating package: " << projName
<< std::endl);
return 1; return 1;
} }
} }
@ -445,35 +401,31 @@ int main (int argc, char const* const* argv)
* instance in order to create appropriate structure * instance in order to create appropriate structure
* in order to satisfy the appropriate --help-xxx request * in order to satisfy the appropriate --help-xxx request
*/ */
if ( help ) if (help) {
{
// Construct and print requested documentation. // Construct and print requested documentation.
doc.SetName("cpack"); doc.SetName("cpack");
doc.SetSection("Name",cmDocumentationName); doc.SetSection("Name", cmDocumentationName);
doc.SetSection("Usage",cmDocumentationUsage); doc.SetSection("Usage", cmDocumentationUsage);
doc.PrependSection("Options",cmDocumentationOptions); doc.PrependSection("Options", cmDocumentationOptions);
std::vector<cmDocumentationEntry> v; std::vector<cmDocumentationEntry> v;
cmCPackGeneratorFactory::DescriptionsMap::const_iterator generatorIt; cmCPackGeneratorFactory::DescriptionsMap::const_iterator generatorIt;
for( generatorIt = generators.GetGeneratorsList().begin(); for (generatorIt = generators.GetGeneratorsList().begin();
generatorIt != generators.GetGeneratorsList().end(); generatorIt != generators.GetGeneratorsList().end(); ++generatorIt) {
++ generatorIt )
{
cmDocumentationEntry e; cmDocumentationEntry e;
e.Name = generatorIt->first.c_str(); e.Name = generatorIt->first.c_str();
e.Brief = generatorIt->second.c_str(); e.Brief = generatorIt->second.c_str();
v.push_back(e); v.push_back(e);
} }
doc.SetSection("Generators",v); doc.SetSection("Generators", v);
#undef cout #undef cout
return doc.PrintRequestedDocumentation(std::cout)? 0:1; return doc.PrintRequestedDocumentation(std::cout) ? 0 : 1;
#define cout no_cout_use_cmCPack_Log #define cout no_cout_use_cmCPack_Log
} }
if (cmSystemTools::GetErrorOccuredFlag()) if (cmSystemTools::GetErrorOccuredFlag()) {
{
return 1; return 1;
} }

View File

@ -19,63 +19,58 @@
#include <cm_expat.h> #include <cm_expat.h>
extern "C" extern "C" int cmBZRXMLParserUnknownEncodingHandler(void*,
int cmBZRXMLParserUnknownEncodingHandler(void*, const XML_Char* name,
const XML_Char *name, XML_Encoding* info)
XML_Encoding *info)
{ {
static const int latin1[]= static const int latin1[] = {
{ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008,
0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, 0x0010, 0x0011,
0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A,
0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, 0x0020, 0x0021, 0x0022, 0x0023,
0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C,
0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x002D, 0x002E, 0x002F, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035,
0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E,
0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x003F, 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050,
0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059,
0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, 0x0060, 0x0061, 0x0062,
0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B,
0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074,
0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D,
0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x007E, 0x007F, 0x20AC, 0x0081, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020,
0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x2021, 0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x008D, 0x017D, 0x008F,
0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, 0x0090, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x02DC,
0x20AC, 0x0081, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x2122, 0x0161, 0x203A, 0x0153, 0x009D, 0x017E, 0x0178, 0x00A0, 0x00A1,
0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x008D, 0x017D, 0x008F, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00AA,
0x0090, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, 0x00B0, 0x00B1, 0x00B2, 0x00B3,
0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x009D, 0x017E, 0x0178, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC,
0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00BD, 0x00BE, 0x00BF, 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5,
0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE,
0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00CF, 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7,
0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF, 0x00E0,
0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9,
0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, 0x00F0, 0x00F1, 0x00F2,
0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F8, 0x00F9, 0x00FA, 0x00FB,
0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF, 0x00FC, 0x00FD, 0x00FE, 0x00FF
0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7,
0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7,
0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF
}; };
// The BZR xml output plugin can use some encodings that are not // The BZR xml output plugin can use some encodings that are not
// recognized by expat. This will lead to an error, e.g. "Error // recognized by expat. This will lead to an error, e.g. "Error
// parsing bzr log xml: unknown encoding", the following is a // parsing bzr log xml: unknown encoding", the following is a
// workaround for these unknown encodings. // workaround for these unknown encodings.
if(name == std::string("ascii") || name == std::string("cp1252") || if (name == std::string("ascii") || name == std::string("cp1252") ||
name == std::string("ANSI_X3.4-1968")) name == std::string("ANSI_X3.4-1968")) {
{ for (unsigned int i = 0; i < 256; ++i)
for(unsigned int i=0;i<256;++i) info->map[i] = latin1[i]; info->map[i] = latin1[i];
return 1; return 1;
} }
return 0; return 0;
} }
cmCTestBZR::cmCTestBZR(cmCTest* ct, std::ostream& log): cmCTestBZR::cmCTestBZR(cmCTest* ct, std::ostream& log)
cmCTestGlobalVC(ct, log) : cmCTestGlobalVC(ct, log)
{ {
this->PriorRev = this->Unknown; this->PriorRev = this->Unknown;
// Even though it is specified in the documentation, with bzr 1.13 // Even though it is specified in the documentation, with bzr 1.13
@ -88,16 +83,18 @@ cmCTestBZR::~cmCTestBZR()
{ {
} }
class cmCTestBZR::InfoParser: public cmCTestVC::LineParser class cmCTestBZR::InfoParser : public cmCTestVC::LineParser
{ {
public: public:
InfoParser(cmCTestBZR* bzr, const char* prefix): InfoParser(cmCTestBZR* bzr, const char* prefix)
BZR(bzr), CheckOutFound(false) : BZR(bzr)
, CheckOutFound(false)
{ {
this->SetLog(&bzr->Log, prefix); this->SetLog(&bzr->Log, prefix);
this->RegexCheckOut.compile("checkout of branch: *([^\t\r\n]+)$"); this->RegexCheckOut.compile("checkout of branch: *([^\t\r\n]+)$");
this->RegexParent.compile("parent branch: *([^\t\r\n]+)$"); this->RegexParent.compile("parent branch: *([^\t\r\n]+)$");
} }
private: private:
cmCTestBZR* BZR; cmCTestBZR* BZR;
bool CheckOutFound; bool CheckOutFound;
@ -105,35 +102,32 @@ private:
cmsys::RegularExpression RegexParent; cmsys::RegularExpression RegexParent;
virtual bool ProcessLine() virtual bool ProcessLine()
{ {
if(this->RegexCheckOut.find(this->Line)) if (this->RegexCheckOut.find(this->Line)) {
{
this->BZR->URL = this->RegexCheckOut.match(1); this->BZR->URL = this->RegexCheckOut.match(1);
CheckOutFound = true; CheckOutFound = true;
} } else if (!CheckOutFound && this->RegexParent.find(this->Line)) {
else if(!CheckOutFound && this->RegexParent.find(this->Line))
{
this->BZR->URL = this->RegexParent.match(1); this->BZR->URL = this->RegexParent.match(1);
} }
return true; return true;
} }
}; };
class cmCTestBZR::RevnoParser: public cmCTestVC::LineParser class cmCTestBZR::RevnoParser : public cmCTestVC::LineParser
{ {
public: public:
RevnoParser(cmCTestBZR* bzr, const char* prefix, std::string& rev): RevnoParser(cmCTestBZR* bzr, const char* prefix, std::string& rev)
Rev(rev) : Rev(rev)
{ {
this->SetLog(&bzr->Log, prefix); this->SetLog(&bzr->Log, prefix);
this->RegexRevno.compile("^([0-9]+)$"); this->RegexRevno.compile("^([0-9]+)$");
} }
private: private:
std::string& Rev; std::string& Rev;
cmsys::RegularExpression RegexRevno; cmsys::RegularExpression RegexRevno;
virtual bool ProcessLine() virtual bool ProcessLine()
{ {
if(this->RegexRevno.find(this->Line)) if (this->RegexRevno.find(this->Line)) {
{
this->Rev = this->RegexRevno.match(1); this->Rev = this->RegexRevno.match(1);
} }
return true; return true;
@ -144,13 +138,13 @@ std::string cmCTestBZR::LoadInfo()
{ {
// Run "bzr info" to get the repository info from the work tree. // Run "bzr info" to get the repository info from the work tree.
const char* bzr = this->CommandLineTool.c_str(); const char* bzr = this->CommandLineTool.c_str();
const char* bzr_info[] = {bzr, "info", 0}; const char* bzr_info[] = { bzr, "info", 0 };
InfoParser iout(this, "info-out> "); InfoParser iout(this, "info-out> ");
OutputLogger ierr(this->Log, "info-err> "); OutputLogger ierr(this->Log, "info-err> ");
this->RunChild(bzr_info, &iout, &ierr); this->RunChild(bzr_info, &iout, &ierr);
// Run "bzr revno" to get the repository revision number from the work tree. // Run "bzr revno" to get the repository revision number from the work tree.
const char* bzr_revno[] = {bzr, "revno", 0}; const char* bzr_revno[] = { bzr, "revno", 0 };
std::string rev; std::string rev;
RevnoParser rout(this, "revno-out> ", rev); RevnoParser rout(this, "revno-out> ", rev);
OutputLogger rerr(this->Log, "revno-err> "); OutputLogger rerr(this->Log, "revno-err> ");
@ -177,26 +171,29 @@ void cmCTestBZR::NoteNewRevision()
this->Log << "URL = " << this->URL << "\n"; this->Log << "URL = " << this->URL << "\n";
} }
class cmCTestBZR::LogParser: public cmCTestVC::OutputLogger, class cmCTestBZR::LogParser : public cmCTestVC::OutputLogger,
private cmXMLParser private cmXMLParser
{ {
public: public:
LogParser(cmCTestBZR* bzr, const char* prefix): LogParser(cmCTestBZR* bzr, const char* prefix)
OutputLogger(bzr->Log, prefix), BZR(bzr), : OutputLogger(bzr->Log, prefix)
EmailRegex("(.*) <([A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+)>") , BZR(bzr)
{ this->InitializeParser(); } , EmailRegex("(.*) <([A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+)>")
{
this->InitializeParser();
}
~LogParser() { this->CleanupParser(); } ~LogParser() { this->CleanupParser(); }
virtual int InitializeParser() virtual int InitializeParser()
{ {
int res = cmXMLParser::InitializeParser(); int res = cmXMLParser::InitializeParser();
if (res) if (res) {
{
XML_SetUnknownEncodingHandler(static_cast<XML_Parser>(this->Parser), XML_SetUnknownEncodingHandler(static_cast<XML_Parser>(this->Parser),
cmBZRXMLParserUnknownEncodingHandler, 0); cmBZRXMLParserUnknownEncodingHandler, 0);
} }
return res; return res;
} }
private: private:
cmCTestBZR* BZR; cmCTestBZR* BZR;
@ -219,33 +216,23 @@ private:
virtual void StartElement(const std::string& name, const char**) virtual void StartElement(const std::string& name, const char**)
{ {
this->CData.clear(); this->CData.clear();
if(name == "log") if (name == "log") {
{
this->Rev = Revision(); this->Rev = Revision();
this->Changes.clear(); this->Changes.clear();
} }
// affected-files can contain blocks of // affected-files can contain blocks of
// modified, unknown, renamed, kind-changed, removed, conflicts, added // modified, unknown, renamed, kind-changed, removed, conflicts, added
else if(name == "modified" else if (name == "modified" || name == "renamed" ||
|| name == "renamed" name == "kind-changed") {
|| name == "kind-changed")
{
this->CurChange = Change(); this->CurChange = Change();
this->CurChange.Action = 'M'; this->CurChange.Action = 'M';
} } else if (name == "added") {
else if(name == "added")
{
this->CurChange = Change(); this->CurChange = Change();
this->CurChange = 'A'; this->CurChange = 'A';
} } else if (name == "removed") {
else if(name == "removed")
{
this->CurChange = Change(); this->CurChange = Change();
this->CurChange = 'D'; this->CurChange = 'D';
} } else if (name == "unknown" || name == "conflicts") {
else if(name == "unknown"
|| name == "conflicts")
{
// Should not happen here // Should not happen here
this->CurChange = Change(); this->CurChange = Change();
} }
@ -253,48 +240,34 @@ private:
virtual void CharacterDataHandler(const char* data, int length) virtual void CharacterDataHandler(const char* data, int length)
{ {
this->CData.insert(this->CData.end(), data, data+length); this->CData.insert(this->CData.end(), data, data + length);
} }
virtual void EndElement(const std::string& name) virtual void EndElement(const std::string& name)
{ {
if(name == "log") if (name == "log") {
{
this->BZR->DoRevision(this->Rev, this->Changes); this->BZR->DoRevision(this->Rev, this->Changes);
} } else if (!this->CData.empty() &&
else if(!this->CData.empty() && (name == "file" || name == "directory")) {
(name == "file" || name == "directory"))
{
this->CurChange.Path.assign(&this->CData[0], this->CData.size()); this->CurChange.Path.assign(&this->CData[0], this->CData.size());
cmSystemTools::ConvertToUnixSlashes(this->CurChange.Path); cmSystemTools::ConvertToUnixSlashes(this->CurChange.Path);
this->Changes.push_back(this->CurChange); this->Changes.push_back(this->CurChange);
} } else if (!this->CData.empty() && name == "symlink") {
else if(!this->CData.empty() && name == "symlink")
{
// symlinks have an arobase at the end in the log // symlinks have an arobase at the end in the log
this->CurChange.Path.assign(&this->CData[0], this->CData.size()-1); this->CurChange.Path.assign(&this->CData[0], this->CData.size() - 1);
cmSystemTools::ConvertToUnixSlashes(this->CurChange.Path); cmSystemTools::ConvertToUnixSlashes(this->CurChange.Path);
this->Changes.push_back(this->CurChange); this->Changes.push_back(this->CurChange);
} } else if (!this->CData.empty() && name == "committer") {
else if(!this->CData.empty() && name == "committer")
{
this->Rev.Author.assign(&this->CData[0], this->CData.size()); this->Rev.Author.assign(&this->CData[0], this->CData.size());
if(this->EmailRegex.find(this->Rev.Author)) if (this->EmailRegex.find(this->Rev.Author)) {
{
this->Rev.Author = this->EmailRegex.match(1); this->Rev.Author = this->EmailRegex.match(1);
this->Rev.EMail = this->EmailRegex.match(2); this->Rev.EMail = this->EmailRegex.match(2);
} }
} } else if (!this->CData.empty() && name == "timestamp") {
else if(!this->CData.empty() && name == "timestamp")
{
this->Rev.Date.assign(&this->CData[0], this->CData.size()); this->Rev.Date.assign(&this->CData[0], this->CData.size());
} } else if (!this->CData.empty() && name == "message") {
else if(!this->CData.empty() && name == "message")
{
this->Rev.Log.assign(&this->CData[0], this->CData.size()); this->Rev.Log.assign(&this->CData[0], this->CData.size());
} } else if (!this->CData.empty() && name == "revno") {
else if(!this->CData.empty() && name == "revno")
{
this->Rev.Rev.assign(&this->CData[0], this->CData.size()); this->Rev.Rev.assign(&this->CData[0], this->CData.size());
} }
this->CData.clear(); this->CData.clear();
@ -306,14 +279,16 @@ private:
} }
}; };
class cmCTestBZR::UpdateParser: public cmCTestVC::LineParser class cmCTestBZR::UpdateParser : public cmCTestVC::LineParser
{ {
public: public:
UpdateParser(cmCTestBZR* bzr, const char* prefix): BZR(bzr) UpdateParser(cmCTestBZR* bzr, const char* prefix)
: BZR(bzr)
{ {
this->SetLog(&bzr->Log, prefix); this->SetLog(&bzr->Log, prefix);
this->RegexUpdate.compile("^([-+R?XCP ])([NDKM ])([* ]) +(.+)$"); this->RegexUpdate.compile("^([-+R?XCP ])([NDKM ])([* ]) +(.+)$");
} }
private: private:
cmCTestBZR* BZR; cmCTestBZR* BZR;
cmsys::RegularExpression RegexUpdate; cmsys::RegularExpression RegexUpdate;
@ -323,21 +298,16 @@ private:
bool last_is_new_line = (*first == '\r' || *first == '\n'); bool last_is_new_line = (*first == '\r' || *first == '\n');
const char* const last = first + length; const char* const last = first + length;
for(const char* c = first; c != last; ++c) for (const char* c = first; c != last; ++c) {
{ if (*c == '\r' || *c == '\n') {
if(*c == '\r' || *c == '\n') if (!last_is_new_line) {
{
if(!last_is_new_line)
{
// Log this line. // Log this line.
if(this->Log && this->Prefix) if (this->Log && this->Prefix) {
{
*this->Log << this->Prefix << this->Line << "\n"; *this->Log << this->Prefix << this->Line << "\n";
} }
// Hand this line to the subclass implementation. // Hand this line to the subclass implementation.
if(!this->ProcessLine()) if (!this->ProcessLine()) {
{
this->Line = ""; this->Line = "";
return false; return false;
} }
@ -345,9 +315,7 @@ private:
this->Line = ""; this->Line = "";
last_is_new_line = true; last_is_new_line = true;
} }
} } else {
else
{
// Append this character to the line under construction. // Append this character to the line under construction.
this->Line.append(1, *c); this->Line.append(1, *c);
last_is_new_line = false; last_is_new_line = false;
@ -358,32 +326,29 @@ private:
bool ProcessLine() bool ProcessLine()
{ {
if(this->RegexUpdate.find(this->Line)) if (this->RegexUpdate.find(this->Line)) {
{
this->DoPath(this->RegexUpdate.match(1)[0], this->DoPath(this->RegexUpdate.match(1)[0],
this->RegexUpdate.match(2)[0], this->RegexUpdate.match(2)[0],
this->RegexUpdate.match(3)[0], this->RegexUpdate.match(3)[0], this->RegexUpdate.match(4));
this->RegexUpdate.match(4));
} }
return true; return true;
} }
void DoPath(char c0, char c1, char c2, std::string path) void DoPath(char c0, char c1, char c2, std::string path)
{ {
if(path.empty()) return; if (path.empty())
return;
cmSystemTools::ConvertToUnixSlashes(path); cmSystemTools::ConvertToUnixSlashes(path);
const std::string dir = cmSystemTools::GetFilenamePath(path); const std::string dir = cmSystemTools::GetFilenamePath(path);
const std::string name = cmSystemTools::GetFilenameName(path); const std::string name = cmSystemTools::GetFilenameName(path);
if ( c0=='C' ) if (c0 == 'C') {
{
this->BZR->Dirs[dir][name].Status = PathConflicting; this->BZR->Dirs[dir][name].Status = PathConflicting;
return; return;
} }
if ( c1=='M' || c1=='K' || c1=='N' || c1=='D' || c2 =='*' ) if (c1 == 'M' || c1 == 'K' || c1 == 'N' || c1 == 'D' || c2 == '*') {
{
this->BZR->Dirs[dir][name].Status = PathUpdated; this->BZR->Dirs[dir][name].Status = PathUpdated;
return; return;
} }
@ -394,8 +359,7 @@ bool cmCTestBZR::UpdateImpl()
{ {
// Get user-specified update options. // Get user-specified update options.
std::string opts = this->CTest->GetCTestConfiguration("UpdateOptions"); std::string opts = this->CTest->GetCTestConfiguration("UpdateOptions");
if(opts.empty()) if (opts.empty()) {
{
opts = this->CTest->GetCTestConfiguration("BZRUpdateOptions"); opts = this->CTest->GetCTestConfiguration("BZRUpdateOptions");
} }
std::vector<std::string> args = cmSystemTools::ParseArguments(opts.c_str()); std::vector<std::string> args = cmSystemTools::ParseArguments(opts.c_str());
@ -407,9 +371,8 @@ bool cmCTestBZR::UpdateImpl()
bzr_update.push_back(this->CommandLineTool.c_str()); bzr_update.push_back(this->CommandLineTool.c_str());
bzr_update.push_back("pull"); bzr_update.push_back("pull");
for(std::vector<std::string>::const_iterator ai = args.begin(); for (std::vector<std::string>::const_iterator ai = args.begin();
ai != args.end(); ++ai) ai != args.end(); ++ai) {
{
bzr_update.push_back(ai->c_str()); bzr_update.push_back(ai->c_str());
} }
@ -427,25 +390,24 @@ void cmCTestBZR::LoadRevisions()
{ {
cmCTestLog(this->CTest, HANDLER_OUTPUT, cmCTestLog(this->CTest, HANDLER_OUTPUT,
" Gathering version information (one . per revision):\n" " Gathering version information (one . per revision):\n"
" " << std::flush); " "
<< std::flush);
// We are interested in every revision included in the update. // We are interested in every revision included in the update.
this->Revisions.clear(); this->Revisions.clear();
std::string revs; std::string revs;
if(atoi(this->OldRevision.c_str()) <= atoi(this->NewRevision.c_str())) if (atoi(this->OldRevision.c_str()) <= atoi(this->NewRevision.c_str())) {
{
// DoRevision takes care of discarding the information about OldRevision // DoRevision takes care of discarding the information about OldRevision
revs = this->OldRevision + ".." + this->NewRevision; revs = this->OldRevision + ".." + this->NewRevision;
} } else {
else
{
return; return;
} }
// Run "bzr log" to get all global revisions of interest. // Run "bzr log" to get all global revisions of interest.
const char* bzr = this->CommandLineTool.c_str(); const char* bzr = this->CommandLineTool.c_str();
const char* bzr_log[] = {bzr, "log", "-v", "-r", revs.c_str(), "--xml", const char* bzr_log[] = {
this->URL.c_str(), 0}; bzr, "log", "-v", "-r", revs.c_str(), "--xml", this->URL.c_str(), 0
};
{ {
LogParser out(this, "log-out> "); LogParser out(this, "log-out> ");
OutputLogger err(this->Log, "log-err> "); OutputLogger err(this->Log, "log-err> ");
@ -454,44 +416,42 @@ void cmCTestBZR::LoadRevisions()
cmCTestLog(this->CTest, HANDLER_OUTPUT, std::endl); cmCTestLog(this->CTest, HANDLER_OUTPUT, std::endl);
} }
class cmCTestBZR::StatusParser: public cmCTestVC::LineParser class cmCTestBZR::StatusParser : public cmCTestVC::LineParser
{ {
public: public:
StatusParser(cmCTestBZR* bzr, const char* prefix): BZR(bzr) StatusParser(cmCTestBZR* bzr, const char* prefix)
: BZR(bzr)
{ {
this->SetLog(&bzr->Log, prefix); this->SetLog(&bzr->Log, prefix);
this->RegexStatus.compile("^([-+R?XCP ])([NDKM ])([* ]) +(.+)$"); this->RegexStatus.compile("^([-+R?XCP ])([NDKM ])([* ]) +(.+)$");
} }
private: private:
cmCTestBZR* BZR; cmCTestBZR* BZR;
cmsys::RegularExpression RegexStatus; cmsys::RegularExpression RegexStatus;
bool ProcessLine() bool ProcessLine()
{ {
if(this->RegexStatus.find(this->Line)) if (this->RegexStatus.find(this->Line)) {
{
this->DoPath(this->RegexStatus.match(1)[0], this->DoPath(this->RegexStatus.match(1)[0],
this->RegexStatus.match(2)[0], this->RegexStatus.match(2)[0],
this->RegexStatus.match(3)[0], this->RegexStatus.match(3)[0], this->RegexStatus.match(4));
this->RegexStatus.match(4));
} }
return true; return true;
} }
void DoPath(char c0, char c1, char c2, std::string path) void DoPath(char c0, char c1, char c2, std::string path)
{ {
if(path.empty()) return; if (path.empty())
return;
cmSystemTools::ConvertToUnixSlashes(path); cmSystemTools::ConvertToUnixSlashes(path);
if ( c0=='C' ) if (c0 == 'C') {
{
this->BZR->DoModification(PathConflicting, path); this->BZR->DoModification(PathConflicting, path);
return; return;
} }
if ( c0 == '+' || c0 == 'R' || c0 == 'P' if (c0 == '+' || c0 == 'R' || c0 == 'P' || c1 == 'M' || c1 == 'K' ||
|| c1=='M' || c1=='K' || c1=='N' || c1=='D' c1 == 'N' || c1 == 'D' || c2 == '*') {
|| c2 =='*' )
{
this->BZR->DoModification(PathModified, path); this->BZR->DoModification(PathModified, path);
return; return;
} }
@ -502,7 +462,7 @@ void cmCTestBZR::LoadModifications()
{ {
// Run "bzr status" which reports local modifications. // Run "bzr status" which reports local modifications.
const char* bzr = this->CommandLineTool.c_str(); const char* bzr = this->CommandLineTool.c_str();
const char* bzr_status[] = {bzr, "status", "-SV", 0}; const char* bzr_status[] = { bzr, "status", "-SV", 0 };
StatusParser out(this, "status-out> "); StatusParser out(this, "status-out> ");
OutputLogger err(this->Log, "status-err> "); OutputLogger err(this->Log, "status-err> ");
this->RunChild(bzr_status, &out, &err); this->RunChild(bzr_status, &out, &err);

View File

@ -18,7 +18,7 @@
* \brief Interaction with bzr command-line tool * \brief Interaction with bzr command-line tool
* *
*/ */
class cmCTestBZR: public cmCTestGlobalVC class cmCTestBZR : public cmCTestGlobalVC
{ {
public: public:
/** Construct with a CTest instance and update log stream. */ /** Construct with a CTest instance and update log stream. */

View File

@ -30,14 +30,13 @@ void cmCTestBatchTestHandler::RunTests()
void cmCTestBatchTestHandler::WriteBatchScript() void cmCTestBatchTestHandler::WriteBatchScript()
{ {
this->Script = this->CTest->GetBinaryDir() this->Script = this->CTest->GetBinaryDir() + "/Testing/CTestBatch.txt";
+ "/Testing/CTestBatch.txt";
cmsys::ofstream fout; cmsys::ofstream fout;
fout.open(this->Script.c_str()); fout.open(this->Script.c_str());
fout << "#!/bin/sh\n"; fout << "#!/bin/sh\n";
for(TestMap::iterator i = this->Tests.begin(); i != this->Tests.end(); ++i) for (TestMap::iterator i = this->Tests.begin(); i != this->Tests.end();
{ ++i) {
this->WriteSrunArgs(i->first, fout); this->WriteSrunArgs(i->first, fout);
this->WriteTestCommand(i->first, fout); this->WriteTestCommand(i->first, fout);
fout << "\n"; fout << "\n";
@ -52,10 +51,10 @@ void cmCTestBatchTestHandler::WriteSrunArgs(int test, cmsys::ofstream& fout)
this->Properties[test]; this->Properties[test];
fout << "srun "; fout << "srun ";
//fout << "--jobid=" << test << " "; // fout << "--jobid=" << test << " ";
fout << "-J=" << properties->Name << " "; fout << "-J=" << properties->Name << " ";
//Write dependency information // Write dependency information
/*if(!this->Tests[test].empty()) /*if(!this->Tests[test].empty())
{ {
fout << "-P=afterany"; fout << "-P=afterany";
@ -66,12 +65,10 @@ void cmCTestBatchTestHandler::WriteSrunArgs(int test, cmsys::ofstream& fout)
} }
fout << " "; fout << " ";
}*/ }*/
if(properties->RunSerial) if (properties->RunSerial) {
{
fout << "--exclusive "; fout << "--exclusive ";
} }
if(properties->Processors > 1) if (properties->Processors > 1) {
{
fout << "-n" << properties->Processors << " "; fout << "-n" << properties->Processors << " ";
} }
} }
@ -85,36 +82,32 @@ void cmCTestBatchTestHandler::WriteTestCommand(int test, cmsys::ofstream& fout)
command = this->TestHandler->FindTheExecutable(args[1].c_str()); command = this->TestHandler->FindTheExecutable(args[1].c_str());
command = cmSystemTools::ConvertToOutputPath(command.c_str()); command = cmSystemTools::ConvertToOutputPath(command.c_str());
//Prepends memcheck args to our command string if this is a memcheck // Prepends memcheck args to our command string if this is a memcheck
this->TestHandler->GenerateTestCommand(processArgs, test); this->TestHandler->GenerateTestCommand(processArgs, test);
processArgs.push_back(command); processArgs.push_back(command);
for(std::vector<std::string>::iterator arg = processArgs.begin(); for (std::vector<std::string>::iterator arg = processArgs.begin();
arg != processArgs.end(); ++arg) arg != processArgs.end(); ++arg) {
{
fout << *arg << " "; fout << *arg << " ";
} }
std::vector<std::string>::iterator i = args.begin(); std::vector<std::string>::iterator i = args.begin();
++i; //the test name ++i; // the test name
++i; //the executable (command) ++i; // the executable (command)
if(args.size() > 2) if (args.size() > 2) {
{
fout << "'"; fout << "'";
} }
while(i != args.end()) while (i != args.end()) {
{ fout << "\"" << *i << "\""; // args to the test executable
fout << "\"" << *i << "\""; //args to the test executable
++i; ++i;
if(i == args.end() && args.size() > 2) if (i == args.end() && args.size() > 2) {
{
fout << "'"; fout << "'";
} }
fout << " "; fout << " ";
} }
//TODO ZACH build TestResult.FullCommandLine // TODO ZACH build TestResult.FullCommandLine
//this->TestResult.FullCommandLine = this->TestCommand; // this->TestResult.FullCommandLine = this->TestCommand;
} }
void cmCTestBatchTestHandler::SubmitBatchScript() void cmCTestBatchTestHandler::SubmitBatchScript()
@ -123,8 +116,7 @@ void cmCTestBatchTestHandler::SubmitBatchScript()
std::vector<std::string> args; std::vector<std::string> args;
args.push_back(this->Script); args.push_back(this->Script);
args.push_back("-o"); args.push_back("-o");
args.push_back(this->CTest->GetBinaryDir() args.push_back(this->CTest->GetBinaryDir() + "/Testing/CTestBatch.txt");
+ "/Testing/CTestBatch.txt");
sbatch.SetCommand("sbatch"); sbatch.SetCommand("sbatch");
sbatch.SetCommandArguments(args); sbatch.SetCommandArguments(args);

View File

@ -30,6 +30,7 @@ class cmCTestBatchTestHandler : public cmCTestMultiProcessHandler
public: public:
~cmCTestBatchTestHandler(); ~cmCTestBatchTestHandler();
virtual void RunTests(); virtual void RunTests();
protected: protected:
void WriteBatchScript(); void WriteBatchScript();
void WriteSrunArgs(int test, cmsys::ofstream& fout); void WriteSrunArgs(int test, cmsys::ofstream& fout);

View File

@ -48,86 +48,70 @@ int cmCTestBuildAndTestHandler::ProcessHandler()
} }
int cmCTestBuildAndTestHandler::RunCMake(std::string* outstring, int cmCTestBuildAndTestHandler::RunCMake(std::string* outstring,
std::ostringstream &out, std::string &cmakeOutString, std::string &cwd, std::ostringstream& out,
cmake *cm) std::string& cmakeOutString,
std::string& cwd, cmake* cm)
{ {
unsigned int k; unsigned int k;
std::vector<std::string> args; std::vector<std::string> args;
args.push_back(cmSystemTools::GetCMakeCommand()); args.push_back(cmSystemTools::GetCMakeCommand());
args.push_back(this->SourceDir); args.push_back(this->SourceDir);
if(!this->BuildGenerator.empty()) if (!this->BuildGenerator.empty()) {
{
std::string generator = "-G"; std::string generator = "-G";
generator += this->BuildGenerator; generator += this->BuildGenerator;
args.push_back(generator); args.push_back(generator);
} }
if(!this->BuildGeneratorPlatform.empty()) if (!this->BuildGeneratorPlatform.empty()) {
{
std::string platform = "-A"; std::string platform = "-A";
platform += this->BuildGeneratorPlatform; platform += this->BuildGeneratorPlatform;
args.push_back(platform); args.push_back(platform);
} }
if(!this->BuildGeneratorToolset.empty()) if (!this->BuildGeneratorToolset.empty()) {
{
std::string toolset = "-T"; std::string toolset = "-T";
toolset += this->BuildGeneratorToolset; toolset += this->BuildGeneratorToolset;
args.push_back(toolset); args.push_back(toolset);
} }
const char* config = 0; const char* config = 0;
if (!this->CTest->GetConfigType().empty()) if (!this->CTest->GetConfigType().empty()) {
{
config = this->CTest->GetConfigType().c_str(); config = this->CTest->GetConfigType().c_str();
} }
#ifdef CMAKE_INTDIR #ifdef CMAKE_INTDIR
if(!config) if (!config) {
{
config = CMAKE_INTDIR; config = CMAKE_INTDIR;
} }
#endif #endif
if ( config ) if (config) {
{ std::string btype = "-DCMAKE_BUILD_TYPE:STRING=" + std::string(config);
std::string btype
= "-DCMAKE_BUILD_TYPE:STRING=" + std::string(config);
args.push_back(btype); args.push_back(btype);
} }
for(k=0; k < this->BuildOptions.size(); ++k) for (k = 0; k < this->BuildOptions.size(); ++k) {
{
args.push_back(this->BuildOptions[k]); args.push_back(this->BuildOptions[k]);
} }
if (cm->Run(args) != 0) if (cm->Run(args) != 0) {
{
out << "Error: cmake execution failed\n"; out << "Error: cmake execution failed\n";
out << cmakeOutString << "\n"; out << cmakeOutString << "\n";
// return to the original directory // return to the original directory
cmSystemTools::ChangeDirectory(cwd); cmSystemTools::ChangeDirectory(cwd);
if(outstring) if (outstring) {
{
*outstring = out.str(); *outstring = out.str();
} } else {
else
{
cmCTestLog(this->CTest, ERROR_MESSAGE, out.str() << std::endl); cmCTestLog(this->CTest, ERROR_MESSAGE, out.str() << std::endl);
} }
return 1; return 1;
} }
// do another config? // do another config?
if(this->BuildTwoConfig) if (this->BuildTwoConfig) {
{ if (cm->Run(args) != 0) {
if (cm->Run(args) != 0)
{
out << "Error: cmake execution failed\n"; out << "Error: cmake execution failed\n";
out << cmakeOutString << "\n"; out << cmakeOutString << "\n";
// return to the original directory // return to the original directory
cmSystemTools::ChangeDirectory(cwd); cmSystemTools::ChangeDirectory(cwd);
if(outstring) if (outstring) {
{
*outstring = out.str(); *outstring = out.str();
} } else {
else
{
cmCTestLog(this->CTest, ERROR_MESSAGE, out.str() << std::endl); cmCTestLog(this->CTest, ERROR_MESSAGE, out.str() << std::endl);
} }
return 1; return 1;
@ -146,7 +130,7 @@ void CMakeMessageCallback(const char* m, const char*, bool&, void* s)
*out += "\n"; *out += "\n";
} }
void CMakeProgressCallback(const char*msg, float , void * s) void CMakeProgressCallback(const char* msg, float, void* s)
{ {
std::string* out = (std::string*)s; std::string* out = (std::string*)s;
*out += msg; *out += msg;
@ -162,8 +146,10 @@ void CMakeOutputCallback(const char* m, size_t len, void* s)
class cmCTestBuildAndTestCaptureRAII class cmCTestBuildAndTestCaptureRAII
{ {
cmake& CM; cmake& CM;
public: public:
cmCTestBuildAndTestCaptureRAII(cmake& cm, std::string& s): CM(cm) cmCTestBuildAndTestCaptureRAII(cmake& cm, std::string& s)
: CM(cm)
{ {
cmSystemTools::SetMessageCallback(CMakeMessageCallback, &s); cmSystemTools::SetMessageCallback(CMakeMessageCallback, &s);
cmSystemTools::SetStdoutCallback(CMakeOutputCallback, &s); cmSystemTools::SetStdoutCallback(CMakeOutputCallback, &s);
@ -182,12 +168,9 @@ public:
int cmCTestBuildAndTestHandler::RunCMakeAndTest(std::string* outstring) int cmCTestBuildAndTestHandler::RunCMakeAndTest(std::string* outstring)
{ {
// if the generator and make program are not specified then it is an error // if the generator and make program are not specified then it is an error
if (this->BuildGenerator.empty()) if (this->BuildGenerator.empty()) {
{ if (outstring) {
if(outstring) *outstring = "--build-and-test requires that the generator "
{
*outstring =
"--build-and-test requires that the generator "
"be provided using the --build-generator " "be provided using the --build-generator "
"command line option. "; "command line option. ";
} }
@ -202,26 +185,20 @@ int cmCTestBuildAndTestHandler::RunCMakeAndTest(std::string* outstring)
static_cast<void>(captureRAII); static_cast<void>(captureRAII);
std::ostringstream out; std::ostringstream out;
if ( this->CTest->GetConfigType().empty() && if (this->CTest->GetConfigType().empty() && !this->ConfigSample.empty()) {
!this->ConfigSample.empty())
{
// use the config sample to set the ConfigType // use the config sample to set the ConfigType
std::string fullPath; std::string fullPath;
std::string resultingConfig; std::string resultingConfig;
std::vector<std::string> extraPaths; std::vector<std::string> extraPaths;
std::vector<std::string> failed; std::vector<std::string> failed;
fullPath = fullPath = cmCTestTestHandler::FindExecutable(
cmCTestTestHandler::FindExecutable(this->CTest, this->CTest, this->ConfigSample.c_str(), resultingConfig, extraPaths,
this->ConfigSample.c_str(),
resultingConfig,
extraPaths,
failed); failed);
if (!fullPath.empty() && !resultingConfig.empty()) if (!fullPath.empty() && !resultingConfig.empty()) {
{
this->CTest->SetConfigType(resultingConfig.c_str()); this->CTest->SetConfigType(resultingConfig.c_str());
} }
out << "Using config sample with results: " out << "Using config sample with results: " << fullPath << " and "
<< fullPath << " and " << resultingConfig << std::endl; << resultingConfig << std::endl;
} }
// we need to honor the timeout specified, the timeout include cmake, build // we need to honor the timeout specified, the timeout include cmake, build
@ -230,51 +207,40 @@ int cmCTestBuildAndTestHandler::RunCMakeAndTest(std::string* outstring)
// make sure the binary dir is there // make sure the binary dir is there
std::string cwd = cmSystemTools::GetCurrentWorkingDirectory(); std::string cwd = cmSystemTools::GetCurrentWorkingDirectory();
out << "Internal cmake changing into directory: " out << "Internal cmake changing into directory: " << this->BinaryDir
<< this->BinaryDir << std::endl; << std::endl;
if (!cmSystemTools::FileIsDirectory(this->BinaryDir)) if (!cmSystemTools::FileIsDirectory(this->BinaryDir)) {
{
cmSystemTools::MakeDirectory(this->BinaryDir.c_str()); cmSystemTools::MakeDirectory(this->BinaryDir.c_str());
} }
cmSystemTools::ChangeDirectory(this->BinaryDir); cmSystemTools::ChangeDirectory(this->BinaryDir);
if(this->BuildNoCMake) if (this->BuildNoCMake) {
{
// Make the generator available for the Build call below. // Make the generator available for the Build call below.
cm.SetGlobalGenerator(cm.CreateGlobalGenerator( cm.SetGlobalGenerator(cm.CreateGlobalGenerator(this->BuildGenerator));
this->BuildGenerator));
cm.SetGeneratorPlatform(this->BuildGeneratorPlatform); cm.SetGeneratorPlatform(this->BuildGeneratorPlatform);
cm.SetGeneratorToolset(this->BuildGeneratorToolset); cm.SetGeneratorToolset(this->BuildGeneratorToolset);
// Load the cache to make CMAKE_MAKE_PROGRAM available. // Load the cache to make CMAKE_MAKE_PROGRAM available.
cm.LoadCache(this->BinaryDir); cm.LoadCache(this->BinaryDir);
} } else {
else
{
// do the cmake step, no timeout here since it is not a sub process // do the cmake step, no timeout here since it is not a sub process
if (this->RunCMake(outstring,out,cmakeOutString,cwd,&cm)) if (this->RunCMake(outstring, out, cmakeOutString, cwd, &cm)) {
{
return 1; return 1;
} }
} }
// do the build // do the build
std::vector<std::string>::iterator tarIt; std::vector<std::string>::iterator tarIt;
if (this->BuildTargets.empty()) if (this->BuildTargets.empty()) {
{
this->BuildTargets.push_back(""); this->BuildTargets.push_back("");
} }
for ( tarIt = this->BuildTargets.begin(); for (tarIt = this->BuildTargets.begin(); tarIt != this->BuildTargets.end();
tarIt != this->BuildTargets.end(); ++ tarIt ) ++tarIt) {
{
double remainingTime = 0; double remainingTime = 0;
if (this->Timeout > 0) if (this->Timeout > 0) {
{
remainingTime = this->Timeout - cmSystemTools::GetTime() + clock_start; remainingTime = this->Timeout - cmSystemTools::GetTime() + clock_start;
if (remainingTime <= 0) if (remainingTime <= 0) {
{ if (outstring) {
if(outstring)
{
*outstring = "--build-and-test timeout exceeded. "; *outstring = "--build-and-test timeout exceeded. ";
} }
return 1; return 1;
@ -282,46 +248,36 @@ int cmCTestBuildAndTestHandler::RunCMakeAndTest(std::string* outstring)
} }
std::string output; std::string output;
const char* config = 0; const char* config = 0;
if (!this->CTest->GetConfigType().empty()) if (!this->CTest->GetConfigType().empty()) {
{
config = this->CTest->GetConfigType().c_str(); config = this->CTest->GetConfigType().c_str();
} }
#ifdef CMAKE_INTDIR #ifdef CMAKE_INTDIR
if(!config) if (!config) {
{
config = CMAKE_INTDIR; config = CMAKE_INTDIR;
} }
#endif #endif
if(!config) if (!config) {
{
config = "Debug"; config = "Debug";
} }
int retVal = cm.GetGlobalGenerator()->Build( int retVal = cm.GetGlobalGenerator()->Build(
this->SourceDir, this->BinaryDir, this->SourceDir, this->BinaryDir, this->BuildProject, *tarIt, output,
this->BuildProject, *tarIt, this->BuildMakeProgram, config, !this->BuildNoClean, false, false,
output, this->BuildMakeProgram, remainingTime);
config,
!this->BuildNoClean,
false, false, remainingTime);
out << output; out << output;
// if the build failed then return // if the build failed then return
if (retVal) if (retVal) {
{ if (outstring) {
if(outstring)
{
*outstring = out.str(); *outstring = out.str();
} }
return 1; return 1;
} }
} }
if(outstring) if (outstring) {
{
*outstring = out.str(); *outstring = out.str();
} }
// if no test was specified then we are done // if no test was specified then we are done
if (this->TestCommand.empty()) if (this->TestCommand.empty()) {
{
return 0; return 0;
} }
@ -331,8 +287,7 @@ int cmCTestBuildAndTestHandler::RunCMakeAndTest(std::string* outstring)
std::string resultingConfig; std::string resultingConfig;
std::vector<std::string> extraPaths; std::vector<std::string> extraPaths;
// if this->ExecutableDirectory is set try that as well // if this->ExecutableDirectory is set try that as well
if (!this->ExecutableDirectory.empty()) if (!this->ExecutableDirectory.empty()) {
{
std::string tempPath = this->ExecutableDirectory; std::string tempPath = this->ExecutableDirectory;
tempPath += "/"; tempPath += "/";
tempPath += this->TestCommand; tempPath += this->TestCommand;
@ -340,28 +295,20 @@ int cmCTestBuildAndTestHandler::RunCMakeAndTest(std::string* outstring)
} }
std::vector<std::string> failed; std::vector<std::string> failed;
fullPath = fullPath =
cmCTestTestHandler::FindExecutable(this->CTest, cmCTestTestHandler::FindExecutable(this->CTest, this->TestCommand.c_str(),
this->TestCommand.c_str(), resultingConfig, extraPaths, failed);
resultingConfig,
extraPaths,
failed);
if(!cmSystemTools::FileExists(fullPath.c_str())) if (!cmSystemTools::FileExists(fullPath.c_str())) {
{
out << "Could not find path to executable, perhaps it was not built: " out << "Could not find path to executable, perhaps it was not built: "
<< this->TestCommand << "\n"; << this->TestCommand << "\n";
out << "tried to find it in these places:\n"; out << "tried to find it in these places:\n";
out << fullPath.c_str() << "\n"; out << fullPath.c_str() << "\n";
for(unsigned int i=0; i < failed.size(); ++i) for (unsigned int i = 0; i < failed.size(); ++i) {
{
out << failed[i] << "\n"; out << failed[i] << "\n";
} }
if(outstring) if (outstring) {
{
*outstring = out.str(); *outstring = out.str();
} } else {
else
{
cmCTestLog(this->CTest, ERROR_MESSAGE, out.str()); cmCTestLog(this->CTest, ERROR_MESSAGE, out.str());
} }
// return to the original directory // return to the original directory
@ -371,57 +318,47 @@ int cmCTestBuildAndTestHandler::RunCMakeAndTest(std::string* outstring)
std::vector<const char*> testCommand; std::vector<const char*> testCommand;
testCommand.push_back(fullPath.c_str()); testCommand.push_back(fullPath.c_str());
for(size_t k=0; k < this->TestCommandArgs.size(); ++k) for (size_t k = 0; k < this->TestCommandArgs.size(); ++k) {
{
testCommand.push_back(this->TestCommandArgs[k].c_str()); testCommand.push_back(this->TestCommandArgs[k].c_str());
} }
testCommand.push_back(0); testCommand.push_back(0);
std::string outs; std::string outs;
int retval = 0; int retval = 0;
// run the test from the this->BuildRunDir if set // run the test from the this->BuildRunDir if set
if(!this->BuildRunDir.empty()) if (!this->BuildRunDir.empty()) {
{
out << "Run test in directory: " << this->BuildRunDir << "\n"; out << "Run test in directory: " << this->BuildRunDir << "\n";
cmSystemTools::ChangeDirectory(this->BuildRunDir); cmSystemTools::ChangeDirectory(this->BuildRunDir);
} }
out << "Running test command: \"" << fullPath << "\""; out << "Running test command: \"" << fullPath << "\"";
for(size_t k=0; k < this->TestCommandArgs.size(); ++k) for (size_t k = 0; k < this->TestCommandArgs.size(); ++k) {
{
out << " \"" << this->TestCommandArgs[k] << "\""; out << " \"" << this->TestCommandArgs[k] << "\"";
} }
out << "\n"; out << "\n";
// how much time is remaining // how much time is remaining
double remainingTime = 0; double remainingTime = 0;
if (this->Timeout > 0) if (this->Timeout > 0) {
{
remainingTime = this->Timeout - cmSystemTools::GetTime() + clock_start; remainingTime = this->Timeout - cmSystemTools::GetTime() + clock_start;
if (remainingTime <= 0) if (remainingTime <= 0) {
{ if (outstring) {
if(outstring)
{
*outstring = "--build-and-test timeout exceeded. "; *outstring = "--build-and-test timeout exceeded. ";
} }
return 1; return 1;
} }
} }
int runTestRes = this->CTest->RunTest(testCommand, &outs, &retval, 0, int runTestRes =
remainingTime, 0); this->CTest->RunTest(testCommand, &outs, &retval, 0, remainingTime, 0);
if(runTestRes != cmsysProcess_State_Exited || retval != 0) if (runTestRes != cmsysProcess_State_Exited || retval != 0) {
{
out << "Test command failed: " << testCommand[0] << "\n"; out << "Test command failed: " << testCommand[0] << "\n";
retval = 1; retval = 1;
} }
out << outs << "\n"; out << outs << "\n";
if(outstring) if (outstring) {
{
*outstring = out.str(); *outstring = out.str();
} } else {
else
{
cmCTestLog(this->CTest, OUTPUT, out.str() << std::endl); cmCTestLog(this->CTest, OUTPUT, out.str() << std::endl);
} }
return retval; return retval;
@ -432,114 +369,89 @@ int cmCTestBuildAndTestHandler::ProcessCommandLineArguments(
const std::vector<std::string>& allArgs) const std::vector<std::string>& allArgs)
{ {
// --build-and-test options // --build-and-test options
if(currentArg.find("--build-and-test",0) == 0 && idx < allArgs.size() - 1) if (currentArg.find("--build-and-test", 0) == 0 &&
{ idx < allArgs.size() - 1) {
if(idx+2 < allArgs.size()) if (idx + 2 < allArgs.size()) {
{
idx++; idx++;
this->SourceDir = allArgs[idx]; this->SourceDir = allArgs[idx];
idx++; idx++;
this->BinaryDir = allArgs[idx]; this->BinaryDir = allArgs[idx];
// dir must exist before CollapseFullPath is called // dir must exist before CollapseFullPath is called
cmSystemTools::MakeDirectory(this->BinaryDir.c_str()); cmSystemTools::MakeDirectory(this->BinaryDir.c_str());
this->BinaryDir this->BinaryDir = cmSystemTools::CollapseFullPath(this->BinaryDir);
= cmSystemTools::CollapseFullPath(this->BinaryDir); this->SourceDir = cmSystemTools::CollapseFullPath(this->SourceDir);
this->SourceDir } else {
= cmSystemTools::CollapseFullPath(this->SourceDir);
}
else
{
cmCTestLog(this->CTest, ERROR_MESSAGE, cmCTestLog(this->CTest, ERROR_MESSAGE,
"--build-and-test must have source and binary dir" << std::endl); "--build-and-test must have source and binary dir"
<< std::endl);
return 0; return 0;
} }
} }
if(currentArg.find("--build-target",0) == 0 && idx < allArgs.size() - 1) if (currentArg.find("--build-target", 0) == 0 && idx < allArgs.size() - 1) {
{
idx++; idx++;
this->BuildTargets.push_back(allArgs[idx]); this->BuildTargets.push_back(allArgs[idx]);
} }
if(currentArg.find("--build-nocmake",0) == 0) if (currentArg.find("--build-nocmake", 0) == 0) {
{
this->BuildNoCMake = true; this->BuildNoCMake = true;
} }
if(currentArg.find("--build-run-dir",0) == 0 && idx < allArgs.size() - 1) if (currentArg.find("--build-run-dir", 0) == 0 && idx < allArgs.size() - 1) {
{
idx++; idx++;
this->BuildRunDir = allArgs[idx]; this->BuildRunDir = allArgs[idx];
} }
if(currentArg.find("--build-two-config",0) == 0) if (currentArg.find("--build-two-config", 0) == 0) {
{
this->BuildTwoConfig = true; this->BuildTwoConfig = true;
} }
if(currentArg.find("--build-exe-dir",0) == 0 && idx < allArgs.size() - 1) if (currentArg.find("--build-exe-dir", 0) == 0 && idx < allArgs.size() - 1) {
{
idx++; idx++;
this->ExecutableDirectory = allArgs[idx]; this->ExecutableDirectory = allArgs[idx];
} }
if(currentArg.find("--test-timeout",0) == 0 && idx < allArgs.size() - 1) if (currentArg.find("--test-timeout", 0) == 0 && idx < allArgs.size() - 1) {
{
idx++; idx++;
this->Timeout = atof(allArgs[idx].c_str()); this->Timeout = atof(allArgs[idx].c_str());
} }
if(currentArg == "--build-generator" && idx < allArgs.size() - 1) if (currentArg == "--build-generator" && idx < allArgs.size() - 1) {
{
idx++; idx++;
this->BuildGenerator = allArgs[idx]; this->BuildGenerator = allArgs[idx];
} }
if(currentArg == "--build-generator-platform" && if (currentArg == "--build-generator-platform" && idx < allArgs.size() - 1) {
idx < allArgs.size() - 1)
{
idx++; idx++;
this->BuildGeneratorPlatform = allArgs[idx]; this->BuildGeneratorPlatform = allArgs[idx];
} }
if(currentArg == "--build-generator-toolset" && if (currentArg == "--build-generator-toolset" && idx < allArgs.size() - 1) {
idx < allArgs.size() - 1)
{
idx++; idx++;
this->BuildGeneratorToolset = allArgs[idx]; this->BuildGeneratorToolset = allArgs[idx];
} }
if(currentArg.find("--build-project",0) == 0 && idx < allArgs.size() - 1) if (currentArg.find("--build-project", 0) == 0 && idx < allArgs.size() - 1) {
{
idx++; idx++;
this->BuildProject = allArgs[idx]; this->BuildProject = allArgs[idx];
} }
if(currentArg.find("--build-makeprogram",0) == 0 && if (currentArg.find("--build-makeprogram", 0) == 0 &&
idx < allArgs.size() - 1) idx < allArgs.size() - 1) {
{
idx++; idx++;
this->BuildMakeProgram = allArgs[idx]; this->BuildMakeProgram = allArgs[idx];
} }
if(currentArg.find("--build-config-sample",0) == 0 && if (currentArg.find("--build-config-sample", 0) == 0 &&
idx < allArgs.size() - 1) idx < allArgs.size() - 1) {
{
idx++; idx++;
this->ConfigSample = allArgs[idx]; this->ConfigSample = allArgs[idx];
} }
if(currentArg.find("--build-noclean",0) == 0) if (currentArg.find("--build-noclean", 0) == 0) {
{
this->BuildNoClean = true; this->BuildNoClean = true;
} }
if(currentArg.find("--build-options",0) == 0) if (currentArg.find("--build-options", 0) == 0) {
{ while (idx + 1 < allArgs.size() && allArgs[idx + 1] != "--build-target" &&
while(idx+1 < allArgs.size() && allArgs[idx + 1] != "--test-command") {
allArgs[idx+1] != "--build-target" &&
allArgs[idx+1] != "--test-command")
{
++idx; ++idx;
this->BuildOptions.push_back(allArgs[idx]); this->BuildOptions.push_back(allArgs[idx]);
} }
} }
if(currentArg.find("--test-command",0) == 0 && idx < allArgs.size() - 1) if (currentArg.find("--test-command", 0) == 0 && idx < allArgs.size() - 1) {
{
++idx; ++idx;
this->TestCommand = allArgs[idx]; this->TestCommand = allArgs[idx];
while(idx+1 < allArgs.size()) while (idx + 1 < allArgs.size()) {
{
++idx; ++idx;
this->TestCommandArgs.push_back(allArgs[idx]); this->TestCommandArgs.push_back(allArgs[idx]);
} }
} }
return 1; return 1;
} }

View File

@ -13,7 +13,6 @@
#ifndef cmCTestBuildAndTestHandler_h #ifndef cmCTestBuildAndTestHandler_h
#define cmCTestBuildAndTestHandler_h #define cmCTestBuildAndTestHandler_h
#include "cmCTestGenericHandler.h" #include "cmCTestGenericHandler.h"
#include "cmListFileCache.h" #include "cmListFileCache.h"
@ -50,9 +49,8 @@ public:
protected: protected:
///! Run CMake and build a test and then run it as a single test. ///! Run CMake and build a test and then run it as a single test.
int RunCMakeAndTest(std::string* output); int RunCMakeAndTest(std::string* output);
int RunCMake(std::string* outstring, std::ostringstream &out, int RunCMake(std::string* outstring, std::ostringstream& out,
std::string &cmakeOutString, std::string& cmakeOutString, std::string& cwd, cmake* cm);
std::string &cwd, cmake *cm);
std::string Output; std::string Output;
@ -77,4 +75,3 @@ protected:
}; };
#endif #endif

View File

@ -17,7 +17,6 @@
#include "cmGlobalGenerator.h" #include "cmGlobalGenerator.h"
#include "cmake.h" #include "cmake.h"
cmCTestBuildCommand::cmCTestBuildCommand() cmCTestBuildCommand::cmCTestBuildCommand()
{ {
this->GlobalGenerator = 0; this->GlobalGenerator = 0;
@ -33,8 +32,7 @@ cmCTestBuildCommand::cmCTestBuildCommand()
cmCTestBuildCommand::~cmCTestBuildCommand() cmCTestBuildCommand::~cmCTestBuildCommand()
{ {
if ( this->GlobalGenerator ) if (this->GlobalGenerator) {
{
delete this->GlobalGenerator; delete this->GlobalGenerator;
this->GlobalGenerator = 0; this->GlobalGenerator = 0;
} }
@ -42,28 +40,23 @@ cmCTestBuildCommand::~cmCTestBuildCommand()
cmCTestGenericHandler* cmCTestBuildCommand::InitializeHandler() cmCTestGenericHandler* cmCTestBuildCommand::InitializeHandler()
{ {
cmCTestGenericHandler* handler cmCTestGenericHandler* handler = this->CTest->GetInitializedHandler("build");
= this->CTest->GetInitializedHandler("build"); if (!handler) {
if ( !handler )
{
this->SetError("internal CTest error. Cannot instantiate build handler"); this->SetError("internal CTest error. Cannot instantiate build handler");
return 0; return 0;
} }
this->Handler = (cmCTestBuildHandler*)handler; this->Handler = (cmCTestBuildHandler*)handler;
const char* ctestBuildCommand const char* ctestBuildCommand =
= this->Makefile->GetDefinition("CTEST_BUILD_COMMAND"); this->Makefile->GetDefinition("CTEST_BUILD_COMMAND");
if ( ctestBuildCommand && *ctestBuildCommand ) if (ctestBuildCommand && *ctestBuildCommand) {
{
this->CTest->SetCTestConfiguration("MakeCommand", ctestBuildCommand, this->CTest->SetCTestConfiguration("MakeCommand", ctestBuildCommand,
this->Quiet); this->Quiet);
} } else {
else const char* cmakeGeneratorName =
{ this->Makefile->GetDefinition("CTEST_CMAKE_GENERATOR");
const char* cmakeGeneratorName const char* cmakeProjectName =
= this->Makefile->GetDefinition("CTEST_CMAKE_GENERATOR"); (this->Values[ctb_PROJECT_NAME] && *this->Values[ctb_PROJECT_NAME])
const char* cmakeProjectName
= (this->Values[ctb_PROJECT_NAME] && *this->Values[ctb_PROJECT_NAME])
? this->Values[ctb_PROJECT_NAME] ? this->Values[ctb_PROJECT_NAME]
: this->Makefile->GetDefinition("CTEST_PROJECT_NAME"); : this->Makefile->GetDefinition("CTEST_PROJECT_NAME");
@ -72,46 +65,40 @@ cmCTestGenericHandler* cmCTestBuildCommand::InitializeHandler()
// CTEST_CONFIGURATION_TYPE script variable, or ctest -C command // CTEST_CONFIGURATION_TYPE script variable, or ctest -C command
// line argument... in that order. // line argument... in that order.
// //
const char* ctestBuildConfiguration const char* ctestBuildConfiguration =
= this->Makefile->GetDefinition("CTEST_BUILD_CONFIGURATION"); this->Makefile->GetDefinition("CTEST_BUILD_CONFIGURATION");
const char* cmakeBuildConfiguration const char* cmakeBuildConfiguration =
= (this->Values[ctb_CONFIGURATION] && *this->Values[ctb_CONFIGURATION]) (this->Values[ctb_CONFIGURATION] && *this->Values[ctb_CONFIGURATION])
? this->Values[ctb_CONFIGURATION] ? this->Values[ctb_CONFIGURATION]
: ((ctestBuildConfiguration && *ctestBuildConfiguration) : ((ctestBuildConfiguration && *ctestBuildConfiguration)
? ctestBuildConfiguration ? ctestBuildConfiguration
: this->CTest->GetConfigType().c_str()); : this->CTest->GetConfigType().c_str());
const char* cmakeBuildAdditionalFlags const char* cmakeBuildAdditionalFlags =
= (this->Values[ctb_FLAGS] && *this->Values[ctb_FLAGS]) (this->Values[ctb_FLAGS] && *this->Values[ctb_FLAGS])
? this->Values[ctb_FLAGS] ? this->Values[ctb_FLAGS]
: this->Makefile->GetDefinition("CTEST_BUILD_FLAGS"); : this->Makefile->GetDefinition("CTEST_BUILD_FLAGS");
const char* cmakeBuildTarget const char* cmakeBuildTarget =
= (this->Values[ctb_TARGET] && *this->Values[ctb_TARGET]) (this->Values[ctb_TARGET] && *this->Values[ctb_TARGET])
? this->Values[ctb_TARGET] ? this->Values[ctb_TARGET]
: this->Makefile->GetDefinition("CTEST_BUILD_TARGET"); : this->Makefile->GetDefinition("CTEST_BUILD_TARGET");
if ( cmakeGeneratorName && *cmakeGeneratorName && if (cmakeGeneratorName && *cmakeGeneratorName && cmakeProjectName &&
cmakeProjectName && *cmakeProjectName ) *cmakeProjectName) {
{ if (!cmakeBuildConfiguration) {
if ( !cmakeBuildConfiguration )
{
cmakeBuildConfiguration = "Release"; cmakeBuildConfiguration = "Release";
} }
if ( this->GlobalGenerator ) if (this->GlobalGenerator) {
{ if (this->GlobalGenerator->GetName() != cmakeGeneratorName) {
if ( this->GlobalGenerator->GetName() != cmakeGeneratorName )
{
delete this->GlobalGenerator; delete this->GlobalGenerator;
this->GlobalGenerator = 0; this->GlobalGenerator = 0;
} }
} }
if ( !this->GlobalGenerator ) if (!this->GlobalGenerator) {
{
this->GlobalGenerator = this->GlobalGenerator =
this->Makefile->GetCMakeInstance()->CreateGlobalGenerator( this->Makefile->GetCMakeInstance()->CreateGlobalGenerator(
cmakeGeneratorName); cmakeGeneratorName);
if(!this->GlobalGenerator) if (!this->GlobalGenerator) {
{
std::string e = "could not create generator named \""; std::string e = "could not create generator named \"";
e += cmakeGeneratorName; e += cmakeGeneratorName;
e += "\""; e += "\"";
@ -120,33 +107,29 @@ cmCTestGenericHandler* cmCTestBuildCommand::InitializeHandler()
return 0; return 0;
} }
} }
if(strlen(cmakeBuildConfiguration) == 0) if (strlen(cmakeBuildConfiguration) == 0) {
{
const char* config = 0; const char* config = 0;
#ifdef CMAKE_INTDIR #ifdef CMAKE_INTDIR
config = CMAKE_INTDIR; config = CMAKE_INTDIR;
#endif #endif
if(!config) if (!config) {
{
config = "Debug"; config = "Debug";
} }
cmakeBuildConfiguration = config; cmakeBuildConfiguration = config;
} }
std::string dir = this->CTest->GetCTestConfiguration("BuildDirectory"); std::string dir = this->CTest->GetCTestConfiguration("BuildDirectory");
std::string buildCommand std::string buildCommand =
= this->GlobalGenerator-> this->GlobalGenerator->GenerateCMakeBuildCommand(
GenerateCMakeBuildCommand(cmakeBuildTarget ? cmakeBuildTarget : "", cmakeBuildTarget ? cmakeBuildTarget : "", cmakeBuildConfiguration,
cmakeBuildConfiguration,
cmakeBuildAdditionalFlags ? cmakeBuildAdditionalFlags : "", cmakeBuildAdditionalFlags ? cmakeBuildAdditionalFlags : "",
this->Makefile->IgnoreErrorsCMP0061()); this->Makefile->IgnoreErrorsCMP0061());
cmCTestOptionalLog(this->CTest, HANDLER_VERBOSE_OUTPUT, cmCTestOptionalLog(this->CTest, HANDLER_VERBOSE_OUTPUT,
"SetMakeCommand:" << buildCommand << "\n", this->Quiet); "SetMakeCommand:" << buildCommand << "\n",
this->Quiet);
this->CTest->SetCTestConfiguration("MakeCommand", buildCommand.c_str(), this->CTest->SetCTestConfiguration("MakeCommand", buildCommand.c_str(),
this->Quiet); this->Quiet);
} } else {
else
{
std::ostringstream ostr; std::ostringstream ostr;
/* clang-format off */ /* clang-format off */
ostr << "has no project to build. If this is a " ostr << "has no project to build. If this is a "
@ -166,9 +149,8 @@ cmCTestGenericHandler* cmCTestBuildCommand::InitializeHandler()
} }
} }
if(const char* useLaunchers = if (const char* useLaunchers =
this->Makefile->GetDefinition("CTEST_USE_LAUNCHERS")) this->Makefile->GetDefinition("CTEST_USE_LAUNCHERS")) {
{
this->CTest->SetCTestConfiguration("UseLaunchers", useLaunchers, this->CTest->SetCTestConfiguration("UseLaunchers", useLaunchers,
this->Quiet); this->Quiet);
} }
@ -177,25 +159,22 @@ cmCTestGenericHandler* cmCTestBuildCommand::InitializeHandler()
return handler; return handler;
} }
bool cmCTestBuildCommand::InitialPass(std::vector<std::string> const& args, bool cmCTestBuildCommand::InitialPass(std::vector<std::string> const& args,
cmExecutionStatus &status) cmExecutionStatus& status)
{ {
bool ret = cmCTestHandlerCommand::InitialPass(args, status); bool ret = cmCTestHandlerCommand::InitialPass(args, status);
if ( this->Values[ctb_NUMBER_ERRORS] && *this->Values[ctb_NUMBER_ERRORS]) if (this->Values[ctb_NUMBER_ERRORS] && *this->Values[ctb_NUMBER_ERRORS]) {
{
std::ostringstream str; std::ostringstream str;
str << this->Handler->GetTotalErrors(); str << this->Handler->GetTotalErrors();
this->Makefile->AddDefinition( this->Makefile->AddDefinition(this->Values[ctb_NUMBER_ERRORS],
this->Values[ctb_NUMBER_ERRORS], str.str().c_str()); str.str().c_str());
} }
if ( this->Values[ctb_NUMBER_WARNINGS] if (this->Values[ctb_NUMBER_WARNINGS] &&
&& *this->Values[ctb_NUMBER_WARNINGS]) *this->Values[ctb_NUMBER_WARNINGS]) {
{
std::ostringstream str; std::ostringstream str;
str << this->Handler->GetTotalWarnings(); str << this->Handler->GetTotalWarnings();
this->Makefile->AddDefinition( this->Makefile->AddDefinition(this->Values[ctb_NUMBER_WARNINGS],
this->Values[ctb_NUMBER_WARNINGS], str.str().c_str()); str.str().c_str());
} }
return ret; return ret;
} }

View File

@ -25,7 +25,6 @@ class cmCTestBuildHandler;
class cmCTestBuildCommand : public cmCTestHandlerCommand class cmCTestBuildCommand : public cmCTestHandlerCommand
{ {
public: public:
cmCTestBuildCommand(); cmCTestBuildCommand();
~cmCTestBuildCommand(); ~cmCTestBuildCommand();
@ -43,10 +42,10 @@ public:
/** /**
* The name of the command as specified in CMakeList.txt. * The name of the command as specified in CMakeList.txt.
*/ */
virtual std::string GetName() const { return "ctest_build";} virtual std::string GetName() const { return "ctest_build"; }
virtual bool InitialPass(std::vector<std::string> const& args, virtual bool InitialPass(std::vector<std::string> const& args,
cmExecutionStatus &status); cmExecutionStatus& status);
cmTypeMacro(cmCTestBuildCommand, cmCTestHandlerCommand); cmTypeMacro(cmCTestBuildCommand, cmCTestHandlerCommand);
@ -54,7 +53,8 @@ public:
protected: protected:
cmCTestBuildHandler* Handler; cmCTestBuildHandler* Handler;
enum { enum
{
ctb_BUILD = ct_LAST, ctb_BUILD = ct_LAST,
ctb_NUMBER_ERRORS, ctb_NUMBER_ERRORS,
ctb_NUMBER_WARNINGS, ctb_NUMBER_WARNINGS,
@ -68,5 +68,4 @@ protected:
cmCTestGenericHandler* InitializeHandler(); cmCTestGenericHandler* InitializeHandler();
}; };
#endif #endif

File diff suppressed because it is too large Load Diff

View File

@ -40,26 +40,26 @@ public:
cmCTestBuildHandler(); cmCTestBuildHandler();
void PopulateCustomVectors(cmMakefile *mf); void PopulateCustomVectors(cmMakefile* mf);
/** /**
* Initialize handler * Initialize handler
*/ */
virtual void Initialize(); virtual void Initialize();
int GetTotalErrors() { return this->TotalErrors;} int GetTotalErrors() { return this->TotalErrors; }
int GetTotalWarnings() { return this->TotalWarnings;} int GetTotalWarnings() { return this->TotalWarnings; }
private: private:
std::string GetMakeCommand(); std::string GetMakeCommand();
//! Run command specialized for make and configure. Returns process status //! Run command specialized for make and configure. Returns process status
// and retVal is return value or exception. // and retVal is return value or exception.
int RunMakeCommand(const char* command, int RunMakeCommand(const char* command, int* retVal, const char* dir,
int* retVal, const char* dir, int timeout, int timeout, std::ostream& ofs);
std::ostream& ofs);
enum { enum
{
b_REGULAR_LINE, b_REGULAR_LINE,
b_WARNING_LINE, b_WARNING_LINE,
b_ERROR_LINE b_ERROR_LINE
@ -115,7 +115,8 @@ private:
typedef std::deque<char> t_BuildProcessingQueueType; typedef std::deque<char> t_BuildProcessingQueueType;
void ProcessBuffer(const char* data, int length, size_t& tick, void ProcessBuffer(const char* data, int length, size_t& tick,
size_t tick_len, std::ostream& ofs, t_BuildProcessingQueueType* queue); size_t tick_len, std::ostream& ofs,
t_BuildProcessingQueueType* queue);
int ProcessSingleLine(const char* data); int ProcessSingleLine(const char* data);
t_BuildProcessingQueueType BuildProcessingQueue; t_BuildProcessingQueueType BuildProcessingQueue;

View File

@ -18,7 +18,8 @@
#include <cmsys/FStream.hxx> #include <cmsys/FStream.hxx>
#include <cmsys/RegularExpression.hxx> #include <cmsys/RegularExpression.hxx>
cmCTestCVS::cmCTestCVS(cmCTest* ct, std::ostream& log): cmCTestVC(ct, log) cmCTestCVS::cmCTestCVS(cmCTest* ct, std::ostream& log)
: cmCTestVC(ct, log)
{ {
} }
@ -26,10 +27,11 @@ cmCTestCVS::~cmCTestCVS()
{ {
} }
class cmCTestCVS::UpdateParser: public cmCTestVC::LineParser class cmCTestCVS::UpdateParser : public cmCTestVC::LineParser
{ {
public: public:
UpdateParser(cmCTestCVS* cvs, const char* prefix): CVS(cvs) UpdateParser(cmCTestCVS* cvs, const char* prefix)
: CVS(cvs)
{ {
this->SetLog(&cvs->Log, prefix); this->SetLog(&cvs->Log, prefix);
// See "man cvs", section "update output". // See "man cvs", section "update output".
@ -42,6 +44,7 @@ public:
"cvs[^ ]* update: " "cvs[^ ]* update: "
"warning: `?([^']*)'? is not \\(any longer\\) pertinent"); "warning: `?([^']*)'? is not \\(any longer\\) pertinent");
} }
private: private:
cmCTestCVS* CVS; cmCTestCVS* CVS;
cmsys::RegularExpression RegexFileUpdated; cmsys::RegularExpression RegexFileUpdated;
@ -52,24 +55,15 @@ private:
virtual bool ProcessLine() virtual bool ProcessLine()
{ {
if(this->RegexFileUpdated.find(this->Line)) if (this->RegexFileUpdated.find(this->Line)) {
{
this->DoFile(PathUpdated, this->RegexFileUpdated.match(2)); this->DoFile(PathUpdated, this->RegexFileUpdated.match(2));
} } else if (this->RegexFileModified.find(this->Line)) {
else if(this->RegexFileModified.find(this->Line))
{
this->DoFile(PathModified, this->RegexFileModified.match(2)); this->DoFile(PathModified, this->RegexFileModified.match(2));
} } else if (this->RegexFileConflicting.find(this->Line)) {
else if(this->RegexFileConflicting.find(this->Line))
{
this->DoFile(PathConflicting, this->RegexFileConflicting.match(2)); this->DoFile(PathConflicting, this->RegexFileConflicting.match(2));
} } else if (this->RegexFileRemoved1.find(this->Line)) {
else if(this->RegexFileRemoved1.find(this->Line))
{
this->DoFile(PathUpdated, this->RegexFileRemoved1.match(1)); this->DoFile(PathUpdated, this->RegexFileRemoved1.match(1));
} } else if (this->RegexFileRemoved2.find(this->Line)) {
else if(this->RegexFileRemoved2.find(this->Line))
{
this->DoFile(PathUpdated, this->RegexFileRemoved2.match(1)); this->DoFile(PathUpdated, this->RegexFileRemoved2.match(1));
} }
return true; return true;
@ -87,19 +81,16 @@ bool cmCTestCVS::UpdateImpl()
{ {
// Get user-specified update options. // Get user-specified update options.
std::string opts = this->CTest->GetCTestConfiguration("UpdateOptions"); std::string opts = this->CTest->GetCTestConfiguration("UpdateOptions");
if(opts.empty()) if (opts.empty()) {
{
opts = this->CTest->GetCTestConfiguration("CVSUpdateOptions"); opts = this->CTest->GetCTestConfiguration("CVSUpdateOptions");
if(opts.empty()) if (opts.empty()) {
{
opts = "-dP"; opts = "-dP";
} }
} }
std::vector<std::string> args = cmSystemTools::ParseArguments(opts.c_str()); std::vector<std::string> args = cmSystemTools::ParseArguments(opts.c_str());
// Specify the start time for nightly testing. // Specify the start time for nightly testing.
if(this->CTest->GetTestModel() == cmCTest::NIGHTLY) if (this->CTest->GetTestModel() == cmCTest::NIGHTLY) {
{
args.push_back("-D" + this->GetNightlyTime() + " UTC"); args.push_back("-D" + this->GetNightlyTime() + " UTC");
} }
@ -108,9 +99,8 @@ bool cmCTestCVS::UpdateImpl()
cvs_update.push_back(this->CommandLineTool.c_str()); cvs_update.push_back(this->CommandLineTool.c_str());
cvs_update.push_back("-z3"); cvs_update.push_back("-z3");
cvs_update.push_back("update"); cvs_update.push_back("update");
for(std::vector<std::string>::const_iterator ai = args.begin(); for (std::vector<std::string>::const_iterator ai = args.begin();
ai != args.end(); ++ai) ai != args.end(); ++ai) {
{
cvs_update.push_back(ai->c_str()); cvs_update.push_back(ai->c_str());
} }
cvs_update.push_back(0); cvs_update.push_back(0);
@ -120,71 +110,65 @@ bool cmCTestCVS::UpdateImpl()
return this->RunUpdateCommand(&cvs_update[0], &out, &err); return this->RunUpdateCommand(&cvs_update[0], &out, &err);
} }
class cmCTestCVS::LogParser: public cmCTestVC::LineParser class cmCTestCVS::LogParser : public cmCTestVC::LineParser
{ {
public: public:
typedef cmCTestCVS::Revision Revision; typedef cmCTestCVS::Revision Revision;
LogParser(cmCTestCVS* cvs, const char* prefix, std::vector<Revision>& revs): LogParser(cmCTestCVS* cvs, const char* prefix, std::vector<Revision>& revs)
CVS(cvs), Revisions(revs), Section(SectionHeader) : CVS(cvs)
, Revisions(revs)
, Section(SectionHeader)
{ {
this->SetLog(&cvs->Log, prefix), this->SetLog(&cvs->Log, prefix),
this->RegexRevision.compile("^revision +([^ ]*) *$"); this->RegexRevision.compile("^revision +([^ ]*) *$");
this->RegexBranches.compile("^branches: .*$"); this->RegexBranches.compile("^branches: .*$");
this->RegexPerson.compile("^date: +([^;]+); +author: +([^;]+);"); this->RegexPerson.compile("^date: +([^;]+); +author: +([^;]+);");
} }
private: private:
cmCTestCVS* CVS; cmCTestCVS* CVS;
std::vector<Revision>& Revisions; std::vector<Revision>& Revisions;
cmsys::RegularExpression RegexRevision; cmsys::RegularExpression RegexRevision;
cmsys::RegularExpression RegexBranches; cmsys::RegularExpression RegexBranches;
cmsys::RegularExpression RegexPerson; cmsys::RegularExpression RegexPerson;
enum SectionType { SectionHeader, SectionRevisions, SectionEnd }; enum SectionType
{
SectionHeader,
SectionRevisions,
SectionEnd
};
SectionType Section; SectionType Section;
Revision Rev; Revision Rev;
virtual bool ProcessLine() virtual bool ProcessLine()
{ {
if(this->Line == ("=======================================" if (this->Line == ("======================================="
"======================================")) "======================================")) {
{
// This line ends the revision list. // This line ends the revision list.
if(this->Section == SectionRevisions) if (this->Section == SectionRevisions) {
{
this->FinishRevision(); this->FinishRevision();
} }
this->Section = SectionEnd; this->Section = SectionEnd;
} } else if (this->Line == "----------------------------") {
else if(this->Line == "----------------------------")
{
// This line divides revisions from the header and each other. // This line divides revisions from the header and each other.
if(this->Section == SectionHeader) if (this->Section == SectionHeader) {
{
this->Section = SectionRevisions; this->Section = SectionRevisions;
} } else if (this->Section == SectionRevisions) {
else if(this->Section == SectionRevisions)
{
this->FinishRevision(); this->FinishRevision();
} }
} } else if (this->Section == SectionRevisions) {
else if(this->Section == SectionRevisions) if (!this->Rev.Log.empty()) {
{
if(!this->Rev.Log.empty())
{
// Continue the existing log. // Continue the existing log.
this->Rev.Log += this->Line; this->Rev.Log += this->Line;
this->Rev.Log += "\n"; this->Rev.Log += "\n";
} } else if (this->Rev.Rev.empty() &&
else if(this->Rev.Rev.empty() && this->RegexRevision.find(this->Line)) this->RegexRevision.find(this->Line)) {
{
this->Rev.Rev = this->RegexRevision.match(1); this->Rev.Rev = this->RegexRevision.match(1);
} } else if (this->Rev.Date.empty() &&
else if(this->Rev.Date.empty() && this->RegexPerson.find(this->Line)) this->RegexPerson.find(this->Line)) {
{
this->Rev.Date = this->RegexPerson.match(1); this->Rev.Date = this->RegexPerson.match(1);
this->Rev.Author = this->RegexPerson.match(2); this->Rev.Author = this->RegexPerson.match(2);
} } else if (!this->RegexBranches.find(this->Line)) {
else if(!this->RegexBranches.find(this->Line))
{
// Start the log. // Start the log.
this->Rev.Log += this->Line; this->Rev.Log += this->Line;
this->Rev.Log += "\n"; this->Rev.Log += "\n";
@ -195,8 +179,7 @@ private:
void FinishRevision() void FinishRevision()
{ {
if(!this->Rev.Rev.empty()) if (!this->Rev.Rev.empty()) {
{
// Record this revision. // Record this revision.
/* clang-format off */ /* clang-format off */
this->CVS->Log << "Found revision " << this->Rev.Rev << "\n" this->CVS->Log << "Found revision " << this->Rev.Rev << "\n"
@ -206,8 +189,7 @@ private:
this->Revisions.push_back(this->Rev); this->Revisions.push_back(this->Rev);
// We only need two revisions. // We only need two revisions.
if(this->Revisions.size() >= 2) if (this->Revisions.size() >= 2) {
{
this->Section = SectionEnd; this->Section = SectionEnd;
} }
} }
@ -219,8 +201,7 @@ std::string cmCTestCVS::ComputeBranchFlag(std::string const& dir)
{ {
// Compute the tag file location for this directory. // Compute the tag file location for this directory.
std::string tagFile = this->SourceDirectory; std::string tagFile = this->SourceDirectory;
if(!dir.empty()) if (!dir.empty()) {
{
tagFile += "/"; tagFile += "/";
tagFile += dir; tagFile += dir;
} }
@ -229,42 +210,36 @@ std::string cmCTestCVS::ComputeBranchFlag(std::string const& dir)
// Lookup the branch in the tag file, if any. // Lookup the branch in the tag file, if any.
std::string tagLine; std::string tagLine;
cmsys::ifstream tagStream(tagFile.c_str()); cmsys::ifstream tagStream(tagFile.c_str());
if(tagStream && cmSystemTools::GetLineFromStream(tagStream, tagLine) && if (tagStream && cmSystemTools::GetLineFromStream(tagStream, tagLine) &&
tagLine.size() > 1 && tagLine[0] == 'T') tagLine.size() > 1 && tagLine[0] == 'T') {
{
// Use the branch specified in the tag file. // Use the branch specified in the tag file.
std::string flag = "-r"; std::string flag = "-r";
flag += tagLine.substr(1); flag += tagLine.substr(1);
return flag; return flag;
} } else {
else
{
// Use the default branch. // Use the default branch.
return "-b"; return "-b";
} }
} }
void cmCTestCVS::LoadRevisions(std::string const& file, void cmCTestCVS::LoadRevisions(std::string const& file, const char* branchFlag,
const char* branchFlag,
std::vector<Revision>& revisions) std::vector<Revision>& revisions)
{ {
cmCTestLog(this->CTest, HANDLER_OUTPUT, "." << std::flush); cmCTestLog(this->CTest, HANDLER_OUTPUT, "." << std::flush);
// Run "cvs log" to get revisions of this file on this branch. // Run "cvs log" to get revisions of this file on this branch.
const char* cvs = this->CommandLineTool.c_str(); const char* cvs = this->CommandLineTool.c_str();
const char* cvs_log[] = const char* cvs_log[] = { cvs, "log", "-N", branchFlag, file.c_str(), 0 };
{cvs, "log", "-N", branchFlag, file.c_str(), 0};
LogParser out(this, "log-out> ", revisions); LogParser out(this, "log-out> ", revisions);
OutputLogger err(this->Log, "log-err> "); OutputLogger err(this->Log, "log-err> ");
this->RunChild(cvs_log, &out, &err); this->RunChild(cvs_log, &out, &err);
} }
void cmCTestCVS::WriteXMLDirectory(cmXMLWriter& xml, void cmCTestCVS::WriteXMLDirectory(cmXMLWriter& xml, std::string const& path,
std::string const& path,
Directory const& dir) Directory const& dir)
{ {
const char* slash = path.empty()? "":"/"; const char* slash = path.empty() ? "" : "/";
xml.StartElement("Directory"); xml.StartElement("Directory");
xml.Element("Name", path); xml.Element("Name", path);
@ -273,14 +248,12 @@ void cmCTestCVS::WriteXMLDirectory(cmXMLWriter& xml,
// Load revisions and write an entry for each file in this directory. // Load revisions and write an entry for each file in this directory.
std::vector<Revision> revisions; std::vector<Revision> revisions;
for(Directory::const_iterator fi = dir.begin(); fi != dir.end(); ++fi) for (Directory::const_iterator fi = dir.begin(); fi != dir.end(); ++fi) {
{
std::string full = path + slash + fi->first; std::string full = path + slash + fi->first;
// Load two real or unknown revisions. // Load two real or unknown revisions.
revisions.clear(); revisions.clear();
if(fi->second != PathUpdated) if (fi->second != PathUpdated) {
{
// For local modifications the current rev is unknown and the // For local modifications the current rev is unknown and the
// prior rev is the latest from cvs. // prior rev is the latest from cvs.
revisions.push_back(this->Unknown); revisions.push_back(this->Unknown);
@ -299,11 +272,12 @@ bool cmCTestCVS::WriteXMLUpdates(cmXMLWriter& xml)
{ {
cmCTestLog(this->CTest, HANDLER_OUTPUT, cmCTestLog(this->CTest, HANDLER_OUTPUT,
" Gathering version information (one . per updated file):\n" " Gathering version information (one . per updated file):\n"
" " << std::flush); " "
<< std::flush);
for(std::map<std::string, Directory>::const_iterator for (std::map<std::string, Directory>::const_iterator di =
di = this->Dirs.begin(); di != this->Dirs.end(); ++di) this->Dirs.begin();
{ di != this->Dirs.end(); ++di) {
this->WriteXMLDirectory(xml, di->first, di->second); this->WriteXMLDirectory(xml, di->first, di->second);
} }

View File

@ -18,7 +18,7 @@
* \brief Interaction with cvs command-line tool * \brief Interaction with cvs command-line tool
* *
*/ */
class cmCTestCVS: public cmCTestVC class cmCTestCVS : public cmCTestVC
{ {
public: public:
/** Construct with a CTest instance and update log stream. */ /** Construct with a CTest instance and update log stream. */
@ -32,7 +32,9 @@ private:
virtual bool WriteXMLUpdates(cmXMLWriter& xml); virtual bool WriteXMLUpdates(cmXMLWriter& xml);
// Update status for files in each directory. // Update status for files in each directory.
class Directory: public std::map<std::string, PathStatus> {}; class Directory : public std::map<std::string, PathStatus>
{
};
std::map<std::string, Directory> Dirs; std::map<std::string, Directory> Dirs;
std::string ComputeBranchFlag(std::string const& dir); std::string ComputeBranchFlag(std::string const& dir);

View File

@ -27,14 +27,16 @@ class cmCTestScriptHandler;
class cmCTestCommand : public cmCommand class cmCTestCommand : public cmCommand
{ {
public: public:
cmCTestCommand()
{
this->CTest = 0;
this->CTestScriptHandler = 0;
}
cmCTestCommand() {this->CTest = 0; this->CTestScriptHandler = 0;} cmCTest* CTest;
cmCTestScriptHandler* CTestScriptHandler;
cmCTest *CTest;
cmCTestScriptHandler *CTestScriptHandler;
cmTypeMacro(cmCTestCommand, cmCommand); cmTypeMacro(cmCTestCommand, cmCommand);
}; };
#endif #endif

View File

@ -26,49 +26,42 @@ cmCTestGenericHandler* cmCTestConfigureCommand::InitializeHandler()
{ {
std::vector<std::string> options; std::vector<std::string> options;
if (this->Values[ctc_OPTIONS]) if (this->Values[ctc_OPTIONS]) {
{
cmSystemTools::ExpandListArgument(this->Values[ctc_OPTIONS], options); cmSystemTools::ExpandListArgument(this->Values[ctc_OPTIONS], options);
} }
if ( this->CTest->GetCTestConfiguration("BuildDirectory").empty() ) if (this->CTest->GetCTestConfiguration("BuildDirectory").empty()) {
{ this->SetError(
this->SetError("Build directory not specified. Either use BUILD " "Build directory not specified. Either use BUILD "
"argument to CTEST_CONFIGURE command or set CTEST_BINARY_DIRECTORY " "argument to CTEST_CONFIGURE command or set CTEST_BINARY_DIRECTORY "
"variable"); "variable");
return 0; return 0;
} }
const char* ctestConfigureCommand const char* ctestConfigureCommand =
= this->Makefile->GetDefinition("CTEST_CONFIGURE_COMMAND"); this->Makefile->GetDefinition("CTEST_CONFIGURE_COMMAND");
if ( ctestConfigureCommand && *ctestConfigureCommand ) if (ctestConfigureCommand && *ctestConfigureCommand) {
{
this->CTest->SetCTestConfiguration("ConfigureCommand", this->CTest->SetCTestConfiguration("ConfigureCommand",
ctestConfigureCommand, this->Quiet); ctestConfigureCommand, this->Quiet);
} } else {
else const char* cmakeGeneratorName =
{ this->Makefile->GetDefinition("CTEST_CMAKE_GENERATOR");
const char* cmakeGeneratorName if (cmakeGeneratorName && *cmakeGeneratorName) {
= this->Makefile->GetDefinition("CTEST_CMAKE_GENERATOR"); const std::string& source_dir =
if ( cmakeGeneratorName && *cmakeGeneratorName ) this->CTest->GetCTestConfiguration("SourceDirectory");
{ if (source_dir.empty()) {
const std::string& source_dir this->SetError(
= this->CTest->GetCTestConfiguration("SourceDirectory"); "Source directory not specified. Either use SOURCE "
if ( source_dir.empty() )
{
this->SetError("Source directory not specified. Either use SOURCE "
"argument to CTEST_CONFIGURE command or set CTEST_SOURCE_DIRECTORY " "argument to CTEST_CONFIGURE command or set CTEST_SOURCE_DIRECTORY "
"variable"); "variable");
return 0; return 0;
} }
const std::string cmakelists_file = source_dir + "/CMakeLists.txt"; const std::string cmakelists_file = source_dir + "/CMakeLists.txt";
if ( !cmSystemTools::FileExists(cmakelists_file.c_str()) ) if (!cmSystemTools::FileExists(cmakelists_file.c_str())) {
{
std::ostringstream e; std::ostringstream e;
e << "CMakeLists.txt file does not exist [" e << "CMakeLists.txt file does not exist [" << cmakelists_file << "]";
<< cmakelists_file << "]";
this->SetError(e.str()); this->SetError(e.str());
return 0; return 0;
} }
@ -76,11 +69,10 @@ cmCTestGenericHandler* cmCTestConfigureCommand::InitializeHandler()
bool multiConfig = false; bool multiConfig = false;
bool cmakeBuildTypeInOptions = false; bool cmakeBuildTypeInOptions = false;
cmGlobalGenerator *gg = cmGlobalGenerator* gg =
this->Makefile->GetCMakeInstance()->CreateGlobalGenerator( this->Makefile->GetCMakeInstance()->CreateGlobalGenerator(
cmakeGeneratorName); cmakeGeneratorName);
if(gg) if (gg) {
{
multiConfig = gg->IsMultiConfig(); multiConfig = gg->IsMultiConfig();
delete gg; delete gg;
} }
@ -91,8 +83,7 @@ cmCTestGenericHandler* cmCTestConfigureCommand::InitializeHandler()
std::vector<std::string>::const_iterator it; std::vector<std::string>::const_iterator it;
std::string option; std::string option;
for (it= options.begin(); it!=options.end(); ++it) for (it = options.begin(); it != options.end(); ++it) {
{
option = *it; option = *it;
cmakeConfigureCommand += " \""; cmakeConfigureCommand += " \"";
@ -100,15 +91,13 @@ cmCTestGenericHandler* cmCTestConfigureCommand::InitializeHandler()
cmakeConfigureCommand += "\""; cmakeConfigureCommand += "\"";
if ((0 != strstr(option.c_str(), "CMAKE_BUILD_TYPE=")) || if ((0 != strstr(option.c_str(), "CMAKE_BUILD_TYPE=")) ||
(0 != strstr(option.c_str(), "CMAKE_BUILD_TYPE:STRING="))) (0 != strstr(option.c_str(), "CMAKE_BUILD_TYPE:STRING="))) {
{
cmakeBuildTypeInOptions = true; cmakeBuildTypeInOptions = true;
} }
} }
if (!multiConfig && !cmakeBuildTypeInOptions && if (!multiConfig && !cmakeBuildTypeInOptions &&
!this->CTest->GetConfigType().empty()) !this->CTest->GetConfigType().empty()) {
{
cmakeConfigureCommand += " \"-DCMAKE_BUILD_TYPE:STRING="; cmakeConfigureCommand += " \"-DCMAKE_BUILD_TYPE:STRING=";
cmakeConfigureCommand += this->CTest->GetConfigType(); cmakeConfigureCommand += this->CTest->GetConfigType();
cmakeConfigureCommand += "\""; cmakeConfigureCommand += "\"";
@ -120,8 +109,7 @@ cmCTestGenericHandler* cmCTestConfigureCommand::InitializeHandler()
const char* cmakeGeneratorPlatform = const char* cmakeGeneratorPlatform =
this->Makefile->GetDefinition("CTEST_CMAKE_GENERATOR_PLATFORM"); this->Makefile->GetDefinition("CTEST_CMAKE_GENERATOR_PLATFORM");
if(cmakeGeneratorPlatform && *cmakeGeneratorPlatform) if (cmakeGeneratorPlatform && *cmakeGeneratorPlatform) {
{
cmakeConfigureCommand += " \"-A"; cmakeConfigureCommand += " \"-A";
cmakeConfigureCommand += cmakeGeneratorPlatform; cmakeConfigureCommand += cmakeGeneratorPlatform;
cmakeConfigureCommand += "\""; cmakeConfigureCommand += "\"";
@ -129,8 +117,7 @@ cmCTestGenericHandler* cmCTestConfigureCommand::InitializeHandler()
const char* cmakeGeneratorToolset = const char* cmakeGeneratorToolset =
this->Makefile->GetDefinition("CTEST_CMAKE_GENERATOR_TOOLSET"); this->Makefile->GetDefinition("CTEST_CMAKE_GENERATOR_TOOLSET");
if(cmakeGeneratorToolset && *cmakeGeneratorToolset) if (cmakeGeneratorToolset && *cmakeGeneratorToolset) {
{
cmakeConfigureCommand += " \"-T"; cmakeConfigureCommand += " \"-T";
cmakeConfigureCommand += cmakeGeneratorToolset; cmakeConfigureCommand += cmakeGeneratorToolset;
cmakeConfigureCommand += "\""; cmakeConfigureCommand += "\"";
@ -140,22 +127,20 @@ cmCTestGenericHandler* cmCTestConfigureCommand::InitializeHandler()
cmakeConfigureCommand += source_dir; cmakeConfigureCommand += source_dir;
cmakeConfigureCommand += "\""; cmakeConfigureCommand += "\"";
this->CTest->SetCTestConfiguration("ConfigureCommand", this->CTest->SetCTestConfiguration(
cmakeConfigureCommand.c_str(), this->Quiet); "ConfigureCommand", cmakeConfigureCommand.c_str(), this->Quiet);
} } else {
else this->SetError(
{ "Configure command is not specified. If this is a "
this->SetError("Configure command is not specified. If this is a "
"\"built with CMake\" project, set CTEST_CMAKE_GENERATOR. If not, " "\"built with CMake\" project, set CTEST_CMAKE_GENERATOR. If not, "
"set CTEST_CONFIGURE_COMMAND."); "set CTEST_CONFIGURE_COMMAND.");
return 0; return 0;
} }
} }
cmCTestGenericHandler* handler cmCTestGenericHandler* handler =
= this->CTest->GetInitializedHandler("configure"); this->CTest->GetInitializedHandler("configure");
if ( !handler ) if (!handler) {
{
this->SetError( this->SetError(
"internal CTest error. Cannot instantiate configure handler"); "internal CTest error. Cannot instantiate configure handler");
return 0; return 0;

View File

@ -38,19 +38,19 @@ public:
/** /**
* The name of the command as specified in CMakeList.txt. * The name of the command as specified in CMakeList.txt.
*/ */
virtual std::string GetName() const { return "ctest_configure";} virtual std::string GetName() const { return "ctest_configure"; }
cmTypeMacro(cmCTestConfigureCommand, cmCTestHandlerCommand); cmTypeMacro(cmCTestConfigureCommand, cmCTestHandlerCommand);
protected: protected:
cmCTestGenericHandler* InitializeHandler(); cmCTestGenericHandler* InitializeHandler();
enum { enum
{
ctc_FIRST = ct_LAST, ctc_FIRST = ct_LAST,
ctc_OPTIONS, ctc_OPTIONS,
ctc_LAST ctc_LAST
}; };
}; };
#endif #endif

View File

@ -18,7 +18,6 @@
#include "cmake.h" #include "cmake.h"
#include <cmsys/Process.h> #include <cmsys/Process.h>
cmCTestConfigureHandler::cmCTestConfigureHandler() cmCTestConfigureHandler::cmCTestConfigureHandler()
{ {
} }
@ -28,26 +27,24 @@ void cmCTestConfigureHandler::Initialize()
this->Superclass::Initialize(); this->Superclass::Initialize();
} }
//clearly it would be nice if this were broken up into a few smaller // clearly it would be nice if this were broken up into a few smaller
//functions and commented... // functions and commented...
int cmCTestConfigureHandler::ProcessHandler() int cmCTestConfigureHandler::ProcessHandler()
{ {
cmCTestOptionalLog(this->CTest, HANDLER_OUTPUT, cmCTestOptionalLog(this->CTest, HANDLER_OUTPUT,
"Configure project" << std::endl, this->Quiet); "Configure project" << std::endl, this->Quiet);
std::string cCommand std::string cCommand =
= this->CTest->GetCTestConfiguration("ConfigureCommand"); this->CTest->GetCTestConfiguration("ConfigureCommand");
if (cCommand.empty()) if (cCommand.empty()) {
{
cmCTestLog(this->CTest, ERROR_MESSAGE, cmCTestLog(this->CTest, ERROR_MESSAGE,
"Cannot find ConfigureCommand key in the DartConfiguration.tcl" "Cannot find ConfigureCommand key in the DartConfiguration.tcl"
<< std::endl); << std::endl);
return -1; return -1;
} }
std::string buildDirectory std::string buildDirectory =
= this->CTest->GetCTestConfiguration("BuildDirectory"); this->CTest->GetCTestConfiguration("BuildDirectory");
if (buildDirectory.empty()) if (buildDirectory.empty()) {
{
cmCTestLog(this->CTest, ERROR_MESSAGE, cmCTestLog(this->CTest, ERROR_MESSAGE,
"Cannot find BuildDirectory key in the DartConfiguration.tcl" "Cannot find BuildDirectory key in the DartConfiguration.tcl"
<< std::endl); << std::endl);
@ -58,34 +55,30 @@ int cmCTestConfigureHandler::ProcessHandler()
std::string output; std::string output;
int retVal = 0; int retVal = 0;
int res = 0; int res = 0;
if ( !this->CTest->GetShowOnly() ) if (!this->CTest->GetShowOnly()) {
{
cmGeneratedFileStream os; cmGeneratedFileStream os;
if(!this->StartResultingXML(cmCTest::PartConfigure, "Configure", os)) if (!this->StartResultingXML(cmCTest::PartConfigure, "Configure", os)) {
{
cmCTestLog(this->CTest, ERROR_MESSAGE, "Cannot open configure file" cmCTestLog(this->CTest, ERROR_MESSAGE, "Cannot open configure file"
<< std::endl); << std::endl);
return 1; return 1;
} }
std::string start_time = this->CTest->CurrentTime(); std::string start_time = this->CTest->CurrentTime();
unsigned int start_time_time = static_cast<unsigned int>( unsigned int start_time_time =
cmSystemTools::GetTime()); static_cast<unsigned int>(cmSystemTools::GetTime());
cmGeneratedFileStream ofs; cmGeneratedFileStream ofs;
this->StartLogFile("Configure", ofs); this->StartLogFile("Configure", ofs);
cmCTestOptionalLog(this->CTest, HANDLER_VERBOSE_OUTPUT, cmCTestOptionalLog(this->CTest, HANDLER_VERBOSE_OUTPUT,
"Configure with command: " << cCommand << std::endl, this->Quiet); "Configure with command: " << cCommand << std::endl,
res = this->CTest->RunMakeCommand(cCommand.c_str(), output, this->Quiet);
&retVal, buildDirectory.c_str(), res = this->CTest->RunMakeCommand(cCommand.c_str(), output, &retVal,
0, ofs); buildDirectory.c_str(), 0, ofs);
if ( ofs ) if (ofs) {
{
ofs.close(); ofs.close();
} }
if ( os ) if (os) {
{
cmXMLWriter xml(os); cmXMLWriter xml(os);
this->CTest->StartXML(xml, this->AppendXML); this->CTest->StartXML(xml, this->AppendXML);
xml.StartElement("Configure"); xml.StartElement("Configure");
@ -98,19 +91,19 @@ int cmCTestConfigureHandler::ProcessHandler()
xml.Element("EndDateTime", this->CTest->CurrentTime()); xml.Element("EndDateTime", this->CTest->CurrentTime());
xml.Element("EndConfigureTime", xml.Element("EndConfigureTime",
static_cast<unsigned int>(cmSystemTools::GetTime())); static_cast<unsigned int>(cmSystemTools::GetTime()));
xml.Element("ElapsedMinutes", static_cast<int>( xml.Element(
(cmSystemTools::GetTime() - elapsed_time_start)/6)/10.0); "ElapsedMinutes",
static_cast<int>((cmSystemTools::GetTime() - elapsed_time_start) / 6) /
10.0);
xml.EndElement(); // Configure xml.EndElement(); // Configure
this->CTest->EndXML(xml); this->CTest->EndXML(xml);
} }
} } else {
else
{
cmCTestOptionalLog(this->CTest, DEBUG, cmCTestOptionalLog(this->CTest, DEBUG,
"Configure with command: " << cCommand << std::endl, this->Quiet); "Configure with command: " << cCommand << std::endl,
this->Quiet);
} }
if (! res || retVal ) if (!res || retVal) {
{
cmCTestLog(this->CTest, ERROR_MESSAGE, cmCTestLog(this->CTest, ERROR_MESSAGE,
"Error(s) when configuring the project" << std::endl); "Error(s) when configuring the project" << std::endl);
return -1; return -1;

View File

@ -21,21 +21,20 @@ cmCTestCoverageCommand::cmCTestCoverageCommand()
cmCTestGenericHandler* cmCTestCoverageCommand::InitializeHandler() cmCTestGenericHandler* cmCTestCoverageCommand::InitializeHandler()
{ {
this->CTest->SetCTestConfigurationFromCMakeVariable(this->Makefile, this->CTest->SetCTestConfigurationFromCMakeVariable(
"CoverageCommand", "CTEST_COVERAGE_COMMAND", this->Quiet); this->Makefile, "CoverageCommand", "CTEST_COVERAGE_COMMAND", this->Quiet);
this->CTest->SetCTestConfigurationFromCMakeVariable(this->Makefile, this->CTest->SetCTestConfigurationFromCMakeVariable(
"CoverageExtraFlags", "CTEST_COVERAGE_EXTRA_FLAGS", this->Quiet); this->Makefile, "CoverageExtraFlags", "CTEST_COVERAGE_EXTRA_FLAGS",
this->Quiet);
cmCTestCoverageHandler* handler = static_cast<cmCTestCoverageHandler*>( cmCTestCoverageHandler* handler = static_cast<cmCTestCoverageHandler*>(
this->CTest->GetInitializedHandler("coverage")); this->CTest->GetInitializedHandler("coverage"));
if ( !handler ) if (!handler) {
{
this->SetError("internal CTest error. Cannot instantiate test handler"); this->SetError("internal CTest error. Cannot instantiate test handler");
return 0; return 0;
} }
// If a LABELS option was given, select only files with the labels. // If a LABELS option was given, select only files with the labels.
if(this->LabelsMentioned) if (this->LabelsMentioned) {
{
handler->SetLabelFilter(this->Labels); handler->SetLabelFilter(this->Labels);
} }
@ -46,8 +45,7 @@ cmCTestGenericHandler* cmCTestCoverageCommand::InitializeHandler()
bool cmCTestCoverageCommand::CheckArgumentKeyword(std::string const& arg) bool cmCTestCoverageCommand::CheckArgumentKeyword(std::string const& arg)
{ {
// Look for arguments specific to this command. // Look for arguments specific to this command.
if(arg == "LABELS") if (arg == "LABELS") {
{
this->ArgumentDoing = ArgumentDoingLabels; this->ArgumentDoing = ArgumentDoingLabels;
this->LabelsMentioned = true; this->LabelsMentioned = true;
return true; return true;
@ -60,8 +58,7 @@ bool cmCTestCoverageCommand::CheckArgumentKeyword(std::string const& arg)
bool cmCTestCoverageCommand::CheckArgumentValue(std::string const& arg) bool cmCTestCoverageCommand::CheckArgumentValue(std::string const& arg)
{ {
// Handle states specific to this command. // Handle states specific to this command.
if(this->ArgumentDoing == ArgumentDoingLabels) if (this->ArgumentDoing == ArgumentDoingLabels) {
{
this->Labels.insert(arg); this->Labels.insert(arg);
return true; return true;
} }

View File

@ -22,7 +22,6 @@
class cmCTestCoverageCommand : public cmCTestHandlerCommand class cmCTestCoverageCommand : public cmCTestHandlerCommand
{ {
public: public:
cmCTestCoverageCommand(); cmCTestCoverageCommand();
/** /**
@ -39,7 +38,7 @@ public:
/** /**
* The name of the command as specified in CMakeList.txt. * The name of the command as specified in CMakeList.txt.
*/ */
virtual std::string GetName() const { return "ctest_coverage";} virtual std::string GetName() const { return "ctest_coverage"; }
cmTypeMacro(cmCTestCoverageCommand, cmCTestHandlerCommand); cmTypeMacro(cmCTestCoverageCommand, cmCTestHandlerCommand);
@ -59,6 +58,4 @@ protected:
std::set<std::string> Labels; std::set<std::string> Labels;
}; };
#endif #endif

File diff suppressed because it is too large Load Diff

View File

@ -54,7 +54,7 @@ public:
/** /**
* This method is called when reading CTest custom file * This method is called when reading CTest custom file
*/ */
void PopulateCustomVectors(cmMakefile *mf); void PopulateCustomVectors(cmMakefile* mf);
/** Report coverage only for sources with these labels. */ /** Report coverage only for sources with these labels. */
void SetLabelFilter(std::set<std::string> const& labels); void SetLabelFilter(std::set<std::string> const& labels);
@ -95,7 +95,7 @@ private:
//! Handle coverage for Jacoco //! Handle coverage for Jacoco
int HandleBlanketJSCoverage(cmCTestCoverageHandlerContainer* cont); int HandleBlanketJSCoverage(cmCTestCoverageHandlerContainer* cont);
//! Handle coverage using Bullseye //! Handle coverage using Bullseye
int HandleBullseyeCoverage(cmCTestCoverageHandlerContainer* cont); int HandleBullseyeCoverage(cmCTestCoverageHandlerContainer* cont);
int RunBullseyeSourceSummary(cmCTestCoverageHandlerContainer* cont); int RunBullseyeSourceSummary(cmCTestCoverageHandlerContainer* cont);
int RunBullseyeCoverageBranch(cmCTestCoverageHandlerContainer* cont, int RunBullseyeCoverageBranch(cmCTestCoverageHandlerContainer* cont,
@ -103,22 +103,15 @@ private:
std::vector<std::string>& files, std::vector<std::string>& files,
std::vector<std::string>& filesFullPath); std::vector<std::string>& filesFullPath);
int RunBullseyeCommand( int RunBullseyeCommand(cmCTestCoverageHandlerContainer* cont,
cmCTestCoverageHandlerContainer* cont, const char* cmd, const char* arg,
const char* cmd,
const char* arg,
std::string& outputFile); std::string& outputFile);
bool ParseBullsEyeCovsrcLine( bool ParseBullsEyeCovsrcLine(std::string const& inputLine,
std::string const& inputLine, std::string& sourceFile, int& functionsCalled,
std::string& sourceFile, int& totalFunctions, int& percentFunction,
int& functionsCalled, int& branchCovered, int& totalBranches,
int& totalFunctions,
int& percentFunction,
int& branchCovered,
int& totalBranches,
int& percentBranch); int& percentBranch);
bool GetNextInt(std::string const& inputLine, bool GetNextInt(std::string const& inputLine, std::string::size_type& pos,
std::string::size_type& pos,
int& value); int& value);
//! Handle Python coverage using Python's Trace.py //! Handle Python coverage using Python's Trace.py
int HandleTracePyCoverage(cmCTestCoverageHandlerContainer* cont); int HandleTracePyCoverage(cmCTestCoverageHandlerContainer* cont);
@ -134,9 +127,10 @@ private:
std::vector<cmsys::RegularExpression> CustomCoverageExcludeRegex; std::vector<cmsys::RegularExpression> CustomCoverageExcludeRegex;
std::vector<std::string> ExtraCoverageGlobs; std::vector<std::string> ExtraCoverageGlobs;
// Map from source file to label ids. // Map from source file to label ids.
class LabelSet: public std::set<int> {}; class LabelSet : public std::set<int>
{
};
typedef std::map<std::string, LabelSet> LabelMapType; typedef std::map<std::string, LabelSet> LabelMapType;
LabelMapType SourceLabels; LabelMapType SourceLabels;
LabelMapType TargetDirs; LabelMapType TargetDirs;

View File

@ -42,45 +42,36 @@ std::string cmCTestCurl::Escape(std::string const& source)
return ret; return ret;
} }
namespace namespace {
{ static size_t curlWriteMemoryCallback(void* ptr, size_t size, size_t nmemb,
static size_t void* data)
curlWriteMemoryCallback(void *ptr, size_t size, size_t nmemb,
void *data)
{ {
int realsize = (int)(size * nmemb); int realsize = (int)(size * nmemb);
std::vector<char> *vec std::vector<char>* vec = static_cast<std::vector<char>*>(data);
= static_cast<std::vector<char>* >(data);
const char* chPtr = static_cast<char*>(ptr); const char* chPtr = static_cast<char*>(ptr);
vec->insert(vec->end(), chPtr, chPtr + realsize); vec->insert(vec->end(), chPtr, chPtr + realsize);
return realsize; return realsize;
} }
static size_t static size_t curlDebugCallback(CURL*, curl_infotype, char* chPtr, size_t size,
curlDebugCallback(CURL *, curl_infotype, char *chPtr, void* data)
size_t size, void *data)
{ {
std::vector<char> *vec std::vector<char>* vec = static_cast<std::vector<char>*>(data);
= static_cast<std::vector<char>* >(data);
vec->insert(vec->end(), chPtr, chPtr + size); vec->insert(vec->end(), chPtr, chPtr + size);
return size; return size;
} }
} }
void cmCTestCurl::SetCurlOptions(std::vector<std::string> const& args) void cmCTestCurl::SetCurlOptions(std::vector<std::string> const& args)
{ {
for( std::vector<std::string>::const_iterator i = args.begin(); for (std::vector<std::string>::const_iterator i = args.begin();
i != args.end(); ++i) i != args.end(); ++i) {
{ if (*i == "CURLOPT_SSL_VERIFYPEER_OFF") {
if(*i == "CURLOPT_SSL_VERIFYPEER_OFF")
{
this->VerifyPeerOff = true; this->VerifyPeerOff = true;
} }
if(*i == "CURLOPT_SSL_VERIFYHOST_OFF") if (*i == "CURLOPT_SSL_VERIFYHOST_OFF") {
{
this->VerifyHostOff = true; this->VerifyHostOff = true;
} }
} }
@ -88,30 +79,24 @@ void cmCTestCurl::SetCurlOptions(std::vector<std::string> const& args)
bool cmCTestCurl::InitCurl() bool cmCTestCurl::InitCurl()
{ {
if(!this->Curl) if (!this->Curl) {
{
return false; return false;
} }
if(this->VerifyPeerOff) if (this->VerifyPeerOff) {
{
curl_easy_setopt(this->Curl, CURLOPT_SSL_VERIFYPEER, 0); curl_easy_setopt(this->Curl, CURLOPT_SSL_VERIFYPEER, 0);
} }
if(this->VerifyHostOff) if (this->VerifyHostOff) {
{
curl_easy_setopt(this->Curl, CURLOPT_SSL_VERIFYHOST, 0); curl_easy_setopt(this->Curl, CURLOPT_SSL_VERIFYHOST, 0);
} }
if(this->HTTPProxy.size()) if (this->HTTPProxy.size()) {
{
curl_easy_setopt(this->Curl, CURLOPT_PROXY, this->HTTPProxy.c_str()); curl_easy_setopt(this->Curl, CURLOPT_PROXY, this->HTTPProxy.c_str());
curl_easy_setopt(this->Curl, CURLOPT_PROXYTYPE, this->HTTPProxyType); curl_easy_setopt(this->Curl, CURLOPT_PROXYTYPE, this->HTTPProxyType);
if (this->HTTPProxyAuth.size() > 0) if (this->HTTPProxyAuth.size() > 0) {
{
curl_easy_setopt(this->Curl, CURLOPT_PROXYUSERPWD, curl_easy_setopt(this->Curl, CURLOPT_PROXYUSERPWD,
this->HTTPProxyAuth.c_str()); this->HTTPProxyAuth.c_str());
} }
} }
if(this->UseHttp10) if (this->UseHttp10) {
{
curl_easy_setopt(this->Curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); curl_easy_setopt(this->Curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
} }
// enable HTTP ERROR parsing // enable HTTP ERROR parsing
@ -119,23 +104,19 @@ bool cmCTestCurl::InitCurl()
return true; return true;
} }
bool cmCTestCurl::UploadFile(std::string const& local_file, bool cmCTestCurl::UploadFile(std::string const& local_file,
std::string const& url, std::string const& url, std::string const& fields,
std::string const& fields,
std::string& response) std::string& response)
{ {
response = ""; response = "";
if(!this->InitCurl()) if (!this->InitCurl()) {
{
cmCTestLog(this->CTest, ERROR_MESSAGE, "Initialization of curl failed"); cmCTestLog(this->CTest, ERROR_MESSAGE, "Initialization of curl failed");
return false; return false;
} }
/* enable uploading */ /* enable uploading */
curl_easy_setopt(this->Curl, CURLOPT_UPLOAD, 1); curl_easy_setopt(this->Curl, CURLOPT_UPLOAD, 1);
// if there is little to no activity for too long stop submitting // if there is little to no activity for too long stop submitting
if(this->TimeOutSeconds) if (this->TimeOutSeconds) {
{
::curl_easy_setopt(this->Curl, CURLOPT_LOW_SPEED_LIMIT, 1); ::curl_easy_setopt(this->Curl, CURLOPT_LOW_SPEED_LIMIT, 1);
::curl_easy_setopt(this->Curl, CURLOPT_LOW_SPEED_TIME, ::curl_easy_setopt(this->Curl, CURLOPT_LOW_SPEED_TIME,
this->TimeOutSeconds); this->TimeOutSeconds);
@ -145,8 +126,7 @@ bool cmCTestCurl::UploadFile(std::string const& local_file,
::curl_easy_setopt(this->Curl, CURLOPT_VERBOSE, 1); ::curl_easy_setopt(this->Curl, CURLOPT_VERBOSE, 1);
FILE* ftpfile = cmsys::SystemTools::Fopen(local_file, "rb"); FILE* ftpfile = cmsys::SystemTools::Fopen(local_file, "rb");
if(!ftpfile) if (!ftpfile) {
{
cmCTestLog(this->CTest, ERROR_MESSAGE, cmCTestLog(this->CTest, ERROR_MESSAGE,
"Could not open file for upload: " << local_file << "\n"); "Could not open file for upload: " << local_file << "\n");
return false; return false;
@ -164,16 +144,15 @@ bool cmCTestCurl::UploadFile(std::string const& local_file,
static_cast<long>(filelen)); static_cast<long>(filelen));
::curl_easy_setopt(this->Curl, CURLOPT_WRITEFUNCTION, ::curl_easy_setopt(this->Curl, CURLOPT_WRITEFUNCTION,
curlWriteMemoryCallback); curlWriteMemoryCallback);
::curl_easy_setopt(this->Curl, CURLOPT_DEBUGFUNCTION, ::curl_easy_setopt(this->Curl, CURLOPT_DEBUGFUNCTION, curlDebugCallback);
curlDebugCallback);
// Be sure to set Content-Type to satisfy fussy modsecurity rules // Be sure to set Content-Type to satisfy fussy modsecurity rules
struct curl_slist *headers = ::curl_slist_append(NULL, struct curl_slist* headers =
"Content-Type: text/xml"); ::curl_slist_append(NULL, "Content-Type: text/xml");
::curl_easy_setopt(this->Curl, CURLOPT_HTTPHEADER, headers); ::curl_easy_setopt(this->Curl, CURLOPT_HTTPHEADER, headers);
std::vector<char> responseData; std::vector<char> responseData;
std::vector<char> debugData; std::vector<char> debugData;
::curl_easy_setopt(this->Curl, CURLOPT_FILE, (void *)&responseData); ::curl_easy_setopt(this->Curl, CURLOPT_FILE, (void*)&responseData);
::curl_easy_setopt(this->Curl, CURLOPT_DEBUGDATA, (void *)&debugData); ::curl_easy_setopt(this->Curl, CURLOPT_DEBUGDATA, (void*)&debugData);
::curl_easy_setopt(this->Curl, CURLOPT_FAILONERROR, 1); ::curl_easy_setopt(this->Curl, CURLOPT_FAILONERROR, 1);
// Now run off and do what you've been told! // Now run off and do what you've been told!
::curl_easy_perform(this->Curl); ::curl_easy_perform(this->Curl);
@ -181,37 +160,32 @@ bool cmCTestCurl::UploadFile(std::string const& local_file,
::curl_easy_setopt(this->Curl, CURLOPT_HTTPHEADER, NULL); ::curl_easy_setopt(this->Curl, CURLOPT_HTTPHEADER, NULL);
::curl_slist_free_all(headers); ::curl_slist_free_all(headers);
if ( responseData.size() > 0 ) if (responseData.size() > 0) {
{
response = std::string(responseData.begin(), responseData.end()); response = std::string(responseData.begin(), responseData.end());
cmCTestLog(this->CTest, HANDLER_VERBOSE_OUTPUT, cmCTestLog(this->CTest, HANDLER_VERBOSE_OUTPUT, "Curl response: ["
"Curl response: [" << response << "]\n"); << response << "]\n");
} }
std::string curlDebug; std::string curlDebug;
if ( debugData.size() > 0 ) if (debugData.size() > 0) {
{
curlDebug = std::string(debugData.begin(), debugData.end()); curlDebug = std::string(debugData.begin(), debugData.end());
cmCTestLog(this->CTest, DEBUG, "Curl debug: [" << curlDebug << "]\n"); cmCTestLog(this->CTest, DEBUG, "Curl debug: [" << curlDebug << "]\n");
} }
if(response.size() == 0) if (response.size() == 0) {
{ cmCTestLog(this->CTest, ERROR_MESSAGE, "No response from server.\n"
cmCTestLog(this->CTest, ERROR_MESSAGE, "No response from server.\n" << << curlDebug);
curlDebug);
return false; return false;
} }
return true; return true;
} }
bool cmCTestCurl::HttpRequest(std::string const& url, bool cmCTestCurl::HttpRequest(std::string const& url,
std::string const& fields, std::string const& fields, std::string& response)
std::string& response)
{ {
response = ""; response = "";
cmCTestLog(this->CTest, DEBUG, "HttpRequest\n" cmCTestLog(this->CTest, DEBUG, "HttpRequest\n"
<< "url: " << url << "\n" << "url: " << url << "\n"
<< "fields " << fields << "\n"); << "fields " << fields << "\n");
if(!this->InitCurl()) if (!this->InitCurl()) {
{
cmCTestLog(this->CTest, ERROR_MESSAGE, "Initialization of curl failed"); cmCTestLog(this->CTest, ERROR_MESSAGE, "Initialization of curl failed");
return false; return false;
} }
@ -219,26 +193,23 @@ bool cmCTestCurl::HttpRequest(std::string const& url,
curl_easy_setopt(this->Curl, CURLOPT_POSTFIELDS, fields.c_str()); curl_easy_setopt(this->Curl, CURLOPT_POSTFIELDS, fields.c_str());
::curl_easy_setopt(this->Curl, CURLOPT_URL, url.c_str()); ::curl_easy_setopt(this->Curl, CURLOPT_URL, url.c_str());
::curl_easy_setopt(this->Curl, CURLOPT_FOLLOWLOCATION, 1); ::curl_easy_setopt(this->Curl, CURLOPT_FOLLOWLOCATION, 1);
//set response options // set response options
::curl_easy_setopt(this->Curl, CURLOPT_WRITEFUNCTION, ::curl_easy_setopt(this->Curl, CURLOPT_WRITEFUNCTION,
curlWriteMemoryCallback); curlWriteMemoryCallback);
::curl_easy_setopt(this->Curl, CURLOPT_DEBUGFUNCTION, ::curl_easy_setopt(this->Curl, CURLOPT_DEBUGFUNCTION, curlDebugCallback);
curlDebugCallback);
std::vector<char> responseData; std::vector<char> responseData;
std::vector<char> debugData; std::vector<char> debugData;
::curl_easy_setopt(this->Curl, CURLOPT_FILE, (void *)&responseData); ::curl_easy_setopt(this->Curl, CURLOPT_FILE, (void*)&responseData);
::curl_easy_setopt(this->Curl, CURLOPT_DEBUGDATA, (void *)&debugData); ::curl_easy_setopt(this->Curl, CURLOPT_DEBUGDATA, (void*)&debugData);
::curl_easy_setopt(this->Curl, CURLOPT_FAILONERROR, 1); ::curl_easy_setopt(this->Curl, CURLOPT_FAILONERROR, 1);
CURLcode res = ::curl_easy_perform(this->Curl); CURLcode res = ::curl_easy_perform(this->Curl);
if ( responseData.size() > 0 ) if (responseData.size() > 0) {
{
response = std::string(responseData.begin(), responseData.end()); response = std::string(responseData.begin(), responseData.end());
cmCTestLog(this->CTest, DEBUG, "Curl response: [" << response << "]\n"); cmCTestLog(this->CTest, DEBUG, "Curl response: [" << response << "]\n");
} }
if ( debugData.size() > 0 ) if (debugData.size() > 0) {
{
std::string curlDebug = std::string(debugData.begin(), debugData.end()); std::string curlDebug = std::string(debugData.begin(), debugData.end());
cmCTestLog(this->CTest, DEBUG, "Curl debug: [" << curlDebug << "]\n"); cmCTestLog(this->CTest, DEBUG, "Curl debug: [" << curlDebug << "]\n");
} }
@ -248,39 +219,29 @@ bool cmCTestCurl::HttpRequest(std::string const& url,
void cmCTestCurl::SetProxyType() void cmCTestCurl::SetProxyType()
{ {
if ( cmSystemTools::GetEnv("HTTP_PROXY") ) if (cmSystemTools::GetEnv("HTTP_PROXY")) {
{
this->HTTPProxy = cmSystemTools::GetEnv("HTTP_PROXY"); this->HTTPProxy = cmSystemTools::GetEnv("HTTP_PROXY");
if ( cmSystemTools::GetEnv("HTTP_PROXY_PORT") ) if (cmSystemTools::GetEnv("HTTP_PROXY_PORT")) {
{
this->HTTPProxy += ":"; this->HTTPProxy += ":";
this->HTTPProxy += cmSystemTools::GetEnv("HTTP_PROXY_PORT"); this->HTTPProxy += cmSystemTools::GetEnv("HTTP_PROXY_PORT");
} }
if ( cmSystemTools::GetEnv("HTTP_PROXY_TYPE") ) if (cmSystemTools::GetEnv("HTTP_PROXY_TYPE")) {
{
// this is the default // this is the default
this->HTTPProxyType = CURLPROXY_HTTP; this->HTTPProxyType = CURLPROXY_HTTP;
std::string type = cmSystemTools::GetEnv("HTTP_PROXY_TYPE"); std::string type = cmSystemTools::GetEnv("HTTP_PROXY_TYPE");
// HTTP/SOCKS4/SOCKS5 // HTTP/SOCKS4/SOCKS5
if ( type == "HTTP" ) if (type == "HTTP") {
{
this->HTTPProxyType = CURLPROXY_HTTP; this->HTTPProxyType = CURLPROXY_HTTP;
} } else if (type == "SOCKS4") {
else if ( type == "SOCKS4" )
{
this->HTTPProxyType = CURLPROXY_SOCKS4; this->HTTPProxyType = CURLPROXY_SOCKS4;
} } else if (type == "SOCKS5") {
else if ( type == "SOCKS5" )
{
this->HTTPProxyType = CURLPROXY_SOCKS5; this->HTTPProxyType = CURLPROXY_SOCKS5;
} }
} }
if ( cmSystemTools::GetEnv("HTTP_PROXY_USER") ) if (cmSystemTools::GetEnv("HTTP_PROXY_USER")) {
{
this->HTTPProxyAuth = cmSystemTools::GetEnv("HTTP_PROXY_USER"); this->HTTPProxyAuth = cmSystemTools::GetEnv("HTTP_PROXY_USER");
} }
if ( cmSystemTools::GetEnv("HTTP_PROXY_PASSWD") ) if (cmSystemTools::GetEnv("HTTP_PROXY_PASSWD")) {
{
this->HTTPProxyAuth += ":"; this->HTTPProxyAuth += ":";
this->HTTPProxyAuth += cmSystemTools::GetEnv("HTTP_PROXY_PASSWD"); this->HTTPProxyAuth += cmSystemTools::GetEnv("HTTP_PROXY_PASSWD");
} }

View File

@ -23,22 +23,21 @@ class cmCTestCurl
public: public:
cmCTestCurl(cmCTest*); cmCTestCurl(cmCTest*);
~cmCTestCurl(); ~cmCTestCurl();
bool UploadFile(std::string const& url, bool UploadFile(std::string const& url, std::string const& file,
std::string const& file, std::string const& fields, std::string& response);
std::string const& fields, bool HttpRequest(std::string const& url, std::string const& fields,
std::string& response);
bool HttpRequest(std::string const& url,
std::string const& fields,
std::string& response); std::string& response);
// currently only supports CURLOPT_SSL_VERIFYPEER_OFF // currently only supports CURLOPT_SSL_VERIFYPEER_OFF
// and CURLOPT_SSL_VERIFYHOST_OFF // and CURLOPT_SSL_VERIFYHOST_OFF
void SetCurlOptions(std::vector<std::string> const& args); void SetCurlOptions(std::vector<std::string> const& args);
void SetUseHttp10On() { this->UseHttp10 = true;} void SetUseHttp10On() { this->UseHttp10 = true; }
void SetTimeOutSeconds(int s) { this->TimeOutSeconds = s;} void SetTimeOutSeconds(int s) { this->TimeOutSeconds = s; }
std::string Escape(std::string const& source); std::string Escape(std::string const& source);
protected: protected:
void SetProxyType(); void SetProxyType();
bool InitCurl(); bool InitCurl();
private: private:
cmCTest* CTest; cmCTest* CTest;
CURL* Curl; CURL* Curl;

View File

@ -13,17 +13,15 @@
#include "cmCTestScriptHandler.h" #include "cmCTestScriptHandler.h"
bool cmCTestEmptyBinaryDirectoryCommand bool cmCTestEmptyBinaryDirectoryCommand::InitialPass(
::InitialPass(std::vector<std::string> const& args, cmExecutionStatus &) std::vector<std::string> const& args, cmExecutionStatus&)
{ {
if(args.size() != 1 ) if (args.size() != 1) {
{
this->SetError("called with incorrect number of arguments"); this->SetError("called with incorrect number of arguments");
return false; return false;
} }
if ( !cmCTestScriptHandler::EmptyBinaryDirectory(args[0].c_str()) ) if (!cmCTestScriptHandler::EmptyBinaryDirectory(args[0].c_str())) {
{
std::ostringstream ostr; std::ostringstream ostr;
ostr << "problem removing the binary directory: " << args[0]; ostr << "problem removing the binary directory: " << args[0];
this->SetError(ostr.str()); this->SetError(ostr.str());
@ -32,5 +30,3 @@ bool cmCTestEmptyBinaryDirectoryCommand
return true; return true;
} }

Some files were not shown because too many files have changed in this diff Show More