Skip to content

Commit 3d300b6

Browse files
committed
Updated project_config
1 parent ea136b9 commit 3d300b6

File tree

4 files changed

+222
-18
lines changed

4 files changed

+222
-18
lines changed

README.md

+2-3
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,8 @@ project](https://github.com/lefticus/cpp_starter_project).
88
_NOTE 1:_ This project is meant specifically for C++, it will likely take a lot of
99
work to adapt it for use with C (or any other language).
1010

11-
_NOTE 2:_ The minimum recommended standard is C++17 (default since GCC 11 and
12-
Clang 16). The minimum supported standard is C++11 (though this only matters for
13-
certain warnings).
11+
_NOTE 2:_ The minimum required standard is C++17 (default since GCC 11 and Clang 16).
12+
1413
## Dependencies
1514

1615
### Required

project_config/CMakeLists.txt

+32
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,37 @@
1+
string(TOUPPER ${THIS_PROJECT_NAME} PROJECT_NAME_CAPS)
2+
string(REPLACE "-" "_" SYSTEM_NAME_SANITISED ${CMAKE_SYSTEM_NAME})
3+
string(REPLACE "." ";" compiler_version_list ${CMAKE_CXX_COMPILER_VERSION})
4+
list(LENGTH compiler_version_list compiler_version_len)
5+
if(compiler_version_len GREATER_EQUAL 4)
6+
list(GET compiler_version_list 3 COMPILER_VERSION_TWEAK)
7+
string(REGEX REPLACE "0(.)" "\\1" COMPILER_VERSION_TWEAK ${COMPILER_VERSION_TWEAK})
8+
else()
9+
set(COMPILER_VERSION_TWEAK 0)
10+
endif()
11+
if(compiler_version_len GREATER_EQUAL 3)
12+
list(GET compiler_version_list 2 COMPILER_VERSION_PATCH)
13+
string(REGEX REPLACE "0(.)" "\\1" COMPILER_VERSION_PATCH ${COMPILER_VERSION_PATCH})
14+
else()
15+
set(COMPILER_VERSION_PATCH 0)
16+
endif()
17+
if(compiler_version_len GREATER_EQUAL 2)
18+
list(GET compiler_version_list 1 COMPILER_VERSION_MINOR)
19+
string(REGEX REPLACE "0(.)" "\\1" COMPILER_VERSION_MINOR ${COMPILER_VERSION_MINOR})
20+
else()
21+
set(COMPILER_VERSION_MINOR 0)
22+
endif()
23+
if(NOT (CMAKE_CXX_COMPILER_VERSION STREQUAL ""))
24+
list(GET compiler_version_list 0 COMPILER_VERSION_MAJOR)
25+
string(REGEX REPLACE "0(.)" "\\1" COMPILER_VERSION_MAJOR ${COMPILER_VERSION_MAJOR})
26+
else()
27+
set(COMPILER_VERSION_MAJOR 0)
28+
endif()
29+
130
configure_file(
231
"config.hpp.in"
332
"${CMAKE_BINARY_DIR}/project_config/include/project/config.hpp"
433
ESCAPE_QUOTES
534
)
35+
36+
unset(PROJECT_NAME_CAPS)
37+
unset(SYSTEM_NAME_SANITISED)

project_config/config.hpp.in

+180-15
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,183 @@
1-
#ifndef PROJECT_CONFIG_HPP
2-
#define PROJECT_CONFIG_HPP
1+
#ifndef ${THIS_PROJECT_NAME}_CONFIG_HPP
2+
#define ${THIS_PROJECT_NAME}_CONFIG_HPP
33
#include <string_view>
44

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+
6171
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

src/main.cpp

+8
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,22 @@ int main() {
66
77
version v{}
88
9+
Compiling on {} {} with {} {} compiler (using {})
10+
911
Try editing the source code in ./src
1012
1113
Or adding a test in ./tests
1214
1315
Find more info at {}/wiki
1416
)",
17+
// NOTE: the `cpp_init` namespace will change to whatever you set the project name to in vcpkg.json
1518
cpp_init::name,
1619
cpp_init::description,
1720
cpp_init::version::full,
21+
cpp_init::sys::os_str,
22+
cpp_init::sys::version,
23+
cpp_init::compiler::vendor_str,
24+
cpp_init::compiler::version::full,
25+
cpp_init::lang::std_str,
1826
cpp_init::url);
1927
}

0 commit comments

Comments
 (0)