// BuildSingleFile builds a package named "main" from a single file. func BuildSingleFile(f string, rc io.ReadCloser) ([]byte, []*lex8.Error) { pinfo := build8.SimplePkg("_", f, rc) compiled, es := Lang().Compile(pinfo) if es != nil { return nil, es } buf := new(bytes.Buffer) e := link8.LinkMain(compiled.Lib(), buf, "main") if e != nil { return nil, lex8.SingleErr(e) } return buf.Bytes(), nil }
func (b *Builder) build(p string) (*pkg, []*lex8.Error) { ret := b.pkgs[p] if ret == nil { panic("build without prepare") } // already compiled if ret.compiled != nil { return ret, nil } if ret.buildStarted { e := fmt.Errorf("package %q circular depends itself", p) return ret, lex8.SingleErr(e) } ret.buildStarted = true lang := ret.lang for _, imp := range ret.imports { built, es := b.build(imp.Path) if es != nil { return nil, es } imp.Compiled = built.compiled } // ready to build this one if b.Verbose { fmt.Println(p) } // compile now pinfo := &PkgInfo{ Path: p, Src: ret.srcMap(), Import: ret.imports, CreateLog: func(name string) io.WriteCloser { return b.home.CreateLog(p, name) }, } compiled, es := lang.Compile(pinfo) if es != nil { return nil, es } ret.compiled = compiled lib := ret.compiled.Lib() // the linkable lib // a package with main entrance, build the bin main := ret.compiled.Main() if main != "" && lib.HasFunc(main) { log := lex8.NewErrorList() fout := b.home.CreateBin(p) lex8.LogError(log, link8.LinkMain(lib, fout, main)) lex8.LogError(log, fout.Close()) if es := log.Errs(); es != nil { return nil, es } } return ret, nil }