Building and Testing
Relevant source files
This page covers how to set up a local development environment for the handler_table crate, including building, testing, and code quality verification. The build process is designed to support multiple target architectures, including bare metal environments required for ArceOS integration.
For information about the automated CI/CD pipeline and deployment process, see CI/CD Pipeline.
Prerequisites
The handler_table crate requires specific toolchain components and target platforms to build successfully across all supported architectures.
Required Rust Toolchain
The crate requires the nightly Rust toolchain with specific components:
| Component | Purpose |
|---|---|
| rust-src | Source code for cross-compilation to bare metal targets |
| clippy | Lint checking for code quality |
| rustfmt | Code formatting verification |
Supported Target Architectures
The crate builds for multiple target platforms as defined in the CI matrix:
| Target | Environment | Test Support |
|---|---|---|
| x86_64-unknown-linux-gnu | Linux development | ✅ Full testing |
| x86_64-unknown-none | Bare metal x86_64 | ✅ Build only |
| riscv64gc-unknown-none-elf | Bare metal RISC-V | ✅ Build only |
| aarch64-unknown-none-softfloat | Bare metal ARM64 | ✅ Build only |
Build and Test Workflow
flowchart TD
subgraph subGraph0["Target Matrix"]
Linux["x86_64-unknown-linux-gnu"]
BareX86["x86_64-unknown-none"]
RISCV["riscv64gc-unknown-none-elf"]
ARM64["aarch64-unknown-none-softfloat"]
end
Setup["Rust Toolchain Setup"]
Fmt["cargo fmt --check"]
Clippy["cargo clippy"]
Build["cargo build"]
Test["cargo test"]
Doc["cargo doc"]
Build --> ARM64
Build --> BareX86
Build --> Linux
Build --> RISCV
Build --> Test
Clippy --> Build
Fmt --> Clippy
Setup --> Fmt
Test --> Doc
Test --> Linux
Sources: .github/workflows/ci.yml(L11 - L19) .github/workflows/ci.yml(L22 - L30)
Local Development Setup
Installing Required Components
Install the nightly toolchain and required components:
# Install nightly toolchain
rustup toolchain install nightly
# Add required components
rustup component add --toolchain nightly rust-src clippy rustfmt
# Add target platforms
rustup target add --toolchain nightly x86_64-unknown-none
rustup target add --toolchain nightly riscv64gc-unknown-none-elf
rustup target add --toolchain nightly aarch64-unknown-none-softfloat
Setting Default Toolchain
Set nightly as the default for the project:
rustup override set nightly
Verify the installation:
rustc --version --verbose
Sources: .github/workflows/ci.yml(L15 - L21)
Building the Crate
Standard Build
Build for the default target (host platform):
cargo build --all-features
Multi-Target Building
Build for specific target architectures:
# Linux target (default)
cargo build --target x86_64-unknown-linux-gnu --all-features
# Bare metal x86_64
cargo build --target x86_64-unknown-none --all-features
# Bare metal RISC-V
cargo build --target riscv64gc-unknown-none-elf --all-features
# Bare metal ARM64
cargo build --target aarch64-unknown-none-softfloat --all-features
Multi-Target Build Process
flowchart TD
subgraph subGraph1["Build Artifacts"]
LinuxLib["libhandler_table-*.rlib"]
BareX86Lib["libhandler_table-*.rlib"]
RISCVLib["libhandler_table-*.rlib"]
ARM64Lib["libhandler_table-*.rlib"]
end
subgraph subGraph0["Build Targets"]
Linux["x86_64-unknown-linux-gnu"]
BareX86["x86_64-unknown-none"]
RISCV["riscv64gc-unknown-none-elf"]
ARM64["aarch64-unknown-none-softfloat"]
end
Source["src/lib.rs"]
Cargo["Cargo.toml"]
ARM64 --> ARM64Lib
BareX86 --> BareX86Lib
Cargo --> ARM64
Cargo --> BareX86
Cargo --> Linux
Cargo --> RISCV
Linux --> LinuxLib
RISCV --> RISCVLib
Source --> ARM64
Source --> BareX86
Source --> Linux
Source --> RISCV
Sources: .github/workflows/ci.yml(L26 - L27)
Running Tests
Unit Tests
Unit tests can only be executed on the x86_64-unknown-linux-gnu target due to the no_std nature of the crate and bare metal target limitations:
cargo test --target x86_64-unknown-linux-gnu -- --nocapture
The --nocapture flag allows println! statements in tests to be visible during test execution.
Test Limitations
| Target | Test Support | Reason |
|---|---|---|
| x86_64-unknown-linux-gnu | ✅ Full | Standard library available |
| x86_64-unknown-none | ❌ None | No test framework in bare metal |
| riscv64gc-unknown-none-elf | ❌ None | No test framework in bare metal |
| aarch64-unknown-none-softfloat | ❌ None | No test framework in bare metal |
Sources: .github/workflows/ci.yml(L28 - L30)
Code Quality Checks
Format Checking
Verify code formatting compliance:
cargo fmt --all -- --check
This command checks that all code follows the standard Rust formatting rules without modifying files.
Lint Checking
Run Clippy for all targets:
# Check specific target
cargo clippy --target x86_64-unknown-linux-gnu --all-features
cargo clippy --target x86_64-unknown-none --all-features
cargo clippy --target riscv64gc-unknown-none-elf --all-features
cargo clippy --target aarch64-unknown-none-softfloat --all-features
Code Quality Pipeline
flowchart TD
subgraph Results["Results"]
FmtOK["Format ✅"]
LintOK["Lint ✅"]
QualityOK["Quality Approved"]
end
subgraph subGraph0["Quality Checks"]
Fmt["cargo fmt --check"]
ClippyLinux["clippy x86_64-linux"]
ClippyBare["clippy x86_64-none"]
ClippyRISCV["clippy riscv64gc"]
ClippyARM["clippy aarch64"]
end
Code["Source Code"]
ClippyARM --> LintOK
ClippyBare --> LintOK
ClippyLinux --> LintOK
ClippyRISCV --> LintOK
Code --> ClippyARM
Code --> ClippyBare
Code --> ClippyLinux
Code --> ClippyRISCV
Code --> Fmt
Fmt --> FmtOK
FmtOK --> QualityOK
LintOK --> QualityOK
Sources: .github/workflows/ci.yml(L22 - L25)
Documentation Generation
Building Documentation
Generate crate documentation:
cargo doc --no-deps --all-features
The --no-deps flag excludes dependency documentation, focusing only on the handler_table crate.
Documentation Configuration
The documentation build process uses specific RUSTDOCFLAGS for strict documentation requirements:
export RUSTDOCFLAGS="-D rustdoc::broken_intra_doc_links -D missing-docs"
cargo doc --no-deps --all-features
| Flag | Purpose |
|---|---|
| -D rustdoc::broken_intra_doc_links | Fail on broken internal documentation links |
| -D missing-docs | Fail on missing documentation comments |
Viewing Documentation
After building, documentation is available at:
target/doc/handler_table/index.html
Sources: .github/workflows/ci.yml(L40) .github/workflows/ci.yml(L44 - L48)
Development Workflow
Complete Development Cycle
A typical development workflow combines all verification steps:
# 1. Format check
cargo fmt --all -- --check
# 2. Lint check for primary target
cargo clippy --target x86_64-unknown-linux-gnu --all-features
# 3. Build all targets
cargo build --target x86_64-unknown-linux-gnu --all-features
cargo build --target x86_64-unknown-none --all-features
cargo build --target riscv64gc-unknown-none-elf --all-features
cargo build --target aarch64-unknown-none-softfloat --all-features
# 4. Run tests
cargo test --target x86_64-unknown-linux-gnu -- --nocapture
# 5. Generate documentation
cargo doc --no-deps --all-features
Ignored Files
The development environment excludes certain files and directories from version control:
| Path | Purpose |
|---|---|
| /target | Build artifacts and compiled output |
| /.vscode | Visual Studio Code configuration |
| .DS_Store | macOS system files |
| Cargo.lock | Dependency lock file (library crate) |
Sources: .gitignore(L1 - L4)