BUG: fix bugs 5539 (progress going beyond 100% when new files are added) and 5889 (tests are not found in some cases when using add_subdirectory to .. etc)

This commit is contained in:
Ken Martin 2008-01-18 10:25:25 -05:00
parent 6ad79d13dd
commit 7c473d4828
4 changed files with 74 additions and 71 deletions

View File

@ -36,7 +36,7 @@
#include <memory> // auto_ptr #include <memory> // auto_ptr
//---------------------------------------------------------------------- //----------------------------------------------------------------------
class cmCTestSubdirCommand : public cmCommand class cmCTestAddSubdirectoryCommand : public cmCommand
{ {
public: public:
/** /**
@ -44,7 +44,7 @@ public:
*/ */
virtual cmCommand* Clone() virtual cmCommand* Clone()
{ {
cmCTestSubdirCommand* c = new cmCTestSubdirCommand; cmCTestAddSubdirectoryCommand* c = new cmCTestAddSubdirectoryCommand;
c->TestHandler = this->TestHandler; c->TestHandler = this->TestHandler;
return c; return c;
} }
@ -58,65 +58,63 @@ public:
/** /**
* The name of the command as specified in CMakeList.txt. * The name of the command as specified in CMakeList.txt.
*/ */
virtual const char* GetName() { return "SUBDIRS";} virtual const char* GetName() { return "add_subdirectory";}
// Unused methods // Unused methods
virtual const char* GetTerseDocumentation() { return ""; } virtual const char* GetTerseDocumentation() { return ""; }
virtual const char* GetFullDocumentation() { return ""; } virtual const char* GetFullDocumentation() { return ""; }
cmTypeMacro(cmCTestSubdirCommand, cmCommand); cmTypeMacro(cmCTestAddSubdirectoryCommand, cmCommand);
cmCTestTestHandler* TestHandler; cmCTestTestHandler* TestHandler;
}; };
//---------------------------------------------------------------------- //----------------------------------------------------------------------
bool cmCTestSubdirCommand::InitialPass(std::vector<std::string> const& args) bool cmCTestAddSubdirectoryCommand
::InitialPass(std::vector<std::string> const& args)
{ {
if(args.size() < 1 ) if(args.size() < 1 )
{ {
this->SetError("called with incorrect number of arguments"); this->SetError("called with incorrect number of arguments");
return false; return false;
} }
std::vector<std::string>::const_iterator it;
std::string cwd = cmSystemTools::GetCurrentWorkingDirectory();
for ( it = args.begin(); it != args.end(); ++ it )
{
cmSystemTools::ChangeDirectory(cwd.c_str());
std::string fname = cwd;
fname += "/";
fname += *it;
if ( !cmSystemTools::FileExists(fname.c_str()) ) std::string cwd = cmSystemTools::GetCurrentWorkingDirectory();
{ cmSystemTools::ChangeDirectory(cwd.c_str());
// No subdirectory? So what... std::string fname = cwd;
continue; fname += "/";
} fname += args[1];
cmSystemTools::ChangeDirectory(fname.c_str());
const char* testFilename; if ( !cmSystemTools::FileExists(fname.c_str()) )
if( cmSystemTools::FileExists("CTestTestfile.cmake") ) {
{ // No subdirectory? So what...
// does the CTestTestfile.cmake exist ? return true;
testFilename = "CTestTestfile.cmake"; }
} cmSystemTools::ChangeDirectory(fname.c_str());
else const char* testFilename;
{ if( cmSystemTools::FileExists("CTestTestfile.cmake") )
// No CTestTestfile? Who cares... {
cmSystemTools::ChangeDirectory(cwd.c_str()); // does the CTestTestfile.cmake exist ?
continue; testFilename = "CTestTestfile.cmake";
} }
fname += "/"; else
fname += testFilename; {
bool readit = // No CTestTestfile? Who cares...
this->Makefile->ReadListFile(this->Makefile->GetCurrentListFile(),
fname.c_str());
cmSystemTools::ChangeDirectory(cwd.c_str()); cmSystemTools::ChangeDirectory(cwd.c_str());
if(!readit) return true;
{ }
std::string m = "Could not find include file: "; fname += "/";
m += fname; fname += testFilename;
this->SetError(m.c_str()); bool readit =
return false; this->Makefile->ReadListFile(this->Makefile->GetCurrentListFile(),
} fname.c_str());
cmSystemTools::ChangeDirectory(cwd.c_str());
if(!readit)
{
std::string m = "Could not find include file: ";
m += fname;
this->SetError(m.c_str());
return false;
} }
return true; return true;
} }
@ -1260,8 +1258,9 @@ void cmCTestTestHandler::GetListOfTests()
newCom1->TestHandler = this; newCom1->TestHandler = this;
cm.AddCommand(newCom1); cm.AddCommand(newCom1);
// Add handler for SUBDIR // Add handler for ADD_SUBDIRECTORY
cmCTestSubdirCommand* newCom2 = new cmCTestSubdirCommand; cmCTestAddSubdirectoryCommand* newCom2 =
new cmCTestAddSubdirectoryCommand;
newCom2->TestHandler = this; newCom2->TestHandler = this;
cm.AddCommand(newCom2); cm.AddCommand(newCom2);

View File

@ -272,22 +272,19 @@ void cmLocalGenerator::GenerateTestFiles()
} }
if ( this->Children.size()) if ( this->Children.size())
{ {
fout << "SUBDIRS(";
size_t i; size_t i;
std::string outDir = this->Makefile->GetStartOutputDirectory();
outDir += "/";
for(i = 0; i < this->Children.size(); ++i) for(i = 0; i < this->Children.size(); ++i)
{ {
std::string binP = fout << "ADD_SUBDIRECTORY(";
std::string srcP =
this->Children[i]->GetMakefile()->GetStartDirectory();
fout << this->Convert(srcP.c_str(),START);
fout << " ";
std::string outP =
this->Children[i]->GetMakefile()->GetStartOutputDirectory(); this->Children[i]->GetMakefile()->GetStartOutputDirectory();
cmSystemTools::ReplaceString(binP, outDir.c_str(), ""); fout << this->Convert(outP.c_str(),START_OUTPUT);
if ( i > 0 ) fout << ")" << std::endl;
{
fout << " ";
}
fout << binP.c_str();
} }
fout << ")" << std::endl << std::endl;;
} }
} }

View File

@ -210,8 +210,7 @@ void cmLocalUnixMakefileGenerator3::WriteAllProgressVariable()
cmGlobalUnixMakefileGenerator3 *gg = cmGlobalUnixMakefileGenerator3 *gg =
static_cast<cmGlobalUnixMakefileGenerator3*>(this->GlobalGenerator); static_cast<cmGlobalUnixMakefileGenerator3*>(this->GlobalGenerator);
ruleFileStream << "CMAKE_ALL_PROGRESS = " ruleFileStream << gg->GetNumberOfProgressActionsInAll(this) << "\n";
<< gg->GetNumberOfProgressActionsInAll(this) << "\n";
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
@ -1577,17 +1576,6 @@ void cmLocalUnixMakefileGenerator3
this->WriteSpecialTargetsTop(ruleFileStream); this->WriteSpecialTargetsTop(ruleFileStream);
// Include the progress variables for the target. // Include the progress variables for the target.
std::string progressFile = cmake::GetCMakeFilesDirectory();
progressFile += "/progress.make";
std::string progressFileNameFull =
this->ConvertToFullPath(progressFile.c_str());
ruleFileStream
<< "# Include the progress variables for this target.\n"
<< this->IncludeDirective << " "
<< this->Convert(progressFileNameFull.c_str(),
cmLocalGenerator::START_OUTPUT,
cmLocalGenerator::MAKEFILE) << "\n\n";
// Write all global targets // Write all global targets
this->WriteDivider(ruleFileStream); this->WriteDivider(ruleFileStream);
ruleFileStream ruleFileStream
@ -1672,7 +1660,14 @@ void cmLocalUnixMakefileGenerator3
progCmd << this->Convert(progressDir.c_str(), progCmd << this->Convert(progressDir.c_str(),
cmLocalGenerator::FULL, cmLocalGenerator::FULL,
cmLocalGenerator::SHELL); cmLocalGenerator::SHELL);
progCmd << " $(CMAKE_ALL_PROGRESS)";
std::string progressFile = cmake::GetCMakeFilesDirectory();
progressFile += "/progress.make";
std::string progressFileNameFull =
this->ConvertToFullPath(progressFile.c_str());
progCmd << " " << this->Convert(progressFileNameFull.c_str(),
cmLocalGenerator::FULL,
cmLocalGenerator::SHELL);
commands.push_back(progCmd.str()); commands.push_back(progCmd.str());
} }
std::string mf2Dir = cmake::GetCMakeFilesDirectoryPostSlash(); std::string mf2Dir = cmake::GetCMakeFilesDirectoryPostSlash();

View File

@ -1185,7 +1185,19 @@ int cmake::ExecuteCMakeCommand(std::vector<std::string>& args)
std::string dirName = args[2]; std::string dirName = args[2];
dirName += "/Progress"; dirName += "/Progress";
cmSystemTools::RemoveADirectory(dirName.c_str()); cmSystemTools::RemoveADirectory(dirName.c_str());
int count = atoi(args[3].c_str());
// is the last argument a filename that exists?
FILE *countFile = fopen(args[3].c_str(),"r");
int count;
if (countFile)
{
fscanf(countFile,"%i",&count);
fclose(countFile);
}
else
{
count = atoi(args[3].c_str());
}
if (count) if (count)
{ {
cmSystemTools::MakeDirectory(dirName.c_str()); cmSystemTools::MakeDirectory(dirName.c_str());