Take codegen options by reference
diff --git a/gen/build/src/lib.rs b/gen/build/src/lib.rs
index 14683b6..a4fcc1d 100644
--- a/gen/build/src/lib.rs
+++ b/gen/build/src/lib.rs
@@ -102,13 +102,14 @@
 }
 
 fn try_generate_bridge(build: &mut cc::Build, rust_source_file: &Path) -> Result<()> {
-    let header = gen::do_generate_header(rust_source_file, Opt::default());
+    let opt = Opt::default();
+    let header = gen::do_generate_header(rust_source_file, &opt);
     let header_path = paths::out_with_extension(rust_source_file, ".h")?;
     fs::create_dir_all(header_path.parent().unwrap())?;
     fs::write(&header_path, header)?;
     paths::symlink_header(&header_path, rust_source_file);
 
-    let bridge = gen::do_generate_bridge(rust_source_file, Opt::default());
+    let bridge = gen::do_generate_bridge(rust_source_file, &opt);
     let bridge_path = paths::out_with_extension(rust_source_file, ".cc")?;
     fs::write(&bridge_path, bridge)?;
     build.file(&bridge_path);
diff --git a/gen/cmd/src/main.rs b/gen/cmd/src/main.rs
index 0160913..38aab49 100644
--- a/gen/cmd/src/main.rs
+++ b/gen/cmd/src/main.rs
@@ -35,8 +35,8 @@
     };
 
     match (opt.input, opt.header) {
-        (Some(input), true) => write(gen::do_generate_header(&input, gen)),
-        (Some(input), false) => write(gen::do_generate_bridge(&input, gen)),
+        (Some(input), true) => write(gen::do_generate_header(&input, &gen)),
+        (Some(input), false) => write(gen::do_generate_bridge(&input, &gen)),
         (None, true) => write(include::HEADER),
         (None, false) => unreachable!(), // enforced by required_unless
     }
diff --git a/gen/lib/src/lib.rs b/gen/lib/src/lib.rs
index ca9fabe..d2ac1ca 100644
--- a/gen/lib/src/lib.rs
+++ b/gen/lib/src/lib.rs
@@ -24,7 +24,7 @@
 
 /// Generate C++ bindings code from a Rust token stream. This should be a Rust
 /// token stream which somewhere contains a `#[cxx::bridge] mod {}`.
-pub fn generate_header_and_cc(rust_source: TokenStream, opt: Opt) -> Result<GeneratedCode, Error> {
+pub fn generate_header_and_cc(rust_source: TokenStream, opt: &Opt) -> Result<GeneratedCode, Error> {
     let syntax = syn::parse2(rust_source)
         .map_err(crate::gen::Error::from)
         .map_err(Error)?;
diff --git a/gen/src/mod.rs b/gen/src/mod.rs
index 6573949..0743939 100644
--- a/gen/src/mod.rs
+++ b/gen/src/mod.rs
@@ -32,7 +32,7 @@
 /// let mut opt = Opt::default();
 /// opt.cxx_impl_annotations = Some(impl_annotations);
 /// ```
-#[derive(Default, Clone)]
+#[derive(Default)]
 #[non_exhaustive]
 pub struct Opt {
     /// Any additional headers to #include. The cxxbridge tool does not parse or
@@ -47,17 +47,17 @@
     pub cxx_impl_annotations: Option<String>,
 }
 
-pub(super) fn do_generate_bridge(path: &Path, opt: Opt) -> Vec<u8> {
+pub(super) fn do_generate_bridge(path: &Path, opt: &Opt) -> Vec<u8> {
     let header = false;
     generate_from_path(path, opt, header)
 }
 
-pub(super) fn do_generate_header(path: &Path, opt: Opt) -> Vec<u8> {
+pub(super) fn do_generate_header(path: &Path, opt: &Opt) -> Vec<u8> {
     let header = true;
     generate_from_path(path, opt, header)
 }
 
-fn generate_from_path(path: &Path, opt: Opt, header: bool) -> Vec<u8> {
+fn generate_from_path(path: &Path, opt: &Opt, header: bool) -> Vec<u8> {
     let source = match fs::read_to_string(path) {
         Ok(source) => source,
         Err(err) => format_err(path, "", Error::Io(err)),
@@ -68,7 +68,7 @@
     }
 }
 
-fn generate_from_string(source: &str, opt: Opt, header: bool) -> Result<Vec<u8>> {
+fn generate_from_string(source: &str, opt: &Opt, header: bool) -> Result<Vec<u8>> {
     let mut source = source;
     if source.starts_with("#!") && !source.starts_with("#![") {
         let shebang_end = source.find('\n').unwrap_or(source.len());
@@ -85,7 +85,7 @@
 
 pub(super) fn generate(
     syntax: File,
-    opt: Opt,
+    opt: &Opt,
     gen_header: bool,
     gen_cxx: bool,
 ) -> Result<(Option<Vec<u8>>, Option<Vec<u8>>)> {
@@ -107,7 +107,7 @@
     // from the same token stream to avoid parsing twice. But others
     // only need to generate one or the other.
     let hdr = if gen_header {
-        Some(write::gen(namespace, apis, types, opt.clone(), true).content())
+        Some(write::gen(namespace, apis, types, opt, true).content())
     } else {
         None
     };
diff --git a/gen/src/write.rs b/gen/src/write.rs
index 32ccbf6..ccb9f61 100644
--- a/gen/src/write.rs
+++ b/gen/src/write.rs
@@ -11,7 +11,7 @@
     namespace: &Namespace,
     apis: &[Api],
     types: &Types,
-    opt: Opt,
+    opt: &Opt,
     header: bool,
 ) -> OutFile {
     let mut out_file = OutFile::new(namespace.clone(), header);
@@ -21,7 +21,7 @@
         writeln!(out.front, "#pragma once");
     }
 
-    out.include.extend(opt.include);
+    out.include.extend(opt.include.clone());
     for api in apis {
         if let Api::Include(include) = api {
             out.include.insert(include);