aboutsummaryrefslogtreecommitdiffhomepage
path: root/builder/config.go
blob: cdd9c0dad0d2a8fd1427267df700973049b53a4f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package builder

import (
	"errors"
	"fmt"

	"github.com/tinygo-org/tinygo/compileopts"
	"github.com/tinygo-org/tinygo/goenv"
)

// NewConfig builds a new Config object from a set of compiler options. It also
// loads some information from the environment while doing that. For example, it
// uses the currently active GOPATH (from the goenv package) to determine the Go
// version to use.
func NewConfig(options *compileopts.Options) (*compileopts.Config, error) {
	spec, err := compileopts.LoadTarget(options.Target)
	if err != nil {
		return nil, err
	}

	if options.OpenOCDCommands != nil {
		// Override the OpenOCDCommands from the target spec if specified on
		// the command-line
		spec.OpenOCDCommands = options.OpenOCDCommands
	}

	goroot := goenv.Get("GOROOT")
	if goroot == "" {
		return nil, errors.New("cannot locate $GOROOT, please set it manually")
	}

	major, minor, err := goenv.GetGorootVersion(goroot)
	if err != nil {
		return nil, fmt.Errorf("could not read version from GOROOT (%v): %v", goroot, err)
	}
	if major != 1 || minor < 15 || minor > 16 {
		return nil, fmt.Errorf("requires go version 1.15 through 1.16, got go%d.%d", major, minor)
	}

	clangHeaderPath := getClangHeaderPath(goenv.Get("TINYGOROOT"))

	return &compileopts.Config{
		Options:        options,
		Target:         spec,
		GoMinorVersion: minor,
		ClangHeaders:   clangHeaderPath,
		TestConfig:     options.TestConfig,
	}, nil
}