7fd6cea253
cpio includes the number of directory hard links in archives it creates. Some filesystems, like btrfs, do not count directory hard links the same way as more common filesystems like ext4 or tmpfs, so archives built when /tmp is on such a filesystem do not reproduce. This patch replaces cpio with bsdtar, which does not have this issue. The specific invocation is from this page: https://reproducible-builds.org/docs/archives/
52 lines
1.3 KiB
Bash
52 lines
1.3 KiB
Bash
source $stdenv/setup
|
|
|
|
set -o pipefail
|
|
|
|
objects=($objects)
|
|
symlinks=($symlinks)
|
|
suffices=($suffices)
|
|
|
|
mkdir root
|
|
|
|
# Needed for splash_helper, which gets run before init.
|
|
mkdir root/dev
|
|
mkdir root/sys
|
|
mkdir root/proc
|
|
|
|
|
|
for ((n = 0; n < ${#objects[*]}; n++)); do
|
|
object=${objects[$n]}
|
|
symlink=${symlinks[$n]}
|
|
suffix=${suffices[$n]}
|
|
if test "$suffix" = none; then suffix=; fi
|
|
|
|
mkdir -p $(dirname root/$symlink)
|
|
ln -s $object$suffix root/$symlink
|
|
done
|
|
|
|
|
|
# Get the paths in the closure of `object'.
|
|
storePaths=$(perl $pathsFromGraph closure-*)
|
|
|
|
|
|
# Paths in cpio archives *must* be relative, otherwise the kernel
|
|
# won't unpack 'em.
|
|
(cd root && cp -prP --parents $storePaths .)
|
|
|
|
|
|
# Put the closure in a gzipped cpio archive.
|
|
mkdir -p $out
|
|
for PREP in $prepend; do
|
|
cat $PREP >> $out/initrd
|
|
done
|
|
(cd root && find * .[^.*] -exec touch -h -d '@1' '{}' +)
|
|
(cd root && find * .[^.*] -print0 | sort -z | bsdtar --uid 0 --gid 0 -cnf - -T - | bsdtar --null -cf - --format=newc @- | eval -- $compress >> "$out/initrd")
|
|
|
|
if [ -n "$makeUInitrd" ]; then
|
|
mkimage -A "$uInitrdArch" -O linux -T ramdisk -C "$uInitrdCompression" -d "$out/initrd" $out/initrd.img
|
|
# Compatibility symlink
|
|
ln -sf "initrd.img" "$out/initrd"
|
|
else
|
|
ln -s "initrd" "$out/initrd$extension"
|
|
fi
|