|
@@ -13,15 +13,11 @@
|
|
|
#include "cmSourceGroup.h"
|
|
#include "cmSourceGroup.h"
|
|
|
#include "cmTarget.h"
|
|
#include "cmTarget.h"
|
|
|
|
|
|
|
|
-std::string const cmGhsMultiTargetGenerator::DDOption("-dynamic");
|
|
|
|
|
-
|
|
|
|
|
cmGhsMultiTargetGenerator::cmGhsMultiTargetGenerator(cmGeneratorTarget* target)
|
|
cmGhsMultiTargetGenerator::cmGhsMultiTargetGenerator(cmGeneratorTarget* target)
|
|
|
: GeneratorTarget(target)
|
|
: GeneratorTarget(target)
|
|
|
, LocalGenerator(
|
|
, LocalGenerator(
|
|
|
static_cast<cmLocalGhsMultiGenerator*>(target->GetLocalGenerator()))
|
|
static_cast<cmLocalGhsMultiGenerator*>(target->GetLocalGenerator()))
|
|
|
, Makefile(target->Target->GetMakefile())
|
|
, Makefile(target->Target->GetMakefile())
|
|
|
- , TargetGroup(DetermineIfTargetGroup(target))
|
|
|
|
|
- , DynamicDownload(false)
|
|
|
|
|
, Name(target->GetName())
|
|
, Name(target->GetName())
|
|
|
{
|
|
{
|
|
|
// Store the configuration name that is being used
|
|
// Store the configuration name that is being used
|
|
@@ -50,8 +46,7 @@ void cmGhsMultiTargetGenerator::Generate()
|
|
|
this->GeneratorTarget->GetExecutableNames(
|
|
this->GeneratorTarget->GetExecutableNames(
|
|
|
targetName, this->TargetNameReal, targetNameImport, targetNamePDB,
|
|
targetName, this->TargetNameReal, targetNameImport, targetNamePDB,
|
|
|
this->ConfigName);
|
|
this->ConfigName);
|
|
|
- if (cmGhsMultiTargetGenerator::DetermineIfTargetGroup(
|
|
|
|
|
- this->GeneratorTarget)) {
|
|
|
|
|
|
|
+ if (cmGhsMultiTargetGenerator::DetermineIfIntegrityApp()) {
|
|
|
this->TagType = GhsMultiGpj::INTERGRITY_APPLICATION;
|
|
this->TagType = GhsMultiGpj::INTERGRITY_APPLICATION;
|
|
|
} else {
|
|
} else {
|
|
|
this->TagType = GhsMultiGpj::PROGRAM;
|
|
this->TagType = GhsMultiGpj::PROGRAM;
|
|
@@ -126,11 +121,7 @@ void cmGhsMultiTargetGenerator::GenerateTarget()
|
|
|
|
|
|
|
|
const std::string language(
|
|
const std::string language(
|
|
|
this->GeneratorTarget->GetLinkerLanguage(this->ConfigName));
|
|
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->WriteTargetSpecifics(fout, this->ConfigName);
|
|
|
this->SetCompilerFlags(this->ConfigName, language);
|
|
this->SetCompilerFlags(this->ConfigName, language);
|
|
|
this->WriteCompilerFlags(fout, this->ConfigName, language);
|
|
this->WriteCompilerFlags(fout, this->ConfigName, language);
|
|
@@ -139,7 +130,7 @@ void cmGhsMultiTargetGenerator::GenerateTarget()
|
|
|
this->WriteTargetLinkLine(fout, this->ConfigName);
|
|
this->WriteTargetLinkLine(fout, this->ConfigName);
|
|
|
this->WriteCustomCommands(fout);
|
|
this->WriteCustomCommands(fout);
|
|
|
this->WriteSources(fout);
|
|
this->WriteSources(fout);
|
|
|
-
|
|
|
|
|
|
|
+ this->WriteReferences(fout);
|
|
|
fout.Close();
|
|
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;
|
|
|
|
|
}
|
|
}
|