forked from hswaw/hscloud
109 lines
3.6 KiB
Python
109 lines
3.6 KiB
Python
load("@io_tweag_rules_nixpkgs//nixpkgs:repositories.bzl", "rules_nixpkgs_dependencies")
|
|
load("@io_tweag_rules_nixpkgs//nixpkgs:nixpkgs.bzl", "nixpkgs_git_repository", "nixpkgs_package")
|
|
|
|
def has_nix(ctx):
|
|
return ctx.which("nix-build") != None
|
|
|
|
def _hscloud_gen_go_imports_impl(ctx):
|
|
ctx.file("BUILD", "")
|
|
|
|
imports_for_nix = """
|
|
load("@io_tweag_rules_nixpkgs//nixpkgs:toolchains/go.bzl", "nixpkgs_go_configure")
|
|
|
|
def hscloud_go_register_toolchains():
|
|
nixpkgs_go_configure(repository = "@nixpkgs")
|
|
"""
|
|
imports_for_non_nix = """
|
|
load("@io_bazel_rules_go//go:deps.bzl", "go_rules_dependencies", "go_register_toolchains")
|
|
def hscloud_go_register_toolchains():
|
|
go_register_toolchains()
|
|
"""
|
|
|
|
if has_nix(ctx):
|
|
ctx.file("imports.bzl", imports_for_nix)
|
|
else:
|
|
ctx.file("imports.bzl", imports_for_non_nix)
|
|
|
|
# Generate repository containing either a call to go_register_toolchains() or
|
|
# nixpkgs_go_configure(), depending on nix presence.
|
|
hscloud_gen_go_imports = repository_rule(
|
|
implementation = _hscloud_gen_go_imports_impl,
|
|
attrs = dict(),
|
|
)
|
|
|
|
def _hscloud_gen_pip_imports_impl(ctx):
|
|
ctx.file("BUILD", "")
|
|
|
|
# For Nix, we have to both pass our interpreter to pip3_import, and also
|
|
# register it as a toolchain.
|
|
imports_for_nix = """
|
|
load("@rules_python//python:pip.bzl", "pip3_import")
|
|
def hscloud_pip3_import(name, requirements):
|
|
pip3_import(
|
|
name = name,
|
|
requirements = requirements,
|
|
python_interpreter_target = "@hscloud_nix_python3//:python3",
|
|
)
|
|
native.register_toolchains("//third_party/nix:py_toolchain")
|
|
"""
|
|
imports_for_non_nix = """
|
|
load("@rules_python//python:pip.bzl", "pip3_import")
|
|
def hscloud_pip3_import(name, requirements):
|
|
pip3_import(
|
|
name = name,
|
|
requirements = requirements,
|
|
)
|
|
"""
|
|
if has_nix(ctx):
|
|
ctx.file("imports.bzl", imports_for_nix)
|
|
else:
|
|
ctx.file("imports.bzl", imports_for_non_nix)
|
|
|
|
# Generate repository containing a wrapped pip3_import that either uses the
|
|
# host Python interpreter or one from nixpkgs, depending on nix presence.
|
|
hscloud_gen_pip_imports = repository_rule(
|
|
implementation = _hscloud_gen_pip_imports_impl,
|
|
attrs = dict(),
|
|
)
|
|
|
|
def hscloud_setup_nix(revision, sha256):
|
|
rules_nixpkgs_dependencies()
|
|
nixpkgs_git_repository(
|
|
name = "nixpkgs",
|
|
revision = "1179840f9a88b8a548f4b11d1a03aa25a790c379",
|
|
sha256 = "8b64041bfb9760de9e797c0a985a4830880c21732489f397e217d877edd9a990",
|
|
)
|
|
|
|
# Load python from nixpkgs. Python is a large source of non-hermiticity,
|
|
# and loading it from nix vastly hermeticizes the build - well, at least to
|
|
# also be dependent on this Nix store state. That's still better than just
|
|
# grabbing whatever random system Python a user might have.
|
|
nixpkgs_package(
|
|
name = "hscloud_nix_python2",
|
|
repositories = { "nixpkgs": "@nixpkgs//:default.nix" },
|
|
nix_file = "//third_party/nix:python.nix",
|
|
attribute_path = "python2",
|
|
build_file_content = """
|
|
package(default_visibility = ["//visibility:public"])
|
|
exports_files(["python2"])
|
|
""",
|
|
)
|
|
nixpkgs_package(
|
|
name = "hscloud_nix_python3",
|
|
repositories = { "nixpkgs": "@nixpkgs//:default.nix" },
|
|
nix_file = "//third_party/nix:python.nix",
|
|
attribute_path = "python3",
|
|
build_file_content = """
|
|
package(default_visibility = ["//visibility:public"])
|
|
exports_files(["python3"])
|
|
""",
|
|
)
|
|
|
|
# Generate a Go toolchain setup workspace rule.
|
|
hscloud_gen_go_imports(
|
|
name = "hscloud_go_toolchain",
|
|
)
|
|
hscloud_gen_pip_imports(
|
|
name = "hscloud_pip_imports",
|
|
)
|