aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--compileopts/config.go27
-rw-r--r--compileopts/config_test.go132
2 files changed, 158 insertions, 1 deletions
diff --git a/compileopts/config.go b/compileopts/config.go
index 62c9fa64f..4a9670005 100644
--- a/compileopts/config.go
+++ b/compileopts/config.go
@@ -75,7 +75,8 @@ func (c *Config) GOARM() string {
// BuildTags returns the complete list of build tags used during this build.
func (c *Config) BuildTags() []string {
- tags := append(c.Target.BuildTags, []string{"tinygo", "math_big_pure_go", "gc." + c.GC(), "scheduler." + c.Scheduler(), "serial." + c.Serial()}...)
+ targetTags := filterTags(c.Target.BuildTags, c.Options.Tags)
+ tags := append(targetTags, []string{"tinygo", "math_big_pure_go", "gc." + c.GC(), "scheduler." + c.Scheduler(), "serial." + c.Serial()}...)
for i := 1; i <= c.GoMinorVersion; i++ {
tags = append(tags, fmt.Sprintf("go1.%d", i))
}
@@ -550,3 +551,27 @@ type TestConfig struct {
CompileTestBinary bool
// TODO: Filter the test functions to run, include verbose flag, etc
}
+
+// filterTags removes predefined build tags for a target if a conflicting option
+// is provided by the user.
+func filterTags(targetTags []string, userTags []string) []string {
+ var filtered []string
+ for _, t := range targetTags {
+ switch {
+ case strings.HasPrefix(t, "runtime_memhash_"):
+ overridden := false
+ for _, ut := range userTags {
+ if strings.HasPrefix(ut, "runtime_memhash_") {
+ overridden = true
+ break
+ }
+ }
+ if !overridden {
+ filtered = append(filtered, t)
+ }
+ default:
+ filtered = append(filtered, t)
+ }
+ }
+ return filtered
+}
diff --git a/compileopts/config_test.go b/compileopts/config_test.go
new file mode 100644
index 000000000..00b0b0e9b
--- /dev/null
+++ b/compileopts/config_test.go
@@ -0,0 +1,132 @@
+package compileopts
+
+import (
+ "fmt"
+ "strings"
+ "testing"
+)
+
+func TestBuildTags(t *testing.T) {
+ tests := []struct {
+ targetTags []string
+ userTags []string
+ result []string
+ }{
+ {
+ targetTags: []string{},
+ userTags: []string{},
+ result: []string{
+ "tinygo",
+ "math_big_pure_go",
+ "gc.conservative",
+ "scheduler.none",
+ "serial.none",
+ },
+ },
+ {
+ targetTags: []string{"bear"},
+ userTags: []string{},
+ result: []string{
+ "bear",
+ "tinygo",
+ "math_big_pure_go",
+ "gc.conservative",
+ "scheduler.none",
+ "serial.none",
+ },
+ },
+ {
+ targetTags: []string{},
+ userTags: []string{"cat"},
+ result: []string{
+ "tinygo",
+ "math_big_pure_go",
+ "gc.conservative",
+ "scheduler.none",
+ "serial.none",
+ "cat",
+ },
+ },
+ {
+ targetTags: []string{"bear"},
+ userTags: []string{"cat"},
+ result: []string{
+ "bear",
+ "tinygo",
+ "math_big_pure_go",
+ "gc.conservative",
+ "scheduler.none",
+ "serial.none",
+ "cat",
+ },
+ },
+ {
+ targetTags: []string{"bear", "runtime_memhash_leveldb"},
+ userTags: []string{"cat"},
+ result: []string{
+ "bear",
+ "runtime_memhash_leveldb",
+ "tinygo",
+ "math_big_pure_go",
+ "gc.conservative",
+ "scheduler.none",
+ "serial.none",
+ "cat",
+ },
+ },
+ {
+ targetTags: []string{"bear", "runtime_memhash_leveldb"},
+ userTags: []string{"cat", "runtime_memhash_leveldb"},
+ result: []string{
+ "bear",
+ "tinygo",
+ "math_big_pure_go",
+ "gc.conservative",
+ "scheduler.none",
+ "serial.none",
+ "cat",
+ "runtime_memhash_leveldb",
+ },
+ },
+ {
+ targetTags: []string{"bear", "runtime_memhash_leveldb"},
+ userTags: []string{"cat", "runtime_memhash_sip"},
+ result: []string{
+ "bear",
+ "tinygo",
+ "math_big_pure_go",
+ "gc.conservative",
+ "scheduler.none",
+ "serial.none",
+ "cat",
+ "runtime_memhash_sip",
+ },
+ },
+ }
+
+ for _, tc := range tests {
+ tt := tc
+ t.Run(fmt.Sprintf("%s+%s", strings.Join(tt.targetTags, ","), strings.Join(tt.userTags, ",")), func(t *testing.T) {
+ c := &Config{
+ Target: &TargetSpec{
+ BuildTags: tt.targetTags,
+ },
+ Options: &Options{
+ Tags: tt.userTags,
+ },
+ }
+
+ res := c.BuildTags()
+
+ if len(res) != len(tt.result) {
+ t.Errorf("expected %d tags, got %d", len(tt.result), len(res))
+ }
+
+ for i, tag := range tt.result {
+ if tag != res[i] {
+ t.Errorf("tag %d: expected %s, got %s", i, tt.result[i], tag)
+ }
+ }
+ })
+ }
+}