summaryrefslogtreecommitdiffstats
path: root/Source
diff options
context:
space:
mode:
Diffstat (limited to 'Source')
-rw-r--r--Source/CMakeLists.txt1
-rw-r--r--Source/CMakeVersion.cmake2
-rw-r--r--Source/CPack/cpack.cxx27
-rw-r--r--Source/CTest/cmCTestScriptHandler.cxx9
-rw-r--r--Source/cmCTest.cxx88
-rw-r--r--Source/cmCTest.h14
-rw-r--r--Source/cmDocumentVariables.cxx4
-rw-r--r--Source/cmDocumentation.cxx58
-rw-r--r--Source/cmDocumentation.h38
-rw-r--r--Source/cmDocumentationFormatterMan.cxx16
-rw-r--r--Source/cmDocumentationFormatterMan.h3
-rw-r--r--Source/cmGlobalNinjaGenerator.cxx13
-rw-r--r--Source/cmInstallCommand.h5
-rw-r--r--Source/cmNinjaTargetGenerator.cxx16
-rw-r--r--Source/cmakemain.cxx44
-rw-r--r--Source/cmcldeps.cxx519
-rw-r--r--Source/ctest.cxx6
17 files changed, 268 insertions, 595 deletions
diff --git a/Source/CMakeLists.txt b/Source/CMakeLists.txt
index 2c6bc76..14af796 100644
--- a/Source/CMakeLists.txt
+++ b/Source/CMakeLists.txt
@@ -386,6 +386,7 @@ IF(CMAKE_ENABLE_NINJA)
IF(WIN32 AND NOT CYGWIN AND NOT BORLAND)
SET_SOURCE_FILES_PROPERTIES(cmcldeps.cxx PROPERTIES COMPILE_DEFINITIONS _WIN32_WINNT=0x0501)
ADD_EXECUTABLE(cmcldeps cmcldeps.cxx)
+ TARGET_LINK_LIBRARIES(cmcldeps CMakeLib)
INSTALL_TARGETS(/bin cmcldeps)
ENDIF()
ELSE()
diff --git a/Source/CMakeVersion.cmake b/Source/CMakeVersion.cmake
index 24d3bc7..7feb0d7 100644
--- a/Source/CMakeVersion.cmake
+++ b/Source/CMakeVersion.cmake
@@ -2,5 +2,5 @@
SET(CMake_VERSION_MAJOR 2)
SET(CMake_VERSION_MINOR 8)
SET(CMake_VERSION_PATCH 8)
-SET(CMake_VERSION_TWEAK 20120701)
+SET(CMake_VERSION_TWEAK 20120709)
#SET(CMake_VERSION_RC 1)
diff --git a/Source/CPack/cpack.cxx b/Source/CPack/cpack.cxx
index 6f5055c..b603585 100644
--- a/Source/CPack/cpack.cxx
+++ b/Source/CPack/cpack.cxx
@@ -207,8 +207,7 @@ int main (int argc, char *argv[])
std::string helpHTML;
std::string cpackProjectName;
- std::string cpackProjectDirectory
- = cmsys::SystemTools::GetCurrentWorkingDirectory();
+ std::string cpackProjectDirectory;
std::string cpackBuildConfig;
std::string cpackProjectVersion;
std::string cpackProjectPatch;
@@ -294,8 +293,12 @@ int main (int argc, char *argv[])
cmDocumentation doc;
doc.addCPackStandardDocSections();
- /* Were we invoked to display doc or to do some work ? */
- if(doc.CheckOptions(argc, argv,"-G") || nocwd)
+ /* Were we invoked to display doc or to do some work ?
+ * Unlike cmake launching cpack with zero argument
+ * should launch cpack using "cpackConfigFile" if it exists
+ * in the current directory.
+ */
+ if((doc.CheckOptions(argc, argv,"-G") || nocwd) && !(argc==1))
{
help = true;
}
@@ -370,10 +373,24 @@ int main (int argc, char *argv[])
globalMF->AddDefinition("CPACK_PACKAGE_VENDOR",
cpackProjectVendor.c_str());
}
+ // if this is not empty it has been set on the command line
+ // go for it. Command line override values set in config file.
if ( !cpackProjectDirectory.empty() )
{
globalMF->AddDefinition("CPACK_PACKAGE_DIRECTORY",
- cpackProjectDirectory.c_str());
+ cpackProjectDirectory.c_str());
+ }
+ // The value has not been set on the command line
+ else
+ {
+ // get a default value (current working directory)
+ cpackProjectDirectory = cmsys::SystemTools::GetCurrentWorkingDirectory();
+ // use default value iff no value has been provided by the config file
+ if (!globalMF->IsSet("CPACK_PACKAGE_DIRECTORY"))
+ {
+ globalMF->AddDefinition("CPACK_PACKAGE_DIRECTORY",
+ cpackProjectDirectory.c_str());
+ }
}
if ( !cpackBuildConfig.empty() )
{
diff --git a/Source/CTest/cmCTestScriptHandler.cxx b/Source/CTest/cmCTestScriptHandler.cxx
index d3ab2ef..8643cb3 100644
--- a/Source/CTest/cmCTestScriptHandler.cxx
+++ b/Source/CTest/cmCTestScriptHandler.cxx
@@ -435,6 +435,15 @@ int cmCTestScriptHandler::ReadInScript(const std::string& total_script_arg)
return 2;
}
+ // Add definitions of variables passed in on the command line:
+ const std::map<std::string, std::string> &defs =
+ this->CTest->GetDefinitions();
+ for (std::map<std::string, std::string>::const_iterator it = defs.begin();
+ it != defs.end(); ++it)
+ {
+ this->Makefile->AddDefinition(it->first.c_str(), it->second.c_str());
+ }
+
// finally read in the script
if (!this->Makefile->ReadListFile(0, script.c_str()) ||
cmSystemTools::GetErrorOccuredFlag())
diff --git a/Source/cmCTest.cxx b/Source/cmCTest.cxx
index 4aff64b..b5687e3 100644
--- a/Source/cmCTest.cxx
+++ b/Source/cmCTest.cxx
@@ -1944,29 +1944,6 @@ bool cmCTest::AddTestsForDashboardType(std::string &targ)
}
else
{
- cmCTestLog(this, ERROR_MESSAGE,
- "CTest -D called with incorrect option: "
- << targ << std::endl);
- cmCTestLog(this, ERROR_MESSAGE, "Available options are:" << std::endl
- << " " << "ctest" << " -D Continuous" << std::endl
- << " " << "ctest"
- << " -D Continuous(Start|Update|Configure|Build)" << std::endl
- << " " << "ctest"
- << " -D Continuous(Test|Coverage|MemCheck|Submit)"
- << std::endl
- << " " << "ctest" << " -D Experimental" << std::endl
- << " " << "ctest"
- << " -D Experimental(Start|Update|Configure|Build)"
- << std::endl
- << " " << "ctest"
- << " -D Experimental(Test|Coverage|MemCheck|Submit)"
- << std::endl
- << " " << "ctest" << " -D Nightly" << std::endl
- << " " << "ctest"
- << " -D Nightly(Start|Update|Configure|Build)" << std::endl
- << " " << "ctest"
- << " -D Nightly(Test|Coverage|MemCheck|Submit)" << std::endl
- << " " << "ctest" << " -D NightlyMemoryCheck" << std::endl);
return false;
}
return true;
@@ -1974,6 +1951,27 @@ bool cmCTest::AddTestsForDashboardType(std::string &targ)
//----------------------------------------------------------------------
+void cmCTest::ErrorMessageUnknownDashDValue(std::string &val)
+{
+ cmCTestLog(this, ERROR_MESSAGE,
+ "CTest -D called with incorrect option: " << val << std::endl);
+
+ cmCTestLog(this, ERROR_MESSAGE,
+ "Available options are:" << std::endl
+ << " ctest -D Continuous" << std::endl
+ << " ctest -D Continuous(Start|Update|Configure|Build)" << std::endl
+ << " ctest -D Continuous(Test|Coverage|MemCheck|Submit)" << std::endl
+ << " ctest -D Experimental" << std::endl
+ << " ctest -D Experimental(Start|Update|Configure|Build)" << std::endl
+ << " ctest -D Experimental(Test|Coverage|MemCheck|Submit)" << std::endl
+ << " ctest -D Nightly" << std::endl
+ << " ctest -D Nightly(Start|Update|Configure|Build)" << std::endl
+ << " ctest -D Nightly(Test|Coverage|MemCheck|Submit)" << std::endl
+ << " ctest -D NightlyMemoryCheck" << std::endl);
+}
+
+
+//----------------------------------------------------------------------
bool cmCTest::CheckArgument(const std::string& arg, const char* varg1,
const char* varg2)
{
@@ -2232,13 +2230,29 @@ void cmCTest::HandleScriptArguments(size_t &i,
}
//----------------------------------------------------------------------
+bool cmCTest::AddVariableDefinition(const std::string &arg)
+{
+ std::string name;
+ std::string value;
+ cmCacheManager::CacheEntryType type = cmCacheManager::UNINITIALIZED;
+
+ if (cmCacheManager::ParseEntry(arg.c_str(), name, value, type))
+ {
+ this->Definitions[name] = value;
+ return true;
+ }
+
+ return false;
+}
+
+//----------------------------------------------------------------------
// the main entry point of ctest, called from main
int cmCTest::Run(std::vector<std::string> &args, std::string* output)
{
this->FindRunningCMake();
const char* ctestExec = "ctest";
bool cmakeAndTest = false;
- bool performSomeTest = true;
+ bool executeTests = true;
bool SRArgumentSpecified = false;
// copy the command line
@@ -2263,14 +2277,29 @@ int cmCTest::Run(std::vector<std::string> &args, std::string* output)
this->ProduceXML = true;
i++;
std::string targ = args[i];
- // AddTestsForDashboard parses the dashborad type and converts it
+ // AddTestsForDashboard parses the dashboard type and converts it
// into the separate stages
if (!this->AddTestsForDashboardType(targ))
{
- performSomeTest = false;
+ if (!this->AddVariableDefinition(targ))
+ {
+ this->ErrorMessageUnknownDashDValue(targ);
+ executeTests = false;
+ }
}
}
+ // If it's not exactly -D, but it starts with -D, then try to parse out
+ // a variable definition from it, same as CMake does. Unsuccessful
+ // attempts are simply ignored since previous ctest versions ignore
+ // this too. (As well as many other unknown command line args.)
+ //
+ if(arg != "-D" && cmSystemTools::StringStartsWith(arg.c_str(), "-D"))
+ {
+ std::string input = arg.substr(2);
+ this->AddVariableDefinition(input);
+ }
+
if(this->CheckArgument(arg, "-T", "--test-action") &&
(i < args.size() -1) )
{
@@ -2278,7 +2307,7 @@ int cmCTest::Run(std::vector<std::string> &args, std::string* output)
i++;
if ( !this->SetTest(args[i].c_str(), false) )
{
- performSomeTest = false;
+ executeTests = false;
cmCTestLog(this, ERROR_MESSAGE,
"CTest -T called with incorrect option: "
<< args[i].c_str() << std::endl);
@@ -2316,7 +2345,7 @@ int cmCTest::Run(std::vector<std::string> &args, std::string* output)
}
else
{
- performSomeTest = false;
+ executeTests = false;
cmCTestLog(this, ERROR_MESSAGE,
"CTest -M called with incorrect option: " << str.c_str()
<< std::endl);
@@ -2387,8 +2416,7 @@ int cmCTest::Run(std::vector<std::string> &args, std::string* output)
return retv;
}
- // if some tests must be run
- if(performSomeTest)
+ if(executeTests)
{
int res;
// call process directory
diff --git a/Source/cmCTest.h b/Source/cmCTest.h
index 7c71b00..beffe9e 100644
--- a/Source/cmCTest.h
+++ b/Source/cmCTest.h
@@ -417,6 +417,12 @@ public:
bool GetLabelSummary() { return this->LabelSummary;}
std::string GetCostDataFile();
+
+ const std::map<std::string, std::string> &GetDefinitions()
+ {
+ return this->Definitions;
+ }
+
private:
std::string ConfigType;
std::string ScheduleType;
@@ -516,6 +522,12 @@ private:
//! parse the option after -D and convert it into the appropriate steps
bool AddTestsForDashboardType(std::string &targ);
+ //! read as "emit an error message for an unknown -D value"
+ void ErrorMessageUnknownDashDValue(std::string &val);
+
+ //! add a variable definition from a command line -D value
+ bool AddVariableDefinition(const std::string &arg);
+
//! parse and process most common command line arguments
void HandleCommandLineArguments(size_t &i,
std::vector<std::string> &args);
@@ -558,6 +570,8 @@ private:
int OutputLogFileLastTag;
bool OutputTestOutputOnTestFailure;
+
+ std::map<std::string, std::string> Definitions;
};
class cmCTestLogWrite
diff --git a/Source/cmDocumentVariables.cxx b/Source/cmDocumentVariables.cxx
index 592d931..77aaffc 100644
--- a/Source/cmDocumentVariables.cxx
+++ b/Source/cmDocumentVariables.cxx
@@ -218,7 +218,7 @@ void cmDocumentVariables::DefineVariables(cmake* cm)
"Full path to ctest command installed with cmake.",
"This is the full path to the CTest executable ctest "
"which is useful from custom commands that want "
- " to use the cmake -E option for portable system "
+ "to use the cmake -E option for portable system "
"commands.",false,
"Variables that Provide Information");
@@ -355,7 +355,7 @@ void cmDocumentVariables::DefineVariables(cmake* cm)
"If this is set to TRUE, then the rpath information "
"is not added to compiled executables. The default "
"is to add rpath information if the platform supports it. "
- "This allows for easy running from the build tree. To omit RPATH"
+ "This allows for easy running from the build tree. To omit RPATH "
"in the install step, but not the build step, use "
"CMAKE_SKIP_INSTALL_RPATH instead.",false,
"Variables that Provide Information");
diff --git a/Source/cmDocumentation.cxx b/Source/cmDocumentation.cxx
index 904a157..1b042ae 100644
--- a/Source/cmDocumentation.cxx
+++ b/Source/cmDocumentation.cxx
@@ -221,7 +221,7 @@ DOCUMENT_INTRO(CompatCommands, "cmakecompat",
cmDocumentation::cmDocumentation()
:CurrentFormatter(0)
{
- this->SetForm(TextForm);
+ this->SetForm(TextForm, 0);
this->addCommonStandardDocSections();
this->ShowGenerators = true;
}
@@ -594,7 +594,7 @@ bool cmDocumentation::PrintRequestedDocumentation(std::ostream& os)
i != this->RequestedHelpItems.end();
++i)
{
- this->SetForm(i->HelpForm);
+ this->SetForm(i->HelpForm, i->ManSection);
this->CurrentArgument = i->Argument;
// If a file name was given, use it. Otherwise, default to the
// given stream.
@@ -642,7 +642,8 @@ bool cmDocumentation::PrintRequestedDocumentation(std::ostream& os)
cmDocumentation::Form cmDocumentation::GetFormFromFilename(
- const std::string& filename)
+ const std::string& filename,
+ int* manSection)
{
std::string ext = cmSystemTools::GetFilenameLastExtension(filename);
ext = cmSystemTools::UpperCase(ext);
@@ -659,6 +660,10 @@ cmDocumentation::Form cmDocumentation::GetFormFromFilename(
// ".1" to ".9" should be manpages
if ((ext.length()==2) && (ext[1] >='1') && (ext[1]<='9'))
{
+ if (manSection)
+ {
+ *manSection = ext[1] - '0';
+ }
return cmDocumentation::ManForm;
}
@@ -1128,49 +1133,57 @@ bool cmDocumentation::CheckOptions(int argc, const char* const* argv,
{
help.HelpType = cmDocumentation::Properties;
GET_OPT_ARGUMENT(help.Filename);
- help.HelpForm = this->GetFormFromFilename(help.Filename);
+ help.HelpForm = this->GetFormFromFilename(help.Filename,
+ &help.ManSection);
}
else if(strcmp(argv[i], "--help-policies") == 0)
{
help.HelpType = cmDocumentation::Policies;
GET_OPT_ARGUMENT(help.Filename);
- help.HelpForm = this->GetFormFromFilename(help.Filename);
+ help.HelpForm = this->GetFormFromFilename(help.Filename,
+ &help.ManSection);
}
else if(strcmp(argv[i], "--help-variables") == 0)
{
help.HelpType = cmDocumentation::Variables;
GET_OPT_ARGUMENT(help.Filename);
- help.HelpForm = this->GetFormFromFilename(help.Filename);
+ help.HelpForm = this->GetFormFromFilename(help.Filename,
+ &help.ManSection);
}
else if(strcmp(argv[i], "--help-modules") == 0)
{
help.HelpType = cmDocumentation::Modules;
GET_OPT_ARGUMENT(help.Filename);
- help.HelpForm = this->GetFormFromFilename(help.Filename);
+ help.HelpForm = this->GetFormFromFilename(help.Filename,
+ &help.ManSection);
}
else if(strcmp(argv[i], "--help-custom-modules") == 0)
{
help.HelpType = cmDocumentation::CustomModules;
GET_OPT_ARGUMENT(help.Filename);
- help.HelpForm = this->GetFormFromFilename(help.Filename);
+ help.HelpForm = this->GetFormFromFilename(help.Filename,
+ &help.ManSection);
}
else if(strcmp(argv[i], "--help-commands") == 0)
{
help.HelpType = cmDocumentation::Commands;
GET_OPT_ARGUMENT(help.Filename);
- help.HelpForm = this->GetFormFromFilename(help.Filename);
+ help.HelpForm = this->GetFormFromFilename(help.Filename,
+ &help.ManSection);
}
else if(strcmp(argv[i], "--help-compatcommands") == 0)
{
help.HelpType = cmDocumentation::CompatCommands;
GET_OPT_ARGUMENT(help.Filename);
- help.HelpForm = this->GetFormFromFilename(help.Filename);
+ help.HelpForm = this->GetFormFromFilename(help.Filename,
+ &help.ManSection);
}
else if(strcmp(argv[i], "--help-full") == 0)
{
help.HelpType = cmDocumentation::Full;
GET_OPT_ARGUMENT(help.Filename);
- help.HelpForm = this->GetFormFromFilename(help.Filename);
+ help.HelpForm = this->GetFormFromFilename(help.Filename,
+ &help.ManSection);
}
else if(strcmp(argv[i], "--help-html") == 0)
{
@@ -1183,6 +1196,7 @@ bool cmDocumentation::CheckOptions(int argc, const char* const* argv,
help.HelpType = cmDocumentation::Full;
GET_OPT_ARGUMENT(help.Filename);
help.HelpForm = cmDocumentation::ManForm;
+ help.ManSection = 1;
}
else if(strcmp(argv[i], "--help-command") == 0)
{
@@ -1190,35 +1204,40 @@ bool cmDocumentation::CheckOptions(int argc, const char* const* argv,
GET_OPT_ARGUMENT(help.Argument);
GET_OPT_ARGUMENT(help.Filename);
help.Argument = cmSystemTools::LowerCase(help.Argument);
- help.HelpForm = this->GetFormFromFilename(help.Filename);
+ help.HelpForm = this->GetFormFromFilename(help.Filename,
+ &help.ManSection);
}
else if(strcmp(argv[i], "--help-module") == 0)
{
help.HelpType = cmDocumentation::SingleModule;
GET_OPT_ARGUMENT(help.Argument);
GET_OPT_ARGUMENT(help.Filename);
- help.HelpForm = this->GetFormFromFilename(help.Filename);
+ help.HelpForm = this->GetFormFromFilename(help.Filename,
+ &help.ManSection);
}
else if(strcmp(argv[i], "--help-property") == 0)
{
help.HelpType = cmDocumentation::SingleProperty;
GET_OPT_ARGUMENT(help.Argument);
GET_OPT_ARGUMENT(help.Filename);
- help.HelpForm = this->GetFormFromFilename(help.Filename);
+ help.HelpForm = this->GetFormFromFilename(help.Filename,
+ &help.ManSection);
}
else if(strcmp(argv[i], "--help-policy") == 0)
{
help.HelpType = cmDocumentation::SinglePolicy;
GET_OPT_ARGUMENT(help.Argument);
GET_OPT_ARGUMENT(help.Filename);
- help.HelpForm = this->GetFormFromFilename(help.Filename);
+ help.HelpForm = this->GetFormFromFilename(help.Filename,
+ &help.ManSection);
}
else if(strcmp(argv[i], "--help-variable") == 0)
{
help.HelpType = cmDocumentation::SingleVariable;
GET_OPT_ARGUMENT(help.Argument);
GET_OPT_ARGUMENT(help.Filename);
- help.HelpForm = this->GetFormFromFilename(help.Filename);
+ help.HelpForm = this->GetFormFromFilename(help.Filename,
+ &help.ManSection);
}
else if(strcmp(argv[i], "--help-command-list") == 0)
{
@@ -1269,9 +1288,9 @@ bool cmDocumentation::CheckOptions(int argc, const char* const* argv,
}
//----------------------------------------------------------------------------
-void cmDocumentation::Print(Form f, std::ostream& os)
+void cmDocumentation::Print(Form f, int manSection, std::ostream& os)
{
- this->SetForm(f);
+ this->SetForm(f, manSection);
this->Print(os);
}
@@ -1879,7 +1898,7 @@ void cmDocumentation::CreateFullDocumentation()
}
//----------------------------------------------------------------------------
-void cmDocumentation::SetForm(Form f)
+void cmDocumentation::SetForm(Form f, int manSection)
{
switch(f)
{
@@ -1890,6 +1909,7 @@ void cmDocumentation::SetForm(Form f)
this->CurrentFormatter = &this->DocbookFormatter;
break;
case ManForm:
+ this->ManFormatter.SetManSection(manSection);
this->CurrentFormatter = &this->ManFormatter;
break;
case TextForm:
diff --git a/Source/cmDocumentation.h b/Source/cmDocumentation.h
index 11bef16..e180f60 100644
--- a/Source/cmDocumentation.h
+++ b/Source/cmDocumentation.h
@@ -33,7 +33,7 @@ class cmDocumentation: public cmDocumentationEnums
{
public:
cmDocumentation();
-
+
~cmDocumentation();
/**
@@ -51,18 +51,18 @@ public:
typedef std::list<documentedModuleSectionPair_t> documentedModulesList_t;
// High-level interface for standard documents:
-
+
/**
* Check command line arguments for documentation options. Returns
* true if documentation options are found, and false otherwise.
* When true is returned, PrintRequestedDocumentation should be
- * called. exitOpt can be used for things like cmake -E, so that
+ * called. exitOpt can be used for things like cmake -E, so that
* all arguments after the -E are ignored and not searched for
* help arguments.
*/
- bool CheckOptions(int argc, const char* const* argv,
+ bool CheckOptions(int argc, const char* const* argv,
const char* exitOpt =0);
-
+
/**
* Print help requested on the command line. Call after
* CheckOptions returns true. Returns true on success, and false
@@ -70,12 +70,12 @@ public:
* command line cannot be written.
*/
bool PrintRequestedDocumentation(std::ostream& os);
-
+
/** Print help of the given type. */
bool PrintDocumentation(Type ht, std::ostream& os, const char* docname=0);
void SetShowGenerators(bool showGen) { this->ShowGenerators = showGen; }
-
+
/** Set the program name for standard document generation. */
void SetName(const char* name);
@@ -108,8 +108,8 @@ public:
* Print documentation in the given form. All previously added
* sections will be generated.
*/
- void Print(Form f, std::ostream& os);
-
+ void Print(Form f, int manSection, std::ostream& os);
+
/**
* Print documentation in the current form. All previously added
* sections will be generated.
@@ -125,15 +125,16 @@ public:
void SetSeeAlsoList(const char *data[][3]);
/** Clear all previously added sections of help. */
- void ClearSections();
-
+ void ClearSections();
+
/** Set cmake root so we can find installed files */
void SetCMakeRoot(const char* root) { this->CMakeRoot = root;}
/** Set CMAKE_MODULE_PATH so we can find additional cmake modules */
void SetCMakeModulePath(const char* path) { this->CMakeModulePath = path;}
-
- static Form GetFormFromFilename(const std::string& filename);
+
+ static Form GetFormFromFilename(const std::string& filename,
+ int* ManSection);
/** Add common (to all tools) documentation section(s) */
void addCommonStandardDocSections();
@@ -190,13 +191,13 @@ public:
std::vector<cmDocumentationEntry>& commands,
cmake* cm);
private:
- void SetForm(Form f);
+ void SetForm(Form f, int manSection);
void SetDocName(const char* docname);
- bool CreateSingleModule(const char* fname,
+ bool CreateSingleModule(const char* fname,
const char* moduleName,
cmDocumentationSection &sec);
- void CreateModuleDocsForDir(cmsys::Directory& dir,
+ void CreateModuleDocsForDir(cmsys::Directory& dir,
cmDocumentationSection &moduleSection);
bool CreateModulesSection();
bool CreateCustomModulesSection();
@@ -236,7 +237,7 @@ private:
std::string NameString;
std::string DocName;
std::map<std::string,cmDocumentationSection*> AllSections;
-
+
std::string SeeAlsoString;
std::string CMakeRoot;
std::string CMakeModulePath;
@@ -247,11 +248,12 @@ private:
struct RequestedHelpItem
{
- RequestedHelpItem():HelpForm(TextForm), HelpType(None) {}
+ RequestedHelpItem():HelpForm(TextForm), HelpType(None), ManSection(1) {}
cmDocumentationEnums::Form HelpForm;
cmDocumentationEnums::Type HelpType;
std::string Filename;
std::string Argument;
+ int ManSection;
};
std::vector<RequestedHelpItem> RequestedHelpItems;
diff --git a/Source/cmDocumentationFormatterMan.cxx b/Source/cmDocumentationFormatterMan.cxx
index 79a3b25..4123c85 100644
--- a/Source/cmDocumentationFormatterMan.cxx
+++ b/Source/cmDocumentationFormatterMan.cxx
@@ -19,9 +19,15 @@
cmDocumentationFormatterMan::cmDocumentationFormatterMan()
:cmDocumentationFormatter()
+,ManSection(1)
{
}
+void cmDocumentationFormatterMan::SetManSection(int manSection)
+{
+ this->ManSection = manSection;
+}
+
void cmDocumentationFormatterMan
::PrintSection(std::ostream& os,
const cmDocumentationSection &section,
@@ -32,9 +38,9 @@ void cmDocumentationFormatterMan
os << ".SH " << name << "\n";
}
- const std::vector<cmDocumentationEntry> &entries =
+ const std::vector<cmDocumentationEntry> &entries =
section.GetEntries();
- for(std::vector<cmDocumentationEntry>::const_iterator op = entries.begin();
+ for(std::vector<cmDocumentationEntry>::const_iterator op = entries.begin();
op != entries.end(); ++op)
{
if(op->Name.size())
@@ -58,7 +64,7 @@ void cmDocumentationFormatterMan::EscapeText(std::string& man_text)
cmSystemTools::ReplaceString(man_text, "-", "\\-");
}
-void cmDocumentationFormatterMan::PrintPreformatted(std::ostream& os,
+void cmDocumentationFormatterMan::PrintPreformatted(std::ostream& os,
const char* text)
{
std::string man_text = text;
@@ -69,7 +75,7 @@ void cmDocumentationFormatterMan::PrintPreformatted(std::ostream& os,
os << ".fi\n\n";
}
-void cmDocumentationFormatterMan::PrintParagraph(std::ostream& os,
+void cmDocumentationFormatterMan::PrintParagraph(std::ostream& os,
const char* text)
{
std::string man_text = text;
@@ -87,7 +93,7 @@ void cmDocumentationFormatterMan::PrintHeader(const char* docname,
this->EscapeText(s_docname);
this->EscapeText(s_appname);
- os << ".TH " << s_docname << " 1 \""
+ os << ".TH " << s_docname << " " << this->ManSection << " \""
<< cmSystemTools::GetCurrentDateTime("%B %d, %Y").c_str()
<< "\" \"" << s_appname
<< " " << cmVersion::GetCMakeVersion()
diff --git a/Source/cmDocumentationFormatterMan.h b/Source/cmDocumentationFormatterMan.h
index 11b5acb..b3d069c 100644
--- a/Source/cmDocumentationFormatterMan.h
+++ b/Source/cmDocumentationFormatterMan.h
@@ -22,6 +22,8 @@ class cmDocumentationFormatterMan : public cmDocumentationFormatter
public:
cmDocumentationFormatterMan();
+ void SetManSection(int manSection);
+
virtual cmDocumentationEnums::Form GetForm() const
{ return cmDocumentationEnums::ManForm;}
@@ -35,6 +37,7 @@ public:
private:
void EscapeText(std::string& man_text);
+ int ManSection;
};
#endif
diff --git a/Source/cmGlobalNinjaGenerator.cxx b/Source/cmGlobalNinjaGenerator.cxx
index 23f42e4..6392ecd 100644
--- a/Source/cmGlobalNinjaGenerator.cxx
+++ b/Source/cmGlobalNinjaGenerator.cxx
@@ -704,13 +704,22 @@ void cmGlobalNinjaGenerator::AddCXXCompileCommand(
*this->CompileCommandsStream << "," << std::endl;
}
+ std::string sourceFileName = sourceFile;
+ if (!cmSystemTools::FileIsFullPath(sourceFileName.c_str()))
+ {
+ sourceFileName = cmSystemTools::CollapseFullPath(
+ sourceFileName.c_str(),
+ this->GetCMakeInstance()->GetHomeOutputDirectory());
+ }
+
+
*this->CompileCommandsStream << "\n{\n"
<< " \"directory\": \""
<< cmGlobalGenerator::EscapeJSON(buildFileDir) << "\",\n"
<< " \"command\": \""
<< cmGlobalGenerator::EscapeJSON(commandLine) << "\",\n"
<< " \"file\": \""
- << cmGlobalGenerator::EscapeJSON(sourceFile) << "\"\n"
+ << cmGlobalGenerator::EscapeJSON(sourceFileName) << "\"\n"
<< "}";
}
@@ -967,7 +976,7 @@ void cmGlobalNinjaGenerator::WriteTargetHelp(std::ostream& os)
{
WriteRule(*this->RulesFileStream,
"HELP",
- (ninjaCmd() + " -t tagets").c_str(),
+ (ninjaCmd() + " -t targets").c_str(),
"All primary targets available:",
"Rule for printing all primary targets available.",
/*depfile=*/ "",
diff --git a/Source/cmInstallCommand.h b/Source/cmInstallCommand.h
index bf9fd9e..76e622e 100644
--- a/Source/cmInstallCommand.h
+++ b/Source/cmInstallCommand.h
@@ -85,7 +85,10 @@ public:
"with which the install rule is associated, such as \"runtime\" or "
"\"development\". During component-specific installation only "
"install rules associated with the given component name will be "
- "executed. During a full installation all components are installed.\n"
+ "executed. During a full installation all components are installed."
+ " If COMPONENT is not provided a default component \"Unspecified\" is"
+ " created. The default component name may be controlled with the "
+ "CMAKE_INSTALL_DEFAULT_COMPONENT_NAME variable.\n"
"The RENAME argument specifies a name for an installed file that "
"may be different from the original file. Renaming is allowed only "
"when a single file is installed by the command.\n"
diff --git a/Source/cmNinjaTargetGenerator.cxx b/Source/cmNinjaTargetGenerator.cxx
index 6157931..4758989 100644
--- a/Source/cmNinjaTargetGenerator.cxx
+++ b/Source/cmNinjaTargetGenerator.cxx
@@ -534,9 +534,21 @@ cmNinjaTargetGenerator
cmLocalGenerator::RuleVariables compileObjectVars;
std::string lang = language;
compileObjectVars.Language = lang.c_str();
- std::string escapedSourceFileName =
+
+ std::string escapedSourceFileName = sourceFileName;
+
+ if (!cmSystemTools::FileIsFullPath(sourceFileName.c_str()))
+ {
+ escapedSourceFileName = cmSystemTools::CollapseFullPath(
+ escapedSourceFileName.c_str(),
+ this->GetGlobalGenerator()->GetCMakeInstance()->
+ GetHomeOutputDirectory());
+ }
+
+ escapedSourceFileName =
this->LocalGenerator->ConvertToOutputFormat(
- sourceFileName.c_str(), cmLocalGenerator::SHELL);
+ escapedSourceFileName.c_str(), cmLocalGenerator::SHELL);
+
compileObjectVars.Source = escapedSourceFileName.c_str();
compileObjectVars.Object = objectFileName.c_str();
compileObjectVars.Flags = vars["FLAGS"].c_str();
diff --git a/Source/cmakemain.cxx b/Source/cmakemain.cxx
index c3de8ca..11a4267 100644
--- a/Source/cmakemain.cxx
+++ b/Source/cmakemain.cxx
@@ -9,8 +9,8 @@
implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the License for more information.
============================================================================*/
-// include these first, otherwise there will be problems on Windows
-// with GetCurrentDirectory() being redefined
+// include these first, otherwise there will be problems on Windows
+// with GetCurrentDirectory() being redefined
#ifdef CMAKE_BUILD_WITH_CMAKE
#include "cmDynamicLoader.h"
#include "cmDocumentation.h"
@@ -183,7 +183,7 @@ static const char * cmDocumentationOptions[][3] =
"If a file is specified, the documentation is written into and the output "
"format is determined depending on the filename suffix. Supported are man "
"page, HTML, DocBook and plain text."},
- {"--help-policy cmp [file]",
+ {"--help-policy cmp [file]",
"Print help for a single policy and exit.",
"Full documentation specific to the given policy is displayed."
"If a file is specified, the documentation is written into and the output "
@@ -194,7 +194,7 @@ static const char * cmDocumentationOptions[][3] =
"If a file is specified, the documentation is written into and the output "
"format is determined depending on the filename suffix. Supported are man "
"page, HTML, DocBook and plain text."},
- {"--help-property prop [file]",
+ {"--help-property prop [file]",
"Print help for a single property and exit.",
"Full documentation specific to the given property is displayed."
"If a file is specified, the documentation is written into and the output "
@@ -212,7 +212,7 @@ static const char * cmDocumentationOptions[][3] =
"If a file is specified, the documentation is written into and the output "
"format is determined depending on the filename suffix. Supported are man "
"page, HTML, DocBook and plain text."},
- {"--help-variable var [file]",
+ {"--help-variable var [file]",
"Print help for a single variable and exit.",
"Full documentation specific to the given variable is displayed."
"If a file is specified, the documentation is written into and the output "
@@ -296,13 +296,13 @@ static std::string cmakemainGetStack(void *clientdata)
return msg;
}
-static void cmakemainErrorCallback(const char* m, const char*, bool&,
+static void cmakemainErrorCallback(const char* m, const char*, bool&,
void *clientdata)
{
std::cerr << m << cmakemainGetStack(clientdata) << std::endl << std::flush;
}
-static void cmakemainProgressCallback(const char *m, float prog,
+static void cmakemainProgressCallback(const char *m, float prog,
void* clientdata)
{
cmMakefile* mf = cmakemainGetMakefile(clientdata);
@@ -348,7 +348,7 @@ int do_cmake(int ac, char** av)
if ( cmSystemTools::GetCurrentWorkingDirectory().size() == 0 )
{
- std::cerr << "Current working directory cannot be established."
+ std::cerr << "Current working directory cannot be established."
<< std::endl;
nocwd = 1;
}
@@ -357,13 +357,13 @@ int do_cmake(int ac, char** av)
cmDocumentation doc;
doc.addCMakeStandardDocSections();
if(doc.CheckOptions(ac, av, "-E") || nocwd)
- {
+ {
// Construct and print requested documentation.
cmake hcm;
hcm.AddCMakePaths();
doc.SetCMakeRoot(hcm.GetCacheDefinition("CMAKE_ROOT"));
- // the command line args are processed here so that you can do
+ // the command line args are processed here so that you can do
// -DCMAKE_MODULE_PATH=/some/path and have this value accessible here
std::vector<std::string> args;
for(int i =0; i < ac; ++i)
@@ -401,7 +401,7 @@ int do_cmake(int ac, char** av)
doc.SetSections(propDocs);
cmDocumentationEntry e;
- e.Brief =
+ e.Brief =
"variables defined by cmake, that give information about the project, "
"and cmake";
doc.PrependSection("Variables that Provide Information",e);
@@ -418,7 +418,7 @@ int do_cmake(int ac, char** av)
{
doc.ClearSections();
doc.SetSection("NOTE", cmDocumentationNOTE);
- doc.Print(cmDocumentation::UsageForm, std::cerr);
+ doc.Print(cmDocumentation::UsageForm, 0, std::cerr);
return 1;
}
return result;
@@ -426,13 +426,13 @@ int do_cmake(int ac, char** av)
#else
if ( nocwd || ac == 1 )
{
- std::cout <<
+ std::cout <<
"Bootstrap CMake should not be used outside CMake build process."
<< std::endl;
return 0;
}
#endif
-
+
bool wiz = false;
bool sysinfo = false;
bool command = false;
@@ -453,7 +453,7 @@ int do_cmake(int ac, char** av)
sysinfo = true;
}
// if command has already been set, then
- // do not eat the -E
+ // do not eat the -E
else if (!command && strcmp(av[i], "-E") == 0)
{
command = true;
@@ -500,7 +500,7 @@ int do_cmake(int ac, char** av)
workingMode = cmake::FIND_PACKAGE_MODE;
args.push_back(av[i]);
}
- else
+ else
{
args.push_back(av[i]);
}
@@ -513,15 +513,15 @@ int do_cmake(int ac, char** av)
if (wiz)
{
cmakewizard wizard;
- return wizard.RunWizard(args);
+ return wizard.RunWizard(args);
}
if (sysinfo)
{
cmake cm;
int ret = cm.GetSystemInformation(args);
- return ret;
+ return ret;
}
- cmake cm;
+ cmake cm;
cmSystemTools::SetErrorCallback(cmakemainErrorCallback, (void *)&cm);
cm.SetProgressCallback(cmakemainProgressCallback, (void *)&cm);
cm.SetWorkingMode(workingMode);
@@ -529,7 +529,7 @@ int do_cmake(int ac, char** av)
int res = cm.Run(args, view_only);
if ( list_cached || list_all_cached )
{
- cmCacheManager::CacheIterator it =
+ cmCacheManager::CacheIterator it =
cm.GetCacheManager()->GetCacheIterator();
std::cout << "-- Cache values" << std::endl;
for ( it.Begin(); !it.IsAtEnd(); it.Next() )
@@ -545,8 +545,8 @@ int do_cmake(int ac, char** av)
{
std::cout << "// " << it.GetProperty("HELPSTRING") << std::endl;
}
- std::cout << it.GetName() << ":" <<
- cmCacheManager::TypeToString(it.GetType())
+ std::cout << it.GetName() << ":" <<
+ cmCacheManager::TypeToString(it.GetType())
<< "=" << it.GetValue() << std::endl;
if ( list_help )
{
diff --git a/Source/cmcldeps.cxx b/Source/cmcldeps.cxx
index 7d3c4bd..ce64132 100644
--- a/Source/cmcldeps.cxx
+++ b/Source/cmcldeps.cxx
@@ -1,8 +1,4 @@
-/*
- ninja's subprocess.h
-*/
-
-// Copyright 2012 Google Inc. All Rights Reserved.
+// Copyright 2011 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -16,114 +12,21 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-#ifndef NINJA_SUBPROCESS_H_
-#define NINJA_SUBPROCESS_H_
-#include <string>
-#include <vector>
-#include <queue>
-#include <cstdio>
-#include <algorithm>
+// Wrapper around cl that adds /showIncludes to command line, and uses that to
+// generate .d files that match the style from gcc -MD.
+//
+// /showIncludes is equivalent to -MD, not -MMD, that is, system headers are
+// included.
-#ifdef _WIN32
#include <windows.h>
-#else
-#include <signal.h>
-#endif
-
-
-#if defined(_WIN64)
-typedef unsigned __int64 cmULONG_PTR;
-#else
-typedef unsigned long cmULONG_PTR;
-#endif
-
-//#include "exit_status.h"
-enum ExitStatus {
- ExitSuccess,
- ExitFailure,
- ExitInterrupted
-};
-
-/// Subprocess wraps a single async subprocess. It is entirely
-/// passive: it expects the caller to notify it when its fds are ready
-/// for reading, as well as call Finish() to reap the child once done()
-/// is true.
-struct Subprocess {
- ~Subprocess();
-
- /// Returns ExitSuccess on successful process exit, ExitInterrupted if
- /// the process was interrupted, ExitFailure if it otherwise failed.
- ExitStatus Finish();
-
- bool Done() const;
-
- const std::string& GetOutput() const;
-
- int ExitCode() const { return exit_code_; }
-
- private:
- Subprocess();
- bool Start(struct SubprocessSet* set, const std::string& command,
- const std::string& dir);
- void OnPipeReady();
-
- std::string buf_;
-
-#ifdef _WIN32
- /// Set up pipe_ as the parent-side pipe of the subprocess; return the
- /// other end of the pipe, usable in the child process.
- HANDLE SetupPipe(HANDLE ioport);
-
- PROCESS_INFORMATION child_;
- HANDLE pipe_;
- OVERLAPPED overlapped_;
- char overlapped_buf_[4 << 10];
- bool is_reading_;
- int exit_code_;
-#else
- int fd_;
- pid_t pid_;
-#endif
-
- friend struct SubprocessSet;
-};
-
-/// SubprocessSet runs a ppoll/pselect() loop around a set of Subprocesses.
-/// DoWork() waits for any state change in subprocesses; finished_
-/// is a queue of subprocesses as they finish.
-struct SubprocessSet {
- SubprocessSet();
- ~SubprocessSet();
-
- Subprocess* Add(const std::string& command, const std::string& dir);
- bool DoWork();
- Subprocess* NextFinished();
- void Clear();
-
- std::vector<Subprocess*> running_;
- std::queue<Subprocess*> finished_;
-
-#ifdef _WIN32
- static BOOL WINAPI NotifyInterrupted(DWORD dwCtrlType);
- static HANDLE ioport_;
-#else
- static void SetInterruptedFlag(int signum);
- static bool interrupted_;
-
- struct sigaction old_act_;
- sigset_t old_mask_;
-#endif
-};
-
-#endif // NINJA_SUBPROCESS_H_
-
-
-/*
- ninja's util functions
-*/
+#include <sstream>
+#include <cmSystemTools.h>
+// We don't want any wildcard expansion.
+// See http://msdn.microsoft.com/en-us/library/zay8tzh6(v=vs.85).aspx
+void _setargv() {}
static void Fatal(const char* msg, ...) {
va_list ap;
@@ -132,370 +35,13 @@ static void Fatal(const char* msg, ...) {
vfprintf(stderr, msg, ap);
va_end(ap);
fprintf(stderr, "\n");
-#ifdef _WIN32
// On Windows, some tools may inject extra threads.
// exit() may block on locks held by those threads, so forcibly exit.
fflush(stderr);
fflush(stdout);
ExitProcess(1);
-#else
- exit(1);
-#endif
-}
-
-
-#ifdef _WIN32
-std::string GetLastErrorString() {
- DWORD err = GetLastError();
-
- char* msg_buf;
- FormatMessageA(
- FORMAT_MESSAGE_ALLOCATE_BUFFER |
- FORMAT_MESSAGE_FROM_SYSTEM |
- FORMAT_MESSAGE_IGNORE_INSERTS,
- NULL,
- err,
- MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
- (char*)&msg_buf,
- 0,
- NULL);
- std::string msg = msg_buf;
- LocalFree(msg_buf);
- return msg;
-}
-#endif
-
-#define snprintf _snprintf
-
-
-/*
- ninja's subprocess-win32.cc
-*/
-
-// Copyright 2012 Google Inc. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-//#include "subprocess.h"
-
-#include <stdio.h>
-
-#include <algorithm>
-
-//#include "util.h"
-
-namespace {
-
-void Win32Fatal(const char* function) {
- Fatal("%s: %s", function, GetLastErrorString().c_str());
-}
-
-} // anonymous namespace
-
-Subprocess::Subprocess() : overlapped_(), is_reading_(false),
- exit_code_(1) {
- child_.hProcess = NULL;
-}
-
-Subprocess::~Subprocess() {
- if (pipe_) {
- if (!CloseHandle(pipe_))
- Win32Fatal("CloseHandle");
- }
- // Reap child if forgotten.
- if (child_.hProcess)
- Finish();
-}
-
-HANDLE Subprocess::SetupPipe(HANDLE ioport) {
- char pipe_name[100];
- snprintf(pipe_name, sizeof(pipe_name),
- "\\\\.\\pipe\\ninja_pid%u_sp%p", GetCurrentProcessId(), this);
-
- pipe_ = ::CreateNamedPipeA(pipe_name,
- PIPE_ACCESS_INBOUND | FILE_FLAG_OVERLAPPED,
- PIPE_TYPE_BYTE,
- PIPE_UNLIMITED_INSTANCES,
- 0, 0, INFINITE, NULL);
- if (pipe_ == INVALID_HANDLE_VALUE)
- Win32Fatal("CreateNamedPipe");
-
- if (!CreateIoCompletionPort(pipe_, ioport, (cmULONG_PTR)this, 0))
- Win32Fatal("CreateIoCompletionPort");
-
- memset(&overlapped_, 0, sizeof(overlapped_));
- if (!ConnectNamedPipe(pipe_, &overlapped_) &&
- GetLastError() != ERROR_IO_PENDING) {
- Win32Fatal("ConnectNamedPipe");
- }
-
- // Get the write end of the pipe as a handle inheritable across processes.
- HANDLE output_write_handle = CreateFile(pipe_name, GENERIC_WRITE, 0,
- NULL, OPEN_EXISTING, 0, NULL);
- HANDLE output_write_child;
- if (!DuplicateHandle(GetCurrentProcess(), output_write_handle,
- GetCurrentProcess(), &output_write_child,
- 0, TRUE, DUPLICATE_SAME_ACCESS)) {
- Win32Fatal("DuplicateHandle");
- }
- CloseHandle(output_write_handle);
-
- return output_write_child;
-}
-
-bool Subprocess::Start(SubprocessSet* set, const std::string& command,
- const std::string& dir) {
- HANDLE child_pipe = SetupPipe(set->ioport_);
-
- SECURITY_ATTRIBUTES security_attributes;
- memset(&security_attributes, 0, sizeof(SECURITY_ATTRIBUTES));
- security_attributes.nLength = sizeof(SECURITY_ATTRIBUTES);
- security_attributes.bInheritHandle = TRUE;
- // Must be inheritable so subprocesses can dup to children.
- HANDLE nul = CreateFile("NUL", GENERIC_READ,
- FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
- &security_attributes, OPEN_EXISTING, 0, NULL);
- if (nul == INVALID_HANDLE_VALUE)
- Fatal("couldn't open nul");
-
- STARTUPINFOA startup_info;
- memset(&startup_info, 0, sizeof(startup_info));
- startup_info.cb = sizeof(STARTUPINFO);
- startup_info.dwFlags = STARTF_USESTDHANDLES;
- startup_info.hStdInput = nul;
- startup_info.hStdOutput = child_pipe;
- startup_info.hStdError = child_pipe;
-
- PROCESS_INFORMATION process_info;
- memset(&process_info, 0, sizeof(process_info));
-
- // Do not prepend 'cmd /c' on Windows, this breaks command
- // lines greater than 8,191 chars.
- if (!CreateProcessA(NULL, (char*)command.c_str(), NULL, NULL,
- /* inherit handles */ TRUE, CREATE_NEW_PROCESS_GROUP,
- NULL, (dir.empty() ? NULL : dir.c_str()),
- &startup_info, &process_info)) {
- DWORD error = GetLastError();
- if (error == ERROR_FILE_NOT_FOUND) {
- // file (program) not found error is treated
- // as a normal build action failure
- if (child_pipe)
- CloseHandle(child_pipe);
- CloseHandle(pipe_);
- CloseHandle(nul);
- pipe_ = NULL;
- // child_ is already NULL;
- buf_ =
- "CreateProcess failed: The system cannot find the file specified.\n";
- return true;
- } else {
- Win32Fatal("CreateProcess"); // pass all other errors to Win32Fatal
- }
- }
-
- // Close pipe channel only used by the child.
- if (child_pipe)
- CloseHandle(child_pipe);
- CloseHandle(nul);
-
- CloseHandle(process_info.hThread);
- child_ = process_info;
-
- return true;
-}
-
-void Subprocess::OnPipeReady() {
- DWORD bytes;
- if (!GetOverlappedResult(pipe_, &overlapped_, &bytes, TRUE)) {
- if (GetLastError() == ERROR_BROKEN_PIPE) {
- CloseHandle(pipe_);
- pipe_ = NULL;
- return;
- }
- Win32Fatal("GetOverlappedResult");
- }
-
- if (is_reading_ && bytes)
- buf_.append(overlapped_buf_, bytes);
-
- memset(&overlapped_, 0, sizeof(overlapped_));
- is_reading_ = true;
- if (!::ReadFile(pipe_, overlapped_buf_, sizeof(overlapped_buf_),
- &bytes, &overlapped_)) {
- if (GetLastError() == ERROR_BROKEN_PIPE) {
- CloseHandle(pipe_);
- pipe_ = NULL;
- return;
- }
- if (GetLastError() != ERROR_IO_PENDING)
- Win32Fatal("ReadFile");
- }
-
- // Even if we read any bytes in the readfile call, we'll enter this
- // function again later and get them at that point.
-}
-
-ExitStatus Subprocess::Finish() {
- if (!child_.hProcess)
- return ExitFailure;
-
- // TODO: add error handling for all of these.
- WaitForSingleObject(child_.hProcess, INFINITE);
-
- DWORD exit_code = 0;
- GetExitCodeProcess(child_.hProcess, &exit_code);
-
- CloseHandle(child_.hProcess);
- child_.hProcess = NULL;
- exit_code_ = exit_code;
- return exit_code == 0 ? ExitSuccess :
- exit_code == CONTROL_C_EXIT ? ExitInterrupted :
- ExitFailure;
-}
-
-bool Subprocess::Done() const {
- return pipe_ == NULL;
-}
-
-const std::string& Subprocess::GetOutput() const {
- return buf_;
-}
-
-HANDLE SubprocessSet::ioport_;
-
-SubprocessSet::SubprocessSet() {
- ioport_ = ::CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 1);
- if (!ioport_)
- Win32Fatal("CreateIoCompletionPort");
- if (!SetConsoleCtrlHandler(NotifyInterrupted, TRUE))
- Win32Fatal("SetConsoleCtrlHandler");
-}
-
-SubprocessSet::~SubprocessSet() {
- Clear();
-
- SetConsoleCtrlHandler(NotifyInterrupted, FALSE);
- CloseHandle(ioport_);
-}
-
-BOOL WINAPI SubprocessSet::NotifyInterrupted(DWORD dwCtrlType) {
- if (dwCtrlType == CTRL_C_EVENT || dwCtrlType == CTRL_BREAK_EVENT) {
- if (!PostQueuedCompletionStatus(ioport_, 0, 0, NULL))
- Win32Fatal("PostQueuedCompletionStatus");
- return TRUE;
- }
-
- return FALSE;
-}
-
-Subprocess *SubprocessSet::Add(const std::string& command,
- const std::string& dir) {
- Subprocess *subprocess = new Subprocess;
- if (!subprocess->Start(this, command, dir)) {
- delete subprocess;
- return 0;
- }
- if (subprocess->child_.hProcess)
- running_.push_back(subprocess);
- else
- finished_.push(subprocess);
- return subprocess;
-}
-
-bool SubprocessSet::DoWork() {
- DWORD bytes_read;
- Subprocess* subproc;
- OVERLAPPED* overlapped;
-
- if (!GetQueuedCompletionStatus(ioport_, &bytes_read, (cmULONG_PTR*)&subproc,
- &overlapped, INFINITE)) {
- if (GetLastError() != ERROR_BROKEN_PIPE)
- Win32Fatal("GetQueuedCompletionStatus");
- }
-
- if (!subproc) // A NULL subproc indicates that we were interrupted and is
- // delivered by NotifyInterrupted above.
- return true;
-
- subproc->OnPipeReady();
-
- if (subproc->Done()) {
- std::vector<Subprocess*>::iterator end =
- std::remove(running_.begin(), running_.end(), subproc);
- if (running_.end() != end) {
- finished_.push(subproc);
- running_.resize(end - running_.begin());
- }
- }
-
- return false;
-}
-
-Subprocess* SubprocessSet::NextFinished() {
- if (finished_.empty())
- return NULL;
- Subprocess* subproc = finished_.front();
- finished_.pop();
- return subproc;
-}
-
-void SubprocessSet::Clear() {
- std::vector<Subprocess*>::iterator it = running_.begin();
- for (; it != running_.end(); ++it) {
- if ((*it)->child_.hProcess) {
- if (!GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT,
- (*it)->child_.dwProcessId))
- Win32Fatal("GenerateConsoleCtrlEvent");
- }
- }
- it = running_.begin();
- for (; it != running_.end(); ++it)
- delete *it;
- running_.clear();
}
-
-// Copyright 2011 Google Inc. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-
-// Wrapper around cl that adds /showIncludes to command line, and uses that to
-// generate .d files that match the style from gcc -MD.
-//
-// /showIncludes is equivalent to -MD, not -MMD, that is, system headers are
-// included.
-
-
-#include <windows.h>
-#include <sstream>
-//#include "subprocess.h"
-//#include "util.h"
-
-// We don't want any wildcard expansion.
-// See http://msdn.microsoft.com/en-us/library/zay8tzh6(v=vs.85).aspx
-void _setargv() {}
-
static void usage(const char* msg) {
Fatal("%s\n\nusage:\n "
"cmcldeps "
@@ -629,23 +175,23 @@ static int process( const std::string& srcfilename,
const std::string& prefix,
const std::string& cmd,
const std::string& dir = "",
- bool quiet = false) {
-
- SubprocessSet subprocs;
- Subprocess* subproc = subprocs.Add(cmd, dir);
-
- if(!subproc)
- return 2;
-
- while ((subproc = subprocs.NextFinished()) == NULL) {
- subprocs.DoWork();
- }
-
- bool success = subproc->Finish() == ExitSuccess;
- int exit_code = subproc->ExitCode();
-
- std::string output = subproc->GetOutput();
- delete subproc;
+ bool quiet = false)
+{
+ std::string output;
+ // break up command line into a vector
+ std::vector<std::string> args;
+ cmSystemTools::ParseWindowsCommandLine(cmd.c_str(), args);
+ // convert to correct vector type for RunSingleCommand
+ std::vector<cmStdString> command;
+ for(std::vector<std::string>::iterator i = args.begin();
+ i != args.end(); ++i)
+ {
+ command.push_back(i->c_str());
+ }
+ // run the command
+ int exit_code = 0;
+ bool run = cmSystemTools::RunSingleCommand(command, &output, &exit_code,
+ dir.c_str(), cmSystemTools::OUTPUT_NONE);
// process the include directives and output everything else
std::stringstream ss(output);
@@ -669,14 +215,11 @@ static int process( const std::string& srcfilename,
}
}
- if (!success) {
- return exit_code;
- }
-
// don't update .d until/unless we succeed compilation
- outputDepFile(dfile, objfile, includes);
+ if (run && exit_code == 0)
+ outputDepFile(dfile, objfile, includes);
- return 0;
+ return exit_code;
}
diff --git a/Source/ctest.cxx b/Source/ctest.cxx
index d41627e..d650777 100644
--- a/Source/ctest.cxx
+++ b/Source/ctest.cxx
@@ -103,6 +103,12 @@ static const char * cmDocumentationOptions[][3] =
"a dashboard test. All tests are <Mode><Test>, where Mode can be "
"Experimental, Nightly, and Continuous, and Test can be Start, Update, "
"Configure, Build, Test, Coverage, and Submit."},
+ {"-D <var>:<type>=<value>", "Define a variable for script mode",
+ "Pass in variable values on the command line. Use in "
+ "conjunction with -S to pass variable values to a dashboard script. "
+ "Parsing -D arguments as variable values is only attempted if "
+ "the value following -D does not match any of the known dashboard "
+ "types."},
{"-M <model>, --test-model <model>", "Sets the model for a dashboard",
"This option tells ctest to act as a Dart client "
"where the TestModel can be Experimental, "