From 741c0553d5a4717e9c23197ada18825e791703a6 Mon Sep 17 00:00:00 2001
From: Clayton Craft <clayton@craftyguy.net>
Date: Mon, 18 Mar 2024 16:38:21 -0700
Subject: [PATCH] Allow including initramfs-extra files in the initramfs (MR
 48)

This uses a "deviceinfo_create_initfs_extra" to allow including
initramfs-extra files in the initramfs and skip creating a separate
initramfs-extra archive when it's set to "false".
If this variable is unset, mkinitfs uses a default value of "false".
---
 cmd/mkinitfs/main.go                          | 73 +++++++++++--------
 doc/mkinitfs.1.scd                            |  1 +
 internal/bootdeploy/bootdeploy.go             |  9 ++-
 pkgs/deviceinfo/deviceinfo.go                 |  3 +
 pkgs/deviceinfo/deviceinfo_test.go            |  2 +
 .../test_resources/deviceinfo-unmarshal-1     |  1 +
 6 files changed, 58 insertions(+), 31 deletions(-)

diff --git a/cmd/mkinitfs/main.go b/cmd/mkinitfs/main.go
index 6474602..138667b 100644
--- a/cmd/mkinitfs/main.go
+++ b/cmd/mkinitfs/main.go
@@ -106,30 +106,6 @@ func main() {
 		modules.New("/usr/share/mkinitfs/modules"),
 		modules.New("/etc/mkinitfs/modules"),
 	})
-	if err := initramfsAr.AddItems(initfs); err != nil {
-		log.Println(err)
-		log.Println("failed to generate: ", "initramfs")
-		retCode = 1
-		return
-	}
-	if err := initramfsAr.Write(filepath.Join(workDir, "initramfs"), os.FileMode(0644)); err != nil {
-		log.Println(err)
-		log.Println("failed to generate: ", "initramfs")
-		retCode = 1
-		return
-	}
-	misc.TimeFunc(start, "initramfs")
-
-	//
-	// initramfs-extra
-	//
-	// deviceinfo.InitfsExtraCompression needs a little more post-processing
-	compressionFormat, compressionLevel = archive.ExtractFormatLevel(devinfo.InitfsExtraCompression)
-	log.Printf("== Generating %s ==\n", "initramfs-extra")
-	log.Printf("- Using compression format %s with level %q\n", compressionFormat, compressionLevel)
-
-	start = time.Now()
-	initramfsExtraAr := archive.New(compressionFormat, compressionLevel)
 	initfsExtra := initramfs.New([]filelist.FileLister{
 		hookfiles.New("/usr/share/mkinitfs/files-extra"),
 		hookfiles.New("/etc/mkinitfs/files-extra"),
@@ -138,19 +114,58 @@ func main() {
 		modules.New("/usr/share/mkinitfs/modules-extra"),
 		modules.New("/etc/mkinitfs/modules-extra"),
 	})
-	if err := initramfsExtraAr.AddItemsExclude(initfsExtra, initfs); err != nil {
+
+	if err := initramfsAr.AddItems(initfs); err != nil {
 		log.Println(err)
-		log.Println("failed to generate: ", "initramfs-extra")
+		log.Println("failed to generate: ", "initramfs")
 		retCode = 1
 		return
 	}
-	if err := initramfsExtraAr.Write(filepath.Join(workDir, "initramfs-extra"), os.FileMode(0644)); err != nil {
+
+	// Include initramfs-extra files in the initramfs if not making a separate
+	// archive
+	if !devinfo.CreateInitfsExtra {
+		if err := initramfsAr.AddItems(initfsExtra); err != nil {
+			log.Println(err)
+			log.Println("failed to generate: ", "initramfs")
+			retCode = 1
+			return
+		}
+	}
+
+	if err := initramfsAr.Write(filepath.Join(workDir, "initramfs"), os.FileMode(0644)); err != nil {
 		log.Println(err)
-		log.Println("failed to generate: ", "initramfs-extra")
+		log.Println("failed to generate: ", "initramfs")
 		retCode = 1
 		return
 	}
-	misc.TimeFunc(start, "initramfs-extra")
+	misc.TimeFunc(start, "initramfs")
+
+	if devinfo.CreateInitfsExtra {
+		//
+		// initramfs-extra
+		//
+		// deviceinfo.InitfsExtraCompression needs a little more post-processing
+		compressionFormat, compressionLevel = archive.ExtractFormatLevel(devinfo.InitfsExtraCompression)
+		log.Printf("== Generating %s ==\n", "initramfs-extra")
+		log.Printf("- Using compression format %s with level %q\n", compressionFormat, compressionLevel)
+
+		start = time.Now()
+		initramfsExtraAr := archive.New(compressionFormat, compressionLevel)
+		if err := initramfsExtraAr.AddItemsExclude(initfsExtra, initfs); err != nil {
+			log.Println(err)
+			log.Println("failed to generate: ", "initramfs-extra")
+			retCode = 1
+			return
+		}
+		if err := initramfsExtraAr.Write(filepath.Join(workDir, "initramfs-extra"), os.FileMode(0644)); err != nil {
+			log.Println(err)
+			log.Println("failed to generate: ", "initramfs-extra")
+			retCode = 1
+			return
+		}
+		misc.TimeFunc(start, "initramfs-extra")
+	}
 
 	// Final processing of initramfs / kernel is done by boot-deploy
 	if !disableBootDeploy {
diff --git a/doc/mkinitfs.1.scd b/doc/mkinitfs.1.scd
index f84f51a..7c08fda 100644
--- a/doc/mkinitfs.1.scd
+++ b/doc/mkinitfs.1.scd
@@ -42,6 +42,7 @@ mkinitfs reads deviceinfo values from */usr/share/deviceinfo/deviceinfo* and
 */etc/deviceinfo*, in that order. The following variables
 are *required* by mkinitfs:
 
+	- deviceinfo_create_initfs_extra
 	- deviceinfo_generate_systemd_boot
 	- deviceinfo_initfs_compression
 	- deviceinfo_initfs_extra_compression
diff --git a/internal/bootdeploy/bootdeploy.go b/internal/bootdeploy/bootdeploy.go
index d91d2b2..ad4a33d 100644
--- a/internal/bootdeploy/bootdeploy.go
+++ b/internal/bootdeploy/bootdeploy.go
@@ -78,12 +78,17 @@ func (b *BootDeploy) Run() error {
 	}
 
 	// boot-deploy -i initramfs -k vmlinuz-postmarketos-rockchip -d /tmp/cpio -o /tmp/foo initramfs-extra
-	cmd := exec.Command("boot-deploy",
+	args := []string{
 		"-i", "initramfs",
 		"-k", kernFilename,
 		"-d", b.inDir,
 		"-o", b.outDir,
-		"initramfs-extra")
+	}
+
+	if b.devinfo.CreateInitfsExtra {
+		args = append(args, "initramfs-extra")
+	}
+	cmd := exec.Command("boot-deploy", args...)
 
 	cmd.Stdout = os.Stdout
 	cmd.Stderr = os.Stderr
diff --git a/pkgs/deviceinfo/deviceinfo.go b/pkgs/deviceinfo/deviceinfo.go
index d537971..a2e425a 100644
--- a/pkgs/deviceinfo/deviceinfo.go
+++ b/pkgs/deviceinfo/deviceinfo.go
@@ -21,6 +21,7 @@ type DeviceInfo struct {
 	UbootBoardname         string
 	GenerateSystemdBoot    string
 	FormatVersion          string
+	CreateInitfsExtra      bool
 }
 
 // Reads the relevant entries from "file" into DeviceInfo struct
@@ -112,6 +113,7 @@ func (d DeviceInfo) String() string {
 			%s: %v
 			%s: %v
 			%s: %v
+			%s: %v
 	}`,
 		"deviceinfo_format_version", d.FormatVersion,
 		"deviceinfo_", d.FormatVersion,
@@ -120,5 +122,6 @@ func (d DeviceInfo) String() string {
 		"deviceinfo_ubootBoardname", d.UbootBoardname,
 		"deviceinfo_generateSystemdBoot", d.GenerateSystemdBoot,
 		"deviceinfo_formatVersion", d.FormatVersion,
+		"deviceinfo_createInitfsExtra", d.CreateInitfsExtra,
 	)
 }
diff --git a/pkgs/deviceinfo/deviceinfo_test.go b/pkgs/deviceinfo/deviceinfo_test.go
index 41b2e47..7be15bf 100644
--- a/pkgs/deviceinfo/deviceinfo_test.go
+++ b/pkgs/deviceinfo/deviceinfo_test.go
@@ -42,6 +42,7 @@ func TestNameToField(t *testing.T) {
 		{"modules_initfs", "ModulesInitfs"},
 		{"deviceinfo_initfs_compression___", "InitfsCompression"},
 		{"deviceinfo_initfs_extra_compression", "InitfsExtraCompression"},
+		{"deviceinfo_create_initfs_extra", "CreateInitfsExtra"},
 	}
 
 	for _, table := range tables {
@@ -65,6 +66,7 @@ func TestUnmarshal(t *testing.T) {
 			UbootBoardname:         "foobar-bazz",
 			InitfsCompression:      "zstd:--foo=1 -T0 --bar=bazz",
 			InitfsExtraCompression: "",
+			CreateInitfsExtra:      true,
 		},
 		},
 	}
diff --git a/pkgs/deviceinfo/test_resources/deviceinfo-unmarshal-1 b/pkgs/deviceinfo/test_resources/deviceinfo-unmarshal-1
index 6dfcdc0..117d8d1 100644
--- a/pkgs/deviceinfo/test_resources/deviceinfo-unmarshal-1
+++ b/pkgs/deviceinfo/test_resources/deviceinfo-unmarshal-1
@@ -4,3 +4,4 @@ deviceinfo_uboot_boardname="foobar-bazz"
 deviceinfo_initfs_compression="zstd:--foo=1 -T0 --bar=bazz"
 # empty option
 deviceinfo_initfs_extra_compression=""
+deviceinfo_create_initfs_extra="true"
-- 
GitLab