1
0
mirror of https://github.com/goreleaser/goreleaser.git synced 2025-01-24 04:16:27 +02:00
Carlos Alexandro Becker 9ba04398a2
feat: support freebsd/arm64 and openbsd/arm64 (#1377)
Signed-off-by: Carlos Alexandro Becker <caarlos0@gmail.com>
2020-03-04 16:01:57 -03:00

154 lines
3.0 KiB
Go

package golang
import (
"fmt"
"strings"
"github.com/apex/log"
"github.com/goreleaser/goreleaser/pkg/config"
)
type target struct {
os, arch, arm, mips string
}
func (t target) String() string {
if t.arm != "" {
return fmt.Sprintf("%s_%s_%s", t.os, t.arch, t.arm)
}
if t.mips != "" {
return fmt.Sprintf("%s_%s_%s", t.os, t.arch, t.mips)
}
return fmt.Sprintf("%s_%s", t.os, t.arch)
}
func matrix(build config.Build) (result []string) {
// nolint:prealloc
var targets []target
for _, target := range allBuildTargets(build) {
if !valid(target) {
log.WithField("target", target).
Debug("skipped invalid build")
continue
}
if ignored(build, target) {
log.WithField("target", target).
Debug("skipped ignored build")
continue
}
targets = append(targets, target)
}
for _, target := range targets {
result = append(result, target.String())
}
return
}
func allBuildTargets(build config.Build) (targets []target) {
for _, goos := range build.Goos {
for _, goarch := range build.Goarch {
if goarch == "arm" {
for _, goarm := range build.Goarm {
targets = append(targets, target{
os: goos,
arch: goarch,
arm: goarm,
})
}
continue
}
if strings.HasPrefix(goarch, "mips") {
for _, gomips := range build.Gomips {
targets = append(targets, target{
os: goos,
arch: goarch,
mips: gomips,
})
}
continue
}
targets = append(targets, target{
os: goos,
arch: goarch,
})
}
}
return
}
// TODO: this could be improved by using a map
// https://github.com/goreleaser/goreleaser/pull/522#discussion_r164245014
func ignored(build config.Build, target target) bool {
for _, ig := range build.Ignore {
if ig.Goos != "" && ig.Goos != target.os {
continue
}
if ig.Goarch != "" && ig.Goarch != target.arch {
continue
}
if ig.Goarm != "" && ig.Goarm != target.arm {
continue
}
if ig.Gomips != "" && ig.Gomips != target.mips {
continue
}
return true
}
return false
}
func valid(target target) bool {
var s = target.os + target.arch
for _, a := range validTargets {
if a == s {
return true
}
}
return false
}
// list from https://golang.org/doc/install/source#environment
// nolint: gochecknoglobals
var validTargets = []string{
"aixppc64",
"android386",
"androidamd64",
"androidarm",
"androidarm64",
"darwin386",
"darwinamd64",
// "darwinarm", - requires admin rights and other ios stuff
// "darwinarm64", - requires admin rights and other ios stuff
"dragonflyamd64",
"freebsd386",
"freebsdamd64",
"freebsdarm",
"freebsdarm64", // not on the official list for some reason, yet its supported on go 1.14+
"illumosamd64",
"jswasm",
"linux386",
"linuxamd64",
"linuxarm",
"linuxarm64",
"linuxppc64",
"linuxppc64le",
"linuxmips",
"linuxmipsle",
"linuxmips64",
"linuxmips64le",
"linuxs390x",
"netbsd386",
"netbsdamd64",
"netbsdarm",
"openbsd386",
"openbsdamd64",
"openbsdarm",
"openbsdarm64",
"plan9386",
"plan9amd64",
"plan9arm",
"solarisamd64",
"windows386",
"windowsamd64",
}