diff --git a/compileopts/target.go b/compileopts/target.go index 92561f1e03..b21a0183a4 100644 --- a/compileopts/target.go +++ b/compileopts/target.go @@ -246,6 +246,43 @@ func LoadTarget(options *Options) (*TargetSpec, error) { return spec, nil } +// GetTargetSpecs retrieves target specifications from the TINYGOROOT targets +// directory. Only valid target JSON files are considered, and the function +// returns a map of target names to their respective TargetSpec. +func GetTargetSpecs() (map[string]*TargetSpec, error) { + dir := filepath.Join(goenv.Get("TINYGOROOT"), "targets") + entries, err := os.ReadDir(dir) + if err != nil { + return nil, fmt.Errorf("could not list targets: %w", err) + } + + maps := map[string]*TargetSpec{} + for _, entry := range entries { + entryInfo, err := entry.Info() + if err != nil { + return nil, fmt.Errorf("could not get entry info: %w", err) + } + if !entryInfo.Mode().IsRegular() || !strings.HasSuffix(entry.Name(), ".json") { + // Only inspect JSON files. + continue + } + path := filepath.Join(dir, entry.Name()) + spec, err := LoadTarget(&Options{Target: path}) + if err != nil { + return nil, fmt.Errorf("could not list target: %w", err) + } + if spec.FlashMethod == "" && spec.FlashCommand == "" && spec.Emulator == "" { + // This doesn't look like a regular target file, but rather like + // a parent target (such as targets/cortex-m.json). + continue + } + name := entry.Name() + name = name[:len(name)-5] + maps[name] = spec + } + return maps, nil +} + func defaultTarget(goos, goarch, triple string) (*TargetSpec, error) { // No target spec available. Use the default one, useful on most systems // with a regular OS. diff --git a/main.go b/main.go index 288cdf44ab..72bf76a113 100644 --- a/main.go +++ b/main.go @@ -1743,7 +1743,7 @@ func main() { handleCompilerError(err) } case "targets": - specs, err := GetTargetSpecs() + specs, err := compileopts.GetTargetSpecs() if err != nil { fmt.Fprintln(os.Stderr, "could not list targets:", err) os.Exit(1) diff --git a/monitor.go b/monitor.go index 23846b3527..571ff2c640 100644 --- a/monitor.go +++ b/monitor.go @@ -11,7 +11,6 @@ import ( "io" "os" "os/signal" - "path/filepath" "regexp" "strconv" "strings" @@ -20,7 +19,6 @@ import ( "github.com/mattn/go-tty" "github.com/tinygo-org/tinygo/builder" "github.com/tinygo-org/tinygo/compileopts" - "github.com/tinygo-org/tinygo/goenv" "go.bug.st/serial" "go.bug.st/serial/enumerator" @@ -145,9 +143,9 @@ type SerialPortInfo struct { } // ListSerialPort returns serial port information and any detected TinyGo -// target +// target. func ListSerialPorts() ([]SerialPortInfo, error) { - maps, err := GetTargetSpecs() + maps, err := compileopts.GetTargetSpecs() if err != nil { return nil, err } @@ -186,41 +184,6 @@ func ListSerialPorts() ([]SerialPortInfo, error) { return serialPortInfo, nil } -func GetTargetSpecs() (map[string]*compileopts.TargetSpec, error) { - dir := filepath.Join(goenv.Get("TINYGOROOT"), "targets") - entries, err := os.ReadDir(dir) - if err != nil { - return nil, fmt.Errorf("could not list targets: %w", err) - } - - maps := map[string]*compileopts.TargetSpec{} - for _, entry := range entries { - entryInfo, err := entry.Info() - if err != nil { - return nil, fmt.Errorf("could not get entry info: %w", err) - } - if !entryInfo.Mode().IsRegular() || !strings.HasSuffix(entry.Name(), ".json") { - // Only inspect JSON files. - continue - } - path := filepath.Join(dir, entry.Name()) - spec, err := compileopts.LoadTarget(&compileopts.Options{Target: path}) - if err != nil { - return nil, fmt.Errorf("cnuld not list target: %w", err) - } - if spec.FlashMethod == "" && spec.FlashCommand == "" && spec.Emulator == "" { - // This doesn't look like a regular target file, but rather like - // a parent target (such as targets/cortex-m.json). - continue - } - name := entry.Name() - name = name[:len(name)-5] - //fmt.Println(name) - maps[name] = spec - } - return maps, nil -} - var addressMatch = regexp.MustCompile(`^panic: runtime error at 0x([0-9a-f]+): `) // Extract the address from the "panic: runtime error at" message.