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

@ -1,34 +1,32 @@
/* 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,24 +3,26 @@
#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;
} }
#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,11 +1,10 @@
#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,22 +39,22 @@ 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);
} }
int cmCPackIFWGenerator::PackageFiles() int cmCPackIFWGenerator::PackageFiles()
@ -72,168 +72,141 @@ 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
<< output << std::endl; << output << std::endl;
cmCPackLogger(cmCPackLog::LOG_ERROR, "Problem running IFW command: " cmCPackLogger(cmCPackLog::LOG_ERROR, "Problem running IFW command: "
<< ifwCmd << std::endl << ifwCmd << std::endl
<< "Please check " << ifwTmpFile << " for errors" << "Please check " << ifwTmpFile << " for errors"
<< std::endl); << std::endl);
return 0; return 0;
}
cmCPackLogger(cmCPackLog::LOG_OUTPUT, "- repository: " << this->toplevel
<< "/repository generated" << std::endl);
} }
cmCPackLogger(cmCPackLog::LOG_OUTPUT, "- repository: "
<< this->toplevel << "/repository generated" << std::endl);
}
// Run binary creator // Run binary creator
{ {
std::string ifwCmd = BinCreator; std::string ifwCmd = BinCreator;
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() &&
} !Installer.Repositories.empty()) {
else if (!DownloadedPackages.empty() && !Installer.Repositories.empty()) ifwCmd += " -e ";
{ std::set<cmCPackIFWPackage*>::iterator it = DownloadedPackages.begin();
ifwCmd += " -e "; ifwCmd += (*it)->Name;
std::set<cmCPackIFWPackage*>::iterator it
= DownloadedPackages.begin();
ifwCmd += (*it)->Name;
++it;
while(it != DownloadedPackages.end())
{
ifwCmd += "," + (*it)->Name;
++it; ++it;
while (it != DownloadedPackages.end()) {
ifwCmd += "," + (*it)->Name;
++it;
} }
} } else if (!DependentPackages.empty()) {
else if (!DependentPackages.empty()) ifwCmd += " -i ";
{ // Binary
ifwCmd += " -i "; std::set<cmCPackIFWPackage*>::iterator bit = BinaryPackages.begin();
// Binary while (bit != BinaryPackages.end()) {
std::set<cmCPackIFWPackage*>::iterator bit = BinaryPackages.begin(); ifwCmd += (*bit)->Name + ",";
while(bit != BinaryPackages.end()) ++bit;
{
ifwCmd += (*bit)->Name + ",";
++bit;
} }
// Depend // Depend
DependenceMap::iterator it = DependentPackages.begin(); DependenceMap::iterator it = DependentPackages.begin();
ifwCmd += it->second.Name; ifwCmd += it->second.Name;
++it;
while(it != DependentPackages.end())
{
ifwCmd += "," + it->second.Name;
++it; ++it;
while (it != DependentPackages.end()) {
ifwCmd += "," + it->second.Name;
++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 {
ifwCmd += " installer";
} }
else cmCPackLogger(cmCPackLog::LOG_VERBOSE, "Execute: " << ifwCmd << std::endl);
{ std::string output;
ifwCmd += " installer"; int retVal = 1;
} cmCPackLogger(cmCPackLog::LOG_OUTPUT, "- Generate package" << std::endl);
cmCPackLogger(cmCPackLog::LOG_VERBOSE, "Execute: " << ifwCmd bool res = cmSystemTools::RunSingleCommand(
<< std::endl); ifwCmd.c_str(), &output, &output, &retVal, 0, this->GeneratorVerbose, 0);
std::string output; if (!res || retVal) {
int retVal = 1; cmGeneratedFileStream ofs(ifwTmpFile.c_str());
cmCPackLogger(cmCPackLog::LOG_OUTPUT, "- Generate package" << std::endl); ofs << "# Run command: " << ifwCmd << std::endl
bool res = cmSystemTools::RunSingleCommand( << "# Output:" << std::endl
ifwCmd.c_str(), &output, &output, << output << std::endl;
&retVal, 0, this->GeneratorVerbose, 0); cmCPackLogger(cmCPackLog::LOG_ERROR, "Problem running IFW command: "
if ( !res || retVal ) << ifwCmd << std::endl
{ << "Please check " << ifwTmpFile << " for errors"
cmGeneratedFileStream ofs(ifwTmpFile.c_str()); << std::endl);
ofs << "# Run command: " << ifwCmd << std::endl return 0;
<< "# Output:" << std::endl
<< output << std::endl;
cmCPackLogger(cmCPackLog::LOG_ERROR, "Problem running IFW command: "
<< ifwCmd << std::endl
<< "Please check " << ifwTmpFile << " for errors"
<< std::endl);
return 0;
} }
} }
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";
} }
this->SetOption("CPACK_IFW_PACKAGING_INSTALL_PREFIX", tmpPref.c_str()); this->SetOption("CPACK_IFW_PACKAGING_INSTALL_PREFIX", tmpPref.c_str());
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,56 +219,43 @@ 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"
<< std::endl); << std::endl);
return 0; return 0;
} }
// 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";
} }
// Variables that Change Behavior // Variables that Change Behavior
@ -304,158 +264,130 @@ 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;
} }
if (!Installer.Repositories.empty() && RepoGen.empty()) { if (!Installer.Repositories.empty() && RepoGen.empty()) {
cmCPackLogger(cmCPackLog::LOG_ERROR, cmCPackLogger(cmCPackLog::LOG_ERROR,
"Cannot find QtIFW repository generator \"repogen\": " "Cannot find QtIFW repository generator \"repogen\": "
"likely it is not installed, or not in your PATH" "likely it is not installed, or not in your PATH"
<< std::endl); << std::endl);
return 0; return 0;
} }
// 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/";
const std::string suffix = "/data"; const std::string suffix = "/data";
if (componentPackageMethod == ONE_PACKAGE) { if (componentPackageMethod == ONE_PACKAGE) {
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,123 +417,106 @@ 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)
{
name = package->Name + "." + name;
}
} }
if (dot) {
name = package->Name + "." + name;
}
}
return name; return name;
} }
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;
if(dot && name.substr(0, package->Name.size()) == package->Name)
{
dot = false;
}
if(dot)
{
name = package->Name + "." + name;
}
} }
bool dot = !ResolveDuplicateNames;
if (dot && name.substr(0, package->Name.size()) == package->Name) {
dot = false;
}
if (dot) {
name = package->Name + "." + name;
}
}
return name; return name;
} }
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);
xout.Comment(comment.str().c_str()); xout.Comment(comment.str().c_str());
} }

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,9 +90,8 @@ 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);
/** /**
* @brief Get group of component * @brief Get group of component
@ -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,310 +20,239 @@
#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_" // Url
+ cmsys::SystemTools::UpperCase(*rit) if (const char* url = GetOption(prefix + "URL")) {
+ "_"; Repo.Url = url;
// Url } else {
if (const char* url = GetOption(prefix + "URL")) Repo.Url = "";
{ }
Repo.Url = url; // Enabled
} if (IsOn(prefix + "DISABLED")) {
else Repo.Enabled = "0";
{ } else {
Repo.Url = ""; Repo.Enabled = "";
} }
// Enabled // Username
if (IsOn(prefix + "DISABLED")) if (const char* username = GetOption(prefix + "USERNAME")) {
{ Repo.Username = username;
Repo.Enabled = "0"; } else {
} Repo.Username = "";
else }
{ // Password
Repo.Enabled = ""; if (const char* password = GetOption(prefix + "PASSWORD")) {
} Repo.Password = password;
// Username } else {
if (const char* username = GetOption(prefix + "USERNAME")) Repo.Password = "";
{ }
Repo.Username = username; // DisplayName
} if (const char* displayName = GetOption(prefix + "DISPLAY_NAME")) {
else Repo.DisplayName = displayName;
{ } else {
Repo.Username = ""; Repo.DisplayName = "";
} }
// Password
if (const char* password = GetOption(prefix + "PASSWORD"))
{
Repo.Password = password;
}
else
{
Repo.Password = "";
}
// DisplayName
if (const char* displayName = GetOption(prefix + "DISPLAY_NAME"))
{
Repo.DisplayName = displayName;
}
else
{
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;
} }
} }
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;
} }
// Output stream // Output stream
cmGeneratedFileStream fout((Directory + "/config/config.xml").data()); cmGeneratedFileStream fout((Directory + "/config/config.xml").data());
@ -339,140 +268,118 @@ 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());
xout.Element("Logo", name); xout.Element("Logo", name);
} }
// 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
if(!rit->Username.empty())
{
xout.Element("Username", rit->Username);
}
// Password
if(!rit->Password.empty())
{
xout.Element("Password", rit->Password);
}
// DisplayName
if(!rit->DisplayName.empty())
{
xout.Element("DisplayName", rit->DisplayName);
}
xout.EndElement();
} }
xout.EndElement(); // Username
if (!rit->Username.empty()) {
xout.Element("Username", rit->Username);
}
// Password
if (!rit->Password.empty()) {
xout.Element("Password", rit->Password);
}
// DisplayName
if (!rit->DisplayName.empty()) {
xout.Element("DisplayName", rit->DisplayName);
}
xout.EndElement();
} }
xout.EndElement();
}
// 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 {
if (!AllowNonAsciiCharacters.empty()) {
xout.Element("AllowNonAsciiCharacters", AllowNonAsciiCharacters);
} }
else if (!AllowSpaceInPath.empty()) {
{ xout.Element("AllowSpaceInPath", AllowSpaceInPath);
if(!AllowNonAsciiCharacters.empty())
{
xout.Element("AllowNonAsciiCharacters", AllowNonAsciiCharacters);
}
if(!AllowSpaceInPath.empty())
{
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());
xout.Element("ControlScript", name); xout.Element("ControlScript", name);
} }
xout.EndElement(); xout.EndElement();
xout.EndDocument(); xout.EndDocument();
@ -480,36 +387,32 @@ 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();
return; return;
} }
// 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,64 +46,47 @@ 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);
} }
Name = pos == std::string::npos ? dependence : dependence.substr(0, pos); Name = pos == std::string::npos ? dependence : dependence.substr(0, pos);
} }
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 += ">";
} }
result += Compare.Value; result += Compare.Value;
@ -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,51 +160,42 @@ 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";
} }
ForcedInstallation = "true"; ForcedInstallation = "true";
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,81 +204,65 @@ 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);
} }
} }
}
// 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
<< " should contain pairs of <display_name> and <file_path>." << "LICENSES"
<< std::endl); << " should contain pairs of <display_name> and <file_path>."
<< std::endl);
Licenses.clear(); Licenses.clear();
}
} }
}
// Priority // Priority
if(const char* option = this->GetOption(prefix + "PRIORITY")) if (const char* option = this->GetOption(prefix + "PRIORITY")) {
{
SortingPriority = option; SortingPriority = option;
} }
// Default // Default
Default = component->IsDisabledByDefault ? "false" : "true"; Default = component->IsDisabledByDefault ? "false" : "true";
@ -318,87 +276,74 @@ 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
<< " should contain pairs of <display_name> and <file_path>." << "LICENSES"
<< std::endl); << " should contain pairs of <display_name> and <file_path>."
<< std::endl);
Licenses.clear(); Licenses.clear();
}
} }
}
// 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");
group.IsExpandedByDefault = IsOn(prefix + "EXPANDED"); group.IsExpandedByDefault = IsOn(prefix + "EXPANDED");
@ -406,14 +351,11 @@ 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;
} }
return ConfigureFromGroup(&group); return ConfigureFromGroup(&group);
} }
@ -421,17 +363,13 @@ 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;
}
} }
}
// Output stream // Output stream
cmGeneratedFileStream fout((Directory + "/meta/package.xml").data()); cmGeneratedFileStream fout((Directory + "/meta/package.xml").data());
@ -448,98 +386,83 @@ 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());
xout.Element("Script", name); xout.Element("Script", name);
} }
// 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;
}
xout.Element("Dependencies", dependencies.str());
} }
xout.Element("Dependencies", dependencies.str());
}
// 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]);
xout.EndElement(); xout.EndElement();
} }
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);
} }
xout.EndElement(); xout.EndElement();
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

@ -31,11 +31,11 @@ public:
enum CompareTypes enum CompareTypes
{ {
CompareNone = 0x0, CompareNone = 0x0,
CompareEqual = 0x1, CompareEqual = 0x1,
CompareLess = 0x2, CompareLess = 0x2,
CompareLessOrEqual = 0x3, CompareLessOrEqual = 0x3,
CompareGreater = 0x4, CompareGreater = 0x4,
CompareGreaterOrEqual = 0x5 CompareGreaterOrEqual = 0x5
}; };
@ -50,17 +50,17 @@ 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;
} }
}; };
public: public:
@ -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

@ -20,72 +20,65 @@
// For the PATH_MAX constant // For the PATH_MAX constant
#include <sys/syslimits.h> #include <sys/syslimits.h>
#define DebugError(x) \ #define DebugError(x) \
ofs << x << std::endl; \ ofs << x << std::endl; \
std::cout << x << std::endl std::cout << x << std::endl
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);
cmsysProcess* cp = cmsysProcess_New(); cmsysProcess* cp = cmsysProcess_New();
@ -98,49 +91,38 @@ 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] = ' ';
}
} }
std::cout.write(data, length);
} }
std::cout.write(data, length);
}
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;
} }
cmsysProcess_Delete(cp); cmsysProcess_Delete(cp);

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,32 +79,25 @@ 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, cmWIXFilesSourceWriter& fileDefinitions,
cmWIXFilesSourceWriter& fileDefinitions, 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,23 +30,20 @@ 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;
} }
std::string user_and_domain = entry.substr(0, pos); std::string user_and_domain = entry.substr(0, pos);
std::string permission_string = entry.substr(pos + 1); std::string permission_string = entry.substr(pos + 1);
@ -56,46 +51,38 @@ 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;
} }
std::vector<std::string> permissions = std::vector<std::string> permissions =
cmSystemTools::tokenize(permission_string, ","); cmSystemTools::tokenize(permission_string, ",");
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,23 +115,22 @@ 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());
} }
this->SourceWriter.AddAttribute(name, "yes"); this->SourceWriter.AddAttribute(name, "yes");
} }

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,25 +59,20 @@ 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());
} }
AddAttribute("Name", installRoot[i]); AddAttribute("Name", installRoot[i]);
} }
@ -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

@ -26,7 +26,7 @@ class cmWIXDirectoriesSourceWriter : public cmWIXSourceWriter
{ {
public: public:
cmWIXDirectoriesSourceWriter(cmCPackLog* logger, cmWIXDirectoriesSourceWriter(cmCPackLog* logger,
std::string const& filename); std::string const& filename);
void EmitStartMenuFolder(std::string const& startMenuFolder); void EmitStartMenuFolder(std::string const& startMenuFolder);
@ -35,8 +35,8 @@ public:
void EmitStartupFolder(); void EmitStartupFolder();
size_t BeginInstallationPrefixDirectory( size_t BeginInstallationPrefixDirectory(
std::string const& programFilesFolderId, std::string const& programFilesFolderId,
std::string const& installRootString); std::string const& installRootString);
void EndInstallationPrefixDirectory(size_t size); void EndInstallationPrefixDirectory(size_t size);
}; };

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");
@ -29,7 +27,7 @@ void cmWIXFeaturesSourceWriter::CreateCMakePackageRegistryEntry(
AddAttribute("Guid", "*"); AddAttribute("Guid", "*");
std::string registryKey = std::string registryKey =
std::string("Software\\Kitware\\CMake\\Packages\\") + package; std::string("Software\\Kitware\\CMake\\Packages\\") + package;
BeginElement("RegistryValue"); BeginElement("RegistryValue");
AddAttribute("Root", "HKLM"); AddAttribute("Root", "HKLM");
@ -49,25 +47,24 @@ 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);
} }
EndElement("Feature"); EndElement("Feature");
} }
@ -81,15 +78,13 @@ 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");
} }
EndElement("Feature"); EndElement("Feature");
} }

View File

@ -23,12 +23,10 @@
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,25 +21,22 @@
#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)
{ {
std::stringstream shortcutId; std::stringstream shortcutId;
shortcutId << shortcutPrefix << id; shortcutId << shortcutPrefix << id;
if(shortcutIndex > 0) if (shortcutIndex > 0) {
{ shortcutId << "_" << shortcutIndex;
shortcutId << "_" << shortcutIndex; }
}
std::string fileId = std::string("CM_F") + id; std::string fileId = std::string("CM_F") + id;
@ -61,15 +58,13 @@ 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 + "_"; }
}
valueName += "installed"; valueName += "installed";
valueName += suffix; valueName += suffix;
@ -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,11 +106,10 @@ 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();
} }
EndElement("CreateFolder"); EndElement("CreateFolder");
EndElement("Component"); EndElement("Component");
@ -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,17 +133,14 @@ 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"))
{
AddAttribute("Permanent", "yes");
}
} }
if (installedFile->GetPropertyAsBool("CPACK_PERMANENT")) {
AddAttribute("Permanent", "yes");
}
}
BeginElement("File"); BeginElement("File");
AddAttribute("Id", fileId); AddAttribute("Id", fileId);
@ -163,16 +150,14 @@ 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();
} }
patch.ApplyFragment(fileId, *this); patch.ApplyFragment(fileId, *this);
EndElement("File"); EndElement("File");

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, cmWIXPatch& patch,
std::string const& filePath, cmInstalledFile const* installedFile);
cmWIXPatch &patch,
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,36 +45,35 @@ 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; case cmWIXPatchNode::TEXT:
case cmWIXPatchNode::TEXT: writer.AddTextNode(dynamic_cast<const cmWIXPatchText&>(*node).text);
writer.AddTextNode(dynamic_cast<const cmWIXPatchText&>(*node).text); break;
break;
} }
} }
} }
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);
} }
this->ApplyElementChildren(element, writer); this->ApplyElementChildren(element, writer);
@ -86,26 +83,23 @@ 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 += ", ";
} }
fragmentList += "'"; fragmentList += "'";
fragmentList += i->first; fragmentList += i->first;
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; }
}
return true; return true;
} }

View File

@ -34,15 +34,14 @@ public:
private: private:
void ApplyElementChildren(const cmWIXPatchElement& element, void ApplyElementChildren(const cmWIXPatchElement& element,
cmWIXSourceWriter& writer); cmWIXSourceWriter& writer);
void ApplyElement(const cmWIXPatchElement& element, void ApplyElement(const cmWIXPatchElement& element,
cmWIXSourceWriter& writer); cmWIXSourceWriter& writer);
cmCPackLog* Logger; cmCPackLog* Logger;
cmWIXPatchParser::fragment_map_t Fragments; cmWIXPatchParser::fragment_map_t Fragments;
}; };
#endif #endif

View File

@ -28,149 +28,124 @@ 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;
{ StartFragment(atts);
State = INSIDE_FRAGMENT; } else {
StartFragment(atts); ReportValidationError("Expected 'CPackWixFragment' element");
}
else
{
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;
}
ElementStack.push_back(element);
} }
ElementStack.push_back(element);
}
} }
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'");
}
} }
}
} }
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;
{ ElementStack.clear();
State = BEGIN_FRAGMENTS; } else {
ElementStack.clear(); ElementStack.pop_back();
}
else
{
ElementStack.pop_back();
}
} }
}
} }
void cmWIXPatchParser::CharacterDataHandler(const char* data, int length) 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);
}
} }
}
} }
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,74 +37,50 @@ 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; case '{':
case '{': File << "\\{";
File << "\\{"; break;
break; case '}':
case '}': File << "\\}";
File << "\\}"; break;
break; case '\n':
case '\n': File << "\\par\r\n";
File << "\\par\r\n"; 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) {
{ EmitInvalidCodepoint(c);
if(c <= 0xC0) } else if (c < 0xE0 && i + 1 < text.size()) {
{ EmitUnicodeCodepoint((text[i + 1] & 0x3F) | ((c & 0x1F) << 6));
EmitInvalidCodepoint(c); i += 1;
} } else if (c < 0xF0 && i + 2 < text.size()) {
else if(c < 0xE0 && i+1 < text.size()) EmitUnicodeCodepoint((text[i + 2] & 0x3F) |
{ ((text[i + 1] & 0x3F) << 6) |
EmitUnicodeCodepoint( ((c & 0xF) << 12));
(text[i+1] & 0x3F) | i += 2;
((c & 0x1F) << 6) } else if (c < 0xF8 && i + 3 < text.size()) {
); EmitUnicodeCodepoint(
i+= 1; (text[i + 3] & 0x3F) | ((text[i + 2] & 0x3F) << 6) |
} ((text[i + 1] & 0x3F) << 12) | ((c & 0x7) << 18));
else if(c < 0xF0 && i+2 < text.size()) i += 3;
{ } else {
EmitUnicodeCodepoint( EmitInvalidCodepoint(c);
(text[i+2] & 0x3F) |
((text[i+1] & 0x3F) << 6) |
((c & 0xF) << 12)
);
i += 2;
}
else if(c < 0xF8 && i+3 < text.size())
{
EmitUnicodeCodepoint(
(text[i+3] & 0x3F) |
((text[i+2] & 0x3F) << 6) |
((text[i+1] & 0x3F) << 12) |
((c & 0x7) << 18)
);
i += 3;
}
else
{
EmitInvalidCodepoint(c);
}
} }
} }
break; } break;
}
} }
}
} }
void cmWIXRichTextFormatWriter::WriteHeader() void cmWIXRichTextFormatWriter::WriteHeader()
@ -190,33 +166,25 @@ 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);
} }
} }
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,25 +26,22 @@ 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;
} }
shortcut_id_map_t const& id_map = i->second; shortcut_id_map_t const& id_map = i->second;
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;
@ -58,68 +55,61 @@ bool cmWIXShortcuts::EmitShortcuts(
break; break;
default: default:
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& directoryId,
std::string const& id, cmInstalledFile const& installedFile)
std::string const& directoryId,
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;
insert(type, id, shortcut); insert(type, id, shortcut);
} }
} }

View File

@ -45,26 +45,23 @@ 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& cpackComponentName,
std::string const& registryKey, cmWIXFilesSourceWriter& fileDefinitions) const;
std::string const& cpackComponentName,
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, std::string const& id,
Type type, std::string const& directoryId,
std::string const& id, cmInstalledFile const& installedFile);
std::string const& directoryId,
cmInstalledFile const& installedFile);
shortcut_type_map_t Shortcuts; shortcut_type_map_t Shortcuts;
shortcut_id_map_t EmptyIdMap; shortcut_id_map_t EmptyIdMap;

View File

@ -17,46 +17,41 @@
#include <windows.h> #include <windows.h>
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");
} }
AddAttribute("xmlns", "http://schemas.microsoft.com/wix/2006/wi"); AddAttribute("xmlns", "http://schemas.microsoft.com/wix/2006/wi");
} }
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;
} }
EndElement(Elements.back()); EndElement(Elements.back());
} }
void cmWIXSourceWriter::BeginElement(std::string const& name) void cmWIXSourceWriter::BeginElement(std::string const& name)
{ {
if(State == BEGIN) if (State == BEGIN) {
{
File << ">"; File << ">";
} }
File << "\n"; File << "\n";
Indent(Elements.size()); Indent(Elements.size());
@ -68,33 +63,27 @@ 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 << "/>";
} }
Elements.pop_back(); Elements.pop_back();
State = DEFAULT; State = DEFAULT;
@ -102,30 +91,27 @@ 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;
} }
File << this->EscapeAttributeValue(text); File << this->EscapeAttributeValue(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 << ">";
} }
File << "\n"; File << "\n";
Indent(Elements.size()); Indent(Elements.size());
@ -134,21 +120,20 @@ 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);
} }
} }
std::string cmWIXSourceWriter::CMakeEncodingToUtf8(std::string const& value) std::string cmWIXSourceWriter::CMakeEncodingToUtf8(std::string const& value)
@ -156,43 +141,38 @@ 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();
} }
std::vector<char> utf8(utf8ByteCount); std::vector<char> utf8(utf8ByteCount);
WideCharToMultiByte(CP_UTF8, 0, &utf16[0], static_cast<int>(utf16.size()), WideCharToMultiByte(CP_UTF8, 0, &utf16[0], static_cast<int>(utf16.size()),
&utf8[0], static_cast<int>(utf8.size()), 0, 0); &utf8[0], static_cast<int>(utf8.size()), 0, 0);
return std::string(&utf8[0], utf8.size()); return std::string(&utf8[0], utf8.size());
#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,41 +180,37 @@ 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; case '>':
case '>': result += "&gt;";
result += "&gt;"; break;
break; case '&':
case '&': result += "&amp;";
result +="&amp;"; break;
break; case '"':
case '"': result += "&quot;";
result += "&quot;"; break;
break; default:
default: result += c;
result += c; break;
break;
}
} }
}
return result; return result;
} }

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,19 +37,18 @@ 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);
protected: protected:
cmCPackLog* Logger; cmCPackLog* Logger;
private: private:
enum State enum State

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

@ -25,7 +25,7 @@
#include <cmsys/SystemTools.hxx> #include <cmsys/SystemTools.hxx>
cmCPackArchiveGenerator::cmCPackArchiveGenerator(cmArchiveWrite::Compress t, cmCPackArchiveGenerator::cmCPackArchiveGenerator(cmArchiveWrite::Compress t,
std::string const& format) std::string const& format)
{ {
this->Compress = t; this->Compress = t;
this->ArchiveFormat = format; this->ArchiveFormat = format;
@ -40,48 +40,41 @@ 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;
}
} }
}
// Go back to previous dir // Go back to previous dir
cmSystemTools::ChangeDirectory(dir); cmSystemTools::ChangeDirectory(dir);
return 1; return 1;
@ -92,26 +85,21 @@ 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 << ">." << std::endl); \
<< filename \ return 0; \
<< ">." << std::endl); \ } \
return 0; \ cmArchiveWrite archive(gf, this->Compress, this->ArchiveFormat); \
} \ if (!archive) { \
cmArchiveWrite archive(gf,this->Compress, this->ArchiveFormat); \ cmCPackLogger(cmCPackLog::LOG_ERROR, "Problem to create archive < " \
if (!archive) \ << filename << ">. ERROR =" << archive.GetError() \
{ \ << std::endl); \
cmCPackLogger(cmCPackLog::LOG_ERROR, "Problem to create archive < " \ return 0; \
<< filename \
<< ">. ERROR =" \
<< archive.GetError() \
<< std::endl); \
return 0; \
} }
int cmCPackArchiveGenerator::PackageComponents(bool ignoreGroup) int cmCPackArchiveGenerator::PackageComponents(bool ignoreGroup)
@ -119,99 +107,86 @@ 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
packageFileNames.push_back(packageFileName); packageFileNames.push_back(packageFileName);
} }
// 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);
}
} }
} }
}
// 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);
}
} }
}
return 1; return 1;
} }
@ -220,23 +195,22 @@ 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.
return 1; return 1;
@ -244,50 +218,42 @@ 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;
}
} }
}
cmSystemTools::ChangeDirectory(dir); cmSystemTools::ChangeDirectory(dir);
// The destructor of cmArchiveWrite will close and finish the write // The destructor of cmArchiveWrite will close and finish the write
return 1; return 1;
@ -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,29 +28,25 @@ 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);
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, << std::endl);
"Cannot locate codesign command"
<< std::endl);
return 0; return 0;
}
this->SetOptionIfNotSet("CPACK_COMMAND_CODESIGN", codesign_path.c_str());
} }
this->SetOptionIfNotSet("CPACK_COMMAND_CODESIGN", codesign_path.c_str());
}
return this->Superclass::InitializeInternal(); return this->Superclass::InitializeInternal();
} }
@ -69,42 +65,40 @@ 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;
} }
// 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,30 +106,33 @@ 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);
return 0; return 0;
} }
// Install a user-provided bundle icon ... // Install a user-provided bundle icon ...
std::ostringstream icon_source; std::ostringstream icon_source;
@ -144,52 +141,48 @@ 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);
return 0; return 0;
} }
// 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."
<< std::endl); << std::endl);
return 0; return 0;
} }
cmSystemTools::SetPermissions(command_target.str().c_str(), 0777); cmSystemTools::SetPermissions(command_target.str().c_str(), 0777);
} }
return 1; return 1;
} }
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;
} }
return this->CreateDMG(toplevel, packageFileNames[0]); return this->CreateDMG(toplevel, packageFileNames[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,15 +234,14 @@ 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;
}
} }
}
// sign main binary // sign main binary
std::ostringstream temp_sign_binary_cmd; std::ostringstream temp_sign_binary_cmd;
@ -259,43 +250,42 @@ 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;
} }
// sign app bundle // sign app bundle
std::ostringstream temp_codesign_cmd; std::ostringstream temp_codesign_cmd;
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"
<< std::endl); : "without entitlement sandboxing")
<< std::endl);
} }
return 1; return 1;

View File

@ -18,28 +18,26 @@
#include <vector> #include <vector>
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;
this->TotalSize += cmSystemTools::FileLength(path); this->TotalSize += cmSystemTools::FileLength(path);
} }
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;
@ -54,14 +53,13 @@ int cmCPackCygwinBinaryGenerator::PackageFiles()
// create an extra scope to force the stream // create an extra scope to force the stream
// 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";
} }
ofs << manifest << "\n"; ofs << manifest << "\n";
} }
// add the manifest file to the list of all files // add the manifest file to the list of all files
files.push_back(manifestFile); files.push_back(manifestFile);
@ -73,14 +71,13 @@ 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"
<< std::endl); << std::endl);
} }
this->OutputExtension += patchNumber; this->OutputExtension += patchNumber;
this->OutputExtension += ".tar.bz2"; this->OutputExtension += ".tar.bz2";
return this->OutputExtension.c_str(); return this->OutputExtension.c_str();

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,10 +55,9 @@ 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
// and the CPACK_CYGWIN_PATCH_FILE and CPACK_TOPLEVEL_DIRECTORY // and the CPACK_CYGWIN_PATCH_FILE and CPACK_TOPLEVEL_DIRECTORY
// files // files
@ -76,47 +75,41 @@ 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";
} }
outerTarFile += patch; outerTarFile += patch;
outerTarFile += "-src.tar.bz2"; outerTarFile += "-src.tar.bz2";
std::string tmpDir = this->GetOption("CPACK_TOPLEVEL_DIRECTORY"); std::string tmpDir = this->GetOption("CPACK_TOPLEVEL_DIRECTORY");
@ -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,10 +139,9 @@ 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,14 +156,12 @@ 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";
} }
this->OutputExtension += patch; this->OutputExtension += patch;
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();

File diff suppressed because it is too large Load Diff

View File

@ -31,18 +31,18 @@ public:
virtual ~cmCPackDebGenerator(); virtual ~cmCPackDebGenerator();
static bool CanGenerate() static bool CanGenerate()
{ {
#ifdef __APPLE__ #ifdef __APPLE__
// on MacOS enable CPackDeb iff dpkg is found // on MacOS enable CPackDeb iff dpkg is found
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;
#endif #endif
} }
protected: protected:
virtual int InitializeInternal(); virtual int InitializeInternal();
@ -65,12 +65,11 @@ protected:
virtual const char* GetOutputExtension() { return ".deb"; } virtual const char* GetOutputExtension() { return ".deb"; }
virtual bool SupportsComponentInstallation() const; virtual bool SupportsComponentInstallation() const;
virtual std::string GetComponentInstallDirNameSuffix( virtual std::string GetComponentInstallDirNameSuffix(
const std::string& componentName); const std::string& componentName);
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);
@ -51,11 +50,10 @@ private:
bool singleLicense; bool singleLicense;
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,29 +20,29 @@
#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); \
static cmCPackGenerator* CreateGenerator() { return new klass; } \ static cmCPackGenerator* CreateGenerator() { return new klass; } \
class cmCPackTypeMacro_UseTrailingSemicolon class cmCPackTypeMacro_UseTrailingSemicolon
#define cmCPackLogger(logType, msg) \ #define cmCPackLogger(logType, msg) \
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.
@ -157,7 +159,7 @@ protected:
* default is "componentName" * default is "componentName"
*/ */
virtual std::string GetComponentInstallDirNameSuffix( virtual std::string GetComponentInstallDirNameSuffix(
const std::string& componentName); const std::string& componentName);
/** /**
* CPack specific generator may mangle CPACK_PACKAGE_FILE_NAME * CPack specific generator may mangle CPACK_PACKAGE_FILE_NAME
@ -169,9 +171,8 @@ protected:
* false otherwise * false otherwise
*/ */
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
@ -188,11 +189,10 @@ protected:
virtual std::string FindTemplate(const char* name); virtual std::string FindTemplate(const char* name);
virtual bool ConfigureFile(const char* inName, const char* outName, virtual bool ConfigureFile(const char* inName, const char* outName,
bool copyOnly = false); bool copyOnly = false);
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,134 +24,115 @@
#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);
} }
#endif #endif
} }
@ -161,13 +142,12 @@ cmCPackGeneratorFactory::~cmCPackGeneratorFactory()
} }
cmCPackGenerator* cmCPackGeneratorFactory::NewGenerator( 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);
gen->SetLogger(this->Logger); gen->SetLogger(this->Logger);
return gen; return gen;
@ -176,25 +156,23 @@ 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;
} }
this->GeneratorCreators[name] = createGenerator; this->GeneratorCreators[name] = createGenerator;
this->GeneratorDescriptions[name] = generatorDescription; this->GeneratorDescriptions[name] = generatorDescription;
} }

View File

@ -37,14 +37,16 @@ public:
typedef cmCPackGenerator* CreateGeneratorCall(); typedef cmCPackGenerator* CreateGeneratorCall();
void RegisterGenerator(const std::string& name, void RegisterGenerator(const std::string& name,
const char* generatorDescription, const char* generatorDescription,
CreateGeneratorCall* createGenerator); CreateGeneratorCall* createGenerator);
void SetLogger(cmCPackLog* logger) { this->Logger = logger; } void SetLogger(cmCPackLog* logger) { this->Logger = logger; }
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,37 +39,33 @@ 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;
this->LogOutput = os; this->LogOutput = 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;
@ -77,144 +73,118 @@ void cmCPackLog::Log(int tag, const char* file, int line,
// Display file and line number if debug // Display file and line number if debug
bool useFileAndLine = this->Debug; bool useFileAndLine = this->Debug;
bool output = false; bool output = false;
bool debug = false; bool debug = false;
bool warning = false; bool warning = false;
bool error = false; bool error = false;
bool verbose = false; bool verbose = false;
// 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";
} }
useFileAndLine = true; tagString = "DEBUG";
} }
if ( tag & LOG_VERBOSE && this->Verbose ) useFileAndLine = true;
{ }
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 (needTagString) {
*this->LogOutput << "[" << file << ":" << line << " " << tagString
<< "] ";
} }
if ( this->LogOutput )
{
if ( needTagString )
{
*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

@ -15,24 +15,23 @@
#include "cmObject.h" #include "cmObject.h"
#define cmCPack_Log(ctSelf, logType, msg) \ #define cmCPack_Log(ctSelf, logType, msg) \
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,
@ -56,19 +56,19 @@ public:
//! Various signatures for logging. //! Various signatures for logging.
void Log(const char* file, int line, const char* msg) void Log(const char* file, int line, const char* msg)
{ {
this->Log(LOG_OUTPUT, file, line, msg); this->Log(LOG_OUTPUT, file, line, msg);
} }
void Log(const char* file, int line, const char* msg, size_t length) void Log(const char* file, int line, const char* msg, size_t length)
{ {
this->Log(LOG_OUTPUT, file, line, msg, length); this->Log(LOG_OUTPUT, file, line, msg, length);
} }
void Log(int tag, const char* file, int line, const char* msg) void Log(int tag, const char* file, int line, const char* msg)
{ {
this->Log(tag, file, line, msg, strlen(msg)); this->Log(tag, file, line, msg, strlen(msg));
} }
void Log(int tag, const char* file, int line, const char* msg, void Log(int tag, const char* file, int line, const char* msg,
size_t length); size_t length);
//! Set Verbose //! Set Verbose
void VerboseOn() { this->SetVerbose(true); } void VerboseOn() { this->SetVerbose(true); }
@ -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,14 +40,13 @@ 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"; }
bool GetListOfSubdirectories(const char* dir, bool GetListOfSubdirectories(const char* dir,
std::vector<std::string>& dirs); std::vector<std::string>& dirs);
enum cmCPackGenerator::CPackSetDestdirSupport SupportsSetDestdir() const; enum cmCPackGenerator::CPackSetDestdirSupport SupportsSetDestdir() const;
virtual bool SupportsAbsoluteDestination() const; virtual bool SupportsAbsoluteDestination() const;
@ -54,28 +55,24 @@ 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
/// resulting string can be used within NSIS. /// resulting string can be used within NSIS.

View File

@ -36,41 +36,38 @@ 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;
std::ostringstream deleteStr; std::ostringstream deleteStr;
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;
for ( it = cpackPackageExecutablesVector.begin();
it != cpackPackageExecutablesVector.end();
++it )
{
std::string cpackExecutableName = *it;
++ it;
this->SetOptionIfNotSet("CPACK_EXECUTABLE_NAME",
cpackExecutableName.c_str());
}
} }
std::vector<std::string>::iterator it;
for (it = cpackPackageExecutablesVector.begin();
it != cpackPackageExecutablesVector.end(); ++it) {
std::string cpackExecutableName = *it;
++it;
this->SetOptionIfNotSet("CPACK_EXECUTABLE_NAME",
cpackExecutableName.c_str());
}
}
// 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,48 +87,45 @@ 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
<< std::endl); << ". Please check CPACK_PACKAGE_ICON setting."
<< std::endl);
return 0; return 0;
} }
std::string destFileName = resourcesDirectory + "/" + iconFileName; std::string destFileName = resourcesDirectory + "/" + iconFileName;
this->ConfigureFile(iconFile, destFileName.c_str(), true); this->ConfigureFile(iconFile, destFileName.c_str(), true);
this->SetOptionIfNotSet("CPACK_APPLE_GUI_ICON", iconFileName.c_str()); this->SetOptionIfNotSet("CPACK_APPLE_GUI_ICON", iconFileName.c_str());
} }
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(),
diskImageBackgroundImageDir.c_str(), "background.png", true ) || "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;
} }
// Two of the files need to have execute permission, so ensure they do: // Two of the files need to have execute permission, so ensure they do:
std::string runTimeScript = dir; std::string runTimeScript = dir;
@ -143,21 +137,21 @@ 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;
std::string tmpFile = this->GetOption("CPACK_TOPLEVEL_DIRECTORY"); std::string tmpFile = this->GetOption("CPACK_TOPLEVEL_DIRECTORY");
@ -165,56 +159,52 @@ 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;
} }
return 1; return 1;
} }
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;
} }
this->SetOptionIfNotSet("CPACK_INSTALLER_PROGRAM_DISK_IMAGE", this->SetOptionIfNotSet("CPACK_INSTALLER_PROGRAM_DISK_IMAGE",
pkgPath.c_str()); pkgPath.c_str());
@ -265,32 +255,31 @@ 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();
} }
std::string destFileName = dir; std::string destFileName = dir;
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,24 +25,23 @@ 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
* rpmbuild scream on unwanted space in filename issue * rpmbuild scream on unwanted space in filename issue
* 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,38 +67,33 @@ 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;
} }
return retval; return retval;
} }
@ -115,56 +108,48 @@ 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();
} }
return retval; return retval;
} }
int cmCPackRPMGenerator::PackageComponentsAllInOne( int cmCPackRPMGenerator::PackageComponentsAllInOne(
const std::string& compInstDirName) const std::string& compInstDirName)
{ {
int retval = 1; int retval = 1;
/* Reset package file name list it will be populated during the /* Reset package file name list it will be populated during the
@ -175,98 +160,84 @@ int cmCPackRPMGenerator::PackageComponentsAllInOne(
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);
// 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;
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")) {
{
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;
} }
return retval; return retval;
} }
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 {
} return false;
else
{
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 {
} return componentName;
else
{
return componentName;
}
} }
}

View File

@ -35,7 +35,7 @@ public:
virtual ~cmCPackRPMGenerator(); virtual ~cmCPackRPMGenerator();
static bool CanGenerate() static bool CanGenerate()
{ {
#ifdef __APPLE__ #ifdef __APPLE__
// on MacOS enable CPackRPM iff rpmbuild is found // on MacOS enable CPackRPM iff rpmbuild is found
std::vector<std::string> locations; std::vector<std::string> locations;
@ -46,7 +46,7 @@ public:
// legacy behavior on other systems // legacy behavior on other systems
return true; return true;
#endif #endif
} }
protected: protected:
virtual int InitializeInternal(); virtual int InitializeInternal();
@ -69,7 +69,7 @@ protected:
virtual const char* GetOutputExtension() { return ".rpm"; } virtual const char* GetOutputExtension() { return ".rpm"; }
virtual bool SupportsComponentInstallation() const; virtual bool SupportsComponentInstallation() const;
virtual std::string GetComponentInstallDirNameSuffix( virtual std::string GetComponentInstallDirNameSuffix(
const std::string& componentName); const std::string& componentName);
void AddGeneratedPackageNames(); void AddGeneratedPackageNames();
}; };

View File

@ -37,12 +37,11 @@ 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());
this->SetOptionIfNotSet("CPACK_AT_SIGN", "@"); this->SetOptionIfNotSet("CPACK_AT_SIGN", "@");
@ -51,28 +50,26 @@ 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;
} }
/* TGZ generator (our Superclass) may /* TGZ generator (our Superclass) may
* 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 |
S_IRGRP | S_IWGRP | S_IXGRP | S_IRGRP | S_IWGRP | S_IXGRP |
S_IROTH | S_IWOTH | S_IXOTH S_IROTH | S_IWOTH | S_IXOTH
#endif #endif
); );
} }
return retval; return retval;
} }
@ -87,10 +84,9 @@ 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",
licenseText.c_str()); licenseText.c_str());
@ -100,10 +96,9 @@ 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";
} }
// Configure in the values // Configure in the values
std::string res; std::string res;
@ -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;
} }
counter ++; ++ptr;
cmCPackLogger(cmCPackLog::LOG_DEBUG, }
"Number of lines: " << counter << std::endl); counter++;
cmCPackLogger(cmCPackLog::LOG_DEBUG, "Number of lines: " << counter
<< 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,33 +59,31 @@ 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,
void* call_data) void* call_data)
{ {
(void)argument; (void)argument;
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;
} }
std::string key = value.substr(0, pos); std::string key = value.substr(0, pos);
value = value.c_str() + pos + 1; value = value.c_str() + pos + 1;
def->Map[key] = value; def->Map[key] = value;
cmCPack_Log(def->Log, cmCPackLog::LOG_DEBUG, "Set CPack variable: " cmCPack_Log(def->Log, cmCPackLog::LOG_DEBUG, "Set CPack variable: "
<< key << " to \"" << value << "\"" << std::endl); << key << " to \"" << value << "\"" << std::endl);
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,12 +100,12 @@ 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;
} }
std::string generator; std::string generator;
bool help = false; bool help = false;
@ -142,9 +135,9 @@ int main (int argc, char const* const* argv)
// Help arguments // Help arguments
arg.AddArgument("--help", argT::NO_ARGUMENT, &help, "CPack help"); arg.AddArgument("--help", argT::NO_ARGUMENT, &help, "CPack help");
arg.AddArgument("--help-full", argT::SPACE_ARGUMENT, &helpFull, arg.AddArgument("--help-full", argT::SPACE_ARGUMENT, &helpFull,
"CPack help"); "CPack help");
arg.AddArgument("--help-html", argT::SPACE_ARGUMENT, &helpHTML, arg.AddArgument("--help-html", argT::SPACE_ARGUMENT, &helpHTML,
"CPack help"); "CPack help");
arg.AddArgument("--help-man", argT::SPACE_ARGUMENT, &helpMAN, "CPack help"); arg.AddArgument("--help-man", argT::SPACE_ARGUMENT, &helpMAN, "CPack help");
arg.AddArgument("--version", argT::NO_ARGUMENT, &helpVersion, "CPack help"); arg.AddArgument("--version", argT::NO_ARGUMENT, &helpVersion, "CPack help");
@ -152,42 +145,39 @@ int main (int argc, char const* const* argv)
arg.AddArgument("--verbose", argT::NO_ARGUMENT, &verbose, "-V"); arg.AddArgument("--verbose", argT::NO_ARGUMENT, &verbose, "-V");
arg.AddArgument("--debug", argT::NO_ARGUMENT, &debug, "-V"); arg.AddArgument("--debug", argT::NO_ARGUMENT, &debug, "-V");
arg.AddArgument("--config", argT::SPACE_ARGUMENT, &cpackConfigFile, arg.AddArgument("--config", argT::SPACE_ARGUMENT, &cpackConfigFile,
"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);
} }
cmCPack_Log(&log, cmCPackLog::LOG_VERBOSE, cmCPack_Log(&log, cmCPackLog::LOG_VERBOSE,
"Read CPack config file: " << cpackConfigFile << std::endl); "Read CPack config file: " << cpackConfigFile << std::endl);
cmake cminst; cmake cminst;
cminst.SetHomeDirectory(""); cminst.SetHomeDirectory("");
@ -196,18 +186,17 @@ int main (int argc, char const* const* argv)
cminst.GetState()->RemoveUnscriptableCommands(); cminst.GetState()->RemoveUnscriptableCommands();
cmGlobalGenerator cmgg(&cminst); cmGlobalGenerator cmgg(&cminst);
cmsys::auto_ptr<cmMakefile> globalMF( cmsys::auto_ptr<cmMakefile> globalMF(
new cmMakefile(&cmgg, cminst.GetCurrentSnapshot())); new cmMakefile(&cmgg, cminst.GetCurrentSnapshot()));
#if defined(__CYGWIN__) #if defined(__CYGWIN__)
globalMF->AddDefinition("CMAKE_LEGACY_CYGWIN_WIN32", "0"); globalMF->AddDefinition("CMAKE_LEGACY_CYGWIN_WIN32", "0");
#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;
} }
cmCPackGeneratorFactory generators; cmCPackGeneratorFactory generators;
generators.SetLogger(&log); generators.SetLogger(&log);
@ -220,262 +209,225 @@ 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 {
} help = false;
else }
{
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;
} }
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;
} }
if (parsed && if (parsed &&
!(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"
<< "Specify CPACK_PACKAGE_VERSION, or " << std::endl
"CPACK_PACKAGE_VERSION_MAJOR, " << "Specify CPACK_PACKAGE_VERSION, or "
"CPACK_PACKAGE_VERSION_MINOR, and CPACK_PACKAGE_VERSION_PATCH." "CPACK_PACKAGE_VERSION_MAJOR, "
<< std::endl); "CPACK_PACKAGE_VERSION_MINOR, and "
"CPACK_PACKAGE_VERSION_PATCH."
<< 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 "
"CPACK_INSTALLED_DIRECTORIES." "CPACK_INSTALLED_DIRECTORIES."
<< 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;
}
} }
} }
} }
} }
} }
}
/* In this case we are building the documentation object /* In this case we are building the documentation object
* 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;
} }
return 0; return 0;
} }

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,69 +83,68 @@ 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;
cmsys::RegularExpression RegexCheckOut; cmsys::RegularExpression RegexCheckOut;
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;
}
}; };
std::string cmCTestBZR::LoadInfo() 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> ");
@ -164,7 +158,7 @@ void cmCTestBZR::NoteOldRevision()
this->OldRevision = this->LoadInfo(); this->OldRevision = this->LoadInfo();
this->Log << "Revision before update: " << this->OldRevision << "\n"; this->Log << "Revision before update: " << this->OldRevision << "\n";
cmCTestLog(this->CTest, HANDLER_OUTPUT, " Old revision of repository is: " cmCTestLog(this->CTest, HANDLER_OUTPUT, " Old revision of repository is: "
<< this->OldRevision << "\n"); << this->OldRevision << "\n");
this->PriorRev.Rev = this->OldRevision; this->PriorRev.Rev = this->OldRevision;
} }
@ -173,35 +167,38 @@ void cmCTestBZR::NoteNewRevision()
this->NewRevision = this->LoadInfo(); this->NewRevision = this->LoadInfo();
this->Log << "Revision after update: " << this->NewRevision << "\n"; this->Log << "Revision after update: " << this->NewRevision << "\n";
cmCTestLog(this->CTest, HANDLER_OUTPUT, " New revision of repository is: " cmCTestLog(this->CTest, HANDLER_OUTPUT, " New revision of repository is: "
<< this->NewRevision << "\n"); << this->NewRevision << "\n");
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;
typedef cmCTestBZR::Revision Revision; typedef cmCTestBZR::Revision Revision;
typedef cmCTestBZR::Change Change; typedef cmCTestBZR::Change Change;
Revision Rev; Revision Rev;
std::vector<Change> Changes; std::vector<Change> Changes;
Change CurChange; Change CurChange;
@ -210,194 +207,161 @@ private:
cmsys::RegularExpression EmailRegex; cmsys::RegularExpression EmailRegex;
virtual bool ProcessChunk(const char* data, int length) virtual bool ProcessChunk(const char* data, int length)
{ {
this->OutputLogger::ProcessChunk(data, length); this->OutputLogger::ProcessChunk(data, length);
this->ParseChunk(data, length); this->ParseChunk(data, length);
return true; return true;
} }
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();
}
} }
}
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();
}
virtual void ReportError(int, int, const char* msg) virtual void ReportError(int, int, const char* msg)
{ {
this->BZR->Log << "Error parsing bzr log xml: " << msg << "\n"; this->BZR->Log << "Error parsing bzr log xml: " << msg << "\n";
} }
}; };
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;
virtual bool ProcessChunk(const char* first, int length) virtual bool ProcessChunk(const char* first, int length)
{ {
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;
} }
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;
}
} }
return true;
} }
return true;
}
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;
}
} }
}
}; };
bool cmCTestBZR::UpdateImpl() 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());
// TODO: if(this->CTest->GetTestModel() == cmCTest::NIGHTLY) // TODO: if(this->CTest->GetTestModel() == cmCTest::NIGHTLY)
@ -407,11 +371,10 @@ 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());
} }
bzr_update.push_back(this->URL.c_str()); bzr_update.push_back(this->URL.c_str());
@ -427,82 +390,79 @@ 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> ");
this->RunChild(bzr_log, &out, &err); this->RunChild(bzr_log, &out, &err);
} }
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;
}
} }
}
}; };
void cmCTestBZR::LoadModifications() 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,18 +30,17 @@ 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";
} }
fout.flush(); fout.flush();
fout.close(); fout.close();
} }
@ -49,13 +48,13 @@ void cmCTestBatchTestHandler::WriteBatchScript()
void cmCTestBatchTestHandler::WriteSrunArgs(int test, cmsys::ofstream& fout) void cmCTestBatchTestHandler::WriteSrunArgs(int test, cmsys::ofstream& fout)
{ {
cmCTestTestHandler::cmCTestTestProperties* properties = cmCTestTestHandler::cmCTestTestProperties* properties =
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,14 +65,12 @@ 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 << " ";
} }
} }
void cmCTestBatchTestHandler::WriteTestCommand(int test, cmsys::ofstream& fout) void cmCTestBatchTestHandler::WriteTestCommand(int test, cmsys::ofstream& fout)
@ -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 << " ";
} }
//TODO ZACH build TestResult.FullCommandLine fout << " ";
//this->TestResult.FullCommandLine = this->TestCommand; }
// TODO ZACH build TestResult.FullCommandLine
// 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

@ -21,9 +21,9 @@
cmCTestBuildAndTestHandler::cmCTestBuildAndTestHandler() cmCTestBuildAndTestHandler::cmCTestBuildAndTestHandler()
{ {
this->BuildTwoConfig = false; this->BuildTwoConfig = false;
this->BuildNoClean = false; this->BuildNoClean = false;
this->BuildNoCMake = false; this->BuildNoCMake = false;
this->Timeout = 0; this->Timeout = 0;
} }
@ -48,91 +48,75 @@ 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;
} }
}
out << "======== CMake output ======\n"; out << "======== CMake output ======\n";
out << cmakeOutString; out << cmakeOutString;
out << "======== End CMake output ======\n"; out << "======== End CMake output ======\n";
@ -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,37 +146,36 @@ 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);
cmSystemTools::SetStderrCallback(CMakeOutputCallback, &s); cmSystemTools::SetStderrCallback(CMakeOutputCallback, &s);
this->CM.SetProgressCallback(CMakeProgressCallback, &s); this->CM.SetProgressCallback(CMakeProgressCallback, &s);
} }
~cmCTestBuildAndTestCaptureRAII() ~cmCTestBuildAndTestCaptureRAII()
{ {
this->CM.SetProgressCallback(0, 0); this->CM.SetProgressCallback(0, 0);
cmSystemTools::SetStderrCallback(0, 0); cmSystemTools::SetStderrCallback(0, 0);
cmSystemTools::SetStdoutCallback(0, 0); cmSystemTools::SetStdoutCallback(0, 0);
cmSystemTools::SetMessageCallback(0, 0); cmSystemTools::SetMessageCallback(0, 0);
} }
}; };
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 "
{ "be provided using the --build-generator "
*outstring = "command line option. ";
"--build-and-test requires that the generator "
"be provided using the --build-generator "
"command line option. ";
}
return 1;
} }
return 1;
}
cmake cm; cmake cm;
cm.SetHomeDirectory(""); cm.SetHomeDirectory("");
@ -202,27 +185,21 @@ 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(), failed);
resultingConfig, if (!fullPath.empty() && !resultingConfig.empty()) {
extraPaths,
failed);
if (!fullPath.empty() && !resultingConfig.empty())
{
this->CTest->SetConfigType(resultingConfig.c_str()); this->CTest->SetConfigType(resultingConfig.c_str());
}
out << "Using config sample with results: "
<< fullPath << " and " << resultingConfig << std::endl;
} }
out << "Using config sample with results: " << fullPath << " and "
<< 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
// and test time // and test time
@ -230,100 +207,79 @@ 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;
} }
}
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;
} }
// now run the compiled test if we can find it // now run the compiled test if we can find it
// store the final location in fullPath // store the final location in fullPath
@ -331,99 +287,80 @@ 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;
extraPaths.push_back(tempPath); extraPaths.push_back(tempPath);
} }
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
cmSystemTools::ChangeDirectory(cwd); cmSystemTools::ChangeDirectory(cwd);
return 1; return 1;
} }
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,31 +49,29 @@ 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;
std::string BuildGenerator; std::string BuildGenerator;
std::string BuildGeneratorPlatform; std::string BuildGeneratorPlatform;
std::string BuildGeneratorToolset; std::string BuildGeneratorToolset;
std::vector<std::string> BuildOptions; std::vector<std::string> BuildOptions;
bool BuildTwoConfig; bool BuildTwoConfig;
std::string BuildMakeProgram; std::string BuildMakeProgram;
std::string ConfigSample; std::string ConfigSample;
std::string SourceDir; std::string SourceDir;
std::string BinaryDir; std::string BinaryDir;
std::string BuildProject; std::string BuildProject;
std::string TestCommand; std::string TestCommand;
bool BuildNoClean; bool BuildNoClean;
std::string BuildRunDir; std::string BuildRunDir;
std::string ExecutableDirectory; std::string ExecutableDirectory;
std::vector<std::string> TestCommandArgs; std::vector<std::string> TestCommandArgs;
std::vector<std::string> BuildTargets; std::vector<std::string> BuildTargets;
bool BuildNoCMake; bool BuildNoCMake;
double Timeout; double Timeout;
}; };
#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,37 +32,31 @@ cmCTestBuildCommand::cmCTestBuildCommand()
cmCTestBuildCommand::~cmCTestBuildCommand() cmCTestBuildCommand::~cmCTestBuildCommand()
{ {
if ( this->GlobalGenerator ) if (this->GlobalGenerator) {
{
delete this->GlobalGenerator; delete this->GlobalGenerator;
this->GlobalGenerator = 0; this->GlobalGenerator = 0;
} }
} }
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,81 +65,71 @@ 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 += "\"";
this->Makefile->IssueMessage(cmake::FATAL_ERROR, e); this->Makefile->IssueMessage(cmake::FATAL_ERROR, e);
cmSystemTools::SetFatalErrorOccured(); cmSystemTools::SetFatalErrorOccured();
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 "
@ -163,39 +146,35 @@ cmCTestGenericHandler* cmCTestBuildCommand::InitializeHandler()
/* clang-format on */ /* clang-format on */
this->SetError(ostr.str()); this->SetError(ostr.str());
return 0; return 0;
}
} }
}
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);
} }
handler->SetQuiet(this->Quiet); handler->SetQuiet(this->Quiet);
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();
@ -33,20 +32,20 @@ public:
* This is a virtual constructor for the command. * This is a virtual constructor for the command.
*/ */
virtual cmCommand* Clone() virtual cmCommand* Clone()
{ {
cmCTestBuildCommand* ni = new cmCTestBuildCommand; cmCTestBuildCommand* ni = new cmCTestBuildCommand;
ni->CTest = this->CTest; ni->CTest = this->CTest;
ni->CTestScriptHandler = this->CTestScriptHandler; ni->CTestScriptHandler = this->CTestScriptHandler;
return ni; return ni;
} }
/** /**
* 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,48 +40,48 @@ 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
}; };
class cmCTestCompileErrorWarningRex class cmCTestCompileErrorWarningRex
{ {
public: public:
cmCTestCompileErrorWarningRex() {} cmCTestCompileErrorWarningRex() {}
int FileIndex; int FileIndex;
int LineIndex; int LineIndex;
cmsys::RegularExpression RegularExpression; cmsys::RegularExpression RegularExpression;
}; };
struct cmCTestBuildErrorWarning struct cmCTestBuildErrorWarning
{ {
bool Error; bool Error;
int LogLine; int LogLine;
std::string Text; std::string Text;
std::string SourceFile; std::string SourceFile;
std::string SourceFileTail; std::string SourceFileTail;
int LineNumber; int LineNumber;
std::string PreContext; std::string PreContext;
std::string PostContext; std::string PostContext;
}; };
@ -94,10 +94,10 @@ private:
bool IsLaunchedErrorFile(const char* fname); bool IsLaunchedErrorFile(const char* fname);
bool IsLaunchedWarningFile(const char* fname); bool IsLaunchedWarningFile(const char* fname);
std::string StartBuild; std::string StartBuild;
std::string EndBuild; std::string EndBuild;
double StartBuildTime; double StartBuildTime;
double EndBuildTime; double EndBuildTime;
std::vector<std::string> CustomErrorMatches; std::vector<std::string> CustomErrorMatches;
std::vector<std::string> CustomErrorExceptions; std::vector<std::string> CustomErrorExceptions;
@ -115,34 +115,35 @@ 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;
t_BuildProcessingQueueType BuildProcessingErrorQueue; t_BuildProcessingQueueType BuildProcessingErrorQueue;
size_t BuildOutputLogSize; size_t BuildOutputLogSize;
std::vector<char> CurrentProcessingLine; std::vector<char> CurrentProcessingLine;
std::string SimplifySourceDir; std::string SimplifySourceDir;
std::string SimplifyBuildDir; std::string SimplifyBuildDir;
size_t OutputLineCounter; size_t OutputLineCounter;
typedef std::vector<cmCTestBuildErrorWarning> t_ErrorsAndWarningsVector; typedef std::vector<cmCTestBuildErrorWarning> t_ErrorsAndWarningsVector;
t_ErrorsAndWarningsVector ErrorsAndWarnings; t_ErrorsAndWarningsVector ErrorsAndWarnings;
t_ErrorsAndWarningsVector::iterator LastErrorOrWarning; t_ErrorsAndWarningsVector::iterator LastErrorOrWarning;
size_t PostContextCount; size_t PostContextCount;
size_t MaxPreContext; size_t MaxPreContext;
size_t MaxPostContext; size_t MaxPostContext;
std::deque<std::string> PreContext; std::deque<std::string> PreContext;
int TotalErrors; int TotalErrors;
int TotalWarnings; int TotalWarnings;
char LastTickChar; char LastTickChar;
bool ErrorQuotaReached; bool ErrorQuotaReached;
bool WarningQuotaReached; bool WarningQuotaReached;
int MaxErrors; int MaxErrors;
int MaxWarnings; int MaxWarnings;
bool UseCTestLaunch; bool UseCTestLaunch;
std::string CTestLaunchDir; std::string CTestLaunchDir;

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,11 +27,12 @@ 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".
this->RegexFileUpdated.compile("^([UP]) *(.*)"); this->RegexFileUpdated.compile("^([UP]) *(.*)");
@ -41,7 +43,8 @@ public:
this->RegexFileRemoved2.compile( this->RegexFileRemoved2.compile(
"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;
@ -51,68 +54,55 @@ private:
cmsys::RegularExpression RegexFileRemoved2; cmsys::RegularExpression RegexFileRemoved2;
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;
}
void DoFile(PathStatus status, std::string const& file) void DoFile(PathStatus status, std::string const& file)
{ {
std::string dir = cmSystemTools::GetFilenamePath(file); std::string dir = cmSystemTools::GetFilenamePath(file);
std::string name = cmSystemTools::GetFilenameName(file); std::string name = cmSystemTools::GetFilenameName(file);
this->CVS->Dirs[dir][name] = status; this->CVS->Dirs[dir][name] = status;
} }
}; };
bool cmCTestCVS::UpdateImpl() 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");
} }
// Run "cvs update" to update the work tree. // Run "cvs update" to update the work tree.
std::vector<char const*> cvs_update; std::vector<char const*> cvs_update;
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);
UpdateParser out(this, "up-out> "); UpdateParser out(this, "up-out> ");
@ -120,83 +110,76 @@ 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";
}
} }
return this->Section != SectionEnd;
} }
return this->Section != SectionEnd;
}
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,65 +189,57 @@ 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;
}
} }
this->Rev = Revision();
} }
this->Rev = Revision();
}
}; };
std::string cmCTestCVS::ComputeBranchFlag(std::string const& dir) 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;
} }
tagFile += "/CVS/Tag"; tagFile += "/CVS/Tag";
// 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,25 +248,23 @@ 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);
} }
this->LoadRevisions(full, branchFlag.c_str(), revisions); this->LoadRevisions(full, branchFlag.c_str(), revisions);
revisions.resize(2, this->Unknown); revisions.resize(2, this->Unknown);
// Write the entry for this file with these revisions. // Write the entry for this file with these revisions.
File f(fi->second, &revisions[0], &revisions[1]); File f(fi->second, &revisions[0], &revisions[1]);
this->WriteXMLEntry(xml, path, fi->first, full, f); this->WriteXMLEntry(xml, path, fi->first, full, f);
} }
xml.EndElement(); // Directory xml.EndElement(); // Directory
} }
@ -299,13 +272,14 @@ 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);
} }
cmCTestLog(this->CTest, HANDLER_OUTPUT, std::endl); cmCTestLog(this->CTest, HANDLER_OUTPUT, std::endl);

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,64 +26,56 @@ 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;
} }
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;
} }
std::string cmakeConfigureCommand = "\""; std::string cmakeConfigureCommand = "\"";
cmakeConfigureCommand += cmSystemTools::GetCMakeCommand(); cmakeConfigureCommand += cmSystemTools::GetCMakeCommand();
@ -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,19 +91,17 @@ 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 += "\"";
} }
cmakeConfigureCommand += " \"-G"; cmakeConfigureCommand += " \"-G";
cmakeConfigureCommand += cmakeGeneratorName; cmakeConfigureCommand += cmakeGeneratorName;
@ -120,46 +109,42 @@ 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 += "\"";
} }
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 += "\"";
} }
cmakeConfigureCommand += " \""; cmakeConfigureCommand += " \"";
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;
} }
handler->SetQuiet(this->Quiet); handler->SetQuiet(this->Quiet);
return handler; return handler;
} }

View File

@ -28,29 +28,29 @@ public:
* This is a virtual constructor for the command. * This is a virtual constructor for the command.
*/ */
virtual cmCommand* Clone() virtual cmCommand* Clone()
{ {
cmCTestConfigureCommand* ni = new cmCTestConfigureCommand; cmCTestConfigureCommand* ni = new cmCTestConfigureCommand;
ni->CTest = this->CTest; ni->CTest = this->CTest;
ni->CTestScriptHandler = this->CTestScriptHandler; ni->CTestScriptHandler = this->CTestScriptHandler;
return ni; return ni;
} }
/** /**
* 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,64 +27,58 @@ 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);
return -1; return -1;
} }
double elapsed_time_start = cmSystemTools::GetTime(); double elapsed_time_start = cmSystemTools::GetTime();
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");
@ -97,23 +90,23 @@ int cmCTestConfigureHandler::ProcessHandler()
xml.Element("ConfigureStatus", retVal); xml.Element("ConfigureStatus", retVal);
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;
} }
return 0; return 0;
} }

View File

@ -21,23 +21,22 @@ 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);
} }
handler->SetQuiet(this->Quiet); handler->SetQuiet(this->Quiet);
return handler; return handler;
@ -46,12 +45,11 @@ 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;
} }
// Look for other arguments. // Look for other arguments.
return this->Superclass::CheckArgumentKeyword(arg); return this->Superclass::CheckArgumentKeyword(arg);
@ -60,11 +58,10 @@ 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;
} }
// Look for other arguments. // Look for other arguments.
return this->Superclass::CheckArgumentValue(arg); return this->Superclass::CheckArgumentValue(arg);

View File

@ -22,24 +22,23 @@
class cmCTestCoverageCommand : public cmCTestHandlerCommand class cmCTestCoverageCommand : public cmCTestHandlerCommand
{ {
public: public:
cmCTestCoverageCommand(); cmCTestCoverageCommand();
/** /**
* This is a virtual constructor for the command. * This is a virtual constructor for the command.
*/ */
virtual cmCommand* Clone() virtual cmCommand* Clone()
{ {
cmCTestCoverageCommand* ni = new cmCTestCoverageCommand; cmCTestCoverageCommand* ni = new cmCTestCoverageCommand;
ni->CTest = this->CTest; ni->CTest = this->CTest;
ni->CTestScriptHandler = this->CTestScriptHandler; ni->CTestScriptHandler = this->CTestScriptHandler;
return ni; return ni;
} }
/** /**
* 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,14 +54,14 @@ 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);
private: private:
bool ShouldIDoCoverage(const char* file, const char* srcDir, bool ShouldIDoCoverage(const char* file, const char* srcDir,
const char* binDir); const char* binDir);
void CleanCoverageLogFiles(std::ostream& log); void CleanCoverageLogFiles(std::ostream& log);
bool StartCoverageLogFile(cmGeneratedFileStream& ostr, int logFileCount); bool StartCoverageLogFile(cmGeneratedFileStream& ostr, int logFileCount);
void EndCoverageLogFile(cmGeneratedFileStream& ostr, int logFileCount); void EndCoverageLogFile(cmGeneratedFileStream& ostr, int logFileCount);
@ -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, std::string& outputFile);
const char* arg, bool ParseBullsEyeCovsrcLine(std::string const& inputLine,
std::string& outputFile); std::string& sourceFile, int& functionsCalled,
bool ParseBullsEyeCovsrcLine( int& totalFunctions, int& percentFunction,
std::string const& inputLine, int& branchCovered, int& totalBranches,
std::string& sourceFile, int& percentBranch);
int& functionsCalled, bool GetNextInt(std::string const& inputLine, std::string::size_type& pos,
int& totalFunctions,
int& percentFunction,
int& branchCovered,
int& totalBranches,
int& percentBranch);
bool GetNextInt(std::string const& inputLine,
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);
@ -126,7 +119,7 @@ private:
// Find the source file based on the source and build tree. This is used for // Find the source file based on the source and build tree. This is used for
// Trace.py mode, since that one does not tell us where the source file is. // Trace.py mode, since that one does not tell us where the source file is.
std::string FindFile(cmCTestCoverageHandlerContainer* cont, std::string FindFile(cmCTestCoverageHandlerContainer* cont,
std::string fileName); std::string fileName);
std::set<std::string> FindUncoveredFiles( std::set<std::string> FindUncoveredFiles(
cmCTestCoverageHandlerContainer* cont); 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,115 +42,95 @@ 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")
{
this->VerifyHostOff = true;
}
} }
if (*i == "CURLOPT_SSL_VERIFYHOST_OFF") {
this->VerifyHostOff = true;
}
}
} }
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
curl_easy_setopt(this->Curl, CURLOPT_FAILONERROR, 1); curl_easy_setopt(this->Curl, CURLOPT_FAILONERROR, 1);
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);
} }
/* HTTP PUT please */ /* HTTP PUT please */
::curl_easy_setopt(this->Curl, CURLOPT_PUT, 1); ::curl_easy_setopt(this->Curl, CURLOPT_PUT, 1);
::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;
} }
// set the url // set the url
std::string upload_url = url; std::string upload_url = url;
upload_url += "?"; upload_url += "?";
@ -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,108 +160,90 @@ 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;
} }
curl_easy_setopt(this->Curl, CURLOPT_POST, 1); curl_easy_setopt(this->Curl, CURLOPT_POST, 1);
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");
} }
cmCTestLog(this->CTest, DEBUG, "Curl res: " << res << "\n"); cmCTestLog(this->CTest, DEBUG, "Curl res: " << res << "\n");
return (res == 0); return (res == 0);
} }
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") )
{
this->HTTPProxyAuth = cmSystemTools::GetEnv("HTTP_PROXY_USER");
}
if ( cmSystemTools::GetEnv("HTTP_PROXY_PASSWD") )
{
this->HTTPProxyAuth += ":";
this->HTTPProxyAuth += cmSystemTools::GetEnv("HTTP_PROXY_PASSWD");
} }
} }
if (cmSystemTools::GetEnv("HTTP_PROXY_USER")) {
this->HTTPProxyAuth = cmSystemTools::GetEnv("HTTP_PROXY_USER");
}
if (cmSystemTools::GetEnv("HTTP_PROXY_PASSWD")) {
this->HTTPProxyAuth += ":";
this->HTTPProxyAuth += cmSystemTools::GetEnv("HTTP_PROXY_PASSWD");
}
}
} }

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