diff --git a/config/makefiles/rust.mk b/config/makefiles/rust.mk index 13c77b5c3d86..6a7b93e8e09f 100644 --- a/config/makefiles/rust.mk +++ b/config/makefiles/rust.mk @@ -329,6 +329,9 @@ $(call RUN_CARGO,udeps) endef endif +define CARGO_CLIPPY +$(call RUN_CARGO,clippy) +endef define CARGO_AUDIT $(call RUN_CARGO,audit) endef @@ -466,6 +469,9 @@ endif force-cargo-library-check: $(call CARGO_CHECK) --lib $(cargo_target_flag) $(rust_features_flag) +force-cargo-library-clippy: + $(call CARGO_CLIPPY) --lib $(cargo_target_flag) $(rust_features_flag) + force-cargo-library-audit: $(call CARGO_AUDIT) @@ -476,6 +482,8 @@ force-cargo-library-check: @true force-cargo-library-udeps: @true +force-cargo-library-clippy: + @true force-cargo-library-audit: @true endif # RUST_LIBRARY_FILE @@ -511,6 +519,9 @@ $(HOST_RUST_LIBRARY_FILE): force-cargo-host-library-build ; force-cargo-host-library-check: $(call CARGO_CHECK) --lib $(cargo_host_flag) $(host_rust_features_flag) +force-cargo-host-library-clippy: + $(call CARGO_CLIPPY) --lib $(cargo_host_flag) $(host_rust_features_flag) + force-cargo-host-library-audit: $(call CARGO_AUDIT) --lib $(filter-out --release $(cargo_target_flag)) $(host_rust_features_flag) @@ -519,6 +530,8 @@ force-cargo-host-library-udeps: else force-cargo-host-library-check: @true +force-cargo-host-library-clippy: + @true force-cargo-host-library-audit: @true force-cargo-host-library-udeps: @@ -535,6 +548,10 @@ $(RUST_PROGRAMS): force-cargo-program-build ; force-cargo-program-check: $(call CARGO_CHECK) $(addprefix --bin ,$(RUST_CARGO_PROGRAMS)) $(cargo_target_flag) + +force-cargo-program-clippy: + $(call CARGO_CLIPPY) $(addprefix --bin ,$(RUST_CARGO_PROGRAMS)) $(cargo_target_flag) + force-cargo-program-audit: $(call CARGO_AUDIT) $(addprefix --bin ,$(RUST_CARGO_PROGRAMS)) $(filter-out --release $(cargo_target_flag)) @@ -543,6 +560,8 @@ force-cargo-program-udeps: else force-cargo-program-check: @true +force-cargo-program-clippy: + @true force-cargo-program-audit: @true force-cargo-program-udeps: @@ -559,6 +578,11 @@ $(HOST_RUST_PROGRAMS): force-cargo-host-program-build ; force-cargo-host-program-check: $(REPORT_BUILD) $(call CARGO_CHECK) $(addprefix --bin ,$(HOST_RUST_CARGO_PROGRAMS)) $(cargo_host_flag) + +force-cargo-host-program-clippy: + $(REPORT_BUILD) + $(call CARGO_CLIPPY) $(addprefix --bin ,$(HOST_RUST_CARGO_PROGRAMS)) $(cargo_host_flag) + force-cargo-host-program-audit: $(REPORT_BUILD) $(call CARGO_CHECK) $(addprefix --bin ,$(HOST_RUST_CARGO_PROGRAMS)) $(filter-out --release $(cargo_target_flag)) @@ -569,6 +593,8 @@ force-cargo-host-program-udeps: else force-cargo-host-program-check: @true +force-cargo-host-program-clippy: + @true force-cargo-host-program-audit: @true force-cargo-host-program-udeps: diff --git a/python/mozbuild/mozbuild/mach_commands.py b/python/mozbuild/mozbuild/mach_commands.py index 9b9204281e14..5dd8739bef1d 100644 --- a/python/mozbuild/mozbuild/mach_commands.py +++ b/python/mozbuild/mozbuild/mach_commands.py @@ -386,6 +386,114 @@ def cargo_vet(command_context, arguments, stdout=None, env=os.environ): return res if stdout else res.returncode +@SubCommand( + "cargo", + "clippy", + description="Run `cargo clippy` on a given crate. Defaults to gkrust.", + metrics_path=MOZBUILD_METRICS_PATH, +) +@CommandArgument( + "--all-crates", + default=None, + action="store_true", + help="Check all of the crates in the tree.", +) +@CommandArgument("crates", default=None, nargs="*", help="The crate name(s) to check.") +@CommandArgument( + "--jobs", + "-j", + default="1", + nargs="?", + metavar="jobs", + type=int, + help="Run the tests in parallel using multiple processes.", +) +@CommandArgument("-v", "--verbose", action="store_true", help="Verbose output.") +@CommandArgument( + "--message-format-json", + action="store_true", + help="Emit error messages as JSON.", +) +def clippy( + command_context, + all_crates=None, + crates=None, + jobs=0, + verbose=False, + message_format_json=False, +): + from mozbuild.controller.building import BuildDriver + + command_context.log_manager.enable_all_structured_loggers() + + try: + command_context.config_environment + except BuildEnvironmentNotFoundException: + build = command_context._spawn(BuildDriver) + ret = build.build( + command_context.metrics, + what=["pre-export", "export"], + jobs=jobs, + verbose=verbose, + mach_context=command_context._mach_context, + ) + if ret != 0: + return ret + # XXX duplication with `mach vendor rust` + crates_and_roots = { + "gkrust": "toolkit/library/rust", + "gkrust-gtest": "toolkit/library/gtest/rust", + "geckodriver": "testing/geckodriver", + } + + if all_crates: + crates = crates_and_roots.keys() + elif crates is None or crates == []: + crates = ["gkrust"] + + final_ret = 0 + + for crate in crates: + root = crates_and_roots.get(crate, None) + if not root: + print( + "Cannot locate crate %s. Please check your spelling or " + "add the crate information to the list." % crate + ) + return 1 + + check_targets = [ + "force-cargo-library-clippy", + "force-cargo-host-library-clippy", + "force-cargo-program-clippy", + "force-cargo-host-program-clippy", + ] + + append_env = {} + if message_format_json: + append_env["USE_CARGO_JSON_MESSAGE_FORMAT"] = "1" + + ret = 2 + + try: + ret = command_context._run_make( + srcdir=False, + directory=root, + ensure_exit_code=0, + silent=not verbose, + print_directory=False, + target=check_targets, + num_jobs=jobs, + append_env=append_env, + ) + except Exception as e: + print("%s" % e) + if ret != 0: + final_ret = ret + + return final_ret + + @SubCommand( "cargo", "audit",