yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
build_tool.h
Go to the documentation of this file.
1#ifndef YAZE_SRC_CLI_SERVICE_AGENT_TOOLS_BUILD_TOOL_H_
2#define YAZE_SRC_CLI_SERVICE_AGENT_TOOLS_BUILD_TOOL_H_
3
4#include <atomic>
5#include <chrono>
6#include <memory>
7#include <mutex>
8#include <string>
9#include <thread>
10#include <vector>
11
12#include "absl/status/status.h"
13#include "absl/status/statusor.h"
15
16namespace yaze {
17namespace cli {
18namespace agent {
19namespace tools {
20
32class BuildTool {
33 public:
34 // Build operation results
35 struct BuildResult {
36 bool success;
37 std::string output;
38 std::string error_output;
40 std::chrono::seconds duration;
41 std::string command_executed;
42 };
43
44 // Build status information
45 struct BuildStatus {
47 std::string current_operation;
49 std::chrono::system_clock::time_point start_time;
50 int progress_percent; // -1 if unknown
51 };
52
53 // Build configuration
54 struct BuildConfig {
55 std::string build_directory = "build_ai"; // Default AI agent build dir
56 std::chrono::seconds timeout = std::chrono::seconds(600); // 10 min default
57 bool capture_output = true;
58 bool verbose = false;
59 int max_output_size = 1024 * 1024; // 1MB max output
60
61 BuildConfig() = default;
62 };
63
65 explicit BuildTool(const BuildConfig& config);
66 ~BuildTool();
67
73 absl::StatusOr<BuildResult> Configure(const std::string& preset);
74
81 absl::StatusOr<BuildResult> Build(const std::string& target = "",
82 const std::string& config = "");
83
90 absl::StatusOr<BuildResult> RunTests(const std::string& filter = "",
91 const std::string& rom_path = "");
92
97 BuildStatus GetBuildStatus() const;
98
103 absl::StatusOr<BuildResult> Clean();
104
109 bool IsBuildDirectoryReady() const;
110
115 std::vector<std::string> ListAvailablePresets() const;
116
121 std::optional<BuildResult> GetLastResult() const;
122
127 absl::Status CancelCurrentOperation();
128
129 private:
130 // Execute a command with timeout and output capture
131 absl::StatusOr<BuildResult> ExecuteCommand(
132 const std::string& command,
133 const std::string& operation_name);
134
135 // Platform-specific command execution
136 absl::StatusOr<BuildResult> ExecuteCommandInternal(
137 const std::string& command,
138 const std::chrono::seconds& timeout);
139
140 // Get the project root directory
141 std::string GetProjectRoot() const;
142
143 // Detect the current platform
144 std::string GetCurrentPlatform() const;
145
146 // Parse CMakePresets.json for available presets
147 std::vector<std::string> ParsePresetsFile() const;
148
149 // Validate preset exists and is compatible
150 bool IsPresetValid(const std::string& preset) const;
151
152 // Thread-safe status updates
153 void UpdateStatus(const std::string& operation, bool is_running);
154
156 mutable std::mutex status_mutex_;
157 std::atomic<bool> is_running_{false};
159 std::optional<BuildResult> last_result_;
160 std::chrono::system_clock::time_point operation_start_time_;
161 std::unique_ptr<std::thread> execution_thread_;
162 std::atomic<bool> cancel_requested_{false};
163};
164
165// Command handler implementations for integration with ToolDispatcher
166
171 public:
172 std::string GetName() const override { return "build-configure"; }
173
174 std::string GetDescription() const {
175 return "Configure the build system with a CMake preset";
176 }
177
178 std::string GetUsage() const override {
179 return "build-configure --preset <preset> [--build-dir <dir>] [--verbose]";
180 }
181
182 absl::Status ValidateArgs(const resources::ArgumentParser& parser) override;
183
184 absl::Status Execute(Rom* rom, const resources::ArgumentParser& parser,
185 resources::OutputFormatter& formatter) override;
186
187 private:
188 std::unique_ptr<BuildTool> build_tool_;
189};
190
195 public:
196 std::string GetName() const override { return "build-compile"; }
197
198 std::string GetDescription() const {
199 return "Build a specific target or all targets";
200 }
201
202 std::string GetUsage() const override {
203 return "build-compile [--target <target>] [--config <config>] [--build-dir <dir>]";
204 }
205
206 absl::Status ValidateArgs(const resources::ArgumentParser& parser) override;
207
208 absl::Status Execute(Rom* rom, const resources::ArgumentParser& parser,
209 resources::OutputFormatter& formatter) override;
210
211 private:
212 std::unique_ptr<BuildTool> build_tool_;
213};
214
219 public:
220 std::string GetName() const override { return "build-test"; }
221
222 std::string GetDescription() const {
223 return "Run tests with optional filter";
224 }
225
226 std::string GetUsage() const override {
227 return "build-test [--filter <pattern>] [--rom-path <path>] [--build-dir <dir>]";
228 }
229
230 absl::Status ValidateArgs(const resources::ArgumentParser& parser) override;
231
232 absl::Status Execute(Rom* rom, const resources::ArgumentParser& parser,
233 resources::OutputFormatter& formatter) override;
234
235 private:
236 std::unique_ptr<BuildTool> build_tool_;
237};
238
243 public:
244 std::string GetName() const override { return "build-status"; }
245
246 std::string GetDescription() const {
247 return "Get current build operation status";
248 }
249
250 std::string GetUsage() const override {
251 return "build-status [--build-dir <dir>]";
252 }
253
254 absl::Status ValidateArgs(const resources::ArgumentParser& parser) override;
255
256 absl::Status Execute(Rom* rom, const resources::ArgumentParser& parser,
257 resources::OutputFormatter& formatter) override;
258
259 private:
260 std::unique_ptr<BuildTool> build_tool_;
261};
262
263} // namespace tools
264} // namespace agent
265} // namespace cli
266} // namespace yaze
267
268#endif // YAZE_SRC_CLI_SERVICE_AGENT_TOOLS_BUILD_TOOL_H_
The Rom class is used to load, save, and modify Rom data. This is a generic SNES ROM container and do...
Definition rom.h:24
std::string GetUsage() const override
Get the command usage string.
Definition build_tool.h:202
absl::Status Execute(Rom *rom, const resources::ArgumentParser &parser, resources::OutputFormatter &formatter) override
Execute the command business logic.
std::string GetName() const override
Get the command name.
Definition build_tool.h:196
absl::Status ValidateArgs(const resources::ArgumentParser &parser) override
Validate command arguments.
std::string GetName() const override
Get the command name.
Definition build_tool.h:172
std::string GetUsage() const override
Get the command usage string.
Definition build_tool.h:178
absl::Status ValidateArgs(const resources::ArgumentParser &parser) override
Validate command arguments.
absl::Status Execute(Rom *rom, const resources::ArgumentParser &parser, resources::OutputFormatter &formatter) override
Execute the command business logic.
absl::Status Execute(Rom *rom, const resources::ArgumentParser &parser, resources::OutputFormatter &formatter) override
Execute the command business logic.
absl::Status ValidateArgs(const resources::ArgumentParser &parser) override
Validate command arguments.
std::string GetUsage() const override
Get the command usage string.
Definition build_tool.h:250
std::string GetName() const override
Get the command name.
Definition build_tool.h:244
std::string GetName() const override
Get the command name.
Definition build_tool.h:220
absl::Status Execute(Rom *rom, const resources::ArgumentParser &parser, resources::OutputFormatter &formatter) override
Execute the command business logic.
absl::Status ValidateArgs(const resources::ArgumentParser &parser) override
Validate command arguments.
std::string GetUsage() const override
Get the command usage string.
Definition build_tool.h:226
Build tool for AI agents to compile and test the project.
Definition build_tool.h:32
std::chrono::system_clock::time_point operation_start_time_
Definition build_tool.h:160
std::optional< BuildResult > GetLastResult() const
Get the last build result.
absl::StatusOr< BuildResult > Configure(const std::string &preset)
Configure the build system with a CMake preset.
Definition build_tool.cc:69
std::optional< BuildResult > last_result_
Definition build_tool.h:159
bool IsBuildDirectoryReady() const
Check if a build directory exists and is configured.
absl::StatusOr< BuildResult > ExecuteCommandInternal(const std::string &command, const std::chrono::seconds &timeout)
BuildStatus GetBuildStatus() const
Get current build status.
std::vector< std::string > ParsePresetsFile() const
std::string GetProjectRoot() const
std::string GetCurrentPlatform() const
absl::StatusOr< BuildResult > Clean()
Clean the build directory.
std::unique_ptr< std::thread > execution_thread_
Definition build_tool.h:161
std::atomic< bool > cancel_requested_
Definition build_tool.h:162
std::atomic< bool > is_running_
Definition build_tool.h:157
absl::StatusOr< BuildResult > ExecuteCommand(const std::string &command, const std::string &operation_name)
absl::Status CancelCurrentOperation()
Cancel the current build operation.
absl::StatusOr< BuildResult > Build(const std::string &target="", const std::string &config="")
Build a specific target or all targets.
bool IsPresetValid(const std::string &preset) const
void UpdateStatus(const std::string &operation, bool is_running)
std::vector< std::string > ListAvailablePresets() const
List available CMake presets.
absl::StatusOr< BuildResult > RunTests(const std::string &filter="", const std::string &rom_path="")
Run tests with optional filter.
Utility for parsing common CLI argument patterns.
Base class for CLI command handlers.
Utility for consistent output formatting across commands.
std::chrono::system_clock::time_point start_time
Definition build_tool.h:49