anki/rslib/BUILD.bazel
Damien Elmes 3dad3c90d0 add .sql file formatter
Uses the logic from the sqltools VSCode add-on, with a workaround
for the use of 'type' in some table columns.

By detecting the presence of 'BUILD_WORKSPACE_DIRECTORY' we can tell
if the rule is running in test mode or was run directly, avoiding the
need for separate check and fix rules. It might be nice to extend this
to other formatting rules in the future as well.
2021-01-09 14:22:49 +10:00

199 lines
4.9 KiB
Python

load("@rules_proto//proto:defs.bzl", "proto_library")
load("@io_bazel_rules_rust//rust:rust.bzl", "rust_binary", "rust_library", "rust_test")
load("@io_bazel_rules_rust//cargo:cargo_build_script.bzl", "cargo_build_script")
load(":rustfmt.bzl", "rustfmt_fix", "rustfmt_test")
load("//ts:sql_format.bzl", "sql_format")
# Build script
#######################
cargo_build_script(
name = "build_script",
srcs = glob(["build/*.rs"]),
build_script_env = {
"BACKEND_PROTO": "$(location backend.proto)",
"PROTOC": "$(location @com_google_protobuf//:protoc)",
"RSLIB_FTL_ROOT": "$(location @rslib_ftl//:l10n.toml)",
"EXTRA_FTL_ROOT": "$(location @extra_ftl//:l10n.toml)",
"BAZEL": "1",
},
crate_root = "build/main.rs",
data = [
"//ftl",
"backend.proto",
"@com_google_protobuf//:protoc",
# bazel requires us to list these out separately
"@rslib_ftl//:l10n.toml",
"@extra_ftl//:l10n.toml",
],
deps = [
"//rslib/cargo:fluent_syntax",
"//rslib/cargo:prost_build",
],
)
# Library
#######################
_anki_compile_data = glob([
"src/**/*.sql",
"src/**/*.html",
"src/**/*.css",
"src/**/*.tex",
]) + [
"Cargo.toml", # prevents a warning about num_enum
"//:buildinfo.txt",
"templates/.empty", # required for askama
]
_anki_features = [
"translations",
]
_anki_rustc_env = {
"BUILDINFO": "$(location //:buildinfo.txt)",
}
rust_library(
name = "anki",
srcs = glob([
"src/**/*.rs",
]),
compile_data = _anki_compile_data,
crate_features = _anki_features,
proc_macro_deps = [
"//rslib/cargo:serde_derive",
"//rslib/cargo:serde_repr",
],
rustc_env = _anki_rustc_env,
visibility = ["//visibility:public"],
deps = [
":build_script",
"//rslib/cargo:askama",
"//rslib/cargo:async_compression",
"//rslib/cargo:blake3",
"//rslib/cargo:bytes",
"//rslib/cargo:chrono",
"//rslib/cargo:coarsetime",
"//rslib/cargo:failure",
"//rslib/cargo:flate2",
"//rslib/cargo:fluent",
"//rslib/cargo:futures",
"//rslib/cargo:hex",
"//rslib/cargo:htmlescape",
"//rslib/cargo:intl_memoizer",
"//rslib/cargo:itertools",
"//rslib/cargo:lazy_static",
"//rslib/cargo:nom",
"//rslib/cargo:num_enum",
"//rslib/cargo:num_format",
"//rslib/cargo:num_integer",
"//rslib/cargo:once_cell",
"//rslib/cargo:pin_project",
"//rslib/cargo:prost",
"//rslib/cargo:rand",
"//rslib/cargo:regex",
"//rslib/cargo:reqwest",
"//rslib/cargo:rusqlite",
"//rslib/cargo:scopeguard",
"//rslib/cargo:serde",
"//rslib/cargo:serde_aux",
"//rslib/cargo:serde_json",
"//rslib/cargo:serde_tuple",
"//rslib/cargo:sha1",
"//rslib/cargo:slog",
"//rslib/cargo:slog_async",
"//rslib/cargo:slog_envlogger",
"//rslib/cargo:slog_term",
"//rslib/cargo:tempfile",
"//rslib/cargo:tokio",
"//rslib/cargo:unic_langid",
"//rslib/cargo:unicase",
"//rslib/cargo:unicode_normalization",
"//rslib/cargo:utime",
"//rslib/cargo:zip",
],
)
# Tests
#######################
rust_test(
name = "unit_tests",
compile_data = _anki_compile_data,
crate = ":anki",
crate_features = _anki_features,
data = glob([
"tests/support/**",
]),
rustc_env = _anki_rustc_env,
deps = ["//rslib/cargo:env_logger"],
)
rustfmt_test(
name = "format_check",
srcs = glob([
"src/**/*.rs",
]),
)
rustfmt_fix(
name = "format",
srcs = glob([
"src/**/*.rs",
]),
)
sql_format(
name = "sql_format",
srcs = glob(["**/*.sql"]),
)
# fluent.proto generation
###########################
# This separate step is required to make the file available to downstream consumers.
rust_binary(
name = "write_fluent_proto",
srcs = [
"build/mergeftl.rs",
"build/write_fluent_proto.rs",
],
deps = ["//rslib/cargo:fluent_syntax"],
)
genrule(
name = "fluent_proto",
srcs = [
"//ftl",
"//ftl:BUILD.bazel",
"//rslib/cargo:fluent_syntax",
"@rslib_ftl//:l10n.toml",
"@extra_ftl//:l10n.toml",
],
outs = ["fluent.proto"],
cmd = """\
RSLIB_FTL_ROOT="$(location @rslib_ftl//:l10n.toml)" \
EXTRA_FTL_ROOT="$(location @extra_ftl//:l10n.toml)" \
FTL_SRC="$(location //ftl:BUILD.bazel)" \
$(location :write_fluent_proto) $(location fluent.proto)""",
tools = [
":write_fluent_proto",
],
visibility = ["//visibility:public"],
)
proto_library(
name = "fluent_proto_lib",
srcs = ["fluent.proto"],
visibility = ["//visibility:public"],
)
proto_library(
name = "backend_proto_lib",
srcs = ["backend.proto"],
visibility = ["//visibility:public"],
)
exports_files(["backend.proto"])