nixpkgs-suyu/pkgs/development/go-modules/generic/default.nix

163 lines
4.3 KiB
Nix
Raw Normal View History

{ go, govers, lib }:
{ name, buildInputs ? [], passthru ? {}
2015-05-18 12:46:22 +02:00
# Disabled flag
, disabled ? false
# Go import path of the package
, goPackagePath
# Go package aliases
, goPackageAliases ? [ ]
# Extra sources to include in the gopath
, extraSrcs ? [ ]
, dontRenameImports ? false
, meta ? {}, ... } @ args':
2015-05-18 12:46:22 +02:00
if disabled then throw "${name} not supported for go ${go.meta.branch}" else
let
args = lib.filterAttrs (name: _: name != "extraSrcs") args';
in
go.stdenv.mkDerivation (
(builtins.removeAttrs args [ "goPackageAliases" "disabled" ]) // {
name = "go${go.meta.branch}-${name}";
2015-07-30 03:16:35 +02:00
nativeBuildInputs = [ go ] ++ (lib.optional (!dontRenameImports) govers);
buildInputs = [ go ] ++ buildInputs;
configurePhase = args.configurePhase or ''
runHook preConfigure
# Extract the source
cd "$NIX_BUILD_TOP"
mkdir -p "go/src/$(dirname "$goPackagePath")"
mv "$sourceRoot" "go/src/$goPackagePath"
'' + lib.flip lib.concatMapStrings extraSrcs ({ src, goPackagePath }: ''
mkdir extraSrc
(cd extraSrc; unpackFile "${src}")
mkdir -p "go/src/$(dirname "${goPackagePath}")"
chmod -R u+w extraSrc/*
mv extraSrc/* "go/src/${goPackagePath}"
rmdir extraSrc
'') + ''
GOPATH=$NIX_BUILD_TOP/go:$GOPATH
runHook postConfigure
'';
renameImports = args.renameImports or (
let
inputsWithAliases = lib.filter (x: x ? goPackageAliases)
(buildInputs ++ (args.propagatedBuildInputs or [ ]));
rename = to: from: "echo Renaming '${from}' to '${to}'; govers -d -m ${from} ${to}";
renames = p: lib.concatMapStringsSep "\n" (rename p.goPackagePath) p.goPackageAliases;
in lib.concatMapStringsSep "\n" renames inputsWithAliases);
buildPhase = args.buildPhase or ''
runHook preBuild
runHook renameImports
2015-07-30 03:16:56 +02:00
PIDS=()
if [ -n "$subPackages" ] ; then
2015-05-15 02:34:50 +02:00
for p in $subPackages ; do
2015-07-30 03:16:56 +02:00
go install $buildFlags "''${buildFlagsArray[@]}" -p $NIX_BUILD_CORES -v $goPackagePath/$p &
PIDS+=("$!")
2015-05-15 02:34:50 +02:00
done
else
2015-07-30 03:16:56 +02:00
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
2015-07-30 03:16:56 +02:00
} &
PIDS+=("$!")
done < <(find $goPackagePath -type f -name \*.go -exec dirname {} \; | sort | uniq)
popd
fi
2015-07-30 03:16:56 +02:00
# Exit on error from the parallel process
for PID in "''${PIDS[@]}"; do
wait $PID || exit 1
done
runHook postBuild
'';
checkPhase = args.checkPhase or ''
runHook preCheck
2015-07-30 03:16:56 +02:00
PIDS=()
if [ -n "$subPackages" ] ; then
2015-05-15 02:34:50 +02:00
for p in $subPackages ; do
2015-07-30 03:16:56 +02:00
go test -p $NIX_BUILD_CORES -v $goPackagePath/$p &
2015-05-15 02:34:50 +02:00
done
2015-07-30 03:16:56 +02:00
PIDS+=("$!")
else
2015-07-30 03:16:56 +02:00
pushd go/src
while read d; do
go test -p $NIX_BUILD_CORES -v $d
2015-07-30 03:16:56 +02:00
done < <(find $goPackagePath -type f -name \*_test.go -exec dirname {} \; | sort | uniq)
popd
PIDS+=("$!")
fi
2015-07-30 03:16:56 +02:00
# Exit on error from the parallel process
for PID in "''${PIDS[@]}"; do
wait $PID || exit 1
done
runHook postCheck
'';
installPhase = args.installPhase or ''
runHook preInstall
2015-05-18 19:11:52 +02:00
mkdir -p $out
if [ -z "$dontInstallSrc" ]; then
2015-07-30 03:16:56 +02:00
pushd "$NIX_BUILD_TOP/go"
while read f; do
echo "$f" | grep -q '^./\(src\|pkg/[^/]*\)/${goPackagePath}' || continue
mkdir -p "$(dirname "$out/share/go/$f")"
cp "$NIX_BUILD_TOP/go/$f" "$out/share/go/$f"
2015-07-30 03:16:56 +02:00
done < <(find . -type f)
popd
fi
dir="$NIX_BUILD_TOP/go/bin"
[ -e "$dir" ] && cp -r $dir $out
runHook postInstall
'';
passthru = passthru // lib.optionalAttrs (goPackageAliases != []) { inherit goPackageAliases; };
2015-05-23 00:58:49 +02:00
meta = {
# Add default meta information
platforms = lib.platforms.all;
} // meta // {
# add an extra maintainer to every package
maintainers = (meta.maintainers or []) ++
[ lib.maintainers.emery lib.maintainers.lethalman ];
};
})