Commit b739da06 authored by Yves-Stan Le Cornec's avatar Yves-Stan Le Cornec
Browse files

buildBazelPackage: optionally run bazel tests in checkPhase

Tests from the bazelTestTargets argument will be run before the build. The new  bazelTestFlags argument can be used to pass additional flags to this phase.
parent f6dd0ea8
Loading
Loading
Loading
Loading
+71 −49
Original line number Diff line number Diff line
@@ -13,8 +13,10 @@ args@{
, bazel ? bazelPkg
, bazelFlags ? []
, bazelBuildFlags ? []
, bazelTestFlags ? []
, bazelFetchFlags ? []
, bazelTarget
, bazelTestTargets ? []
, buildAttrs
, fetchAttrs

@@ -50,13 +52,33 @@ let
  fArgs = removeAttrs args [ "buildAttrs" "fetchAttrs" "removeRulesCC" ];
  fBuildAttrs = fArgs // buildAttrs;
  fFetchAttrs = fArgs // removeAttrs fetchAttrs [ "sha256" ];

in stdenv.mkDerivation (fBuildAttrs // {
  inherit name bazelFlags bazelBuildFlags bazelFetchFlags bazelTarget;
  bazelCmd = { cmd, additionalFlags, targets }:
    lib.optionalString (targets != [ ]) ''
      # See footnote called [USER and BAZEL_USE_CPP_ONLY_TOOLCHAIN variables]
      BAZEL_USE_CPP_ONLY_TOOLCHAIN=1 \
      USER=homeless-shelter \
      bazel \
        --batch \
        --output_base="$bazelOut" \
        --output_user_root="$bazelUserRoot" \
        ${cmd} \
        --curses=no \
        -j $NIX_BUILD_CORES \
        "''${copts[@]}" \
        "''${host_copts[@]}" \
        "''${linkopts[@]}" \
        "''${host_linkopts[@]}" \
        $bazelFlags \
        ${lib.strings.concatStringsSep " " additionalFlags} \
        ${lib.strings.concatStringsSep " " targets}
    '';
in
stdenv.mkDerivation (fBuildAttrs // {
  inherit name bazelFlags bazelBuildFlags bazelTestFlags bazelFetchFlags bazelTarget bazelTestTargets;

  deps = stdenv.mkDerivation (fFetchAttrs // {
    name = "${name}-deps.tar.gz";
    inherit bazelFlags bazelBuildFlags bazelFetchFlags bazelTarget;
    inherit bazelFlags bazelBuildFlags bazelTestFlags bazelFetchFlags bazelTarget bazelTestTargets;

    impureEnvVars = lib.fetchers.proxyImpureEnvVars ++ fFetchAttrs.impureEnvVars or [];

@@ -77,14 +99,7 @@ in stdenv.mkDerivation (fBuildAttrs // {
    buildPhase = fFetchAttrs.buildPhase or ''
      runHook preBuild

      # Bazel computes the default value of output_user_root before parsing the
      # flag. The computation of the default value involves getting the $USER
      # from the environment. I don't have that variable when building with
      # sandbox enabled. Code here
      # https://github.com/bazelbuild/bazel/blob/9323c57607d37f9c949b60e293b573584906da46/src/main/cpp/startup_options.cc#L123-L124
      #
      # On macOS Bazel will use the system installed Xcode or CLT toolchain instead of the one in the PATH unless we pass BAZEL_USE_CPP_ONLY_TOOLCHAIN

      # See footnote called [USER and BAZEL_USE_CPP_ONLY_TOOLCHAIN variables].
      # We disable multithreading for the fetching phase since it can lead to timeouts with many dependencies/threads:
      # https://github.com/bazelbuild/bazel/issues/6502
      BAZEL_USE_CPP_ONLY_TOOLCHAIN=1 \
@@ -97,7 +112,8 @@ in stdenv.mkDerivation (fBuildAttrs // {
        --loading_phase_threads=1 \
        $bazelFlags \
        $bazelFetchFlags \
        $bazelTarget
        ${bazelTarget} \
        ${lib.strings.concatStringsSep " " bazelTestTargets}

      runHook postBuild
    '';
@@ -189,7 +205,7 @@ in stdenv.mkDerivation (fBuildAttrs // {
    # the wrappers are expecting will not be set. So instead of relying on the
    # wrappers picking them up, pass them in explicitly via `--copt`, `--linkopt`
    # and related flags.
    #

    copts=()
    host_copts=()
    linkopts=()
@@ -209,23 +225,29 @@ in stdenv.mkDerivation (fBuildAttrs // {
      done
    fi

    BAZEL_USE_CPP_ONLY_TOOLCHAIN=1 \
    USER=homeless-shelter \
    bazel \
      --batch \
      --output_base="$bazelOut" \
      --output_user_root="$bazelUserRoot" \
      build \
      --curses=no \
      -j $NIX_BUILD_CORES \
      "''${copts[@]}" \
      "''${host_copts[@]}" \
      "''${linkopts[@]}" \
      "''${host_linkopts[@]}" \
      $bazelFlags \
      $bazelBuildFlags \
      $bazelTarget

    ${
      bazelCmd {
        cmd = "test";
        additionalFlags =
          ["--test_output=errors"] ++  bazelTestFlags;
        targets = bazelTestTargets;
      }
    }
    ${
      bazelCmd {
        cmd = "build";
        additionalFlags = bazelBuildFlags;
        targets = [bazelTarget];
      }
    }
    runHook postBuild
  '';
})

# [USER and BAZEL_USE_CPP_ONLY_TOOLCHAIN variables]:
#   Bazel computes the default value of output_user_root before parsing the
#   flag. The computation of the default value involves getting the $USER
#   from the environment. Code here :
#   https://github.com/bazelbuild/bazel/blob/9323c57607d37f9c949b60e293b573584906da46/src/main/cpp/startup_options.cc#L123-L124
#
#   On macOS Bazel will use the system installed Xcode or CLT toolchain instead of the one in the PATH unless we pass BAZEL_USE_CPP_ONLY_TOOLCHAIN.