
#pragma once is a widely supported compiler pragma, even though it is not part of the C++ standard. Many of the issues keeping #pragma once from being standardized (distributed filesystems, build farms, hard links, etc.) do not apply to CMake - it is easy to build CMake on a single machine. CMake also does not install any header files which can be consumed by other projects (though cmCPluginAPI.h has been deliberately omitted from this conversion in case anyone is still using it.) Finally, #pragma once has been required to build CMake since at least August 2017 (7f29bbe6
enabled server mode unconditionally, which had been using #pragma once since September 2016 (b13d3e0d
)). The fact that we now require C++11 filters out old compilers, and it is unlikely that there is a compiler which supports C++11 but does not support #pragma once.
97 lines
3.0 KiB
C++
97 lines
3.0 KiB
C++
/* 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 <string>
|
|
#include <vector>
|
|
|
|
#include <cm/memory>
|
|
|
|
class cmGlobalGenerator;
|
|
class cmake;
|
|
struct cmDocumentationEntry;
|
|
|
|
/** \class cmGlobalGeneratorFactory
|
|
* \brief Responable for creating cmGlobalGenerator instances
|
|
*
|
|
* Subclasses of this class generate instances of cmGlobalGenerator.
|
|
*/
|
|
class cmGlobalGeneratorFactory
|
|
{
|
|
public:
|
|
virtual ~cmGlobalGeneratorFactory() = default;
|
|
|
|
/** Create a GlobalGenerator */
|
|
virtual std::unique_ptr<cmGlobalGenerator> CreateGlobalGenerator(
|
|
const std::string& n, cmake* cm) const = 0;
|
|
|
|
/** Get the documentation entry for this factory */
|
|
virtual void GetDocumentation(cmDocumentationEntry& entry) const = 0;
|
|
|
|
/** Get the names of the current registered generators */
|
|
virtual std::vector<std::string> GetGeneratorNames() const = 0;
|
|
virtual std::vector<std::string> GetGeneratorNamesWithPlatform() const = 0;
|
|
|
|
/** Determine whether or not this generator supports toolsets */
|
|
virtual bool SupportsToolset() const = 0;
|
|
|
|
/** Determine whether or not this generator supports platforms */
|
|
virtual bool SupportsPlatform() const = 0;
|
|
|
|
/** Get the list of supported platforms name for this generator */
|
|
virtual std::vector<std::string> GetKnownPlatforms() const = 0;
|
|
|
|
/** If the generator supports platforms, get its default. */
|
|
virtual std::string GetDefaultPlatformName() const = 0;
|
|
};
|
|
|
|
template <class T>
|
|
class cmGlobalGeneratorSimpleFactory : public cmGlobalGeneratorFactory
|
|
{
|
|
public:
|
|
/** Create a GlobalGenerator */
|
|
std::unique_ptr<cmGlobalGenerator> CreateGlobalGenerator(
|
|
const std::string& name, cmake* cm) const override
|
|
{
|
|
if (name != T::GetActualName()) {
|
|
return std::unique_ptr<cmGlobalGenerator>();
|
|
}
|
|
return std::unique_ptr<cmGlobalGenerator>(cm::make_unique<T>(cm));
|
|
}
|
|
|
|
/** Get the documentation entry for this factory */
|
|
void GetDocumentation(cmDocumentationEntry& entry) const override
|
|
{
|
|
T::GetDocumentation(entry);
|
|
}
|
|
|
|
/** Get the names of the current registered generators */
|
|
std::vector<std::string> GetGeneratorNames() const override
|
|
{
|
|
std::vector<std::string> names;
|
|
names.push_back(T::GetActualName());
|
|
return names;
|
|
}
|
|
std::vector<std::string> GetGeneratorNamesWithPlatform() const override
|
|
{
|
|
return std::vector<std::string>();
|
|
}
|
|
|
|
/** Determine whether or not this generator supports toolsets */
|
|
bool SupportsToolset() const override { return T::SupportsToolset(); }
|
|
|
|
/** Determine whether or not this generator supports platforms */
|
|
bool SupportsPlatform() const override { return T::SupportsPlatform(); }
|
|
|
|
/** Get the list of supported platforms name for this generator */
|
|
std::vector<std::string> GetKnownPlatforms() const override
|
|
{
|
|
// default is no platform supported
|
|
return std::vector<std::string>();
|
|
}
|
|
|
|
std::string GetDefaultPlatformName() const override { return std::string(); }
|
|
};
|