summary refs log tree commit diff
path: root/pkgs/development/go-modules/generic
diff options
context:
space:
mode:
authorWilliam A. Kennington III <william@wkennington.com>2015-08-29 11:51:15 -0700
committerWilliam A. Kennington III <william@wkennington.com>2015-08-29 11:51:26 -0700
commit3afc3494bb5c5135e270baab14fe2a486878de22 (patch)
treebba35140b916177ec548ff21665305f42549840f /pkgs/development/go-modules/generic
parentb9e999a595bb4a7477fdc8fd5fcd0bade95ed47d (diff)
downloadnixpkgs-3afc3494bb5c5135e270baab14fe2a486878de22.tar
nixpkgs-3afc3494bb5c5135e270baab14fe2a486878de22.tar.gz
nixpkgs-3afc3494bb5c5135e270baab14fe2a486878de22.tar.bz2
nixpkgs-3afc3494bb5c5135e270baab14fe2a486878de22.tar.lz
nixpkgs-3afc3494bb5c5135e270baab14fe2a486878de22.tar.xz
nixpkgs-3afc3494bb5c5135e270baab14fe2a486878de22.tar.zst
nixpkgs-3afc3494bb5c5135e270baab14fe2a486878de22.zip
goPackages: Use parallel instead of forking in bash
Diffstat (limited to 'pkgs/development/go-modules/generic')
-rw-r--r--pkgs/development/go-modules/generic/default.nix91
1 files changed, 37 insertions, 54 deletions
diff --git a/pkgs/development/go-modules/generic/default.nix b/pkgs/development/go-modules/generic/default.nix
index f0d3be6487c..7842df6b58f 100644
--- a/pkgs/development/go-modules/generic/default.nix
+++ b/pkgs/development/go-modules/generic/default.nix
@@ -1,4 +1,4 @@
-{ go, govers, lib }:
+{ go, govers, parallel, lib }:
 
 { name, buildInputs ? [], nativeBuildInputs ? [], passthru ? {}, preFixup ? ""
 
@@ -41,7 +41,7 @@ go.stdenv.mkDerivation (
   (builtins.removeAttrs args [ "goPackageAliases" "disabled" ]) // {
 
   name = "go${go.meta.branch}-${name}";
-  nativeBuildInputs = [ go ]
+  nativeBuildInputs = [ go parallel ]
     ++ (lib.optional (!dontRenameImports) govers) ++ nativeBuildInputs;
   buildInputs = [ go ] ++ buildInputs;
 
@@ -62,7 +62,7 @@ go.stdenv.mkDerivation (
     rmdir extraSrc
 
   '') + ''
-    GOPATH=$NIX_BUILD_TOP/go:$GOPATH
+    export GOPATH=$NIX_BUILD_TOP/go:$GOPATH
 
     runHook postConfigure
   '';
@@ -80,38 +80,39 @@ go.stdenv.mkDerivation (
 
     runHook renameImports
 
-    PIDS=()
-    if [ -n "$subPackages" ] ; then
-        for p in $subPackages ; do
-            go install $buildFlags "''${buildFlagsArray[@]}" -p $NIX_BUILD_CORES -v $goPackagePath/$p &
-            PIDS+=("$!")
-        done
-    else
-        pushd go/src
-        while read d; do
-          {
-            echo "$d" | grep -q "/_" && continue
-            [ -n "$excludedPackages" ] && echo "$d" | grep -q "$excludedPackages" && continue
-            local OUT
-            if ! OUT="$(go install $buildFlags "''${buildFlagsArray[@]}" -p $NIX_BUILD_CORES -v $d 2>&1)"; then
-                if ! echo "$OUT" | grep -q 'no buildable Go source files'; then
-                    echo "$OUT" >&2
-                    exit 1
-                fi
-            fi
-            if [ -n "$OUT" ]; then
-              echo "$OUT" >&2
-            fi
-          } &
-          PIDS+=("$!")
-        done < <(find $goPackagePath -type f -name \*.go -exec dirname {} \; | sort | uniq)
-        popd
-    fi
-
-    # Exit on error from the parallel process
-    for PID in "''${PIDS[@]}"; do
-        wait $PID || exit 1
-    done
+    buildGoDir() {
+      local d; local cmd;
+      cmd="$1"
+      d="$2"
+      echo "$d" | grep -q "/_" && return 0
+      [ -n "$excludedPackages" ] && echo "$d" | grep -q "$excludedPackages" && return 0
+      local OUT
+      if ! OUT="$(go $cmd $buildFlags "''${buildFlagsArray[@]}" -v $d 2>&1)"; then
+        if ! echo "$OUT" | grep -q 'no buildable Go source files'; then
+          echo "$OUT" >&2
+          return 1
+        fi
+      fi
+      if [ -n "$OUT" ]; then
+        echo "$OUT" >&2
+      fi
+      return 0
+    }
+
+    getGoDirs() {
+      local type;
+      type="$1"
+      if [ -n "$subPackages" ]; then
+        echo "$subPackages" | sed "s,\(^\| \),\1$goPackagePath/,g"
+      else
+        pushd go/src >/dev/null
+        find "$goPackagePath" -type f -name \*$type.go -exec dirname {} \; | sort | uniq
+        popd >/dev/null
+      fi
+    }
+
+    export -f buildGoDir # parallel needs to see the function
+    getGoDirs "" | parallel -j $NIX_BUILD_CORES buildGoDir install
 
     runHook postBuild
   '';
@@ -119,25 +120,7 @@ go.stdenv.mkDerivation (
   checkPhase = args.checkPhase or ''
     runHook preCheck
 
-    PIDS=()
-    if [ -n "$subPackages" ] ; then
-        for p in $subPackages ; do
-            go test -p $NIX_BUILD_CORES -v $goPackagePath/$p &
-            PIDS+=("$!")
-        done
-    else
-        pushd go/src
-        while read d; do
-            go test -p $NIX_BUILD_CORES -v $d &
-            PIDS+=("$!")
-        done < <(find $goPackagePath -type f -name \*_test.go -exec dirname {} \; | sort | uniq)
-        popd
-    fi
-
-    # Exit on error from the parallel process
-    for PID in "''${PIDS[@]}"; do
-        wait $PID || exit 1
-    done
+    getGoDirs test | parallel -j $NIX_BUILD_CORES buildGoDir test
 
     runHook postCheck
   '';