50 строки
1,3 КиБ
Go
50 строки
1,3 КиБ
Go
package main
|
|
|
|
import (
|
|
"encoding/json"
|
|
"os"
|
|
"path/filepath"
|
|
"runtime"
|
|
"strings"
|
|
)
|
|
|
|
// Target specification for a given target. Used for bare metal targets.
|
|
//
|
|
// The target specification is mostly inspired by Rust:
|
|
// https://doc.rust-lang.org/nightly/nightly-rustc/rustc_target/spec/struct.TargetOptions.html
|
|
// https://github.com/shepmaster/rust-arduino-blink-led-no-core-with-cargo/blob/master/blink/arduino.json
|
|
type TargetSpec struct {
|
|
Triple string `json:"llvm-target"`
|
|
BuildTags []string `json:"build-tags"`
|
|
Linker string `json:"linker"`
|
|
PreLinkArgs []string `json:"pre-link-args"`
|
|
Objcopy string `json:"objcopy"`
|
|
}
|
|
|
|
// Load a target specification
|
|
func LoadTarget(target string) (*TargetSpec, error) {
|
|
spec := &TargetSpec{
|
|
Triple: target,
|
|
BuildTags: []string{runtime.GOOS, runtime.GOARCH},
|
|
Linker: "cc",
|
|
Objcopy: "objcopy",
|
|
}
|
|
|
|
// See whether there is a target specification for this target (e.g.
|
|
// Arduino).
|
|
path := filepath.Join("targets", strings.ToLower(target)+".json")
|
|
if fp, err := os.Open(path); err == nil {
|
|
defer fp.Close()
|
|
err := json.NewDecoder(fp).Decode(spec)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
} else if !os.IsNotExist(err) {
|
|
// Expected a 'file not found' error, got something else.
|
|
return nil, err
|
|
} else {
|
|
// No target spec available. This is fine.
|
|
}
|
|
|
|
return spec, nil
|
|
}
|