From 74c59ec5d06eba4fb52e33f2f70cada7a0b4ab0e Mon Sep 17 00:00:00 2001 From: Light Date: Mon, 11 Dec 2023 23:41:07 +1100 Subject: [PATCH 1/8] Added possibility to specify platform for dev command --- v2/cmd/wails/build.go | 75 +++++++++++----------------- v2/cmd/wails/flags/build.go | 32 ++---------- v2/cmd/wails/flags/common.go | 84 ++++++++++++++++++++++++++++++++ v2/cmd/wails/flags/dev.go | 11 +++-- v2/cmd/wails/internal/dev/dev.go | 16 ++++++ v2/pkg/commands/build/build.go | 4 ++ 6 files changed, 145 insertions(+), 77 deletions(-) diff --git a/v2/cmd/wails/build.go b/v2/cmd/wails/build.go index 7364df8bae5..a71c5d956d5 100644 --- a/v2/cmd/wails/build.go +++ b/v2/cmd/wails/build.go @@ -108,7 +108,7 @@ func buildApplication(f *flags.Build) error { {"Tags", "[" + strings.Join(f.GetTags(), ",") + "]"}, {"Race Detector", bool2Str(f.RaceDetector)}, }...) - if len(buildOptions.OutputFile) > 0 && f.GetTargets().Length() == 1 { + if len(buildOptions.OutputFile) > 0 && len(f.GetTargets()) == 1 { tableData = append(tableData, []string{"Output File", f.OutputFilename}) } pterm.DefaultSection.Println("Build Options") @@ -145,16 +145,11 @@ func buildApplication(f *flags.Build) error { // Allows cancelling the build after the first error. It would be nice if targets.Each would support funcs // returning an error. - var targetErr error targets := f.GetTargets() - targets.Each(func(platform string) { - if targetErr != nil { - return - } - - if !validPlatformArch.Contains(platform) { - buildOptions.Logger.Println("platform '%s' is not supported - skipping. Supported platforms: %s", platform, validPlatformArch.Join(",")) - return + for _, target := range targets { + if !validPlatformArch.Contains(target.Platform) { + buildOptions.Logger.Println("platform '%s' is not supported - skipping. Supported platforms: %s", target.Platform, validPlatformArch.Join(",")) + continue } desiredFilename := projectOptions.OutputFilename @@ -163,17 +158,13 @@ func buildApplication(f *flags.Build) error { } desiredFilename = strings.TrimSuffix(desiredFilename, ".exe") - // Calculate platform and arch - platformSplit := strings.Split(platform, "/") - buildOptions.Platform = platformSplit[0] - buildOptions.Arch = f.GetDefaultArch() - if len(platformSplit) > 1 { - buildOptions.Arch = platformSplit[1] - } + buildOptions.Platform = target.Platform + buildOptions.Arch = target.Arch + banner := "Building target: " + buildOptions.Platform + "/" + buildOptions.Arch pterm.DefaultSection.Println(banner) - if f.Upx && platform == "darwin/universal" { + if f.Upx && target.String() == "darwin/universal" { pterm.Warning.Println("Warning: compress flag unsupported for universal binaries. Ignoring.") f.Upx = false } @@ -182,22 +173,19 @@ func buildApplication(f *flags.Build) error { case "linux": if runtime.GOOS != "linux" { pterm.Warning.Println("Crosscompiling to Linux not currently supported.") - return + continue } case "darwin": if runtime.GOOS != "darwin" { pterm.Warning.Println("Crosscompiling to Mac not currently supported.") - return + continue } - macTargets := targets.Filter(func(platform string) bool { - return strings.HasPrefix(platform, "darwin") - }) - if macTargets.Length() == 2 { + if targets.MacTargetsCount() == 2 { buildOptions.BundleName = fmt.Sprintf("%s-%s.app", desiredFilename, buildOptions.Arch) } } - if targets.Length() > 1 { + if len(targets) > 1 { // target filename switch buildOptions.Platform { case "windows": @@ -219,32 +207,27 @@ func buildApplication(f *flags.Build) error { pterm.Warning.Println("obfuscated flag overrides skipbindings flag.") buildOptions.SkipBindings = false } + } - if !f.DryRun { - // Start Time - start := time.Now() - - compiledBinary, err := build.Build(buildOptions) - if err != nil { - pterm.Error.Println(err.Error()) - targetErr = err - return - } + if !f.DryRun { + // Start Time + start := time.Now() - buildOptions.IgnoreFrontend = true - buildOptions.CleanBinDirectory = false + compiledBinary, err := build.Build(buildOptions) + if err != nil { + pterm.Error.Println(err.Error()) + return err + } - // Output stats - buildOptions.Logger.Println(fmt.Sprintf("Built '%s' in %s.\n", compiledBinary, time.Since(start).Round(time.Millisecond).String())) + buildOptions.IgnoreFrontend = true + buildOptions.CleanBinDirectory = false - outputBinaries[buildOptions.Platform+"/"+buildOptions.Arch] = compiledBinary - } else { - pterm.Info.Println("Dry run: skipped build.") - } - }) + // Output stats + buildOptions.Logger.Println(fmt.Sprintf("Built '%s' in %s.\n", compiledBinary, time.Since(start).Round(time.Millisecond).String())) - if targetErr != nil { - return targetErr + outputBinaries[buildOptions.Platform+"/"+buildOptions.Arch] = compiledBinary + } else { + pterm.Info.Println("Dry run: skipped build.") } if f.DryRun { diff --git a/v2/cmd/wails/flags/build.go b/v2/cmd/wails/flags/build.go index 974d9c3adc7..725c34cdbf3 100644 --- a/v2/cmd/wails/flags/build.go +++ b/v2/cmd/wails/flags/build.go @@ -2,13 +2,10 @@ package flags import ( "fmt" - "os" "os/exec" - "runtime" "strings" "github.com/leaanthony/slicer" - "github.com/wailsapp/wails/v2/internal/system" "github.com/wailsapp/wails/v2/pkg/commands/build" "github.com/wailsapp/wails/v2/pkg/commands/buildtags" ) @@ -49,29 +46,15 @@ type Build struct { compilerPath string userTags []string wv2rtstrategy string // WebView2 runtime strategy - defaultArch string // Default architecture } func (b *Build) Default() *Build { - defaultPlatform := os.Getenv("GOOS") - if defaultPlatform == "" { - defaultPlatform = runtime.GOOS - } - defaultArch := os.Getenv("GOARCH") - if defaultArch == "" { - if system.IsAppleSilicon { - defaultArch = "arm64" - } else { - defaultArch = runtime.GOARCH - } - } + target := defaultTarget() result := &Build{ - Platform: defaultPlatform + "/" + defaultArch, + Platform: target.Platform, WebView2: "download", GarbleArgs: "-literals -tiny -seed=random", - - defaultArch: defaultArch, } result.BuildCommon = result.BuildCommon.Default() return result @@ -88,11 +71,8 @@ func (b *Build) GetWebView2Strategy() string { return b.wv2rtstrategy } -func (b *Build) GetTargets() *slicer.StringSlicer { - var targets slicer.StringSlicer - targets.AddSlice(strings.Split(b.Platform, ",")) - targets.Deduplicate() - return &targets +func (b *Build) GetTargets() TargetsCollection { + parseTargets(b.Platform) } func (b *Build) GetCompilerPath() string { @@ -144,10 +124,6 @@ func (b *Build) GetBuildModeAsString() string { return "production" } -func (b *Build) GetDefaultArch() string { - return b.defaultArch -} - /* _, _ = fmt.Fprintf(w, "Frontend Directory: \t%s\n", projectOptions.GetFrontendDir()) _, _ = fmt.Fprintf(w, "Obfuscated: \t%t\n", buildOptions.Obfuscated) diff --git a/v2/cmd/wails/flags/common.go b/v2/cmd/wails/flags/common.go index e58eff41192..adde9f4abcc 100644 --- a/v2/cmd/wails/flags/common.go +++ b/v2/cmd/wails/flags/common.go @@ -1,5 +1,89 @@ package flags +import ( + "fmt" + "os" + "runtime" + "strings" + + "github.com/leaanthony/slicer" + "github.com/wailsapp/wails/v2/internal/system" +) + type Common struct { NoColour bool `description:"Disable colour in output"` } + +type Target struct { + Platform string + Arch string +} + +func defaultTarget() Target { + defaultPlatform := os.Getenv("GOOS") + if defaultPlatform == "" { + defaultPlatform = runtime.GOOS + } + defaultArch := os.Getenv("GOARCH") + if defaultArch == "" { + if system.IsAppleSilicon { + defaultArch = "arm64" + } else { + defaultArch = runtime.GOARCH + } + } + + return Target{ + Platform: defaultPlatform + "/" + defaultArch, + Arch: defaultArch, + } +} + +func (c TargetsCollection) MacTargetsCount() int { + count := 0 + + for _, t := range c { + if strings.HasPrefix(t.Platform, "darwin") { + count++ + } + } + + return count +} + +func (t Target) String() string { + if t.Arch != "" { + return fmt.Sprintf("%s/%s", t.Platform, t.Arch) + } + + return fmt.Sprintf("%s", t.Platform) +} + +func parseTargets(platform string) TargetsCollection { + var result []Target + var targets slicer.StringSlicer + + targets.AddSlice(strings.Split(platform, ",")) + targets.Deduplicate() + + targets.Each(func(platform string) { + target := Target{ + Platform: "", + Arch: "", + } + + platformSplit := strings.Split(platform, "/") + + target.Platform = platformSplit[0] + + if len(platformSplit) > 1 { + target.Arch = platformSplit[1] + } else { + target.Arch = defaultTarget().Arch + } + + result = append(result, target) + }) + + return result +} diff --git a/v2/cmd/wails/flags/dev.go b/v2/cmd/wails/flags/dev.go index 501450a982e..b581aadb6fd 100644 --- a/v2/cmd/wails/flags/dev.go +++ b/v2/cmd/wails/flags/dev.go @@ -6,7 +6,6 @@ import ( "net/url" "os" "path/filepath" - "runtime" "github.com/samber/lo" "github.com/wailsapp/wails/v2/internal/project" @@ -17,6 +16,7 @@ type Dev struct { BuildCommon AssetDir string `flag:"assetdir" description:"Serve assets from the given directory instead of using the provided asset FS"` + Platform string `flag:"platform" description:"Platform to target"` Extensions string `flag:"e" description:"Extensions to trigger rebuilds (comma separated) eg go"` ReloadDirs string `flag:"reloaddirs" description:"Additional directories to trigger reloads (comma separated)"` Browser bool `flag:"browser" description:"Open the application in a browser"` @@ -38,10 +38,13 @@ type Dev struct { } func (*Dev) Default() *Dev { + target := defaultTarget() result := &Dev{ Extensions: "go", Debounce: 100, + Platform: target.Platform, } + result.BuildCommon = result.BuildCommon.Default() return result } @@ -116,13 +119,15 @@ func (d *Dev) loadAndMergeProjectConfig() error { // GenerateBuildOptions creates a build.Options using the flags func (d *Dev) GenerateBuildOptions() *build.Options { + targets := parseTargets(d.Platform) + result := &build.Options{ OutputType: "dev", Mode: build.Dev, Devtools: true, - Arch: runtime.GOARCH, + Arch: targets[0].Arch, Pack: true, - Platform: runtime.GOOS, + Platform: targets[0].Platform, LDFlags: d.LdFlags, Compiler: d.Compiler, ForceBuild: d.ForceBuild, diff --git a/v2/cmd/wails/internal/dev/dev.go b/v2/cmd/wails/internal/dev/dev.go index 1f9b95c8994..02ae79b18b9 100644 --- a/v2/cmd/wails/internal/dev/dev.go +++ b/v2/cmd/wails/internal/dev/dev.go @@ -268,6 +268,16 @@ func runFrontendDevWatcherCommand(frontendDirectory string, devCommand string, d }, viteServerURL, viteVersion, nil } +func isWsl() bool { + version, err := os.ReadFile("/proc/version") + + if err != nil { + return false + } + + return strings.Contains(strings.ToLower(string(version)), "wsl") +} + // restartApp does the actual rebuilding of the application when files change func restartApp(buildOptions *build.Options, debugBinaryProcess *process.Process, f *flags.Dev, exitCodeChannel chan int, legacyUseDevServerInsteadofCustomScheme bool) (*process.Process, string, error) { appBinary, err := build.Build(buildOptions) @@ -306,6 +316,12 @@ func restartApp(buildOptions *build.Options, debugBinaryProcess *process.Process os.Setenv("devserver", f.DevServer) os.Setenv("frontenddevserverurl", f.FrontendDevServerURL) + if buildOptions.IsWindowsTargetPlatform() && isWsl() { + // In the case of building a Windows executable under WSL, we need to specify this variable with a list of + // variables that will be passed through + os.Setenv("WSLENV", "loglevel/w:frontenddevserverurl/w:devserver/w:assetdir/w") + } + // Start up new binary with correct args newProcess := process.NewProcess(appBinary, args...) err = newProcess.Start(exitCodeChannel) diff --git a/v2/pkg/commands/build/build.go b/v2/pkg/commands/build/build.go index 62c08e910d1..f0d3a0ab4ee 100644 --- a/v2/pkg/commands/build/build.go +++ b/v2/pkg/commands/build/build.go @@ -71,6 +71,10 @@ type Options struct { SkipBindings bool // Skip binding generation } +func (o *Options) IsWindowsTargetPlatform() bool { + return strings.Contains(strings.ToLower(o.Platform), "windows") +} + // Build the project! func Build(options *Options) (string, error) { // Extract logger From d22fc7b1a3c467dda06a7cda58249af90f759731 Mon Sep 17 00:00:00 2001 From: Light Date: Mon, 11 Dec 2023 23:52:56 +1100 Subject: [PATCH 2/8] add missing type and return --- v2/cmd/wails/flags/build.go | 2 +- v2/cmd/wails/flags/common.go | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/v2/cmd/wails/flags/build.go b/v2/cmd/wails/flags/build.go index 725c34cdbf3..28ef6b9764f 100644 --- a/v2/cmd/wails/flags/build.go +++ b/v2/cmd/wails/flags/build.go @@ -72,7 +72,7 @@ func (b *Build) GetWebView2Strategy() string { } func (b *Build) GetTargets() TargetsCollection { - parseTargets(b.Platform) + return parseTargets(b.Platform) } func (b *Build) GetCompilerPath() string { diff --git a/v2/cmd/wails/flags/common.go b/v2/cmd/wails/flags/common.go index adde9f4abcc..a82a1670fe3 100644 --- a/v2/cmd/wails/flags/common.go +++ b/v2/cmd/wails/flags/common.go @@ -39,6 +39,8 @@ func defaultTarget() Target { } } +type TargetsCollection []Target + func (c TargetsCollection) MacTargetsCount() int { count := 0 @@ -56,7 +58,7 @@ func (t Target) String() string { return fmt.Sprintf("%s/%s", t.Platform, t.Arch) } - return fmt.Sprintf("%s", t.Platform) + return t.Platform } func parseTargets(platform string) TargetsCollection { From e83545667f56d329bc834b5b4e564c314a406261 Mon Sep 17 00:00:00 2001 From: Light Date: Mon, 11 Dec 2023 23:57:11 +1100 Subject: [PATCH 3/8] add changelog update --- website/src/pages/changelog.mdx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/website/src/pages/changelog.mdx b/website/src/pages/changelog.mdx index 25fd96c9661..a6cd4315569 100644 --- a/website/src/pages/changelog.mdx +++ b/website/src/pages/changelog.mdx @@ -14,6 +14,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Added +- Added option to specify platform for dev command. Thanks to [@pylotlight](https://github.com/pylotlight) for the fix ([#3117](https://github.com/wailsapp/wails/pull/3117)). + ## v2.7.1 - 2023-12-10 ### Fixed From 74eb881c413be01cc002d039292c4c6db9889367 Mon Sep 17 00:00:00 2001 From: Light Date: Tue, 12 Dec 2023 00:14:54 +1100 Subject: [PATCH 4/8] update returned platform string --- v2/cmd/wails/flags/common.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v2/cmd/wails/flags/common.go b/v2/cmd/wails/flags/common.go index a82a1670fe3..6fa4664db70 100644 --- a/v2/cmd/wails/flags/common.go +++ b/v2/cmd/wails/flags/common.go @@ -34,7 +34,7 @@ func defaultTarget() Target { } return Target{ - Platform: defaultPlatform + "/" + defaultArch, + Platform: defaultPlatform, Arch: defaultArch, } } From c9bc768392df57fad4c8668f00fc50db1a181991 Mon Sep 17 00:00:00 2001 From: Light Date: Tue, 12 Dec 2023 20:29:10 +1100 Subject: [PATCH 5/8] add platform validation check --- v2/cmd/wails/flags/common.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/v2/cmd/wails/flags/common.go b/v2/cmd/wails/flags/common.go index 6fa4664db70..5a81f729d9e 100644 --- a/v2/cmd/wails/flags/common.go +++ b/v2/cmd/wails/flags/common.go @@ -7,6 +7,7 @@ import ( "strings" "github.com/leaanthony/slicer" + "github.com/pterm/pterm" "github.com/wailsapp/wails/v2/internal/system" ) @@ -62,6 +63,17 @@ func (t Target) String() string { } func parseTargets(platform string) TargetsCollection { + allowedPlatforms := map[string]bool{ + "windows": true, + "linux": true, + "darwin": true, + } + + if !allowedPlatforms[platform] { + pterm.Error.Println("platform argument must be one of 'windows', 'linux', or 'darwin'") + os.Exit(1) + } + var result []Target var targets slicer.StringSlicer From 3b17cde8c55b0435cc9e856feb330f1b63eb9ea7 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Tue, 12 Dec 2023 20:35:42 +1100 Subject: [PATCH 6/8] Update v2/cmd/wails/flags/common.go Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- v2/cmd/wails/flags/common.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/v2/cmd/wails/flags/common.go b/v2/cmd/wails/flags/common.go index 5a81f729d9e..5ee8343259b 100644 --- a/v2/cmd/wails/flags/common.go +++ b/v2/cmd/wails/flags/common.go @@ -62,7 +62,7 @@ func (t Target) String() string { return t.Platform } -func parseTargets(platform string) TargetsCollection { +func parseTargets(platform string) (TargetsCollection, error) { allowedPlatforms := map[string]bool{ "windows": true, "linux": true, @@ -71,7 +71,7 @@ func parseTargets(platform string) TargetsCollection { if !allowedPlatforms[platform] { pterm.Error.Println("platform argument must be one of 'windows', 'linux', or 'darwin'") - os.Exit(1) + return nil, fmt.Errorf("invalid platform argument: %s", platform) } var result []Target @@ -99,5 +99,5 @@ func parseTargets(platform string) TargetsCollection { result = append(result, target) }) - return result + return result, nil } From 036180f3d9cbc10299f86793f0718045e0965e6f Mon Sep 17 00:00:00 2001 From: Light Date: Wed, 13 Dec 2023 10:14:55 +1100 Subject: [PATCH 7/8] Revert previous changes --- v2/cmd/wails/flags/common.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/v2/cmd/wails/flags/common.go b/v2/cmd/wails/flags/common.go index 5ee8343259b..5a81f729d9e 100644 --- a/v2/cmd/wails/flags/common.go +++ b/v2/cmd/wails/flags/common.go @@ -62,7 +62,7 @@ func (t Target) String() string { return t.Platform } -func parseTargets(platform string) (TargetsCollection, error) { +func parseTargets(platform string) TargetsCollection { allowedPlatforms := map[string]bool{ "windows": true, "linux": true, @@ -71,7 +71,7 @@ func parseTargets(platform string) (TargetsCollection, error) { if !allowedPlatforms[platform] { pterm.Error.Println("platform argument must be one of 'windows', 'linux', or 'darwin'") - return nil, fmt.Errorf("invalid platform argument: %s", platform) + os.Exit(1) } var result []Target @@ -99,5 +99,5 @@ func parseTargets(platform string) (TargetsCollection, error) { result = append(result, target) }) - return result, nil + return result } From cba7b88aa252c752b888d3832175293b190c34ac Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Mon, 18 Dec 2023 07:29:20 +1100 Subject: [PATCH 8/8] Update Changelog --- website/src/pages/changelog.mdx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/website/src/pages/changelog.mdx b/website/src/pages/changelog.mdx index 95844cee88c..bc923f07297 100644 --- a/website/src/pages/changelog.mdx +++ b/website/src/pages/changelog.mdx @@ -15,7 +15,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] ### Added -- Added option to specify platform for dev command. Thanks to [@pylotlight](https://github.com/pylotlight) for the fix ([#3117](https://github.com/wailsapp/wails/pull/3117)). +- Added option to specify platform for dev command. Thanks to [@pylotlight](https://github.com/pylotlight) for the fix ([#3117](https://github.com/wailsapp/wails/pull/3117)). Based on the work of [@evsign](https://github.com/evsign) in [Draft PR](https://github.com/wailsapp/wails/pull/2724). - Added windows options supports `DisablePinchZoom` configuration. Added by @tuuzed in [PR](https://github.com/wailsapp/wails/pull/3115) - Add Apple Silicon hardware detection to `wails doctor`. Changed by @almas1992 in [PR](https://github.com/wailsapp/wails/pull/3129) - Remove quarantine attribute on macOS binaries. Changed by @leaanthony in [PR](https://github.com/wailsapp/wails/pull/3118) @@ -24,7 +24,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed - Docs for IsZoomControlEnabled and ZoomFactor. Fixed by @leaanthony in [PR](https://github.com/wailsapp/wails/pull/3137) - ## v2.7.1 - 2023-12-10 ### Fixed