| # Copyright lowRISC contributors. | |
| # Licensed under the Apache License, Version 2.0, see LICENSE for details. | |
| # SPDX-License-Identifier: Apache-2.0 | |
| """Quality check rules for OpenTitan. | |
| """ | |
| load("@bazel_skylib//lib:shell.bzl", "shell") | |
| def _license_check_impl(ctx): | |
| args = [ | |
| "--config={}".format(ctx.file.config.path), | |
| ".", | |
| ] | |
| out_file = ctx.actions.declare_file(ctx.label.name + ".bash") | |
| substitutions = { | |
| "@@ARGS@@": shell.array_literal(args), | |
| "@@LICENSE_CHECK@@": shell.quote(ctx.executable.license_check.short_path), | |
| } | |
| ctx.actions.expand_template( | |
| template = ctx.file._runner, | |
| output = out_file, | |
| substitutions = substitutions, | |
| is_executable = True, | |
| ) | |
| return DefaultInfo( | |
| files = depset([out_file]), | |
| runfiles = ctx.runfiles(files = [ctx.executable.license_check]), | |
| executable = out_file, | |
| ) | |
| license_check = rule( | |
| implementation = _license_check_impl, | |
| attrs = { | |
| "config": attr.label( | |
| default = "//util:licence-checker.hjson", | |
| allow_single_file = True, | |
| doc = "Configuration file for the license checker", | |
| ), | |
| "license_check": attr.label( | |
| default = "//util:lowrisc_misc-linters/licence-checker/licence-checker.py", | |
| allow_single_file = True, | |
| cfg = "host", | |
| executable = True, | |
| doc = "The license checker executable", | |
| ), | |
| "_runner": attr.label( | |
| default = "//rules/scripts:license_check.template.sh", | |
| allow_single_file = True, | |
| ), | |
| }, | |
| executable = True, | |
| ) | |
| def _clang_format_impl(ctx): | |
| out_file = ctx.actions.declare_file(ctx.label.name + ".bash") | |
| exclude_patterns = ["\\! -path {}".format(shell.quote(p)) for p in ctx.attr.exclude_patterns] | |
| include_patterns = ["-name {}".format(shell.quote(p)) for p in ctx.attr.patterns] | |
| substitutions = { | |
| "@@EXCLUDE_PATTERNS@@": " ".join(exclude_patterns), | |
| "@@INCLUDE_PATTERNS@@": " -o ".join(include_patterns), | |
| "@@CLANG_FORMAT@@": shell.quote(ctx.executable.clang_format.short_path), | |
| "@@DIFF_COMMAND@@": shell.quote(ctx.attr.diff_command), | |
| "@@MODE@@": shell.quote(ctx.attr.mode), | |
| } | |
| ctx.actions.expand_template( | |
| template = ctx.file._runner, | |
| output = out_file, | |
| substitutions = substitutions, | |
| is_executable = True, | |
| ) | |
| return DefaultInfo( | |
| files = depset([out_file]), | |
| runfiles = ctx.runfiles(files = [ctx.executable.clang_format]), | |
| executable = out_file, | |
| ) | |
| clang_format_check = rule( | |
| implementation = _clang_format_impl, | |
| attrs = { | |
| "patterns": attr.string_list( | |
| default = ["*.c", "*.h", "*.cc", "*.cpp"], | |
| doc = "Filename patterns for format checking", | |
| ), | |
| "exclude_patterns": attr.string_list( | |
| doc = "Filename patterns to exlucde from format checking", | |
| ), | |
| "mode": attr.string( | |
| default = "diff", | |
| values = ["diff", "fix"], | |
| doc = "Execution mode: display diffs or fix formatting", | |
| ), | |
| "diff_command": attr.string( | |
| default = "diff -u", | |
| doc = "Command to execute to display diffs", | |
| ), | |
| "clang_format": attr.label( | |
| default = "@com_lowrisc_toolchain_rv32imc_compiler//:bin/clang-format", | |
| allow_single_file = True, | |
| cfg = "host", | |
| executable = True, | |
| doc = "The clang-format executable", | |
| ), | |
| "_runner": attr.label( | |
| default = "//rules/scripts:clang_format.template.sh", | |
| allow_single_file = True, | |
| ), | |
| }, | |
| executable = True, | |
| ) | |
| def _html_coverage_report_impl(ctx): | |
| out_file = ctx.actions.declare_file(ctx.label.name + ".bash") | |
| substitutions = {} | |
| ctx.actions.expand_template( | |
| template = ctx.file._runner, | |
| output = out_file, | |
| substitutions = substitutions, | |
| is_executable = True, | |
| ) | |
| return DefaultInfo( | |
| files = depset([out_file]), | |
| executable = out_file, | |
| ) | |
| html_coverage_report = rule( | |
| implementation = _html_coverage_report_impl, | |
| attrs = { | |
| "_runner": attr.label( | |
| default = "//rules/scripts:html_coverage_report.template.sh", | |
| allow_single_file = True, | |
| ), | |
| }, | |
| executable = True, | |
| ) |