summaryrefslogtreecommitdiffstats
path: root/Source
diff options
context:
space:
mode:
Diffstat (limited to 'Source')
-rw-r--r--Source/CMakeLists.txt2
-rw-r--r--Source/CMakeVersion.cmake2
-rw-r--r--Source/CPack/cmCPackBundleGenerator.cxx14
-rw-r--r--Source/CTest/cmCTestMultiProcessHandler.cxx13
-rw-r--r--Source/CTest/cmCTestRunTest.cxx73
-rw-r--r--Source/CTest/cmCTestRunTest.h9
-rw-r--r--Source/cmCTest.cxx37
-rw-r--r--Source/cmCTest.h12
-rw-r--r--Source/cmExtraQbsGenerator.cxx260
-rw-r--r--Source/cmExtraQbsGenerator.h48
-rw-r--r--Source/cmFileCommand.cxx62
-rw-r--r--Source/cmGlobalXCodeGenerator.cxx12
-rw-r--r--Source/cmQtAutoGenerators.cxx14
-rw-r--r--Source/cmTarget.cxx16
-rw-r--r--Source/cmTarget.h3
-rw-r--r--Source/cmake.cxx4
-rw-r--r--Source/ctest.cxx2
-rw-r--r--Source/kwsys/SystemInformation.cxx8
-rw-r--r--Source/kwsys/testHashSTL.cxx4
19 files changed, 568 insertions, 27 deletions
diff --git a/Source/CMakeLists.txt b/Source/CMakeLists.txt
index 482bd39..04f6a81 100644
--- a/Source/CMakeLists.txt
+++ b/Source/CMakeLists.txt
@@ -229,6 +229,8 @@ set(SRCS
cmExtraKateGenerator.h
cmExtraSublimeTextGenerator.cxx
cmExtraSublimeTextGenerator.h
+ cmExtraQbsGenerator.cxx
+ cmExtraQbsGenerator.h
cmFileLock.cxx
cmFileLock.h
cmFileLockPool.cxx
diff --git a/Source/CMakeVersion.cmake b/Source/CMakeVersion.cmake
index 0d92bcf..5ef57ab 100644
--- a/Source/CMakeVersion.cmake
+++ b/Source/CMakeVersion.cmake
@@ -1,5 +1,5 @@
# CMake version number components.
set(CMake_VERSION_MAJOR 3)
set(CMake_VERSION_MINOR 2)
-set(CMake_VERSION_PATCH 20150318)
+set(CMake_VERSION_PATCH 20150323)
#set(CMake_VERSION_RC 1)
diff --git a/Source/CPack/cmCPackBundleGenerator.cxx b/Source/CPack/cmCPackBundleGenerator.cxx
index 6e7a26b..b2d7019 100644
--- a/Source/CPack/cmCPackBundleGenerator.cxx
+++ b/Source/CPack/cmCPackBundleGenerator.cxx
@@ -221,6 +221,11 @@ int cmCPackBundleGenerator::SignBundle(const std::string& src_dir)
bundle_path += ".app";
// A list of additional files to sign, ie. frameworks and plugins.
+ const std::string sign_parameter =
+ this->GetOption("CPACK_BUNDLE_APPLE_CODESIGN_PARAMETER")
+ ? this->GetOption("CPACK_BUNDLE_APPLE_CODESIGN_PARAMETER")
+ : "--deep -f";
+
const std::string sign_files =
this->GetOption("CPACK_BUNDLE_APPLE_CODESIGN_FILES")
? this->GetOption("CPACK_BUNDLE_APPLE_CODESIGN_FILES") : "";
@@ -234,7 +239,8 @@ int cmCPackBundleGenerator::SignBundle(const std::string& src_dir)
{
std::ostringstream temp_sign_file_cmd;
temp_sign_file_cmd << this->GetOption("CPACK_COMMAND_CODESIGN");
- temp_sign_file_cmd << " --deep -f -s \"" << cpack_apple_cert_app;
+ temp_sign_file_cmd << " " << sign_parameter << " -s \""
+ << cpack_apple_cert_app;
temp_sign_file_cmd << "\" -i ";
temp_sign_file_cmd << this->GetOption("CPACK_APPLE_BUNDLE_ID");
temp_sign_file_cmd << " \"";
@@ -254,7 +260,8 @@ int cmCPackBundleGenerator::SignBundle(const std::string& src_dir)
// sign main binary
std::ostringstream temp_sign_binary_cmd;
temp_sign_binary_cmd << this->GetOption("CPACK_COMMAND_CODESIGN");
- temp_sign_binary_cmd << " --deep -f -s \"" << cpack_apple_cert_app;
+ temp_sign_binary_cmd << " " << sign_parameter << " -s \""
+ << cpack_apple_cert_app;
temp_sign_binary_cmd << "\" \"" << bundle_path << "\"";
if(!this->RunCommand(temp_sign_binary_cmd, &output))
@@ -269,7 +276,8 @@ int cmCPackBundleGenerator::SignBundle(const std::string& src_dir)
// sign app bundle
std::ostringstream temp_codesign_cmd;
temp_codesign_cmd << this->GetOption("CPACK_COMMAND_CODESIGN");
- temp_codesign_cmd << " --deep -f -s \"" << cpack_apple_cert_app << "\"";
+ temp_codesign_cmd << " " << sign_parameter << " -s \""
+ << cpack_apple_cert_app << "\"";
if(this->GetOption("CPACK_BUNDLE_APPLE_ENTITLEMENTS"))
{
temp_codesign_cmd << " --entitlements ";
diff --git a/Source/CTest/cmCTestMultiProcessHandler.cxx b/Source/CTest/cmCTestMultiProcessHandler.cxx
index eb33d8e..bd090db 100644
--- a/Source/CTest/cmCTestMultiProcessHandler.cxx
+++ b/Source/CTest/cmCTestMultiProcessHandler.cxx
@@ -121,6 +121,11 @@ void cmCTestMultiProcessHandler::StartTestProcess(int test)
this->RunningCount += GetProcessorsUsed(test);
cmCTestRunTest* testRun = new cmCTestRunTest(this->TestHandler);
+ if(this->CTest->GetRepeatUntilFail())
+ {
+ testRun->SetRunUntilFailOn();
+ testRun->SetNumberOfRuns(this->CTest->GetTestRepeat());
+ }
testRun->SetIndex(test);
testRun->SetTestProperties(this->Properties[test]);
@@ -289,7 +294,13 @@ bool cmCTestMultiProcessHandler::CheckOutput()
cmCTestRunTest* p = *i;
int test = p->GetIndex();
- if(p->EndTest(this->Completed, this->Total, true))
+ bool testResult = p->EndTest(this->Completed, this->Total, true);
+ if(p->StartAgain())
+ {
+ this->Completed--; // remove the completed test because run again
+ continue;
+ }
+ if(testResult)
{
this->Passed->push_back(p->GetTestProperties()->Name);
}
diff --git a/Source/CTest/cmCTestRunTest.cxx b/Source/CTest/cmCTestRunTest.cxx
index 01a7884..d7da2b4 100644
--- a/Source/CTest/cmCTestRunTest.cxx
+++ b/Source/CTest/cmCTestRunTest.cxx
@@ -33,6 +33,9 @@ cmCTestRunTest::cmCTestRunTest(cmCTestTestHandler* handler)
this->CompressedOutput = "";
this->CompressionRatio = 2;
this->StopTimePassed = false;
+ this->NumberOfRunsLeft = 1; // default to 1 run of the test
+ this->RunUntilFail = false; // default to run the test once
+ this->RunAgain = false; // default to not having to run again
}
cmCTestRunTest::~cmCTestRunTest()
@@ -357,13 +360,50 @@ bool cmCTestRunTest::EndTest(size_t completed, size_t total, bool started)
this->MemCheckPostProcess();
this->ComputeWeightedCost();
}
- // Always push the current TestResult onto the
+ // If the test does not need to rerun push the current TestResult onto the
// TestHandler vector
- this->TestHandler->TestResults.push_back(this->TestResult);
+ if(!this->NeedsToRerun())
+ {
+ this->TestHandler->TestResults.push_back(this->TestResult);
+ }
delete this->TestProcess;
return passed;
}
+bool cmCTestRunTest::StartAgain()
+{
+ if(!this->RunAgain)
+ {
+ return false;
+ }
+ this->RunAgain = false; // reset
+ // change to tests directory
+ std::string current_dir = cmSystemTools::GetCurrentWorkingDirectory();
+ cmSystemTools::ChangeDirectory(this->TestProperties->Directory);
+ this->StartTest(this->TotalNumberOfTests);
+ // change back
+ cmSystemTools::ChangeDirectory(current_dir);
+ return true;
+}
+
+bool cmCTestRunTest::NeedsToRerun()
+{
+ this->NumberOfRunsLeft--;
+ if(this->NumberOfRunsLeft == 0)
+ {
+ return false;
+ }
+ // if number of runs left is not 0, and we are running until
+ // we find a failed test, then return true so the test can be
+ // restarted
+ if(this->RunUntilFail
+ && this->TestResult.Status == cmCTestTestHandler::COMPLETED)
+ {
+ this->RunAgain = true;
+ return true;
+ }
+ return false;
+}
//----------------------------------------------------------------------
void cmCTestRunTest::ComputeWeightedCost()
{
@@ -400,6 +440,7 @@ void cmCTestRunTest::MemCheckPostProcess()
// Starts the execution of a test. Returns once it has started
bool cmCTestRunTest::StartTest(size_t total)
{
+ this->TotalNumberOfTests = total; // save for rerun case
cmCTestLog(this->CTest, HANDLER_OUTPUT, std::setw(2*getNumWidth(total) + 8)
<< "Start "
<< std::setw(getNumWidth(this->TestHandler->GetMaxIndex()))
@@ -494,10 +535,10 @@ bool cmCTestRunTest::StartTest(size_t total)
//----------------------------------------------------------------------
void cmCTestRunTest::ComputeArguments()
{
+ this->Arguments.clear(); // reset becaue this might be a rerun
std::vector<std::string>::const_iterator j =
this->TestProperties->Args.begin();
++j; // skip test name
-
// find the test executable
if(this->TestHandler->MemCheck)
{
@@ -697,10 +738,28 @@ bool cmCTestRunTest::ForkProcess(double testTimeOut, bool explicitTimeout,
void cmCTestRunTest::WriteLogOutputTop(size_t completed, size_t total)
{
- cmCTestLog(this->CTest, HANDLER_OUTPUT, std::setw(getNumWidth(total))
- << completed << "/");
- cmCTestLog(this->CTest, HANDLER_OUTPUT, std::setw(getNumWidth(total))
- << total << " ");
+ // if this is the last or only run of this test
+ // then print out completed / total
+ // Only issue is if a test fails and we are running until fail
+ // then it will never print out the completed / total, same would
+ // got for run until pass. Trick is when this is called we don't
+ // yet know if we are passing or failing.
+ if(this->NumberOfRunsLeft == 1)
+ {
+ cmCTestLog(this->CTest, HANDLER_OUTPUT, std::setw(getNumWidth(total))
+ << completed << "/");
+ cmCTestLog(this->CTest, HANDLER_OUTPUT, std::setw(getNumWidth(total))
+ << total << " ");
+ }
+ // if this is one of several runs of a test just print blank space
+ // to keep things neat
+ else
+ {
+ cmCTestLog(this->CTest, HANDLER_OUTPUT, std::setw(getNumWidth(total))
+ << " " << " ");
+ cmCTestLog(this->CTest, HANDLER_OUTPUT, std::setw(getNumWidth(total))
+ << " " << " ");
+ }
if ( this->TestHandler->MemCheck )
{
diff --git a/Source/CTest/cmCTestRunTest.h b/Source/CTest/cmCTestRunTest.h
index 476f3e1..3b5c831 100644
--- a/Source/CTest/cmCTestRunTest.h
+++ b/Source/CTest/cmCTestRunTest.h
@@ -27,6 +27,8 @@ public:
cmCTestRunTest(cmCTestTestHandler* handler);
~cmCTestRunTest();
+ void SetNumberOfRuns(int n) {this->NumberOfRunsLeft = n;}
+ void SetRunUntilFailOn() { this->RunUntilFail = true;}
void SetTestProperties(cmCTestTestHandler::cmCTestTestProperties * prop)
{ this->TestProperties = prop; }
@@ -58,7 +60,10 @@ public:
void ComputeArguments();
void ComputeWeightedCost();
+
+ bool StartAgain();
private:
+ bool NeedsToRerun();
void DartProcessing();
void ExeNotFound(std::string exe);
// Figures out a final timeout which is min(STOP_TIME, NOW+TIMEOUT)
@@ -92,6 +97,10 @@ private:
std::string ActualCommand;
std::vector<std::string> Arguments;
bool StopTimePassed;
+ bool RunUntilFail;
+ int NumberOfRunsLeft;
+ bool RunAgain;
+ size_t TotalNumberOfTests;
};
inline int getNumWidth(size_t n)
diff --git a/Source/cmCTest.cxx b/Source/cmCTest.cxx
index 1d0df69..0026fd7 100644
--- a/Source/cmCTest.cxx
+++ b/Source/cmCTest.cxx
@@ -329,6 +329,8 @@ cmCTest::cmCTest()
this->OutputTestOutputOnTestFailure = false;
this->ComputedCompressTestOutput = false;
this->ComputedCompressMemCheckOutput = false;
+ this->RepeatTests = 1; // default to run each test once
+ this->RepeatUntilFail = false;
if(cmSystemTools::GetEnv("CTEST_OUTPUT_ON_FAILURE"))
{
this->OutputTestOutputOnTestFailure = true;
@@ -1984,11 +1986,11 @@ bool cmCTest::CheckArgument(const std::string& arg, const char* varg1,
//----------------------------------------------------------------------
// Processes one command line argument (and its arguments if any)
// for many simple options and then returns
-void cmCTest::HandleCommandLineArguments(size_t &i,
- std::vector<std::string> &args)
+bool cmCTest::HandleCommandLineArguments(size_t &i,
+ std::vector<std::string> &args,
+ std::string& errormsg)
{
std::string arg = args[i];
-
if(this->CheckArgument(arg, "-F"))
{
this->Failover = true;
@@ -2006,6 +2008,27 @@ void cmCTest::HandleCommandLineArguments(size_t &i,
this->SetParallelLevel(plevel);
this->ParallelLevelSetInCli = true;
}
+ if(this->CheckArgument(arg, "--repeat-until-fail"))
+ {
+ if( i >= args.size() - 1)
+ {
+ errormsg = "'--repeat-until-fail' requires an argument";
+ return false;
+ }
+ i++;
+ long repeat = 1;
+ if(!cmSystemTools::StringToLong(args[i].c_str(), &repeat))
+ {
+ errormsg = "'--repeat-until-fail' given non-integer value '"
+ + args[i] + "'";
+ return false;
+ }
+ this->RepeatTests = static_cast<int>(repeat);
+ if(repeat > 1)
+ {
+ this->RepeatUntilFail = true;
+ }
+ }
if(this->CheckArgument(arg, "--no-compress-output"))
{
@@ -2191,6 +2214,7 @@ void cmCTest::HandleCommandLineArguments(size_t &i,
this->GetHandler("test")->SetPersistentOption("RerunFailed", "true");
this->GetHandler("memcheck")->SetPersistentOption("RerunFailed", "true");
}
+ return true;
}
//----------------------------------------------------------------------
@@ -2273,7 +2297,12 @@ int cmCTest::Run(std::vector<std::string> &args, std::string* output)
for(size_t i=1; i < args.size(); ++i)
{
// handle the simple commandline arguments
- this->HandleCommandLineArguments(i,args);
+ std::string errormsg;
+ if(!this->HandleCommandLineArguments(i,args, errormsg))
+ {
+ cmSystemTools::Error(errormsg.c_str());
+ return 1;
+ }
// handle the script arguments -S -SR -SP
this->HandleScriptArguments(i,args,SRArgumentSpecified);
diff --git a/Source/cmCTest.h b/Source/cmCTest.h
index 88191c4..3f033d9 100644
--- a/Source/cmCTest.h
+++ b/Source/cmCTest.h
@@ -429,8 +429,13 @@ public:
{
return this->Definitions;
}
-
+ // return the number of times a test should be run
+ int GetTestRepeat() { return this->RepeatTests;}
+ // return true if test should run until fail
+ bool GetRepeatUntilFail() { return this->RepeatUntilFail;}
private:
+ int RepeatTests;
+ bool RepeatUntilFail;
std::string ConfigType;
std::string ScheduleType;
std::string StopTime;
@@ -535,8 +540,9 @@ private:
bool AddVariableDefinition(const std::string &arg);
//! parse and process most common command line arguments
- void HandleCommandLineArguments(size_t &i,
- std::vector<std::string> &args);
+ bool HandleCommandLineArguments(size_t &i,
+ std::vector<std::string> &args,
+ std::string& errormsg);
//! hande the -S -SP and -SR arguments
void HandleScriptArguments(size_t &i,
diff --git a/Source/cmExtraQbsGenerator.cxx b/Source/cmExtraQbsGenerator.cxx
new file mode 100644
index 0000000..5a1f9ef
--- /dev/null
+++ b/Source/cmExtraQbsGenerator.cxx
@@ -0,0 +1,260 @@
+#include "cmExtraQbsGenerator.h"
+
+#include "cmGlobalGenerator.h"
+#include "cmLocalGenerator.h"
+#include "cmMakefile.h"
+#include "cmGeneratedFileStream.h"
+#include "cmSourceFile.h"
+
+cmExtraQbsGenerator::cmExtraQbsGenerator()
+{
+#if defined(_WIN32)
+ this->SupportedGlobalGenerators.push_back("MinGW Makefiles");
+ this->SupportedGlobalGenerators.push_back("NMake Makefiles");
+#endif
+ this->SupportedGlobalGenerators.push_back("Ninja");
+ this->SupportedGlobalGenerators.push_back("Unix Makefiles");
+}
+
+cmExtraQbsGenerator::~cmExtraQbsGenerator() {}
+
+void cmExtraQbsGenerator::GetDocumentation(cmDocumentationEntry &entry,
+ const std::string &) const
+{
+ entry.Name = this->GetName();
+ entry.Brief = "Generates Qbs project files.";
+}
+
+void cmExtraQbsGenerator::Generate()
+{
+ for (std::map<std::string, std::vector<cmLocalGenerator *> >::const_iterator
+ it = this->GlobalGenerator->GetProjectMap().begin();
+ it != this->GlobalGenerator->GetProjectMap().end(); ++it)
+ {
+ // create a project file
+ this->CreateProjectFile(it->first, it->second);
+ }
+}
+
+void cmExtraQbsGenerator::CreateProjectFile(
+ const std::string &name,
+ const std::vector<cmLocalGenerator *> &lgs)
+{
+ const cmMakefile *mf = lgs[0]->GetMakefile();
+ std::string outputDir = mf->GetStartOutputDirectory();
+
+ const std::string filename = outputDir + "/" + name + ".qbs";
+
+ this->CreateNewProjectFile(name, lgs, filename);
+}
+
+void cmExtraQbsGenerator::CreateNewProjectFile(
+ const std::string &projectName, const std::vector<cmLocalGenerator *> &lgs,
+ const std::string &filename)
+{
+ cmGeneratedFileStream fout(filename.c_str());
+ if (!fout)
+ {
+ return;
+ }
+
+ fout << "import qbs\n"
+ << "import qbs.File\n\n"
+ << "Project {\n"
+ << "\tname:\"" << projectName << "\"\n";
+ std::vector<cmLocalGenerator *>::const_iterator itr = lgs.begin();
+ for (; itr != lgs.end(); ++itr)
+ {
+ cmLocalGenerator *lg = (*itr);
+ this->AppendSubProject(fout, lg);
+ }
+ fout << "}\n";
+}
+
+void cmExtraQbsGenerator::AppendSubProject(cmGeneratedFileStream &fout,
+ cmLocalGenerator *lg)
+{
+ const cmMakefile *mk = lg->GetMakefile();
+ if (!mk || mk->GetTargets().size() == 0)
+ {
+ return;
+ }
+
+ const std::string &relativePath = cmSystemTools::RelativePath(
+ mk->GetHomeDirectory(), mk->GetCurrentDirectory());
+ fout << "\tProject {\n"
+ << "\t\tname:\"" << relativePath << "\"\n";
+ this->AppendProduct(fout, lg);
+ fout << "\t}\n";
+}
+
+void cmExtraQbsGenerator::AppendProduct(cmGeneratedFileStream &fout,
+ cmLocalGenerator *lg)
+{
+ const cmMakefile *mk = lg->GetMakefile();
+ const cmTargets &ts = mk->GetTargets();
+ std::string cfg = mk->GetSafeDefinition("CMAKE_BUILD_TYPE");
+ cmTargets::const_iterator itr = ts.begin();
+ for (; itr != ts.end(); ++itr)
+ {
+ const cmTarget &t = itr->second;
+ this->AppendTarget(fout, lg, t, cfg);
+ }
+}
+
+void cmExtraQbsGenerator::AppendTarget(cmGeneratedFileStream &fout,
+ cmLocalGenerator *lg, const cmTarget &t,
+ const std::string &cfg)
+{
+ std::string type;
+ bool isBuildable = true;
+ switch (t.GetType())
+ {
+ case cmTarget::EXECUTABLE:
+ type = "application";
+ break;
+ case cmTarget::SHARED_LIBRARY:
+ type = "dynamiclibrary";
+ break;
+ case cmTarget::STATIC_LIBRARY:
+ type = "staticlibrary";
+ break;
+ default:
+ isBuildable = false;
+ break;
+ }
+
+ if (type.empty())
+ {
+ fout << "\t\tProject {\n";
+ }
+ else
+ {
+ fout << "\t\tProduct {\n";
+ fout << "\t\t\tdestinationDirectory: \"" << t.GetDirectory(cfg) << "\"\n";
+ }
+ fout << "\t\t\tname:\"" << t.GetName() << "\"\n";
+
+ if (!type.empty())
+ {
+ fout << "\t\t\ttype: \"" << type << "\"\n";
+ fout << "\t\t\ttargetName: \"" << t.GetName() << "\"\n";
+ }
+
+ if (isBuildable)
+ {
+ fout << "\t\t\tDepends { name: \"cpp\" }\n";
+ cmGeneratorTarget *gt = this->GlobalGenerator->GetGeneratorTarget(&t);
+ this->AppendSources(fout, gt, t, cfg);
+
+ std::set<std::string> langs, incPaths, defs;
+ t.GetLanguages(langs, cfg);
+ for (std::set<std::string>::const_iterator lang = langs.begin();
+ lang != langs.end();
+ ++ lang)
+ {
+ const std::vector<std::string> &paths =
+ gt->GetIncludeDirectories(cfg, *lang);
+ std::copy(paths.begin(), paths.end(),
+ std::inserter(incPaths, incPaths.end()));
+
+ lg->AddCompileDefinitions(defs, &t, cfg, *lang);
+ }
+ this->AppendIncludePaths(fout, incPaths);
+ this->AppendCompileDefinitions(fout, defs);
+ }
+
+ fout << "\t\t}\n";
+}
+
+void cmExtraQbsGenerator::AppendSources(cmGeneratedFileStream &fout,
+ cmGeneratorTarget *gt,
+ const cmTarget &t,
+ const std::string &cfg)
+{
+ std::vector<cmSourceFile *> sources;
+ gt->GetSourceFiles(sources, cfg);
+ if (sources.empty())
+ {
+ return;
+ }
+
+ std::vector<cmSourceFile *> genSources;
+ std::vector<cmSourceFile *>::const_iterator itr = sources.begin();
+ fout << "\t\t\tfiles: [\n"
+ << "\t\t\t\t\"" << t.GetMakefile()->GetCurrentListFile() << "\",\n";
+ for (; itr != sources.end(); ++itr)
+ {
+ if (!(*itr)->GetPropertyAsBool("GENERATED"))
+ {
+ fout << "\t\t\t\t\"" << (*itr)->GetFullPath() << "\",\n";
+ }
+ else
+ {
+ genSources.push_back(*itr);
+ }
+ }
+ fout << "\t\t\t]\n";
+
+ if (!genSources.empty())
+ {
+ fout << "\t\t\tGroup {\n"
+ << "\t\t\t\tname:\"Generated\"\n"
+ << "\t\t\t\tfiles: [\n";
+ itr = genSources.begin();
+ std::string groupCondition;
+ bool initialCondition = true;
+ for (; itr != genSources.end(); ++itr)
+ {
+ const std::string &path = (*itr)->GetFullPath();
+ fout << "\t\t\t\t\t\"" << path << "\",\n";
+ if (initialCondition)
+ {
+ initialCondition = false;
+ }
+ else
+ {
+ groupCondition += "\t\t\t\t\t && ";
+ }
+ groupCondition += "File.exists(\"" + path + "\")\n";
+ }
+ fout << "\t\t\t\t]\n"
+ << "\t\t\t\tcondition: " << groupCondition << "\t\t\t}\n";
+ }
+}
+
+void cmExtraQbsGenerator::AppendIncludePaths(
+ cmGeneratedFileStream &fout,
+ const std::set<std::string> &paths)
+{
+ if (paths.empty())
+ {
+ return;
+ }
+
+ std::set<std::string>::const_iterator itr = paths.begin();
+ fout << "\t\t\tcpp.includePaths: [\n";
+ for (; itr != paths.end(); ++ itr)
+ {
+ fout << "\t\t\t\t\"" << (*itr) << "\",\n";
+ }
+ fout << "\t\t\t]\n";
+}
+
+void cmExtraQbsGenerator::AppendCompileDefinitions(
+ cmGeneratedFileStream &fout,
+ const std::set<std::string> &defs)
+{
+ if (defs.empty())
+ {
+ return;
+ }
+
+ std::set<std::string>::const_iterator itr = defs.begin();
+ fout << "\t\t\tcpp.defines: [\n";
+ for (; itr != defs.end(); ++ itr)
+ {
+ fout << "\t\t\t\t'" << (*itr) << "',\n";
+ }
+ fout << "\t\t\t]\n";
+}
diff --git a/Source/cmExtraQbsGenerator.h b/Source/cmExtraQbsGenerator.h
new file mode 100644
index 0000000..531ccc9
--- /dev/null
+++ b/Source/cmExtraQbsGenerator.h
@@ -0,0 +1,48 @@
+#ifndef CMEXTRAQBSGENERATOR_H
+#define CMEXTRAQBSGENERATOR_H
+
+#include "cmExternalMakefileProjectGenerator.h"
+
+class cmGeneratorTarget;
+
+class cmExtraQbsGenerator : public cmExternalMakefileProjectGenerator
+{
+public:
+ cmExtraQbsGenerator();
+ ~cmExtraQbsGenerator();
+
+ virtual std::string GetName() const
+ { return cmExtraQbsGenerator::GetActualName(); }
+ static std::string GetActualName() { return "Qbs"; }
+ static cmExternalMakefileProjectGenerator *New()
+ { return new cmExtraQbsGenerator; }
+
+ /** Get the documentation entry for this generator. */
+ virtual void GetDocumentation(cmDocumentationEntry &entry,
+ const std::string &fullName) const;
+
+ virtual void Generate();
+
+private:
+ void CreateProjectFile(const std::string &name,
+ const std::vector<cmLocalGenerator *> &lgs);
+ void CreateNewProjectFile(const std::string &projectName,
+ const std::vector<cmLocalGenerator *> &lgs,
+ const std::string &filename);
+ void AppendSubProject(cmGeneratedFileStream &fout, cmLocalGenerator *lg);
+ void AppendProduct(cmGeneratedFileStream &fout, cmLocalGenerator *lg);
+ void AppendTarget(cmGeneratedFileStream &fout,
+ cmLocalGenerator *lg,
+ const cmTarget &t,
+ const std::string &cfg);
+ void AppendSources(cmGeneratedFileStream &fout,
+ cmGeneratorTarget *gt,
+ const cmTarget &t,
+ const std::string &cfg);
+ void AppendIncludePaths(cmGeneratedFileStream &fout,
+ const std::set<std::string> &paths);
+ void AppendCompileDefinitions(cmGeneratedFileStream &fout,
+ const std::set<std::string> &defs);
+};
+
+#endif // CMEXTRAQBSGENERATOR_H
diff --git a/Source/cmFileCommand.cxx b/Source/cmFileCommand.cxx
index ec22ea0..ae9099e 100644
--- a/Source/cmFileCommand.cxx
+++ b/Source/cmFileCommand.cxx
@@ -920,6 +920,35 @@ bool cmFileCommand::HandleGlobCommand(std::vector<std::string> const& args,
bool first = true;
for ( ; i != args.end(); ++i )
{
+ if( *i == "LIST_DIRECTORIES" )
+ {
+ ++i;
+ if(i != args.end())
+ {
+ if(cmSystemTools::IsOn(i->c_str()))
+ {
+ g.SetListDirs(true);
+ g.SetRecurseListDirs(true);
+ }
+ else if(cmSystemTools::IsOff(i->c_str()))
+ {
+ g.SetListDirs(false);
+ g.SetRecurseListDirs(false);
+ }
+ else
+ {
+ this->SetError("LIST_DIRECTORIES missing bool value.");
+ return false;
+ }
+ }
+ else
+ {
+ this->SetError("LIST_DIRECTORIES missing bool value.");
+ return false;
+ }
+ ++i;
+ }
+
if ( recurse && (*i == "FOLLOW_SYMLINKS") )
{
explicitFollowSymlinks = true;
@@ -950,6 +979,7 @@ bool cmFileCommand::HandleGlobCommand(std::vector<std::string> const& args,
}
}
+ cmsys::Glob::GlobMessages globMessages;
if ( !cmsys::SystemTools::FileIsFullPath(i->c_str()) )
{
std::string expr = this->Makefile->GetCurrentDirectory();
@@ -957,16 +987,42 @@ bool cmFileCommand::HandleGlobCommand(std::vector<std::string> const& args,
if (!expr.empty())
{
expr += "/" + *i;
- g.FindFiles(expr);
+ g.FindFiles(expr, &globMessages);
}
else
{
- g.FindFiles(*i);
+ g.FindFiles(*i, &globMessages);
}
}
else
{
- g.FindFiles(*i);
+ g.FindFiles(*i, &globMessages);
+ }
+
+ if(!globMessages.empty())
+ {
+ bool shouldExit = false;
+ for(cmsys::Glob::GlobMessagesIterator it=globMessages.begin();
+ it != globMessages.end(); ++it)
+ {
+ if(it->type == cmsys::Glob::cyclicRecursion)
+ {
+ this->Makefile->IssueMessage(cmake::AUTHOR_WARNING,
+ "Cyclic recursion detected while globbing for '"
+ + *i + "':\n" + it->content);
+ }
+ else
+ {
+ this->Makefile->IssueMessage(cmake::FATAL_ERROR,
+ "Error has occured while globbing for '"
+ + *i + "' - " + it->content);
+ shouldExit = true;
+ }
+ }
+ if(shouldExit)
+ {
+ return false;
+ }
}
std::vector<std::string>::size_type cc;
diff --git a/Source/cmGlobalXCodeGenerator.cxx b/Source/cmGlobalXCodeGenerator.cxx
index bd8a1f5..d340e72 100644
--- a/Source/cmGlobalXCodeGenerator.cxx
+++ b/Source/cmGlobalXCodeGenerator.cxx
@@ -804,6 +804,10 @@ GetSourcecodeValueFromFileExtension(const std::string& _ext,
{
sourcecode = "compiled.mach-o.objfile";
}
+ else if(ext == "xctest")
+ {
+ sourcecode = "wrapper.cfbundle";
+ }
else if(ext == "xib")
{
keepLastKnownFileType = true;
@@ -2598,7 +2602,9 @@ const char* cmGlobalXCodeGenerator::GetTargetFileType(cmTarget& cmtarget)
case cmTarget::STATIC_LIBRARY:
return "archive.ar";
case cmTarget::MODULE_LIBRARY:
- if (cmtarget.IsCFBundleOnApple())
+ if (cmtarget.IsXCTestOnApple())
+ return "wrapper.cfbundle";
+ else if (cmtarget.IsCFBundleOnApple())
return "wrapper.plug-in";
else
return ((this->XcodeVersion >= 22)?
@@ -2622,7 +2628,9 @@ const char* cmGlobalXCodeGenerator::GetTargetProductType(cmTarget& cmtarget)
case cmTarget::STATIC_LIBRARY:
return "com.apple.product-type.library.static";
case cmTarget::MODULE_LIBRARY:
- if (cmtarget.IsCFBundleOnApple())
+ if (cmtarget.IsXCTestOnApple())
+ return "com.apple.product-type.bundle.unit-test";
+ else if (cmtarget.IsCFBundleOnApple())
return "com.apple.product-type.bundle";
else
return ((this->XcodeVersion >= 22)?
diff --git a/Source/cmQtAutoGenerators.cxx b/Source/cmQtAutoGenerators.cxx
index 42c18f7..08092c7 100644
--- a/Source/cmQtAutoGenerators.cxx
+++ b/Source/cmQtAutoGenerators.cxx
@@ -22,6 +22,8 @@
# include "cmLocalVisualStudioGenerator.h"
#endif
+#include <sys/stat.h>
+
#include <cmsys/Terminal.h>
#include <cmsys/ios/sstream>
#include <cmsys/FStream.hxx>
@@ -582,6 +584,18 @@ void cmQtAutoGenerators::SetupAutoGenerateTarget(cmTarget const* target)
makefile->ConfigureFile(inputFile.c_str(), outputFile.c_str(),
false, true, false);
+ // Ensure we have write permission in case .in was read-only.
+ mode_t perm = 0;
+#if defined(WIN32) && !defined(__CYGWIN__)
+ mode_t mode_write = S_IWRITE;
+#else
+ mode_t mode_write = S_IWUSR;
+#endif
+ cmSystemTools::GetPermissions(outputFile, perm);
+ if (!(perm & mode_write))
+ {
+ cmSystemTools::SetPermissions(outputFile, perm | mode_write);
+ }
if (!configDefines.empty()
|| !configIncludes.empty()
|| !configUicOptions.empty())
diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx
index b70f60d..b3d1155 100644
--- a/Source/cmTarget.cxx
+++ b/Source/cmTarget.cxx
@@ -616,6 +616,13 @@ bool cmTarget::IsCFBundleOnApple() const
}
//----------------------------------------------------------------------------
+bool cmTarget::IsXCTestOnApple() const
+{
+ return (this->IsCFBundleOnApple() &&
+ this->GetPropertyAsBool("XCTEST"));
+}
+
+//----------------------------------------------------------------------------
bool cmTarget::IsBundleOnApple() const
{
return this->IsFrameworkOnApple() || this->IsAppBundleOnApple() ||
@@ -6791,7 +6798,14 @@ std::string cmTarget::GetCFBundleDirectory(const std::string& config,
const char *ext = this->GetProperty("BUNDLE_EXTENSION");
if (!ext)
{
- ext = "bundle";
+ if (this->IsXCTestOnApple())
+ {
+ ext = "xctest";
+ }
+ else
+ {
+ ext = "bundle";
+ }
}
fpath += ext;
fpath += "/Contents";
diff --git a/Source/cmTarget.h b/Source/cmTarget.h
index 5170b31..a4ef977 100644
--- a/Source/cmTarget.h
+++ b/Source/cmTarget.h
@@ -527,6 +527,9 @@ public:
/** Return whether this target is a CFBundle (plugin) on Apple. */
bool IsCFBundleOnApple() const;
+ /** Return whether this target is a XCTest on Apple. */
+ bool IsXCTestOnApple() const;
+
/** Return whether this target is an executable Bundle on Apple. */
bool IsAppBundleOnApple() const;
diff --git a/Source/cmake.cxx b/Source/cmake.cxx
index 11196e4..51df7f2 100644
--- a/Source/cmake.cxx
+++ b/Source/cmake.cxx
@@ -86,6 +86,8 @@
# include "cmGlobalKdevelopGenerator.h"
#endif
+#include "cmExtraQbsGenerator.h"
+
#ifdef CMAKE_USE_ECLIPSE
# include "cmExtraEclipseCDT4Generator.h"
#endif
@@ -1029,6 +1031,8 @@ void cmake::AddDefaultExtraGenerators()
&cmExtraSublimeTextGenerator::New);
this->AddExtraGenerator(cmExtraKateGenerator::GetActualName(),
&cmExtraKateGenerator::New);
+ this->AddExtraGenerator(cmExtraQbsGenerator::GetActualName(),
+ &cmExtraQbsGenerator::New);
#ifdef CMAKE_USE_ECLIPSE
this->AddExtraGenerator(cmExtraEclipseCDT4Generator::GetActualName(),
diff --git a/Source/ctest.cxx b/Source/ctest.cxx
index c0eb8ac..0fc47b7 100644
--- a/Source/ctest.cxx
+++ b/Source/ctest.cxx
@@ -75,6 +75,8 @@ static const char * cmDocumentationOptions[][2] =
"Run a specific number of tests by number."},
{"-U, --union", "Take the Union of -I and -R"},
{"--rerun-failed", "Run only the tests that failed previously"},
+ {"--repeat-until-fail <n>", "Require each test to run <n> "
+ "times without failing in order to pass"},
{"--max-width <width>", "Set the max width for a test name to output"},
{"--interactive-debug-mode [0|1]", "Set the interactive mode to 0 or 1."},
{"--no-label-summary", "Disable timing summary information for labels."},
diff --git a/Source/kwsys/SystemInformation.cxx b/Source/kwsys/SystemInformation.cxx
index 9c7ceee..b0434f4 100644
--- a/Source/kwsys/SystemInformation.cxx
+++ b/Source/kwsys/SystemInformation.cxx
@@ -1234,6 +1234,7 @@ void StacktraceSignalHandler(
case ILL_ILLTRP:
oss << "illegal trap";
+ break;
case ILL_PRVOPC:
oss << "privileged opcode";
@@ -1823,6 +1824,7 @@ const char * SystemInformationImplementation::GetVendorID()
return "Motorola";
case HP:
return "Hewlett-Packard";
+ case UnknownManufacturer:
default:
return "Unknown Manufacturer";
}
@@ -3064,6 +3066,12 @@ bool SystemInformationImplementation::RetrieveClassicalCPUIdentity()
case NSC:
this->ChipID.ProcessorName = "Cx486SLC \\ DLC \\ Cx486S A-Step";
break;
+
+ case Sun:
+ case IBM:
+ case Motorola:
+ case HP:
+ case UnknownManufacturer:
default:
this->ChipID.ProcessorName = "Unknown family"; // We cannot identify the processor.
return false;
diff --git a/Source/kwsys/testHashSTL.cxx b/Source/kwsys/testHashSTL.cxx
index b861a5b..ac5cf74 100644
--- a/Source/kwsys/testHashSTL.cxx
+++ b/Source/kwsys/testHashSTL.cxx
@@ -34,7 +34,7 @@
template class kwsys::hash_map<const char*, int>;
template class kwsys::hash_set<int>;
-bool test_hash_map()
+static bool test_hash_map()
{
typedef kwsys::hash_map<const char*, int> mtype;
mtype m;
@@ -51,7 +51,7 @@ bool test_hash_map()
return sum == 3;
}
-bool test_hash_set()
+static bool test_hash_set()
{
typedef kwsys::hash_set<int> stype;
stype s;