github.com/metux/go-metabuild@v0.0.0-20240118143255-d9ed5ab697f9/engine/main.go (about) 1 package engine 2 3 import ( 4 "log" 5 "os" 6 7 "github.com/metux/go-metabuild/engine/autoconf" 8 "github.com/metux/go-metabuild/engine/builder" 9 "github.com/metux/go-metabuild/engine/packager" 10 "github.com/metux/go-metabuild/spec/global" 11 "github.com/metux/go-metabuild/util" 12 ) 13 14 var ( 15 ErrNoStage = util.Error("no such stage") 16 ) 17 18 type Engine struct { 19 Global global.Global 20 } 21 22 func (e *Engine) Load(fn string, dflt string) error { 23 if gs, err := global.LoadGlobal(fn, dflt); err == nil { 24 e.Global = gs 25 } else { 26 return err 27 } 28 return nil 29 } 30 31 func (e Engine) StageInit() error { 32 log.Printf("Stage: init: %s ver %s\n", 33 e.Global.EntryStr(global.KeyPackage), 34 e.Global.EntryStr(global.KeyVersion)) 35 if srcdir := e.Global.EntryStr(global.KeySrcDir); srcdir != "" { 36 if err := os.Chdir(srcdir); err != nil { 37 return err 38 } 39 // prevent accidential double chdir 40 e.Global.EntryDelete(global.KeySrcDir) 41 } 42 return nil 43 } 44 45 func (e Engine) StageConfigure() error { 46 if err := e.StageInit(); err != nil { 47 return err 48 } 49 log.Println("Stage: configure") 50 return autoconf.RunConfigure(e.Global) 51 } 52 53 func (e Engine) StageAutogen() error { 54 if err := e.StageConfigure(); err != nil { 55 return err 56 } 57 log.Println("Stage: autogen") 58 return autoconf.RunGenerates(e.Global) 59 } 60 61 func (e Engine) StageBuild() error { 62 if err := e.StageAutogen(); err != nil { 63 return err 64 } 65 log.Println("Stage: build") 66 return builder.RunBuild(e.Global) 67 } 68 69 func (e Engine) StagePackage() error { 70 if err := e.StageBuild(); err != nil { 71 return err 72 } 73 log.Println("Stage: package") 74 return packager.RunPackaging(e.Global) 75 } 76 77 func (e Engine) RunStage(s Stage) error { 78 switch s { 79 case StageInit: 80 return e.StageInit() 81 case StageConfigure: 82 return e.StageConfigure() 83 case StageAutogen: 84 return e.StageAutogen() 85 case StageBuild: 86 return e.StageBuild() 87 case StagePackage: 88 return e.StagePackage() 89 } 90 return ErrNoStage 91 } 92 93 func Load(fn string, defaults string) (Engine, error) { 94 e := Engine{} 95 err := e.Load(fn, defaults) 96 return e, err 97 }