Building and Testing
Relevant source files
This section covers the build process, multi-target support, continuous integration pipeline, and testing procedures for the arm_pl031 crate. It provides developers with comprehensive information about how to build the crate for different target architectures, understand the automated testing infrastructure, and contribute to the project with confidence.
For information about setting up the development environment and contribution guidelines, see Development Environment. For details about the crate's API evolution and versioning, see API Evolution and Changelog.
Build System Overview
The arm_pl031 crate uses Cargo as its primary build system and is configured for cross-platform compilation with no_std compatibility. The crate supports both embedded and hosted environments through careful dependency management and feature flags.
Build Configuration
The build configuration is defined in [Cargo.toml(L1 - L20) ](https://github.com/arceos-org/arm_pl031/blob/8cc6761d/Cargo.toml#L1-L20) and emphasizes embedded-first design:
| Configuration | Value | Purpose |
|---|---|---|
| Edition | 2021 | Modern Rust features and patterns |
| Categories | os,hardware-support,no-std | Embedded systems focus |
| Default Features | chrono | DateTime support enabled by default |
| Optional Dependencies | chrono = "0.4.38" | DateTime integration without std |
flowchart TD
subgraph subGraph3["Build Outputs"]
LIB_NOSTD["libarm_pl031.rlib (no_std)"]
LIB_CHRONO["libarm_pl031.rlib (with chrono)"]
DOCS["target/doc/"]
end
subgraph subGraph2["Target Compilation"]
X86_LINUX["x86_64-unknown-linux-gnu"]
X86_NONE["x86_64-unknown-none"]
RISCV["riscv64gc-unknown-none-elf"]
AARCH64["aarch64-unknown-none-softfloat"]
end
subgraph subGraph1["Feature Resolution"]
NO_FEATURES["--no-default-features"]
DEFAULT["default = [chrono]"]
ALL_FEATURES["--all-features"]
end
subgraph subGraph0["Build Inputs"]
CARGO["Cargo.toml"]
SRC["src/lib.rs"]
CHRONO_SRC["src/chrono.rs"]
end
AARCH64 --> LIB_NOSTD
CARGO --> ALL_FEATURES
CARGO --> DEFAULT
CARGO --> NO_FEATURES
CHRONO_SRC --> ALL_FEATURES
CHRONO_SRC --> DEFAULT
DEFAULT --> AARCH64
DEFAULT --> RISCV
DEFAULT --> X86_LINUX
DEFAULT --> X86_NONE
NO_FEATURES --> AARCH64
NO_FEATURES --> RISCV
NO_FEATURES --> X86_LINUX
NO_FEATURES --> X86_NONE
RISCV --> LIB_NOSTD
SRC --> DEFAULT
SRC --> NO_FEATURES
X86_LINUX --> DOCS
X86_LINUX --> LIB_CHRONO
X86_LINUX --> LIB_NOSTD
X86_NONE --> LIB_NOSTD
Build System Architecture
Sources: [Cargo.toml(L1 - L20) ](https://github.com/arceos-org/arm_pl031/blob/8cc6761d/Cargo.toml#L1-L20)
Multi-Target Support
The crate is designed to work across multiple target architectures, with particular emphasis on embedded no_std environments. The CI system validates compatibility across four primary target configurations.
Supported Target Architectures
flowchart TD
subgraph subGraph5["Validation Steps"]
FMT_CHECK["cargo fmt --all -- --check"]
CLIPPY["cargo clippy --all-features"]
UNIT_TEST["cargo test"]
end
subgraph subGraph4["Build Commands"]
NO_FEAT["cargo build --no-default-features"]
ALL_FEAT["cargo build --all-features"]
end
subgraph subGraph3["ARM64 Embedded"]
AARCH64["aarch64-unknown-none-softfloat"]
end
subgraph subGraph2["RISC-V Embedded"]
RISCV["riscv64gc-unknown-none-elf"]
end
subgraph subGraph1["Bare Metal x86"]
X86_NONE["x86_64-unknown-none"]
end
subgraph subGraph0["Hosted Targets"]
LINUX["x86_64-unknown-linux-gnu"]
end
ALL_FEAT --> AARCH64
ALL_FEAT --> LINUX
ALL_FEAT --> RISCV
ALL_FEAT --> X86_NONE
CLIPPY --> LINUX
FMT_CHECK --> LINUX
NO_FEAT --> AARCH64
NO_FEAT --> LINUX
NO_FEAT --> RISCV
NO_FEAT --> X86_NONE
UNIT_TEST --> LINUX
Multi-Target Build Matrix
| Target | Purpose | Features Tested | Test Execution |
|---|---|---|---|
| x86_64-unknown-linux-gnu | Hosted development | All features, unit tests | Full test suite |
| x86_64-unknown-none | Bare metal x86 | Core functionality | Build verification |
| riscv64gc-unknown-none-elf | RISC-V embedded | Core functionality | Build verification |
| aarch64-unknown-none-softfloat | ARM64 embedded | Core functionality | Build verification |
Sources: [.github/workflows/ci.yml(L12) ](https://github.com/arceos-org/arm_pl031/blob/8cc6761d/.github/workflows/ci.yml#L12-L12) [.github/workflows/ci.yml(L25 - L29) ](https://github.com/arceos-org/arm_pl031/blob/8cc6761d/.github/workflows/ci.yml#L25-L29)
Continuous Integration Pipeline
The CI pipeline is implemented using GitHub Actions and provides comprehensive validation across multiple dimensions: code quality, build compatibility, and documentation generation.
CI Workflow Structure
flowchart TD
subgraph Documentation["Documentation"]
DOC_BUILD["cargo doc --no-deps --all-features"]
DEPLOY["JamesIves/github-pages-deploy-action@v4"]
end
subgraph Testing["Testing"]
UNIT_TEST["cargo test (x86_64-linux only)"]
end
subgraph subGraph3["Build Validation"]
BUILD_NO["cargo build --no-default-features"]
BUILD_ALL["cargo build --all-features"]
end
subgraph subGraph2["Quality Checks"]
VERSION["rustc --version --verbose"]
FORMAT["cargo fmt --all -- --check"]
LINT["cargo clippy --all-features"]
end
subgraph subGraph1["CI Job Matrix"]
RUST_VER["rust-toolchain: nightly"]
TARGET_MATRIX["4 target architectures"]
end
subgraph subGraph0["Trigger Events"]
PUSH["git push"]
PR["pull_request"]
end
BUILD_ALL --> UNIT_TEST
BUILD_NO --> BUILD_ALL
DOC_BUILD --> DEPLOY
FORMAT --> LINT
LINT --> BUILD_NO
PR --> RUST_VER
PUSH --> RUST_VER
RUST_VER --> DOC_BUILD
RUST_VER --> TARGET_MATRIX
TARGET_MATRIX --> VERSION
VERSION --> FORMAT
GitHub Actions CI Pipeline
Toolchain and Components
The CI system uses Rust nightly toolchain with specific components required for comprehensive validation:
| Component | Purpose | Usage |
|---|---|---|
| rust-src | Source code for cross-compilation | Required forno_stdtargets |
| clippy | Lint analysis | Code quality enforcement |
| rustfmt | Code formatting | Style consistency |
| nightlytoolchain | Latest Rust features | Embedded development support |
Sources: [.github/workflows/ci.yml(L17 - L19) ](https://github.com/arceos-org/arm_pl031/blob/8cc6761d/.github/workflows/ci.yml#L17-L19)
Testing Strategy
The testing approach balances comprehensive validation with practical constraints of embedded development, where some targets cannot execute tests directly.
Test Execution Matrix
flowchart TD
subgraph subGraph2["Test Commands"]
FMT_CMD["cargo fmt --all -- --check"]
CLIPPY_CMD["cargo clippy --target TARGET --all-features"]
BUILD_CMD["cargo build --target TARGET"]
TEST_CMD["cargo test --target TARGET -- --nocapture"]
end
subgraph subGraph1["Target Scope"]
ALL_TARGETS["All 4 targets"]
LINUX_ONLY["x86_64-unknown-linux-gnu only"]
end
subgraph subGraph0["Test Categories"]
FORMAT_TEST["Format Validation"]
LINT_TEST["Clippy Analysis"]
BUILD_TEST["Compilation Test"]
UNIT_TEST["Unit Test Execution"]
end
ALL_TARGETS --> BUILD_CMD
ALL_TARGETS --> CLIPPY_CMD
ALL_TARGETS --> FMT_CMD
BUILD_TEST --> ALL_TARGETS
FORMAT_TEST --> ALL_TARGETS
LINT_TEST --> ALL_TARGETS
LINUX_ONLY --> TEST_CMD
UNIT_TEST --> LINUX_ONLY
Testing Architecture by Target
Quality Assurance Steps
The CI pipeline enforces multiple quality gates to ensure code reliability and maintainability:
- Code Formatting: Enforced via [
cargo fmt --all -- --check](https://github.com/arceos-org/arm_pl031/blob/8cc6761d/cargo fmt --all -- --check) - Lint Analysis: Comprehensive clippy checks with [
-A clippy](https://github.com/arceos-org/arm_pl031/blob/8cc6761d/-A clippy#LNaN-LNaN) exception - Build Verification: Both minimal and full feature builds for each target
- Unit Testing: Executed only on
x86_64-unknown-linux-gnuwith--nocapturefor detailed output
Sources: [.github/workflows/ci.yml(L22 - L32) ](https://github.com/arceos-org/arm_pl031/blob/8cc6761d/.github/workflows/ci.yml#L22-L32)
Documentation Building and Deployment
The documentation system automatically generates and deploys API documentation to GitHub Pages, ensuring developers always have access to current documentation.
Documentation Pipeline
sequenceDiagram
participant Developer as "Developer"
participant GitHubActions as "GitHub Actions"
participant cargodoc as "cargo doc"
participant GitHubPages as "GitHub Pages"
Developer ->> GitHubActions: "Push to main branch"
GitHubActions ->> cargodoc: "cargo doc --no-deps --all-features"
Note over cargodoc: "RUSTDOCFLAGS=-D broken_intra_doc_links"
cargodoc ->> cargodoc: "Generate target/doc/"
cargodoc ->> cargodoc: "Create redirect index.html"
GitHubActions ->> GitHubPages: "Deploy via JamesIves/github-pages-deploy-action@v4"
Note over GitHubPages: "Single commit deployment to gh-pages branch"
Documentation Deployment Workflow
Documentation Configuration
The documentation build process includes several quality controls:
| Setting | Value | Purpose |
|---|---|---|
| RUSTDOCFLAGS | -D rustdoc::broken_intra_doc_links -D missing-docs | Enforce documentation completeness |
| --no-deps | Skip dependency docs | Focus on crate-specific documentation |
| --all-features | Include all features | Document complete API surface |
| single-commit | True | Clean deployment history |
The system automatically generates a redirect index page using the crate name extracted from [cargo tree](https://github.com/arceos-org/arm_pl031/blob/8cc6761d/cargo tree) ensuring seamless navigation to the main documentation.
Sources: [.github/workflows/ci.yml(L34 - L58) ](https://github.com/arceos-org/arm_pl031/blob/8cc6761d/.github/workflows/ci.yml#L34-L58) [.github/workflows/ci.yml(L42) ](https://github.com/arceos-org/arm_pl031/blob/8cc6761d/.github/workflows/ci.yml#L42-L42) [.github/workflows/ci.yml(L48 - L50) ](https://github.com/arceos-org/arm_pl031/blob/8cc6761d/.github/workflows/ci.yml#L48-L50)
Build Commands Reference
For local development and testing, the following commands replicate the CI environment:
Basic Build Commands
# Minimal build (no chrono feature)
cargo build --no-default-features
# Full build (all features)
cargo build --all-features
# Target-specific build
cargo build --target aarch64-unknown-none-softfloat
Quality Assurance Commands
# Format check
cargo fmt --all -- --check
# Lint analysis
cargo clippy --all-features -- -A clippy::new_without_default
# Unit tests
cargo test -- --nocapture
Documentation Commands
# Generate documentation
cargo doc --no-deps --all-features
# Open documentation locally
cargo doc --no-deps --all-features --open
Sources: [.github/workflows/ci.yml(L23 - L32) ](https://github.com/arceos-org/arm_pl031/blob/8cc6761d/.github/workflows/ci.yml#L23-L32) [.github/workflows/ci.yml(L49) ](https://github.com/arceos-org/arm_pl031/blob/8cc6761d/.github/workflows/ci.yml#L49-L49)