summaryrefslogtreecommitdiffstats
path: root/Source/cmLocalUnixMakefileGenerator3.cxx
diff options
context:
space:
mode:
authorKen Martin <ken.martin@kitware.com>2005-08-01 14:19:35 (GMT)
committerKen Martin <ken.martin@kitware.com>2005-08-01 14:19:35 (GMT)
commit40cd76ab03488fba42267e5cc07981228df8400f (patch)
treea276ec0da734e803e6d0234207cbb62d095e5bb2 /Source/cmLocalUnixMakefileGenerator3.cxx
parent12ed2c85d98871d6cbde3e644bb4351ac9eada4b (diff)
downloadCMake-40cd76ab03488fba42267e5cc07981228df8400f.zip
CMake-40cd76ab03488fba42267e5cc07981228df8400f.tar.gz
CMake-40cd76ab03488fba42267e5cc07981228df8400f.tar.bz2
ENH: first step to only rebuuilding on flag changes
Diffstat (limited to 'Source/cmLocalUnixMakefileGenerator3.cxx')
-rw-r--r--Source/cmLocalUnixMakefileGenerator3.cxx91
1 files changed, 80 insertions, 11 deletions
diff --git a/Source/cmLocalUnixMakefileGenerator3.cxx b/Source/cmLocalUnixMakefileGenerator3.cxx
index abfb8cc..e952d3b 100644
--- a/Source/cmLocalUnixMakefileGenerator3.cxx
+++ b/Source/cmLocalUnixMakefileGenerator3.cxx
@@ -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,