github.com/metux/go-metabuild@v0.0.0-20240118143255-d9ed5ab697f9/engine/packager/common.go (about) 1 package packager 2 3 import ( 4 "fmt" 5 "path/filepath" 6 "strings" 7 8 "github.com/metux/go-metabuild/spec" 9 "github.com/metux/go-metabuild/util" 10 "github.com/metux/go-metabuild/util/fileutil" 11 "github.com/metux/go-metabuild/util/jobs" 12 "github.com/metux/go-metabuild/util/pkgmgr" 13 ) 14 15 type BasePkgJob struct { 16 jobs.BaseJob 17 Packager pkgmgr.PackageManager 18 BuildConf spec.BuildConf 19 Pkg spec.DistPkg 20 } 21 22 func (job BasePkgJob) MetaDir() string { 23 return job.BuildConf.BuildDistPkgMetaDir(job.Pkg.Name()) 24 } 25 26 func (job BasePkgJob) FindLocalLib(fn string, arch string) string { 27 dist := job.Pkg.Distro 28 for _, pId := range dist.PackageIds() { 29 pname := dist.PackageNameTrans(string(pId)) 30 pkgroot := job.BuildConf.BuildDistPkgRootDir(pname, "") 31 flist := fileutil.FindFile(pkgroot, fn) 32 33 // // FIXME: need to check arch 34 // for _,a := range flist { 35 // return pname 36 // } 37 38 if len(flist) > 0 { 39 return pname 40 } 41 } 42 return "" 43 } 44 45 // find package that provides given shared object 46 func (job BasePkgJob) FindSoPkg(fn string, arch string) string { 47 // try to find it locally (in our own package 48 if localpkg := job.FindLocalLib(fn, arch); localpkg != "" { 49 return localpkg 50 } 51 52 // query the package manager 53 for _, x := range job.Packager.SearchInstalledFile(fn) { 54 if job.Packager.MatchElfArch(x.PkgArch, arch) { 55 return x.Package 56 } 57 } 58 return "" 59 } 60 61 func (job BasePkgJob) FindPcPkg(pcname string, version string) string { 62 for _, x := range job.Packager.SearchInstalledFile(pcname + ".pc") { 63 return x.PkgName + " (>=" + version + ")" 64 } 65 return "" 66 } 67 68 func (job BasePkgJob) ScanSoDep() ([]string, error) { 69 deps := []string{} 70 71 lines, err := fileutil.ReadLinesGlobUniq(job.MetaDir() + "/*.sodep") 72 if err != nil { 73 return deps, err 74 } 75 76 for _, l1 := range lines { 77 entry := strings.Fields(l1) 78 if len(entry) < 2 { 79 continue 80 } 81 pkgname := job.FindSoPkg(entry[0], entry[1]) 82 if pkgname == "" { 83 return deps, fmt.Errorf("cant find package providing %s %s", entry[0], entry[1]) 84 } 85 deps = append(deps, pkgname) 86 } 87 88 return util.Uniq(deps), nil 89 } 90 91 func (job BasePkgJob) ScanPcDep() ([]string, error) { 92 deps := []string{} 93 94 lines, err := fileutil.ReadLinesGlobUniq(job.MetaDir() + "/*.pcdep") 95 if err != nil { 96 return deps, err 97 } 98 99 for _, l1 := range lines { 100 entry := strings.Fields(l1) 101 if len(entry) < 2 { 102 continue 103 } 104 pkgname := job.FindPcPkg(entry[0], entry[1]) 105 if pkgname == "" { 106 return deps, fmt.Errorf("cant find package providing %s", l1) 107 } 108 deps = append(deps, pkgname) 109 } 110 111 return util.Uniq(deps), nil 112 } 113 114 func (job BasePkgJob) ScanAutoDep() ([]string, error) { 115 sodep, err := job.ScanSoDep() 116 if err != nil { 117 return sodep, err 118 } 119 pcdep, err := job.ScanPcDep() 120 if err != nil { 121 return pcdep, err 122 } 123 124 deps := util.Uniq(append(sodep, pcdep...)) 125 return deps, nil 126 } 127 128 func (job BasePkgJob) ScanTriggers() []string { 129 lines, _ := fileutil.ReadLinesGlobUniq(job.MetaDir() + "/*.trigger") 130 return lines 131 } 132 133 func (job BasePkgJob) DoPackage() error { 134 return job.Packager.Build( 135 job.BuildConf.BuildDistPkgRootDir(job.Pkg.Name(), ""), 136 job.BuildConf.BuildDistDir("")) 137 } 138 139 func (job BasePkgJob) DataRoot() string { 140 return filepath.Clean(job.BuildConf.BuildDistPkgRootDir(job.Pkg.Name(), "")) + "/" 141 } 142 143 func MakeBasePkgJob(packager pkgmgr.PackageManager, buildconf spec.BuildConf, pkg spec.DistPkg) BasePkgJob { 144 return BasePkgJob{ 145 BaseJob: jobs.MakeBaseJob("package-" + pkg.Id()), 146 Packager: packager, 147 BuildConf: buildconf, 148 Pkg: pkg} 149 }