Sane C++ Libraries
C++ Platform Abstraction Libraries
Build.h
1// Copyright (c) Stefano Cristiano
2// SPDX-License-Identifier: MIT
3#pragma once
4#include "../Containers/Vector.h"
5#include "../Foundation/Result.h"
6#include "../Strings/String.h"
7
8namespace SC
9{
11namespace Build
12{
15
18struct Parameters;
19struct Project;
20
21template <typename T>
23{
24 Parameter() = default;
25 Parameter(const T& other) : value(other) {}
26 operator const T&() const { return value; }
27
28 bool hasBeenSet() const { return valueSet; }
29 void unset() { valueSet = false; }
30
31 Parameter& operator=(const T& other)
32 {
33 value = other;
34 valueSet = true;
35 return *this;
36 }
37
38 private:
39 T value;
40 bool valueSet = false;
41};
42
45{
46 enum Type
47 {
48 Unknown = 0,
49 Windows,
50 Apple,
51 Linux,
52 Wasm
53 };
54
56 static constexpr StringView toString(Type type)
57 {
58 switch (type)
59 {
60 case Unknown: return "unknown";
61 case Windows: return "windows";
62 case Apple: return "apple";
63 case Linux: return "linux";
64 case Wasm: return "wasm";
65 }
66 Assert::unreachable();
67 }
68};
69
72{
73 enum Type
74 {
75 Any = 0,
76 Intel32,
77 Intel64,
78 Arm64,
79 Wasm
80 };
81
83 static constexpr StringView toString(Type type)
84 {
85 switch (type)
86 {
87 case Any: return "Any";
88 case Intel32: return "Intel32";
89 case Intel64: return "Intel64";
90 case Arm64: return "Arm64";
91 case Wasm: return "Wasm";
92 }
93 Assert::unreachable();
94 }
95};
96
99{
100 enum Type
101 {
106 };
107
109 static constexpr StringView toString(Type type)
110 {
111 switch (type)
112 {
113 case XCode: return "XCode";
114 case VisualStudio2022: return "VisualStudio2022";
115 case VisualStudio2019: return "VisualStudio2019";
116 case Make: return "Make";
117 }
118 Assert::unreachable();
119 }
120};
121
124{
125 enum Type
126 {
129 };
130
132 static constexpr StringView toString(Type type)
133 {
134 switch (type)
135 {
136 case Debug: return "Debug"_a8;
137 case Release: return "Release"_a8;
138 }
139 Assert::unreachable();
140 }
141};
142
145{
148
150
156};
157
160{
166
169};
170
173{
175 enum class Preset
176 {
177 Debug,
179 Release,
180 };
181
184 {
185 StringView platformToolset;
186 };
187
189
191 [[nodiscard]] static constexpr StringView PresetToString(Preset preset)
192 {
193 switch (preset)
194 {
195 case Configuration::Preset::Debug: return "Debug";
196 case Configuration::Preset::DebugCoverage: return "DebugCoverage";
197 case Configuration::Preset::Release: return "Release";
198 }
199 Assert::unreachable();
200 }
201
203 [[nodiscard]] bool applyPreset(const Project& project, Preset newPreset, const Parameters& parameters);
204
205 [[nodiscard]] static constexpr StringView getStandardBuildDirectory()
206 {
207 return "$(TARGET_OS)-$(TARGET_ARCHITECTURES)-$(BUILD_SYSTEM)-$(COMPILER)-$(CONFIGURATION)";
208 }
209
213
216
217 Architecture::Type architecture = Architecture::Any;
218
220};
221
224{
226 enum Type
227 {
230 };
231};
232
235{
237 struct File
238 {
241 {
243 Remove
244 };
248
249 bool operator==(const File& other) const
250 {
251 // collectUniqueRootPaths doesn't care about de-duplicating also operation
252 return base == other.base and mask == other.mask;
253 }
254 };
255
256 Project() = default;
258
260
265
269
271
273 [[nodiscard]] bool setRootDirectory(StringView file);
274
276 [[nodiscard]] bool addPresetConfiguration(Configuration::Preset preset, const Parameters& parameters,
277 StringView configurationName = StringView());
278
280 [[nodiscard]] Configuration* getConfiguration(StringView configurationName);
282 [[nodiscard]] const Configuration* getConfiguration(StringView configurationName) const;
283
287 [[nodiscard]] bool addDirectory(StringView subdirectory, StringView filter);
288
290 [[nodiscard]] bool addFile(StringView singleFile);
291
296 [[nodiscard]] bool removeFiles(StringView subdirectory, StringView filter);
297
299 [[nodiscard]] Result validate() const;
300};
301
304{
305 Workspace() = default;
307
310
312 [[nodiscard]] Result validate() const;
313};
314
316{
317 String projectsDirectory;
318 String intermediatesDirectory;
319 String outputsDirectory;
320 String packagesCacheDirectory;
321 String packagesInstallDirectory;
322 String libraryDirectory;
323};
324
327{
328 Platform::Type platform;
329 Architecture::Type architecture;
331
332 Parameters()
333 {
334 platform = Platform::Linux;
335 architecture = Architecture::Any;
337 }
338 Directories directories;
339};
340
343{
345
349 Result configure(StringView projectName, const Parameters& parameters) const;
350};
351
353
354//-----------------------------------------------------------------------------------------------------------------------
355// Implementations Details
356//-----------------------------------------------------------------------------------------------------------------------
357
358struct Action
359{
360 enum Type
361 {
362 Configure,
363 Compile,
364 Run,
365 Print,
366 Coverage
367 };
368 using ConfigureFunction = Result (*)(Build::Definition& definition, const Build::Parameters& parameters);
369
370 static Result execute(const Action& action, ConfigureFunction configure, StringView projectName);
371
372 Type action = Configure;
373
374 Parameters parameters;
375 StringView configuration;
376 StringView target;
377
378 private:
379 struct Internal;
380};
381
382// Defined inside SC-Build.cpp
383Result executeAction(const Action& action);
384} // namespace Build
385} // namespace SC
Definition: Build.h:359
Build Architecture (Processor / Instruction set)
Definition: Build.h:72
static constexpr StringView toString(Type type)
Get StringView from Architecture::Type.
Definition: Build.h:83
Compile flags (include paths, preprocessor defines etc.)
Definition: Build.h:145
Vector< String > defines
Preprocessor defines.
Definition: Build.h:147
Vector< String > includePaths
Include search paths list.
Definition: Build.h:146
Parameter< bool > enableStdCpp
Enable and include C++ Standard Library.
Definition: Build.h:154
Parameter< bool > enableASAN
Enable Address Sanitizer.
Definition: Build.h:151
Parameter< bool > enableRTTI
Enable C++ Runtime Type Identification.
Definition: Build.h:152
Parameter< bool > enableExceptions
Enable C++ Exceptions.
Definition: Build.h:153
Optimization::Type optimizationLevel
Optimization level.
Definition: Build.h:149
Parameter< bool > enableCoverage
Enables code coverage instrumentation.
Definition: Build.h:155
Visual Studio platform toolset.
Definition: Build.h:184
Groups SC::Build::CompileFlags and SC::Build::LinkFlags for a given SC::Build::Architecture.
Definition: Build.h:173
bool applyPreset(const Project &project, Preset newPreset, const Parameters &parameters)
Set compile flags depending on the given Preset.
String intermediatesPath
Obj path. If relative, it's appended to _Intermediates relative to .
Definition: Build.h:212
String outputPath
Exe path. If relative, it's appended to _Outputs relative to .
Definition: Build.h:211
CompileFlags compile
Configuration compile flags.
Definition: Build.h:214
String name
Configuration name.
Definition: Build.h:210
static constexpr StringView PresetToString(Preset preset)
Convert Preset to StringView.
Definition: Build.h:191
LinkFlags link
Configuration link flags.
Definition: Build.h:215
Architecture::Type architecture
Restrict this configuration to a specific architecture.
Definition: Build.h:217
Preset
A pre-made preset with pre-configured set of options.
Definition: Build.h:176
@ Debug
Compile for debug, enabling ASAN (if not set on project and never on VStudio)
@ Release
Compile for release.
@ DebugCoverage
Compile for debug, enabling coverage (sets ClangCL for VStudio)
VisualStudio visualStudio
Customize VisualStudio platformToolset.
Definition: Build.h:188
Top level build description holding all Workspace objects.
Definition: Build.h:343
Result configure(StringView projectName, const Parameters &parameters) const
Generates projects for all workspaces, with specified parameters at given root path.
Vector< Workspace > workspaces
Workspaces to be generated.
Definition: Build.h:344
Definition: Build.h:316
Build system generator (Xcode / Visual Studio)
Definition: Build.h:99
static constexpr StringView toString(Type type)
Get StringView from Generator::Type.
Definition: Build.h:109
Type
Definition: Build.h:101
@ Make
Generate posix makefiles.
Definition: Build.h:105
@ VisualStudio2022
Generate projects for Visual Studio 2022.
Definition: Build.h:103
@ VisualStudio2019
Generate projects for Visual Studio 2019.
Definition: Build.h:104
@ XCode
Generate projects for XCode (Version 14+)
Definition: Build.h:102
Optimization level (Debug / Release)
Definition: Build.h:124
static constexpr StringView toString(Type type)
Get StringView from Optimization::Type.
Definition: Build.h:132
Type
Definition: Build.h:126
@ Debug
Optimizations set to debug.
Definition: Build.h:127
@ Release
Optimizations set to release.
Definition: Build.h:128
Definition: Build.h:23
Describes a specific set of platforms, architectures and build generators to generate projects for.
Definition: Build.h:327
Platform::Type platform
Platform to generate.
Definition: Build.h:328
Generator::Type generator
Build system types to generate.
Definition: Build.h:330
Architecture::Type architecture
Architecture to generate.
Definition: Build.h:329
Build Platform (Operating System)
Definition: Build.h:45
static constexpr StringView toString(Type type)
Get StringView from Platform::Type.
Definition: Build.h:56
Project list of files.
Definition: Build.h:238
Operation
Indicates if this is an additive or subtractive files operation.
Definition: Build.h:241
@ Remove
Remove files.
Definition: Build.h:243
@ Add
Add files.
Definition: Build.h:242
Operation operation
Operation type (add or remove files)
Definition: Build.h:245
String mask
Mask suffix (can contain *)
Definition: Build.h:247
String base
Base path (not containing *)
Definition: Build.h:246
Groups multiple Configuration and source files with their compile and link flags.
Definition: Build.h:235
const Configuration * getConfiguration(StringView configurationName) const
Get Configuration with the matching configurationName
Configuration * getConfiguration(StringView configurationName)
Get Configuration with the matching configurationName
TargetType::Type targetType
Type of build artifact.
Definition: Build.h:259
Result validate() const
Validates this project for it to contain a valid combination of flags.
String rootDirectory
Project root directory.
Definition: Build.h:262
String targetName
Project target name.
Definition: Build.h:263
CompileFlags compile
Shared CompileFlags for all files in the project.
Definition: Build.h:267
bool addDirectory(StringView subdirectory, StringView filter)
Add all files from specific subdirectory (relative to project root) matching given filter.
bool setRootDirectory(StringView file)
Set root directory for this project (all relative paths will be relative to this one)
Vector< Configuration > configurations
Build configurations created inside the project.
Definition: Build.h:270
bool removeFiles(StringView subdirectory, StringView filter)
Remove files matching the given filter.
LinkFlags link
Shared LinkFlags for all files in the project.
Definition: Build.h:268
String name
Project name.
Definition: Build.h:261
bool addPresetConfiguration(Configuration::Preset preset, const Parameters &parameters, StringView configurationName=StringView())
Add a configuration with a given name, started by cloning options of a specific Preset.
String iconPath
Icon location.
Definition: Build.h:264
Vector< File > files
Files that belong to the project.
Definition: Build.h:266
bool addFile(StringView singleFile)
Add a single file to the project.
Type of target artifact to build (executable, library)
Definition: Build.h:224
Type
Type of artifact.
Definition: Build.h:227
@ ConsoleExecutable
Create console executable program.
Definition: Build.h:228
@ GUIApplication
Create graphical application program.
Definition: Build.h:229
Groups multiple Project together with shared compile and link flags.
Definition: Build.h:304
String name
Workspace name.
Definition: Build.h:308
Vector< Project > projects
List of projects in this workspace.
Definition: Build.h:309
Result validate() const
Validates all projects in this workspace.
An ascii string used as boolean result. SC_TRY macro forwards errors to caller.
Definition: Result.h:12
A non-modifiable owning string with associated encoding.
Definition: String.h:29
Non-owning view over a range of characters with UTF Encoding.
Definition: StringView.h:47
A contiguous sequence of heap allocated elements.
Definition: Vector.h:257