fix(app): preserve featureless build support

The shared with_shutdown_flag helper, and the AtomicBool/Arc/
install_signal_handler imports it uses, only exist when at least one
applet feature (client, server, tui) is enabled. Gate them accordingly
instead of leaving them unconditionally compiled, which broke
`--no-default-features` workspace CI under -D warnings (unused
function/dead-code).

Also correct the README installation section: tui is already part of
the default feature set, so an ordinary `cargo install` already
produces irtt-tui alongside the other three binaries. Document a
lightweight `--no-default-features --features client` install instead
of the previous (incorrect) framing of tui as an opt-in extra, and fix
the same gap in the binaries/features table.
This commit is contained in:
Nils Andreas Svee committed 2026-08-20 12:01:07 +07:00
1 parent 7bea3dd54e
commit d71503e4fd
2 files changed
+15 -16

No files matched your search

+8 -6
View File
@@ -38,12 +38,14 @@ This installs:
* `irtt-rs`, the canonical multi-applet dispatcher * `irtt-rs`, the canonical multi-applet dispatcher
* `irtt-client`, the stream and text client * `irtt-client`, the stream and text client
* `irtt-tui`, the terminal UI
* `irtt-server`, the UDP server * `irtt-server`, the UDP server
To also install the optional terminal UI: Each applet can also be built in isolation with `--no-default-features` plus
the applet's own feature. For example, a lightweight client-only install:
```sh ```sh
cargo install --path crates/irtt-app --features tui cargo install --path crates/irtt-app --no-default-features --features client
``` ```
## Quick start ## Quick start
@@ -312,12 +314,12 @@ synchronous callers. Callers that already own Tokio can drive
## Binaries and features ## Binaries and features
| Build | Binaries | | Build | Binaries |
| ----------------------------------------- | ------------------------------------------------- | | -------------------------------------------- | --------------------------------------------------- |
| `--no-default-features` | `irtt-rs` | | `--no-default-features` | `irtt-rs` |
| `--no-default-features --features client` | `irtt-rs`, `irtt-client` |
| `--no-default-features --features server` | `irtt-rs`, `irtt-server` | | `--no-default-features --features server` | `irtt-rs`, `irtt-server` |
| Default features | `irtt-rs`, `irtt-client`, `irtt-server` | | `--no-default-features --features tui` | `irtt-rs`, `irtt-tui` |
| `--features tui` | `irtt-rs`, `irtt-client`, `irtt-server`, `irtt-tui` | | Default features (or `--all-features`) | `irtt-rs`, `irtt-client`, `irtt-tui`, `irtt-server` |
| `--all-features` | `irtt-rs`, `irtt-client`, `irtt-server`, `irtt-tui` |
`irtt-client` requires the `client` feature, `irtt-server` the `server` feature, `irtt-client` requires the `client` feature, `irtt-server` the `server` feature,
and `irtt-tui` the `tui` feature. The `irtt-rs` dispatcher is always built, and and `irtt-tui` the `tui` feature. The `irtt-rs` dispatcher is always built, and
+7 -10
View File
@@ -1,14 +1,10 @@
use std::{ #[cfg(any(feature = "client", feature = "server", feature = "tui"))]
env, use std::sync::{atomic::AtomicBool, Arc};
ffi::OsString, use std::{env, ffi::OsString, process::ExitCode};
process::ExitCode,
sync::{atomic::AtomicBool, Arc},
};
use crate::{ use crate::applet::{dispatch_from_argv, AppletDispatch, RequestedApplet};
applet::{dispatch_from_argv, AppletDispatch, RequestedApplet}, #[cfg(any(feature = "client", feature = "server", feature = "tui"))]
signal::install_signal_handler, use crate::signal::install_signal_handler;
};
/// Entry point for the `irtt-rs` multicall dispatcher binary. /// Entry point for the `irtt-rs` multicall dispatcher binary.
/// ///
@@ -81,6 +77,7 @@ fn run_dispatcher_from_env() -> Result<(), Box<dyn std::error::Error>> {
/// Installs the shutdown signal handler shared by every applet and hands the /// Installs the shutdown signal handler shared by every applet and hands the
/// resulting flag to `f`. /// resulting flag to `f`.
#[cfg(any(feature = "client", feature = "server", feature = "tui"))]
fn with_shutdown_flag( fn with_shutdown_flag(
f: impl FnOnce(&AtomicBool) -> Result<(), Box<dyn std::error::Error>>, f: impl FnOnce(&AtomicBool) -> Result<(), Box<dyn std::error::Error>>,
) -> Result<(), Box<dyn std::error::Error>> { ) -> Result<(), Box<dyn std::error::Error>> {