CMake/Source/cmNinjaTargetGenerator.h

165 lines
5.2 KiB
C
Raw Normal View History

2011-11-11 09:00:49 +04:00
/*============================================================================
CMake - Cross Platform Makefile Generator
Copyright 2011 Peter Collingbourne <peter@pcc.me.uk>
Copyright 2011 Nicolas Despres <nicolas.despres@gmail.com>
Distributed under the OSI-approved BSD License (the "License");
see accompanying file Copyright.txt for details.
This software is distributed WITHOUT ANY WARRANTY; without even the
implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the License for more information.
============================================================================*/
#ifndef cmNinjaTargetGenerator_h
#define cmNinjaTargetGenerator_h
#include "cmCommonTargetGenerator.h"
2011-11-11 09:00:49 +04:00
#include "cmStandardIncludes.h"
#include "cmNinjaTypes.h"
#include "cmGlobalNinjaGenerator.h"
2011-11-11 09:00:49 +04:00
#include "cmLocalNinjaGenerator.h"
#include "cmOSXBundleGenerator.h"
2011-11-11 09:00:49 +04:00
class cmTarget;
class cmGeneratedFileStream;
class cmGeneratorTarget;
2011-11-11 09:00:49 +04:00
class cmMakefile;
class cmSourceFile;
class cmCustomCommand;
class cmNinjaTargetGenerator: public cmCommonTargetGenerator
2011-11-11 09:00:49 +04:00
{
public:
/// Create a cmNinjaTargetGenerator according to the @a target's type.
static cmNinjaTargetGenerator* New(cmGeneratorTarget* target);
2011-11-11 09:00:49 +04:00
/// Build a NinjaTargetGenerator.
cmNinjaTargetGenerator(cmGeneratorTarget* target);
2011-11-11 09:00:49 +04:00
/// Destructor.
virtual ~cmNinjaTargetGenerator();
virtual void Generate() = 0;
std::string GetTargetName() const;
bool NeedDepTypeMSVC(const std::string& lang) const;
2011-11-11 09:00:49 +04:00
protected:
bool SetMsvcTargetPdbVariable(cmNinjaVars&) const;
2011-11-11 09:00:49 +04:00
cmGeneratedFileStream& GetBuildFileStream() const;
cmGeneratedFileStream& GetRulesFileStream() const;
cmGeneratorTarget* GetGeneratorTarget() const
{ return this->GeneratorTarget; }
2011-11-11 09:00:49 +04:00
cmLocalNinjaGenerator* GetLocalGenerator() const
{ return this->LocalGenerator; }
cmGlobalNinjaGenerator* GetGlobalGenerator() const;
cmMakefile* GetMakefile() const
{ return this->Makefile; }
std::string LanguageCompilerRule(const std::string& lang) const;
2011-11-11 09:00:49 +04:00
std::string OrderDependsTargetForTarget();
std::string ComputeOrderDependsForTarget();
2011-11-11 09:00:49 +04:00
/**
* Compute the flags for compilation of object files for a given @a language.
* @note Generally it is the value of the variable whose name is computed
* by LanguageFlagsVarName().
*/
2014-03-13 02:50:42 +04:00
std::string ComputeFlagsForObject(cmSourceFile const* source,
2011-11-11 09:00:49 +04:00
const std::string& language);
void AddIncludeFlags(std::string& flags, std::string const& lang);
2014-03-13 02:50:42 +04:00
std::string ComputeDefines(cmSourceFile const* source,
2011-11-11 09:00:49 +04:00
const std::string& language);
2014-03-11 02:32:00 +04:00
std::string ConvertToNinjaPath(const std::string& path) const {
return this->GetGlobalGenerator()->ConvertToNinjaPath(path);
}
cmGlobalNinjaGenerator::MapToNinjaPathImpl MapToNinjaPath() const {
return this->GetGlobalGenerator()->MapToNinjaPath();
2011-11-11 09:00:49 +04:00
}
/// @return the list of link dependency for the given target @a target.
cmNinjaDeps ComputeLinkDeps() const;
/// @return the source file path for the given @a source.
2014-03-13 02:50:42 +04:00
std::string GetSourceFilePath(cmSourceFile const* source) const;
2011-11-11 09:00:49 +04:00
/// @return the object file path for the given @a source.
2014-03-13 02:50:42 +04:00
std::string GetObjectFilePath(cmSourceFile const* source) const;
2011-11-11 09:00:49 +04:00
/// @return the file path where the target named @a name is generated.
std::string GetTargetFilePath(const std::string& name) const;
/// @return the output path for the target.
virtual std::string GetTargetOutputDir() const;
void WriteLanguageRules(const std::string& language);
void WriteCompileRule(const std::string& language);
void WriteObjectBuildStatements();
void WriteObjectBuildStatement(cmSourceFile const* source,
bool writeOrderDependsTargetForTarget);
2011-11-11 09:00:49 +04:00
void ExportObjectCompileCommand(
std::string const& language,
std::string const& sourceFileName,
std::string const& objectDir,
std::string const& objectFileName,
std::string const& objectFileDir,
std::string const& flags,
std::string const& defines,
std::string const& includes
);
2011-11-11 09:00:49 +04:00
cmNinjaDeps GetObjects() const
{ return this->Objects; }
void EnsureDirectoryExists(const std::string& dir) const;
void EnsureParentDirectoryExists(const std::string& path) const;
// write rules for Mac OS X Application Bundle content.
2012-07-18 14:17:39 +04:00
struct MacOSXContentGeneratorType :
cmOSXBundleGenerator::MacOSXContentGeneratorType
{
2012-07-18 14:17:39 +04:00
MacOSXContentGeneratorType(cmNinjaTargetGenerator* g) :
Generator(g) {}
void operator()(cmSourceFile const& source, const char* pkgloc);
private:
cmNinjaTargetGenerator* Generator;
};
2012-07-18 15:39:14 +04:00
friend struct MacOSXContentGeneratorType;
2012-07-18 14:17:39 +04:00
MacOSXContentGeneratorType* MacOSXContentGenerator;
// Properly initialized by sub-classes.
cmOSXBundleGenerator* OSXBundleGenerator;
std::set<std::string> MacContentFolders;
2014-03-11 02:32:00 +04:00
void addPoolNinjaVariable(const std::string& pool_property,
2015-10-19 00:13:50 +03:00
cmGeneratorTarget* target,
cmNinjaVars& vars);
2012-07-18 13:27:49 +04:00
bool ForceResponseFile();
2011-11-11 09:00:49 +04:00
private:
cmLocalNinjaGenerator* LocalGenerator;
/// List of object files for this target.
cmNinjaDeps Objects;
std::vector<cmCustomCommand const*> CustomCommands;
2011-11-11 09:00:49 +04:00
};
#endif // ! cmNinjaTargetGenerator_h