
-- Do not use reference projects, use build hierarchy instead. gbuild has three parallel levels: * low -- Parallelizes compiling source files within a single project (.gpj) file when safe to do so. * medium -- Parallelizes processing files within a single linked output when safe to do so. * high [default] -- Parallelizes processing files whenever safe to do so, including linking task. Testing showed that for some combinations of gbuild / MULTI there are issues with building a project that uses references to target project files along with using {nobuild} option. Sometimes the archiving of a library and linking of an executable were happening in parallel and the build would fail when linking because the archive wasn't complete. This behavior was also inconsistent when running the build from MULTI and from the command line with gbuild. In some cases MULTI did not parallelize archiving and linking, but gbuild performed these actions in parallel. The parallel build issue was not seen when using a build hierarchy where the project listed the project files normally instead of using a reference link. The other option was to add the -parallel_level=medium to the command line when using "cmake --build" but this wouldn't fix the issue if gbuild itself was used to and the user might not be aware of the extra option used by cmake.
161 lines
5.3 KiB
C++
161 lines
5.3 KiB
C++
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
|
file Copyright.txt or https://cmake.org/licensing for details. */
|
|
#ifndef cmGhsMultiGenerator_h
|
|
#define cmGhsMultiGenerator_h
|
|
|
|
#include "cmGlobalGenerator.h"
|
|
|
|
#include "cmGlobalGeneratorFactory.h"
|
|
#include "cmTargetDepend.h"
|
|
|
|
#include <iosfwd>
|
|
#include <set>
|
|
#include <string>
|
|
#include <utility>
|
|
#include <vector>
|
|
|
|
class cmGeneratorTarget;
|
|
class cmLocalGenerator;
|
|
class cmMakefile;
|
|
class cmake;
|
|
struct cmDocumentationEntry;
|
|
|
|
class cmGlobalGhsMultiGenerator : public cmGlobalGenerator
|
|
{
|
|
public:
|
|
// The default filename extension of GHS MULTI's build files.
|
|
static const char* FILE_EXTENSION;
|
|
|
|
cmGlobalGhsMultiGenerator(cmake* cm);
|
|
~cmGlobalGhsMultiGenerator() override;
|
|
|
|
static cmGlobalGeneratorFactory* NewFactory()
|
|
{
|
|
return new cmGlobalGeneratorSimpleFactory<cmGlobalGhsMultiGenerator>();
|
|
}
|
|
|
|
//! create the correct local generator
|
|
cmLocalGenerator* CreateLocalGenerator(cmMakefile* mf) override;
|
|
|
|
/// @return the name of this generator.
|
|
static std::string GetActualName() { return "Green Hills MULTI"; }
|
|
|
|
//! Get the name for this generator
|
|
std::string GetName() const override { return GetActualName(); }
|
|
|
|
/// Overloaded methods. @see cmGlobalGenerator::GetDocumentation()
|
|
static void GetDocumentation(cmDocumentationEntry& entry);
|
|
|
|
/**
|
|
* Utilized by the generator factory to determine if this generator
|
|
* supports toolsets.
|
|
*/
|
|
static bool SupportsToolset() { return true; }
|
|
|
|
/**
|
|
* Utilized by the generator factory to determine if this generator
|
|
* supports platforms.
|
|
*/
|
|
static bool SupportsPlatform() { return true; }
|
|
|
|
// Toolset / Platform Support
|
|
bool SetGeneratorToolset(std::string const& ts, cmMakefile* mf) override;
|
|
bool SetGeneratorPlatform(std::string const& p, cmMakefile* mf) override;
|
|
|
|
/**
|
|
* Try to determine system information such as shared library
|
|
* extension, pthreads, byte order etc.
|
|
*/
|
|
void EnableLanguage(std::vector<std::string> const& languages, cmMakefile*,
|
|
bool optional) override;
|
|
/*
|
|
* Determine what program to use for building the project.
|
|
*/
|
|
bool FindMakeProgram(cmMakefile* mf) override;
|
|
|
|
void ComputeTargetObjectDirectory(cmGeneratorTarget* gt) const override;
|
|
|
|
// Write the common disclaimer text at the top of each build file.
|
|
void WriteFileHeader(std::ostream& fout);
|
|
|
|
const char* GetInstallTargetName() const override { return "install"; }
|
|
|
|
protected:
|
|
void Generate() override;
|
|
std::vector<GeneratedMakeCommand> GenerateBuildCommand(
|
|
const std::string& makeProgram, const std::string& projectName,
|
|
const std::string& projectDir, std::vector<std::string> const& targetNames,
|
|
const std::string& config, bool fast, int jobs, bool verbose,
|
|
std::vector<std::string> const& makeOptions =
|
|
std::vector<std::string>()) override;
|
|
|
|
private:
|
|
void GetToolset(cmMakefile* mf, std::string& tsd, const std::string& ts);
|
|
|
|
/* top-level project */
|
|
void OutputTopLevelProject(cmLocalGenerator* root,
|
|
std::vector<cmLocalGenerator*>& generators);
|
|
void WriteTopLevelProject(std::ostream& fout, cmLocalGenerator* root);
|
|
void WriteMacros(std::ostream& fout, cmLocalGenerator* root);
|
|
void WriteHighLevelDirectives(cmLocalGenerator* root, std::ostream& fout);
|
|
void WriteSubProjects(std::ostream& fout, std::string& all_target);
|
|
void WriteTargets(cmLocalGenerator* root);
|
|
void WriteProjectLine(std::ostream& fout, cmGeneratorTarget const* target,
|
|
cmLocalGenerator* root, std::string& rootBinaryDir);
|
|
void WriteCustomRuleBOD(std::ostream& fout);
|
|
void WriteCustomTargetBOD(std::ostream& fout);
|
|
void WriteAllTarget(cmLocalGenerator* root,
|
|
std::vector<cmLocalGenerator*>& generators,
|
|
std::string& all_target);
|
|
|
|
std::string TrimQuotes(std::string const& str);
|
|
|
|
std::string OsDir;
|
|
static const char* DEFAULT_BUILD_PROGRAM;
|
|
static const char* DEFAULT_TOOLSET_ROOT;
|
|
|
|
bool ComputeTargetBuildOrder(cmGeneratorTarget const* tgt,
|
|
std::vector<cmGeneratorTarget const*>& build);
|
|
bool ComputeTargetBuildOrder(std::vector<cmGeneratorTarget const*>& tgt,
|
|
std::vector<cmGeneratorTarget const*>& build);
|
|
bool VisitTarget(std::set<cmGeneratorTarget const*>& temp,
|
|
std::set<cmGeneratorTarget const*>& perm,
|
|
std::vector<cmGeneratorTarget const*>& order,
|
|
cmGeneratorTarget const* ti);
|
|
|
|
std::vector<cmGeneratorTarget const*> ProjectTargets;
|
|
|
|
// Target sorting
|
|
class TargetSet : public std::set<cmGeneratorTarget const*>
|
|
{
|
|
};
|
|
class TargetCompare
|
|
{
|
|
std::string First;
|
|
|
|
public:
|
|
TargetCompare(std::string first)
|
|
: First(std::move(first))
|
|
{
|
|
}
|
|
bool operator()(cmGeneratorTarget const* l,
|
|
cmGeneratorTarget const* r) const;
|
|
};
|
|
class OrderedTargetDependSet;
|
|
};
|
|
|
|
class cmGlobalGhsMultiGenerator::OrderedTargetDependSet
|
|
: public std::multiset<cmTargetDepend,
|
|
cmGlobalGhsMultiGenerator::TargetCompare>
|
|
{
|
|
typedef std::multiset<cmTargetDepend,
|
|
cmGlobalGhsMultiGenerator::TargetCompare>
|
|
derived;
|
|
|
|
public:
|
|
typedef cmGlobalGenerator::TargetDependSet TargetDependSet;
|
|
OrderedTargetDependSet(TargetDependSet const&, std::string const& first);
|
|
};
|
|
|
|
#endif
|