Migrate away from structopt
Clap 3 supports derive natively, so we don't need structopt anymore
(since it was based on clap 2).
Besides, sort the arguments to make positional ones first.
Bug: 246385183
Test: atest AuthFsHostTest ComposHostTestCases MicrodroidTestCase
Change-Id: I75e25ffcb63bf717be8deb9720e0fdf78a0c7ccf
diff --git a/vm/Android.bp b/vm/Android.bp
index eac640e..7b016d4 100644
--- a/vm/Android.bp
+++ b/vm/Android.bp
@@ -12,6 +12,7 @@
"android.system.virtualizationservice-rust",
"libanyhow",
"libbinder_rs",
+ "libclap",
"libenv_logger",
"liblibc",
"liblog_rust",
@@ -19,7 +20,6 @@
"librustutils",
"libserde_json",
"libserde",
- "libstructopt",
"libvmconfig",
"libvmclient",
"libzip",
diff --git a/vm/src/main.rs b/vm/src/main.rs
index b35bd4b..0845897 100644
--- a/vm/src/main.rs
+++ b/vm/src/main.rs
@@ -24,110 +24,104 @@
};
use anyhow::{Context, Error};
use binder::ProcessState;
+use clap::Parser;
use create_idsig::command_create_idsig;
use create_partition::command_create_partition;
use run::{command_run, command_run_app};
use rustutils::system_properties;
use std::path::{Path, PathBuf};
-use structopt::clap::AppSettings;
-use structopt::StructOpt;
#[derive(Debug)]
struct Idsigs(Vec<PathBuf>);
-#[derive(StructOpt)]
-#[structopt(no_version, global_settings = &[AppSettings::DisableVersion])]
+#[derive(Parser)]
enum Opt {
/// Run a virtual machine with a config in APK
RunApp {
- /// Name of VM
- #[structopt(long)]
- name: Option<String>,
-
/// Path to VM Payload APK
- #[structopt(parse(from_os_str))]
apk: PathBuf,
/// Path to idsig of the APK
- #[structopt(parse(from_os_str))]
idsig: PathBuf,
/// Path to the instance image. Created if not exists.
- #[structopt(parse(from_os_str))]
instance: PathBuf,
/// Path to VM config JSON within APK (e.g. assets/vm_config.json)
config_path: String,
+ /// Name of VM
+ #[clap(long)]
+ name: Option<String>,
+
/// Detach VM from the terminal and run in the background
- #[structopt(short, long)]
+ #[clap(short, long)]
daemonize: bool,
/// Path to file for VM console output.
- #[structopt(long)]
+ #[clap(long)]
console: Option<PathBuf>,
/// Path to file for VM log output.
- #[structopt(long)]
+ #[clap(long)]
log: Option<PathBuf>,
/// Path to file where ramdump is recorded on kernel panic
- #[structopt(long)]
+ #[clap(long)]
ramdump: Option<PathBuf>,
/// Debug level of the VM. Supported values: "none" (default), "app_only", and "full".
- #[structopt(long, default_value = "none", parse(try_from_str=parse_debug_level))]
+ #[clap(long, default_value = "none", value_parser = parse_debug_level)]
debug: DebugLevel,
/// Run VM in protected mode.
- #[structopt(short, long)]
+ #[clap(short, long)]
protected: bool,
/// Memory size (in MiB) of the VM. If unspecified, defaults to the value of `memory_mib`
/// in the VM config file.
- #[structopt(short, long)]
+ #[clap(short, long)]
mem: Option<u32>,
/// Number of vCPUs in the VM. If unspecified, defaults to 1.
- #[structopt(long)]
+ #[clap(long)]
cpus: Option<u32>,
/// Comma separated list of task profile names to apply to the VM
- #[structopt(long)]
+ #[clap(long)]
task_profiles: Vec<String>,
/// Paths to extra idsig files.
- #[structopt(long = "extra-idsig")]
+ #[clap(long = "extra-idsig")]
extra_idsigs: Vec<PathBuf>,
},
/// Run a virtual machine
Run {
- /// Name of VM
- #[structopt(long)]
- name: Option<String>,
-
/// Path to VM config JSON
- #[structopt(parse(from_os_str))]
config: PathBuf,
+ /// Name of VM
+ #[clap(long)]
+ name: Option<String>,
+
/// Detach VM from the terminal and run in the background
- #[structopt(short, long)]
+ #[clap(short, long)]
daemonize: bool,
/// Number of vCPUs in the VM. If unspecified, defaults to 1.
- #[structopt(long)]
+ #[clap(long)]
cpus: Option<u32>,
/// Comma separated list of task profile names to apply to the VM
- #[structopt(long)]
+ #[clap(long)]
task_profiles: Vec<String>,
/// Path to file for VM console output.
- #[structopt(long)]
+ #[clap(long)]
console: Option<PathBuf>,
/// Path to file for VM log output.
- #[structopt(long)]
+ #[clap(long)]
log: Option<PathBuf>,
},
/// Stop a virtual machine running in the background
@@ -142,23 +136,22 @@
/// Create a new empty partition to be used as a writable partition for a VM
CreatePartition {
/// Path at which to create the image file
- #[structopt(parse(from_os_str))]
path: PathBuf,
/// The desired size of the partition, in bytes.
size: u64,
/// Type of the partition
- #[structopt(short="t", long="type", default_value="raw", parse(try_from_str=parse_partition_type))]
+ #[clap(short = 't', long = "type", default_value = "raw",
+ value_parser = parse_partition_type)]
partition_type: PartitionType,
},
/// Creates or update the idsig file by digesting the input APK file.
CreateIdsig {
/// Path to VM Payload APK
- #[structopt(parse(from_os_str))]
apk: PathBuf,
+
/// Path to idsig of the APK
- #[structopt(parse(from_os_str))]
path: PathBuf,
},
}
@@ -182,7 +175,7 @@
fn main() -> Result<(), Error> {
env_logger::init();
- let opt = Opt::from_args();
+ let opt = Opt::parse();
// We need to start the thread pool for Binder to work properly, especially link_to_death.
ProcessState::start_thread_pool();