From 2481460188639ddb57d14cdc0c2f1384d1f7efa5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Pet=C3=B6?= Date: Fri, 11 Jul 2025 14:11:39 +0200 Subject: [PATCH 1/4] Fix ldflags vanishing from `GOFLAGS` enviroment variable - Changed `GOFLAGS` is actually now in the `env` slice - Global enviroment is not changed --- cmd/fyne/internal/commands/build.go | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/cmd/fyne/internal/commands/build.go b/cmd/fyne/internal/commands/build.go index 18a1ae0..3839aff 100644 --- a/cmd/fyne/internal/commands/build.go +++ b/cmd/fyne/internal/commands/build.go @@ -170,7 +170,7 @@ func (b *Builder) build() error { appendEnv(&env, "CGO_LDFLAGS", "-mmacosx-version-min=10.13") } - ldFlags := extractLdflagsFromGoFlags() + ldFlags, env := extractLdflagsFromGoFlags(env) if !isWeb(goos) { env = append(env, "CGO_ENABLED=1") // in case someone is trying to cross-compile... @@ -372,17 +372,17 @@ func appendEnv(env *[]string, varName, value string) { *env = append(*env, varName+"="+value) } -func extractLdflagsFromGoFlags() string { - goFlags := os.Getenv("GOFLAGS") - - ldFlags, goFlags := extractLdFlags(goFlags) - if goFlags != "" { - os.Setenv("GOFLAGS", goFlags) - } else { - os.Unsetenv("GOFLAGS") +// extractLdflagsFromGoFlags returns the ldflags and enviroment with ldflags removed from GOFLAGS. +func extractLdflagsFromGoFlags(env []string) (string, []string) { + prefix := "GOFLAGS=" + for i, v := range env { + if strings.HasPrefix(v, prefix) { + ldflags, goflags := extractLdFlags(strings.TrimPrefix(v, prefix)) + env[i] = goflags + return ldflags, env + } } - - return ldFlags + return "", env } func extractLdFlags(goFlags string) (string, string) { From cf5916ef49798abcf4386e71931996893f5041fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Pet=C3=B6?= Date: Fri, 11 Jul 2025 18:16:46 +0000 Subject: [PATCH 2/4] Fix `fyne release --os android` not respecting `ldflags` present in `GOFLAGS` enviroment variable --- cmd/fyne/internal/commands/build.go | 39 ++---------------------- cmd/fyne/internal/commands/build_test.go | 21 ------------- cmd/fyne/internal/mobile/build.go | 4 ++- cmd/fyne/internal/util/env.go | 39 ++++++++++++++++++++++++ cmd/fyne/internal/util/env_test.go | 28 +++++++++++++++++ 5 files changed, 72 insertions(+), 59 deletions(-) create mode 100644 cmd/fyne/internal/util/env.go create mode 100644 cmd/fyne/internal/util/env_test.go diff --git a/cmd/fyne/internal/commands/build.go b/cmd/fyne/internal/commands/build.go index 3839aff..0e8f751 100644 --- a/cmd/fyne/internal/commands/build.go +++ b/cmd/fyne/internal/commands/build.go @@ -15,6 +15,7 @@ import ( "fyne.io/tools/cmd/fyne/internal/metadata" "fyne.io/tools/cmd/fyne/internal/templates" + utils "fyne.io/tools/cmd/fyne/internal/util" ) // Builder generate the executables. @@ -170,7 +171,7 @@ func (b *Builder) build() error { appendEnv(&env, "CGO_LDFLAGS", "-mmacosx-version-min=10.13") } - ldFlags, env := extractLdflagsFromGoFlags(env) + ldFlags, env := utils.ExtractLdflagsFromGoFlags(env) if !isWeb(goos) { env = append(env, "CGO_ENABLED=1") // in case someone is trying to cross-compile... @@ -372,42 +373,6 @@ func appendEnv(env *[]string, varName, value string) { *env = append(*env, varName+"="+value) } -// extractLdflagsFromGoFlags returns the ldflags and enviroment with ldflags removed from GOFLAGS. -func extractLdflagsFromGoFlags(env []string) (string, []string) { - prefix := "GOFLAGS=" - for i, v := range env { - if strings.HasPrefix(v, prefix) { - ldflags, goflags := extractLdFlags(strings.TrimPrefix(v, prefix)) - env[i] = goflags - return ldflags, env - } - } - return "", env -} - -func extractLdFlags(goFlags string) (string, string) { - if goFlags == "" { - return "", "" - } - - flags := strings.Fields(goFlags) - ldflags := "" - newGoFlags := "" - - for _, flag := range flags { - if strings.HasPrefix(flag, "-ldflags=") { - ldflags += strings.TrimPrefix(flag, "-ldflags=") + " " - } else { - newGoFlags += flag + " " - } - } - - ldflags = strings.TrimSpace(ldflags) - newGoFlags = strings.TrimSpace(newGoFlags) - - return ldflags, newGoFlags -} - func normaliseVersion(str string) string { if str == "master" { return str diff --git a/cmd/fyne/internal/commands/build_test.go b/cmd/fyne/internal/commands/build_test.go index 47d8a54..ae82374 100644 --- a/cmd/fyne/internal/commands/build_test.go +++ b/cmd/fyne/internal/commands/build_test.go @@ -144,27 +144,6 @@ func Test_AppendEnv(t *testing.T) { } } -type extractTest struct { - value string - wantLdFlags string - wantGoFlags string -} - -func Test_ExtractLdFlags(t *testing.T) { - goFlagsTests := []extractTest{ - {"-ldflags=-w", "-w", ""}, - {"-ldflags=-s", "-s", ""}, - {"-ldflags=-w -ldflags=-s", "-w -s", ""}, - {"-mod=vendor", "", "-mod=vendor"}, - } - - for _, test := range goFlagsTests { - ldFlags, goFlags := extractLdFlags(test.value) - assert.Equal(t, test.wantLdFlags, ldFlags) - assert.Equal(t, test.wantGoFlags, goFlags) - } -} - func Test_NormaliseVersion(t *testing.T) { assert.Equal(t, "master", normaliseVersion("master")) assert.Equal(t, "2.3.0.0", normaliseVersion("v2.3")) diff --git a/cmd/fyne/internal/mobile/build.go b/cmd/fyne/internal/mobile/build.go index a78fc5e..6106f78 100644 --- a/cmd/fyne/internal/mobile/build.go +++ b/cmd/fyne/internal/mobile/build.go @@ -236,8 +236,10 @@ func RunNewBuild(target, appID, icon, name, version string, build int, release, buildBundleID = appID buildRelease = distribution buildTags = tags + buildLdflags, _ = util.ExtractLdflagsFromGoFlags(os.Environ()) if release { - buildLdflags = "-w" + buildLdflags += " -w" + buildLdflags = strings.TrimSpace(buildLdflags) buildTrimpath = true } diff --git a/cmd/fyne/internal/util/env.go b/cmd/fyne/internal/util/env.go new file mode 100644 index 0000000..147276b --- /dev/null +++ b/cmd/fyne/internal/util/env.go @@ -0,0 +1,39 @@ +package util + +import "strings" + +// ExtractLdflagsFromGoFlags returns the ldflags and enviroment with ldflags removed from GOFLAGS. +func ExtractLdflagsFromGoFlags(env []string) (string, []string) { + prefix := "GOFLAGS=" + for i, v := range env { + if strings.HasPrefix(v, prefix) { + ldflags, goflags := extractLdFlags(strings.TrimPrefix(v, prefix)) + env[i] = goflags + return ldflags, env + } + } + return "", env +} + +func extractLdFlags(goFlags string) (string, string) { + if goFlags == "" { + return "", "" + } + + flags := strings.Fields(goFlags) + ldflags := "" + newGoFlags := "" + + for _, flag := range flags { + if strings.HasPrefix(flag, "-ldflags=") { + ldflags += strings.TrimPrefix(flag, "-ldflags=") + " " + } else { + newGoFlags += flag + " " + } + } + + ldflags = strings.TrimSpace(ldflags) + newGoFlags = strings.TrimSpace(newGoFlags) + + return ldflags, newGoFlags +} diff --git a/cmd/fyne/internal/util/env_test.go b/cmd/fyne/internal/util/env_test.go new file mode 100644 index 0000000..b834386 --- /dev/null +++ b/cmd/fyne/internal/util/env_test.go @@ -0,0 +1,28 @@ +package util + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +type extractTest struct { + value string + wantLdFlags string + wantGoFlags string +} + +func Test_ExtractLdFlags(t *testing.T) { + goFlagsTests := []extractTest{ + {"-ldflags=-w", "-w", ""}, + {"-ldflags=-s", "-s", ""}, + {"-ldflags=-w -ldflags=-s", "-w -s", ""}, + {"-mod=vendor", "", "-mod=vendor"}, + } + + for _, test := range goFlagsTests { + ldFlags, goFlags := extractLdFlags(test.value) + assert.Equal(t, test.wantLdFlags, ldFlags) + assert.Equal(t, test.wantGoFlags, goFlags) + } +} From 2957bdf614b4aba9e4f7e80304abd7f14ac6d04a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Pet=C3=B6?= Date: Fri, 11 Jul 2025 22:57:08 +0200 Subject: [PATCH 3/4] Fix missing prefix from environment variable --- cmd/fyne/internal/util/env.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/fyne/internal/util/env.go b/cmd/fyne/internal/util/env.go index 147276b..ddcfdd2 100644 --- a/cmd/fyne/internal/util/env.go +++ b/cmd/fyne/internal/util/env.go @@ -8,7 +8,7 @@ func ExtractLdflagsFromGoFlags(env []string) (string, []string) { for i, v := range env { if strings.HasPrefix(v, prefix) { ldflags, goflags := extractLdFlags(strings.TrimPrefix(v, prefix)) - env[i] = goflags + env[i] = prefix + goflags return ldflags, env } } From a406d9bbe9f0ab4f0138065c239c42c5bb1f9956 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Pet=C3=B6?= Date: Fri, 18 Jul 2025 14:05:49 +0200 Subject: [PATCH 4/4] Use changed `GOFLAGS` environment variable --- cmd/fyne/internal/mobile/build.go | 4 +--- cmd/fyne/internal/mobile/env.go | 6 ++++++ cmd/fyne/internal/util/env.go | 7 ++++--- cmd/fyne/internal/util/env_test.go | 2 +- 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/cmd/fyne/internal/mobile/build.go b/cmd/fyne/internal/mobile/build.go index 6106f78..a78fc5e 100644 --- a/cmd/fyne/internal/mobile/build.go +++ b/cmd/fyne/internal/mobile/build.go @@ -236,10 +236,8 @@ func RunNewBuild(target, appID, icon, name, version string, build int, release, buildBundleID = appID buildRelease = distribution buildTags = tags - buildLdflags, _ = util.ExtractLdflagsFromGoFlags(os.Environ()) if release { - buildLdflags += " -w" - buildLdflags = strings.TrimSpace(buildLdflags) + buildLdflags = "-w" buildTrimpath = true } diff --git a/cmd/fyne/internal/mobile/env.go b/cmd/fyne/internal/mobile/env.go index b43cb9b..67f7c55 100644 --- a/cmd/fyne/internal/mobile/env.go +++ b/cmd/fyne/internal/mobile/env.go @@ -135,6 +135,10 @@ func envInit() (err error) { // bitcodeEnabled = true //} + // Set buildLdflags based on GOFLAGS env. + bldf, goflags := util.ExtractLdFlags(goEnv("GOFLAGS")) + buildLdflags = strings.Join([]string{buildLdflags, bldf}, " ") + // Setup the cross-compiler environments. if ndkRoot, err := ndkRoot(); err == nil { androidEnv = make(map[string][]string) @@ -162,6 +166,7 @@ func envInit() (err error) { androidEnv[arch] = []string{ "GOOS=android", "GOARCH=" + arch, + "GOFLAGS=" + goflags, "CC=" + clang, "CXX=" + clangpp, "CGO_ENABLED=1", @@ -215,6 +220,7 @@ func envInit() (err error) { env = append(env, "GOOS="+os, "GOARCH="+arch, + "GOFLAGS="+goflags, "CC="+clang, "CXX="+clang+"++", "CGO_CFLAGS="+cflags+" -arch "+archClang(arch), diff --git a/cmd/fyne/internal/util/env.go b/cmd/fyne/internal/util/env.go index ddcfdd2..2e5affc 100644 --- a/cmd/fyne/internal/util/env.go +++ b/cmd/fyne/internal/util/env.go @@ -2,12 +2,12 @@ package util import "strings" -// ExtractLdflagsFromGoFlags returns the ldflags and enviroment with ldflags removed from GOFLAGS. +// ExtractLdflagsFromGoFlags returns the ldflags and environment with ldflags removed from GOFLAGS. func ExtractLdflagsFromGoFlags(env []string) (string, []string) { prefix := "GOFLAGS=" for i, v := range env { if strings.HasPrefix(v, prefix) { - ldflags, goflags := extractLdFlags(strings.TrimPrefix(v, prefix)) + ldflags, goflags := ExtractLdFlags(strings.TrimPrefix(v, prefix)) env[i] = prefix + goflags return ldflags, env } @@ -15,7 +15,8 @@ func ExtractLdflagsFromGoFlags(env []string) (string, []string) { return "", env } -func extractLdFlags(goFlags string) (string, string) { +// ExtractLdFlags extracts ldflags from the value of GOFLAGS environment variable, returns ldflags and new GOFLAGS. +func ExtractLdFlags(goFlags string) (string, string) { if goFlags == "" { return "", "" } diff --git a/cmd/fyne/internal/util/env_test.go b/cmd/fyne/internal/util/env_test.go index b834386..895fc00 100644 --- a/cmd/fyne/internal/util/env_test.go +++ b/cmd/fyne/internal/util/env_test.go @@ -21,7 +21,7 @@ func Test_ExtractLdFlags(t *testing.T) { } for _, test := range goFlagsTests { - ldFlags, goFlags := extractLdFlags(test.value) + ldFlags, goFlags := ExtractLdFlags(test.value) assert.Equal(t, test.wantLdFlags, ldFlags) assert.Equal(t, test.wantGoFlags, goFlags) }