1
1
mirror of https://github.com/github/semantic.git synced 2024-11-22 23:29:37 +03:00

simplifying target layouts.

This commit is contained in:
Patrick Thomson 2020-06-27 12:47:04 -04:00
parent 63a0dcebaa
commit dbce051436
22 changed files with 134 additions and 93 deletions

View File

@ -17,8 +17,14 @@ haskell_toolchain_library(name = "bytestring")
haskell_toolchain_library(name = "containers")
haskell_toolchain_library(name = "deepseq")
haskell_toolchain_library(name = "filepath")
haskell_toolchain_library(name = "text")
haskell_repl(
name = "hie-bios",
collect_data = False,
deps = ["//semantic:lib"],
deps = ["//semantic"],
)

View File

@ -55,16 +55,13 @@ stack_snapshot(
"aeson-pretty",
"algebraic-graphs",
"ansi-terminal",
"array",
"async",
"attoparsec",
"bazel-runfiles",
"bifunctors",
"deepseq",
"directory",
"directory-tree",
"doctest",
"filepath",
"fused-effects",
"fused-effects-exceptions",
"fused-effects-readline",
@ -118,7 +115,6 @@ stack_snapshot(
"template-haskell",
"temporary",
"terminal-size",
"text",
"time",
"transformers",
"tree-sitter",

View File

@ -62,13 +62,13 @@ def semantic_language_library(language, name, srcs, nodetypes = "", **kwargs):
extra_srcs = [nodetypes],
deps = [
"//:base",
"//semantic-analysis:lib",
"//semantic-ast:lib",
"//semantic-core:lib",
"//semantic-proto:lib",
"//semantic-scope-graph:lib",
"//semantic-source:lib",
"//semantic-tags:lib",
"//semantic-analysis",
"//semantic-ast",
"//semantic-core",
"//semantic-proto",
"//semantic-scope-graph",
"//semantic-source",
"//semantic-tags",
"@stackage//:aeson",
"@stackage//:algebraic-graphs",
"//:containers",
@ -81,7 +81,7 @@ def semantic_language_library(language, name, srcs, nodetypes = "", **kwargs):
"@stackage//:pathtype",
"@stackage//:semilattices",
"@stackage//:template-haskell",
"@stackage//:text",
"//:text",
"@stackage//:tree-sitter",
"@stackage//:tree-sitter-" + language,
],

View File

@ -4,24 +4,58 @@ The Semantic project supports builds with the Bazel build system. This is unconv
* Bazel uses content-addressed hashing and reproducible builds to provide sophisticated caching. Situations where Cabal invalidates caches can result in cascading build requirements, causing many rebuilds of the language syntax packages.
* Bazel's tooling is (on Emacs with lsp-mode and lsp-haskell) more reliable.
* Bazel gets Haskell dependencies from Stackage LTS versions, so we avoid the rebuilds associated with living on the latest Hackage snapshot.
## How do I get started?
Assuming you're on macOS, run the script located at ~script/bootstrap-bazel~. This uses Homebrew to install Bazel and creates the `.bazel-cache` directory.
The first time you run `bazel build`
## `cabal``stack` cheatsheet
| Operation | `cabal` | `bazel` |
|---------------------------|-------------------------------------|-------------------------------------|
| Build all | `cabal build all` | `bazel build //...` |
| Build `TARGET` library | `cabal build semantic-source:lib` | `bazel build //semantic-source/...` |
| Build semantic executable | `cabal build semantic:exe:semantic` | `bazel build //semantic:exe` |
| Build/run executable | `cabal run semantic -- ARGS` | `bazel run //semantic:exe -- ARGS` |
| Load REPL component | `script/ghci` and `:load` | `bazel build //TARGET:lib@repl` |
| Run tests | `cabal test all` | `bazel test //...` |
| Operation | `cabal` | `bazel` |
|---------------------------|-------------------------------------|------------------------------------|
| Build all | `cabal build all` | `bazel build //...` |
| Build `TARGET` library | `cabal build TARGET:lib` | `bazel build //TARGET` |
| Build semantic executable | `cabal build semantic:exe:semantic` | `bazel build //semantic:exe` |
| Build/run executable | `cabal run semantic -- ARGS` | `bazel run //semantic:exe -- ARGS` |
| Load REPL component | `script/ghci` and `:load` | `bazel build //TARGET@repl` |
| Run tests | `cabal test all` | `bazel test //...` |
## Adding a new dependency
Here's a breakdown of how to add a new package.
1. Make sure it's present in [Stackage LTS 13.15](https://www.stackage.org/lts-13.15). If not, add the package (versioned exactly) to the `stack-snapshot.yaml` file.
2. Make sure it's linked into the `WORKSPACE` file, in the `stack_snapshot` call.
3. Make sure it's present in your target's `deps` field.
If this seems complicated, don't worry: most of the time you'll be able to skip this first point, and you'll often be able to skip the second.
## Things to know
1. **Don't generally run `bazel clean`**. Since Bazel builds are reproducible, there's very little reason to clean, unless somehow your whole cache got irrevocably corrupted.
2. **You can load a REPL for any target by appending `@repl`.**
3. **Some packages come with GHC and are not loaded from Stackage**. These include `base`, `containers`, and [others](https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/8.10.1-notes.html?highlight=bytestring#included-libraries). To depend on those packages, you use `//:base`, `//:containers`, etc.
## Quick reference links
### Target syntax
* **Bazel manual**: https://docs.bazel.build/versions/3.3.0/bazel-overview.html
* **`rules_haskell` manual**: https://rules-haskell.readthedocs.io
* **`rules_haskell` API docs**: https://api.haskell.build
By convention, we give library targets the same name as their subproject. Test targets are called `test`.
## Conventions
We give library targets the same name as their subproject. Test targets are called `test`, and executable targets are `exe`.
The default `.bazelrc` file imports a `.bazelrc.local` file if it's present; use that for any Bazel customizations you want.
## Shared variables
* `STANDARD_GHC_WARNINGS`: the standard set of Cabal flags that all targets should use.
* `STANDARD_EXECUTABLE_FLAGS`: ditto, but with executable-specific flags.
## Custom rules
We have two custom rules, defined in `build/common.bzl`. The first, `tree_sitter_node_types_archive`, uses the `http_archive` rule to download a specified tree-sitter grammar's `node-types.json` file. These calls declare new top-level targets, so they're only present in the top-level `WORKSPACE` file. The second, `semantic_language_library`, takes care of the boilerplate associated with declaring a target for a `semantic-LANG` language package (as these packages' contents are identical, their target declarations are almost identical).

View File

@ -19,16 +19,17 @@ load(
# You can add your own libraries with haskell_library.
haskell_library(
name = "lib",
name = "semantic-analysis",
srcs = glob(["src/**/*.hs"]),
compiler_flags = STANDARD_GHC_WARNINGS + ["-XOverloadedStrings"],
deps = [
"//:base",
"//:containers",
"//semantic-source:lib",
"//:filepath",
"//:text",
"//semantic-source",
"@stackage//:aeson",
"@stackage//:algebraic-graphs",
"@stackage//:filepath",
"@stackage//:fused-effects",
"@stackage//:fused-effects-readline",
"@stackage//:fused-syntax",
@ -39,7 +40,6 @@ haskell_library(
"@stackage//:prettyprinter-ansi-terminal",
"@stackage//:semilattices",
"@stackage//:terminal-size",
"@stackage//:text",
"@stackage//:transformers",
],
)

View File

@ -19,20 +19,21 @@ load(
# You can add your own libraries with haskell_library.
haskell_library(
name = "lib",
name = "semantic-ast",
srcs = glob(["src/**/*.hs"]),
compiler_flags = STANDARD_GHC_WARNINGS + ["-XOverloadedStrings"],
deps = [
"//:base",
"//:bytestring",
"//:containers",
"//semantic-source:lib",
"//:filepath",
"//:text",
"//semantic-source",
"@stackage//:Glob",
"@stackage//:aeson",
"@stackage//:aeson-pretty",
"@stackage//:attoparsec",
"@stackage//:directory",
"@stackage//:filepath",
"@stackage//:fused-effects",
"@stackage//:hedgehog",
"@stackage//:optparse-applicative",
@ -42,7 +43,6 @@ haskell_library(
"@stackage//:tasty-hedgehog",
"@stackage//:tasty-hunit",
"@stackage//:template-haskell",
"@stackage//:text",
"@stackage//:tree-sitter",
"@stackage//:tree-sitter-python",
"@stackage//:unordered-containers",

View File

@ -6,7 +6,7 @@ load(
)
semantic_language_library(
name = "lib",
name = "semantic-codeql",
srcs = glob(["src/**/*.hs"]),
language = "ql",
)

View File

@ -20,13 +20,14 @@ load(
# You can add your own libraries with haskell_library.
haskell_library(
name = "lib",
name = "semantic-core",
srcs = glob(["src/**/*.hs"]),
compiler_flags = STANDARD_GHC_WARNINGS,
deps = [
"//:base",
"//semantic-analysis:lib",
"//semantic-source:lib",
"//:text",
"//semantic-analysis",
"//semantic-source",
"@stackage//:fused-effects",
"@stackage//:fused-syntax",
"@stackage//:hashable",
@ -34,7 +35,6 @@ haskell_library(
"@stackage//:pathtype",
"@stackage//:prettyprinter",
"@stackage//:prettyprinter-ansi-terminal",
"@stackage//:text",
"@stackage//:trifecta",
"@stackage//:unordered-containers",
],
@ -48,17 +48,17 @@ haskell_test(
]),
compiler_flags = STANDARD_GHC_WARNINGS + STANDARD_EXECUTABLE_FLAGS,
deps = [
":lib",
"//:base",
"//semantic-analysis:lib",
"//semantic-source:lib",
"//:text",
"//semantic-analysis",
"//semantic-core",
"//semantic-source",
"@stackage//:fused-effects",
"@stackage//:fused-syntax",
"@stackage//:hedgehog",
"@stackage//:tasty",
"@stackage//:tasty-hedgehog",
"@stackage//:tasty-hunit",
"@stackage//:text",
"@stackage//:trifecta",
],
)

View File

@ -6,7 +6,7 @@ load(
)
semantic_language_library(
name = "lib",
name = "semantic-go",
srcs = glob(["src/**/*.hs"]),
language = "go",
)

View File

@ -6,7 +6,7 @@ load(
)
semantic_language_library(
name = "lib",
name = "semantic-java",
srcs = glob(["src/**/*.hs"]),
language = "java",
)

View File

@ -6,7 +6,7 @@ load(
)
semantic_language_library(
name = "lib",
name = "semantic-json",
srcs = glob(["src/**/*.hs"]),
language = "json",
)

View File

@ -19,14 +19,14 @@ load(
# compiler_flags = STANDARD_GHC_WARNINGS,
# deps = [
# ":base",
# "//semantic-ast:lib",
# "//semantic-python:lib",
# "//semantic-source:lib",
# "//semantic-ast",
# "//semantic-python",
# "//semantic-source",
# "@stackage//:aeson",
# "@stackage//:aeson-pretty",
# "//:bytestring",
# "@stackage//:optparse-applicative",
# "@stackage//:pretty-simple",
# "@stackage//:text",
# "//:text",
# ],
# )

View File

@ -6,7 +6,7 @@ load(
)
semantic_language_library(
name = "lib",
name = "semantic-php",
srcs = glob(["src/**/*.hs"]),
language = "php",
)

View File

@ -15,14 +15,14 @@ load(
# You can add your own libraries with haskell_library.
haskell_library(
name = "lib",
name = "semantic-proto",
srcs = glob(["src/**/*.hs"]),
deps = [
"//:base",
"//:text",
"@stackage//:aeson",
"@stackage//:proto-lens",
"@stackage//:proto-lens-jsonpb",
"@stackage//:proto-lens-runtime",
"@stackage//:text",
],
)

View File

@ -7,7 +7,7 @@ load(
)
semantic_language_library(
name = "lib",
name = "semantic-python",
srcs = glob(
include = ["src/**/*.hs"],
exclude = [

View File

@ -6,7 +6,7 @@ load(
)
semantic_language_library(
name = "lib",
name = "semantic-ruby",
srcs = glob(["src/**/*.hs"]),
language = "ruby",
nodetypes = "@tree-sitter-ruby//:src/node-types.json",

View File

@ -19,14 +19,15 @@ load(
# You can add your own libraries with haskell_library.
haskell_library(
name = "lib",
name = "semantic-scope-graph",
srcs = glob(["src/**/*.hs"]),
compiler_flags = STANDARD_GHC_WARNINGS + ["-XOverloadedStrings"],
deps = [
"//:base",
"//:containers",
"//semantic-analysis:lib",
"//semantic-source:lib",
"//:text",
"//semantic-analysis",
"//semantic-source",
"@stackage//:aeson",
"@stackage//:algebraic-graphs",
"@stackage//:fused-effects",
@ -36,6 +37,5 @@ haskell_library(
"@stackage//:lens",
"@stackage//:pathtype",
"@stackage//:semilattices",
"@stackage//:text",
],
)

View File

@ -19,22 +19,22 @@ load(
)
haskell_library(
name = "lib",
name = "semantic-source",
srcs = glob(["src/**/*.hs"]),
compiler_flags = STANDARD_GHC_WARNINGS + ["-XOverloadedStrings"],
deps = [
"//:base",
"//:bytestring",
"//:containers",
"//:deepseq",
"//:filepath",
"//:text",
"@lingo",
"@stackage//:aeson",
"@stackage//:deepseq",
"@stackage//:filepath",
"@stackage//:generic-monoid",
"@stackage//:hashable",
"@stackage//:pathtype",
"@stackage//:semilattices",
"@stackage//:text",
],
)
@ -46,12 +46,12 @@ haskell_test(
],
compiler_flags = STANDARD_GHC_WARNINGS + STANDARD_EXECUTABLE_FLAGS,
deps = [
":lib",
":semantic-source",
"//:base",
"//:text",
"@stackage//:hedgehog",
"@stackage//:tasty",
"@stackage//:tasty-hedgehog",
"@stackage//:tasty-hunit",
"@stackage//:text",
],
)

View File

@ -19,14 +19,14 @@ load(
# You can add your own libraries with haskell_library.
haskell_library(
name = "lib",
name = "semantic-tags",
srcs = glob(["src/**/*.hs"]),
compiler_flags = STANDARD_GHC_WARNINGS,
deps = [
"//:base",
"//semantic-proto:lib",
"//semantic-source:lib",
"//:text",
"//semantic-proto",
"//semantic-source",
"@stackage//:fused-effects",
"@stackage//:text",
],
)

View File

@ -6,7 +6,7 @@ load(
)
semantic_language_library(
name = "lib",
name = "semantic-tsx",
srcs = glob(["src/**/*.hs"]),
language = "tsx",
nodetypes = "@tree-sitter-typescript//:tsx/src/node-types.json",

View File

@ -6,7 +6,7 @@ load(
)
semantic_language_library(
name = "lib",
name = "semantic-typescript",
srcs = glob(["src/**/*.hs"]),
language = "typescript",
nodetypes = "@tree-sitter-typescript//:typescript/src/node-types.json",

View File

@ -25,9 +25,9 @@ haskell_toolchain_library(name = "ghc-prim")
semantic_common_dependencies = [
"//:bytestring",
"//:containers",
"//semantic-analysis:lib",
"//semantic-ast:lib",
"//semantic-source:lib",
"//semantic-analysis",
"//semantic-ast",
"//semantic-source",
"@stackage//:aeson",
"@stackage//:algebraic-graphs",
"@stackage//:async",
@ -44,37 +44,37 @@ semantic_common_dependencies = [
"@stackage//:scientific",
"@stackage//:semilattices",
"@stackage//:streaming",
"@stackage//:text",
"//:text",
"@stackage//:unix",
]
# You can add your own libraries with haskell_library.
haskell_library(
name = "lib",
name = "semantic",
srcs = glob(["src/**/*.hs"]),
compiler_flags = STANDARD_GHC_WARNINGS + ["-XStrictData"],
version = "0.11.0.0",
deps = semantic_common_dependencies + [
"//:base",
"//:deepseq",
":ghc-prim",
"//semantic-codeql:lib",
"//semantic-go:lib",
"//semantic-java:lib",
"//semantic-json:lib",
"//semantic-php:lib",
"//semantic-proto:lib",
"//semantic-python:lib",
"//semantic-ruby:lib",
"//semantic-scope-graph:lib",
"//semantic-tags:lib",
"//semantic-tsx:lib",
"//semantic-typescript:lib",
"//semantic-codeql",
"//semantic-go",
"//semantic-java",
"//semantic-json",
"//semantic-php",
"//semantic-proto",
"//semantic-python",
"//semantic-ruby",
"//semantic-scope-graph",
"//semantic-tags",
"//semantic-tsx",
"//semantic-typescript",
"@stackage//:ansi-terminal",
"@stackage//:array",
"@stackage//:attoparsec",
"@stackage//:bifunctors",
"@stackage//:deepseq",
"@stackage//:directory-tree",
"@stackage//:filepath",
"//:filepath",
"@stackage//:fused-syntax",
"@stackage//:generic-lens",
"@stackage//:generic-monoid",
@ -113,8 +113,13 @@ haskell_binary(
srcs = glob(["app/**/*.hs"]),
compiler_flags = STANDARD_GHC_WARNINGS + STANDARD_EXECUTABLE_FLAGS + ["-XStrictData"],
deps = [
":semantic",
"//:base",
"//semantic:lib",
"//:filepath",
"//semantic-analysis",
"//semantic-proto",
"@stackage//:optparse-applicative",
"@stackage//:unix",
],
)
@ -140,10 +145,10 @@ haskell_test(
]),
deps = semantic_common_dependencies + [
"//:base",
"//semantic:lib",
"//semantic-proto:lib",
"//semantic-json:lib",
"//semantic-tags:lib",
"//semantic",
"//semantic-proto",
"//semantic-json",
"//semantic-tags",
"@stackage//:Glob",
"@stackage//:HUnit",
"@stackage//:bazel-runfiles",