Development Guide
Relevant source files
This page provides an overview of the development workflow, tools, and processes for contributing to the arm_gicv2 crate. It covers the essential information developers need to understand the build system, quality assurance processes, and deployment pipeline.
For detailed information about specific aspects of development, see the following sub-sections:
- Build system configuration and dependency management: Build System and Dependencies
- Automated testing and deployment processes: CI/CD Pipeline
- Setting up your local development environment: Development Environment
Development Overview
The arm_gicv2 crate follows modern Rust development practices with automated quality assurance and documentation deployment. The development workflow centers around a no_std compatible library that provides hardware abstraction for ARM Generic Interrupt Controller v2 across multiple target architectures.
Core Development Tools and Dependencies
The development ecosystem relies on several key components that work together to ensure code quality and compatibility:
Development Tool Chain
flowchart TD
subgraph subGraph3["Package Configuration"]
PackageName["arm_gicv2"]
Version["0.1.0"]
License["GPL-3.0-or-later OR Apache-2.0 OR MulanPSL-2.0"]
Categories["embedded, no-std, hardware-support, os"]
end
subgraph subGraph2["Target Architectures"]
Linux["x86_64-unknown-linux-gnu"]
Bare["x86_64-unknown-none"]
RISCV["riscv64gc-unknown-none-elf"]
AArch64["aarch64-unknown-none-softfloat"]
end
subgraph subGraph1["Quality Tools"]
Rustfmt["rustfmt"]
Clippy["clippy"]
Rustdoc["rustdoc"]
Tests["cargo test"]
end
subgraph subGraph0["Core Tools"]
Rust["rustc nightly"]
Cargo["cargo build system"]
TockRegs["tock-registers 0.8"]
end
Cargo --> AArch64
Cargo --> Bare
Cargo --> Clippy
Cargo --> Linux
Cargo --> RISCV
Cargo --> Rustdoc
Cargo --> Rustfmt
Cargo --> Tests
Categories --> Cargo
License --> Cargo
PackageName --> Cargo
Rust --> Cargo
TockRegs --> Cargo
Version --> Cargo
Sources: Cargo.toml(L1 - L16) .github/workflows/ci.yml(L11 - L19)
Automated Development Lifecycle
The project implements a comprehensive CI/CD pipeline that ensures code quality and deploys documentation automatically:
CI/CD Workflow
flowchart TD
subgraph subGraph4["Environment Variables"]
DefaultBranch["default-branch"]
RustDocFlags["RUSTDOCFLAGS: -D rustdoc::broken_intra_doc_links -D missing-docs"]
end
subgraph Documentation["Documentation"]
DocBuild["cargo doc --no-deps --all-features"]
IndexGen["printf redirect to index.html"]
GHPagesDeploy["JamesIves/github-pages-deploy-action@v4"]
end
subgraph subGraph2["Quality Checks"]
VersionCheck["rustc --version --verbose"]
FormatCheck["cargo fmt --all -- --check"]
ClippyCheck["cargo clippy --target TARGET --all-features"]
BuildCheck["cargo build --target TARGET --all-features"]
UnitTest["cargo test --target x86_64-unknown-linux-gnu"]
end
subgraph subGraph1["CI Job Matrix"]
Toolchain["rust-toolchain: nightly"]
Target1["x86_64-unknown-linux-gnu"]
Target2["x86_64-unknown-none"]
Target3["riscv64gc-unknown-none-elf"]
Target4["aarch64-unknown-none-softfloat"]
end
subgraph subGraph0["Trigger Events"]
Push["git push"]
PR["pull_request"]
end
BuildCheck --> UnitTest
ClippyCheck --> BuildCheck
DefaultBranch --> GHPagesDeploy
DocBuild --> IndexGen
FormatCheck --> ClippyCheck
IndexGen --> GHPagesDeploy
PR --> Toolchain
Push --> Toolchain
RustDocFlags --> DocBuild
Target1 --> DocBuild
Target1 --> VersionCheck
Toolchain --> Target1
Toolchain --> Target2
Toolchain --> Target3
Toolchain --> Target4
VersionCheck --> FormatCheck
Sources: .github/workflows/ci.yml(L1 - L56)
Package Metadata and Configuration
The crate is configured as a library package with specific metadata that defines its purpose and compatibility:
| Configuration | Value | Purpose |
|---|---|---|
| name | arm_gicv2 | Crate identifier for Cargo registry |
| version | 0.1.0 | Semantic versioning for API compatibility |
| edition | 2021 | Rust language edition features |
| authors | Yuekai Jia equation618@gmail.com | Primary maintainer contact |
| description | ARM Generic Interrupt Controller version 2 (GICv2) register definitions and basic operations | Crate purpose summary |
| license | GPL-3.0-or-later OR Apache-2.0 OR MulanPSL-2.0 | Multi-license compatibility |
| keywords | arceos, arm, aarch64, gic, interrupt-controller | Discovery and categorization |
| categories | embedded, no-std, hardware-support, os | Cargo registry classification |
Sources: Cargo.toml(L1 - L12)
Key Development Characteristics
No-std Compatibility
The crate is designed for no_std environments, making it suitable for bare-metal development, embedded systems, and operating system kernels. This is reflected in the target architecture support and category classifications.
Multi-target Support
Development and testing occur across four distinct target architectures:
x86_64-unknown-linux-gnu: Standard Linux development and testingx86_64-unknown-none: Bare-metal x86_64 systemsriscv64gc-unknown-none-elf: RISC-V 64-bit bare-metal systemsaarch64-unknown-none-softfloat: ARM64 bare-metal with software floating point
Single Dependency
The crate maintains minimal external dependencies with only tock-registers = "0.8" providing type-safe register access abstractions. This design choice supports the embedded and bare-metal use cases where dependency minimization is critical.
Sources: Cargo.toml(L14 - L15) .github/workflows/ci.yml(L12)