Commit 1ee50a29 authored by Ivan Trubach's avatar Ivan Trubach Committed by zowoq
Browse files

go_1_21: install from distpack archive

Changes the build and install phases to use archives produced by
[distpack]. This allows us to drop the code that cleans GOROOT and moves
cross-compiled binaries out of bin/GOOS_GOARCH, and potentially avoid
issues like [missing GOROOT/go.env] in the future.

[distpack]: https://pkg.go.dev/cmd/distpack
[missing GOROOT/go.env]: https://github.com/NixOS/nixpkgs/commit/cbc976a97c3372e1eec5db021db994b85e098d12
parent fd0060da
Loading
Loading
Loading
Loading
+8 −30
Original line number Diff line number Diff line
@@ -64,10 +64,6 @@ stdenv.mkDerivation rec {

  depsTargetTarget = lib.optional stdenv.targetPlatform.isWindows threadsCross.package;

  postPatch = ''
    patchShebangs .
  '';

  patches = [
    (substituteAll {
      src = ./iana-etc-1.17.patch;
@@ -92,8 +88,6 @@ stdenv.mkDerivation rec {
  GOOS = stdenv.targetPlatform.parsed.kernel.name;
  GOARCH = goarch stdenv.targetPlatform;
  # GOHOSTOS/GOHOSTARCH must match the building system, not the host system.
  # Go will nevertheless build a for host system that we will copy over in
  # the install phase.
  GOHOSTOS = stdenv.buildPlatform.parsed.kernel.name;
  GOHOSTARCH = goarch stdenv.buildPlatform;

@@ -116,14 +110,16 @@ stdenv.mkDerivation rec {

  GOROOT_BOOTSTRAP = if useGccGoBootstrap then goBootstrap else "${goBootstrap}/share/go";

  # Note that we use distpack to avoid moving around cross-compiled binaries.
  # The paths are slightly different when buildPlatform != hostPlatform and
  # distpack handles assembling outputs in the right place, same as the official
  # Go binary releases. See also https://pkg.go.dev/cmd/distpack
  buildPhase = ''
    runHook preBuild
    export GOCACHE=$TMPDIR/go-cache
    # this is compiled into the binary
    export GOROOT_FINAL=$out/share/go

    export PATH=$(pwd)/bin:$PATH

    ${lib.optionalString isCross ''
    # Independent from host/target, CC should produce code for the building system.
    # We only set it when cross-compiling.
@@ -132,34 +128,16 @@ stdenv.mkDerivation rec {
    ulimit -a

    pushd src
    ./make.bash
    bash make.bash -no-banner -distpack
    popd
    runHook postBuild
  '';

  preInstall = ''
    # Contains the wrong perl shebang when cross compiling,
    # since it is not used for anything we can deleted as well.
    rm src/regexp/syntax/make_perl_groups.pl
  '' + (if (stdenv.buildPlatform.system != stdenv.hostPlatform.system) then ''
    mv bin/*_*/* bin
    rmdir bin/*_*
    ${lib.optionalString (!(GOHOSTARCH == GOARCH && GOOS == GOHOSTOS)) ''
      rm -rf pkg/${GOHOSTOS}_${GOHOSTARCH} pkg/tool/${GOHOSTOS}_${GOHOSTARCH}
    ''}
  '' else lib.optionalString (stdenv.hostPlatform.system != stdenv.targetPlatform.system) ''
    rm -rf bin/*_*
    ${lib.optionalString (!(GOHOSTARCH == GOARCH && GOOS == GOHOSTOS)) ''
      rm -rf pkg/${GOOS}_${GOARCH} pkg/tool/${GOOS}_${GOARCH}
    ''}
  '');

  installPhase = ''
    runHook preInstall
    mkdir -p $GOROOT_FINAL
    cp -a bin pkg src lib misc api doc go.env $GOROOT_FINAL
    mkdir -p $out/bin
    ln -s $GOROOT_FINAL/bin/* $out/bin
    mkdir -p $out/{share,bin}
    tar -C $out/share -x -z -f "pkg/distpack/go${version}.$GOOS-$GOARCH.tar.gz"
    ln -s $out/share/go/bin/* $out/bin
    runHook postInstall
  '';