Bugs: https://bugs.gentoo.org/875602
Taken from: https://github.com/mitchellh/gox/compare/v1.0.1...master#diff-8cf5108e51f76a4e330f413081b626cf56afd8a75dccbb8b5c679c9ba2dcd7feR153
Upstream status: master branch already support riscv https://github.com/mitchellh/gox/blob/master/platform.go#L153 , but didn't make a new release.

From a76c2b89f74aaad92c3e7de5f98b58e4313674ef Mon Sep 17 00:00:00 2001
From: Christopher Swenson <[email protected]>
Date: Thu, 30 Jun 2022 12:44:14 -0700
Subject: [PATCH] Add GitHub actions; remove vendor and TravisCI config
Notes: This patch only use on riscv platform, when upstream make a new release(include riscv support) this patch can remove.

--- a/go.go     2019-04-10 23:02:03.000000000 +0800
+++ b/go.go     2022-10-06 16:54:17.000000000 +0800
@@ -32,6 +32,7 @@ type CompileOpts struct {
       Cgo         bool
       Rebuild     bool
       GoCmd       string
+       Race        bool
}

// GoCrossCompile
@@ -111,6 +112,9 @@ func GoCrossCompile(opts *CompileOpts) e
       if opts.ModMode != "" {
               args = append(args, "-mod", opts.ModMode)
       }
+       if opts.Race {
+               args = append(args, "-race")
+       }
       args = append(args,
               "-gcflags", opts.Gcflags,
               "-ldflags", opts.Ldflags,
--- a/go.mod    2019-04-10 23:02:03.000000000 +0800
+++ b/go.mod    2022-10-06 16:54:17.000000000 +0800
@@ -1,5 +1,7 @@
module github.com/mitchellh/gox

+go 1.17
+
require (
       github.com/hashicorp/go-version v1.0.0
       github.com/mitchellh/iochan v1.0.0
--- a/go.sum    2019-04-10 23:02:03.000000000 +0800
+++ b/go.sum    2022-10-06 16:54:17.000000000 +0800
@@ -1,6 +1,4 @@
github.com/hashicorp/go-version v1.0.0 h1:21MVWPKDphxa7ineQQTrCU5brh7OuVVAzGOCnnCPtE8=
github.com/hashicorp/go-version v1.0.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
-github.com/mitchellh/iochan v0.0.0-20150529224432-87b45ffd0e95 h1:aHWVygBsLb+Kls/35B3tevL1hvDxZ0UklPA0BmhqTEk=
-github.com/mitchellh/iochan v0.0.0-20150529224432-87b45ffd0e95/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY=
github.com/mitchellh/iochan v1.0.0 h1:C+X3KsSTLFVBr/tK1eYN/vs4rJcvsiLU338UhYPJWeY=
github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY=
--- a/go_test.go        2019-04-10 23:02:03.000000000 +0800
+++ b/go_test.go        2022-10-06 16:54:17.000000000 +0800
@@ -12,13 +12,26 @@ func TestGoVersion(t *testing.T) {
       }

       acceptable := []string{
-               "devel", "go1.0", "go1.1", "go1.2", "go1.3",
-               "go1.4", "go1.4.1", "go1.4.2", "go1.4.3",
-               "go1.5", "go1.5.1", "go1.5.2", "go1.5.3", "go1.5.4",
-               "go1.6", "go1.6.1", "go1.6.2", "go1.6.3", "go1.6.4",
-               "go1.7", "go1.7.1", "go1.7.2", "go1.7.3", "go1.7.4", "go1.7.5", "go1.7.6",
-               "go1.8", "go1.8.1", "go1.8.2", "go1.8.3", "go1.8.4",
-               "go1.9", "go1.9.1", "go1.9.2",
+               "devel",
+               "go1.0",
+               "go1.1",
+               "go1.2",
+               "go1.3",
+               "go1.4",
+               "go1.5",
+               "go1.6",
+               "go1.7",
+               "go1.8",
+               "go1.9",
+               "go1.10",
+               "go1.11",
+               "go1.12",
+               "go1.13",
+               "go1.14",
+               "go1.15",
+               "go1.16",
+               "go1.17",
+               "go1.18",
       }
       found := false
       for _, expected := range acceptable {
--- a/main.go   2019-04-10 23:02:03.000000000 +0800
+++ b/main.go   2022-10-06 16:54:17.000000000 +0800
@@ -27,7 +27,7 @@ func realMain() int {
       var tags string
       var verbose bool
       var flagGcflags, flagAsmflags string
-       var flagCgo, flagRebuild, flagListOSArch bool
+       var flagCgo, flagRebuild, flagListOSArch, flagRaceFlag bool
       var flagGoCmd string
       var modMode string
       flags := flag.NewFlagSet("gox", flag.ExitOnError)
@@ -44,6 +44,7 @@ func realMain() int {
       flags.BoolVar(&flagCgo, "cgo", false, "")
       flags.BoolVar(&flagRebuild, "rebuild", false, "")
       flags.BoolVar(&flagListOSArch, "osarch-list", false, "")
+       flags.BoolVar(&flagRaceFlag, "race", false, "")
       flags.StringVar(&flagGcflags, "gcflags", "", "")
       flags.StringVar(&flagAsmflags, "asmflags", "", "")
       flags.StringVar(&flagGoCmd, "gocmd", "go", "")
@@ -162,6 +163,7 @@ func realMain() int {
                                       Cgo:         flagCgo,
                                       Rebuild:     flagRebuild,
                                       GoCmd:       flagGoCmd,
+                                       Race:        flagRaceFlag,
                               }

                               // Determine if we have specific CFLAGS or LDFLAGS for this
@@ -219,6 +221,7 @@ Options:
  -osarch-list        List supported os/arch pairs for your Go version
  -output="foo"       Output path template. See below for more info
  -parallel=-1        Amount of parallelism, defaults to number of CPUs
+  -race               Build with the go race detector enabled, requires CGO
  -gocmd="go"         Build command, defaults to Go
  -rebuild            Force rebuilding of package that were up to date
  -verbose            Verbose mode

--- a/platform.go       2019-04-10 23:02:03.000000000 +0800
+++ b/platform.go       2022-10-06 16:54:17.000000000 +0800
@@ -25,6 +25,36 @@ func (p *Platform) String() string {
       return fmt.Sprintf("%s/%s", p.OS, p.Arch)
}

+// addDrop appends all of the "add" entries and drops the "drop" entries, ignoring
+// the "Default" parameter.
+func addDrop(base []Platform, add []Platform, drop []Platform) []Platform {
+       newPlatforms := make([]Platform, len(base)+len(add))
+       copy(newPlatforms, base)
+       copy(newPlatforms[len(base):], add)
+
+       // slow, but we only do this during initialization at most once per version
+       for _, platform := range drop {
+               found := -1
+               for i := range newPlatforms {
+                       if newPlatforms[i].Arch == platform.Arch && newPlatforms[i].OS == platform.OS {
+                               found = i
+                               break
+                       }
+               }
+               if found < 0 {
+                       panic(fmt.Sprintf("Expected to remove %+v but not found in list %+v", platform, newPlatforms))
+               }
+               if found == len(newPlatforms)-1 {
+                       newPlatforms = newPlatforms[:found]
+               } else if found == 0 {
+                       newPlatforms = newPlatforms[found:]
+               } else {
+                       newPlatforms = append(newPlatforms[:found], newPlatforms[found+1:]...)
+               }
+       }
+       return newPlatforms
+}
+
var (
       Platforms_1_0 = []Platform{
               {"darwin", "386", true},
@@ -40,64 +70,115 @@ var (
               {"windows", "amd64", true},
       }

-       Platforms_1_1 = append(Platforms_1_0, []Platform{
+       Platforms_1_1 = addDrop(Platforms_1_0, []Platform{
               {"freebsd", "arm", true},
               {"netbsd", "386", true},
               {"netbsd", "amd64", true},
               {"netbsd", "arm", true},
               {"plan9", "386", false},
-       }...)
+       }, nil)

-       Platforms_1_3 = append(Platforms_1_1, []Platform{
+       Platforms_1_3 = addDrop(Platforms_1_1, []Platform{
               {"dragonfly", "386", false},
               {"dragonfly", "amd64", false},
               {"nacl", "amd64", false},
               {"nacl", "amd64p32", false},
               {"nacl", "arm", false},
               {"solaris", "amd64", false},
-       }...)
+       }, nil)

-       Platforms_1_4 = append(Platforms_1_3, []Platform{
+       Platforms_1_4 = addDrop(Platforms_1_3, []Platform{
               {"android", "arm", false},
               {"plan9", "amd64", false},
-       }...)
+       }, nil)

-       Platforms_1_5 = append(Platforms_1_4, []Platform{
+       Platforms_1_5 = addDrop(Platforms_1_4, []Platform{
               {"darwin", "arm", false},
               {"darwin", "arm64", false},
               {"linux", "arm64", false},
               {"linux", "ppc64", false},
               {"linux", "ppc64le", false},
-       }...)
+       }, nil)

-       Platforms_1_6 = append(Platforms_1_5, []Platform{
+       Platforms_1_6 = addDrop(Platforms_1_5, []Platform{
               {"android", "386", false},
+               {"android", "amd64", false},
               {"linux", "mips64", false},
               {"linux", "mips64le", false},
-       }...)
+               {"nacl", "386", false},
+               {"openbsd", "arm", true},
+       }, nil)

-       Platforms_1_7 = append(Platforms_1_5, []Platform{
+       Platforms_1_7 = addDrop(Platforms_1_5, []Platform{
               // While not fully supported s390x is generally useful
               {"linux", "s390x", true},
               {"plan9", "arm", false},
               // Add the 1.6 Platforms, but reflect full support for mips64 and mips64le
               {"android", "386", false},
+               {"android", "amd64", false},
               {"linux", "mips64", true},
               {"linux", "mips64le", true},
-       }...)
+               {"nacl", "386", false},
+               {"openbsd", "arm", true},
+       }, nil)

-       Platforms_1_8 = append(Platforms_1_7, []Platform{
+       Platforms_1_8 = addDrop(Platforms_1_7, []Platform{
               {"linux", "mips", true},
               {"linux", "mipsle", true},
-       }...)
+       }, nil)

       // no new platforms in 1.9
       Platforms_1_9 = Platforms_1_8

-       // no new platforms in 1.10
-       Platforms_1_10 = Platforms_1_9
+       // unannounced, but dropped support for android/amd64
+       Platforms_1_10 = addDrop(Platforms_1_9, nil, []Platform{{"android", "amd64", false}})
+
+       Platforms_1_11 = addDrop(Platforms_1_10, []Platform{
+               {"js", "wasm", true},
+       }, nil)
+
+       Platforms_1_12 = addDrop(Platforms_1_11, []Platform{
+               {"aix", "ppc64", false},
+               {"windows", "arm", true},
+       }, nil)
+
+       Platforms_1_13 = addDrop(Platforms_1_12, []Platform{
+               {"illumos", "amd64", false},
+               {"netbsd", "arm64", true},
+               {"openbsd", "arm64", true},
+       }, nil)
+
+       Platforms_1_14 = addDrop(Platforms_1_13, []Platform{
+               {"freebsd", "arm64", true},
+               {"linux", "riscv64", true},
+       }, []Platform{
+               // drop nacl
+               {"nacl", "386", false},
+               {"nacl", "amd64", false},
+               {"nacl", "arm", false},
+       })
+
+       Platforms_1_15 = addDrop(Platforms_1_14, []Platform{
+               {"android", "arm64", false},
+       }, []Platform{
+               // drop i386 macos
+               {"darwin", "386", false},
+       })
+
+       Platforms_1_16 = addDrop(Platforms_1_15, []Platform{
+               {"android", "amd64", false},
+               {"darwin", "arm64", true},
+               {"openbsd", "mips64", false},
+       }, nil)
+
+       Platforms_1_17 = addDrop(Platforms_1_16, []Platform{
+               {"windows", "arm64", true},
+       }, nil)
+
+       // no new platforms in 1.18
+       Platforms_1_18 = Platforms_1_17

-       PlatformsLatest = Platforms_1_10
+       PlatformsLatest = Platforms_1_18
)

// SupportedPlatforms returns the full list of supported platforms for
@@ -131,7 +212,15 @@ func SupportedPlatforms(v string) []Plat
               {">= 1.7, < 1.8", Platforms_1_7},
               {">= 1.8, < 1.9", Platforms_1_8},
               {">= 1.9, < 1.10", Platforms_1_9},
-               {">=1.10, < 1.11", Platforms_1_10},
+               {">= 1.10, < 1.11", Platforms_1_10},
+               {">= 1.11, < 1.12", Platforms_1_11},
+               {">= 1.12, < 1.13", Platforms_1_12},
+               {">= 1.13, < 1.14", Platforms_1_13},
+               {">= 1.14, < 1.15", Platforms_1_14},
+               {">= 1.15, < 1.16", Platforms_1_15},
+               {">= 1.16, < 1.17", Platforms_1_16},
+               {">= 1.17, < 1.18", Platforms_1_17},
+               {">= 1.18, < 1.19", Platforms_1_18},
       }

       for _, p := range platforms {
@@ -145,5 +234,5 @@ func SupportedPlatforms(v string) []Plat
       }

       // Assume latest
-       return Platforms_1_9
+       return PlatformsLatest
}
--- a/platform_test.go  2019-04-10 23:02:03.000000000 +0800
+++ b/platform_test.go  2022-10-06 16:54:17.000000000 +0800
@@ -63,6 +63,55 @@ func TestSupportedPlatforms(t *testing.T
               t.Fatalf("bad: %#v", ps)
       }

+       ps = SupportedPlatforms("go1.10")
+       if !reflect.DeepEqual(ps, Platforms_1_10) {
+               t.Fatalf("bad: %#v", ps)
+       }
+
+       ps = SupportedPlatforms("go1.11")
+       if !reflect.DeepEqual(ps, Platforms_1_11) {
+               t.Fatalf("bad: %#v", ps)
+       }
+
+       ps = SupportedPlatforms("go1.12")
+       if !reflect.DeepEqual(ps, Platforms_1_12) {
+               t.Fatalf("bad: %#v", ps)
+       }
+
+       ps = SupportedPlatforms("go1.13")
+       if !reflect.DeepEqual(ps, Platforms_1_13) {
+               t.Fatalf("bad: %#v", ps)
+       }
+
+       ps = SupportedPlatforms("go1.14")
+       if !reflect.DeepEqual(ps, Platforms_1_14) {
+               t.Fatalf("bad: %#v", ps)
+       }
+
+       ps = SupportedPlatforms("go1.15")
+       if !reflect.DeepEqual(ps, Platforms_1_15) {
+               t.Fatalf("bad: %#v", ps)
+       }
+
+       ps = SupportedPlatforms("go1.16")
+       if !reflect.DeepEqual(ps, Platforms_1_16) {
+               t.Fatalf("bad: %#v", ps)
+       }
+
+       ps = SupportedPlatforms("go1.17")
+       if !reflect.DeepEqual(ps, Platforms_1_17) {
+               t.Fatalf("bad: %#v", ps)
+       }
+
+       ps = SupportedPlatforms("go1.18")
+       if !reflect.DeepEqual(ps, Platforms_1_18) {
+               t.Fatalf("bad: %#v", ps)
+       }
+
+       ps = SupportedPlatforms("go1.10")
+       if !reflect.DeepEqual(ps, Platforms_1_10) {
+               t.Fatalf("bad: %#v", ps)
+       }
       // Unknown
       ps = SupportedPlatforms("foo")
       if !reflect.DeepEqual(ps, PlatformsLatest) {
@@ -72,17 +121,30 @@ func TestSupportedPlatforms(t *testing.T

func TestMIPS(t *testing.T) {
       g16 := SupportedPlatforms("go1.6")
+       found := false
       for _, p := range g16 {
-               if p.Arch == "mips64" && p.Default {
-                       t.Fatal("mips64 should not be default for 1.6")
+               if p.OS == "linux" && p.Arch == "mips64" && !p.Default {
+                       found = true
+               }
+               if p.OS == "linux" && p.Arch == "mips64" && p.Default {
+                       t.Fatalf("mips64 should not be default for 1.6, but got %+v, %+v", p, g16)
               }
       }
+       if !found {
+               t.Fatal("Expected to find linux/mips64/false in go1.6 supported platforms")
+       }
+       found = false

       g17 := SupportedPlatforms("go1.7")
       for _, p := range g17 {
-               if p.Arch == "mips64" && !p.Default {
+               if p.OS == "linux" && p.Arch == "mips64" && p.Default {
+                       found = true
+               }
+               if p.OS == "linux" && p.Arch == "mips64" && !p.Default {
                       t.Fatal("mips64 should be default for 1.7")
               }
       }
-
+       if !found {
+               t.Fatal("Expected to find linux/mips64/true in go1.7 supported platforms")
+       }
}
--- a/vendor/github.com/hashicorp/go-version/constraint.go      2019-04-10 23:02:03.000000000 +0800
+++ b/vendor/github.com/hashicorp/go-version/constraint.go      2022-10-06 17:13:18.000000000 +0800
@@ -2,6 +2,7 @@ package version

import (
       "fmt"
+       "reflect"
       "regexp"
       "strings"
)
@@ -113,6 +114,26 @@ func parseSingle(v string) (*Constraint,
       }, nil
}

+func prereleaseCheck(v, c *Version) bool {
+       switch vPre, cPre := v.Prerelease() != "", c.Prerelease() != ""; {
+       case cPre && vPre:
+               // A constraint with a pre-release can only match a pre-release version
+               // with the same base segments.
+               return reflect.DeepEqual(c.Segments64(), v.Segments64())
+
+       case !cPre && vPre:
+               // A constraint without a pre-release can only match a version without a
+               // pre-release.
+               return false
+
+       case cPre && !vPre:
+               // OK, except with the pessimistic operator
+       case !cPre && !vPre:
+               // OK
+       }
+       return true
+}
+
//-------------------------------------------------------------------
// Constraint functions
//-------------------------------------------------------------------
@@ -126,22 +147,27 @@ func constraintNotEqual(v, c *Version) b
}

func constraintGreaterThan(v, c *Version) bool {
-       return v.Compare(c) == 1
+       return prereleaseCheck(v, c) && v.Compare(c) == 1
}

func constraintLessThan(v, c *Version) bool {
-       return v.Compare(c) == -1
+       return prereleaseCheck(v, c) && v.Compare(c) == -1
}

func constraintGreaterThanEqual(v, c *Version) bool {
-       return v.Compare(c) >= 0
+       return prereleaseCheck(v, c) && v.Compare(c) >= 0
}

func constraintLessThanEqual(v, c *Version) bool {
-       return v.Compare(c) <= 0
+       return prereleaseCheck(v, c) && v.Compare(c) <= 0
}

func constraintPessimistic(v, c *Version) bool {
+       // Using a pessimistic constraint with a pre-release, restricts versions to pre-releases
+       if !prereleaseCheck(v, c) || (c.Prerelease() != "" && v.Prerelease() == "") {
+               return false
+       }
+
       // If the version being checked is naturally less than the constraint, then there
       // is no way for the version to be valid against the constraint
       if v.LessThan(c) {

--- a/vendor/github.com/hashicorp/go-version/version.go 2019-04-10 23:02:03.000000000 +0800
+++ b/vendor/github.com/hashicorp/go-version/version.go 2022-10-06 17:13:18.000000000 +0800
@@ -15,7 +15,7 @@ var versionRegexp *regexp.Regexp
// The raw regular expression string used for testing the validity
// of a version.
const VersionRegexpRaw string = `v?([0-9]+(\.[0-9]+)*?)` +
-       `(-?([0-9A-Za-z\-~]+(\.[0-9A-Za-z\-~]+)*))?` +
+       `(-([0-9]+[0-9A-Za-z\-~]*(\.[0-9A-Za-z\-~]+)*)|(-?([A-Za-z\-~]+[0-9A-Za-z\-~]*(\.[0-9A-Za-z\-~]+)*)))?` +
       `(\+([0-9A-Za-z\-~]+(\.[0-9A-Za-z\-~]+)*))?` +
       `?`

@@ -25,6 +25,7 @@ type Version struct {
       pre      string
       segments []int64
       si       int
+       original string
}

func init() {
@@ -59,11 +60,17 @@ func NewVersion(v string) (*Version, err
               segments = append(segments, 0)
       }

+       pre := matches[7]
+       if pre == "" {
+               pre = matches[4]
+       }
+
       return &Version{
-               metadata: matches[7],
-               pre:      matches[4],
+               metadata: matches[10],
+               pre:      pre,
               segments: segments,
               si:       si,
+               original: v,
       }, nil
}

@@ -301,11 +308,19 @@ func (v *Version) Segments() []int {
// for a version "1.2.3-beta", segments will return a slice of
// 1, 2, 3.
func (v *Version) Segments64() []int64 {
-       return v.segments
+       result := make([]int64, len(v.segments))
+       copy(result, v.segments)
+       return result
}

// String returns the full version string included pre-release
// and metadata information.
+//
+// This value is rebuilt according to the parsed segments and other
+// information. Therefore, ambiguities in the version string such as
+// prefixed zeroes (1.04.0 => 1.4.0), `v` prefix (v1.0.0 => 1.0.0), and
+// missing parts (1.0 => 1.0.0) will be made into a canonicalized form
+// as shown in the parenthesized examples.
func (v *Version) String() string {
       var buf bytes.Buffer
       fmtParts := make([]string, len(v.segments))
@@ -324,3 +339,9 @@ func (v *Version) String() string {

       return buf.String()
}
+
+// Original returns the original parsed version as-is, including any
+// potential whitespace, `v` prefix, etc.
+func (v *Version) Original() string {
+       return v.original
+}

--- a/vendor/modules.txt        1970-01-01 08:00:00.000000000 +0800
+++ b/vendor/modules.txt        2022-10-06 17:13:18.000000000 +0800
@@ -0,0 +1,6 @@
+# github.com/hashicorp/go-version v1.0.0
+## explicit
+github.com/hashicorp/go-version
+# github.com/mitchellh/iochan v1.0.0
+## explicit
+github.com/mitchellh/iochan