ENH: first step to only rebuuilding on flag changes

This commit is contained in:
Ken Martin 2005-08-01 10:19:35 -04:00
parent 12ed2c85d9
commit 40cd76ab03
2 changed files with 84 additions and 13 deletions

View File

@ -304,6 +304,19 @@ cmLocalUnixMakefileGenerator3
this->WriteMakeVariables(ruleFileStream, HOME_OUTPUT);
// Open the flags file. This should be copy-if-different because the
// rules may depend on this file itself.
std::string flagFileName = dir;
flagFileName += "/flags.make";
std::string flagFileNameFull = this->ConvertToFullPath(flagFileName);
cmGeneratedFileStream flagFileStream(flagFileNameFull.c_str());
flagFileStream.SetCopyIfDifferent(true);
if(!flagFileStream)
{
return;
}
this->WriteDisclaimer(flagFileStream);
// Include the dependencies for the target.
std::string depPath = dir;
depPath += "/depend.make";
@ -340,7 +353,7 @@ cmLocalUnixMakefileGenerator3
{
// Generate this object file's rule file.
this->WriteObjectRuleFiles(target, *(*source), objects,
ruleFileStream);
ruleFileStream, flagFileStream);
}
else if((*source)->GetPropertyAsBool("EXTERNAL_OBJECT"))
{
@ -350,6 +363,46 @@ cmLocalUnixMakefileGenerator3
}
}
// write language flags for target
std::map<cmStdString,cmLocalUnixMakefileGenerator3::IntegrityCheckSet>&
checkSet = this->GetIntegrityCheckSet()[target.GetName()];
for(std::map<cmStdString,
cmLocalUnixMakefileGenerator3::IntegrityCheckSet>::const_iterator
l = checkSet.begin(); l != checkSet.end(); ++l)
{
const char *lang = l->first.c_str();
std::string flags;
// Add the export symbol definition for shared library objects.
bool shared = ((target.GetType() == cmTarget::SHARED_LIBRARY) ||
(target.GetType() == cmTarget::MODULE_LIBRARY));
if(shared)
{
flags += "-D";
if(const char* custom_export_name = target.GetProperty("DEFINE_SYMBOL"))
{
flags += custom_export_name;
}
else
{
std::string in = target.GetName();
in += "_EXPORTS";
flags += cmSystemTools::MakeCindentifier(in.c_str());
}
}
// Add language-specific flags.
this->AddLanguageFlags(flags, lang);
// Add shared-library flags if needed.
this->AddSharedFlags(flags, lang, shared);
// Add include directory flags.
this->AppendFlags(flags, this->GetIncludeFlags(lang));
flagFileStream << lang << "_FLAGS = " << flags
<< "\n"
<< "\n";
}
// write the custom commands for this target
std::vector<std::string> cleanFiles;
// Look for files registered for cleaning in this directory.
@ -428,7 +481,8 @@ cmLocalUnixMakefileGenerator3
cmTarget& target,
cmSourceFile& source,
std::vector<std::string>& depends,
std::ostream &ruleFileStream)
std::ostream &ruleFileStream,
std::ostream &flagFileStream)
{
// Open the rule file for writing. This should be copy-if-different
// because the rules may depend on this file itself.
@ -436,15 +490,32 @@ cmLocalUnixMakefileGenerator3
ruleFileName += "/build.make";
std::string ruleFileNameFull = this->ConvertToFullPath(ruleFileName);
std::string flagFileName = this->GetTargetDirectory(target);
flagFileName += "/flags.make";
std::string flagFileNameFull = this->ConvertToFullPath(flagFileName);
this->AppendRuleDepend(depends, flagFileNameFull.c_str());
// generate the depend scanning rule
this->WriteObjectDependRules(source, depends);
this->AppendRuleDepend(depends, ruleFileNameFull.c_str());
std::string relativeObj = this->GetHomeRelativeOutputPath();
relativeObj += obj;
// Write the build rule.
// Build the set of compiler flags.
std::string flags;
// Add flags from source file properties.
if (source.GetProperty("COMPILE_FLAGS"))
{
this->AppendFlags(flags, source.GetProperty("COMPILE_FLAGS"));
flagFileStream << "# Custom flags.\n"
<< relativeObj << "_FLAGS = "
<< source.GetProperty("COMPILE_FLAGS")
<< "\n"
<< "\n";
}
// Add the export symbol definition for shared library objects.
bool shared = ((target.GetType() == cmTarget::SHARED_LIBRARY) ||
(target.GetType() == cmTarget::MODULE_LIBRARY));
@ -463,9 +534,6 @@ cmLocalUnixMakefileGenerator3
}
}
// Add flags from source file properties.
this->AppendFlags(flags, source.GetProperty("COMPILE_FLAGS"));
// Add language-specific flags.
this->AddLanguageFlags(flags, lang);
@ -474,6 +542,8 @@ cmLocalUnixMakefileGenerator3
// Add include directory flags.
this->AppendFlags(flags, this->GetIncludeFlags(lang));
std::cerr << "Have total flags: " << flags << std::endl;
// Get the output paths for source and object files.
std::string sourceFile = source.GetFullPath();
@ -485,8 +555,6 @@ cmLocalUnixMakefileGenerator3
std::string objectFile = this->Convert(obj.c_str(),START_OUTPUT,SHELL);
// Construct the build message.
std::string relativeObj = this->GetHomeRelativeOutputPath();
relativeObj += obj;
std::vector<std::string> commands;
std::string buildEcho = "Building ";
buildEcho += lang;
@ -557,7 +625,8 @@ void
cmLocalUnixMakefileGenerator3
::WriteObjectRuleFiles(cmTarget& target, cmSourceFile& source,
std::vector<std::string>& objects,
std::ostream &ruleFileStream)
std::ostream &ruleFileStream,
std::ostream &flagFileStream)
{
// Identify the language of the source file.
const char* lang = this->GetSourceFileLanguage(source);
@ -606,7 +675,7 @@ cmLocalUnixMakefileGenerator3
// generate the build rule file
this->WriteObjectBuildFile(obj, lang, target, source, depends,
ruleFileStream);
ruleFileStream, flagFileStream);
// The object file should be checked for dependency integrity.
m_CheckDependFiles[target.GetName()][lang].insert(&source);
@ -3006,7 +3075,7 @@ void cmLocalUnixMakefileGenerator3
{
// now write all the language stuff
// Set the set of files to check for dependency integrity.
std::set<cmStdString> checkSetLangs;
std::set<cmStdString> checkSetLangs;
std::map<cmStdString,cmLocalUnixMakefileGenerator3::IntegrityCheckSet>&
checkSet = this->GetIntegrityCheckSet()[target.GetName()];
for(std::map<cmStdString,

View File

@ -201,7 +201,8 @@ protected:
void WriteObjectRuleFiles(cmTarget& target,
cmSourceFile& source,
std::vector<std::string>& objects,
std::ostream &filestr);
std::ostream &filestr,
std::ostream &flagstr);
// write the build rule for an object
void WriteObjectBuildFile(std::string &obj,
@ -209,7 +210,8 @@ protected:
cmTarget& target,
cmSourceFile& source,
std::vector<std::string>& depends,
std::ostream &filestr);
std::ostream &filestr,
std::ostream &flagstr);
// write the depend.make file for an object
void WriteObjectDependRules(cmSourceFile& source,