Omit most builtins if bridge explicitly includes "rust/cxx.h"
diff --git a/gen/src/builtin.rs b/gen/src/builtin.rs
index 378467b..60bbf43 100644
--- a/gen/src/builtin.rs
+++ b/gen/src/builtin.rs
@@ -48,6 +48,11 @@
     let builtin = &mut out.builtin;
     let out = &mut builtin.content;
 
+    let cxx_header = include
+        .custom
+        .iter()
+        .any(|header| header.path == "rust/cxx.h" || header.path == "rust\\cxx.h");
+
     if builtin.rust_string {
         include.array = true;
         include.cstdint = true;
@@ -126,51 +131,54 @@
 
     out.begin_block(Block::Namespace("rust"));
     out.begin_block(Block::InlineNamespace("cxxbridge1"));
-    writeln!(out, "// #include \"rust/cxx.h\"");
 
-    ifndef::write(out, builtin.panic, "CXXBRIDGE1_PANIC");
+    if !cxx_header {
+        writeln!(out, "// #include \"rust/cxx.h\"");
 
-    if builtin.rust_string {
+        ifndef::write(out, builtin.panic, "CXXBRIDGE1_PANIC");
+
+        if builtin.rust_string {
+            out.next_section();
+            writeln!(out, "struct unsafe_bitcopy_t;");
+        }
+
+        if builtin.friend_impl {
+            out.begin_block(Block::AnonymousNamespace);
+            writeln!(out, "template <typename T>");
+            writeln!(out, "class impl;");
+            out.end_block(Block::AnonymousNamespace);
+        }
+
         out.next_section();
-        writeln!(out, "struct unsafe_bitcopy_t;");
-    }
+        if builtin.rust_str && !builtin.rust_string {
+            writeln!(out, "class String;");
+        }
+        if builtin.layout && !builtin.opaque {
+            writeln!(out, "class Opaque;");
+        }
 
-    if builtin.friend_impl {
-        out.begin_block(Block::AnonymousNamespace);
-        writeln!(out, "template <typename T>");
-        writeln!(out, "class impl;");
-        out.end_block(Block::AnonymousNamespace);
-    }
+        if builtin.rust_slice {
+            out.next_section();
+            writeln!(out, "template <typename T>");
+            writeln!(out, "::std::size_t size_of();");
+            writeln!(out, "template <typename T>");
+            writeln!(out, "::std::size_t align_of();");
+        }
 
-    out.next_section();
-    if builtin.rust_str && !builtin.rust_string {
-        writeln!(out, "class String;");
+        ifndef::write(out, builtin.rust_string, "CXXBRIDGE1_RUST_STRING");
+        ifndef::write(out, builtin.rust_str, "CXXBRIDGE1_RUST_STR");
+        ifndef::write(out, builtin.rust_slice, "CXXBRIDGE1_RUST_SLICE");
+        ifndef::write(out, builtin.rust_box, "CXXBRIDGE1_RUST_BOX");
+        ifndef::write(out, builtin.unsafe_bitcopy, "CXXBRIDGE1_RUST_BITCOPY");
+        ifndef::write(out, builtin.rust_vec, "CXXBRIDGE1_RUST_VEC");
+        ifndef::write(out, builtin.rust_fn, "CXXBRIDGE1_RUST_FN");
+        ifndef::write(out, builtin.rust_error, "CXXBRIDGE1_RUST_ERROR");
+        ifndef::write(out, builtin.rust_isize, "CXXBRIDGE1_RUST_ISIZE");
+        ifndef::write(out, builtin.opaque, "CXXBRIDGE1_RUST_OPAQUE");
+        ifndef::write(out, builtin.is_complete, "CXXBRIDGE1_IS_COMPLETE");
+        ifndef::write(out, builtin.layout, "CXXBRIDGE1_LAYOUT");
+        ifndef::write(out, builtin.relocatable, "CXXBRIDGE1_RELOCATABLE");
     }
-    if builtin.layout && !builtin.opaque {
-        writeln!(out, "class Opaque;");
-    }
-
-    if builtin.rust_slice {
-        out.next_section();
-        writeln!(out, "template <typename T>");
-        writeln!(out, "::std::size_t size_of();");
-        writeln!(out, "template <typename T>");
-        writeln!(out, "::std::size_t align_of();");
-    }
-
-    ifndef::write(out, builtin.rust_string, "CXXBRIDGE1_RUST_STRING");
-    ifndef::write(out, builtin.rust_str, "CXXBRIDGE1_RUST_STR");
-    ifndef::write(out, builtin.rust_slice, "CXXBRIDGE1_RUST_SLICE");
-    ifndef::write(out, builtin.rust_box, "CXXBRIDGE1_RUST_BOX");
-    ifndef::write(out, builtin.unsafe_bitcopy, "CXXBRIDGE1_RUST_BITCOPY");
-    ifndef::write(out, builtin.rust_vec, "CXXBRIDGE1_RUST_VEC");
-    ifndef::write(out, builtin.rust_fn, "CXXBRIDGE1_RUST_FN");
-    ifndef::write(out, builtin.rust_error, "CXXBRIDGE1_RUST_ERROR");
-    ifndef::write(out, builtin.rust_isize, "CXXBRIDGE1_RUST_ISIZE");
-    ifndef::write(out, builtin.opaque, "CXXBRIDGE1_RUST_OPAQUE");
-    ifndef::write(out, builtin.is_complete, "CXXBRIDGE1_IS_COMPLETE");
-    ifndef::write(out, builtin.layout, "CXXBRIDGE1_LAYOUT");
-    ifndef::write(out, builtin.relocatable, "CXXBRIDGE1_RELOCATABLE");
 
     if builtin.rust_str_new_unchecked {
         out.next_section();