summaryrefslogtreecommitdiff
path: root/xtask/src
diff options
context:
space:
mode:
Diffstat (limited to 'xtask/src')
-rw-r--r--xtask/src/main.rs57
1 files changed, 57 insertions, 0 deletions
diff --git a/xtask/src/main.rs b/xtask/src/main.rs
new file mode 100644
index 0000000..8bf25ae
--- /dev/null
+++ b/xtask/src/main.rs
@@ -0,0 +1,57 @@
+use std::process::Command;
+
+fn main()
+{
+ let mut args = std::env::args();
+
+ let Some(task) = args.nth(1) else {
+ println!("Error: No task is specified");
+ return;
+ };
+
+ if task == "execute" {
+ let Some(program) = args.next() else {
+ println!("Error: No program is specified");
+ return;
+ };
+
+ if let Err(err) = Command::new(program)
+ .args(args)
+ .remove_envs(
+ // When a binary crate is run with 'cargo run', cargo sets environment
+ // variables with information about the crate, package & cargo manifest.
+ // These environment variables are unwanted when the program run here
+ // is cargo so they are removed.
+ //
+ // If cargo is the program run here and the environment variables are
+ // kept, cargo does not overwrite them, which can cause unnecessary
+ // rebuilds of dependencies
+ std::env::vars()
+ .map(|(key, _)| key)
+ .filter(|key| key.starts_with("CARGO_") && key != "CARGO_HOME"),
+ )
+ .status()
+ {
+ println!("Error: Failed to execute command: {err}");
+ }
+ } else {
+ println!("Error: Unknown task '{task}'");
+ }
+}
+
+trait CommandExt
+{
+ fn remove_envs(&mut self, keys: impl IntoIterator<Item = String>) -> &mut Self;
+}
+
+impl CommandExt for Command
+{
+ fn remove_envs(&mut self, keys: impl IntoIterator<Item = String>) -> &mut Self
+ {
+ for env_key in keys {
+ self.env_remove(env_key);
+ }
+
+ self
+ }
+}