feat(third_party/bazel): Check in rules_haskell from Tweag
This commit is contained in:
parent
2eb1dc26e4
commit
f723b8b878
479 changed files with 51484 additions and 0 deletions
119
third_party/bazel/rules_haskell/haskell/nix/default.nix
vendored
Normal file
119
third_party/bazel/rules_haskell/haskell/nix/default.nix
vendored
Normal file
|
|
@ -0,0 +1,119 @@
|
|||
/**
|
||||
Generate a bazel-friendly nix package containing
|
||||
- The haskell package itself
|
||||
- Its documentation
|
||||
- A bazel file ready to be loaded from the `BUILD` file and containing the
|
||||
right call to `haskell_import`
|
||||
*/
|
||||
{ runCommand, lib, writeTextDir, symlinkJoin }:
|
||||
let
|
||||
/* Generate the BUILD file for the package */
|
||||
genBuildFile =
|
||||
{ package_name, package, ghc }:
|
||||
runCommand "${package_name}-BUILD" {
|
||||
preferLocalBuild = true;
|
||||
allowSubstitutes = false;
|
||||
ghc_pkg = "${ghc}/bin/ghc-pkg --simple-output -v0";
|
||||
GHC_PACKAGE_PATH = "${package}/lib/${ghc.name}/package.conf.d";
|
||||
inherit package_name;
|
||||
} ''
|
||||
query_field () {
|
||||
$ghc_pkg field ${package_name} "$@"
|
||||
}
|
||||
|
||||
query_haddock () {
|
||||
echo -n '['
|
||||
for FIELD in $(query_field "$@"); do
|
||||
echo -n "\"$(echo "$FIELD" | cut -d/ -f5-)*\","
|
||||
echo -n "\"$(echo "$FIELD" | cut -d/ -f5-)/*\","
|
||||
done
|
||||
echo -n ']'
|
||||
}
|
||||
|
||||
query_list () {
|
||||
echo -n '['
|
||||
for FIELD in $(query_field "$@"); do
|
||||
echo -n '"'
|
||||
echo -n $(echo "$FIELD" | cut -d/ -f5-)
|
||||
echo -n '",'
|
||||
done
|
||||
echo -n ']'
|
||||
}
|
||||
|
||||
get_deps () {
|
||||
echo -n '['
|
||||
for DEP in $(query_field depends); do
|
||||
DEPNAME=$(echo $DEP | sed 's/-[0-9].*//')
|
||||
# Because of cabal's "internal libraries", we may have a package
|
||||
# apparently depending on itself, so we have to filter out this
|
||||
# corner-case (see
|
||||
# https://github.com/tweag/rules_haskell/pull/442#discussion_r219859467)
|
||||
if [[ -n $DEPNAME && $DEPNAME != $(query_field name) ]]; then
|
||||
echo -n "\"@hackage-$DEPNAME\","
|
||||
fi
|
||||
done
|
||||
echo -n ']'
|
||||
}
|
||||
|
||||
mkdir -p $out
|
||||
cat <<EOF > $out/BUILD.bzl
|
||||
load("@io_tweag_rules_haskell//haskell:import.bzl", haskell_import_new = "haskell_import")
|
||||
deps_repos = $(get_deps)
|
||||
|
||||
def targets():
|
||||
|
||||
haskell_import_new(
|
||||
name = "pkg",
|
||||
deps = [ dep + "//:pkg" for dep in deps_repos],
|
||||
package_id = "$(query_field id)",
|
||||
version = "$(query_field version)",
|
||||
package_confs = "//:package_conf",
|
||||
haddock_interfaces = "//:interfaces",
|
||||
haddock_html = "//:html",
|
||||
)
|
||||
native.filegroup(
|
||||
name = "html",
|
||||
srcs = native.glob($(query_haddock haddock-html), exclude_directories=1),
|
||||
)
|
||||
native.filegroup(
|
||||
name = "interfaces",
|
||||
srcs = native.glob($(query_haddock haddock-interfaces), exclude_directories=0),
|
||||
)
|
||||
native.filegroup(
|
||||
name = "bin",
|
||||
srcs = native.glob(["bin/*"]),
|
||||
)
|
||||
native.filegroup(
|
||||
name = "package_conf",
|
||||
srcs = native.glob(["lib*/${ghc.name}/package.conf.d/$(query_field name)*.conf"]),
|
||||
)
|
||||
EOF
|
||||
'';
|
||||
genAllBuilds = pkgSet:
|
||||
let newSet =
|
||||
lib.mapAttrs (package_name: package:
|
||||
let
|
||||
# Some nix packages are actually `null` because the haskell package is
|
||||
# bundled with ghc (so it doesn't have a custom derivation of its own).
|
||||
# For these, we simply pass the ghc derivation instead of theirs.
|
||||
real_package = if builtins.isNull package then pkgSet.ghc else package;
|
||||
buildFile = genBuildFile {
|
||||
inherit (pkgSet) ghc;
|
||||
inherit package_name;
|
||||
package = real_package;
|
||||
};
|
||||
in
|
||||
symlinkJoin {
|
||||
name = package_name + "-bazel";
|
||||
paths = [ real_package (real_package.doc or null) buildFile ];
|
||||
}
|
||||
)
|
||||
pkgSet;
|
||||
in
|
||||
newSet // {
|
||||
packageNames = writeTextDir
|
||||
"all-haskell-packages.bzl"
|
||||
("packages =" + builtins.toJSON (builtins.attrNames newSet));
|
||||
};
|
||||
in
|
||||
genAllBuilds
|
||||
Loading…
Add table
Add a link
Reference in a new issue