#cargo-build #cargo #cargo-subcommand #run-command #crates #dependencies #cli

app cargo-with

A third-party cargo extension to run the build artifacts through tools like gdb

4 releases (2 breaking)

0.3.2 Sep 7, 2019
0.3.1 Sep 7, 2019
0.3.0 Mar 21, 2019
0.2.0 Nov 29, 2018
0.1.0 Oct 25, 2018

#376 in Cargo plugins

GPL-3.0 license

25KB
442 lines

cargo-with

cargo-with is a cargo-subcommand making it easy to run the build artifacts produced by cargo run, cargo build or cargo bench through other tools such as gdb, strace, valgrind, rr, or whatever else you may come up with.

Build Status crates.io

Installation

Install with the usual cargo install magic:

cargo install cargo-with

Usage

The core idea of cargo-with is to fit well into your development workflow using cargo <subcommand>. All you have to do is add with <some-command> -- in front of your usual cargo commands. cargo-with will then try it's best to identify the created artifact and run it with your command.

E.g. in order to run your binary through gdb do:

cargo with gdb -- run

This will firstly build the binary using cargo build, and then run gdb {bin} {args}, where {bin} is the path to the produced artifact and {args} is the arguments provided to cargo after the last -- (in this case none).

Moving arguments around

Instead of implicitly appending the artifact path and arguments to the provided command, you could also use placeholders to tell cargo-with where to place them. This can be done by using {bin} and {args} in the provided command.

cargo with "echo {args} {bin}" -- run -- --argument1 --argument2

I the above command, {bin} will be replaced by the path to the built artifact while {args} will be replaced by --argument1 --argument2.

Disambiguating multiple binaries

There are often mulitiple candiate artifacts when cargo builds your project, especially when building tests. Therefore cargo-with may in some situations need more information to select your preferred candidate. This is done via explicitly specificing to cargo which artifact to build through the use of --bin <name-of-binary>, --example <name-of-example>, --lib <name-of-lib>* or --test <name-of-unit-test>*.

cargo with "gdb --args {bin} {args}" -- test --bin my-app
cargo with "gdb --args {bin} {args}" -- test --lib my-library
cargo with "gdb --args {bin} {args}" -- test --test my-unit-test
cargo with "gdb --args {bin} {args}" -- test --example my-example

*Only avaliable when using cargo test

Examining tests

Cargo will run tests in parallel, hence running cargo with gdb -- test --lib my-library is probably not what you want. You can examine a single test by giving the name of the test function to cargo; cargo with gdb -- test --lib my-library my_test_function_name.

Note about cargo run

In the case of cargo run cargo-with does replace run with build implicitly in order to avoid execution of the binary after compilation.

Future of this crate

There are currently open issues upstream in cargo which might make this crate redundant in the future.

Contributors

This crate would not be what it is today without the many contributions by @barskern!

Dependencies

~3.5–5.5MB
~103K SLoC