diff --git a/tools/reduce/src/main.rs b/tools/reduce/src/main.rs
index 06110cd..d585dee 100644
--- a/tools/reduce/src/main.rs
+++ b/tools/reduce/src/main.rs
@@ -36,6 +36,13 @@
 "};
 
 fn main() {
+    // Assemble some defaults for command line arguments
+    let current_exe = std::env::current_exe().unwrap();
+    let our_dir = current_exe.parent().unwrap();
+    let default_gen_cmd = our_dir.join("autocxx-gen").to_str().unwrap().to_string();
+    let rust_libs_path1 = our_dir.to_str().unwrap().to_string();
+    let rust_libs_path2 = our_dir.join("deps").to_str().unwrap().to_string();
+    let default_rlibs = &[rust_libs_path1.as_str(), rust_libs_path2.as_str()];
     let matches = Command::new("autocxx-reduce")
         .version(crate_version!())
         .author(crate_authors!())
@@ -138,6 +145,24 @@
                 .long("gen-cmd")
                 .value_name("GEN-CMD")
                 .help("where to find autocxx-gen")
+                .default_value(&default_gen_cmd)
+                .takes_value(true),
+        )
+        .arg(
+            Arg::new("rustc")
+                .long("rustc")
+                .value_name("RUSTC")
+                .help("where to find rustc")
+                .default_value("rustc")
+                .takes_value(true),
+        )
+        .arg(
+            Arg::new("rlibs")
+                .long("rlibs")
+                .value_name("LIBDIR")
+                .help("where to find rlibs/rmetas for cxx and autocxx")
+                .default_values(default_rlibs)
+                .multiple_values(true)
                 .takes_value(true),
         )
         .arg(
@@ -172,6 +197,11 @@
                 .help("Do not post-compile the C++ generated by autocxxgen"),
         )
         .arg(
+            Arg::new("no-rustc")
+                .long("no-rustc")
+                .help("Do not compile the rust generated by autocxxgen"),
+        )
+        .arg(
             Arg::new("suppress-cxx-inclusions")
                 .long("suppress-cxx-inclusions")
                 .takes_value(true)
@@ -222,8 +252,7 @@
             let listing_path = tmp_dir.path().join("listing.h");
             create_concatenated_header(&headers, &listing_path)?;
             announce_progress(&format!(
-                "Preprocessing {:?} to {:?}",
-                listing_path, concat_path
+                "Preprocessing {listing_path:?} to {concat_path:?}"
             ));
             preprocess(&listing_path, &concat_path, &incs, &defs)?;
             let directives: Vec<_> = std::iter::once("#include \"concat.h\"\n".to_string())
@@ -231,7 +260,7 @@
                     submatches
                         .values_of("directive")
                         .unwrap_or_default()
-                        .map(|s| format!("{}\n", s)),
+                        .map(|s| format!("{s}\n")),
                 )
                 .collect();
             create_rs_file(&rs_path, &directives)?;
@@ -277,33 +306,25 @@
         .collect();
     let extra_clang_args: Vec<&str> = extra_clang_args.iter().map(|s| s.as_ref()).collect_vec();
 
-    let default_gen_cmd = std::env::current_exe()?
-        .parent()
-        .unwrap()
-        .join("autocxx-gen")
-        .to_str()
-        .unwrap()
-        .to_string();
-    let gen_cmd = matches.value_of("gen-cmd").unwrap_or(&default_gen_cmd);
+    let gen_cmd = matches.value_of("gen-cmd").unwrap();
     if !Path::new(gen_cmd).exists() {
         panic!(
-            "autocxx-gen not found in {}. hint: autocxx-reduce --gen-cmd /path/to/autocxx-gen",
-            gen_cmd
+            "autocxx-gen not found in {gen_cmd}. hint: autocxx-reduce --gen-cmd /path/to/autocxx-gen"
         );
     }
+
     run_sample_gen_cmd(gen_cmd, &rs_path, tmp_dir.path(), &extra_clang_args)?;
     // Create and run an interestingness test which does not filter its output through grep.
     let demo_interestingness_test_dir = tmp_dir.path().join("demo-interestingness-test");
     std::fs::create_dir(&demo_interestingness_test_dir).unwrap();
     let interestingness_test = demo_interestingness_test_dir.join("test-demo.sh");
     create_interestingness_test(
+        &matches,
         gen_cmd,
         &interestingness_test,
         None,
         &rs_path,
         &extra_clang_args,
-        !matches.is_present("no-precompile"),
-        !matches.is_present("no-postcompile"),
     )?;
     let demo_dir_concat_path = demo_interestingness_test_dir.join("concat.h");
     std::fs::copy(&concat_path, demo_dir_concat_path).unwrap();
@@ -312,13 +333,12 @@
     // Now the main interestingness test
     let interestingness_test = tmp_dir.path().join("test.sh");
     create_interestingness_test(
+        &matches,
         gen_cmd,
         &interestingness_test,
         Some(matches.value_of("problem").unwrap()),
         &rs_path,
         &extra_clang_args,
-        !matches.is_present("no-precompile"),
-        !matches.is_present("no-postcompile"),
     )?;
     run_creduce(
         matches.value_of("creduce").unwrap(),
@@ -331,7 +351,7 @@
     match output_path {
         None => print_minimized_case(&concat_path)?,
         Some(output_path) => {
-            std::fs::copy(&concat_path, &PathBuf::from(output_path))?;
+            std::fs::copy(&concat_path, PathBuf::from(output_path))?;
         }
     };
     Ok(())
@@ -349,13 +369,13 @@
 }
 
 fn announce_progress(msg: &str) {
-    println!("=== {} ===", msg);
+    println!("=== {msg} ===");
 }
 
 fn print_minimized_case(concat_path: &Path) -> Result<(), std::io::Error> {
     announce_progress("Completed. Minimized test case:");
     let contents = std::fs::read_to_string(concat_path)?;
-    println!("{}", contents);
+    println!("{contents}");
     Ok(())
 }
 
@@ -370,7 +390,7 @@
         .arg("--help")
         .output();
     let msg = match cmd {
-        Err(error) => panic!("failed to run creduce. creduce_cmd = {}. hint: autocxx-reduce --creduce /path/to/creduce. error = {}", creduce_cmd, error),
+        Err(error) => panic!("failed to run creduce. creduce_cmd = {creduce_cmd}. hint: autocxx-reduce --creduce /path/to/creduce. error = {error}"),
         Ok(result) => result.stdout
     };
     let msg = std::str::from_utf8(&msg).unwrap();
@@ -413,7 +433,7 @@
     let args = format_gen_cmd(rs_file, tmp_dir.to_str().unwrap(), extra_clang_args);
     let args = args.collect::<Vec<_>>();
     let args_str = args.join(" ");
-    announce_progress(&format!("Running sample gen cmd: {} {}", gen_cmd, args_str));
+    announce_progress(&format!("Running sample gen cmd: {gen_cmd} {args_str}"));
     std::process::Command::new(gen_cmd).args(args).status()?;
     Ok(())
 }
@@ -451,15 +471,26 @@
 }
 
 fn create_interestingness_test(
+    matches: &ArgMatches,
     gen_cmd: &str,
     test_path: &Path,
     problem: Option<&str>,
     rs_file: &Path,
     extra_clang_args: &[&str],
-    precompile: bool,
-    postcompile: bool,
 ) -> Result<(), std::io::Error> {
     announce_progress("Creating interestingness test");
+    let precompile = !matches.is_present("no-precompile");
+    let postcompile = !matches.is_present("no-postcompile");
+    let rustc = !matches.is_present("no-rustc");
+
+    let rustc_path = matches.value_of("rustc").unwrap();
+
+    let rust_libs_path: Vec<String> = matches
+        .get_many::<String>("rlibs")
+        .expect("No rlib path specified")
+        .cloned()
+        .collect();
+
     // Ensure we refer to the input header by relative path
     // because creduce will invoke us in some other directory with
     // a copy thereof.
@@ -469,37 +500,47 @@
     // For the compile afterwards, we have to avoid including any system headers.
     // We rely on equivalent content being hermetically inside concat.h.
     let postcompile_step = make_compile_step(postcompile, "gen0.cc", extra_clang_args);
+    let rustc_step = if rustc {
+        let rust_libs_path = rust_libs_path.iter().map(|p| format!(" -L{p}")).join(" ");
+        format!("{rustc_path} --extern cxx --extern autocxx {rust_libs_path} --crate-type rlib --emit=metadata --edition=2021 autocxx-ffi-default-gen.rs 2>&1")
+    } else {
+        "echo Skipping rustc".to_string()
+    };
+    // -q below to exit immediately as soon as a match is found, to avoid
+    // extra compile/codegen steps
     let problem_grep = problem
-        .map(|problem| format!("| grep \"{}\"  >/dev/null  2>&1", problem))
+        .map(|problem| format!("| grep -q \"{problem}\"  >/dev/null  2>&1"))
         .unwrap_or_default();
+    // We formerly had a 'trap' below but it seems to have caused problems
+    // (trap \"if [[ \\$? -eq 139 ]]; then echo Segfault; fi\" CHLD; {} {} 2>&1 && cat autocxx-ffi-default-gen.rs && cat autocxxgen*.h && {} && {} 2>&1 ) {}
     let content = format!(
         indoc! {"
-        #!/bin/sh
+        #!/bin/bash
         set -e
         echo Precompile
         {}
         echo Move
         mv concat.h concat-body.h
-        echo Codegen
         (echo \"#ifndef __CONCAT_H__\"; echo \"#define __CONCAT_H__\"; echo '#include \"concat-body.h\"'; echo \"#endif\") > concat.h
-        (trap \"if [[ \\$? -eq 139 ]]; then echo Segfault; fi\" CHLD; {} {} 2>&1 && cat autocxx-ffi-default-gen.rs && cat autocxxgen*.h && {} 2>&1 ) {}
+        echo Codegen
+        ({} {} 2>&1 && cat autocxx-ffi-default-gen.rs && cat autocxxgen*.h && {} && {} 2>&1) {}
         echo Remove
         rm concat.h
         echo Swap back
         mv concat-body.h concat.h
         echo Done
     "},
-        precompile_step, gen_cmd, args, postcompile_step, problem_grep
+        precompile_step, gen_cmd, args, rustc_step, postcompile_step, problem_grep
     );
-    println!("Interestingness test:\n{}", content);
+    println!("Interestingness test:\n{content}");
     {
         let mut file = File::create(test_path)?;
         file.write_all(content.as_bytes())?;
     }
 
-    let mut perms = std::fs::metadata(&test_path)?.permissions();
+    let mut perms = std::fs::metadata(test_path)?.permissions();
     perms.set_mode(0o700);
-    std::fs::set_permissions(&test_path, perms)?;
+    std::fs::set_permissions(test_path, perms)?;
     Ok(())
 }
 
@@ -531,14 +572,14 @@
     announce_progress("Creating preprocessed header");
     let mut file = File::create(listing_path)?;
     for header in headers {
-        file.write_all(format!("#include \"{}\"\n", header).as_bytes())?;
+        file.write_all(format!("#include \"{header}\"\n").as_bytes())?;
     }
     Ok(())
 }
 
 fn create_file(path: &Path, content: &str) -> Result<(), std::io::Error> {
     let mut file = File::create(path)?;
-    write!(file, "{}", content)?;
+    write!(file, "{content}")?;
     Ok(())
 }
 
@@ -548,10 +589,7 @@
         .find_iter(cxx_gen::HEADER)
         .map(|m| m.as_str())
         .collect(); // for uniqueness
-    defines
-        .into_iter()
-        .map(|def| format!("-D{}", def))
-        .collect()
+    defines.into_iter().map(|def| format!("-D{def}")).collect()
 }
 
 #[test]
