mirror of
https://github.com/reactos/CMake.git
synced 2024-12-12 05:45:51 +00:00
adf60b2838
Previously, given two libraries, X and Y where X depends on Y, all object compilations of X would require the Y library to have been linked before being compiled. This is not necessary and can instead be loosened such that object compilations of X only depend on the order-only dependencies of Y to be completed. This is to ensure that generated sources, headers, custom commands, etc. are completed before X starts to compile its objects. This should help build performance in projects with many libraries which cause a deep library dependency chain. Previously, a library at the bottom would not start compilation until after all other libraries completed, but now only its link step needs to wait and its compilation jobs can be run in parallel with other tasks. Fixes: #15555
115 lines
3.5 KiB
C++
115 lines
3.5 KiB
C++
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
|
file Copyright.txt or https://cmake.org/licensing for details. */
|
|
#ifndef cmLocalNinjaGenerator_h
|
|
#define cmLocalNinjaGenerator_h
|
|
|
|
#include "cmConfigure.h"
|
|
|
|
#include <iosfwd>
|
|
#include <map>
|
|
#include <set>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
#include "cmLocalCommonGenerator.h"
|
|
#include "cmNinjaTypes.h"
|
|
#include "cmOutputConverter.h"
|
|
|
|
class cmCustomCommand;
|
|
class cmCustomCommandGenerator;
|
|
class cmGeneratedFileStream;
|
|
class cmGeneratorTarget;
|
|
class cmGlobalGenerator;
|
|
class cmGlobalNinjaGenerator;
|
|
class cmMakefile;
|
|
class cmRulePlaceholderExpander;
|
|
class cmSourceFile;
|
|
class cmake;
|
|
|
|
/**
|
|
* \class cmLocalNinjaGenerator
|
|
* \brief Write a local build.ninja file.
|
|
*
|
|
* cmLocalNinjaGenerator produces a local build.ninja file from its
|
|
* member Makefile.
|
|
*/
|
|
class cmLocalNinjaGenerator : public cmLocalCommonGenerator
|
|
{
|
|
public:
|
|
cmLocalNinjaGenerator(cmGlobalGenerator* gg, cmMakefile* mf);
|
|
|
|
~cmLocalNinjaGenerator() CM_OVERRIDE;
|
|
|
|
void Generate() CM_OVERRIDE;
|
|
|
|
cmRulePlaceholderExpander* CreateRulePlaceholderExpander() const CM_OVERRIDE;
|
|
|
|
std::string GetTargetDirectory(cmGeneratorTarget const* target) const
|
|
CM_OVERRIDE;
|
|
|
|
const cmGlobalNinjaGenerator* GetGlobalNinjaGenerator() const;
|
|
cmGlobalNinjaGenerator* GetGlobalNinjaGenerator();
|
|
|
|
const cmake* GetCMakeInstance() const;
|
|
cmake* GetCMakeInstance();
|
|
|
|
/// @returns the relative path between the HomeOutputDirectory and this
|
|
/// local generators StartOutputDirectory.
|
|
std::string GetHomeRelativeOutputPath() const
|
|
{
|
|
return this->HomeRelativeOutputPath;
|
|
}
|
|
|
|
std::string BuildCommandLine(const std::vector<std::string>& cmdLines);
|
|
|
|
void AppendTargetOutputs(cmGeneratorTarget* target, cmNinjaDeps& outputs);
|
|
void AppendTargetDepends(
|
|
cmGeneratorTarget* target, cmNinjaDeps& outputs,
|
|
cmNinjaTargetDepends depends = DependOnTargetArtifact);
|
|
|
|
void AddCustomCommandTarget(cmCustomCommand const* cc,
|
|
cmGeneratorTarget* target);
|
|
void AppendCustomCommandLines(cmCustomCommandGenerator const& ccg,
|
|
std::vector<std::string>& cmdLines);
|
|
void AppendCustomCommandDeps(cmCustomCommandGenerator const& ccg,
|
|
cmNinjaDeps& ninjaDeps);
|
|
|
|
void ComputeObjectFilenames(
|
|
std::map<cmSourceFile const*, std::string>& mapping,
|
|
cmGeneratorTarget const* gt = CM_NULLPTR) CM_OVERRIDE;
|
|
|
|
protected:
|
|
std::string ConvertToIncludeReference(
|
|
std::string const& path,
|
|
cmOutputConverter::OutputFormat format = cmOutputConverter::SHELL,
|
|
bool forceFullPaths = false) CM_OVERRIDE;
|
|
|
|
private:
|
|
cmGeneratedFileStream& GetBuildFileStream() const;
|
|
cmGeneratedFileStream& GetRulesFileStream() const;
|
|
|
|
void WriteBuildFileTop();
|
|
void WriteProjectHeader(std::ostream& os);
|
|
void WriteNinjaRequiredVersion(std::ostream& os);
|
|
void WriteNinjaFilesInclusion(std::ostream& os);
|
|
void WriteProcessedMakefile(std::ostream& os);
|
|
void WritePools(std::ostream& os);
|
|
|
|
void WriteCustomCommandRule();
|
|
void WriteCustomCommandBuildStatement(cmCustomCommand const* cc,
|
|
const cmNinjaDeps& orderOnlyDeps);
|
|
|
|
void WriteCustomCommandBuildStatements();
|
|
|
|
std::string MakeCustomLauncher(cmCustomCommandGenerator const& ccg);
|
|
|
|
std::string HomeRelativeOutputPath;
|
|
|
|
typedef std::map<cmCustomCommand const*, std::set<cmGeneratorTarget*> >
|
|
CustomCommandTargetMap;
|
|
CustomCommandTargetMap CustomCommandTargets;
|
|
std::vector<cmCustomCommand const*> CustomCommands;
|
|
};
|
|
|
|
#endif // ! cmLocalNinjaGenerator_h
|