diff --git a/build.go b/build.go index 77e9c77..d57ad9c 100644 --- a/build.go +++ b/build.go @@ -35,13 +35,13 @@ import ( _ "github.com/goreleaser/nfpm/v2/rpm" "github.com/urfave/cli/v2" "golang.org/x/exp/slices" - "golang.org/x/sys/cpu" "github.com/goreleaser/nfpm/v2" "github.com/goreleaser/nfpm/v2/files" "go.arsenm.dev/lure/distro" "go.arsenm.dev/lure/download" "go.arsenm.dev/lure/internal/shutils" + "go.arsenm.dev/lure/internal/cpu" "go.arsenm.dev/lure/internal/shutils/decoder" "go.arsenm.dev/lure/manager" "mvdan.cc/sh/v3/expand" @@ -264,7 +264,7 @@ func buildPackage(ctx context.Context, script string, mgr manager.Manager) ([]st } if pkgInfo.Arch == "arm" { - pkgInfo.Arch = checkARMVariant() + pkgInfo.Arch = cpu.ARMVariant() } contents := []*files.Content{} @@ -439,24 +439,6 @@ func setDirVars(ctx context.Context, runner *interp.Runner, srcdir, pkgdir strin return runner.Run(ctx, fl) } -// checkARMVariant checks which variant of ARM lure is running -// on, by using the same detection method as Go itself -func checkARMVariant() string { - armEnv := os.Getenv("LURE_ARM_VARIANT") - // ensure value has "arm" prefix, such as arm5 or arm6 - if strings.HasPrefix(armEnv, "arm") { - return armEnv - } - - if cpu.ARM.HasVFPv3 { - return "arm7" - } else if cpu.ARM.HasVFP { - return "arm6" - } else { - return "arm5" - } -} - func setScripts(vars *BuildVars, info *nfpm.Info, scriptDir string) { if vars.Scripts.PreInstall != "" { info.Scripts.PreInstall = filepath.Join(scriptDir, vars.Scripts.PreInstall) diff --git a/distro/osrelease.go b/distro/osrelease.go index bc53db8..28d3334 100644 --- a/distro/osrelease.go +++ b/distro/osrelease.go @@ -22,6 +22,7 @@ import ( "context" "errors" "os" + "strings" "go.arsenm.dev/lure/internal/shutils" "mvdan.cc/sh/v3/expand" @@ -35,6 +36,7 @@ type OSRelease struct { Name string PrettyName string ID string + Like []string BuildID string ANSIColor string HomeURL string @@ -80,7 +82,7 @@ func ParseOSRelease(ctx context.Context) (*OSRelease, error) { return nil, ErrParse } - return &OSRelease{ + out := &OSRelease{ Name: runner.Vars["NAME"].Str, PrettyName: runner.Vars["PRETTY_NAME"].Str, ID: runner.Vars["ID"].Str, @@ -91,5 +93,11 @@ func ParseOSRelease(ctx context.Context) (*OSRelease, error) { SupportURL: runner.Vars["SUPPORT_URL"].Str, BugReportURL: runner.Vars["BUG_REPORT_URL"].Str, Logo: runner.Vars["LOGO"].Str, - }, nil + } + + if runner.Vars["ID_LIKE"].IsSet() { + out.Like = strings.Split(runner.Vars["ID_LIKE"].Str, " ") + } + + return out, nil } diff --git a/internal/cpu/cpu.go b/internal/cpu/cpu.go new file mode 100644 index 0000000..4e5e32e --- /dev/null +++ b/internal/cpu/cpu.go @@ -0,0 +1,26 @@ +package cpu + +import ( + "os" + "strings" + + "golang.org/x/sys/cpu" +) + +// ARMVariant checks which variant of ARM lure is running +// on, by using the same detection method as Go itself +func ARMVariant() string { + armEnv := os.Getenv("LURE_ARM_VARIANT") + // ensure value has "arm" prefix, such as arm5 or arm6 + if strings.HasPrefix(armEnv, "arm") { + return armEnv + } + + if cpu.ARM.HasVFPv3 { + return "arm7" + } else if cpu.ARM.HasVFP { + return "arm6" + } else { + return "arm5" + } +} diff --git a/internal/shutils/decoder/decoder.go b/internal/shutils/decoder/decoder.go index 7601bb9..4a536c4 100644 --- a/internal/shutils/decoder/decoder.go +++ b/internal/shutils/decoder/decoder.go @@ -28,6 +28,7 @@ import ( "github.com/mitchellh/mapstructure" "go.arsenm.dev/lure/distro" + "go.arsenm.dev/lure/internal/cpu" "golang.org/x/exp/slices" "mvdan.cc/sh/v3/expand" "mvdan.cc/sh/v3/interp" @@ -196,10 +197,33 @@ func (d *Decoder) genPossibleNames(name string) []string { return []string{name} } - return []string{ - fmt.Sprintf("%s_%s_%s", name, runtime.GOARCH, d.info.ID), - fmt.Sprintf("%s_%s", name, d.info.ID), - fmt.Sprintf("%s_%s", name, runtime.GOARCH), - name, + architectures := []string{runtime.GOARCH} + + if runtime.GOARCH == "arm" { + // More specific goes first + architectures[0] = cpu.ARMVariant() + architectures = append(architectures, "arm") } + + distros := []string{d.info.ID} + distros = append(distros, d.info.Like...) + + var out []string + for _, arch := range architectures { + for _, distro := range distros { + out = append( + out, + fmt.Sprintf("%s_%s_%s", name, arch, distro), + fmt.Sprintf("%s_%s", name, distro), + ) + } + out = append(out, fmt.Sprintf("%s_%s", name, arch)) + } + out = append(out, name) + + for index, item := range out { + out[index] = strings.ReplaceAll(item, "-", "_") + } + + return out }