github.com/metux/go-metabuild@v0.0.0-20240118143255-d9ed5ab697f9/util/pkgmgr/dpkg/dpkg.go (about) 1 package dpkg 2 3 import ( 4 "log" 5 "os" 6 "path/filepath" 7 "strings" 8 9 "github.com/metux/go-metabuild/util/cmd" 10 "github.com/metux/go-metabuild/util/fileutil" 11 "github.com/metux/go-metabuild/util/pkgmgr/base" 12 ) 13 14 type Dpkg struct { 15 Command []string 16 Env []string 17 Sysroot string 18 } 19 20 func NewDpkg(command []string, env []string, sysroot string) Dpkg { 21 if len(command) == 0 { 22 command = []string{"dpkg"} 23 } 24 return Dpkg{command, env, sysroot} 25 } 26 27 func (dpkg Dpkg) SearchInstalledFile(fn string) []base.PkgFileEntry { 28 res := make([]base.PkgFileEntry, 0) 29 30 cmdline := append(dpkg.Command, "-S", fn) 31 out, err := cmd.RunOutLines(cmdline, true) 32 33 if err != nil { 34 return res 35 } 36 37 for _, line := range out { 38 a := strings.Split(line, ": ") 39 res = append(res, base.NewPkgFileEntry(a[0], a[1])) 40 } 41 42 return res 43 } 44 45 func (dpkg Dpkg) MatchElfArch(debArch string, elfArch string) bool { 46 if debArch == elfArch { 47 return true 48 } 49 // FIXME: need a better mapping for that 50 if strings.HasSuffix(elfArch, debArch) { 51 return true 52 } 53 54 if debArch == "amd64" && elfArch == "elf64-x86-64" { 55 return true 56 } 57 58 return false 59 } 60 61 func (dpkg Dpkg) WriteControlFile(pkgroot string, control base.PkgControl) error { 62 debroot := pkgroot + "/DEBIAN" 63 os.MkdirAll(debroot, 0755) 64 65 // write DEBIAN/control 66 wr, err := fileutil.CreateWriter(debroot + "/control") 67 defer wr.Close() 68 if err != nil { 69 return err 70 } 71 72 wr.WriteFolded("Package", control.Package) 73 wr.WriteFolded("Version", control.Version) 74 wr.WriteFolded("Maintainer", control.Maintainer) 75 wr.WriteFolded("Section", control.Section) 76 wr.WriteFolded("Depend", strings.Join(control.Depend, ",\n")) 77 wr.WriteFolded("Multi-Arch", control.MultiArch) 78 wr.WriteFolded("Bugs", control.Bugs) 79 wr.WriteFolded("Homepage", control.Homepage) 80 wr.WriteFolded("Origin", control.Origin) 81 wr.WriteFolded("Priority", control.Priority) 82 83 if control.Architecture == "" { 84 wr.WriteFolded("Architecture", "all") 85 } else { 86 wr.WriteFolded("Architecture", control.Architecture) 87 } 88 89 wr.WriteFolded("Description", control.Description) 90 91 // write DEBIAN/md5sums 92 md5, err := fileutil.MD5Files(pkgroot, dpkg.ScanPlainFiles(pkgroot)) 93 if err != nil { 94 return err 95 } 96 return fileutil.WriteText(debroot+"/md5sums", md5) 97 } 98 99 func (dpkg Dpkg) ScanPlainFiles(rootdir string) []string { 100 rootdirlen := len(rootdir) 101 flist := []string{} 102 filepath.Walk(rootdir, 103 func(path string, info os.FileInfo, err error) error { 104 if err == nil && !info.IsDir() && (info.Mode()&os.ModeSymlink != os.ModeSymlink) { 105 p := path[rootdirlen:] 106 if !strings.HasPrefix(p, "DEBIAN/") { 107 flist = append(flist, p) 108 } 109 } 110 return err 111 }) 112 return flist 113 } 114 115 func (dpkg Dpkg) Build(pkgroot string, targetdir string) error { 116 cmdline := []string{"dpkg-deb", "-b", "--root-owner-group", pkgroot, targetdir} 117 _, err := cmd.RunOutLines(cmdline, true) 118 if err != nil { 119 log.Println("DPKG: build error", err) 120 return err 121 } 122 return nil 123 }