Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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

  1. Reload by module hot
  2. Reload by file hot
  3. 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.