1 //! See https://github.com/matklad/cargo-xtask/.
3 //! This binary defines various auxiliary build commands, which are not
4 //! expressible with just `cargo`. Notably, it provides `cargo xtask codegen`
5 //! for code generation and `cargo xtask install` for installation of
6 //! rust-analyzer server and client.
8 //! This binary is integrated into the `cargo` command line by using an alias in
13 use pico_args::Arguments;
15 codegen::{self, Mode},
17 install::{ClientOpt, InstallCmd, Malloc, ServerOpt},
20 pre_cache::PreCacheCmd,
21 pre_commit, project_root,
22 release::{PromoteCmd, ReleaseCmd},
23 run_clippy, run_fuzzer, run_rustfmt, Result,
26 fn main() -> Result<()> {
27 if env::args().next().map(|it| it.contains("pre-commit")) == Some(true) {
28 return pre_commit::run_hook();
31 let _d = pushd(project_root());
33 let mut args = Arguments::from_env();
34 let subcommand = args.subcommand()?.unwrap_or_default();
36 match subcommand.as_str() {
38 if args.contains(["-h", "--help"]) {
42 Install rust-analyzer server or editor plugin.
45 cargo xtask install [FLAGS]
48 --client-code Install only VS Code plugin
49 --server Install only the language server
50 --mimalloc Use mimalloc for server
51 -h, --help Prints help information
56 let server = args.contains("--server");
57 let client_code = args.contains("--client-code");
58 if server && client_code {
60 "error: The argument `--server` cannot be used with `--client-code`\n\n\
61 For more information try --help"
67 if args.contains("--mimalloc") { Malloc::Mimalloc } else { Malloc::System };
72 client: if server { None } else { Some(ClientOpt::VsCode) },
73 server: if client_code { None } else { Some(ServerOpt { malloc }) },
79 codegen::generate_syntax(Mode::Overwrite)?;
80 codegen::generate_unstable_future_descriptor(Mode::Overwrite)?;
81 codegen::generate_parser_tests(Mode::Overwrite)?;
82 codegen::generate_assists_tests(Mode::Overwrite)?;
83 codegen::generate_assists_docs(Mode::Overwrite)?;
84 codegen::generate_feature_docs(Mode::Overwrite)?;
89 run_rustfmt(Mode::Overwrite)
91 "install-pre-commit-hook" => {
93 pre_commit::install_hook()
108 let dry_run = args.contains("--dry-run");
110 ReleaseCmd { dry_run }.run()
113 let dry_run = args.contains("--dry-run");
115 PromoteCmd { dry_run }.run()
118 let nightly = args.contains("--nightly");
119 let client_version: Option<String> = args.opt_value_from_str("--client")?;
121 DistCmd { nightly, client_version }.run()
124 let dry_run = args.contains("--dry-run");
126 MetricsCmd { dry_run }.run()
132 Run custom build command.
135 cargo xtask <SUBCOMMAND>
139 install-pre-commit-hook