]> git.lizzy.rs Git - rust.git/blob - xtask/src/main.rs
c4a15f4bdfe140d825e215cca780db465eaf02fc
[rust.git] / xtask / src / main.rs
1 //! See https://github.com/matklad/cargo-xtask/.
2 //!
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.
7 //!
8 //! This binary is integrated into the `cargo` command line by using an alias in
9 //! `.cargo/config`.
10
11 use std::env;
12
13 use pico_args::Arguments;
14 use xtask::{
15     codegen::{self, Mode},
16     dist::DistCmd,
17     install::{ClientOpt, InstallCmd, Malloc, ServerOpt},
18     metrics::MetricsCmd,
19     not_bash::pushd,
20     pre_cache::PreCacheCmd,
21     pre_commit, project_root,
22     release::{PromoteCmd, ReleaseCmd},
23     run_clippy, run_fuzzer, run_rustfmt, Result,
24 };
25
26 fn main() -> Result<()> {
27     if env::args().next().map(|it| it.contains("pre-commit")) == Some(true) {
28         return pre_commit::run_hook();
29     }
30
31     let _d = pushd(project_root());
32
33     let mut args = Arguments::from_env();
34     let subcommand = args.subcommand()?.unwrap_or_default();
35
36     match subcommand.as_str() {
37         "install" => {
38             if args.contains(["-h", "--help"]) {
39                 eprintln!(
40                     "\
41 cargo xtask install
42 Install rust-analyzer server or editor plugin.
43
44 USAGE:
45     cargo xtask install [FLAGS]
46
47 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
52         "
53                 );
54                 return Ok(());
55             }
56             let server = args.contains("--server");
57             let client_code = args.contains("--client-code");
58             if server && client_code {
59                 eprintln!(
60                     "error: The argument `--server` cannot be used with `--client-code`\n\n\
61                      For more information try --help"
62                 );
63                 return Ok(());
64             }
65
66             let malloc =
67                 if args.contains("--mimalloc") { Malloc::Mimalloc } else { Malloc::System };
68
69             args.finish()?;
70
71             InstallCmd {
72                 client: if server { None } else { Some(ClientOpt::VsCode) },
73                 server: if client_code { None } else { Some(ServerOpt { malloc }) },
74             }
75             .run()
76         }
77         "codegen" => {
78             args.finish()?;
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)?;
85             Ok(())
86         }
87         "format" => {
88             args.finish()?;
89             run_rustfmt(Mode::Overwrite)
90         }
91         "install-pre-commit-hook" => {
92             args.finish()?;
93             pre_commit::install_hook()
94         }
95         "lint" => {
96             args.finish()?;
97             run_clippy()
98         }
99         "fuzz-tests" => {
100             args.finish()?;
101             run_fuzzer()
102         }
103         "pre-cache" => {
104             args.finish()?;
105             PreCacheCmd.run()
106         }
107         "release" => {
108             let dry_run = args.contains("--dry-run");
109             args.finish()?;
110             ReleaseCmd { dry_run }.run()
111         }
112         "promote" => {
113             let dry_run = args.contains("--dry-run");
114             args.finish()?;
115             PromoteCmd { dry_run }.run()
116         }
117         "dist" => {
118             let nightly = args.contains("--nightly");
119             let client_version: Option<String> = args.opt_value_from_str("--client")?;
120             args.finish()?;
121             DistCmd { nightly, client_version }.run()
122         }
123         "metrics" => {
124             let dry_run = args.contains("--dry-run");
125             args.finish()?;
126             MetricsCmd { dry_run }.run()
127         }
128         _ => {
129             eprintln!(
130                 "\
131 cargo xtask
132 Run custom build command.
133
134 USAGE:
135     cargo xtask <SUBCOMMAND>
136
137 SUBCOMMANDS:
138     format
139     install-pre-commit-hook
140     fuzz-tests
141     codegen
142     install
143     lint
144     dist
145     promote"
146             );
147             Ok(())
148         }
149     }
150 }