launcher
is a system to combine several programs into a single binary, to
save memory and disk space. Each program can be written in its own directory
and run independently.
The Fuchsia operating system will maintain one VMO containing the launcher
binary image, and will serve that VMO to each package which uses one of the
programs that were combined to make the launcher
binary.
This project should be automatically included in builds by including any project that uses it.
To convert a program to use launcher
, you will build a library instead of a
binary; include the library in the launcher
binary; link to the launcher
binary from the component that used to use your program's binary; and adjust
your .cml files slightly.
In your program's directory:
- Rename its
main.rs
tolib.rs
- From lib.rs export your
argh
command-line arg struct, for examplepub struct CommandLine
. (If you don't use command line args, add an empty struct with#[derive(FromArgs, Debug, PartialEq)]
.)- Make sure to derive PartialEq on your arg struct.
- Annotate your struct with
#[argh(subcommand, name = "your-choice")]
. - Add
pub const PROGRAM_NAME: &str = "your-choice";
- Also from lib.rs, export the
main
funtion with this signature:pub async fn main(args: CommandLine) -> Result<(), Error>
- Remove the
#[fasync::run_singlethreaded]
or similar lines. - Remove syslog initialization; Launcher does that.
- Remove the
- In BUILD.gn,
import("//build/rust/rustc_library.gni")
, changerustc_bin
torustc_lib
, and replacemain.rs
withlib.rs
insources
. - In the .cmx for unit tests, change
_bin_test
to_lib_test
.
In //src/diagnostics/launcher
:
- Add your library to
deps
in BUILD.gn - Add your
CommandLine
struct to theChildArgs
enum in main.rs - Add your program's
PROGRAM_NAME
to the firstmatch
in main() - Call your library's
main
from the secondmatch
in main()
To invoke a program that has been integrated in launcher
:
- Make the component depend on
"//src/diagnostics/launcher:bin"
instead of the original binary. - In the .cml use
program
->binary
-> "bin/launcher". - Add the appropriate command line argument (
your-choice
in this example) to the .cml file as the firstargs
item.
launcher
will be integration-tested by every program that uses it.
No unit tests are currently contemplated.