4#include "../Common/CompilerMacrosExport.h"
5#ifndef SC_EXPORT_LIBRARY_PLUGIN
6#define SC_EXPORT_LIBRARY_PLUGIN 0
8#define SC_PLUGIN_LIBRARY_EXPORT SC_COMPILER_LIBRARY_EXPORT(SC_EXPORT_LIBRARY_PLUGIN)
10#include "../Common/Assert.h"
11#include "../Common/Function.h"
12#include "../Common/IGrowableBufferStringPath.h"
13#include "../Common/PlatformMacrosType.h"
14#include "../Common/PrimitiveDefinitions.h"
15#include "Internal/DynamicLibrary.h"
18SC_DECLARE_ASSERT_PROVIDER(PluginAssert, SC_PLUGIN_LIBRARY_EXPORT);
20#define SC_PLUGIN_ASSERT_RELEASE(e) SC_ASSERT_PROVIDER_RELEASE(SC::PluginAssert, e)
21#define SC_PLUGIN_ASSERT_DEBUG(e) SC_ASSERT_PROVIDER_DEBUG(SC::PluginAssert, e)
22#define SC_PLUGIN_TRUST_RESULT(expression) SC_PLUGIN_ASSERT_RELEASE(expression)
24struct PluginDefinition;
28struct PluginDynamicLibrary;
30struct PluginCompilerEnvironment;
34using FixedString = detail::StringNativeFixed<N>;
35using PluginIdentifier = FixedString<64>;
36using PluginBuildOption = FixedString<32>;
38template <
typename T,
size_t N>
41 constexpr size_t size()
const {
return numValues; }
42 constexpr void clear() { numValues = 0; }
44 operator Span<const T>()
const {
return {values, numValues}; }
47 [[nodiscard]]
constexpr bool contains(
const U& value,
size_t* outIndex =
nullptr)
const
49 for (
size_t idx = 0; idx < numValues; ++idx)
51 if (values[idx] == value)
61 [[nodiscard]]
constexpr bool isEmpty()
const {
return numValues == 0; }
63 [[nodiscard]]
constexpr bool push_back(
const T& value)
67 values[numValues++] = value;
73 constexpr T* begin() {
return values; }
74 constexpr T* end() {
return values + numValues; }
75 constexpr T& operator[](
size_t idx) {
return values[idx]; }
76 constexpr const T* begin()
const {
return values; }
77 constexpr const T* end()
const {
return values + numValues; }
78 constexpr const T& operator[](
size_t idx)
const {
return values[idx]; }
158 size_t pluginFileIndex = 0;
171 template <
typename T>
173 T& tempFileBuffer, Span<PluginDefinition>& foundDefinitions)
175 return scanDirectory(directory, definitionsStorage, GrowableBuffer<T>{tempFileBuffer}, foundDefinitions);
180 IGrowableBuffer&& tempFileBuffer, Span<PluginDefinition>& foundDefinitions);
228 mutable native_char_t buffer[4096];
232 StringView objectFile, Span<char>& compilerLog)
const;
233 struct CompilerFinder;
275 template <
typename T>
278 if (pluginQueryInterface and instance !=
nullptr)
280 return pluginQueryInterface(instance, T::InterfaceHash,
reinterpret_cast<void**
>(&outInterface));
288 void* instance =
nullptr;
289 bool (*pluginInit)(
void*& instance) =
nullptr;
290 bool (*pluginClose)(
void* instance) =
nullptr;
292 bool (*pluginQueryInterface)(
void* instance, uint32_t hash,
void** instanceInterface) =
nullptr;
296 Result unload(
bool releaseDebuggerFiles);
303 void init(Span<PluginDynamicLibrary> librariesStorage);
351 return libraries[index].definition.identity.identifier;
362 Function<
void(
const PluginIdentifier&)> onPlugin);
367 Span<PluginDynamicLibrary> storage;
368 Span<PluginDynamicLibrary> libraries;
Reads and holds CFLAGS and LDFLAGS environment variables, mainly to pass down sysroot location.
Definition Plugin.h:253
Compiles a plugin to a dynamic library.
Definition Plugin.h:186
StringPath linkerPath
Path to the linker.
Definition Plugin.h:215
Result link(const PluginDefinition &definition, const PluginSysroot &sysroot, const PluginCompilerEnvironment &environment, StringView executablePath, Span< char > &linkerLog) const
Links a Definition into a dynamic library, with symbols from executablePath
FixedVector< StringPath, 8 > includePaths
Path to include directories used to compile plugin.
Definition Plugin.h:217
Type type
Compile Type.
Definition Plugin.h:213
FixedVector< StringPath, 8 > compilerLibraryPaths
Path to compiler library directories.
Definition Plugin.h:220
Type
Compiler type (clang/gcc/msvc)
Definition Plugin.h:208
static Result findBestCompiler(PluginCompiler &compiler)
Look for best compiler on current system.
FixedVector< StringPath, 8 > compilerIncludePaths
Path to compiler include directories.
Definition Plugin.h:219
Result compile(const PluginDefinition &definition, const PluginSysroot &sysroot, const PluginCompilerEnvironment &environment, Span< char > &compilerLog) const
Compiles a Definition to an object file.
StringPath compilerPath
Path to the compiler.
Definition Plugin.h:214
Plugin description, category, dependencies, files and directory location.
Definition Plugin.h:114
StringPath directory
Path to the directory holding the plugin.
Definition Plugin.h:119
FixedVector< PluginFile, 10 > files
Source files that compose this plugin.
Definition Plugin.h:123
PluginIdentity identity
Uniquely identifier a plugin.
Definition Plugin.h:115
static bool find(const StringView text, StringView &extracted)
Extracts the plugin definition (SC_BEGIN_PLUGIN / SC_END_PLUGIN) comment from a .cpp file.
FixedString< 256 > description
Long description of plugin.
Definition Plugin.h:117
const PluginFile & getMainPluginFile() const
Get main plugin file, holding plugin definition.
Definition Plugin.h:131
FixedVector< PluginIdentifier, 8 > dependencies
Dependencies necessary to load this plugin.
Definition Plugin.h:121
static bool parse(StringView text, PluginDefinition &pluginDefinition)
Parses an extracted plugin definition text.
Result getDynamicLibraryAbsolutePath(StringPath &fullDynamicPath) const
Gets absolute path of where compiled dynamic library will exist after plugin is compiled.
FixedString< 64 > category
Category where plugin belongs to.
Definition Plugin.h:118
Result getDynamicLibraryPDBAbsolutePath(StringPath &fullDynamicPath) const
Gets absolute path of where compiled Program Database File will exist after plugin is compiled.
PluginFile & getMainPluginFile()
Get main plugin file, holding plugin definition.
Definition Plugin.h:127
FixedVector< PluginBuildOption, 8 > build
Build options.
Definition Plugin.h:122
A plugin dynamic library loaded from a SC::PluginRegistry.
Definition Plugin.h:263
SystemDynamicLibrary dynamicLibrary
System handle of plugin's dynamic library.
Definition Plugin.h:265
TimeMs lastLoadTime
Last time when this plugin was last loaded.
Definition Plugin.h:266
PluginDefinition definition
Definition of the loaded plugin.
Definition Plugin.h:264
StringView lastErrorLog
Last error log of compiler / linker (if any)
Definition Plugin.h:270
uint32_t numReloads
Number of times that the plugin has been hot-reloaded.
Definition Plugin.h:267
bool queryInterface(T *&outInterface) const
Try to obtain a given interface as exported by a plugin through SC_PLUGIN_EXPORT_INTERFACES macro.
Definition Plugin.h:276
char errorStorage[1024 *8]
Storage for last error log (below)
Definition Plugin.h:269
Holds path to a given plugin source file.
Definition Plugin.h:95
StringPath absolutePath
Absolute path to a plugin source file.
Definition Plugin.h:96
Represents the unique signature / identity of a Plugin.
Definition Plugin.h:101
bool operator==(const PluginIdentity &other) const
Compares two plugins on Identity::identifier.
Definition Plugin.h:109
PluginIdentifier identifier
Unique string identifying the plugin.
Definition Plugin.h:102
FixedString< 64 > name
Plugin name.
Definition Plugin.h:103
FixedString< 16 > version
Plugin version (x.y.z)
Definition Plugin.h:104
Holds a registry of plugins, loading and compiling them on the fly.
Definition Plugin.h:301
void getPluginsToReloadBecauseOf(StringView relativePath, TimeMs tolerance, Function< void(const PluginIdentifier &)> onPlugin)
Enumerates all plugins that must be reloaded when relativePath is modified.
LoadMode
Instructs loadPlugin to Load or Reload the plugin.
Definition Plugin.h:315
void init(Span< PluginDynamicLibrary > librariesStorage)
Init a PluginRegistry with some given storage.
Result unloadPlugin(const StringView identifier)
Unloads an already loaded plugin by its identifier.
Result loadPlugin(const StringView identifier, const PluginCompiler &compiler, const PluginSysroot &sysroot, StringView executablePath, LoadMode loadMode=LoadMode::Load)
Loads a plugin with given identifier, compiling it with given PluginCompiler.
size_t getNumberOfEntries() const
Returns the total number of registry entries (counting both loaded and unloaded plugins)
Definition Plugin.h:346
Result removeAllBuildProducts(const StringView identifier)
Removes all temporary build products of the Plugin with given identifier.
const PluginDynamicLibrary & getPluginDynamicLibraryAt(size_t index)
Returns the PluginIdentifier corresponding to the index entry of the registry.
Definition Plugin.h:355
Result close()
Unregisters all plugins.
const PluginIdentifier & getIdentifierAt(size_t index) const
Returns the PluginIdentifier corresponding to the index entry of the registry.
Definition Plugin.h:349
Result replaceDefinitions(Span< PluginDefinition > &&definitions)
Appends the definitions to registry.
PluginDynamicLibrary * findPlugin(const StringView identifier)
Find a PluginDynamicLibrary in the registry with a given identifier.
Scans a directory for PluginDefinition.
Definition Plugin.h:164
static Result scanDirectory(const StringView directory, Span< PluginDefinition > definitionsStorage, T &tempFileBuffer, Span< PluginDefinition > &foundDefinitions)
Scans a directory for PluginDefinition.
Definition Plugin.h:172
Holds include and library paths for a system toolchain, used to let plugins link to libc and libc++.
Definition Plugin.h:238
FixedVector< StringPath, 8 > includePaths
Path to system include directories.
Definition Plugin.h:239
StringPath isysroot
Path to sysroot include (optional)
Definition Plugin.h:242
static Result findBestSysroot(PluginCompiler::Type compiler, PluginSysroot &sysroot)
Finds a reasonable sysroot for the given compiler.
FixedVector< StringPath, 8 > libraryPaths
Path to system library directories.
Definition Plugin.h:240
A string iterator for ASCII strings.
Definition StringIterator.h:239
Non-owning view over a range of characters with UTF Encoding.
Definition StringView.h:49