diff options
author | Brad King <brad.king@kitware.com> | 2009-02-10 13:50:21 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2009-02-10 13:50:21 (GMT) |
commit | 13f9bb646d5ce506efb8fc2d36b6f9ce2268fb2e (patch) | |
tree | 866ed661c1db4761cfe82e65a84ef7ebd8588c12 /Source | |
parent | d0ed46e3d66beead514ee8d95789b5ee56151812 (diff) | |
download | CMake-13f9bb646d5ce506efb8fc2d36b6f9ce2268fb2e.zip CMake-13f9bb646d5ce506efb8fc2d36b6f9ce2268fb2e.tar.gz CMake-13f9bb646d5ce506efb8fc2d36b6f9ce2268fb2e.tar.bz2 |
ENH: Define target and source property LABELS
This creates a new LABELS property for targets and source files. We
write the labels of each target and its source files in target-specific
locations in the build tree for future use.
Diffstat (limited to 'Source')
-rw-r--r-- | Source/cmGlobalGenerator.cxx | 90 | ||||
-rw-r--r-- | Source/cmGlobalGenerator.h | 3 | ||||
-rw-r--r-- | Source/cmSourceFile.cxx | 7 | ||||
-rw-r--r-- | Source/cmTarget.cxx | 5 |
4 files changed, 105 insertions, 0 deletions
diff --git a/Source/cmGlobalGenerator.cxx b/Source/cmGlobalGenerator.cxx index d537b85..fc104a0 100644 --- a/Source/cmGlobalGenerator.cxx +++ b/Source/cmGlobalGenerator.cxx @@ -897,6 +897,8 @@ void cmGlobalGenerator::Generate() // Update rule hashes. this->CheckRuleHashes(); + this->WriteTargetLabels(); + if (this->ExtraGenerator != 0) { this->ExtraGenerator->Generate(); @@ -2120,3 +2122,91 @@ void cmGlobalGenerator::CheckRuleHashes() } #endif } + +//---------------------------------------------------------------------------- +void cmGlobalGenerator::WriteTargetLabels() +{ + cmMakefile* mf = this->LocalGenerators[0]->GetMakefile(); + + // Record generated per-target label files in a central location. + std::string fname = mf->GetHomeOutputDirectory(); + fname += cmake::GetCMakeFilesDirectory(); + fname += "/LabelFiles.txt"; + bool opened = false; + cmGeneratedFileStream fout; + + // Generate a label file for each target. + std::string file; + for(std::map<cmStdString,cmTarget *>::const_iterator ti = + this->TotalTargets.begin(); ti != this->TotalTargets.end(); ++ti) + { + if(this->WriteTargetLabels(ti->second, file)) + { + if(!opened) + { + fout.Open(fname.c_str()); + } + fout << file << "\n"; + } + } + if(!opened) + { + cmSystemTools::RemoveFile(fname.c_str()); + } +} + +//---------------------------------------------------------------------------- +bool cmGlobalGenerator::WriteTargetLabels(cmTarget* target, std::string& file) +{ + // Place the labels file in a per-target support directory. + std::string dir = target->GetSupportDirectory(); + file = dir; + file += "/Labels.txt"; + + // Check whether labels are enabled for this target. + if(const char* value = target->GetProperty("LABELS")) + { + cmSystemTools::MakeDirectory(dir.c_str()); + cmGeneratedFileStream fout(file.c_str()); + + // List the target-wide labels. All sources in the target get + // these labels. + std::vector<std::string> labels; + cmSystemTools::ExpandListArgument(value, labels); + if(!labels.empty()) + { + fout << "# Target labels\n"; + for(std::vector<std::string>::const_iterator li = labels.begin(); + li != labels.end(); ++li) + { + fout << " " << *li << "\n"; + } + } + + // List the source files with any per-source labels. + fout << "# Source files and their labels\n"; + std::vector<cmSourceFile*> const& sources = target->GetSourceFiles(); + for(std::vector<cmSourceFile*>::const_iterator si = sources.begin(); + si != sources.end(); ++si) + { + cmSourceFile* sf = *si; + fout << sf->GetFullPath() << "\n"; + if(const char* svalue = sf->GetProperty("LABELS")) + { + labels.clear(); + cmSystemTools::ExpandListArgument(svalue, labels); + for(std::vector<std::string>::const_iterator li = labels.begin(); + li != labels.end(); ++li) + { + fout << " " << *li << "\n"; + } + } + } + return true; + } + else + { + cmSystemTools::RemoveFile(file.c_str()); + return false; + } +} diff --git a/Source/cmGlobalGenerator.h b/Source/cmGlobalGenerator.h index 60847c2..02e2396 100644 --- a/Source/cmGlobalGenerator.h +++ b/Source/cmGlobalGenerator.h @@ -328,6 +328,9 @@ private: std::map<cmStdString, RuleHash> RuleHashes; void CheckRuleHashes(); + void WriteTargetLabels(); + bool WriteTargetLabels(cmTarget* target, std::string& file); + cmExternalMakefileProjectGenerator* ExtraGenerator; // track files replaced during a Generate diff --git a/Source/cmSourceFile.cxx b/Source/cmSourceFile.cxx index 09cce70..6fe1024 100644 --- a/Source/cmSourceFile.cxx +++ b/Source/cmSourceFile.cxx @@ -477,6 +477,13 @@ void cmSourceFile::DefineProperties(cmake *cm) "of the source file, for example .cxx will go to a .o extension."); cm->DefineProperty + ("LABELS", cmProperty::SOURCE_FILE, + "Specify a list of text labels associated with a source file.", + "This property has meaning only when the source file is listed in " + "a target whose LABELS property is also set. " + "No other semantics are currently specified."); + + cm->DefineProperty ("LANGUAGE", cmProperty::SOURCE_FILE, "What programming language is the file.", "A property that can be set to indicate what programming language " diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index 18a7c50..f07d143 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -351,6 +351,11 @@ void cmTarget::DefineProperties(cmake *cm) "project to the INSTALL_RPATH. "); cm->DefineProperty + ("LABELS", cmProperty::TARGET, + "Specify a list of text labels associated with a target.", + "Target label semantics are currently unspecified."); + + cm->DefineProperty ("LINK_FLAGS", cmProperty::TARGET, "Additional flags to use when linking this target.", "The LINK_FLAGS property can be used to add extra flags to the " |