Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: allow to override build flags by goos/goarch/etc #2860

Merged
merged 10 commits into from Feb 2, 2022
42 changes: 37 additions & 5 deletions internal/builders/golang/build.go
Expand Up @@ -19,6 +19,7 @@ import (
api "github.com/goreleaser/goreleaser/pkg/build"
"github.com/goreleaser/goreleaser/pkg/config"
"github.com/goreleaser/goreleaser/pkg/context"
"github.com/imdario/mergo"
)

// Default builder instance.
Expand Down Expand Up @@ -129,29 +130,60 @@ func (*Builder) Build(ctx *context.Context, build config.Build, options api.Opti
return nil
}

func withOverrides(ctx *context.Context, build config.Build, options api.Options) (config.BuildDetails, error) {
optsTarget := options.Goos + options.Goarch + options.Goarm + options.Gomips
for _, o := range build.BuildDetailsOverrides {
overrideTarget, err := tmpl.New(ctx).Apply(o.Goos + o.Goarch + o.Gomips + o.Goarm)
if err != nil {
return build.BuildDetails, err
}

if optsTarget == overrideTarget {
dets := config.BuildDetails{
Ldflags: build.BuildDetails.Ldflags,
Tags: build.BuildDetails.Tags,
Flags: build.BuildDetails.Flags,
Asmflags: build.BuildDetails.Asmflags,
Gcflags: build.BuildDetails.Gcflags,
}
if err := mergo.Merge(&dets, o.BuildDetails, mergo.WithOverride); err != nil {
return build.BuildDetails, err
}
log.WithField("dets", dets).Info("will use")
return dets, nil
}
}
return build.BuildDetails, nil
}

func buildGoBuildLine(ctx *context.Context, build config.Build, options api.Options, artifact *artifact.Artifact, env []string) ([]string, error) {
cmd := []string{build.GoBinary, "build"}
flags, err := processFlags(ctx, artifact, env, build.Flags, "")

details, err := withOverrides(ctx, build, options)
if err != nil {
return cmd, err
}
flags, err := processFlags(ctx, artifact, env, details.Flags, "")
if err != nil {
return cmd, err
}
cmd = append(cmd, flags...)

asmflags, err := processFlags(ctx, artifact, env, build.Asmflags, "-asmflags=")
asmflags, err := processFlags(ctx, artifact, env, details.Asmflags, "-asmflags=")
if err != nil {
return cmd, err
}
cmd = append(cmd, asmflags...)

gcflags, err := processFlags(ctx, artifact, env, build.Gcflags, "-gcflags=")
gcflags, err := processFlags(ctx, artifact, env, details.Gcflags, "-gcflags=")
if err != nil {
return cmd, err
}
cmd = append(cmd, gcflags...)

// tags is not a repeatable flag
if len(build.Tags) > 0 {
caarlos0 marked this conversation as resolved.
Show resolved Hide resolved
tags, err := processFlags(ctx, artifact, env, build.Tags, "")
tags, err := processFlags(ctx, artifact, env, details.Tags, "")
if err != nil {
return cmd, err
}
Expand All @@ -161,7 +193,7 @@ func buildGoBuildLine(ctx *context.Context, build config.Build, options api.Opti
// ldflags is not a repeatable flag
if len(build.Ldflags) > 0 {
caarlos0 marked this conversation as resolved.
Show resolved Hide resolved
// flag prefix is skipped because ldflags need to output a single string
ldflags, err := processFlags(ctx, artifact, env, build.Ldflags, "")
ldflags, err := processFlags(ctx, artifact, env, details.Ldflags, "")
if err != nil {
return cmd, err
}
Expand Down