113 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			113 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
#!/bin/sh
 | 
						|
set -e
 | 
						|
 | 
						|
srcdir="$1"
 | 
						|
objects="$2"
 | 
						|
log="$3"
 | 
						|
shift 3
 | 
						|
 | 
						|
dkms_dir="$1"
 | 
						|
abi_flavour="$2"
 | 
						|
sign="$3"
 | 
						|
pkgname="$4"
 | 
						|
pkgdir="$5"
 | 
						|
dbgpkgdir="$6"
 | 
						|
package="$7"
 | 
						|
shift 7
 | 
						|
 | 
						|
build="$( dirname "$objects" )/build"
 | 
						|
 | 
						|
# Copy over the objects ready for reconstruction.  The objects copy
 | 
						|
# contains the *.o files. For our purposes we only want the *.o files,
 | 
						|
# elide the rest. And .mod files for ld linking in recentish kernels.
 | 
						|
mkdir -p "$pkgdir/bits/scripts"
 | 
						|
(
 | 
						|
	gcc_variant1=$(gcc --version | head -1 | sed -e 's/^gcc/GCC:/')
 | 
						|
	gcc_variant2=$(gcc --version | head -1 | sed -e 's/^\(gcc\) \((.*)\) \(.*\)$/\1 version \3 \2/')
 | 
						|
	cd "$objects" || exit 1
 | 
						|
	find -name \*.o -o -name \*.mod | \
 | 
						|
	while read file
 | 
						|
	do
 | 
						|
		cp --parents "$file" "$pkgdir/bits"
 | 
						|
		"$srcdir/debian/scripts/fix-filenames" "$pkgdir/bits/$file" "$gcc_variant1"
 | 
						|
		"$srcdir/debian/scripts/fix-filenames" "$pkgdir/bits/$file" "$gcc_variant2"
 | 
						|
	done
 | 
						|
)
 | 
						|
 | 
						|
# Install the support files we need.
 | 
						|
echo "II: copying support files ..."
 | 
						|
for lds_src in \
 | 
						|
	"$dkms_dir/headers/linux-headers-$abi_flavour/scripts/module.lds" \
 | 
						|
	"/usr/src/linux-headers-$abi_flavour/scripts/module.lds" \
 | 
						|
	"$dkms_dir/headers/linux-headers-$abi_flavour/scripts/module-common.lds" \
 | 
						|
	"/usr/src/linux-headers-$abi_flavour/scripts/module-common.lds"
 | 
						|
do
 | 
						|
	[ ! -f "$lds_src" ] && continue
 | 
						|
	echo "II: copying support files ... found $lds_src"
 | 
						|
	cp "$lds_src" "$pkgdir/bits/scripts"
 | 
						|
	break
 | 
						|
done
 | 
						|
 | 
						|
# Build helper scripts.
 | 
						|
cat - <<'EOL' >"$pkgdir/bits/BUILD"
 | 
						|
[ "$1" = "unsigned" ] && { signed_only=:; shift; }
 | 
						|
[ "$1" = "nocheck" ] && { check_only=:; shift; }
 | 
						|
EOL
 | 
						|
grep /usr/bin/ld.bfd "$log" | grep -v scripts/genksyms/genksyms | grep -v "warning:\|NOTE:" | sed -e "s@$build/@@g" >>"$pkgdir/bits/BUILD"
 | 
						|
sed -e 's/.*-o  *\([^ ]*\) .*/rm -f \1/g' <"$pkgdir/bits/BUILD" >"$pkgdir/bits/CLEAN"
 | 
						|
 | 
						|
# As the builds contain the absolute filenames as used.  Use RECONSTRUCT to
 | 
						|
# rebuild the .ko's, sign them, pull off the signatures and then finally clean
 | 
						|
# up again.
 | 
						|
(
 | 
						|
	cd "$pkgdir/bits"
 | 
						|
 | 
						|
	# Add checksum check.
 | 
						|
	echo "\$check_only sha256sum -c SHA256SUMS || exit 1" >>"$pkgdir/bits/BUILD"
 | 
						|
 | 
						|
	# Add .ko handling to the CLEAN/BUILD dance.
 | 
						|
	for ko in "$pkgdir"/*.ko
 | 
						|
	do
 | 
						|
		ko=$(basename "$ko")
 | 
						|
		echo "\$signed_only cat '$ko' '$ko.sig' >'../$ko'" >>"$pkgdir/bits/BUILD"
 | 
						|
		echo "\$signed_only rm -f '$ko'" >>"$pkgdir/bits/BUILD"
 | 
						|
		echo "rm -f '../$ko'" >>"$pkgdir/bits/CLEAN"
 | 
						|
	done
 | 
						|
 | 
						|
	# Clear out anything we are not going to distribute and build unsigned .kos.
 | 
						|
	sh ./CLEAN
 | 
						|
	sh ./BUILD unsigned nocheck
 | 
						|
 | 
						|
	if [ "$sign" = "--custom" ]; then
 | 
						|
		# We are building for and archive custom signing upload.  Keep everything.
 | 
						|
		:
 | 
						|
	elif [ "$sign" = "--lrm" ]; then
 | 
						|
		# We are in the LRM build; grab sha256 checksums and clean up.
 | 
						|
		sha256sum -b *.ko >"SHA256SUMS"
 | 
						|
		sh ./CLEAN
 | 
						|
 | 
						|
	else
 | 
						|
		# We are in the main kernel, put the .kos together as we will
 | 
						|
		# on the users machine, sign them, and keep just the signature.
 | 
						|
		: >"SHA256SUMS"
 | 
						|
		for ko in *.ko
 | 
						|
		do
 | 
						|
			echo "detached-signature $ko"
 | 
						|
			$sign "$ko" "$ko.signed"
 | 
						|
			length=$( stat --format %s "$ko" )
 | 
						|
			dd if="$ko.signed" of="$ko.sig" bs=1 skip="$length" 2>/dev/null
 | 
						|
 | 
						|
			rm -f "$ko.signed"
 | 
						|
			# Keep a checksum of the pre-signed object so we can check it is
 | 
						|
			# built correctly in LRM.
 | 
						|
			sha256sum -b "$ko" >>"SHA256SUMS"
 | 
						|
		done
 | 
						|
 | 
						|
		# Clean out anything which not a signature.
 | 
						|
		mv "$pkgdir/bits/"*.sig "$pkgdir"
 | 
						|
		mv "$pkgdir/bits/SHA256SUMS" "$pkgdir"
 | 
						|
		find "$pkgdir" -name \*.sig -prune -o -name SHA256SUMS -prune -o -type f -print | xargs rm -f
 | 
						|
		find "$pkgdir" -depth -type d -print | xargs rmdir --ignore-fail-on-non-empty
 | 
						|
	fi
 | 
						|
)
 |