|
1 |
| -#ifndef PROJECT_CONFIG_HPP |
2 |
| -#define PROJECT_CONFIG_HPP |
| 1 | +#ifndef ${THIS_PROJECT_NAME}_CONFIG_HPP |
| 2 | +#define ${THIS_PROJECT_NAME}_CONFIG_HPP |
3 | 3 | #include <string_view>
|
4 | 4 |
|
5 |
| -namespace @THIS_PROJECT_NAME@ { |
| 5 | +/// See ${THIS_PROJECT_NAME}::sys::Os for possible values of ${PROJECT_NAME_CAPS}_SYSTEM_IS_* |
| 6 | +#define ${PROJECT_NAME_CAPS}_SYSTEM_${SYSTEM_NAME_SANITISED} |
| 7 | +#define ${PROJECT_NAME_CAPS}_SYSTEM_VERSION "${CMAKE_SYSTEM_VERSION}" |
| 8 | + |
| 9 | +#if defined(${PROJECT_NAME_CAPS}_SYSTEM_AIX) \ |
| 10 | + || defined(${PROJECT_NAME_CAPS}_SYSTEM_Android) || defined(${PROJECT_NAME_CAPS}_SYSTEM_BSDOS) \ |
| 11 | + || defined(${PROJECT_NAME_CAPS}_SYSTEM_CrayLinuxEnvironment)|| defined(${PROJECT_NAME_CAPS}_SYSTEM_CYGWIN) \ |
| 12 | + || defined(${PROJECT_NAME_CAPS}_SYSTEM_Darwin) || defined(${PROJECT_NAME_CAPS}_SYSTEM_DragonFly) \ |
| 13 | + || defined(${PROJECT_NAME_CAPS}_SYSTEM_FreeBSD) || defined(${PROJECT_NAME_CAPS}_SYSTEM_GNU) \ |
| 14 | + || defined(${PROJECT_NAME_CAPS}_SYSTEM_Haiku) || defined(${PROJECT_NAME_CAPS}_SYSTEM_HP_UX) \ |
| 15 | + || defined(${PROJECT_NAME_CAPS}_SYSTEM_iOS) || defined(${PROJECT_NAME_CAPS}_SYSTEM_kFreeBSD) \ |
| 16 | + || defined(${PROJECT_NAME_CAPS}_SYSTEM_Linux) || defined(${PROJECT_NAME_CAPS}_SYSTEM_Midipix) \ |
| 17 | + || defined(${PROJECT_NAME_CAPS}_SYSTEM_MirBSD) || defined(${PROJECT_NAME_CAPS}_SYSTEM_MP_RAS) \ |
| 18 | + || defined(${PROJECT_NAME_CAPS}_SYSTEM_MSYS) || defined(${PROJECT_NAME_CAPS}_SYSTEM_NetBSD) \ |
| 19 | + || defined(${PROJECT_NAME_CAPS}_SYSTEM_OpenBSD) || defined(${PROJECT_NAME_CAPS}_SYSTEM_OSF1) \ |
| 20 | + || defined(${PROJECT_NAME_CAPS}_SYSTEM_QNX) || defined(${PROJECT_NAME_CAPS}_SYSTEM_SerenityOS) \ |
| 21 | + || defined(${PROJECT_NAME_CAPS}_SYSTEM_SINIX) || defined(${PROJECT_NAME_CAPS}_SYSTEM_SunOS) \ |
| 22 | + || defined(${PROJECT_NAME_CAPS}_SYSTEM_Tru64) || defined(${PROJECT_NAME_CAPS}_SYSTEM_tvOS) \ |
| 23 | + || defined(${PROJECT_NAME_CAPS}_SYSTEM_ULTRIX) || defined(${PROJECT_NAME_CAPS}_SYSTEM_UNIX_SV) \ |
| 24 | + || defined(${PROJECT_NAME_CAPS}_SYSTEM_UnixWare) || defined(${PROJECT_NAME_CAPS}_SYSTEM_visionOS) \ |
| 25 | + || defined(${PROJECT_NAME_CAPS}_SYSTEM_watchOS) || defined(${PROJECT_NAME_CAPS}_SYSTEM_Xenix) |
| 26 | +# define ${PROJECT_NAME_CAPS}_SYSTEM_IS_UNIX 1 |
| 27 | +#else |
| 28 | +# define ${PROJECT_NAME_CAPS}_SYSTEM_IS_UNIX 0 |
| 29 | +#endif |
| 30 | + |
| 31 | +/*! See ${THIS_PROJECT_NAME}::sys::Compiler for possible values of ${PROJECT_NAME_CAPS}_COMPILER_IS_* |
| 32 | + * |
| 33 | + * NOTE: This value is derived from the global cmake cxx compiler setting, if different parts of |
| 34 | + * the project are compiler with different compilers, this will not be reflected here. |
| 35 | + */ |
| 36 | +#define ${PROJECT_NAME_CAPS}_COMPILER_${CMAKE_CXX_COMPILER_ID} |
| 37 | +#define ${PROJECT_NAME_CAPS}_COMPILER_VERSION "${CMAKE_CXX_COMPILER_VERSION}" |
| 38 | +#define ${PROJECT_NAME_CAPS}_COMPILER_VERSION_MAJOR ${COMPILER_VERSION_MAJOR} |
| 39 | +#define ${PROJECT_NAME_CAPS}_COMPILER_VERSION_MINOR ${COMPILER_VERSION_MINOR} |
| 40 | +#define ${PROJECT_NAME_CAPS}_COMPILER_VERSION_PATCH ${COMPILER_VERSION_PATCH} |
| 41 | +#define ${PROJECT_NAME_CAPS}_COMPILER_VERSION_TWEAK ${COMPILER_VERSION_TWEAK} |
| 42 | + |
| 43 | +#if defined(${PROJECT_NAME_CAPS}_COMPILER_AppleClang) \ |
| 44 | + || defined(${PROJECT_NAME_CAPS}_COMPILER_ARMClang) || defined(${PROJECT_NAME_CAPS}_COMPILER_Clang) \ |
| 45 | + || defined(${PROJECT_NAME_CAPS}_COMPILER_CrayClang) || defined(${PROJECT_NAME_CAPS}_COMPILER_FujitsuClang) \ |
| 46 | + || defined(${PROJECT_NAME_CAPS}_COMPILER_XLClang) || defined(${PROJECT_NAME_CAPS}_COMPILER_IBMClang) |
| 47 | + |
| 48 | +# define ${PROJECT_NAME_CAPS}_COMPILER_IS_CLANG_LIKE 1 |
| 49 | +#else |
| 50 | + |
| 51 | +# define ${PROJECT_NAME_CAPS}_COMPILER_IS_CLANG_LIKE 0 |
| 52 | + |
| 53 | +#endif |
| 54 | + |
| 55 | +#if ${PROJECT_NAME_CAPS}_COMPILER_IS_CLANG_LIKE || defined(${PROJECT_NAME_CAPS}_COMPILER_GNU) |
| 56 | +# define ${PROJECT_NAME_CAPS}_COMPILER_IS_GNU_LIKE 1 |
| 57 | +#else |
| 58 | +# define ${PROJECT_NAME_CAPS}_COMPILER_IS_GNU_LIKE 0 |
| 59 | +#endif |
| 60 | + |
| 61 | +#if defined(${PROJECT_NAME_CAPS}_COMPILER_Intel) || defined(${PROJECT_NAME_CAPS}_COMPILER_IntelLLVM) |
| 62 | +# define ${PROJECT_NAME_CAPS}_COMPILER_IS_ICC_LIKE 1 |
| 63 | +#else |
| 64 | +# define ${PROJECT_NAME_CAPS}_COMPILER_IS_ICC_LIKE 0 |
| 65 | +#endif |
| 66 | + |
| 67 | +#if __cplusplus >= 202302L |
| 68 | +# define ${PROJECT_NAME_CAPS}_HAS_STD_CXX23 1 |
| 69 | +# define ${PROJECT_NAME_CAPS}_STD_CXX23 |
| 70 | +#elif __cplusplus >= 202002L |
| 71 | +# define ${PROJECT_NAME_CAPS}_HAS_STD_CXX23 0 |
| 72 | +# define ${PROJECT_NAME_CAPS}_HAS_STD_CXX20 1 |
| 73 | +# define ${PROJECT_NAME_CAPS}_STD_CXX20 |
| 74 | +#elif __cplusplus >= 201703L |
| 75 | +# define ${PROJECT_NAME_CAPS}_HAS_STD_CXX23 0 |
| 76 | +# define ${PROJECT_NAME_CAPS}_HAS_STD_CXX20 0 |
| 77 | +# define ${PROJECT_NAME_CAPS}_HAS_STD_CXX17 1 |
| 78 | +# define ${PROJECT_NAME_CAPS}_STD_CXX17 |
| 79 | +# define ${PROJECT_NAME_CAPS}_HAS_STD_CXX14 1 |
| 80 | +# define ${PROJECT_NAME_CAPS}_STD_CXX14 |
| 81 | +# define ${PROJECT_NAME_CAPS}_HAS_STD_CXX11 1 |
| 82 | +# define ${PROJECT_NAME_CAPS}_STD_CXX11 |
| 83 | +# define ${PROJECT_NAME_CAPS}_HAS_STD_CXX03 1 |
| 84 | +# define ${PROJECT_NAME_CAPS}_STD_CXX03 |
| 85 | +# define ${PROJECT_NAME_CAPS}_HAS_STD_CXX98 1 |
| 86 | +# define ${PROJECT_NAME_CAPS}_STD_CXX98 |
| 87 | +#else |
| 88 | +# error "C++17 is required to compile this project" |
| 89 | +#endif |
| 90 | + |
| 91 | +namespace ${THIS_PROJECT_NAME} { |
| 92 | + |
| 93 | +namespace sys { |
| 94 | + enum struct Os { |
| 95 | + ADSP, AIX, Android, ARTOS, BeOS, BlueGeneL, BlueGeneP_dynamic, |
| 96 | + BlueGeneP_static, BlueGeneQ_dynamic, BlueGeneQ_static, BSDOS, |
| 97 | + Catamount, CrayLinuxEnvironment, CYGWIN, Darwin, DOS, DragonFly, |
| 98 | + eCos, Emscripten, Euros, FreeBSD, Fuchsia, Generic_ADSP, Generic_ELF, |
| 99 | + Generic, GHS_MULTI, GNU, Haiku, HP_UX, iOS, kFreeBSD, Linux, Midipix, |
| 100 | + MirBSD, MP_RAS, MSYS, NetBSD, OpenBSD, OpenVMS, OS2, OSF1, QNX, |
| 101 | + RISCos, SCO_SV, SerenityOS, SINIX, SunOS, syllable, Tru64, tvOS, |
| 102 | + ULTRIX, UNIX_SV, UnixWare, visionOS, watchOS, Windows, WindowsCE, |
| 103 | + WindowsPhone, WindowsStore, Xenix |
| 104 | + }; |
| 105 | + |
| 106 | + inline constexpr auto os = Os::${SYSTEM_NAME_SANITISED}; |
| 107 | + inline constexpr std::string_view os_str = "${SYSTEM_NAME_SANITISED}"; |
| 108 | + inline constexpr auto is_unix = static_cast<bool>(${PROJECT_NAME_CAPS}_SYSTEM_IS_UNIX); |
| 109 | + inline constexpr std::string_view version = ${PROJECT_NAME_CAPS}_SYSTEM_VERSION; |
| 110 | +} // namespace sys |
| 111 | + |
| 112 | +namespace compiler { |
| 113 | + enum struct Vendor { |
| 114 | + ADSP, AppleClang, ARMCC, ARMClang, Bruce, Clang, Cray, |
| 115 | + CrayClang, Embarcadero, Borland, Fujitsu, FujitsuClang, |
| 116 | + GNU, GHS, HP, IAR, Intel, IntelLLVM, LCC, MSVC, NVHPC, |
| 117 | + NVIDIA, OrangeC, OpenWatcom, PGI, PathScale, SDCC, SunPro, |
| 118 | + Tasking, TI, TinyCC, XL, VisualAge, zOS, XLClang, IBMClang, |
| 119 | + }; |
| 120 | + |
| 121 | + inline constexpr auto vendor = Vendor::${CMAKE_CXX_COMPILER_ID}; |
| 122 | + inline constexpr std::string_view vendor_str = "${CMAKE_CXX_COMPILER_ID}"; |
| 123 | + inline constexpr auto is_clang_like = static_cast<bool>(${PROJECT_NAME_CAPS}_COMPILER_IS_CLANG_LIKE); |
| 124 | + inline constexpr auto is_gnu_like = static_cast<bool>(${PROJECT_NAME_CAPS}_COMPILER_IS_GNU_LIKE); |
| 125 | + inline constexpr auto is_icc_like = static_cast<bool>(${PROJECT_NAME_CAPS}_COMPILER_IS_ICC_LIKE); |
| 126 | + |
| 127 | +namespace version { |
| 128 | + inline constexpr std::string_view full = ${PROJECT_NAME_CAPS}_COMPILER_VERSION; |
| 129 | + inline constexpr int major = ${PROJECT_NAME_CAPS}_COMPILER_VERSION_MAJOR; |
| 130 | + inline constexpr int minor = ${PROJECT_NAME_CAPS}_COMPILER_VERSION_MINOR; |
| 131 | + inline constexpr int patch = ${PROJECT_NAME_CAPS}_COMPILER_VERSION_PATCH; |
| 132 | + inline constexpr int tweak = ${PROJECT_NAME_CAPS}_COMPILER_VERSION_TWEAK; |
| 133 | +} // namespace version |
| 134 | + |
| 135 | +} // namespace compiler |
| 136 | + |
| 137 | +namespace lang { |
| 138 | + enum struct Std { Cxx98, Cxx03, Cxx11, Cxx14, Cxx17, Cxx20, Cxx23 }; |
| 139 | + |
| 140 | + inline constexpr auto std = |
| 141 | +#if ${PROJECT_NAME_CAPS}_HAS_STD_CXX23 |
| 142 | + Std::Cxx23 |
| 143 | +#elif ${PROJECT_NAME_CAPS}_HAS_STD_CXX20 |
| 144 | + Std::Cxx20 |
| 145 | +#elif ${PROJECT_NAME_CAPS}_HAS_STD_CXX17 |
| 146 | + Std::Cxx17 |
| 147 | +#endif |
| 148 | + ; |
| 149 | + |
| 150 | + inline constexpr auto std_num = |
| 151 | +#if ${PROJECT_NAME_CAPS}_HAS_STD_CXX23 |
| 152 | + 23 |
| 153 | +#elif ${PROJECT_NAME_CAPS}_HAS_STD_CXX20 |
| 154 | + 20 |
| 155 | +#elif ${PROJECT_NAME_CAPS}_HAS_STD_CXX17 |
| 156 | + 17 |
| 157 | +#endif |
| 158 | + ; |
| 159 | + |
| 160 | + inline constexpr std::string_view std_str = |
| 161 | +#if ${PROJECT_NAME_CAPS}_HAS_STD_CXX23 |
| 162 | + "C++ 23" |
| 163 | +#elif ${PROJECT_NAME_CAPS}_HAS_STD_CXX20 |
| 164 | + "C++ 20" |
| 165 | +#elif ${PROJECT_NAME_CAPS}_HAS_STD_CXX17 |
| 166 | + "C++ 17" |
| 167 | +#endif |
| 168 | + ; |
| 169 | +} // namespace lang |
| 170 | + |
6 | 171 | namespace version {
|
7 |
| - static constexpr std::string_view full = "@PROJECT_VERSION@"; |
8 |
| - static constexpr int major = @PROJECT_VERSION_MAJOR@; |
9 |
| - static constexpr int minor = @PROJECT_VERSION_MINOR@; |
10 |
| - static constexpr int patch = @PROJECT_VERSION_PATCH@; |
11 |
| -} |
12 |
| - |
13 |
| -static constexpr std::string_view name = "@PROJECT_NAME@"; |
14 |
| -static constexpr std::string_view description = "@PROJECT_DESCRIPTION@"; |
15 |
| -static constexpr std::string_view url = "@PROJECT_HOMEPAGE_URL@"; |
16 |
| -} // namespace project |
17 |
| - |
18 |
| -#endif // PROJECT_CONFIG_HPP |
| 172 | + inline constexpr std::string_view full = "${PROJECT_VERSION}"; |
| 173 | + inline constexpr int major = ${PROJECT_VERSION_MAJOR}; |
| 174 | + inline constexpr int minor = ${PROJECT_VERSION_MINOR}; |
| 175 | + inline constexpr int patch = ${PROJECT_VERSION_PATCH}; |
| 176 | +} // namespace version |
| 177 | + |
| 178 | +inline constexpr std::string_view name = "${PROJECT_NAME}"; |
| 179 | +inline constexpr std::string_view description = "${PROJECT_DESCRIPTION}"; |
| 180 | +inline constexpr std::string_view url = "${PROJECT_HOMEPAGE_URL}"; |
| 181 | +} // namespace ${THIS_PROJECT_NAME} |
| 182 | + |
| 183 | +#endif // ${THIS_PROJECT_NAME}_CONFIG_HPP |
0 commit comments