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/cmGlobalGenerator.cxx | |
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/cmGlobalGenerator.cxx')
-rw-r--r-- | Source/cmGlobalGenerator.cxx | 90 |
1 files changed, 90 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; + } +} |