Move `cmdline` to a separate crate.

PiperOrigin-RevId: 570879925
Change-Id: I0ab34d733b99e4029b2273d130868d5ccc86fbc6
diff --git a/cc_bindings_from_rs/BUILD b/cc_bindings_from_rs/BUILD
index 9227410..bfa9cea 100644
--- a/cc_bindings_from_rs/BUILD
+++ b/cc_bindings_from_rs/BUILD
@@ -18,7 +18,6 @@
         # TODO(b/254679226): These should be separate crates.
         "bindings.rs",
         "cc_bindings_from_rs.rs",
-        "cmdline.rs",
     ],
     crate_root = "cc_bindings_from_rs.rs",
     # TODO(b/242703401): Remove once cc_common.link works for rustc libraries.
@@ -30,6 +29,7 @@
         "//visibility:public",
     ],
     deps = [
+        ":cmdline",
         ":run_compiler",
         ":toposort",
         "//common:code_gen_utils",
@@ -74,6 +74,31 @@
 )
 
 rust_library(
+    name = "cmdline",
+    srcs = [
+        "cmdline.rs",
+    ],
+    deps = [
+        "@crate_index//:anyhow",
+        "@crate_index//:clap",
+    ],
+)
+
+crubit_rust_test(
+    name = "cmdline_test",
+    crate = ":cmdline",
+    tags = [
+        "not_build:arm",
+        "noubsan",  # rustc-as-a-library isn't supported for UBSan.
+    ],
+    deps = [
+        ":run_compiler_test_support",
+        "@crate_index//:itertools",
+        "@crate_index//:tempfile",
+    ],
+)
+
+rust_library(
     name = "run_compiler",
     srcs = [
         "run_compiler.rs",
diff --git a/cc_bindings_from_rs/cc_bindings_from_rs.rs b/cc_bindings_from_rs/cc_bindings_from_rs.rs
index 573457e..b914670 100644
--- a/cc_bindings_from_rs/cc_bindings_from_rs.rs
+++ b/cc_bindings_from_rs/cc_bindings_from_rs.rs
@@ -24,7 +24,6 @@
 
 // TODO(b/254679226): these should be separate crates.
 mod bindings;
-mod cmdline;
 
 use anyhow::Context;
 use itertools::Itertools;
diff --git a/cc_bindings_from_rs/cmdline.rs b/cc_bindings_from_rs/cmdline.rs
index b81302b..114f565 100644
--- a/cc_bindings_from_rs/cmdline.rs
+++ b/cc_bindings_from_rs/cmdline.rs
@@ -2,6 +2,12 @@
 // Exceptions. See /LICENSE for license information.
 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 
+#![feature(rustc_private)]
+#![deny(rustc::internal)]
+
+extern crate rustc_driver;
+extern crate rustc_session;
+
 use anyhow::{bail, ensure, Result};
 use clap::Parser;
 use rustc_session::config::ErrorOutputType;