5
0
mirror of https://github.com/wailsapp/wails.git synced 2025-05-02 20:03:01 +08:00

[bindings] Pass ts_generation flags as env variable (#2194)

Otherwise this will clash if an app also uses flags internally
This commit is contained in:
stffabi 2022-12-10 21:38:06 +01:00 committed by GitHub
parent 7a22e0f885
commit eb2d929824
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 133 additions and 62 deletions

40
v2/internal/shell/env.go Normal file
View File

@ -0,0 +1,40 @@
package shell
import (
"fmt"
"strings"
)
func UpsertEnv(env []string, key string, update func(v string) string) []string {
newEnv := make([]string, len(env), len(env)+1)
found := false
for i := range env {
if strings.HasPrefix(env[i], key+"=") {
eqIndex := strings.Index(env[i], "=")
val := env[i][eqIndex+1:]
newEnv[i] = fmt.Sprintf("%s=%v", key, update(val))
found = true
continue
}
newEnv[i] = env[i]
}
if !found {
newEnv = append(newEnv, fmt.Sprintf("%s=%v", key, update("")))
}
return newEnv
}
func RemoveEnv(env []string, key string) []string {
newEnv := make([]string, 0, len(env))
for _, e := range env {
if strings.HasPrefix(e, key+"=") {
continue
}
newEnv = append(newEnv, e)
}
return newEnv
}
func SetEnv(env []string, key string, value string) []string {
return UpsertEnv(env, key, func(_ string) string { return value })
}

View File

@ -0,0 +1,67 @@
package shell
import "testing"
func TestUpdateEnv(t *testing.T) {
env := []string{"one=1", "two=a=b", "three="}
newEnv := UpsertEnv(env, "two", func(v string) string {
return v + "+added"
})
newEnv = UpsertEnv(newEnv, "newVar", func(v string) string {
return "added"
})
newEnv = UpsertEnv(newEnv, "three", func(v string) string {
return "3"
})
newEnv = UpsertEnv(newEnv, "GOARCH", func(v string) string {
return "amd64"
})
if len(newEnv) != 5 {
t.Errorf("expected: 5, got: %d", len(newEnv))
}
if newEnv[1] != "two=a=b+added" {
t.Errorf("expected: \"two=a=b+added\", got: %q", newEnv[1])
}
if newEnv[2] != "three=3" {
t.Errorf("expected: \"three=3\", got: %q", newEnv[2])
}
if newEnv[3] != "newVar=added" {
t.Errorf("expected: \"newVar=added\", got: %q", newEnv[3])
}
if newEnv[4] != "GOARCH=amd64" {
t.Errorf("expected: \"newVar=added\", got: %q", newEnv[4])
}
}
func TestSetEnv(t *testing.T) {
env := []string{"one=1", "two=a=b", "three="}
newEnv := SetEnv(env, "two", "set")
newEnv = SetEnv(newEnv, "newVar", "added")
if len(newEnv) != 4 {
t.Errorf("expected: 4, got: %d", len(newEnv))
}
if newEnv[1] != "two=set" {
t.Errorf("expected: \"two=set\", got: %q", newEnv[1])
}
if newEnv[3] != "newVar=added" {
t.Errorf("expected: \"newVar=added\", got: %q", newEnv[3])
}
}
func TestRemoveEnv(t *testing.T) {
env := []string{"one=1", "two=a=b", "three=3"}
newEnv := RemoveEnv(env, "two")
if len(newEnv) != 2 {
t.Errorf("expected: 2, got: %d", len(newEnv))
}
if newEnv[0] != "one=1" {
t.Errorf("expected: \"one=1\", got: %q", newEnv[1])
}
if newEnv[1] != "three=3" {
t.Errorf("expected: \"three=3\", got: %q", newEnv[3])
}
}

View File

@ -62,7 +62,19 @@ func CreateCommand(directory string, command string, args ...string) *exec.Cmd {
// RunCommand will run the given command + args in the given directory
// Will return stdout, stderr and error
func RunCommand(directory string, command string, args ...string) (string, string, error) {
return RunCommandWithEnv(nil, directory, command, args...)
}
// RunCommandWithEnv will run the given command + args in the given directory and using the specified env.
//
// Env specifies the environment of the process. Each entry is of the form "key=value".
// If Env is nil, the new process uses the current process's environment.
//
// Will return stdout, stderr and error
func RunCommandWithEnv(env []string, directory string, command string, args ...string) (string, string, error) {
cmd := CreateCommand(directory, command, args...)
cmd.Env = env
var stdo, stde bytes.Buffer
cmd.Stdout = &stdo
cmd.Stderr = &stde

View File

@ -62,7 +62,12 @@ func GenerateBindings(options Options) (string, error) {
_ = os.Remove(filename)
}()
stdout, stderr, err = shell.RunCommand(workingDirectory, filename, "-tsprefix", options.TsPrefix, "-tssuffix", options.TsSuffix)
// Set environment variables accordingly
env := os.Environ()
env = shell.SetEnv(env, "tsprefix", options.TsPrefix)
env = shell.SetEnv(env, "tssuffix", options.TsSuffix)
stdout, stderr, err = shell.RunCommandWithEnv(env, workingDirectory, filename)
if err != nil {
return stdout, fmt.Errorf("%s\n%s\n%s", stdout, stderr, err)
}

View File

@ -302,8 +302,8 @@ func (b *BaseBuilder) CompileProject(options *Options) error {
cmd.Env = os.Environ() // inherit env
if options.Platform != "windows" {
// Use upsertEnv so we don't overwrite user's CGO_CFLAGS
cmd.Env = upsertEnv(cmd.Env, "CGO_CFLAGS", func(v string) string {
// Use shell.UpsertEnv so we don't overwrite user's CGO_CFLAGS
cmd.Env = shell.UpsertEnv(cmd.Env, "CGO_CFLAGS", func(v string) string {
if options.Platform == "darwin" {
if v != "" {
v += " "
@ -312,8 +312,8 @@ func (b *BaseBuilder) CompileProject(options *Options) error {
}
return v
})
// Use upsertEnv so we don't overwrite user's CGO_CXXFLAGS
cmd.Env = upsertEnv(cmd.Env, "CGO_CXXFLAGS", func(v string) string {
// Use shell.UpsertEnv so we don't overwrite user's CGO_CXXFLAGS
cmd.Env = shell.UpsertEnv(cmd.Env, "CGO_CXXFLAGS", func(v string) string {
if v != "" {
v += " "
}
@ -321,7 +321,7 @@ func (b *BaseBuilder) CompileProject(options *Options) error {
return v
})
cmd.Env = upsertEnv(cmd.Env, "CGO_ENABLED", func(v string) string {
cmd.Env = shell.UpsertEnv(cmd.Env, "CGO_ENABLED", func(v string) string {
return "1"
})
if options.Platform == "darwin" {
@ -338,7 +338,7 @@ func (b *BaseBuilder) CompileProject(options *Options) error {
}
addUTIFramework := majorVersion >= 11
// Set the minimum Mac SDK to 10.13
cmd.Env = upsertEnv(cmd.Env, "CGO_LDFLAGS", func(v string) string {
cmd.Env = shell.UpsertEnv(cmd.Env, "CGO_LDFLAGS", func(v string) string {
if v != "" {
v += " "
}
@ -352,11 +352,11 @@ func (b *BaseBuilder) CompileProject(options *Options) error {
}
}
cmd.Env = upsertEnv(cmd.Env, "GOOS", func(v string) string {
cmd.Env = shell.UpsertEnv(cmd.Env, "GOOS", func(v string) string {
return options.Platform
})
cmd.Env = upsertEnv(cmd.Env, "GOARCH", func(v string) string {
cmd.Env = shell.UpsertEnv(cmd.Env, "GOARCH", func(v string) string {
return options.Arch
})
@ -608,22 +608,3 @@ func (b *BaseBuilder) BuildFrontend(outputLogger *clilogger.CLILogger) error {
pterm.Println("Done.")
return nil
}
func upsertEnv(env []string, key string, update func(v string) string) []string {
newEnv := make([]string, len(env), len(env)+1)
found := false
for i := range env {
if strings.HasPrefix(env[i], key+"=") {
eqIndex := strings.Index(env[i], "=")
val := env[i][eqIndex+1:]
newEnv[i] = fmt.Sprintf("%s=%v", key, update(val))
found = true
continue
}
newEnv[i] = env[i]
}
if !found {
newEnv = append(newEnv, fmt.Sprintf("%s=%v", key, update("")))
}
return newEnv
}

View File

@ -2,40 +2,6 @@ package build
import "testing"
func TestUpdateEnv(t *testing.T) {
env := []string{"one=1", "two=a=b", "three="}
newEnv := upsertEnv(env, "two", func(v string) string {
return v + "+added"
})
newEnv = upsertEnv(newEnv, "newVar", func(v string) string {
return "added"
})
newEnv = upsertEnv(newEnv, "three", func(v string) string {
return "3"
})
newEnv = upsertEnv(newEnv, "GOARCH", func(v string) string {
return "amd64"
})
if len(newEnv) != 5 {
t.Errorf("expected: 5, got: %d", len(newEnv))
}
if newEnv[1] != "two=a=b+added" {
t.Errorf("expected: \"two=a=b+added\", got: %q", newEnv[1])
}
if newEnv[2] != "three=3" {
t.Errorf("expected: \"three=3\", got: %q", newEnv[2])
}
if newEnv[3] != "newVar=added" {
t.Errorf("expected: \"newVar=added\", got: %q", newEnv[3])
}
if newEnv[4] != "GOARCH=amd64" {
t.Errorf("expected: \"newVar=added\", got: %q", newEnv[4])
}
}
func Test_commandPrettifier(t *testing.T) {
tests := []struct {
name string