Skip to content

Commit c9dd352

Browse files
committed
Build: Simplify SC-Build with more defaults
1 parent d30163d commit c9dd352

File tree

4 files changed

+93
-92
lines changed

4 files changed

+93
-92
lines changed

Libraries/Build/Build.cpp

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,42 @@ SC::Build::Configuration::Configuration()
4242
(void)StringBuilder(intermediatesPath).format("$(PROJECT_NAME)/{}", getStandardBuildDirectory());
4343
}
4444

45+
bool SC::Build::Configuration::applyPreset(Preset newPreset, const Parameters& parameters)
46+
{
47+
preset = newPreset;
48+
switch (preset)
49+
{
50+
case Configuration::Preset::DebugCoverage:
51+
SC_TRY(compile.set<Compile::enableCoverage>(true));
52+
SC_TRY(compile.set<Compile::optimizationLevel>(Optimization::Debug));
53+
SC_TRY(compile.addDefines({"DEBUG=1"}));
54+
if (parameters.generator == Build::Generator::VisualStudio2022)
55+
{
56+
visualStudio.platformToolset = "ClangCL";
57+
}
58+
break;
59+
case Configuration::Preset::Debug:
60+
SC_TRY(compile.set<Compile::enableASAN>(true));
61+
SC_TRY(compile.set<Compile::optimizationLevel>(Optimization::Debug));
62+
SC_TRY(compile.addDefines({"DEBUG=1"}));
63+
break;
64+
case Configuration::Preset::Release:
65+
SC_TRY(compile.set<Compile::optimizationLevel>(Optimization::Release));
66+
SC_TRY(compile.addDefines({"NDEBUG=1"}));
67+
break;
68+
case Configuration::Preset::None: break;
69+
}
70+
return true;
71+
}
72+
4573
bool SC::Build::Project::setRootDirectory(StringView file)
4674
{
4775
SmallVector<StringView, 256> components;
4876
return Path::normalize(file, components, &rootDirectory, Path::AsPosix);
4977
}
5078

51-
bool SC::Build::Project::addPresetConfiguration(Configuration::Preset preset, StringView configurationName)
79+
bool SC::Build::Project::addPresetConfiguration(Configuration::Preset preset, const Parameters& parameters,
80+
StringView configurationName)
5281
{
5382
Configuration configuration;
5483
if (configurationName.isEmpty())
@@ -59,7 +88,7 @@ bool SC::Build::Project::addPresetConfiguration(Configuration::Preset preset, St
5988
{
6089
SC_TRY(configuration.name.assign(configurationName));
6190
}
62-
SC_TRY(configuration.applyPreset(preset));
91+
SC_TRY(configuration.applyPreset(preset, parameters));
6392
return configurations.push_back(configuration);
6493
}
6594

Libraries/Build/Build.h

Lines changed: 11 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ namespace Build
1818

1919
//! @addtogroup group_build
2020
//! @{
21-
21+
struct Parameters;
2222
/// @brief Build Platform (Operating System)
2323
struct Platform
2424
{
@@ -278,28 +278,7 @@ struct Configuration
278278
}
279279

280280
/// @brief Set compile flags depending on the given Preset
281-
[[nodiscard]] bool applyPreset(Preset newPreset)
282-
{
283-
preset = newPreset;
284-
switch (preset)
285-
{
286-
case Configuration::Preset::DebugCoverage:
287-
SC_TRY(compile.set<Compile::enableCoverage>(true));
288-
SC_TRY(compile.set<Compile::optimizationLevel>(Optimization::Debug));
289-
SC_TRY(compile.addDefines({"DEBUG=1"}));
290-
break;
291-
case Configuration::Preset::Debug:
292-
SC_TRY(compile.set<Compile::optimizationLevel>(Optimization::Debug));
293-
SC_TRY(compile.addDefines({"DEBUG=1"}));
294-
break;
295-
case Configuration::Preset::Release:
296-
SC_TRY(compile.set<Compile::optimizationLevel>(Optimization::Release));
297-
SC_TRY(compile.addDefines({"NDEBUG=1"}));
298-
break;
299-
case Configuration::Preset::None: break;
300-
}
301-
return true;
302-
}
281+
[[nodiscard]] bool applyPreset(Preset newPreset, const Parameters& parameters);
303282

304283
[[nodiscard]] static constexpr StringView getStandardBuildDirectory()
305284
{
@@ -366,6 +345,9 @@ struct Project
366345
}
367346
};
368347

348+
Project() = default;
349+
Project(TargetType::Type targetType, StringView name) : targetType(targetType), name(name), targetName(name) {}
350+
369351
TargetType::Type targetType = TargetType::Executable; ///< Type of build artifact
370352

371353
String name; ///< Project name
@@ -382,8 +364,8 @@ struct Project
382364
[[nodiscard]] bool setRootDirectory(StringView file);
383365

384366
/// @brief Add a configuration with a given name, started by cloning options of a specific Preset
385-
[[nodiscard]] bool addPresetConfiguration(Configuration::Preset preset,
386-
StringView configurationName = StringView());
367+
[[nodiscard]] bool addPresetConfiguration(Configuration::Preset preset, const Parameters& parameters,
368+
StringView configurationName = StringView());
387369

388370
/// @brief Get Configuration with the matching `configurationName`
389371
[[nodiscard]] Configuration* getConfiguration(StringView configurationName);
@@ -411,6 +393,9 @@ struct Project
411393
/// @brief Groups multiple Project together with shared compile and link flags
412394
struct Workspace
413395
{
396+
Workspace() = default;
397+
Workspace(StringView name) : name(name) {}
398+
414399
String name; ///< Workspace name
415400
Vector<Project> projects; ///< List of projects in this workspace
416401
CompileFlags compile; ///< Global workspace compile flags for all projects
@@ -484,7 +469,7 @@ struct Action
484469
Print,
485470
Coverage
486471
};
487-
using ConfigureFunction = Result (*)(Build::Definition& definition, Build::Parameters& parameters);
472+
using ConfigureFunction = Result (*)(Build::Definition& definition, const Build::Parameters& parameters);
488473

489474
static Result execute(const Action& action, ConfigureFunction configure, StringView projectName);
490475

Libraries/Build/Internal/BuildWriterMakefile.inl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ endif
177177
// -Werror=sign-conversion
178178
// -Wmissing-field-initializers
179179

180-
builder.append("\n{0}_WARNING_FLAGS_CXX :=-Wnon-virtual-dtor -Woverloaded-virtual");
180+
builder.append("\n{0}_WARNING_FLAGS_CXX :=-Wnon-virtual-dtor -Woverloaded-virtual", makeTarget.view());
181181

182182
builder.append("\n{0}_WARNING_FLAGS :=-Werror -Werror=return-type -Wunreachable-code "
183183
" -Wmissing-braces -Wparentheses -Wswitch -Wunused-function -Wunused-label "

Tools/SC-build.cpp

Lines changed: 50 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -7,93 +7,80 @@ namespace SC
77
{
88
namespace Build
99
{
10-
static constexpr StringView PROJECT_NAME = "SCTest";
10+
SC_COMPILER_WARNING_PUSH_UNUSED_RESULT; // Doing some optimistic coding here, ignoring all failures
1111

12-
Result configure(Build::Definition& definition, Build::Parameters& parameters)
12+
void addSaneCppLibraries(Project& project, const Parameters& parameters)
1313
{
14-
SC_COMPILER_WARNING_PUSH_UNUSED_RESULT; // Doing some optimistic coding here, ignoring all failures
15-
16-
// Workspace
17-
Workspace workspace;
18-
workspace.name.assign(PROJECT_NAME);
19-
20-
// Project
21-
Project project;
22-
project.targetType = TargetType::Executable;
23-
project.name.assign(PROJECT_NAME);
24-
project.targetName.assign(PROJECT_NAME);
25-
// All relative paths are evaluated from this project root directory.
26-
project.setRootDirectory(parameters.directories.libraryDirectory.view());
27-
28-
// Project Configurations
29-
project.addPresetConfiguration(Configuration::Preset::Debug);
30-
project.addPresetConfiguration(Configuration::Preset::Release);
31-
if (parameters.generator == Build::Generator::VisualStudio2022)
32-
{
33-
project.addPresetConfiguration(Configuration::Preset::Debug, "Debug Clang");
34-
project.getConfiguration("Debug Clang")->visualStudio.platformToolset = "ClangCL";
35-
}
36-
else
37-
{
38-
project.addPresetConfiguration(Configuration::Preset::DebugCoverage);
39-
}
40-
41-
// Project Configurations special flags
42-
for (Configuration& config : project.configurations)
43-
{
44-
config.compile.set<Compile::enableASAN>(config.preset == Configuration::Preset::Debug);
45-
}
46-
47-
// Defines
48-
// $(PROJECT_ROOT) is the same directory set with Project::setRootDirectory
49-
project.compile.addDefines({"SC_LIBRARY_PATH=$(PROJECT_ROOT)", "SC_COMPILER_ENABLE_CONFIG=1"});
50-
51-
// Includes
52-
project.compile.addIncludes({
53-
".", // Libraries path (for PluginTest)
54-
"Tests/SCTest", // SCConfig.h path (enabled by SC_COMPILER_ENABLE_CONFIG == 1)
55-
});
56-
57-
// Libraries to link
58-
if (parameters.platforms.contains(Build::Platform::MacOS))
59-
{
60-
project.link.addFrameworks({"CoreFoundation", "CoreServices"});
61-
}
62-
63-
// File overrides (order matters regarding to add / remove)
14+
// Files
6415
project.addDirectory("Bindings/c", "**.cpp"); // add all cpp support files for c bindings
6516
project.addDirectory("Bindings/c", "**.c"); // add all c bindings
6617
project.addDirectory("Bindings/c", "**.h"); // add all c bindings
67-
project.addDirectory("Tests/SCTest", "*.cpp"); // add all .cpp from SCTest directory
68-
project.addDirectory("Tests/SCTest", "*.h"); // add all .h from SCTest directory
6918
project.addDirectory("Libraries", "**.cpp"); // recursively add all cpp files
7019
project.addDirectory("Libraries", "**.h"); // recursively add all header files
7120
project.addDirectory("Libraries", "**.inl"); // recursively add all inline files
7221
project.addDirectory("LibrariesExtra", "**.h"); // recursively add all header files
7322
project.addDirectory("LibrariesExtra", "**.cpp"); // recursively add all cpp files
7423
project.addDirectory("Support/DebugVisualizers", "*.cpp"); // add debug visualizers
75-
project.addDirectory("Tools", "SC-*.cpp"); // add all tools
76-
project.addDirectory("Tools", "*.h"); // add tools headers
77-
project.addDirectory("Tools", "*Test.cpp"); // add tools tests
24+
25+
// Libraries to link
26+
if (parameters.platforms.contains(Platform::MacOS))
27+
{
28+
project.link.addFrameworks({"CoreFoundation", "CoreServices"});
29+
}
7830

7931
// Debug visualization helpers
80-
if (parameters.generator == Build::Generator::VisualStudio2022)
32+
if (parameters.generator == Generator::VisualStudio2022)
8133
{
8234
project.addDirectory("Support/DebugVisualizers/MSVC", "*.natvis");
8335
}
8436
else
8537
{
8638
project.addDirectory("Support/DebugVisualizers/LLDB", "*");
8739
}
40+
}
8841

89-
// Adding to workspace and definition
90-
workspace.projects.push_back(move(project));
91-
definition.workspaces.push_back(move(workspace));
42+
static constexpr StringView TEST_PROJECT_NAME = "SCTest";
43+
44+
Project buildTestProject(const Parameters& parameters)
45+
{
46+
Project project = {TargetType::Executable, TEST_PROJECT_NAME};
47+
48+
// All relative paths are evaluated from this project root directory.
49+
project.setRootDirectory(parameters.directories.libraryDirectory.view());
50+
51+
// Project Configurations
52+
project.addPresetConfiguration(Configuration::Preset::Debug, parameters);
53+
project.addPresetConfiguration(Configuration::Preset::Release, parameters);
54+
project.addPresetConfiguration(Configuration::Preset::DebugCoverage, parameters);
55+
56+
// Defines
57+
// $(PROJECT_ROOT) expands to Project::setRootDirectory expressed relative to $(PROJECT_DIR)
58+
project.compile.addDefines({"SC_LIBRARY_PATH=$(PROJECT_ROOT)", "SC_COMPILER_ENABLE_CONFIG=1"});
59+
60+
// Includes
61+
project.compile.addIncludes({
62+
".", // Libraries path (for PluginTest)
63+
"Tests/SCTest", // SCConfig.h path (enabled by SC_COMPILER_ENABLE_CONFIG == 1)
64+
});
9265

93-
SC_COMPILER_WARNING_POP;
66+
addSaneCppLibraries(project, parameters);
67+
project.addDirectory("Tests/SCTest", "*.cpp"); // add all .cpp from SCTest directory
68+
project.addDirectory("Tests/SCTest", "*.h"); // add all .h from SCTest directory
69+
project.addDirectory("Tools", "SC-*.cpp"); // add all tools
70+
project.addDirectory("Tools", "*.h"); // add tools headers
71+
project.addDirectory("Tools", "*Test.cpp"); // add tools tests
72+
return project;
73+
}
74+
75+
Result configure(Definition& definition, const Parameters& parameters)
76+
{
77+
Workspace workspace = {"SCTest"};
78+
workspace.projects.push_back(buildTestProject(parameters));
79+
definition.workspaces.push_back(move(workspace));
9480
return Result(true);
9581
}
82+
SC_COMPILER_WARNING_POP;
9683

97-
Result executeAction(const Action& action) { return Build::Action::execute(action, configure, PROJECT_NAME); }
84+
Result executeAction(const Action& action) { return Build::Action::execute(action, configure, TEST_PROJECT_NAME); }
9885
} // namespace Build
9986
} // namespace SC

0 commit comments

Comments
 (0)