| /* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying | 
 |    file Copyright.txt or https://cmake.org/licensing for details.  */ | 
 | #pragma once | 
 |  | 
 | #include "cmConfigure.h" // IWYU pragma: keep | 
 |  | 
 | #include <memory> | 
 | #include <string> | 
 | #include <vector> | 
 |  | 
 | #include "cmCustomCommand.h" | 
 | #include "cmListFileCache.h" | 
 | #include "cmPropertyMap.h" | 
 | #include "cmSourceFileLocation.h" | 
 | #include "cmSourceFileLocationKind.h" | 
 | #include "cmValue.h" | 
 |  | 
 | class cmMakefile; | 
 |  | 
 | /** \class cmSourceFile | 
 |  * \brief Represent a class loaded from a makefile. | 
 |  * | 
 |  * cmSourceFile represents a class loaded from a makefile. | 
 |  */ | 
 | class cmSourceFile | 
 | { | 
 | public: | 
 |   /** | 
 |    * Construct with the makefile storing the source and the initial name | 
 |    * referencing it. If it shall be marked as generated, this source file's | 
 |    * kind is assumed to be known, regardless of the given value. | 
 |    */ | 
 |   cmSourceFile( | 
 |     cmMakefile* mf, const std::string& name, bool generated, | 
 |     cmSourceFileLocationKind kind = cmSourceFileLocationKind::Ambiguous); | 
 |  | 
 |   /** | 
 |    * Get the custom command for this source file | 
 |    */ | 
 |   cmCustomCommand* GetCustomCommand() const; | 
 |   void SetCustomCommand(std::unique_ptr<cmCustomCommand> cc); | 
 |  | 
 |   //! Set/Get a property of this source file | 
 |   void SetProperty(const std::string& prop, cmValue value); | 
 |   void RemoveProperty(const std::string& prop) | 
 |   { | 
 |     this->SetProperty(prop, cmValue{ nullptr }); | 
 |   } | 
 |   void SetProperty(const std::string& prop, const std::string& value) | 
 |   { | 
 |     this->SetProperty(prop, cmValue(value)); | 
 |   } | 
 |   void AppendProperty(const std::string& prop, const std::string& value, | 
 |                       bool asString = false); | 
 |   //! Might return a nullptr if the property is not set or invalid | 
 |   cmValue GetProperty(const std::string& prop) const; | 
 |   //! Always returns a valid pointer | 
 |   const std::string& GetSafeProperty(const std::string& prop) const; | 
 |   bool GetPropertyAsBool(const std::string& prop) const; | 
 |  | 
 |   /** Implement getting a property when called from a CMake language | 
 |       command like get_property or get_source_file_property.  */ | 
 |   cmValue GetPropertyForUser(const std::string& prop); | 
 |  | 
 |   /// Marks this file as generated | 
 |   /** | 
 |    * This stores this file's path in the global table for all generated source | 
 |    * files. | 
 |    */ | 
 |   void MarkAsGenerated(); | 
 |   enum class CheckScope | 
 |   { | 
 |     Global, | 
 |     GlobalAndLocal | 
 |   }; | 
 |   /// Determines if this source file is marked as generated. | 
 |   /** | 
 |    * This will check if this file's path is stored in the global table of all | 
 |    * generated source files. If that is not the case and checkScope is set to | 
 |    * GlobalAndLocal the value of the possibly existing local GENERATED property | 
 |    * is returned instead. | 
 |    * @param checkScope Determines if alternatively for backwards-compatibility | 
 |    * a local GENERATED property should be considered, too. | 
 |    * @return true if this source file is marked as generated, otherwise false. | 
 |    */ | 
 |   bool GetIsGenerated( | 
 |     CheckScope checkScope = CheckScope::GlobalAndLocal) const; | 
 |  | 
 |   const std::vector<BT<std::string>>& GetCompileOptions() const | 
 |   { | 
 |     return this->CompileOptions; | 
 |   } | 
 |  | 
 |   const std::vector<BT<std::string>>& GetCompileDefinitions() const | 
 |   { | 
 |     return this->CompileDefinitions; | 
 |   } | 
 |  | 
 |   const std::vector<BT<std::string>>& GetIncludeDirectories() const | 
 |   { | 
 |     return this->IncludeDirectories; | 
 |   } | 
 |  | 
 |   /** | 
 |    * Resolves the full path to the file.  Attempts to locate the file on disk | 
 |    * and finalizes its location. | 
 |    */ | 
 |   std::string const& ResolveFullPath(std::string* error = nullptr, | 
 |                                      std::string* cmp0115Warning = nullptr); | 
 |  | 
 |   /** | 
 |    * The resolved full path to the file.  The returned file name might be empty | 
 |    * if the path has not yet been resolved. | 
 |    */ | 
 |   std::string const& GetFullPath() const; | 
 |  | 
 |   /** | 
 |    * Get the information currently known about the source file | 
 |    * location without attempting to locate the file as GetFullPath | 
 |    * would.  See cmSourceFileLocation documentation. | 
 |    */ | 
 |   cmSourceFileLocation const& GetLocation() const; | 
 |  | 
 |   /** | 
 |    * Get the file extension of this source file. | 
 |    */ | 
 |   std::string const& GetExtension() const; | 
 |  | 
 |   /** | 
 |    * Get the language of the compiler to use for this source file. | 
 |    */ | 
 |   std::string const& GetOrDetermineLanguage(); | 
 |   std::string GetLanguage() const; | 
 |  | 
 |   /** | 
 |    * Return the vector that holds the list of dependencies | 
 |    */ | 
 |   const std::vector<std::string>& GetDepends() const { return this->Depends; } | 
 |   void AddDepend(const std::string& d) { this->Depends.push_back(d); } | 
 |  | 
 |   // Get the properties | 
 |   const cmPropertyMap& GetProperties() const { return this->Properties; } | 
 |   // Set the properties | 
 |   void SetProperties(cmPropertyMap properties); | 
 |  | 
 |   /** | 
 |    * Check whether the given source file location could refer to this | 
 |    * source. | 
 |    */ | 
 |   bool Matches(cmSourceFileLocation const&); | 
 |  | 
 |   void SetObjectLibrary(std::string const& objlib); | 
 |   std::string GetObjectLibrary() const; | 
 |  | 
 | private: | 
 |   cmSourceFileLocation Location; | 
 |   cmPropertyMap Properties; | 
 |   std::unique_ptr<cmCustomCommand> CustomCommand; | 
 |   std::string Extension; | 
 |   std::string Language; | 
 |   std::string FullPath; | 
 |   std::string ObjectLibrary; | 
 |   std::vector<std::string> Depends; | 
 |   std::vector<BT<std::string>> CompileOptions; | 
 |   std::vector<BT<std::string>> CompileDefinitions; | 
 |   std::vector<BT<std::string>> IncludeDirectories; | 
 |   bool FindFullPathFailed = false; | 
 |   bool IsGenerated = false; | 
 |  | 
 |   bool FindFullPath(std::string* error, std::string* cmp0115Warning); | 
 |   void CheckExtension(); | 
 |   void CheckLanguage(std::string const& ext); | 
 |  | 
 |   static const std::string propLANGUAGE; | 
 |   static const std::string propLOCATION; | 
 |   static const std::string propGENERATED; | 
 |   static const std::string propCOMPILE_DEFINITIONS; | 
 |   static const std::string propCOMPILE_OPTIONS; | 
 |   static const std::string propINCLUDE_DIRECTORIES; | 
 | }; | 
 |  | 
 | // TODO: Factor out into platform information modules. | 
 | #define CM_HEADER_REGEX "\\.(h|hh|h\\+\\+|hm|hpp|hxx|in|txx|inl)$" | 
 |  | 
 | #define CM_SOURCE_REGEX                                                       \ | 
 |   "\\.(C|F|M|c|c\\+\\+|cc|cpp|mpp|cxx|ixx|cppm|ccm|cxxm|c\\+\\+m|cu"          \ | 
 |   "|f|f90|for|fpp|ftn|m|mm|rc|def|r|odl|idl|hpj|bat)$" | 
 |  | 
 | #define CM_PCH_REGEX "cmake_pch(_[^.]+)?\\.(h|hxx)$" | 
 |  | 
 | #define CM_RESOURCE_REGEX "\\.(pdf|plist|png|jpeg|jpg|storyboard|xcassets)$" |