diff --git a/Source/cmGlobalUnixMakefileGenerator3.cxx b/Source/cmGlobalUnixMakefileGenerator3.cxx index 14a7e1627..42ef5a1cc 100644 --- a/Source/cmGlobalUnixMakefileGenerator3.cxx +++ b/Source/cmGlobalUnixMakefileGenerator3.cxx @@ -352,20 +352,6 @@ void cmGlobalUnixMakefileGenerator3::WriteMainCMakefile() << " \"" << lg->Convert(check.c_str(), cmLocalGenerator::START_OUTPUT).c_str() << "\"\n"; - - // add in all the directory information files - std::string tmpStr; - for (unsigned int i = 0; i < this->LocalGenerators.size(); ++i) - { - lg = - static_cast(this->LocalGenerators[i]); - tmpStr = lg->GetMakefile()->GetStartOutputDirectory(); - tmpStr += cmake::GetCMakeFilesDirectory(); - tmpStr += "/CMakeDirectoryInformation.cmake"; - cmakefileStream << " \"" << - lg->Convert(tmpStr.c_str(),cmLocalGenerator::HOME_OUTPUT).c_str() - << "\"\n"; - } cmakefileStream << " )\n\n"; // CMake must rerun if a byproduct is missing. @@ -382,6 +368,20 @@ void cmGlobalUnixMakefileGenerator3::WriteMainCMakefile() lg->Convert(k->c_str(),cmLocalGenerator::HOME_OUTPUT).c_str() << "\"\n"; } + + // add in all the directory information files + std::string tmpStr; + for (unsigned int i = 0; i < this->LocalGenerators.size(); ++i) + { + lg = + static_cast(this->LocalGenerators[i]); + tmpStr = lg->GetMakefile()->GetStartOutputDirectory(); + tmpStr += cmake::GetCMakeFilesDirectory(); + tmpStr += "/CMakeDirectoryInformation.cmake"; + cmakefileStream << " \"" << + lg->Convert(tmpStr.c_str(),cmLocalGenerator::HOME_OUTPUT).c_str() + << "\"\n"; + } cmakefileStream << " )\n\n"; } diff --git a/Source/cmLocalUnixMakefileGenerator3.cxx b/Source/cmLocalUnixMakefileGenerator3.cxx index eb77284b9..495a05ada 100644 --- a/Source/cmLocalUnixMakefileGenerator3.cxx +++ b/Source/cmLocalUnixMakefileGenerator3.cxx @@ -436,6 +436,7 @@ void cmLocalUnixMakefileGenerator3::WriteDirectoryInformationFile() return; } + infoFileStream.SetCopyIfDifferent(true); // Write the do not edit header. this->WriteDisclaimer(infoFileStream); @@ -1352,7 +1353,7 @@ bool cmLocalUnixMakefileGenerator3::UpdateDependencies(const char* tgtInfo, // time dependencies were scanned then force rescanning. This may // happen when a new source file is added and CMake regenerates the // project but no other sources were touched. - bool needRescan = false; + bool needRescanDependInfo = false; cmFileTimeComparison* ftc = this->GlobalGenerator->GetCMakeInstance()->GetFileComparison(); { @@ -1368,19 +1369,48 @@ bool cmLocalUnixMakefileGenerator3::UpdateDependencies(const char* tgtInfo, << internalDependFile << "\"." << std::endl; cmSystemTools::Stdout(msg.str().c_str()); } - needRescan = true; + needRescanDependInfo = true; } } + // If the directory information is newer than depend.internal, include dirs + // may have changed. In this case discard all old dependencies. + bool needRescanDirInfo = false; + std::string dirInfoFile = this->Makefile->GetStartOutputDirectory(); + dirInfoFile += cmake::GetCMakeFilesDirectory(); + dirInfoFile += "/CMakeDirectoryInformation.cmake"; + { + int result; + if(!ftc->FileTimeCompare(internalDependFile.c_str(), + dirInfoFile.c_str(), &result) || result < 0) + { + if(verbose) + { + cmOStringStream msg; + msg << "Dependee \"" << internalDependFile + << "\" is newer than depender \"" + << dirInfoFile << "\"." << std::endl; + cmSystemTools::Stdout(msg.str().c_str()); + } + needRescanDirInfo = true; + } + } + // Check the implicit dependencies to see if they are up to date. // The build.make file may have explicit dependencies for the object // files but these will not affect the scanning process so they need // not be considered. - cmDependsC checker; - checker.SetVerbose(verbose); - checker.SetFileComparison(ftc); - if(needRescan || - !checker.Check(dependFile.c_str(), internalDependFile.c_str())) + bool needRescanDependencies = false; + if (needRescanDirInfo == false) + { + cmDependsC checker; + checker.SetVerbose(verbose); + checker.SetFileComparison(ftc); + needRescanDependencies = !checker.Check(dependFile.c_str(), + internalDependFile.c_str()); + } + + if(needRescanDependInfo || needRescanDirInfo || needRescanDependencies) { // The dependencies must be regenerated. std::string targetName = cmSystemTools::GetFilenameName(dir);