2016-06-05 14:58:08 +02:00
|
|
|
{ go, govers, parallel, lib, fetchgit, fetchhg }:
|
2015-01-31 16:51:20 +01:00
|
|
|
|
2015-08-27 10:00:25 +02:00
|
|
|
{ name, buildInputs ? [], nativeBuildInputs ? [], passthru ? {}, preFixup ? ""
|
|
|
|
|
|
|
|
# We want parallel builds by default
|
|
|
|
, enableParallelBuilding ? true
|
2015-01-31 16:51:20 +01:00
|
|
|
|
2015-05-18 12:46:22 +02:00
|
|
|
# Disabled flag
|
|
|
|
, disabled ? false
|
|
|
|
|
2015-01-31 16:51:20 +01:00
|
|
|
# Go import path of the package
|
|
|
|
, goPackagePath
|
|
|
|
|
2015-05-15 11:02:01 +02:00
|
|
|
# Go package aliases
|
|
|
|
, goPackageAliases ? [ ]
|
|
|
|
|
2015-05-15 02:30:55 +02:00
|
|
|
# Extra sources to include in the gopath
|
|
|
|
, extraSrcs ? [ ]
|
|
|
|
|
2016-04-27 08:45:04 +02:00
|
|
|
# go2nix dependency file
|
|
|
|
, goDeps ? null
|
|
|
|
|
2015-05-15 11:02:01 +02:00
|
|
|
, dontRenameImports ? false
|
|
|
|
|
2015-08-19 22:50:27 +02:00
|
|
|
# Do not enable this without good reason
|
|
|
|
# IE: programs coupled with the compiler
|
|
|
|
, allowGoReference ? false
|
|
|
|
|
2015-05-15 02:30:55 +02:00
|
|
|
, meta ? {}, ... } @ args':
|
|
|
|
|
2015-05-18 12:46:22 +02:00
|
|
|
if disabled then throw "${name} not supported for go ${go.meta.branch}" else
|
|
|
|
|
2016-04-27 08:45:04 +02:00
|
|
|
with builtins;
|
|
|
|
|
2015-05-15 02:30:55 +02:00
|
|
|
let
|
|
|
|
args = lib.filterAttrs (name: _: name != "extraSrcs") args';
|
2015-08-06 01:23:03 +02:00
|
|
|
|
2016-02-28 06:12:55 +01:00
|
|
|
removeReferences = [ ] ++ lib.optional (!allowGoReference) go;
|
2015-08-06 01:23:03 +02:00
|
|
|
|
|
|
|
removeExpr = refs: lib.flip lib.concatMapStrings refs (ref: ''
|
|
|
|
| sed "s,${ref},$(echo "${ref}" | sed "s,$NIX_STORE/[^-]*,$NIX_STORE/eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee,"),g" \
|
|
|
|
'');
|
2016-04-27 08:45:04 +02:00
|
|
|
|
|
|
|
dep2src = goDep:
|
|
|
|
{
|
|
|
|
inherit (goDep) goPackagePath;
|
|
|
|
src = if goDep.fetch.type == "git" then
|
|
|
|
fetchgit {
|
|
|
|
inherit (goDep.fetch) url rev sha256;
|
|
|
|
}
|
2016-06-05 14:58:08 +02:00
|
|
|
else if goDep.fetch.type == "hg" then
|
|
|
|
fetchhg {
|
|
|
|
inherit (goDep.fetch) url rev sha256;
|
|
|
|
}
|
2016-06-06 02:28:52 +02:00
|
|
|
else abort "Unrecognized package fetch type";
|
2016-04-27 08:45:04 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
importGodeps = { depsFile, filterPackages ? [] }:
|
|
|
|
let
|
|
|
|
deps = lib.importJSON depsFile;
|
|
|
|
external = filter (d: d ? include) deps;
|
|
|
|
direct = filter (d: d ? goPackagePath && (length filterPackages == 0 || elem d.goPackagePath filterPackages)) deps;
|
|
|
|
in
|
|
|
|
concatLists (map importGodeps (map (d: { depsFile = ./. + d.include; filterPackages = d.packages; }) external)) ++ (map dep2src direct);
|
|
|
|
|
|
|
|
goPath = if goDeps != null then importGodeps { depsFile = goDeps; } ++ extraSrcs
|
|
|
|
else extraSrcs;
|
2015-05-15 02:30:55 +02:00
|
|
|
in
|
2015-01-31 16:51:20 +01:00
|
|
|
|
2015-05-15 11:02:01 +02:00
|
|
|
go.stdenv.mkDerivation (
|
2015-05-18 12:47:24 +02:00
|
|
|
(builtins.removeAttrs args [ "goPackageAliases" "disabled" ]) // {
|
2015-05-15 11:02:01 +02:00
|
|
|
|
2015-02-09 10:15:02 +01:00
|
|
|
name = "go${go.meta.branch}-${name}";
|
2015-08-29 20:51:15 +02:00
|
|
|
nativeBuildInputs = [ go parallel ]
|
2015-08-06 01:22:36 +02:00
|
|
|
++ (lib.optional (!dontRenameImports) govers) ++ nativeBuildInputs;
|
2015-07-30 03:16:35 +02:00
|
|
|
buildInputs = [ go ] ++ buildInputs;
|
2015-01-31 16:51:20 +01:00
|
|
|
|
|
|
|
configurePhase = args.configurePhase or ''
|
|
|
|
runHook preConfigure
|
|
|
|
|
2015-05-15 02:30:55 +02:00
|
|
|
# Extract the source
|
2015-01-31 16:51:20 +01:00
|
|
|
cd "$NIX_BUILD_TOP"
|
|
|
|
mkdir -p "go/src/$(dirname "$goPackagePath")"
|
|
|
|
mv "$sourceRoot" "go/src/$goPackagePath"
|
|
|
|
|
2016-04-27 08:45:04 +02:00
|
|
|
'' + lib.flip lib.concatMapStrings goPath ({ src, goPackagePath }: ''
|
|
|
|
mkdir goPath
|
|
|
|
(cd goPath; unpackFile "${src}")
|
2015-05-15 02:30:55 +02:00
|
|
|
mkdir -p "go/src/$(dirname "${goPackagePath}")"
|
2016-04-27 08:45:04 +02:00
|
|
|
chmod -R u+w goPath/*
|
|
|
|
mv goPath/* "go/src/${goPackagePath}"
|
|
|
|
rmdir goPath
|
2015-05-15 02:30:55 +02:00
|
|
|
|
|
|
|
'') + ''
|
2015-08-29 20:51:15 +02:00
|
|
|
export GOPATH=$NIX_BUILD_TOP/go:$GOPATH
|
2015-01-31 16:51:20 +01:00
|
|
|
|
|
|
|
runHook postConfigure
|
|
|
|
'';
|
|
|
|
|
2015-05-15 11:02:01 +02:00
|
|
|
renameImports = args.renameImports or (
|
|
|
|
let
|
2015-05-19 00:27:33 +02:00
|
|
|
inputsWithAliases = lib.filter (x: x ? goPackageAliases)
|
|
|
|
(buildInputs ++ (args.propagatedBuildInputs or [ ]));
|
|
|
|
rename = to: from: "echo Renaming '${from}' to '${to}'; govers -d -m ${from} ${to}";
|
2015-05-15 11:02:01 +02:00
|
|
|
renames = p: lib.concatMapStringsSep "\n" (rename p.goPackagePath) p.goPackageAliases;
|
|
|
|
in lib.concatMapStringsSep "\n" renames inputsWithAliases);
|
2015-04-16 18:43:09 +02:00
|
|
|
|
2015-01-31 16:51:20 +01:00
|
|
|
buildPhase = args.buildPhase or ''
|
|
|
|
runHook preBuild
|
|
|
|
|
2015-04-16 18:43:09 +02:00
|
|
|
runHook renameImports
|
|
|
|
|
2015-08-29 20:51:15 +02:00
|
|
|
buildGoDir() {
|
|
|
|
local d; local cmd;
|
|
|
|
cmd="$1"
|
|
|
|
d="$2"
|
2015-08-30 04:10:18 +02:00
|
|
|
echo "$d" | grep -q "\(/_\|examples\|Godeps\)" && return 0
|
2015-08-29 20:51:15 +02:00
|
|
|
[ -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
|
2016-04-06 10:47:04 +02:00
|
|
|
find "$goPackagePath" -type f -name \*$type.go -exec dirname {} \; | grep -v "/vendor/" | sort | uniq
|
2015-08-29 20:51:15 +02:00
|
|
|
popd >/dev/null
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
|
|
|
export -f buildGoDir # parallel needs to see the function
|
2016-01-21 15:05:40 +01:00
|
|
|
if [ -z "$enableParallelBuilding" ]; then
|
|
|
|
export NIX_BUILD_CORES=1
|
|
|
|
fi
|
2015-08-29 20:51:15 +02:00
|
|
|
getGoDirs "" | parallel -j $NIX_BUILD_CORES buildGoDir install
|
2015-07-30 03:16:56 +02:00
|
|
|
|
2015-01-31 16:51:20 +01:00
|
|
|
runHook postBuild
|
|
|
|
'';
|
|
|
|
|
|
|
|
checkPhase = args.checkPhase or ''
|
|
|
|
runHook preCheck
|
|
|
|
|
2015-08-29 20:51:15 +02:00
|
|
|
getGoDirs test | parallel -j $NIX_BUILD_CORES buildGoDir test
|
2015-07-30 03:16:56 +02:00
|
|
|
|
2015-01-31 16:51:20 +01:00
|
|
|
runHook postCheck
|
|
|
|
'';
|
|
|
|
|
|
|
|
installPhase = args.installPhase or ''
|
|
|
|
runHook preInstall
|
|
|
|
|
2015-05-18 19:11:52 +02:00
|
|
|
mkdir -p $out
|
2015-08-29 21:55:52 +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"
|
|
|
|
done < <(find . -type f)
|
|
|
|
popd
|
|
|
|
|
2015-08-29 22:25:00 +02:00
|
|
|
mkdir -p $bin
|
2015-01-31 16:51:20 +01:00
|
|
|
dir="$NIX_BUILD_TOP/go/bin"
|
2015-08-29 21:55:52 +02:00
|
|
|
[ -e "$dir" ] && cp -r $dir $bin
|
2015-08-27 10:00:25 +02:00
|
|
|
|
|
|
|
runHook postInstall
|
|
|
|
'';
|
|
|
|
|
|
|
|
preFixup = preFixup + ''
|
2015-08-06 01:23:03 +02:00
|
|
|
while read file; do
|
|
|
|
cat $file ${removeExpr removeReferences} > $file.tmp
|
|
|
|
mv $file.tmp $file
|
|
|
|
chmod +x $file
|
2015-08-29 21:55:52 +02:00
|
|
|
done < <(find $bin/bin -type f 2>/dev/null)
|
2015-01-31 16:51:20 +01:00
|
|
|
'';
|
|
|
|
|
2015-08-19 22:50:27 +02:00
|
|
|
disallowedReferences = lib.optional (!allowGoReference) go
|
|
|
|
++ lib.optional (!dontRenameImports) govers;
|
2015-08-06 01:23:03 +02:00
|
|
|
|
2016-06-09 15:47:12 +02:00
|
|
|
passthru = passthru //
|
|
|
|
{ inherit go; } //
|
|
|
|
lib.optionalAttrs (goPackageAliases != []) { inherit goPackageAliases; };
|
2015-05-15 11:02:01 +02:00
|
|
|
|
2015-08-27 10:00:25 +02:00
|
|
|
enableParallelBuilding = enableParallelBuilding;
|
|
|
|
|
2015-08-29 21:55:52 +02:00
|
|
|
# I prefer to call this dev but propagatedBuildInputs expects $out to exist
|
2016-03-18 07:53:48 +01:00
|
|
|
outputs = args.outputs or [ "out" "bin" ];
|
2015-08-29 21:55:52 +02:00
|
|
|
|
2015-05-23 00:58:49 +02:00
|
|
|
meta = {
|
|
|
|
# Add default meta information
|
|
|
|
platforms = lib.platforms.all;
|
|
|
|
} // meta // {
|
2015-01-31 16:51:20 +01:00
|
|
|
# add an extra maintainer to every package
|
2015-04-16 18:43:09 +02:00
|
|
|
maintainers = (meta.maintainers or []) ++
|
2015-12-05 22:41:25 +01:00
|
|
|
[ lib.maintainers.ehmry lib.maintainers.lethalman ];
|
2015-01-31 16:51:20 +01:00
|
|
|
};
|
|
|
|
})
|