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  }