Something went wrong. Try again.
What happens if I push all of nixpkgs
Something went wrong. Try again.
13 kB · 406 lines
Nix
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407{ go, cacert, gitMinimal, lib, stdenv,}:
lib.extendMkDerivation { constructDrv = stdenv.mkDerivation; excludeDrvArgNames = [ "overrideModAttrs" # Compatibility layer to the directly-specified CGO_ENABLED. # TODO(@ShamrockLee): Remove after Nixpkgs 25.05 branch-off "CGO_ENABLED" ]; extendDrvArgs = finalAttrs: { nativeBuildInputs ? [ ], # Native build inputs used for the derivation. passthru ? { }, patches ? [ ],
# A function to override the `goModules` derivation. overrideModAttrs ? (finalAttrs: previousAttrs: { }),
# Directory to the `go.mod` and `go.sum` relative to the `src`. modRoot ? "./",
# The SRI hash of the vendored dependencies. # If `vendorHash` is `null`, no dependencies are fetched and # the build relies on the vendor folder within the source. vendorHash ? throw ( if args ? vendorSha256 then "buildGoModule: Expect vendorHash instead of vendorSha256" else "buildGoModule: vendorHash is missing" ),
# The go.sum file to track which can cause rebuilds. goSum ? null,
# Whether to delete the vendor folder supplied with the source. deleteVendor ? false,
# Whether to fetch (go mod download) and proxy the vendor directory. # This is useful if your code depends on c code and go mod tidy does not # include the needed sources to build or if any dependency has case-insensitive # conflicts which will produce platform dependant `vendorHash` checksums. proxyVendor ? false,
# We want parallel builds by default. enableParallelBuilding ? true,
# Do not enable this without good reason # IE: programs coupled with the compiler. allowGoReference ? false,
# Meta data for the final derivation. meta ? { },
# Go linker flags. ldflags ? [ ], # Go build flags. GOFLAGS ? [ ],
... }@args: { inherit modRoot vendorHash deleteVendor proxyVendor goSum ; goModules = if (finalAttrs.vendorHash == null) then "" else (stdenv.mkDerivation { name = let prefix = "${finalAttrs.name or "${finalAttrs.pname}-${finalAttrs.version}"}-";
# If "goSum" is supplied then it can cause "goModules" to rebuild. # Attach the hash name of the "go.sum" file so we can rebuild when it changes. suffix = lib.optionalString ( finalAttrs.goSum != null ) "-${(lib.removeSuffix "-go.sum" (lib.removePrefix "${builtins.storeDir}/" finalAttrs.goSum))}"; in "${prefix}go-modules${suffix}";
nativeBuildInputs = (finalAttrs.nativeBuildInputs or [ ]) ++ [ go gitMinimal cacert ];
inherit (finalAttrs) src modRoot goSum;
# The following inheritance behavior is not trivial to expect, and some may # argue it's not ideal. Changing it may break vendor hashes in Nixpkgs and # out in the wild. In anycase, it's documented in: # doc/languages-frameworks/go.section.md. prePatch = finalAttrs.prePatch or ""; patches = finalAttrs.patches or [ ]; patchFlags = finalAttrs.patchFlags or [ ]; postPatch = finalAttrs.postPatch or ""; preBuild = finalAttrs.preBuild or ""; postBuild = finalAttrs.modPostBuild or ""; sourceRoot = finalAttrs.sourceRoot or ""; setSourceRoot = finalAttrs.setSourceRoot or ""; env = finalAttrs.env or { };
impureEnvVars = lib.fetchers.proxyImpureEnvVars ++ [ "GIT_PROXY_COMMAND" "SOCKS_SERVER" "GOPROXY" ];
configurePhase = args.modConfigurePhase or '' runHook preConfigure export GOCACHE=$TMPDIR/go-cache export GOPATH="$TMPDIR/go" cd "$modRoot" runHook postConfigure '';
buildPhase = args.modBuildPhase or ( '' runHook preBuild '' + lib.optionalString finalAttrs.deleteVendor '' if [ ! -d vendor ]; then echo "vendor folder does not exist, 'deleteVendor' is not needed" exit 10 else rm -rf vendor fi '' + '' if [ -d vendor ]; then echo "vendor folder exists, please set 'vendorHash = null;' in your expression" exit 10 fi
export GIT_SSL_CAINFO=$NIX_SSL_CERT_FILE ${ if finalAttrs.proxyVendor then '' mkdir -p "$GOPATH/pkg/mod/cache/download" go mod download '' else '' if (( "''${NIX_DEBUG:-0}" >= 1 )); then goModVendorFlags+=(-v) fi go mod vendor "''${goModVendorFlags[@]}" '' }
mkdir -p vendor
runHook postBuild '' );
installPhase = args.modInstallPhase or '' runHook preInstall
${ if finalAttrs.proxyVendor then '' rm -rf "$GOPATH/pkg/mod/cache/download/sumdb" cp -r --reflink=auto "$GOPATH/pkg/mod/cache/download" $out '' else '' cp -r --reflink=auto vendor $out '' }
if ! [ "$(ls -A $out)" ]; then echo "vendor folder is empty, please set 'vendorHash = null;' in your expression" exit 10 fi
runHook postInstall '';
dontFixup = true;
outputHashMode = "recursive"; outputHash = finalAttrs.vendorHash; # Handle empty `vendorHash`; avoid error: # empty hash requires explicit hash algorithm. outputHashAlgo = if finalAttrs.vendorHash == "" then "sha256" else null; # in case an overlay clears passthru by accident, don't fail evaluation }).overrideAttrs (finalAttrs.passthru.overrideModAttrs or overrideModAttrs);
nativeBuildInputs = [ go ] ++ nativeBuildInputs;
env = args.env or { } // { inherit (go) GOOS GOARCH;
GO111MODULE = "on"; GOTOOLCHAIN = "local";
CGO_ENABLED = args.env.CGO_ENABLED or ( if args ? CGO_ENABLED then # Compatibility layer to the CGO_ENABLED attribute not specified as env.CGO_ENABLED # TODO(@ShamrockLee): Remove and convert to # CGO_ENABLED = args.env.CGO_ENABLED or go.CGO_ENABLED # after the Nixpkgs 25.05 branch-off. lib.warn "${finalAttrs.finalPackage.meta.position}: buildGoModule: specify CGO_ENABLED with env.CGO_ENABLED instead." args.CGO_ENABLED else go.CGO_ENABLED ); };
GOFLAGS = GOFLAGS ++ lib.warnIf (lib.any (lib.hasPrefix "-mod=") GOFLAGS) "use `proxyVendor` to control Go module/vendor behavior instead of setting `-mod=` in GOFLAGS" (lib.optional (!finalAttrs.proxyVendor) "-mod=vendor") ++ lib.warnIf (builtins.elem "-trimpath" GOFLAGS) "`-trimpath` is added by default to GOFLAGS by buildGoModule when allowGoReference isn't set to true" (lib.optional (!allowGoReference) "-trimpath");
inherit enableParallelBuilding;
# If not set to an explicit value, set the buildid empty for reproducibility. ldflags = ldflags ++ lib.optional (!lib.any (lib.hasPrefix "-buildid=") ldflags) "-buildid=";
configurePhase = args.configurePhase or ( '' runHook preConfigure
export GOCACHE=$TMPDIR/go-cache export GOPATH="$TMPDIR/go" export GOPROXY=off export GOSUMDB=off cd "$modRoot" '' + lib.optionalString (finalAttrs.vendorHash != null) '' ${ if finalAttrs.proxyVendor then '' export GOPROXY="file://$goModules" '' else '' rm -rf vendor cp -r --reflink=auto "$goModules" vendor '' } '' + ''
# currently pie is only enabled by default in pkgsMusl # this will respect the `hardening{Disable,Enable}` flags if set if [[ $NIX_HARDENING_ENABLE =~ "pie" ]]; then export GOFLAGS="-buildmode=pie $GOFLAGS" fi
runHook postConfigure '' );
buildPhase = args.buildPhase or ( lib.warnIf (builtins.elem "-buildid=" ldflags) "`-buildid=` is set by default as ldflag by buildGoModule" '' runHook preBuild
exclude='\(/_\|examples\|Godeps\|testdata' if [[ -n "$excludedPackages" ]]; then IFS=' ' read -r -a excludedArr <<<$excludedPackages printf -v excludedAlternates '%s\\|' "''${excludedArr[@]}" excludedAlternates=''${excludedAlternates%\\|} # drop final \| added by printf exclude+='\|'"$excludedAlternates" fi exclude+='\)'
buildGoDir() { local cmd="$1" dir="$2"
declare -a flags flags+=(''${tags:+-tags=$(concatStringsSep "," tags)}) flags+=(''${ldflags:+-ldflags="''${ldflags[*]}"}) flags+=("-p" "$NIX_BUILD_CORES") if (( "''${NIX_DEBUG:-0}" >= 1 )); then flags+=(-x) fi
if [ "$cmd" = "test" ]; then flags+=(-vet=off) flags+=($checkFlags) fi
local OUT if ! OUT="$(go $cmd "''${flags[@]}" $dir 2>&1)"; then if ! echo "$OUT" | grep -qE '(no( buildable| non-test)?|build constraints exclude all) 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./,g" else find . -type f -name \*$type.go -exec dirname {} \; | grep -v "/vendor/" | sort --unique | grep -v "$exclude" fi }
if [ -z "$enableParallelBuilding" ]; then export NIX_BUILD_CORES=1 fi for pkg in $(getGoDirs ""); do echo "Building subPackage $pkg" buildGoDir install "$pkg" done '' + lib.optionalString (stdenv.hostPlatform != stdenv.buildPlatform) '' # normalize cross-compiled builds w.r.t. native builds ( dir=$GOPATH/bin/''${GOOS}_''${GOARCH} if [[ -n "$(shopt -s nullglob; echo $dir/*)" ]]; then mv $dir/* $dir/.. fi if [[ -d $dir ]]; then rmdir $dir fi ) '' + '' runHook postBuild '' );
doCheck = args.doCheck or true; checkPhase = args.checkPhase or '' runHook preCheck # We do not set trimpath for tests, in case they reference test assets export GOFLAGS=''${GOFLAGS//-trimpath/}
for pkg in $(getGoDirs test); do buildGoDir test "$pkg" done
runHook postCheck '';
installPhase = args.installPhase or '' runHook preInstall
mkdir -p $out dir="$GOPATH/bin" [ -e "$dir" ] && cp -r $dir $out
runHook postInstall '';
strictDeps = true;
disallowedReferences = lib.optional (!allowGoReference) go;
passthru = { inherit go; # Canonicallize `overrideModAttrs` as an attribute overlay. # `passthru.overrideModAttrs` will be overridden # when users want to override `goModules`. overrideModAttrs = lib.toExtension overrideModAttrs; } // passthru;
meta = { # Add default meta information. platforms = go.meta.platforms or lib.platforms.all; } // meta; };}