|
|
@@ -21,6 +21,7 @@ cmGhsMultiTargetGenerator::cmGhsMultiTargetGenerator(cmGeneratorTarget* target)
|
|
|
, Makefile(target->Target->GetMakefile())
|
|
|
, TargetGroup(DetermineIfTargetGroup(target))
|
|
|
, DynamicDownload(false)
|
|
|
+ , Name(target->GetName())
|
|
|
{
|
|
|
this->RelBuildFilePath = this->GetRelBuildFilePath(target);
|
|
|
|
|
|
@@ -100,15 +101,24 @@ std::string cmGhsMultiTargetGenerator::AddSlashIfNeededToPath(
|
|
|
|
|
|
void cmGhsMultiTargetGenerator::Generate()
|
|
|
{
|
|
|
+ // Tell the global generator the name of the project file
|
|
|
+ this->GeneratorTarget->Target->SetProperty("GENERATOR_FILE_NAME",
|
|
|
+ this->Name.c_str());
|
|
|
+
|
|
|
+ // Skip if empty or not included in build
|
|
|
std::vector<cmSourceFile*> objectSources = this->GetSources();
|
|
|
if (!objectSources.empty() && this->IncludeThisTarget()) {
|
|
|
- if (!cmSystemTools::FileExists(this->AbsBuildFilePath.c_str())) {
|
|
|
- cmSystemTools::MakeDirectory(this->AbsBuildFilePath.c_str());
|
|
|
- }
|
|
|
- cmGlobalGhsMultiGenerator::Open(std::string(""), this->AbsBuildFileName,
|
|
|
- &this->FolderBuildStreams);
|
|
|
- cmGlobalGhsMultiGenerator::OpenBuildFileStream(
|
|
|
- this->GetFolderBuildStreams());
|
|
|
+
|
|
|
+ // 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);
|
|
|
+
|
|
|
+ cmGlobalGhsMultiGenerator::OpenBuildFileStream(&fout);
|
|
|
+
|
|
|
std::string config = this->Makefile->GetSafeDefinition("CMAKE_BUILD_TYPE");
|
|
|
if (0 == config.length()) {
|
|
|
config = "RELEASE";
|
|
|
@@ -118,28 +128,30 @@ void cmGhsMultiTargetGenerator::Generate()
|
|
|
config = cmSystemTools::UpperCase(config);
|
|
|
this->DynamicDownload = this->DetermineIfDynamicDownload(config, language);
|
|
|
if (this->DynamicDownload) {
|
|
|
- *this->GetFolderBuildStreams()
|
|
|
- << "#component integrity_dynamic_download" << std::endl;
|
|
|
+ fout << "#component integrity_dynamic_download" << std::endl;
|
|
|
}
|
|
|
- GhsMultiGpj::WriteGpjTag(this->GetGpjTag(), this->GetFolderBuildStreams());
|
|
|
- cmGlobalGhsMultiGenerator::WriteDisclaimer(this->GetFolderBuildStreams());
|
|
|
+ GhsMultiGpj::WriteGpjTag(this->GetGpjTag(), &fout);
|
|
|
+ cmGlobalGhsMultiGenerator::WriteDisclaimer(&fout);
|
|
|
|
|
|
bool const notKernel = this->IsNotKernel(config, language);
|
|
|
- this->WriteTypeSpecifics(config, notKernel);
|
|
|
+ this->WriteTypeSpecifics(fout, config, notKernel);
|
|
|
this->SetCompilerFlags(config, language, notKernel);
|
|
|
- this->WriteCompilerFlags(config, language);
|
|
|
- this->WriteCompilerDefinitions(config, language);
|
|
|
- this->WriteIncludes(config, language);
|
|
|
+ this->WriteCompilerFlags(fout, config, language);
|
|
|
+ this->WriteCompilerDefinitions(fout, config, language);
|
|
|
+ this->WriteIncludes(fout, config, language);
|
|
|
if (this->GeneratorTarget->GetType() == cmStateEnums::EXECUTABLE) {
|
|
|
- this->WriteTargetLinkLibraries(config, language);
|
|
|
+ this->WriteTargetLinkLibraries(fout, config, language);
|
|
|
}
|
|
|
- this->WriteCustomCommands();
|
|
|
+ this->WriteCustomCommands(fout);
|
|
|
|
|
|
std::map<const cmSourceFile*, std::string> objectNames =
|
|
|
cmGhsMultiTargetGenerator::GetObjectNames(
|
|
|
&objectSources, this->LocalGenerator, this->GeneratorTarget);
|
|
|
-
|
|
|
+#if 0 /* temp stub - this generates its own files */
|
|
|
this->WriteSources(objectSources, objectNames);
|
|
|
+#endif
|
|
|
+
|
|
|
+ fout.Close();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -189,7 +201,8 @@ cmGlobalGhsMultiGenerator* cmGhsMultiTargetGenerator::GetGlobalGenerator()
|
|
|
this->LocalGenerator->GetGlobalGenerator());
|
|
|
}
|
|
|
|
|
|
-void cmGhsMultiTargetGenerator::WriteTypeSpecifics(const std::string& config,
|
|
|
+void cmGhsMultiTargetGenerator::WriteTypeSpecifics(std::ostream& fout,
|
|
|
+ const std::string& config,
|
|
|
bool const notKernel)
|
|
|
{
|
|
|
std::string outputDir(this->GetOutputDirectory(config));
|
|
|
@@ -198,25 +211,22 @@ void cmGhsMultiTargetGenerator::WriteTypeSpecifics(const std::string& 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;
|
|
|
+ fout << " -o \"" << outputDir << outputFilename << static_library_suffix
|
|
|
+ << "\"" << std::endl;
|
|
|
} else if (this->GeneratorTarget->GetType() == cmStateEnums::EXECUTABLE) {
|
|
|
if (notKernel && !this->IsTargetGroup()) {
|
|
|
- *this->GetFolderBuildStreams() << " -relprog" << std::endl;
|
|
|
+ fout << " -relprog" << std::endl;
|
|
|
}
|
|
|
if (this->IsTargetGroup()) {
|
|
|
- *this->GetFolderBuildStreams()
|
|
|
- << " -o \"" << outputDir << outputFilename << ".elf\"" << std::endl;
|
|
|
- *this->GetFolderBuildStreams()
|
|
|
- << " :extraOutputFile=\"" << outputDir << outputFilename
|
|
|
- << ".elf.ael\"" << std::endl;
|
|
|
+ fout << " -o \"" << outputDir << outputFilename << ".elf\""
|
|
|
+ << std::endl;
|
|
|
+ fout << " :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;
|
|
|
+ fout << " -o \"" << outputDir << outputFilename << executable_suffix
|
|
|
+ << "\"" << std::endl;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -281,21 +291,21 @@ 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;
|
|
|
+ fout << " " << flagsByLangI->second << 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 +313,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,13 +327,12 @@ 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)
|
|
|
+ std::ostream& fout, std::string const& config, std::string const& language)
|
|
|
{
|
|
|
// library directories
|
|
|
cmTargetDependSet tds =
|
|
|
@@ -330,8 +340,7 @@ void cmGhsMultiTargetGenerator::WriteTargetLinkLibraries(
|
|
|
for (cmTargetDependSet::iterator tdsI = tds.begin(); tdsI != tds.end();
|
|
|
++tdsI) {
|
|
|
const cmGeneratorTarget* tg = *tdsI;
|
|
|
- *this->GetFolderBuildStreams()
|
|
|
- << " -L\"" << GetAbsBuildFilePath(tg) << "\"" << std::endl;
|
|
|
+ fout << " -L\"" << GetAbsBuildFilePath(tg) << "\"" << std::endl;
|
|
|
}
|
|
|
// library targets
|
|
|
cmTarget::LinkLibraryVectorType llv =
|
|
|
@@ -344,8 +353,7 @@ void cmGhsMultiTargetGenerator::WriteTargetLinkLibraries(
|
|
|
if (NULL != tg) {
|
|
|
libName = tg->GetName() + ".a";
|
|
|
}
|
|
|
- *this->GetFolderBuildStreams()
|
|
|
- << " -l\"" << libName << "\"" << std::endl;
|
|
|
+ fout << " -l\"" << libName << "\"" << std::endl;
|
|
|
}
|
|
|
|
|
|
if (!this->TargetGroup) {
|
|
|
@@ -371,25 +379,25 @@ void cmGhsMultiTargetGenerator::WriteTargetLinkLibraries(
|
|
|
|
|
|
if (!linkPath.empty()) {
|
|
|
linkPath = " " + linkPath.substr(0U, linkPath.size() - 1U);
|
|
|
- *this->GetFolderBuildStreams() << linkPath;
|
|
|
+ fout << linkPath;
|
|
|
}
|
|
|
|
|
|
if (!linkFlags.empty()) {
|
|
|
- *this->GetFolderBuildStreams() << " " << linkFlags << std::endl;
|
|
|
+ fout << " " << linkFlags << 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 +408,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,15 +422,14 @@ 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;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -515,14 +522,14 @@ void cmGhsMultiTargetGenerator::WriteSources(
|
|
|
}
|
|
|
|
|
|
void cmGhsMultiTargetGenerator::WriteObjectLangOverride(
|
|
|
- cmGeneratedFileStream* fileStream, const cmSourceFile* sourceFile)
|
|
|
+ std::ostream* fout, 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;
|
|
|
+ *fout << " -dotciscxx" << std::endl;
|
|
|
}
|
|
|
}
|
|
|
}
|