Use the highest compatible Go version whenever possible

It should be generally safe to compile any older Go project with a
newer compiler and in the few cases where it isn't it could be
manually passed.
This commit is contained in:
adisbladis 2022-09-02 16:34:23 +12:00
parent 6c4e4b7f57
commit 36f0c54655

View file

@ -126,16 +126,22 @@ let
''
);
# Select Go attribute based on version specified in go.mod
# Return a Go attribute and error out if the Go version is older than was specified in go.mod.
selectGo = attrs: goMod: attrs.go or (if goMod == null then pkgs.go else
(
let
goVersion = goMod.go;
goAttr = "go_" + (replaceStrings [ "." ] [ "_" ] goVersion);
goAttrs = lib.reverseList (builtins.filter
(
attr: lib.hasPrefix "go_" attr && lib.versionAtLeast pkgs.${attr}.version goVersion
)
(lib.attrNames pkgs));
goAttr = elemAt goAttrs 0;
in
(
if hasAttr goAttr pkgs then pkgs.${goAttr}
else trace "go.mod specified Go version ${goVersion} but doesn't exist. Falling back to ${pkgs.go.version}." pkgs.go
if goAttrs != [ ]
then pkgs.${goAttr}
else throw "go.mod specified Go version ${goVersion}, but no compatible Go attribute could be found."
)
));