Skip to content

Commit 3236602

Browse files
committed
feat: support gcflags as separate opt, improve with_debug
- Adds support for specifying -gcflags separately. This helps with shell quoting issues that may otherwise happen if providing gcflags through GO_BUILDFLAGS. - WITH_DEBUG disables Go compiler optimizations and inlining, to facilitate interactive debugging. Signed-off-by: Maja Bojarska <maja.bojarska@siderolabs.com>
1 parent 9dc6c51 commit 3236602

4 files changed

Lines changed: 25 additions & 9 deletions

File tree

Dockerfile

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
# THIS FILE WAS AUTOMATICALLY GENERATED BY KRES, PLEASE DO NOT EDIT.
44
#
5-
# Generated on 2026-05-19T09:29:21Z by kres bf18af8-dirty.
5+
# Generated on 2026-05-26T16:51:22Z by kres c267185-dirty.
66

77
ARG TOOLCHAIN=scratch
88

@@ -143,47 +143,51 @@ COPY --from=generate / /
143143
COPY --from=embed-generate / /
144144
WORKDIR /src/cmd/kres
145145
ARG GO_BUILDFLAGS
146+
ARG GO_GCFLAGS
146147
ARG GO_LDFLAGS
147148
ARG VERSION_PKG="internal/version"
148149
ARG SHA
149150
ARG TAG
150-
RUN --mount=type=cache,target=/root/.cache/go-build,id=kres/root/.cache/go-build --mount=type=cache,target=/go/pkg,id=kres/go/pkg GOARCH=amd64 GOOS=darwin go build ${GO_BUILDFLAGS} -ldflags "${GO_LDFLAGS} -X ${VERSION_PKG}.Name=kres -X ${VERSION_PKG}.SHA=${SHA} -X ${VERSION_PKG}.Tag=${TAG}" -o /kres-darwin-amd64
151+
RUN --mount=type=cache,target=/root/.cache/go-build,id=kres/root/.cache/go-build --mount=type=cache,target=/go/pkg,id=kres/go/pkg GOARCH=amd64 GOOS=darwin go build ${GO_BUILDFLAGS} -gcflags "${GO_GCFLAGS}" -ldflags "${GO_LDFLAGS} -X ${VERSION_PKG}.Name=kres -X ${VERSION_PKG}.SHA=${SHA} -X ${VERSION_PKG}.Tag=${TAG}" -o /kres-darwin-amd64
151152

152153
# builds kres-darwin-arm64
153154
FROM base AS kres-darwin-arm64-build
154155
COPY --from=generate / /
155156
COPY --from=embed-generate / /
156157
WORKDIR /src/cmd/kres
157158
ARG GO_BUILDFLAGS
159+
ARG GO_GCFLAGS
158160
ARG GO_LDFLAGS
159161
ARG VERSION_PKG="internal/version"
160162
ARG SHA
161163
ARG TAG
162-
RUN --mount=type=cache,target=/root/.cache/go-build,id=kres/root/.cache/go-build --mount=type=cache,target=/go/pkg,id=kres/go/pkg GOARCH=arm64 GOOS=darwin go build ${GO_BUILDFLAGS} -ldflags "${GO_LDFLAGS} -X ${VERSION_PKG}.Name=kres -X ${VERSION_PKG}.SHA=${SHA} -X ${VERSION_PKG}.Tag=${TAG}" -o /kres-darwin-arm64
164+
RUN --mount=type=cache,target=/root/.cache/go-build,id=kres/root/.cache/go-build --mount=type=cache,target=/go/pkg,id=kres/go/pkg GOARCH=arm64 GOOS=darwin go build ${GO_BUILDFLAGS} -gcflags "${GO_GCFLAGS}" -ldflags "${GO_LDFLAGS} -X ${VERSION_PKG}.Name=kres -X ${VERSION_PKG}.SHA=${SHA} -X ${VERSION_PKG}.Tag=${TAG}" -o /kres-darwin-arm64
163165

164166
# builds kres-linux-amd64
165167
FROM base AS kres-linux-amd64-build
166168
COPY --from=generate / /
167169
COPY --from=embed-generate / /
168170
WORKDIR /src/cmd/kres
169171
ARG GO_BUILDFLAGS
172+
ARG GO_GCFLAGS
170173
ARG GO_LDFLAGS
171174
ARG VERSION_PKG="internal/version"
172175
ARG SHA
173176
ARG TAG
174-
RUN --mount=type=cache,target=/root/.cache/go-build,id=kres/root/.cache/go-build --mount=type=cache,target=/go/pkg,id=kres/go/pkg GOARCH=amd64 GOOS=linux go build ${GO_BUILDFLAGS} -ldflags "${GO_LDFLAGS} -X ${VERSION_PKG}.Name=kres -X ${VERSION_PKG}.SHA=${SHA} -X ${VERSION_PKG}.Tag=${TAG}" -o /kres-linux-amd64
177+
RUN --mount=type=cache,target=/root/.cache/go-build,id=kres/root/.cache/go-build --mount=type=cache,target=/go/pkg,id=kres/go/pkg GOARCH=amd64 GOOS=linux go build ${GO_BUILDFLAGS} -gcflags "${GO_GCFLAGS}" -ldflags "${GO_LDFLAGS} -X ${VERSION_PKG}.Name=kres -X ${VERSION_PKG}.SHA=${SHA} -X ${VERSION_PKG}.Tag=${TAG}" -o /kres-linux-amd64
175178

176179
# builds kres-linux-arm64
177180
FROM base AS kres-linux-arm64-build
178181
COPY --from=generate / /
179182
COPY --from=embed-generate / /
180183
WORKDIR /src/cmd/kres
181184
ARG GO_BUILDFLAGS
185+
ARG GO_GCFLAGS
182186
ARG GO_LDFLAGS
183187
ARG VERSION_PKG="internal/version"
184188
ARG SHA
185189
ARG TAG
186-
RUN --mount=type=cache,target=/root/.cache/go-build,id=kres/root/.cache/go-build --mount=type=cache,target=/go/pkg,id=kres/go/pkg GOARCH=arm64 GOOS=linux go build ${GO_BUILDFLAGS} -ldflags "${GO_LDFLAGS} -X ${VERSION_PKG}.Name=kres -X ${VERSION_PKG}.SHA=${SHA} -X ${VERSION_PKG}.Tag=${TAG}" -o /kres-linux-arm64
190+
RUN --mount=type=cache,target=/root/.cache/go-build,id=kres/root/.cache/go-build --mount=type=cache,target=/go/pkg,id=kres/go/pkg GOARCH=arm64 GOOS=linux go build ${GO_BUILDFLAGS} -gcflags "${GO_GCFLAGS}" -ldflags "${GO_LDFLAGS} -X ${VERSION_PKG}.Name=kres -X ${VERSION_PKG}.SHA=${SHA} -X ${VERSION_PKG}.Tag=${TAG}" -o /kres-linux-arm64
187191

188192
FROM scratch AS kres-darwin-amd64
189193
COPY --from=kres-darwin-amd64-build /kres-darwin-amd64 /kres-darwin-amd64

Makefile

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# THIS FILE WAS AUTOMATICALLY GENERATED BY KRES, PLEASE DO NOT EDIT.
22
#
3-
# Generated on 2026-05-26T09:46:24Z by kres 47707df-dirty.
3+
# Generated on 2026-05-26T16:46:25Z by kres c267185-dirty.
44

55
# common variables
66

@@ -33,6 +33,7 @@ DIS_VULNCHECK_VERSION ?= v0.0.0-20260430093434-b73e0972e2fb
3333
GO_BUILDFLAGS ?=
3434
GO_BUILDTAGS ?= ,
3535
GO_LDFLAGS ?=
36+
GO_GCFLAGS ?=
3637
CGO_ENABLED ?= 0
3738
GOTOOLCHAIN ?= local
3839
GOEXPERIMENT ?=
@@ -68,6 +69,7 @@ COMMON_ARGS += --build-arg=REGISTRY="$(REGISTRY)"
6869
COMMON_ARGS += --build-arg=TOOLCHAIN="$(TOOLCHAIN)"
6970
COMMON_ARGS += --build-arg=CGO_ENABLED="$(CGO_ENABLED)"
7071
COMMON_ARGS += --build-arg=GO_BUILDFLAGS="$(GO_BUILDFLAGS)"
72+
COMMON_ARGS += --build-arg=GO_GCFLAGS="$(GO_GCFLAGS)"
7173
COMMON_ARGS += --build-arg=GO_LDFLAGS="$(GO_LDFLAGS)"
7274
COMMON_ARGS += --build-arg=GOTOOLCHAIN="$(GOTOOLCHAIN)"
7375
COMMON_ARGS += --build-arg=GOEXPERIMENT="$(GOEXPERIMENT)"
@@ -147,6 +149,7 @@ GO_LDFLAGS += -linkmode=external -extldflags '-static'
147149
endif
148150

149151
ifneq (, $(filter $(WITH_DEBUG), t true TRUE y yes 1))
152+
GO_GCFLAGS += -N -l
150153
GO_BUILDTAGS := $(GO_BUILDTAGS)sidero.debug,
151154
else
152155
GO_LDFLAGS += -s

internal/project/golang/build.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ func (build *Build) CompileDockerfile(output *dockerfile.Output) error {
9696
stage.
9797
Step(step.WorkDir(filepath.Join("/src", build.sourcePath))).
9898
Step(step.Arg("GO_BUILDFLAGS")).
99+
Step(step.Arg("GO_GCFLAGS")).
99100
Step(step.Arg("GO_LDFLAGS"))
100101

101102
ldflags := "${GO_LDFLAGS}"
@@ -110,13 +111,14 @@ func (build *Build) CompileDockerfile(output *dockerfile.Output) error {
110111
ldflags += " -X ${VERSION_PKG}.SHA=${SHA} -X ${VERSION_PKG}.Tag=${TAG}"
111112
}
112113

114+
gcflags := "${GO_GCFLAGS}"
113115
buildFlags := " ${GO_BUILDFLAGS}"
114116

115117
if build.BuildFlags != nil {
116118
buildFlags = " " + strings.Join(build.BuildFlags, " ")
117119
}
118120

119-
script := step.Script(fmt.Sprintf(`%s%s -ldflags "%s" -o /%s`, build.command, buildFlags, ldflags, name)).
121+
script := step.Script(fmt.Sprintf(`%s%s -gcflags "%s" -ldflags "%s" -o /%s`, build.command, buildFlags, gcflags, ldflags, name)).
120122
MountCache(filepath.Join(build.meta.CachePath, "go-build"), build.meta.GitHubRepository).
121123
MountCache(filepath.Join(build.meta.GoPath, "pkg"), build.meta.GitHubRepository)
122124

internal/project/golang/toolchain.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ func NewToolchain(meta *meta.Options) *Toolchain {
7171
"TOOLCHAIN",
7272
"CGO_ENABLED",
7373
"GO_BUILDFLAGS",
74+
"GO_GCFLAGS",
7475
"GO_LDFLAGS",
7576
"GOTOOLCHAIN",
7677
"GOEXPERIMENT",
@@ -143,9 +144,11 @@ func (toolchain *Toolchain) CompileMakefile(output *makefile.Output) error {
143144
Variable(makefile.OverridableVariable("GO_BUILDFLAGS", "")).
144145
Variable(makefile.OverridableVariable("GO_BUILDTAGS", strings.Join(toolchain.DefaultBuildTags, ",")+",")).
145146
Variable(makefile.OverridableVariable("GO_LDFLAGS", "")).
147+
Variable(makefile.OverridableVariable("GO_GCFLAGS", "")).
146148
Variable(makefile.OverridableVariable("CGO_ENABLED", "0")).
147149
Variable(makefile.OverridableVariable("GOTOOLCHAIN", "local")).
148-
Variable(makefile.OverridableVariable("GOEXPERIMENT", ""))
150+
Variable(makefile.OverridableVariable("GOEXPERIMENT", "")).
151+
Variable(makefile.OverridableVariable("WITH_DEBUG", ""))
149152

150153
// add github token only if necessary
151154
if toolchain.PrivateRepos != nil {
@@ -161,6 +164,7 @@ func (toolchain *Toolchain) CompileMakefile(output *makefile.Output) error {
161164

162165
output.IfTrueCondition("WITH_DEBUG").
163166
Then(
167+
makefile.AppendVariable("GO_GCFLAGS", "-N -l"),
164168
makefile.SimpleVariable("GO_BUILDTAGS", "$(GO_BUILDTAGS)sidero.debug,"),
165169
).
166170
Else(
@@ -277,7 +281,10 @@ func (toolchain *Toolchain) CompileDockerfile(output *dockerfile.Output) error {
277281
base.Step(step.Copy("./"+file, "./"+file))
278282
}
279283

280-
base.Step(step.Script(`go list -mod=readonly all >/dev/null`).MountCache(filepath.Join(toolchain.meta.GoPath, "pkg"), toolchain.meta.GitHubRepository))
284+
base.Step(
285+
step.Script(`go list -mod=readonly all >/dev/null`).
286+
MountCache(filepath.Join(toolchain.meta.GoPath, "pkg"), toolchain.meta.GitHubRepository),
287+
)
281288

282289
return nil
283290
}

0 commit comments

Comments
 (0)