diff options
author | Fred Baksik <frodak17@gmail.com> | 2019-01-05 16:01:23 (GMT) |
---|---|---|
committer | Fred Baksik <frodak17@gmail.com> | 2019-01-16 15:41:49 (GMT) |
commit | 0c9e47d7cdb498f9bc29231587030e0840c9f00c (patch) | |
tree | 200dc29247760304c6e754f5ec7d80943dd4fcb7 /Source/cmGhsMultiTargetGenerator.cxx | |
parent | 80443184317e97999da63d71549aa1b89997dc3d (diff) | |
download | CMake-0c9e47d7cdb498f9bc29231587030e0840c9f00c.zip CMake-0c9e47d7cdb498f9bc29231587030e0840c9f00c.tar.gz CMake-0c9e47d7cdb498f9bc29231587030e0840c9f00c.tar.bz2 |
GHS: Integrity Application updates
-- Check the property "ghs_integrity_app" on executables to set [INTEGRITY Application]
If the property is not set then check if an integrate file is one of the source files (.int file).
Dynamic Downloads that do not have an integrate file can use this property along with setting
the compiler flag "-dynamic".
-- Remove parsing for -dynamic flag; it is only used to print a comment
The MULTI GUI will show if it is a Monolith or Dynamic Download application
-- Use project references to specify which executables are part of the Integrity Application
Usually Implicit Dependency Analysis will ensure that executable targets
become part of the application. This does not work for Dynamic Download without integrate files.
Use `add_dependencies(dd vas)` to mark that the vas target is part of dd target.
-- Update file locations in the Integrate files.
Diffstat (limited to 'Source/cmGhsMultiTargetGenerator.cxx')
-rw-r--r-- | Source/cmGhsMultiTargetGenerator.cxx | 78 |
1 files changed, 41 insertions, 37 deletions
diff --git a/Source/cmGhsMultiTargetGenerator.cxx b/Source/cmGhsMultiTargetGenerator.cxx index 8da21c6..4588901 100644 --- a/Source/cmGhsMultiTargetGenerator.cxx +++ b/Source/cmGhsMultiTargetGenerator.cxx @@ -13,15 +13,11 @@ #include "cmSourceGroup.h" #include "cmTarget.h" -std::string const cmGhsMultiTargetGenerator::DDOption("-dynamic"); - cmGhsMultiTargetGenerator::cmGhsMultiTargetGenerator(cmGeneratorTarget* target) : GeneratorTarget(target) , LocalGenerator( static_cast<cmLocalGhsMultiGenerator*>(target->GetLocalGenerator())) , Makefile(target->Target->GetMakefile()) - , TargetGroup(DetermineIfTargetGroup(target)) - , DynamicDownload(false) , Name(target->GetName()) { // Store the configuration name that is being used @@ -50,8 +46,7 @@ void cmGhsMultiTargetGenerator::Generate() this->GeneratorTarget->GetExecutableNames( targetName, this->TargetNameReal, targetNameImport, targetNamePDB, this->ConfigName); - if (cmGhsMultiTargetGenerator::DetermineIfTargetGroup( - this->GeneratorTarget)) { + if (cmGhsMultiTargetGenerator::DetermineIfIntegrityApp()) { this->TagType = GhsMultiGpj::INTERGRITY_APPLICATION; } else { this->TagType = GhsMultiGpj::PROGRAM; @@ -126,11 +121,7 @@ void cmGhsMultiTargetGenerator::GenerateTarget() const std::string language( this->GeneratorTarget->GetLinkerLanguage(this->ConfigName)); - this->DynamicDownload = - this->DetermineIfDynamicDownload(this->ConfigName, language); - if (this->DynamicDownload) { - fout << "#component integrity_dynamic_download" << std::endl; - } + this->WriteTargetSpecifics(fout, this->ConfigName); this->SetCompilerFlags(this->ConfigName, language); this->WriteCompilerFlags(fout, this->ConfigName, language); @@ -139,7 +130,7 @@ void cmGhsMultiTargetGenerator::GenerateTarget() this->WriteTargetLinkLine(fout, this->ConfigName); this->WriteCustomCommands(fout); this->WriteSources(fout); - + this->WriteReferences(fout); fout.Close(); } @@ -541,36 +532,49 @@ void cmGhsMultiTargetGenerator::WriteObjectLangOverride( } } } - -bool cmGhsMultiTargetGenerator::DetermineIfTargetGroup( - const cmGeneratorTarget* target) +void cmGhsMultiTargetGenerator::WriteReferences(std::ostream& fout) { - bool output = false; - std::vector<cmSourceFile*> sources; - std::string config = - target->Target->GetMakefile()->GetSafeDefinition("CMAKE_BUILD_TYPE"); - target->GetSourceFiles(sources, config); - for (std::vector<cmSourceFile*>::const_iterator sources_i = sources.begin(); - sources.end() != sources_i; ++sources_i) { - if ("int" == (*sources_i)->GetExtension()) { - output = true; - } + // This only applies to INTEGRITY Applications + if (this->TagType != GhsMultiGpj::INTERGRITY_APPLICATION) { + return; + } + + // Get the targets that this one depends upon + cmTargetDependSet unordered = + this->GetGlobalGenerator()->GetTargetDirectDepends(this->GeneratorTarget); + cmGlobalGhsMultiGenerator::OrderedTargetDependSet ordered(unordered, + this->Name); + for (auto& t : ordered) { + std::string tname = t->GetName(); + std::string tpath = t->LocalGenerator->GetCurrentBinaryDirectory(); + std::string rootpath = this->LocalGenerator->GetCurrentBinaryDirectory(); + std::string outpath = + this->LocalGenerator->ConvertToRelativePath(rootpath, tpath) + "/" + + tname + "REF" + cmGlobalGhsMultiGenerator::FILE_EXTENSION; + + fout << outpath; + fout << " "; + GhsMultiGpj::WriteGpjTag(GhsMultiGpj::REFERENCE, fout); + + // Tell the global generator that a refernce project needs to be created + t->Target->SetProperty("GHS_REFERENCE_PROJECT", "ON"); } - return output; } -bool cmGhsMultiTargetGenerator::DetermineIfDynamicDownload( - std::string const& config, const std::string& language) +bool cmGhsMultiTargetGenerator::DetermineIfIntegrityApp(void) { - std::vector<std::string> options; - bool output = false; - this->GeneratorTarget->GetCompileOptions(options, config, language); - for (std::vector<std::string>::const_iterator options_i = options.begin(); - options_i != options.end(); ++options_i) { - std::string option = *options_i; - if (this->DDOption == option) { - output = true; + const char* p = this->GeneratorTarget->GetProperty("ghs_integrity_app"); + if (p) { + return cmSystemTools::IsOn( + this->GeneratorTarget->GetProperty("ghs_integrity_app")); + } else { + std::vector<cmSourceFile*> sources; + this->GeneratorTarget->GetSourceFiles(sources, this->ConfigName); + for (auto& sf : sources) { + if ("int" == sf->GetExtension()) { + return true; + } } + return false; } - return output; } |