Requirement Document
Design Goals
Design a modular, ergonomic, and universal build tool
Module Management
- Module-by-module
- Support submodules
Ergonomics
Choose script/configuration
- Build
- Run
- Debug
- Deploy
- …
Thermal Heavy Load
- Reload by module hot
- Reload by file hot
- Custom thermal heavy loads
Universal
I18n (Internationalization)
- Customize localized text
Languages
- Rust
- C
- C++
- Zig
Platforms
- Linux
- Windows
- MacOS
Views
(abuild-lib) API
(abuild-cli) CLI
(abuild-cli) Console View
(abuild/vscode-extension) VS Code Extension
(abuild/idea-extension) JetBrains IEDA Extension
Design Document
Architecture
1. Overall Architecture
%%{
init: {
'theme': 'redux dark',
}
}%%
graph BT
classDef core fill:#828, stroke: #f8f, stroke-width:2px, color: #fff;
classDef std fill:#228, stroke: #88f,stroke-width:2px, color: #fff;
classDef interface fill:#822, stroke: #f88,stroke-width:2px,stroke-dasharray: 5 5, color: #fff;
classDef crate fill:#882, stroke: #ff8,stroke-width:2px, color: #fff;
classDef tool fill:#282, stroke: #8f8,stroke-width:2px, color: #fff;
classDef function fill:#288, stroke: #8ff,stroke-width:2px, color: #fff;
classDef view fill:#852, stroke: #fb8,stroke-width:2px, color: #fff;
linkStyle default stroke:#fff, stroke-width:1px;
STD:::std
Core:::core
Tools:::tool
Functions:::function
View:::view
Crates:::crate
View --> Functions --> Tools & STD & Crates --> Core
Functions allows STD and Crate to be used by Tools through interfaces within Core.
2. Core
2.1 Profile
%%{
init: {
'theme': 'redux dark',
}
}%%
graph BT
classDef core fill:#828, stroke: #f8f, stroke-width:2px, color: #fff;
classDef std fill:#228, stroke: #88f,stroke-width:2px, color: #fff;
classDef interface fill:#822, stroke: #f88,stroke-width:2px,stroke-dasharray: 5 5, color: #fff;
classDef crate fill:#882, stroke: #ff8,stroke-width:2px, color: #fff;
classDef tool fill:#282, stroke: #8f8,stroke-width:2px, color: #fff;
classDef function fill:#288, stroke: #8ff,stroke-width:2px, color: #fff;
classDef view fill:#852, stroke: #fb8,stroke-width:2px, color: #fff;
linkStyle default stroke:#fff, stroke-width:1px;
Profile{Profile}:::interface
subgraph Language Profiles
CProfile:::core
CPPProfile:::core
RustProfile:::core
GDScriptProfile:::core
end
CProfile & CPPProfile & RustProfile & GDScriptProfile --o Profile
%%{
init: {
'theme': 'redux dark',
}
}%%
graph BT
classDef core fill:#828, stroke: #f8f, stroke-width:2px, color: #fff;
classDef std fill:#228, stroke: #88f,stroke-width:2px, color: #fff;
classDef interface fill:#822, stroke: #f88,stroke-width:2px,stroke-dasharray: 5 5, color: #fff;
classDef crate fill:#882, stroke: #ff8,stroke-width:2px, color: #fff;
classDef tool fill:#282, stroke: #8f8,stroke-width:2px, color: #fff;
classDef function fill:#288, stroke: #8ff,stroke-width:2px, color: #fff;
classDef view fill:#852, stroke: #fb8,stroke-width:2px, color: #fff;
linkStyle default stroke:#fff, stroke-width:1px;
Profile{Profile}:::interface
subgraph Target Profiles
TargetProfile:::core
GDExtensionExportProfile:::core
end
TargetProfile & GDExtensionExportProfile --o Profile
2.2 Module
%%{
init: {
'theme': 'redux dark',
}
}%%
graph BT
classDef core fill:#828, stroke: #f8f, stroke-width:2px, color: #fff;
classDef std fill:#228, stroke: #88f,stroke-width:2px, color: #fff;
classDef interface fill:#822, stroke: #f88,stroke-width:2px,stroke-dasharray: 5 5, color: #fff;
classDef crate fill:#882, stroke: #ff8,stroke-width:2px, color: #fff;
classDef tool fill:#282, stroke: #8f8,stroke-width:2px, color: #fff;
classDef function fill:#288, stroke: #8ff,stroke-width:2px, color: #fff;
classDef view fill:#852, stroke: #fb8,stroke-width:2px, color: #fff;
linkStyle default stroke:#fff, stroke-width:1px;
subgraph Modules
ModuleModel:::core
Module{Module}:::interface
ModuleFiles{ModuleFiles}:::interface
ModuleChilds{ModuleChilds}:::interface
end
ModuleFiles --> AsyncRead & AsyncWrite
ModuleModel --o Module
Module --o ModuleChilds & ModuleFiles
3. Tools
%%{
init: {
'theme': 'redux dark',
}
}%%
graph BT
classDef core fill:#828, stroke: #f8f, stroke-width:2px, color: #fff;
classDef std fill:#228, stroke: #88f,stroke-width:2px, color: #fff;
classDef interface fill:#822, stroke: #f88,stroke-width:2px,stroke-dasharray: 5 5, color: #fff;
classDef crate fill:#882, stroke: #ff8,stroke-width:2px, color: #fff;
classDef tool fill:#282, stroke: #8f8,stroke-width:2px, color: #fff;
classDef function fill:#288, stroke: #8ff,stroke-width:2px, color: #fff;
classDef view fill:#852, stroke: #fb8,stroke-width:2px, color: #fff;
linkStyle default stroke:#fff, stroke-width:1px;
Core:::core
subgraph Tools
Build:::tool
Clean:::tool
Run:::tool
Init:::tool
end
Tools --> Core
3.1 Build
%%{
init: {
'theme': 'redux dark',
}
}%%
graph BT
classDef core fill:#828, stroke: #f8f, stroke-width:2px, color: #fff;
classDef std fill:#228, stroke: #88f,stroke-width:2px, color: #fff;
classDef interface fill:#822, stroke: #f88,stroke-width:2px,stroke-dasharray: 5 5, color: #fff;
classDef crate fill:#882, stroke: #ff8,stroke-width:2px, color: #fff;
classDef tool fill:#282, stroke: #8f8,stroke-width:2px, color: #fff;
classDef function fill:#288, stroke: #8ff,stroke-width:2px, color: #fff;
classDef view fill:#852, stroke: #fb8,stroke-width:2px, color: #fff;
linkStyle default stroke:#fff, stroke-width:1px;
Core:::core
subgraph Build
BuildPipelines[Build Pipelines]:::tool
Compilers:::tool
Linkers:::tool
BuildBackends[Build Backends]:::tool
end
Build --> Core
3.1.1 Build Pipelines
%%{
init: {
'theme': 'redux dark',
}
}%%
graph BT
classDef core fill:#828, stroke: #f8f, stroke-width:2px, color: #fff;
classDef std fill:#228, stroke: #88f,stroke-width:2px, color: #fff;
classDef interface fill:#822, stroke: #f88,stroke-width:2px,stroke-dasharray: 5 5, color: #fff;
classDef crate fill:#882, stroke: #ff8,stroke-width:2px, color: #fff;
classDef tool fill:#282, stroke: #8f8,stroke-width:2px, color: #fff;
classDef function fill:#288, stroke: #8ff,stroke-width:2px, color: #fff;
classDef view fill:#852, stroke: #fb8,stroke-width:2px, color: #fff;
linkStyle default stroke:#fff, stroke-width:1px;
Profile:::core
subgraph Core
ModuleFiles{ModuleFiles}:::interface
end
CompilerFactory:::tool
LinkerFactory:::tool
subgraph Build Pipelines
BuildPipeline{BuildPipeline}:::interface
DefaultBuildPipeline:::tool
BuildPipelineFactory:::tool
end
BuildPipelineFactory --> DefaultBuildPipeline ---> CompilerFactory & LinkerFactory
BuildPipeline -----> Profile & ModuleFiles
DefaultBuildPipeline --o BuildPipeline
3.1.2 Build Backends
%%{
init: {
'theme': 'redux dark',
}
}%%
graph BT
classDef core fill:#828, stroke: #f8f, stroke-width:2px, color: #fff;
classDef std fill:#228, stroke: #88f,stroke-width:2px, color: #fff;
classDef interface fill:#822, stroke: #f88,stroke-width:2px,stroke-dasharray: 5 5, color: #fff;
classDef crate fill:#882, stroke: #ff8,stroke-width:2px, color: #fff;
classDef tool fill:#282, stroke: #8f8,stroke-width:2px, color: #fff;
classDef function fill:#288, stroke: #8ff,stroke-width:2px, color: #fff;
classDef view fill:#852, stroke: #fb8,stroke-width:2px, color: #fff;
linkStyle default stroke:#fff, stroke-width:1px;
subgraph Backend
CargoBackend:::tool
MakefileBackend:::tool
NinjaBackend:::tool
CMakeBackend:::tool
end
3.1.3 Compilers
%%{
init: {
'theme': 'redux dark',
}
}%%
graph BT
classDef core fill:#828, stroke: #f8f, stroke-width:2px, color: #fff;
classDef std fill:#228, stroke: #88f,stroke-width:2px, color: #fff;
classDef interface fill:#822, stroke: #f88,stroke-width:2px,stroke-dasharray: 5 5, color: #fff;
classDef crate fill:#882, stroke: #ff8,stroke-width:2px, color: #fff;
classDef tool fill:#282, stroke: #8f8,stroke-width:2px, color: #fff;
classDef function fill:#288, stroke: #8ff,stroke-width:2px, color: #fff;
classDef view fill:#852, stroke: #fb8,stroke-width:2px, color: #fff;
linkStyle default stroke:#fff, stroke-width:1px;
subgraph Compilers
Compiler{Compiler}:::interface
GCC:::tool
Clang:::tool
MSVC:::tool
Rustc:::tool
CompilerFactory:::tool
end
CompilerFactory --> GCC & Clang & MSVC & Rustc --o Compiler
3.1.4 Linkers
%%{
init: {
'theme': 'redux dark',
}
}%%
graph BT
classDef core fill:#828, stroke: #f8f, stroke-width:2px, color: #fff;
classDef std fill:#228, stroke: #88f,stroke-width:2px, color: #fff;
classDef interface fill:#822, stroke: #f88,stroke-width:2px,stroke-dasharray: 5 5, color: #fff;
classDef crate fill:#882, stroke: #ff8,stroke-width:2px, color: #fff;
classDef tool fill:#282, stroke: #8f8,stroke-width:2px, color: #fff;
classDef function fill:#288, stroke: #8ff,stroke-width:2px, color: #fff;
classDef view fill:#852, stroke: #fb8,stroke-width:2px, color: #fff;
linkStyle default stroke:#fff, stroke-width:1px;
subgraph Linkers
Linker{Linker}:::interface
LLVMLinker:::tool
LinkerFactory:::tool
end
LinkerFactory --> LLVMLinker --o Linker
3.2 Clean
%%{
init: {
'theme': 'redux dark',
}
}%%
graph BT
classDef core fill:#828, stroke: #f8f, stroke-width:2px, color: #fff;
classDef std fill:#228, stroke: #88f,stroke-width:2px, color: #fff;
classDef interface fill:#822, stroke: #f88,stroke-width:2px,stroke-dasharray: 5 5, color: #fff;
classDef crate fill:#882, stroke: #ff8,stroke-width:2px, color: #fff;
classDef tool fill:#282, stroke: #8f8,stroke-width:2px, color: #fff;
classDef function fill:#288, stroke: #8ff,stroke-width:2px, color: #fff;
classDef view fill:#852, stroke: #fb8,stroke-width:2px, color: #fff;
linkStyle default stroke:#fff, stroke-width:1px;
subgraph Core
ModuleFiles{ModuleFiles}:::interface
end
subgraph Clean
ModuleCleaner{ModuleCleaner}:::interface
DefaultCleaner:::tool
ModuleCleanerFactory:::tool
end
ModuleCleanerFactory --> DefaultCleaner --o ModuleCleaner ---> ModuleFiles
3.3 Run
%%{
init: {
'theme': 'redux dark',
}
}%%
graph BT
classDef core fill:#828, stroke: #f8f, stroke-width:2px, color: #fff;
classDef std fill:#228, stroke: #88f,stroke-width:2px, color: #fff;
classDef interface fill:#822, stroke: #f88,stroke-width:2px,stroke-dasharray: 5 5, color: #fff;
classDef crate fill:#882, stroke: #ff8,stroke-width:2px, color: #fff;
classDef tool fill:#282, stroke: #8f8,stroke-width:2px, color: #fff;
classDef function fill:#288, stroke: #8ff,stroke-width:2px, color: #fff;
classDef view fill:#852, stroke: #fb8,stroke-width:2px, color: #fff;
linkStyle default stroke:#fff, stroke-width:1px;
subgraph Core
ModuleFiles{ModuleFiles}:::interface
end
subgraph Run
ModuleRunner{ModuleRunner}:::interface
DefaultRunner:::tool
ModuleRunnerFactory:::tool
end
ModuleRunnerFactory --> DefaultRunner --o ModuleRunner ---> ModuleFiles
3.4 Init
%%{
init: {
'theme': 'redux dark',
}
}%%
graph BT
classDef core fill:#828, stroke: #f8f, stroke-width:2px, color: #fff;
classDef std fill:#228, stroke: #88f,stroke-width:2px, color: #fff;
classDef interface fill:#822, stroke: #f88,stroke-width:2px,stroke-dasharray: 5 5, color: #fff;
classDef crate fill:#882, stroke: #ff8,stroke-width:2px, color: #fff;
classDef tool fill:#282, stroke: #8f8,stroke-width:2px, color: #fff;
classDef function fill:#288, stroke: #8ff,stroke-width:2px, color: #fff;
classDef view fill:#852, stroke: #fb8,stroke-width:2px, color: #fff;
linkStyle default stroke:#fff, stroke-width:1px;
subgraph Core
Module{Module}:::interface
end
subgraph Init
ModuleInit{ModuleInit}:::interface
DefaultInit:::tool
GDExtensionInit:::tool
ModuleInitFactory:::tool
end
ModuleInitFactory --> DefaultInit & GDExtensionInit --o ModuleInit --> Module
4. Functions
%%{
init: {
'theme': 'redux dark',
}
}%%
graph BT
classDef core fill:#828, stroke: #f8f, stroke-width:2px, color: #fff;
classDef std fill:#228, stroke: #88f,stroke-width:2px, color: #fff;
classDef interface fill:#822, stroke: #f88,stroke-width:2px,stroke-dasharray: 5 5, color: #fff;
classDef crate fill:#882, stroke: #ff8,stroke-width:2px, color: #fff;
classDef tool fill:#282, stroke: #8f8,stroke-width:2px, color: #fff;
classDef function fill:#288, stroke: #8ff,stroke-width:2px, color: #fff;
classDef view fill:#852, stroke: #fb8,stroke-width:2px, color: #fff;
linkStyle default stroke:#fff, stroke-width:1px;
ModuleInitFactory:::tool
ModuleRunnerFactory:::tool
ModuleCleanerFactory:::tool
BuildPipelineFactory:::tool
subgraph Functions
ModuleManager:::function
end
ModuleManager ---> ModuleInitFactory & BuildPipelineFactory & ModuleCleanerFactory & ModuleRunnerFactory
5. Views
%%{
init: {
'theme': 'redux dark',
}
}%%
graph BT
classDef core fill:#828, stroke: #f8f, stroke-width:2px, color: #fff;
classDef std fill:#228, stroke: #88f,stroke-width:2px, color: #fff;
classDef interface fill:#822, stroke: #f88,stroke-width:2px,stroke-dasharray: 5 5, color: #fff;
classDef crate fill:#882, stroke: #ff8,stroke-width:2px, color: #fff;
classDef tool fill:#282, stroke: #8f8,stroke-width:2px, color: #fff;
classDef function fill:#288, stroke: #8ff,stroke-width:2px, color: #fff;
classDef view fill:#852, stroke: #fb8,stroke-width:2px, color: #fff;
linkStyle default stroke:#fff, stroke-width:1px;
ModuleManager:::function
subgraph Views
Presenter:::view
CLI:::view
ConsoleView:::view
VSCodeExtension:::view
end
CLI & Presenter --> ModuleManager
ConsoleView & VSCodeExtension --> Presenter
Code Specification
-
Formatting: Automatic formatting based on
rustfmt; code within macros must also adhere to this specification. -
Code Quality: Based on
cargo-clippy; all warnings are treated as errors in CI.