Compare commits
8 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
338c89504f | ||
|
c07eafd087 | ||
|
206e75c597 | ||
|
7a61e5126c | ||
|
0925cbd8ac | ||
|
866f17b86f | ||
|
15e99c3658 | ||
|
6400871749 |
@@ -31,7 +31,7 @@ gofmt linting:
|
||||
- apk -q update --repository http://dl-4.alpinelinux.org/alpine/edge/testing
|
||||
- apk -q add --repository http://dl-4.alpinelinux.org/alpine/edge/testing go staticcheck
|
||||
script:
|
||||
- .gitlab-ci/check_linting.sh
|
||||
- .ci/check_linting.sh
|
||||
|
||||
build:
|
||||
stage: build
|
||||
|
115
main.go
115
main.go
@@ -71,6 +71,14 @@ func main() {
|
||||
log.Fatal("generateInitfsExtra: ", err)
|
||||
}
|
||||
|
||||
if err := copyUbootFiles(workDir, devinfo); errors.Is(err, os.ErrNotExist) {
|
||||
log.Println("u-boot files copying skipped: ", err)
|
||||
} else {
|
||||
if err != nil {
|
||||
log.Fatal("copyUbootFiles: ", err)
|
||||
}
|
||||
}
|
||||
|
||||
// Final processing of initramfs / kernel is done by boot-deploy
|
||||
if err := bootDeploy(workDir, *outDir); err != nil {
|
||||
log.Fatal("bootDeploy: ", err)
|
||||
@@ -86,18 +94,29 @@ func bootDeploy(workDir string, outDir string) error {
|
||||
if len(kernels) == 0 {
|
||||
return errors.New("Unable to find any kernels at " + filepath.Join(outDir, "vmlinuz*"))
|
||||
}
|
||||
kernFile, err := os.Open(kernels[0])
|
||||
|
||||
// Pick a kernel that does not have suffixes added by boot-deploy
|
||||
var kernFile string
|
||||
for _, f := range kernels {
|
||||
if strings.HasSuffix(f, "-dtb") || strings.HasSuffix(f, "-mtk") {
|
||||
continue
|
||||
}
|
||||
kernFile = f
|
||||
break
|
||||
}
|
||||
|
||||
kernFd, err := os.Open(kernFile)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer kernFile.Close()
|
||||
defer kernFd.Close()
|
||||
|
||||
kernFileCopy, err := os.Create(filepath.Join(workDir, "vmlinuz"))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if _, err = io.Copy(kernFileCopy, kernFile); err != nil {
|
||||
if _, err = io.Copy(kernFileCopy, kernFd); err != nil {
|
||||
return err
|
||||
}
|
||||
kernFileCopy.Close()
|
||||
@@ -145,10 +164,9 @@ func getHookFiles(filesdir string) misc.StringSet {
|
||||
defer f.Close()
|
||||
s := bufio.NewScanner(f)
|
||||
for s.Scan() {
|
||||
if !exists(s.Text()) {
|
||||
if err := getFile(files, s.Text(), true); err != nil {
|
||||
log.Fatalf("Unable to find file %q required by %q", s.Text(), path)
|
||||
}
|
||||
files[s.Text()] = false
|
||||
}
|
||||
if err := s.Err(); err != nil {
|
||||
log.Fatal(err)
|
||||
@@ -232,13 +250,42 @@ func getFiles(files misc.StringSet, newFiles misc.StringSet, required bool) erro
|
||||
}
|
||||
|
||||
func getFile(files misc.StringSet, file string, required bool) error {
|
||||
if !exists(file) {
|
||||
// Expand glob expression
|
||||
expanded, _ := filepath.Glob(file)
|
||||
if len(expanded) > 0 && expanded[0] != file {
|
||||
for _, path := range expanded {
|
||||
if err := getFile(files, path, required); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
fileInfo, err := os.Stat(file)
|
||||
if err != nil {
|
||||
if required {
|
||||
return errors.New("getFile: File does not exist :" + file)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
if fileInfo.IsDir() {
|
||||
// Recurse over directory contents
|
||||
err := filepath.Walk(file, func(path string, f os.FileInfo, err error) error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if f.IsDir() {
|
||||
return nil
|
||||
}
|
||||
return getFile(files, path, required)
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
files[file] = false
|
||||
|
||||
// get dependencies for binaries
|
||||
@@ -247,8 +294,7 @@ func getFile(files misc.StringSet, file string, required bool) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
err := getBinaryDeps(files, file)
|
||||
if err != nil {
|
||||
if err := getBinaryDeps(files, file); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -371,6 +417,7 @@ func getInitfsExtraFiles(files misc.StringSet, devinfo deviceinfo.DeviceInfo) er
|
||||
log.Println("== Generating initramfs extra ==")
|
||||
binariesExtra := misc.StringSet{
|
||||
"/lib/libz.so.1": false,
|
||||
"/sbin/btrfs": false,
|
||||
"/sbin/dmsetup": false,
|
||||
"/sbin/e2fsck": false,
|
||||
"/usr/sbin/parted": false,
|
||||
@@ -403,6 +450,7 @@ func getInitfsFiles(files misc.StringSet, devinfo deviceinfo.DeviceInfo) error {
|
||||
"/usr/sbin/telnetd": false,
|
||||
"/sbin/kpartx": false,
|
||||
"/etc/deviceinfo": false,
|
||||
"/usr/bin/unudhcpd": false,
|
||||
}
|
||||
|
||||
// Hook files & scripts
|
||||
@@ -527,6 +575,46 @@ func getKernelVersion() (string, error) {
|
||||
return strings.TrimSpace(string(contents)), nil
|
||||
}
|
||||
|
||||
func Copy(srcFile, dstFile string) error {
|
||||
out, err := os.Create(dstFile)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
defer out.Close()
|
||||
|
||||
in, err := os.Open(srcFile)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer in.Close()
|
||||
|
||||
_, err = io.Copy(out, in)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func copyUbootFiles(path string, devinfo deviceinfo.DeviceInfo) error {
|
||||
srcDir := filepath.Join("/usr/share/u-boot", devinfo.UbootBoardname)
|
||||
entries, err := ioutil.ReadDir(srcDir)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
for _, entry := range entries {
|
||||
sourcePath := filepath.Join(srcDir, entry.Name())
|
||||
destPath := filepath.Join(path, entry.Name())
|
||||
|
||||
if err := Copy(sourcePath, destPath); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func generateInitfs(name string, path string, kernVer string, devinfo deviceinfo.DeviceInfo) error {
|
||||
initfsArchive, err := archive.New()
|
||||
if err != nil {
|
||||
@@ -657,15 +745,8 @@ func getModuleDeps(modName string, modulesDep io.Reader) ([]string, error) {
|
||||
|
||||
// split the module name on - and/or _, build a regex for matching
|
||||
splitRe := regexp.MustCompile("[-_]+")
|
||||
var modNameReStr string
|
||||
for _, s := range splitRe.Split(modName, -1) {
|
||||
if modNameReStr != "" {
|
||||
modNameReStr += "[-_]+" + s
|
||||
} else {
|
||||
modNameReStr = s
|
||||
}
|
||||
}
|
||||
re := regexp.MustCompile(modNameReStr)
|
||||
modNameReStr := splitRe.ReplaceAllString(modName, "[-_]+")
|
||||
re := regexp.MustCompile("^" + modNameReStr + "$")
|
||||
|
||||
s := bufio.NewScanner(modulesDep)
|
||||
for s.Scan() {
|
||||
|
@@ -40,6 +40,7 @@ func stringSlicesEqual(a []string, b []string) bool {
|
||||
}
|
||||
|
||||
var testModuleDep string = `
|
||||
kernel/sound/soc/codecs/snd-soc-msm8916-digital.ko:
|
||||
kernel/net/sched/act_ipt.ko.xz: kernel/net/netfilter/x_tables.ko.xz
|
||||
kernel/drivers/watchdog/watchdog.ko.xz:
|
||||
kernel/drivers/usb/serial/ir-usb.ko.xz: kernel/drivers/usb/serial/usbserial.ko.xz
|
||||
@@ -53,6 +54,7 @@ kernel/net/bluetooth/hidp/hidp.ko.xz: kernel/net/bluetooth/bluetooth.ko.xz kerne
|
||||
kernel/fs/nls/nls_iso8859-1.ko.xz:
|
||||
kernel/net/vmw_vsock/vmw_vsock_virtio_transport.ko.xz: kernel/net/vmw_vsock/vmw_vsock_virtio_transport_common.ko.xz kernel/drivers/virtio/virtio.ko.xz kernel/drivers/virtio/virtio_ring.ko.xz kernel/net/vmw_vsock/vsock.ko.xz
|
||||
kernel/drivers/gpu/drm/panfrost/panfrost.ko.xz: kernel/drivers/gpu/drm/scheduler/gpu-sched.ko.xz
|
||||
kernel/drivers/gpu/drm/msm/msm.ko: kernel/drivers/gpu/drm/drm_kms_helper.ko
|
||||
`
|
||||
|
||||
func TestGetModuleDeps(t *testing.T) {
|
||||
@@ -65,6 +67,8 @@ func TestGetModuleDeps(t *testing.T) {
|
||||
{"dw-wdt", []string{"kernel/drivers/watchdog/dw_wdt.ko.xz",
|
||||
"kernel/drivers/watchdog/watchdog.ko.xz"}},
|
||||
{"gl518sm", []string{"kernel/drivers/hwmon/gl518sm.ko.xz"}},
|
||||
{"msm", []string{"kernel/drivers/gpu/drm/msm/msm.ko",
|
||||
"kernel/drivers/gpu/drm/drm_kms_helper.ko"}},
|
||||
}
|
||||
for _, table := range tables {
|
||||
out, err := getModuleDeps(table.in, strings.NewReader(testModuleDep))
|
||||
|
@@ -16,6 +16,7 @@ import (
|
||||
type DeviceInfo struct {
|
||||
AppendDtb string
|
||||
Arch string
|
||||
UbootBoardname string
|
||||
BootimgAppendSEAndroidEnforce string
|
||||
BootimgBlobpack string
|
||||
BootimgDtbSecond string
|
||||
|
Reference in New Issue
Block a user