/*============================================================================ CMake - Cross Platform Makefile Generator Copyright 2000-2012 Kitware, Inc., Insight Software Consortium 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 cmGeneratorTarget_h #define cmGeneratorTarget_h #include "cmStandardIncludes.h" class cmCustomCommand; class cmGlobalGenerator; class cmLocalGenerator; class cmMakefile; class cmSourceFile; class cmTarget; class cmComputeLinkInformation; class cmGeneratorTarget { public: cmGeneratorTarget(cmTarget*, cmLocalGenerator* lg); ~cmGeneratorTarget(); cmLocalGenerator* GetLocalGenerator() const; bool IsImported() const; const char *GetLocation(const std::string& config) const; /** Get the location of the target in the build tree with a placeholder referencing the configuration in the native build system. This location is suitable for use as the LOCATION target property. */ const char* GetLocationForBuild() const; cmComputeLinkInformation* GetLinkInformation(const std::string& config) const; int GetType() const; std::string GetName() const; const char *GetProperty(const std::string& prop) const; bool GetPropertyAsBool(const std::string& prop) const; void GetSourceFiles(std::vector& files, const std::string& config) const; void GetObjectSources(std::vector &, const std::string& config) const; const std::string& GetObjectName(cmSourceFile const* file); bool HasExplicitObjectName(cmSourceFile const* file) const; void AddExplicitObjectName(cmSourceFile const* sf); void GetResxSources(std::vector&, const std::string& config) const; void GetIDLSources(std::vector&, const std::string& config) const; void GetExternalObjects(std::vector&, const std::string& config) const; void GetHeaderSources(std::vector&, const std::string& config) const; void GetExtraSources(std::vector&, const std::string& config) const; void GetCustomCommands(std::vector&, const std::string& config) const; void GetExpectedResxHeaders(std::set&, const std::string& config) const; void GetAppManifest(std::vector&, const std::string& config) const; void GetCertificates(std::vector&, const std::string& config) const; void GetXamlSources(std::vector&, const std::string& config) const; void GetExpectedXamlHeaders(std::set&, const std::string& config) const; void GetExpectedXamlSources(std::set&, const std::string& config) const; void ComputeObjectMapping(); const char* GetFeature(const std::string& feature, const std::string& config) const; bool GetFeatureAsBool(const std::string& feature, const std::string& config) const; bool IsLinkInterfaceDependentBoolProperty(const std::string &p, const std::string& config) const; bool IsLinkInterfaceDependentStringProperty(const std::string &p, const std::string& config) const; bool IsLinkInterfaceDependentNumberMinProperty(const std::string &p, const std::string& config) const; bool IsLinkInterfaceDependentNumberMaxProperty(const std::string &p, const std::string& config) const; bool GetLinkInterfaceDependentBoolProperty(const std::string &p, const std::string& config) const; const char *GetLinkInterfaceDependentStringProperty(const std::string &p, const std::string& config) const; const char *GetLinkInterfaceDependentNumberMinProperty(const std::string &p, const std::string& config) const; const char *GetLinkInterfaceDependentNumberMaxProperty(const std::string &p, const std::string& config) const; /** Get the full path to the target according to the settings in its makefile and the configuration type. */ std::string GetFullPath(const std::string& config="", bool implib = false, bool realname = false) const; std::string NormalGetFullPath(const std::string& config, bool implib, bool realname) const; std::string NormalGetRealName(const std::string& config) const; /** Get the soname of the target. Allowed only for a shared library. */ std::string GetSOName(const std::string& config) const; cmTarget* Target; cmMakefile* Makefile; cmLocalGenerator* LocalGenerator; cmGlobalGenerator const* GlobalGenerator; std::string GetModuleDefinitionFile(const std::string& config) const; /** Full path with trailing slash to the top-level directory holding object files for this target. Includes the build time config name placeholder if needed for the generator. */ std::string ObjectDirectory; void UseObjectLibraries(std::vector& objs, const std::string& config) const; void GetAppleArchs(const std::string& config, std::vector& archVec) const; /** Return the rule variable used to create this type of target. */ std::string GetCreateRuleVariable(std::string const& lang, std::string const& config) const; /** Get the include directories for this target. */ std::vector GetIncludeDirectories( const std::string& config, const std::string& lang) const; bool IsSystemIncludeDirectory(const std::string& dir, const std::string& config) const; /** Add the target output files to the global generator manifest. */ void GenerateTargetManifest(const std::string& config) const; /** * Trace through the source files in this target and add al source files * that they depend on, used by all generators */ void TraceDependencies(); /** Get sources that must be built before the given source. */ std::vector const* GetSourceDepends(cmSourceFile const* sf) const; /** * Flags for a given source file as used in this target. Typically assigned * via SET_TARGET_PROPERTIES when the property is a list of source files. */ enum SourceFileType { SourceFileTypeNormal, SourceFileTypePrivateHeader, // is in "PRIVATE_HEADER" target property SourceFileTypePublicHeader, // is in "PUBLIC_HEADER" target property SourceFileTypeResource, // is in "RESOURCE" target property *or* // has MACOSX_PACKAGE_LOCATION=="Resources" SourceFileTypeMacContent // has MACOSX_PACKAGE_LOCATION!="Resources" }; struct SourceFileFlags { SourceFileFlags(): Type(SourceFileTypeNormal), MacFolder(0) {} SourceFileFlags(SourceFileFlags const& r): Type(r.Type), MacFolder(r.MacFolder) {} SourceFileType Type; const char* MacFolder; // location inside Mac content folders }; void GetAutoUicOptions(std::vector &result, const std::string& config) const; /** Get the names of the executable needed to generate a build rule that takes into account executable version numbers. This should be called only on an executable target. */ void GetExecutableNames(std::string& name, std::string& realName, std::string& impName, std::string& pdbName, const std::string& config) const; struct SourceFileFlags GetTargetSourceFileFlags(const cmSourceFile* sf) const; struct ResxData { mutable std::set ExpectedResxHeaders; mutable std::vector ResxSources; }; struct XamlData { std::set ExpectedXamlHeaders; std::set ExpectedXamlSources; std::vector XamlSources; }; void ReportPropertyOrigin(const std::string &p, const std::string &result, const std::string &report, const std::string &compatibilityType) const; private: friend class cmTargetTraceDependencies; struct SourceEntry { std::vector Depends; }; typedef std::map SourceEntriesType; SourceEntriesType SourceEntries; mutable std::map Objects; std::set ExplicitObjectName; mutable std::map > SystemIncludesCache; void ConstructSourceFileFlags() const; mutable bool SourceFileFlagsConstructed; mutable std::map SourceFlagsMap; mutable std::map DebugCompatiblePropertiesDone; struct CompatibleInterfacesBase { std::set PropsBool; std::set PropsString; std::set PropsNumberMax; std::set PropsNumberMin; }; CompatibleInterfacesBase const& GetCompatibleInterfaces(std::string const& config) const; struct CompatibleInterfaces: public CompatibleInterfacesBase { CompatibleInterfaces(): Done(false) {} bool Done; }; mutable std::map CompatibleInterfacesMap; typedef std::map cmTargetLinkInformationMap; mutable cmTargetLinkInformationMap LinkInformation; void CheckPropertyCompatibility(cmComputeLinkInformation *info, const std::string& config) const; cmGeneratorTarget(cmGeneratorTarget const&); void operator=(cmGeneratorTarget const&); struct LinkImplClosure: public std::vector { LinkImplClosure(): Done(false) {} bool Done; }; mutable std::map LinkImplClosureMap; public: std::vector const& GetLinkImplementationClosure(const std::string& config) const; }; struct cmStrictTargetComparison { bool operator()(cmTarget const* t1, cmTarget const* t2) const; }; typedef std::map cmGeneratorTargetsType; #endif