package/zerofree: new package

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/

The ext2fs/ext2fs.h header guards the inclusion of <sys/types.h> behind
HAVE_SYS_TYPES_H, which is an autotools-defined macro that is only
supposed to be defined by the package itself, i.e. e2fsprogs, and that
should not leak into installed headers. However, e2fsprogs does leak it,
so we work it around, liek gentoo does.

Tested-by: Julien Olivain <ju.o@free.fr>
Signed-off-by: Vincent Stehlé <vincent.stehle@laposte.net>
Cc: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
[yann.morin.1998@free.fr:
  - fix MMU dependency for comment; reword comment
  - fix multi-line assignment of ZEROFREE_CFLAGS
  - do not add comment trailing after assignment
  - extend commit log to explain why we need the workaround
  - use TARGET_CONFIGURE_OPTS, drop explicit CC=
  - install to explicit destination file
]
Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr>
This commit is contained in:
Vincent Stehlé 2022-07-17 11:14:11 +02:00 committed by Yann E. MORIN
parent 4f25bbb7a7
commit 98ecdd1d11
6 changed files with 89 additions and 0 deletions

View File

@ -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 <viniciustinti@gmail.com>
F: package/python-thrift/

View File

@ -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

View File

@ -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

View File

@ -0,0 +1,3 @@
# Locally calculated
sha256 956bc861b55ba0a2b7593c58d32339dab1a0e7da6ea2b813d27c80f08b723867 zerofree-1.1.1.tgz
sha256 90daae00475a992a367da5b0658469a5d1c4449dbbe964c5b7246e1aec92f491 COPYING

View File

@ -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))

View File

@ -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