Files
nixpkgs/pkgs/by-name/ba/bazel_8/package.nix
Dark Steveneq 646b892680
Some checks failed
Periodic Merges (6h) / master → staging-nixos (push) Failing after 12m50s
Periodic Merges (6h) / master → staging-next (push) Failing after 12m54s
Periodic Merges (24h) / merge-base(master,staging) → haskell-updates (push) Failing after 11m54s
Periodic Merges (6h) / staging-next → staging (push) Failing after 12m13s
Periodic Merges (24h) / staging-next-25.05 → staging-25.05 (push) Failing after 13m24s
Periodic Merges (24h) / release-25.05 → staging-next-25.05 (push) Failing after 14m28s
push sheeet
2025-10-09 14:15:47 +02:00

346 lines
12 KiB
Nix
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
stdenv,
callPackage,
# nix tooling and utilities
darwin,
lib,
fetchzip,
fetchpatch,
makeWrapper,
writeTextFile,
replaceVars,
# native build inputs
runtimeShell,
zip,
unzip,
bash,
coreutils,
which,
gawk,
gnused,
gnutar,
gnugrep,
gzip,
findutils,
diffutils,
gnupatch,
file,
installShellFiles,
python3,
# Apple dependencies
cctools,
# Allow to independently override the jdks used to build and run respectively
jdk_headless,
version ? "8.4.1",
}:
let
inherit (callPackage ./build-support/patching.nix { }) addFilePatch;
inherit (stdenv.hostPlatform) isDarwin isAarch64;
bazelSystem = if isDarwin then "darwin" else "linux";
# on aarch64 Darwin, `uname -m` returns "arm64"
bazelArch = if isDarwin && isAarch64 then "arm64" else stdenv.hostPlatform.parsed.cpu.name;
src = fetchzip {
url = "https://github.com/bazelbuild/bazel/releases/download/${version}/bazel-${version}-dist.zip";
hash = "sha256-DqJqW7C1QODOS+vJrs/+ixsP3coZh80VdpPM4g0vxFI=";
stripRoot = false;
};
defaultShellUtils =
# Keep this list conservative. For more exotic tools, prefer to use
# @rules_nixpkgs to pull in tools from the nix repository. Example:
#
# WORKSPACE:
#
# nixpkgs_git_repository(
# name = "nixpkgs",
# revision = "def5124ec8367efdba95a99523dd06d918cb0ae8",
# )
#
# # This defines an external Bazel workspace.
# nixpkgs_package(
# name = "bison",
# repositories = { "nixpkgs": "@nixpkgs//:default.nix" },
# )
#
# some/BUILD.bazel:
#
# genrule(
# ...
# cmd = "$(location @bison//:bin/bison) -other -args",
# tools = [
# ...
# "@bison//:bin/bison",
# ],
# )
[
coreutils
diffutils
file
findutils
gawk
gnugrep
gnupatch
gnused
gnutar
gzip
unzip
which
zip
];
defaultShell = callPackage ./defaultShell.nix { } { inherit defaultShellUtils; };
commandArgs = [
"--nobuild_python_zip"
"--features=-module_maps"
"--host_features=-module_maps"
"--announce_rc"
"--verbose_failures"
"--curses=no"
]
++ lib.optionals isDarwin [
"--macos_sdk_version=${stdenv.hostPlatform.darwinMinVersion}"
"--cxxopt=-isystem"
"--cxxopt=${lib.getDev stdenv.cc.libcxx}/include/c++/v1"
"--host_cxxopt=-isystem"
"--host_cxxopt=${lib.getDev stdenv.cc.libcxx}/include/c++/v1"
"--copt=-isystem"
"--copt=${lib.getDev darwin.libresolv}/include"
"--host_copt=-isystem"
"--host_copt=${lib.getDev darwin.libresolv}/include"
];
in
stdenv.mkDerivation rec {
pname = "bazel";
inherit version src;
darwinPatches = [
# Bazel integrates with apple IOKit to inhibit and track system sleep.
# Inside the darwin sandbox, these API calls are blocked, and bazel
# crashes. It seems possible to allow these APIs inside the sandbox, but it
# feels simpler to patch bazel not to use it at all. So our bazel is
# incapable of preventing system sleep, which is a small price to pay to
# guarantee that it will always run in any nix context.
#
# See also ./bazel_darwin_sandbox.patch in bazel_5. That patch uses
# NIX_BUILD_TOP env var to conditionnally disable sleep features inside the
# sandbox.
#
# If you want to investigate the sandbox profile path,
# IORegisterForSystemPower can be allowed with
#
# propagatedSandboxProfile = ''
# (allow iokit-open (iokit-user-client-class "RootDomainUserClient"))
# '';
#
# I do not know yet how to allow IOPMAssertion{CreateWithName,Release}
./patches/darwin_sleep.patch
# Fix DARWIN_XCODE_LOCATOR_COMPILE_COMMAND by removing multi-arch support.
# Nixpkgs toolcahins do not support that (yet?) and get confused.
# Also add an explicit /usr/bin prefix that will be patched below.
(replaceVars ./patches/xcode.patch {
usrBinEnv = "${coreutils}/bin/env";
clangDarwin = "${stdenv.cc}/bin/clang";
codesign = "${darwin.sigtool}/bin/codesign";
})
# Revert preference for apple_support over rules_cc toolchain for now
# will need to figure out how to build with apple_support toolchain later
./patches/apple_cc_toolchain.patch
# On Darwin, the last argument to gcc is coming up as an empty string. i.e: ''
# This is breaking the build of any C target. This patch removes the last
# argument if it's found to be an empty string.
./patches/trim-last-argument-to-gcc-if-empty.patch
];
patches = lib.optionals isDarwin darwinPatches ++ [
# patch that propagates rules_* patches below
# patches need to be within source root and can't be absolute paths in Nix store
# so rules_* patches are injected via addFilePatch
./patches/deps_patches.patch
(addFilePatch {
path = "b/third_party/rules_python.patch";
file = replaceVars ./patches/rules_python.patch {
usrBinEnv = "${coreutils}/bin/env";
};
})
(addFilePatch {
path = "b/third_party/rules_java.patch";
file = replaceVars ./patches/rules_java.patch {
defaultBash = "${defaultShell.bashWithDefaultShellUtils}/bin/bash";
};
})
# Suggested for upstream in https://github.com/bazelbuild/bazel/pull/25936
./patches/build_execlog_parser.patch
# Part of suggestion for upstream in https://github.com/bazelbuild/bazel/pull/25934
./patches/env_bash.patch
# Suggested for upstream in https://github.com/bazelbuild/bazel/pull/25935
./patches/gen_completion.patch
# --experimental_strict_action_env (which may one day become the default
# see bazelbuild/bazel#2574) hardcodes the default
# action environment to a non hermetic value (e.g. "/usr/local/bin").
# This is non hermetic on non-nixos systems. On NixOS, bazel cannot find the required binaries.
# So we are replacing this bazel paths by defaultShellPath,
# improving hermeticity and making it work in nixos.
(replaceVars ./patches/strict_action_env.patch {
strictActionEnvPatch = defaultShell.defaultShellPath;
})
(replaceVars ./patches/default_bash.patch {
defaultBash = "${defaultShell.bashWithDefaultShellUtils}/bin/bash";
})
(replaceVars ./patches/md5sum.patch {
md5sum = "${coreutils}/bin/md5sum";
})
# Nix build sandbox can configure custom PATH but doesn't have
# /usr/bin/env which is unfortunate https://github.com/NixOS/nixpkgs/issues/6227
# and we need to do a silly patch
(replaceVars ./patches/usr_bin_env.patch {
usrBinEnv = "${coreutils}/bin/env";
})
# Provide default JRE for Bazel process by setting --server_javabase=
# in a new default system bazelrc file
(replaceVars ./patches/bazel_rc.patch {
bazelSystemBazelRCPath = replaceVars ./system.bazelrc {
serverJavabase = jdk_headless;
};
})
];
meta = with lib; {
homepage = "https://github.com/bazelbuild/bazel/";
description = "Build tool that builds code quickly and reliably";
sourceProvenance = with sourceTypes; [
fromSource
binaryBytecode # source bundles dependencies as jars
];
license = licenses.asl20;
teams = [ lib.teams.bazel ];
mainProgram = "bazel";
platforms = lib.platforms.linux ++ lib.platforms.darwin;
};
nativeBuildInputs = [
makeWrapper
jdk_headless
python3
unzip
which
# Shell completion
installShellFiles
python3.pkgs.absl-py # Needed to build fish completion
]
# Needed for execlog
++ lib.optional (!stdenv.hostPlatform.isDarwin) stdenv.cc
++ lib.optional (stdenv.hostPlatform.isDarwin) cctools.libtool;
buildPhase = ''
runHook preBuild
export HOME=$(mktemp -d)
# If EMBED_LABEL isn't set, it'd be auto-detected from CHANGELOG.md
# and `git rev-parse --short HEAD` which would result in
# "3.7.0- (@non-git)" due to non-git build and incomplete changelog.
# Actual bazel releases use scripts/release/common.sh which is based
# on branch/tag information which we don't have with tarball releases.
# Note that .bazelversion is always correct and is based on bazel-*
# executable name, version checks should work fine
export EMBED_LABEL="${version}- (@non-git)"
echo "Stage 1 - Running bazel bootstrap script"
# Note: can't use lib.escapeShellArgs here because it will escape arguments
# with = using single quotes. This is fine for command invocations,
# but for string variable they become literal single quote chars,
# compile.sh will not unquote them either and command will be invalid.
export EXTRA_BAZEL_ARGS="${lib.strings.concatStringsSep " " commandArgs}"
${bash}/bin/bash ./compile.sh
# XXX: get rid of this, or move it to another stage.
# It is plain annoying when builds fail.
echo "Stage 2 - Generate bazel completions"
${bash}/bin/bash ./scripts/generate_bash_completion.sh \
--bazel=./output/bazel \
--output=./output/bazel-complete.bash \
--prepend=./scripts/bazel-complete-header.bash \
--prepend=./scripts/bazel-complete-template.bash
${python3}/bin/python3 ./scripts/generate_fish_completion.py \
--bazel=./output/bazel \
--output=./output/bazel-complete.fish
runHook postBuild
'';
installPhase = ''
runHook preInstall
# Bazel binary contains zip archive, which contains text files and a jar
# both of which can have store references that might be obscured to Nix
# builder in packaged form, so we unpack and extract those references
# Note: grep isn't necessarily 100% accurate, other approaches could be
# to disassemble Jar (slow) or hardcode known references
mkdir -p $out/nix-support
INSTALL_BASE=$(./output/bazel --batch info install_base)
find "$INSTALL_BASE" -type f -exec \
${gnugrep}/bin/grep --text --only-matching --no-filename "$NIX_STORE/[^/]*" '{}' \; \
| sort -u >> $out/nix-support/depends
mkdir -p $out/bin
# official wrapper scripts that searches for $WORKSPACE_ROOT/tools/bazel if
# it cant find something in tools, it calls
# $out/bin/bazel-{version}-{os_arch} The binary _must_ exist with this
# naming if your project contains a .bazelversion file.
cp ./scripts/packages/bazel.sh $out/bin/bazel
versioned_bazel="$out/bin/bazel-${version}-${bazelSystem}-${bazelArch}"
mv ./output/bazel "$versioned_bazel"
wrapProgram "$versioned_bazel" --suffix PATH : ${defaultShell.defaultShellPath}
mkdir $out/share
cp ./output/parser_deploy.jar $out/share/parser_deploy.jar
substitute ${./bazel-execlog.sh} $out/bin/bazel-execlog \
--subst-var out \
--subst-var-by runtimeShell ${runtimeShell} \
--subst-var-by binJava ${jdk_headless}/bin/java
chmod +x $out/bin/bazel-execlog
# shell completion files
installShellCompletion --bash \
--name bazel.bash \
./output/bazel-complete.bash
installShellCompletion --zsh \
--name _bazel \
./scripts/zsh_completion/_bazel
installShellCompletion --fish \
--name bazel.fish \
./output/bazel-complete.fish
'';
postFixup =
# verify that bazel binary still works post-fixup
''
USE_BAZEL_VERSION=${version} $out/bin/bazel --batch info release
'';
# Bazel binary includes zip archive at the end that `strip` would end up discarding
stripExclude = [ "bin/.bazel-${version}-*-wrapped" ];
passthru = {
tests = {
inherit (callPackage ./examples.nix { }) cpp java rust;
};
};
}