From 3182b56e35e1a07c920ebded54fc55686ced99bf Mon Sep 17 00:00:00 2001 From: "Alex Xu (Hello71)" Date: Wed, 11 Nov 2020 07:55:00 -0500 Subject: revamp module support, other refactoring --- make | 61 ++++++------------------------------------------------------- 1 file changed, 6 insertions(+), 55 deletions(-) (limited to 'make') diff --git a/make b/make index 9ce479c..461043f 100755 --- a/make +++ b/make @@ -1,9 +1,5 @@ #!/bin/sh -#[ -n "$compressor" ] || compressor="lz4 --best --favor-decSpeed -l" -[ -n "$compressor" ] || compressor="zstd -19 -c -T0" -#[ -n "$compressor" ] || compressor="xz -c --check=crc32 --x86 --lzma2=preset=9e" - toppid=$$ die() { fmt=$1 @@ -21,77 +17,32 @@ gen_cmd() { # ignore builtins [ "$cmd" != "$cmdp" ] || return printf 'file %s %s 0755 0 0\n' "$cmdp" "$cmdp" - ldd "$cmdp" | grep / | while read line; do - tmp=${line% *} - lib=/${tmp#*/} - # don't bother with ld.so.conf - printf 'file /lib64/%s %s 0755 0 0\n' "${lib##*/}" "$lib" - done + ldd "$cmdp" | awk '/\// { if ($1~/^\//) file=$1; else file=$3; print "file " file " " file " 0755 0 0" }' } # generate the main file list gen_cpio_list() { sed -e '/^#/d' cpio_list.txt - while read insmod mod args; do - if [ "$insmod" = insmod ]; then - printf 'file %s %s 0644 0 0\n' "$mod" "$mod" - fi - done < modules.sh + tr ' ' '\n' < modules.dep | sed -e "s/://;s:.*:file /lib/modules/$KERNVER/& /lib/modules/$KERNVER/& 0644 0 0:" gen_cmd e2fsck gen_cmd dropbear - # cryptsetup argon2 uses pthread_cancel, glibc dlopens libgcc_s.so.1 - # ldd will find the correct libgcc_s.so.1 based on ld.so.conf - export LD_PRELOAD=libgcc_s.so.1 gen_cmd cryptsetup - # LD_PRELOAD unset at end of subshell + ldconfig -p | awk '$1 == "libgcc_s.so.1" { print "file " $4 " " $4 " 0755 0 0" }' } # filter the list and insert parent directory entries gen_dir_ents() { - while read type target args; do - # re-print the original entry - printf '%s %s %s\n' "$type" "$target" "$args" - # print the necessary directory entries. duplicates will be - # filtered by sort -u later - while [ "${target%/*}" != '' ]; do - target=${target%/*} - printf 'dir %s 0755 0 0\n' "$target" - done - done + awk '{print; while (sub("/[^/]*$", "", $2) && $2) print "dir " $2 " 0755 0 0"; }' } # filter the list and generate the make dependency file gen_depfile() { deps='cpio_list.txt make' - while read type target source args; do - # re-print the original entry - printf '%s %s %s %s\n' "$type" "$target" "$source" "$args" - # accumulate the dependencies in a list to avoid make bugs. - # there will be no duplicates since the list was previously sorted - if [ "$type" != file ]; then - continue - fi - case "$source" in - /dev/*) continue - esac - deps="$deps $source" - # avoid "No rule to make target" when deps disappear - echo "$source:" >&3 - done - echo "initramfs.img: $deps" >&3 + awk -v d=/dev/fd/3 '$1 == "file" {print; deps=deps " " $3; print $3 ":" > d; } END { print "initramfs.img:" deps > d }' } if ! [ -e cpio_list.txt ] || ! [ -e gen_init_cpio ]; then cd "${0%/*}" fi -trap 'test -L initramfs.img || test -f initramfs.img && rm -f initramfs.img; exit 1' HUP INT QUIT TERM EXIT - -gen_cpio_list | \ -gen_dir_ents | \ -sort -u | \ -gen_depfile 3>initramfs.d | \ -./gen_init_cpio -t 0 - | \ -$compressor > initramfs.img - -trap '' EXIT +gen_cpio_list | gen_dir_ents | sort -u | gen_depfile 3>initramfs.d | ./gen_init_cpio -t 0 - | $COMPRESSOR > initramfs.img -- cgit v1.2.3-70-g09d2