diff --git a/DEVELOPERS b/DEVELOPERS index 71dd7d3d6c..0fc73f311f 100644 --- a/DEVELOPERS +++ b/DEVELOPERS @@ -2917,8 +2917,10 @@ F: configs/uevm5432_defconfig F: package/i7z/ F: package/msr-tools/ F: package/pixz/ +F: package/zerofree/ F: support/testing/tests/package/test_msr_tools* F: support/testing/tests/package/test_pixz.py +F: support/testing/tests/package/test_zerofree.py N: Vinicius Tinti F: package/python-thrift/ diff --git a/package/Config.in b/package/Config.in index 230aa7a2c2..3feb47c534 100644 --- a/package/Config.in +++ b/package/Config.in @@ -239,6 +239,7 @@ menu "Filesystem and flash utilities" source "package/udftools/Config.in" source "package/unionfs/Config.in" source "package/xfsprogs/Config.in" + source "package/zerofree/Config.in" source "package/zfs/Config.in" endmenu diff --git a/package/zerofree/Config.in b/package/zerofree/Config.in new file mode 100644 index 0000000000..99466d6bae --- /dev/null +++ b/package/zerofree/Config.in @@ -0,0 +1,14 @@ +config BR2_PACKAGE_ZEROFREE + bool "zerofree" + depends on BR2_USE_MMU # e2fsprogs + depends on !BR2_STATIC_LIBS + select BR2_PACKAGE_E2FSPROGS + help + zerofree is a utility which scans the free blocks in an ext2 + filesystem and fills any non-zero blocks with zeroes. + + https://frippery.org/uml/ + +comment "zerofree needs a toolchain w/ dynamic library" + depends on BR2_USE_MMU + depends on BR2_STATIC_LIBS diff --git a/package/zerofree/zerofree.hash b/package/zerofree/zerofree.hash new file mode 100644 index 0000000000..3399611787 --- /dev/null +++ b/package/zerofree/zerofree.hash @@ -0,0 +1,3 @@ +# Locally calculated +sha256 956bc861b55ba0a2b7593c58d32339dab1a0e7da6ea2b813d27c80f08b723867 zerofree-1.1.1.tgz +sha256 90daae00475a992a367da5b0658469a5d1c4449dbbe964c5b7246e1aec92f491 COPYING diff --git a/package/zerofree/zerofree.mk b/package/zerofree/zerofree.mk new file mode 100644 index 0000000000..f26280cc2a --- /dev/null +++ b/package/zerofree/zerofree.mk @@ -0,0 +1,28 @@ +################################################################################ +# +# zerofree +# +################################################################################ + +ZEROFREE_VERSION = 1.1.1 +ZEROFREE_SOURCE = zerofree-$(ZEROFREE_VERSION).tgz +ZEROFREE_SITE = https://frippery.org/uml +ZEROFREE_LICENSE = GPL-2.0 +ZEROFREE_LICENSE_FILE = COPYING +ZEROFREE_DEPENDENCIES = e2fsprogs + +# We use the same workaround as in https://bugs.gentoo.org/716136 +# to build with musl. +ZEROFREE_CFLAGS = \ + $(TARGET_CFLAGS) \ + $(if $(BR2_TOOLCHAIN_USES_MUSL),-DHAVE_SYS_TYPES_H) + +define ZEROFREE_BUILD_CMDS + $(MAKE) $(TARGET_CONFIGURE_OPTS) CFLAGS="$(ZEROFREE_CFLAGS)" -C $(@D) +endef + +define ZEROFREE_INSTALL_TARGET_CMDS + $(INSTALL) -D -m 0755 $(@D)/zerofree $(TARGET_DIR)/usr/bin/zerofree +endef + +$(eval $(generic-package)) diff --git a/support/testing/tests/package/test_zerofree.py b/support/testing/tests/package/test_zerofree.py new file mode 100644 index 0000000000..75eea346d3 --- /dev/null +++ b/support/testing/tests/package/test_zerofree.py @@ -0,0 +1,41 @@ +import os +import infra.basetest +import subprocess + + +class TestZerofree(infra.basetest.BRTest): + config = infra.basetest.BASIC_TOOLCHAIN_CONFIG + \ + """ + BR2_PACKAGE_ZEROFREE=y + BR2_TARGET_ROOTFS_CPIO=y + # BR2_TARGET_ROOTFS_TAR is not set + """ + + def test_run(self): + # Prepare disk image. + # We keep it small (8 MB) for the sake of test time. + disk_file = os.path.join(self.outputdir, "disk.img") + subprocess.check_call( + ["dd", "if=/dev/zero", f"of={disk_file}", "bs=1M", "count=8"], + stdout=self.emulator.logfile, + stderr=self.emulator.logfile) + + # Run the emulator with a drive. + cpio_file = os.path.join(self.builddir, "images", "rootfs.cpio") + self.emulator.boot(arch="armv5", + kernel="builtin", + options=[ + "-initrd", cpio_file, + "-drive", f"file={disk_file},format=raw"]) + self.emulator.login() + + # Prepare filesystem. + output, exit_code = self.emulator.run("mkfs.ext4 /dev/sda") + self.assertEqual(exit_code, 0) + self.assertIn('Creating filesystem', output[2]) + + # Run zerofree on newly created filesystem. + cmd = "zerofree -v /dev/sda" + output, exit_code = self.emulator.run(cmd, timeout=60) + self.assertEqual(exit_code, 0) + self.assertIn('/8192', output[-1]) # total number of blocks