main: run the compiler from any path

Этот коммит содержится в:
Ayke van Laethem 2018-09-24 12:25:33 +02:00
родитель 453450f40d
коммит fd6dda5e4f
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: E97FF5335DFDFDED
3 изменённых файлов: 15 добавлений и 5 удалений

Просмотреть файл

@ -134,7 +134,7 @@ func (c *Compiler) Module() llvm.Module {
return c.mod return c.mod
} }
func (c *Compiler) Parse(mainPath string, buildTags []string) error { func (c *Compiler) Parse(mainPath, sourceDir string, buildTags []string) error {
tripleSplit := strings.Split(c.triple, "-") tripleSplit := strings.Split(c.triple, "-")
config := loader.Config{ config := loader.Config{
@ -148,7 +148,7 @@ func (c *Compiler) Parse(mainPath string, buildTags []string) error {
Build: &build.Context{ Build: &build.Context{
GOARCH: tripleSplit[0], GOARCH: tripleSplit[0],
GOOS: tripleSplit[2], GOOS: tripleSplit[2],
GOROOT: ".", GOROOT: sourceDir,
GOPATH: runtime.GOROOT(), GOPATH: runtime.GOROOT(),
CgoEnabled: true, CgoEnabled: true,
UseAllFiles: false, UseAllFiles: false,

Просмотреть файл

@ -32,7 +32,7 @@ func Compile(pkgName, outpath string, spec *TargetSpec, printIR, dumpSSA bool, p
fmt.Println(c.IR()) fmt.Println(c.IR())
}() }()
} }
return c.Parse(pkgName, spec.BuildTags) return c.Parse(pkgName, sourceDir(), spec.BuildTags)
}() }()
if parseErr != nil { if parseErr != nil {
return parseErr return parseErr
@ -93,6 +93,7 @@ func Compile(pkgName, outpath string, spec *TargetSpec, printIR, dumpSSA bool, p
cmd := exec.Command(spec.Linker, args...) cmd := exec.Command(spec.Linker, args...)
cmd.Stdout = os.Stdout cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr cmd.Stderr = os.Stderr
cmd.Dir = sourceDir()
err = cmd.Run() err = cmd.Run()
if err != nil { if err != nil {
return err return err
@ -182,6 +183,7 @@ func Flash(pkgName, target, port string, printIR, dumpSSA bool, printSizes strin
cmd := exec.Command("/bin/sh", "-c", flashCmd) cmd := exec.Command("/bin/sh", "-c", flashCmd)
cmd.Stdout = os.Stdout cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr cmd.Stderr = os.Stderr
cmd.Dir = sourceDir()
return cmd.Run() return cmd.Run()
}) })
} }
@ -192,7 +194,7 @@ func Run(pkgName string) error {
if err != nil { if err != nil {
return errors.New("compiler: " + err.Error()) return errors.New("compiler: " + err.Error())
} }
err = c.Parse(pkgName, []string{runtime.GOOS, runtime.GOARCH}) err = c.Parse(pkgName, sourceDir(), []string{runtime.GOOS, runtime.GOARCH})
if err != nil { if err != nil {
return errors.New("compiler: " + err.Error()) return errors.New("compiler: " + err.Error())
} }

Просмотреть файл

@ -34,7 +34,7 @@ func LoadTarget(target string) (*TargetSpec, error) {
// See whether there is a target specification for this target (e.g. // See whether there is a target specification for this target (e.g.
// Arduino). // Arduino).
path := filepath.Join("targets", strings.ToLower(target)+".json") path := filepath.Join(sourceDir(), "targets", strings.ToLower(target)+".json")
if fp, err := os.Open(path); err == nil { if fp, err := os.Open(path); err == nil {
defer fp.Close() defer fp.Close()
err := json.NewDecoder(fp).Decode(spec) err := json.NewDecoder(fp).Decode(spec)
@ -50,3 +50,11 @@ func LoadTarget(target string) (*TargetSpec, error) {
return spec, nil return spec, nil
} }
// Return the source directory of this package, or "." when it cannot be
// recovered.
func sourceDir() string {
// https://stackoverflow.com/a/32163888/559350
_, path, _, _ := runtime.Caller(0)
return filepath.Dir(path)
}