|
|
@@ -2,6 +2,7 @@
|
|
|
file Copyright.txt or https://cmake.org/licensing for details. */
|
|
|
#include "cmGhsMultiTargetGenerator.h"
|
|
|
|
|
|
+#include "cmComputeLinkInformation.h"
|
|
|
#include "cmGeneratedFileStream.h"
|
|
|
#include "cmGeneratorTarget.h"
|
|
|
#include "cmGlobalGhsMultiGenerator.h"
|
|
|
@@ -9,177 +10,128 @@
|
|
|
#include "cmLocalGhsMultiGenerator.h"
|
|
|
#include "cmMakefile.h"
|
|
|
#include "cmSourceFile.h"
|
|
|
+#include "cmSourceGroup.h"
|
|
|
#include "cmTarget.h"
|
|
|
-#include <assert.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)
|
|
|
-{
|
|
|
- this->RelBuildFilePath = this->GetRelBuildFilePath(target);
|
|
|
-
|
|
|
- this->RelOutputFileName = this->RelBuildFilePath + target->GetName() + ".a";
|
|
|
-
|
|
|
- this->RelBuildFileName = this->RelBuildFilePath;
|
|
|
- this->RelBuildFileName += this->GetBuildFileName(target);
|
|
|
-
|
|
|
- std::string absPathToRoot = this->GetAbsPathToRoot(target);
|
|
|
- absPathToRoot = this->AddSlashIfNeededToPath(absPathToRoot);
|
|
|
- this->AbsBuildFilePath = absPathToRoot + this->RelBuildFilePath;
|
|
|
- this->AbsBuildFileName = absPathToRoot + this->RelBuildFileName;
|
|
|
- this->AbsOutputFileName = absPathToRoot + this->RelOutputFileName;
|
|
|
-}
|
|
|
-
|
|
|
-cmGhsMultiTargetGenerator::~cmGhsMultiTargetGenerator()
|
|
|
+ , Name(target->GetName())
|
|
|
{
|
|
|
- cmDeleteAll(this->FolderBuildStreams);
|
|
|
-}
|
|
|
-
|
|
|
-std::string cmGhsMultiTargetGenerator::GetRelBuildFilePath(
|
|
|
- const cmGeneratorTarget* target)
|
|
|
-{
|
|
|
- std::string output = target->GetEffectiveFolderName();
|
|
|
- cmSystemTools::ConvertToUnixSlashes(output);
|
|
|
- if (!output.empty()) {
|
|
|
- output += "/";
|
|
|
+ // Store the configuration name that is being used
|
|
|
+ if (const char* config = this->Makefile->GetDefinition("CMAKE_BUILD_TYPE")) {
|
|
|
+ // Use the build type given by the user.
|
|
|
+ this->ConfigName = config;
|
|
|
+ } else {
|
|
|
+ // No configuration type given.
|
|
|
+ this->ConfigName.clear();
|
|
|
}
|
|
|
- output += target->GetName() + "/";
|
|
|
- return output;
|
|
|
-}
|
|
|
-
|
|
|
-std::string cmGhsMultiTargetGenerator::GetAbsPathToRoot(
|
|
|
- const cmGeneratorTarget* target)
|
|
|
-{
|
|
|
- return target->GetLocalGenerator()->GetBinaryDirectory();
|
|
|
}
|
|
|
|
|
|
-std::string cmGhsMultiTargetGenerator::GetAbsBuildFilePath(
|
|
|
- const cmGeneratorTarget* target)
|
|
|
-{
|
|
|
- std::string output;
|
|
|
- output = cmGhsMultiTargetGenerator::GetAbsPathToRoot(target);
|
|
|
- output = cmGhsMultiTargetGenerator::AddSlashIfNeededToPath(output);
|
|
|
- output += cmGhsMultiTargetGenerator::GetRelBuildFilePath(target);
|
|
|
- return output;
|
|
|
-}
|
|
|
-
|
|
|
-std::string cmGhsMultiTargetGenerator::GetRelBuildFileName(
|
|
|
- const cmGeneratorTarget* target)
|
|
|
-{
|
|
|
- std::string output;
|
|
|
- output = cmGhsMultiTargetGenerator::GetRelBuildFilePath(target);
|
|
|
- output = cmGhsMultiTargetGenerator::AddSlashIfNeededToPath(output);
|
|
|
- output += cmGhsMultiTargetGenerator::GetBuildFileName(target);
|
|
|
- return output;
|
|
|
-}
|
|
|
-
|
|
|
-std::string cmGhsMultiTargetGenerator::GetBuildFileName(
|
|
|
- const cmGeneratorTarget* target)
|
|
|
-{
|
|
|
- std::string output;
|
|
|
- output = target->GetName();
|
|
|
- output += cmGlobalGhsMultiGenerator::FILE_EXTENSION;
|
|
|
- return output;
|
|
|
-}
|
|
|
-
|
|
|
-std::string cmGhsMultiTargetGenerator::AddSlashIfNeededToPath(
|
|
|
- std::string const& input)
|
|
|
+cmGhsMultiTargetGenerator::~cmGhsMultiTargetGenerator()
|
|
|
{
|
|
|
- std::string output(input);
|
|
|
- if (!cmHasLiteralSuffix(output, "/")) {
|
|
|
- output += "/";
|
|
|
- }
|
|
|
- return output;
|
|
|
}
|
|
|
|
|
|
void cmGhsMultiTargetGenerator::Generate()
|
|
|
{
|
|
|
- std::vector<cmSourceFile*> objectSources = this->GetSources();
|
|
|
- if (!objectSources.empty() && this->IncludeThisTarget()) {
|
|
|
- if (!cmSystemTools::FileExists(this->AbsBuildFilePath.c_str())) {
|
|
|
- cmSystemTools::MakeDirectory(this->AbsBuildFilePath.c_str());
|
|
|
+ // Determine type of target for this project
|
|
|
+ switch (this->GeneratorTarget->GetType()) {
|
|
|
+ case cmStateEnums::EXECUTABLE: {
|
|
|
+ // Get the name of the executable to generate.
|
|
|
+ std::string targetName;
|
|
|
+ std::string targetNameImport;
|
|
|
+ std::string targetNamePDB;
|
|
|
+ this->GeneratorTarget->GetExecutableNames(
|
|
|
+ targetName, this->TargetNameReal, targetNameImport, targetNamePDB,
|
|
|
+ this->ConfigName);
|
|
|
+ if (cmGhsMultiTargetGenerator::DetermineIfIntegrityApp()) {
|
|
|
+ this->TagType = GhsMultiGpj::INTERGRITY_APPLICATION;
|
|
|
+ } else {
|
|
|
+ this->TagType = GhsMultiGpj::PROGRAM;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case cmStateEnums::STATIC_LIBRARY: {
|
|
|
+ std::string targetName;
|
|
|
+ std::string targetNameSO;
|
|
|
+ std::string targetNameImport;
|
|
|
+ std::string targetNamePDB;
|
|
|
+ this->GeneratorTarget->GetLibraryNames(
|
|
|
+ targetName, targetNameSO, this->TargetNameReal, targetNameImport,
|
|
|
+ targetNamePDB, this->ConfigName);
|
|
|
+ this->TagType = GhsMultiGpj::LIBRARY;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case cmStateEnums::SHARED_LIBRARY: {
|
|
|
+ std::string msg = "add_library(<name> SHARED ...) not supported: ";
|
|
|
+ msg += this->Name;
|
|
|
+ cmSystemTools::Message(msg.c_str());
|
|
|
+ return;
|
|
|
}
|
|
|
- cmGlobalGhsMultiGenerator::Open(std::string(""), this->AbsBuildFileName,
|
|
|
- &this->FolderBuildStreams);
|
|
|
- cmGlobalGhsMultiGenerator::OpenBuildFileStream(
|
|
|
- this->GetFolderBuildStreams());
|
|
|
- std::string config = this->Makefile->GetSafeDefinition("CMAKE_BUILD_TYPE");
|
|
|
- if (0 == config.length()) {
|
|
|
- config = "RELEASE";
|
|
|
+ case cmStateEnums::OBJECT_LIBRARY: {
|
|
|
+ std::string targetName;
|
|
|
+ std::string targetNameSO;
|
|
|
+ std::string targetNameImport;
|
|
|
+ std::string targetNamePDB;
|
|
|
+ this->GeneratorTarget->GetLibraryNames(
|
|
|
+ targetName, targetNameSO, this->TargetNameReal, targetNameImport,
|
|
|
+ targetNamePDB, this->ConfigName);
|
|
|
+ this->TagType = GhsMultiGpj::SUBPROJECT;
|
|
|
+ break;
|
|
|
}
|
|
|
- const std::string language(
|
|
|
- this->GeneratorTarget->GetLinkerLanguage(config));
|
|
|
- config = cmSystemTools::UpperCase(config);
|
|
|
- this->DynamicDownload = this->DetermineIfDynamicDownload(config, language);
|
|
|
- if (this->DynamicDownload) {
|
|
|
- *this->GetFolderBuildStreams()
|
|
|
- << "#component integrity_dynamic_download" << std::endl;
|
|
|
+ case cmStateEnums::MODULE_LIBRARY: {
|
|
|
+ std::string msg = "add_library(<name> MODULE ...) not supported: ";
|
|
|
+ msg += this->Name;
|
|
|
+ cmSystemTools::Message(msg.c_str());
|
|
|
+ return;
|
|
|
}
|
|
|
- GhsMultiGpj::WriteGpjTag(this->GetGpjTag(), this->GetFolderBuildStreams());
|
|
|
- cmGlobalGhsMultiGenerator::WriteDisclaimer(this->GetFolderBuildStreams());
|
|
|
-
|
|
|
- bool const notKernel = this->IsNotKernel(config, language);
|
|
|
- this->WriteTypeSpecifics(config, notKernel);
|
|
|
- this->SetCompilerFlags(config, language, notKernel);
|
|
|
- this->WriteCompilerFlags(config, language);
|
|
|
- this->WriteCompilerDefinitions(config, language);
|
|
|
- this->WriteIncludes(config, language);
|
|
|
- if (this->GeneratorTarget->GetType() == cmStateEnums::EXECUTABLE) {
|
|
|
- this->WriteTargetLinkLibraries(config, language);
|
|
|
+ case cmStateEnums::UTILITY: {
|
|
|
+ std::string msg = "add_custom_target(<name> ...) not supported: ";
|
|
|
+ msg += this->Name;
|
|
|
+ cmSystemTools::Message(msg.c_str());
|
|
|
+ return;
|
|
|
}
|
|
|
- this->WriteCustomCommands();
|
|
|
+ default:
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
- std::map<const cmSourceFile*, std::string> objectNames =
|
|
|
- cmGhsMultiTargetGenerator::GetObjectNames(
|
|
|
- &objectSources, this->LocalGenerator, this->GeneratorTarget);
|
|
|
+ // Tell the global generator the name of the project file
|
|
|
+ this->GeneratorTarget->Target->SetProperty("GENERATOR_FILE_NAME",
|
|
|
+ this->Name.c_str());
|
|
|
+ this->GeneratorTarget->Target->SetProperty(
|
|
|
+ "GENERATOR_FILE_NAME_EXT", GhsMultiGpj::GetGpjTag(this->TagType));
|
|
|
|
|
|
- this->WriteSources(objectSources, objectNames);
|
|
|
- }
|
|
|
+ this->GenerateTarget();
|
|
|
}
|
|
|
|
|
|
-bool cmGhsMultiTargetGenerator::IncludeThisTarget()
|
|
|
+void cmGhsMultiTargetGenerator::GenerateTarget()
|
|
|
{
|
|
|
- bool output = true;
|
|
|
- char const* excludeFromAll =
|
|
|
- this->GeneratorTarget->GetProperty("EXCLUDE_FROM_ALL");
|
|
|
- if (NULL != excludeFromAll && '1' == excludeFromAll[0] &&
|
|
|
- '\0' == excludeFromAll[1]) {
|
|
|
- output = false;
|
|
|
- }
|
|
|
- return output;
|
|
|
-}
|
|
|
+ // Open the filestream in copy-if-different mode.
|
|
|
+ std::string fname = this->LocalGenerator->GetCurrentBinaryDirectory();
|
|
|
+ fname += "/";
|
|
|
+ fname += this->Name;
|
|
|
+ fname += cmGlobalGhsMultiGenerator::FILE_EXTENSION;
|
|
|
+ cmGeneratedFileStream fout(fname.c_str());
|
|
|
+ fout.SetCopyIfDifferent(true);
|
|
|
|
|
|
-std::vector<cmSourceFile*> cmGhsMultiTargetGenerator::GetSources() const
|
|
|
-{
|
|
|
- std::vector<cmSourceFile*> output;
|
|
|
- std::string config = this->Makefile->GetSafeDefinition("CMAKE_BUILD_TYPE");
|
|
|
- this->GeneratorTarget->GetSourceFiles(output, config);
|
|
|
- return output;
|
|
|
-}
|
|
|
+ this->GetGlobalGenerator()->WriteFileHeader(fout);
|
|
|
+ GhsMultiGpj::WriteGpjTag(this->TagType, fout);
|
|
|
|
|
|
-GhsMultiGpj::Types cmGhsMultiTargetGenerator::GetGpjTag() const
|
|
|
-{
|
|
|
- return cmGhsMultiTargetGenerator::GetGpjTag(this->GeneratorTarget);
|
|
|
-}
|
|
|
+ const std::string language(
|
|
|
+ this->GeneratorTarget->GetLinkerLanguage(this->ConfigName));
|
|
|
|
|
|
-GhsMultiGpj::Types cmGhsMultiTargetGenerator::GetGpjTag(
|
|
|
- const cmGeneratorTarget* target)
|
|
|
-{
|
|
|
- GhsMultiGpj::Types output;
|
|
|
- if (cmGhsMultiTargetGenerator::DetermineIfTargetGroup(target)) {
|
|
|
- output = GhsMultiGpj::INTERGRITY_APPLICATION;
|
|
|
- } else if (target->GetType() == cmStateEnums::STATIC_LIBRARY) {
|
|
|
- output = GhsMultiGpj::LIBRARY;
|
|
|
- } else {
|
|
|
- output = GhsMultiGpj::PROGRAM;
|
|
|
- }
|
|
|
- return output;
|
|
|
+ this->WriteTargetSpecifics(fout, this->ConfigName);
|
|
|
+ this->SetCompilerFlags(this->ConfigName, language);
|
|
|
+ this->WriteCompilerFlags(fout, this->ConfigName, language);
|
|
|
+ this->WriteCompilerDefinitions(fout, this->ConfigName, language);
|
|
|
+ this->WriteIncludes(fout, this->ConfigName, language);
|
|
|
+ this->WriteTargetLinkLine(fout, this->ConfigName);
|
|
|
+ this->WriteCustomCommands(fout);
|
|
|
+ this->WriteSources(fout);
|
|
|
+ this->WriteReferences(fout);
|
|
|
+ fout.Close();
|
|
|
}
|
|
|
|
|
|
cmGlobalGhsMultiGenerator* cmGhsMultiTargetGenerator::GetGlobalGenerator()
|
|
|
@@ -189,41 +141,27 @@ cmGlobalGhsMultiGenerator* cmGhsMultiTargetGenerator::GetGlobalGenerator()
|
|
|
this->LocalGenerator->GetGlobalGenerator());
|
|
|
}
|
|
|
|
|
|
-void cmGhsMultiTargetGenerator::WriteTypeSpecifics(const std::string& config,
|
|
|
- bool const notKernel)
|
|
|
+void cmGhsMultiTargetGenerator::WriteTargetSpecifics(std::ostream& fout,
|
|
|
+ const std::string& config)
|
|
|
{
|
|
|
- std::string outputDir(this->GetOutputDirectory(config));
|
|
|
- std::string outputFilename(this->GetOutputFilename(config));
|
|
|
-
|
|
|
- if (this->GeneratorTarget->GetType() == cmStateEnums::STATIC_LIBRARY) {
|
|
|
- std::string const& static_library_suffix =
|
|
|
- this->Makefile->GetSafeDefinition("CMAKE_STATIC_LIBRARY_SUFFIX");
|
|
|
- *this->GetFolderBuildStreams()
|
|
|
- << " -o \"" << outputDir << outputFilename << static_library_suffix
|
|
|
- << "\"" << std::endl;
|
|
|
- } else if (this->GeneratorTarget->GetType() == cmStateEnums::EXECUTABLE) {
|
|
|
- if (notKernel && !this->IsTargetGroup()) {
|
|
|
- *this->GetFolderBuildStreams() << " -relprog" << std::endl;
|
|
|
- }
|
|
|
- if (this->IsTargetGroup()) {
|
|
|
- *this->GetFolderBuildStreams()
|
|
|
- << " -o \"" << outputDir << outputFilename << ".elf\"" << std::endl;
|
|
|
- *this->GetFolderBuildStreams()
|
|
|
- << " :extraOutputFile=\"" << outputDir << outputFilename
|
|
|
- << ".elf.ael\"" << std::endl;
|
|
|
- } else {
|
|
|
- std::string const executable_suffix =
|
|
|
- this->Makefile->GetSafeDefinition("CMAKE_EXECUTABLE_SUFFIX");
|
|
|
- *this->GetFolderBuildStreams()
|
|
|
- << " -o \"" << outputDir << outputFilename << executable_suffix
|
|
|
- << "\"" << std::endl;
|
|
|
- }
|
|
|
+ std::string outpath;
|
|
|
+ std::string rootpath = this->LocalGenerator->GetCurrentBinaryDirectory();
|
|
|
+
|
|
|
+ if (this->TagType != GhsMultiGpj::SUBPROJECT) {
|
|
|
+ // set target binary file destination
|
|
|
+ outpath = this->GeneratorTarget->GetDirectory(config);
|
|
|
+ outpath = this->LocalGenerator->ConvertToRelativePath(rootpath, outpath);
|
|
|
+ fout << " :binDirRelative=\"" << outpath << "\"" << std::endl;
|
|
|
+ fout << " -o \"" << this->TargetNameReal << "\"" << std::endl;
|
|
|
}
|
|
|
+
|
|
|
+ // set target object file destination
|
|
|
+ outpath = this->LocalGenerator->GetTargetDirectory(this->GeneratorTarget);
|
|
|
+ fout << " :outputDirRelative=\"" << outpath << "\"" << std::endl;
|
|
|
}
|
|
|
|
|
|
void cmGhsMultiTargetGenerator::SetCompilerFlags(std::string const& config,
|
|
|
- const std::string& language,
|
|
|
- bool const notKernel)
|
|
|
+ const std::string& language)
|
|
|
{
|
|
|
std::map<std::string, std::string>::iterator i =
|
|
|
this->FlagsByLanguage.find(language);
|
|
|
@@ -231,14 +169,9 @@ void cmGhsMultiTargetGenerator::SetCompilerFlags(std::string const& config,
|
|
|
std::string flags;
|
|
|
const char* lang = language.c_str();
|
|
|
|
|
|
- if (notKernel) {
|
|
|
- this->LocalGenerator->AddLanguageFlags(flags, this->GeneratorTarget,
|
|
|
- lang, config);
|
|
|
- } else {
|
|
|
- this->LocalGenerator->AddLanguageFlags(flags, this->GeneratorTarget,
|
|
|
- lang + std::string("_GHS_KERNEL"),
|
|
|
- config);
|
|
|
- }
|
|
|
+ this->LocalGenerator->AddLanguageFlags(flags, this->GeneratorTarget, lang,
|
|
|
+ config);
|
|
|
+
|
|
|
this->LocalGenerator->AddCMP0018Flags(flags, this->GeneratorTarget, lang,
|
|
|
config);
|
|
|
this->LocalGenerator->AddVisibilityPresetFlags(
|
|
|
@@ -281,21 +214,25 @@ std::string cmGhsMultiTargetGenerator::GetDefines(const std::string& language,
|
|
|
return i->second;
|
|
|
}
|
|
|
|
|
|
-void cmGhsMultiTargetGenerator::WriteCompilerFlags(std::string const&,
|
|
|
+void cmGhsMultiTargetGenerator::WriteCompilerFlags(std::ostream& fout,
|
|
|
+ std::string const&,
|
|
|
const std::string& language)
|
|
|
{
|
|
|
std::map<std::string, std::string>::iterator flagsByLangI =
|
|
|
this->FlagsByLanguage.find(language);
|
|
|
if (flagsByLangI != this->FlagsByLanguage.end()) {
|
|
|
if (!flagsByLangI->second.empty()) {
|
|
|
- *this->GetFolderBuildStreams()
|
|
|
- << " " << flagsByLangI->second << std::endl;
|
|
|
+ std::vector<std::string> ghsCompFlags =
|
|
|
+ cmSystemTools::ParseArguments(flagsByLangI->second.c_str());
|
|
|
+ for (auto& f : ghsCompFlags) {
|
|
|
+ fout << " " << f << std::endl;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void cmGhsMultiTargetGenerator::WriteCompilerDefinitions(
|
|
|
- const std::string& config, const std::string& language)
|
|
|
+ std::ostream& fout, const std::string& config, const std::string& language)
|
|
|
{
|
|
|
std::vector<std::string> compileDefinitions;
|
|
|
this->GeneratorTarget->GetCompileDefinitions(compileDefinitions, config,
|
|
|
@@ -303,11 +240,12 @@ void cmGhsMultiTargetGenerator::WriteCompilerDefinitions(
|
|
|
for (std::vector<std::string>::const_iterator cdI =
|
|
|
compileDefinitions.begin();
|
|
|
cdI != compileDefinitions.end(); ++cdI) {
|
|
|
- *this->GetFolderBuildStreams() << " -D" << (*cdI) << std::endl;
|
|
|
+ fout << " -D" << (*cdI) << std::endl;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-void cmGhsMultiTargetGenerator::WriteIncludes(const std::string& config,
|
|
|
+void cmGhsMultiTargetGenerator::WriteIncludes(std::ostream& fout,
|
|
|
+ const std::string& config,
|
|
|
const std::string& language)
|
|
|
{
|
|
|
std::vector<std::string> includes;
|
|
|
@@ -316,80 +254,73 @@ void cmGhsMultiTargetGenerator::WriteIncludes(const std::string& config,
|
|
|
|
|
|
for (std::vector<std::string>::const_iterator includes_i = includes.begin();
|
|
|
includes_i != includes.end(); ++includes_i) {
|
|
|
- *this->GetFolderBuildStreams()
|
|
|
- << " -I\"" << *includes_i << "\"" << std::endl;
|
|
|
+ fout << " -I\"" << *includes_i << "\"" << std::endl;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-void cmGhsMultiTargetGenerator::WriteTargetLinkLibraries(
|
|
|
- std::string const& config, std::string const& language)
|
|
|
+void cmGhsMultiTargetGenerator::WriteTargetLinkLine(std::ostream& fout,
|
|
|
+ std::string const& config)
|
|
|
{
|
|
|
- // library directories
|
|
|
- cmTargetDependSet tds =
|
|
|
- this->GetGlobalGenerator()->GetTargetDirectDepends(this->GeneratorTarget);
|
|
|
- for (cmTargetDependSet::iterator tdsI = tds.begin(); tdsI != tds.end();
|
|
|
- ++tdsI) {
|
|
|
- const cmGeneratorTarget* tg = *tdsI;
|
|
|
- *this->GetFolderBuildStreams()
|
|
|
- << " -L\"" << GetAbsBuildFilePath(tg) << "\"" << std::endl;
|
|
|
+ if (this->TagType == GhsMultiGpj::INTERGRITY_APPLICATION) {
|
|
|
+ return;
|
|
|
}
|
|
|
- // library targets
|
|
|
- cmTarget::LinkLibraryVectorType llv =
|
|
|
- this->GeneratorTarget->Target->GetOriginalLinkLibraries();
|
|
|
- for (cmTarget::LinkLibraryVectorType::const_iterator llvI = llv.begin();
|
|
|
- llvI != llv.end(); ++llvI) {
|
|
|
- std::string libName = llvI->first;
|
|
|
- // if it is a user defined target get the full path to the lib
|
|
|
- cmTarget* tg(GetGlobalGenerator()->FindTarget(libName));
|
|
|
- if (NULL != tg) {
|
|
|
- libName = tg->GetName() + ".a";
|
|
|
- }
|
|
|
- *this->GetFolderBuildStreams()
|
|
|
- << " -l\"" << libName << "\"" << std::endl;
|
|
|
+
|
|
|
+ std::string linkLibraries;
|
|
|
+ std::string flags;
|
|
|
+ std::string linkFlags;
|
|
|
+ std::string frameworkPath;
|
|
|
+ std::string linkPath;
|
|
|
+
|
|
|
+ std::unique_ptr<cmLinkLineComputer> linkLineComputer(
|
|
|
+ this->GetGlobalGenerator()->CreateLinkLineComputer(
|
|
|
+ this->LocalGenerator,
|
|
|
+ this->LocalGenerator->GetStateSnapshot().GetDirectory()));
|
|
|
+
|
|
|
+ this->LocalGenerator->GetTargetFlags(
|
|
|
+ linkLineComputer.get(), config, linkLibraries, flags, linkFlags,
|
|
|
+ frameworkPath, linkPath, this->GeneratorTarget);
|
|
|
+
|
|
|
+ // write out link options
|
|
|
+ std::vector<std::string> lopts =
|
|
|
+ cmSystemTools::ParseArguments(linkFlags.c_str());
|
|
|
+ for (auto& l : lopts) {
|
|
|
+ fout << " " << l << std::endl;
|
|
|
}
|
|
|
|
|
|
- if (!this->TargetGroup) {
|
|
|
- std::string linkLibraries;
|
|
|
- std::string flags;
|
|
|
- std::string linkFlags;
|
|
|
- std::string frameworkPath;
|
|
|
- std::string linkPath;
|
|
|
- std::string createRule =
|
|
|
- this->GeneratorTarget->GetCreateRuleVariable(language, config);
|
|
|
- bool useWatcomQuote =
|
|
|
- this->Makefile->IsOn(createRule + "_USE_WATCOM_QUOTE");
|
|
|
- std::unique_ptr<cmLinkLineComputer> linkLineComputer(
|
|
|
- this->GetGlobalGenerator()->CreateLinkLineComputer(
|
|
|
- this->LocalGenerator,
|
|
|
- this->LocalGenerator->GetStateSnapshot().GetDirectory()));
|
|
|
- linkLineComputer->SetUseWatcomQuote(useWatcomQuote);
|
|
|
-
|
|
|
- this->LocalGenerator->GetTargetFlags(
|
|
|
- linkLineComputer.get(), config, linkLibraries, flags, linkFlags,
|
|
|
- frameworkPath, linkPath, this->GeneratorTarget);
|
|
|
- linkFlags = cmSystemTools::TrimWhitespace(linkFlags);
|
|
|
-
|
|
|
- if (!linkPath.empty()) {
|
|
|
- linkPath = " " + linkPath.substr(0U, linkPath.size() - 1U);
|
|
|
- *this->GetFolderBuildStreams() << linkPath;
|
|
|
- }
|
|
|
+ // write out link search paths
|
|
|
+ // must be quoted for paths that contain spaces
|
|
|
+ std::vector<std::string> lpath =
|
|
|
+ cmSystemTools::ParseArguments(linkPath.c_str());
|
|
|
+ for (auto& l : lpath) {
|
|
|
+ fout << " -L\"" << l << "\"" << std::endl;
|
|
|
+ }
|
|
|
+
|
|
|
+ // write out link libs
|
|
|
+ // must be quoted for filepaths that contains spaces
|
|
|
+ std::string cbd = this->LocalGenerator->GetCurrentBinaryDirectory();
|
|
|
|
|
|
- if (!linkFlags.empty()) {
|
|
|
- *this->GetFolderBuildStreams() << " " << linkFlags << std::endl;
|
|
|
+ std::vector<std::string> llibs =
|
|
|
+ cmSystemTools::ParseArguments(linkLibraries.c_str());
|
|
|
+ for (auto& l : llibs) {
|
|
|
+ if (l.compare(0, 2, "-l") == 0) {
|
|
|
+ fout << " \"" << l << "\"" << std::endl;
|
|
|
+ } else {
|
|
|
+ std::string rl = cmSystemTools::CollapseCombinedPath(cbd, l);
|
|
|
+ fout << " -l\"" << rl << "\"" << std::endl;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-void cmGhsMultiTargetGenerator::WriteCustomCommands()
|
|
|
+void cmGhsMultiTargetGenerator::WriteCustomCommands(std::ostream& fout)
|
|
|
{
|
|
|
- WriteCustomCommandsHelper(this->GeneratorTarget->GetPreBuildCommands(),
|
|
|
+ WriteCustomCommandsHelper(fout, this->GeneratorTarget->GetPreBuildCommands(),
|
|
|
cmTarget::PRE_BUILD);
|
|
|
- WriteCustomCommandsHelper(this->GeneratorTarget->GetPostBuildCommands(),
|
|
|
- cmTarget::POST_BUILD);
|
|
|
+ WriteCustomCommandsHelper(
|
|
|
+ fout, this->GeneratorTarget->GetPostBuildCommands(), cmTarget::POST_BUILD);
|
|
|
}
|
|
|
|
|
|
void cmGhsMultiTargetGenerator::WriteCustomCommandsHelper(
|
|
|
- std::vector<cmCustomCommand> const& commandsSet,
|
|
|
+ std::ostream& fout, std::vector<cmCustomCommand> const& commandsSet,
|
|
|
cmTarget::CustomCommandType const commandType)
|
|
|
{
|
|
|
for (std::vector<cmCustomCommand>::const_iterator commandsSetI =
|
|
|
@@ -400,10 +331,10 @@ void cmGhsMultiTargetGenerator::WriteCustomCommandsHelper(
|
|
|
commandI != commands.end(); ++commandI) {
|
|
|
switch (commandType) {
|
|
|
case cmTarget::PRE_BUILD:
|
|
|
- *this->GetFolderBuildStreams() << " :preexecShellSafe=";
|
|
|
+ fout << " :preexecShellSafe=";
|
|
|
break;
|
|
|
case cmTarget::POST_BUILD:
|
|
|
- *this->GetFolderBuildStreams() << " :postexecShellSafe=";
|
|
|
+ fout << " :postexecShellSafe=";
|
|
|
break;
|
|
|
default:
|
|
|
assert("Only pre and post are supported");
|
|
|
@@ -414,242 +345,237 @@ void cmGhsMultiTargetGenerator::WriteCustomCommandsHelper(
|
|
|
std::string subCommandE =
|
|
|
this->LocalGenerator->EscapeForShell(*commandLineI, true);
|
|
|
if (!command.empty()) {
|
|
|
- *this->GetFolderBuildStreams()
|
|
|
- << (command.begin() == commandLineI ? "'" : " ");
|
|
|
+ fout << (command.begin() == commandLineI ? "'" : " ");
|
|
|
// Need to double escape backslashes
|
|
|
cmSystemTools::ReplaceString(subCommandE, "\\", "\\\\");
|
|
|
}
|
|
|
- *this->GetFolderBuildStreams() << subCommandE;
|
|
|
+ fout << subCommandE;
|
|
|
}
|
|
|
if (!command.empty()) {
|
|
|
- *this->GetFolderBuildStreams() << "'" << std::endl;
|
|
|
+ fout << "'" << std::endl;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-std::map<const cmSourceFile*, std::string>
|
|
|
-cmGhsMultiTargetGenerator::GetObjectNames(
|
|
|
- std::vector<cmSourceFile*>* const objectSources,
|
|
|
- cmLocalGhsMultiGenerator* const localGhsMultiGenerator,
|
|
|
- cmGeneratorTarget* const generatorTarget)
|
|
|
+void cmGhsMultiTargetGenerator::WriteSourceProperty(std::ostream& fout,
|
|
|
+ const cmSourceFile* sf,
|
|
|
+ std::string propName,
|
|
|
+ std::string propFlag)
|
|
|
{
|
|
|
- std::map<std::string, std::vector<cmSourceFile*>> filenameToSource;
|
|
|
- std::map<cmSourceFile*, std::string> sourceToFilename;
|
|
|
- for (std::vector<cmSourceFile*>::const_iterator sf = objectSources->begin();
|
|
|
- sf != objectSources->end(); ++sf) {
|
|
|
- const std::string filename =
|
|
|
- cmSystemTools::GetFilenameName((*sf)->GetFullPath());
|
|
|
- const std::string lower_filename = cmSystemTools::LowerCase(filename);
|
|
|
- filenameToSource[lower_filename].push_back(*sf);
|
|
|
- sourceToFilename[*sf] = lower_filename;
|
|
|
- }
|
|
|
-
|
|
|
- std::vector<cmSourceFile*> duplicateSources;
|
|
|
- for (std::map<std::string, std::vector<cmSourceFile*>>::const_iterator
|
|
|
- msvSourceI = filenameToSource.begin();
|
|
|
- msvSourceI != filenameToSource.end(); ++msvSourceI) {
|
|
|
- if (msvSourceI->second.size() > 1) {
|
|
|
- duplicateSources.insert(duplicateSources.end(),
|
|
|
- msvSourceI->second.begin(),
|
|
|
- msvSourceI->second.end());
|
|
|
+ const char* prop = sf->GetProperty(propName);
|
|
|
+ if (prop) {
|
|
|
+ std::vector<std::string> list;
|
|
|
+ cmSystemTools::ExpandListArgument(prop, list);
|
|
|
+ for (auto& p : list) {
|
|
|
+ fout << " " << propFlag << p << std::endl;
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- std::map<const cmSourceFile*, std::string> objectNamesCorrected;
|
|
|
-
|
|
|
- for (std::vector<cmSourceFile*>::const_iterator sf =
|
|
|
- duplicateSources.begin();
|
|
|
- sf != duplicateSources.end(); ++sf) {
|
|
|
- std::string const longestObjectDirectory(
|
|
|
- cmGhsMultiTargetGenerator::ComputeLongestObjectDirectory(
|
|
|
- localGhsMultiGenerator, generatorTarget, *sf));
|
|
|
- std::string objFilenameName =
|
|
|
- localGhsMultiGenerator->GetObjectFileNameWithoutTarget(
|
|
|
- **sf, longestObjectDirectory);
|
|
|
- cmsys::SystemTools::ReplaceString(objFilenameName, "/", "_");
|
|
|
- objectNamesCorrected[*sf] = objFilenameName;
|
|
|
- }
|
|
|
-
|
|
|
- return objectNamesCorrected;
|
|
|
}
|
|
|
|
|
|
-void cmGhsMultiTargetGenerator::WriteSources(
|
|
|
- std::vector<cmSourceFile*> const& objectSources,
|
|
|
- std::map<const cmSourceFile*, std::string> const& objectNames)
|
|
|
+void cmGhsMultiTargetGenerator::WriteSources(std::ostream& fout_proj)
|
|
|
{
|
|
|
- for (const cmSourceFile* sf : objectSources) {
|
|
|
- std::vector<cmSourceGroup> sourceGroups(this->Makefile->GetSourceGroups());
|
|
|
- std::string const& sourceFullPath = sf->GetFullPath();
|
|
|
- cmSourceGroup* sourceGroup =
|
|
|
- this->Makefile->FindSourceGroup(sourceFullPath, sourceGroups);
|
|
|
- std::string sgPath = sourceGroup->GetFullName();
|
|
|
- cmSystemTools::ConvertToUnixSlashes(sgPath);
|
|
|
- cmGlobalGhsMultiGenerator::AddFilesUpToPath(
|
|
|
- this->GetFolderBuildStreams(), &this->FolderBuildStreams,
|
|
|
- this->LocalGenerator->GetBinaryDirectory().c_str(), sgPath,
|
|
|
- GhsMultiGpj::SUBPROJECT, this->RelBuildFilePath);
|
|
|
-
|
|
|
- std::string fullSourcePath(sf->GetFullPath());
|
|
|
- if (sf->GetExtension() == "int" || sf->GetExtension() == "bsp") {
|
|
|
- *this->FolderBuildStreams[sgPath] << fullSourcePath << std::endl;
|
|
|
- } else {
|
|
|
- // WORKAROUND: GHS MULTI needs the path to use backslashes without quotes
|
|
|
- // to open files in search as of version 6.1.6
|
|
|
- cmsys::SystemTools::ReplaceString(fullSourcePath, "/", "\\");
|
|
|
- *this->FolderBuildStreams[sgPath] << fullSourcePath << std::endl;
|
|
|
- }
|
|
|
+ /* vector of all sources for this target */
|
|
|
+ std::vector<cmSourceFile*> sources;
|
|
|
+ this->GeneratorTarget->GetSourceFiles(sources, this->ConfigName);
|
|
|
|
|
|
- if ("ld" != sf->GetExtension() && "int" != sf->GetExtension() &&
|
|
|
- "bsp" != sf->GetExtension()) {
|
|
|
- this->WriteObjectLangOverride(this->FolderBuildStreams[sgPath], sf);
|
|
|
- if (objectNames.end() != objectNames.find(sf)) {
|
|
|
- *this->FolderBuildStreams[sgPath]
|
|
|
- << " -o \"" << objectNames.find(sf)->second << "\"" << std::endl;
|
|
|
- }
|
|
|
+ /* vector of all groups defined for this target
|
|
|
+ * -- but the vector is not expanded with sub groups or in any useful order
|
|
|
+ */
|
|
|
+ std::vector<cmSourceGroup> sourceGroups = this->Makefile->GetSourceGroups();
|
|
|
|
|
|
- this->WriteObjectDir(this->FolderBuildStreams[sgPath],
|
|
|
- this->AbsBuildFilePath + sgPath);
|
|
|
- }
|
|
|
+ /* for each source file assign it to its group */
|
|
|
+ std::map<std::string, std::vector<cmSourceFile*>> groupFiles;
|
|
|
+ std::set<std::string> groupNames;
|
|
|
+ for (auto& sf : sources) {
|
|
|
+ cmSourceGroup* sourceGroup =
|
|
|
+ this->Makefile->FindSourceGroup(sf->GetFullPath(), sourceGroups);
|
|
|
+ std::string gn = sourceGroup->GetFullName();
|
|
|
+ groupFiles[gn].push_back(sf);
|
|
|
+ groupNames.insert(gn);
|
|
|
}
|
|
|
-}
|
|
|
|
|
|
-void cmGhsMultiTargetGenerator::WriteObjectLangOverride(
|
|
|
- cmGeneratedFileStream* fileStream, const cmSourceFile* sourceFile)
|
|
|
-{
|
|
|
- const char* rawLangProp = sourceFile->GetProperty("LANGUAGE");
|
|
|
- if (NULL != rawLangProp) {
|
|
|
- std::string sourceLangProp(rawLangProp);
|
|
|
- std::string extension(sourceFile->GetExtension());
|
|
|
- if ("CXX" == sourceLangProp && ("c" == extension || "C" == extension)) {
|
|
|
- *fileStream << " -dotciscxx" << std::endl;
|
|
|
+ /* list of known groups and the order they are displayed in a project file */
|
|
|
+ const std::vector<std::string> standardGroups = {
|
|
|
+ "Header Files", "Source Files", "CMake Rules",
|
|
|
+ "Object Files", "Object Libraries", "Resources"
|
|
|
+ };
|
|
|
+
|
|
|
+ /* list of groups in the order they are displayed in a project file*/
|
|
|
+ std::vector<std::string> groupFilesList(groupFiles.size());
|
|
|
+
|
|
|
+ /* put the groups in the order they should be listed
|
|
|
+ * - standard groups first, and then everything else
|
|
|
+ * in the order used by std::map.
|
|
|
+ */
|
|
|
+ int i = 0;
|
|
|
+ for (const std::string& gn : standardGroups) {
|
|
|
+ auto n = groupNames.find(gn);
|
|
|
+ if (n != groupNames.end()) {
|
|
|
+ groupFilesList[i] = *n;
|
|
|
+ i += 1;
|
|
|
+ groupNames.erase(gn);
|
|
|
}
|
|
|
}
|
|
|
-}
|
|
|
|
|
|
-void cmGhsMultiTargetGenerator::WriteObjectDir(
|
|
|
- cmGeneratedFileStream* fileStream, std::string const& dir)
|
|
|
-{
|
|
|
- std::string workingDir(dir);
|
|
|
- cmSystemTools::ConvertToUnixSlashes(workingDir);
|
|
|
- if (!workingDir.empty()) {
|
|
|
- workingDir += "/";
|
|
|
+ { /* catch-all group - is last item */
|
|
|
+ std::string gn = "";
|
|
|
+ auto n = groupNames.find(gn);
|
|
|
+ if (n != groupNames.end()) {
|
|
|
+ groupFilesList.back() = *n;
|
|
|
+ groupNames.erase(gn);
|
|
|
+ }
|
|
|
}
|
|
|
- workingDir += "Objs";
|
|
|
- *fileStream << " -object_dir=\"" << workingDir << "\"" << std::endl;
|
|
|
-}
|
|
|
|
|
|
-std::string cmGhsMultiTargetGenerator::GetOutputDirectory(
|
|
|
- const std::string& config) const
|
|
|
-{
|
|
|
- std::string outputDir(AbsBuildFilePath);
|
|
|
-
|
|
|
- const char* runtimeOutputProp =
|
|
|
- this->GeneratorTarget->GetProperty("RUNTIME_OUTPUT_DIRECTORY");
|
|
|
- if (NULL != runtimeOutputProp) {
|
|
|
- outputDir = runtimeOutputProp;
|
|
|
+ for (auto& n : groupNames) {
|
|
|
+ groupFilesList[i] = n;
|
|
|
+ i += 1;
|
|
|
}
|
|
|
|
|
|
- std::string configCapped(cmSystemTools::UpperCase(config));
|
|
|
- const char* runtimeOutputSProp = this->GeneratorTarget->GetProperty(
|
|
|
- "RUNTIME_OUTPUT_DIRECTORY_" + configCapped);
|
|
|
- if (NULL != runtimeOutputSProp) {
|
|
|
- outputDir = runtimeOutputSProp;
|
|
|
+ /* sort the files within each group */
|
|
|
+ for (auto& n : groupFilesList) {
|
|
|
+ std::sort(groupFiles[n].begin(), groupFiles[n].end(),
|
|
|
+ [](cmSourceFile* l, cmSourceFile* r) {
|
|
|
+ return l->GetFullPath() < r->GetFullPath();
|
|
|
+ });
|
|
|
}
|
|
|
- cmSystemTools::ConvertToUnixSlashes(outputDir);
|
|
|
|
|
|
- if (!outputDir.empty()) {
|
|
|
- outputDir += "/";
|
|
|
- }
|
|
|
+ /* list of open project files */
|
|
|
+ std::vector<cmGeneratedFileStream*> gfiles;
|
|
|
+
|
|
|
+ /* write files into the proper project file
|
|
|
+ * -- groups go into main project file
|
|
|
+ * unless FOLDER property or variable is set.
|
|
|
+ */
|
|
|
+ for (auto& sg : groupFilesList) {
|
|
|
+ std::ostream* fout;
|
|
|
+ bool useProjectFile =
|
|
|
+ cmSystemTools::IsOn(
|
|
|
+ this->GeneratorTarget->GetProperty("GHS_NO_SOURCE_GROUP_FILE")) ||
|
|
|
+ cmSystemTools::IsOn(
|
|
|
+ this->Makefile->GetDefinition("GHS_NO_SOURCE_GROUP_FILE"));
|
|
|
+ if (useProjectFile || sg.empty()) {
|
|
|
+ fout = &fout_proj;
|
|
|
+ } else {
|
|
|
+ // Open the filestream in copy-if-different mode.
|
|
|
+ std::string gname = sg;
|
|
|
+ cmsys::SystemTools::ReplaceString(gname, "\\", "_");
|
|
|
+ std::string lpath =
|
|
|
+ this->LocalGenerator->GetTargetDirectory(this->GeneratorTarget);
|
|
|
+ lpath += "/";
|
|
|
+ lpath += gname;
|
|
|
+ lpath += cmGlobalGhsMultiGenerator::FILE_EXTENSION;
|
|
|
+ std::string fpath = this->LocalGenerator->GetCurrentBinaryDirectory();
|
|
|
+ fpath += "/";
|
|
|
+ fpath += lpath;
|
|
|
+ cmGeneratedFileStream* f = new cmGeneratedFileStream(fpath.c_str());
|
|
|
+ f->SetCopyIfDifferent(true);
|
|
|
+ gfiles.push_back(f);
|
|
|
+ fout = f;
|
|
|
+ this->GetGlobalGenerator()->WriteFileHeader(*f);
|
|
|
+ GhsMultiGpj::WriteGpjTag(GhsMultiGpj::SUBPROJECT, *f);
|
|
|
+ fout_proj << lpath << " ";
|
|
|
+ GhsMultiGpj::WriteGpjTag(GhsMultiGpj::SUBPROJECT, fout_proj);
|
|
|
+ }
|
|
|
|
|
|
- return outputDir;
|
|
|
-}
|
|
|
+ if (useProjectFile) {
|
|
|
+ if (sg.empty()) {
|
|
|
+ *fout << "{comment} Others" << std::endl;
|
|
|
+ } else {
|
|
|
+ *fout << "{comment} " << sg << std::endl;
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
-std::string cmGhsMultiTargetGenerator::GetOutputFilename(
|
|
|
- const std::string& config) const
|
|
|
-{
|
|
|
- std::string outputFilename(this->GeneratorTarget->GetName());
|
|
|
+ /* output rule for each source file */
|
|
|
+ for (const cmSourceFile* si : groupFiles[sg]) {
|
|
|
|
|
|
- const char* outputNameProp =
|
|
|
- this->GeneratorTarget->GetProperty("OUTPUT_NAME");
|
|
|
- if (NULL != outputNameProp) {
|
|
|
- outputFilename = outputNameProp;
|
|
|
- }
|
|
|
+ // Convert filename to native system
|
|
|
+ // WORKAROUND: GHS MULTI 6.1.4 and 6.1.6 are known to need backslash on
|
|
|
+ // windows when opening some files from the search window.
|
|
|
+ std::string fname(si->GetFullPath());
|
|
|
+ cmSystemTools::ConvertToOutputSlashes(fname);
|
|
|
+ *fout << fname << std::endl;
|
|
|
+
|
|
|
+ if ("ld" != si->GetExtension() && "int" != si->GetExtension() &&
|
|
|
+ "bsp" != si->GetExtension()) {
|
|
|
+ this->WriteObjectLangOverride(*fout, si);
|
|
|
+ }
|
|
|
+
|
|
|
+ this->WriteSourceProperty(*fout, si, "INCLUDE_DIRECTORIES", "-I");
|
|
|
+ this->WriteSourceProperty(*fout, si, "COMPILE_DEFINITIONS", "-D");
|
|
|
+ this->WriteSourceProperty(*fout, si, "COMPILE_OPTIONS", "");
|
|
|
|
|
|
- std::string configCapped(cmSystemTools::UpperCase(config));
|
|
|
- const char* outputNameSProp =
|
|
|
- this->GeneratorTarget->GetProperty(configCapped + "_OUTPUT_NAME");
|
|
|
- if (NULL != outputNameSProp) {
|
|
|
- outputFilename = outputNameSProp;
|
|
|
+ /* to avoid clutter in the gui only print out the objectName if it has
|
|
|
+ * been renamed */
|
|
|
+ std::string objectName = this->GeneratorTarget->GetObjectName(si);
|
|
|
+ if (!objectName.empty() &&
|
|
|
+ this->GeneratorTarget->HasExplicitObjectName(si)) {
|
|
|
+ *fout << " -o " << objectName << std::endl;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- return outputFilename;
|
|
|
+ for (cmGeneratedFileStream* f : gfiles) {
|
|
|
+ f->Close();
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
-std::string cmGhsMultiTargetGenerator::ComputeLongestObjectDirectory(
|
|
|
- cmLocalGhsMultiGenerator const* localGhsMultiGenerator,
|
|
|
- cmGeneratorTarget* const generatorTarget, cmSourceFile* const sourceFile)
|
|
|
+void cmGhsMultiTargetGenerator::WriteObjectLangOverride(
|
|
|
+ std::ostream& fout, const cmSourceFile* sourceFile)
|
|
|
{
|
|
|
- std::string dir_max;
|
|
|
- dir_max +=
|
|
|
- localGhsMultiGenerator->GetMakefile()->GetCurrentBinaryDirectory();
|
|
|
- dir_max += "/";
|
|
|
- dir_max += generatorTarget->Target->GetName();
|
|
|
- dir_max += "/";
|
|
|
- std::vector<cmSourceGroup> sourceGroups(
|
|
|
- localGhsMultiGenerator->GetMakefile()->GetSourceGroups());
|
|
|
- std::string const& sourceFullPath = sourceFile->GetFullPath();
|
|
|
- cmSourceGroup* sourceGroup =
|
|
|
- localGhsMultiGenerator->GetMakefile()->FindSourceGroup(sourceFullPath,
|
|
|
- sourceGroups);
|
|
|
- std::string const& sgPath = sourceGroup->GetFullName();
|
|
|
- dir_max += sgPath;
|
|
|
- dir_max += "/Objs/libs/";
|
|
|
- dir_max += generatorTarget->Target->GetName();
|
|
|
- dir_max += "/";
|
|
|
- return dir_max;
|
|
|
+ const char* rawLangProp = sourceFile->GetProperty("LANGUAGE");
|
|
|
+ if (NULL != rawLangProp) {
|
|
|
+ std::string sourceLangProp(rawLangProp);
|
|
|
+ std::string extension(sourceFile->GetExtension());
|
|
|
+ if ("CXX" == sourceLangProp && ("c" == extension || "C" == extension)) {
|
|
|
+ fout << " -dotciscxx" << std::endl;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
-bool cmGhsMultiTargetGenerator::IsNotKernel(std::string const& config,
|
|
|
- const std::string& language)
|
|
|
+void cmGhsMultiTargetGenerator::WriteReferences(std::ostream& fout)
|
|
|
{
|
|
|
- bool output;
|
|
|
- std::vector<std::string> options;
|
|
|
- this->GeneratorTarget->GetCompileOptions(options, config, language);
|
|
|
- output =
|
|
|
- options.end() == std::find(options.begin(), options.end(), "-kernel");
|
|
|
- return output;
|
|
|
-}
|
|
|
+ // This only applies to INTEGRITY Applications
|
|
|
+ if (this->TagType != GhsMultiGpj::INTERGRITY_APPLICATION) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
-bool cmGhsMultiTargetGenerator::DetermineIfTargetGroup(
|
|
|
- const cmGeneratorTarget* target)
|
|
|
-{
|
|
|
- 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;
|
|
|
- }
|
|
|
+ // 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;
|
|
|
}
|