1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191
|
/* 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)$"
|