From 483d47d79ed1949a3e396df51b9a03c73ab69f0e Mon Sep 17 00:00:00 2001 From: Jan Date: Sat, 21 Oct 2023 15:26:56 +0200 Subject: [PATCH] Build referenced targets from within zone definitions --- src/Linker/Linker.cpp | 21 ++++++++++++++----- .../Sequence/SequenceZoneDefinitionBuild.cpp | 19 +++++++++++++++++ .../Sequence/SequenceZoneDefinitionBuild.h | 14 +++++++++++++ .../ZoneDefinition/ZoneDefinitionParser.cpp | 2 ++ .../Zone/Definition/ZoneDefinition.h | 1 + 5 files changed, 52 insertions(+), 5 deletions(-) create mode 100644 src/ZoneCommon/Parsing/ZoneDefinition/Sequence/SequenceZoneDefinitionBuild.cpp create mode 100644 src/ZoneCommon/Parsing/ZoneDefinition/Sequence/SequenceZoneDefinitionBuild.h diff --git a/src/Linker/Linker.cpp b/src/Linker/Linker.cpp index 9315fc7b..1f7df57e 100644 --- a/src/Linker/Linker.cpp +++ b/src/Linker/Linker.cpp @@ -458,9 +458,19 @@ class LinkerImpl final : public Linker return true; } - bool BuildReferencedTargets(const std::string& projectName, const std::string& targetName, const ZoneDefinition& zoneDefinition) const + bool BuildReferencedTargets(const std::string& projectName, const std::string& targetName, const ZoneDefinition& zoneDefinition) { - return true; + return std::all_of(zoneDefinition.m_targets_to_build.begin(), zoneDefinition.m_targets_to_build.end(), [this, &projectName, &targetName](const std::string& buildTargetName) + { + if (buildTargetName == targetName) + { + std::cerr << "Cannot build target with same name: \"" << targetName << "\"\n"; + return false; + } + + std::cout << "Building referenced target \"" << buildTargetName << "\"\n"; + return BuildProject(projectName, buildTargetName); + }); } bool BuildProject(const std::string& projectName, const std::string& targetName) @@ -475,7 +485,7 @@ class LinkerImpl final : public Linker if (!GetProjectTypeFromZoneDefinition(projectType, targetName, *zoneDefinition)) return false; - auto result = false; + auto result = true; if (projectType != ProjectType::NONE) { std::string gameName; @@ -498,14 +508,15 @@ class LinkerImpl final : public Linker default: assert(false); + result = false; break; } } - result = result && BuildReferencedTargets(projectName, targetName, *zoneDefinition); - m_search_paths.UnloadProjectSpecificSearchPaths(); + result = result && BuildReferencedTargets(projectName, targetName, *zoneDefinition); + return result; } diff --git a/src/ZoneCommon/Parsing/ZoneDefinition/Sequence/SequenceZoneDefinitionBuild.cpp b/src/ZoneCommon/Parsing/ZoneDefinition/Sequence/SequenceZoneDefinitionBuild.cpp new file mode 100644 index 00000000..1c4a1661 --- /dev/null +++ b/src/ZoneCommon/Parsing/ZoneDefinition/Sequence/SequenceZoneDefinitionBuild.cpp @@ -0,0 +1,19 @@ +#include "SequenceZoneDefinitionBuild.h" + +#include "Parsing/ZoneDefinition/Matcher/ZoneDefinitionMatcherFactory.h" + +SequenceZoneDefinitionBuild::SequenceZoneDefinitionBuild() +{ + const ZoneDefinitionMatcherFactory create(this); + + AddMatchers({ + create.Keyword("build"), + create.Char(','), + create.Field().Capture(CAPTURE_BUILD_TARGET_NAME) + }); +} + +void SequenceZoneDefinitionBuild::ProcessMatch(ZoneDefinition* state, SequenceResult& result) const +{ + state->m_targets_to_build.emplace_back(result.NextCapture(CAPTURE_BUILD_TARGET_NAME).FieldValue()); +} diff --git a/src/ZoneCommon/Parsing/ZoneDefinition/Sequence/SequenceZoneDefinitionBuild.h b/src/ZoneCommon/Parsing/ZoneDefinition/Sequence/SequenceZoneDefinitionBuild.h new file mode 100644 index 00000000..8e5b963b --- /dev/null +++ b/src/ZoneCommon/Parsing/ZoneDefinition/Sequence/SequenceZoneDefinitionBuild.h @@ -0,0 +1,14 @@ +#pragma once + +#include "Parsing/ZoneDefinition/ZoneDefinitionParser.h" + +class SequenceZoneDefinitionBuild final : public ZoneDefinitionParser::sequence_t +{ + static constexpr auto CAPTURE_BUILD_TARGET_NAME = 1; + +protected: + void ProcessMatch(ZoneDefinition* state, SequenceResult& result) const override; + +public: + SequenceZoneDefinitionBuild(); +}; diff --git a/src/ZoneCommon/Parsing/ZoneDefinition/ZoneDefinitionParser.cpp b/src/ZoneCommon/Parsing/ZoneDefinition/ZoneDefinitionParser.cpp index a6ae9552..fcb7c084 100644 --- a/src/ZoneCommon/Parsing/ZoneDefinition/ZoneDefinitionParser.cpp +++ b/src/ZoneCommon/Parsing/ZoneDefinition/ZoneDefinitionParser.cpp @@ -1,6 +1,7 @@ #include "ZoneDefinitionParser.h" #include "Sequence/SequenceZoneDefinitionAssetList.h" +#include "Sequence/SequenceZoneDefinitionBuild.h" #include "Sequence/SequenceZoneDefinitionEntry.h" #include "Sequence/SequenceZoneDefinitionIgnore.h" #include "Sequence/SequenceZoneDefinitionInclude.h" @@ -18,6 +19,7 @@ const std::vector::seq new SequenceZoneDefinitionInclude(), new SequenceZoneDefinitionIgnore(), new SequenceZoneDefinitionAssetList(), + new SequenceZoneDefinitionBuild(), new SequenceZoneDefinitionEntry() }); diff --git a/src/ZoneCommon/Zone/Definition/ZoneDefinition.h b/src/ZoneCommon/Zone/Definition/ZoneDefinition.h index 4ec8a915..74c54012 100644 --- a/src/ZoneCommon/Zone/Definition/ZoneDefinition.h +++ b/src/ZoneCommon/Zone/Definition/ZoneDefinition.h @@ -37,6 +37,7 @@ public: std::vector m_includes; std::vector m_asset_lists; std::vector m_ignores; + std::vector m_targets_to_build; std::vector m_assets; void AddMetaData(std::string key, std::string value);