X-Git-Url: https://code.delx.au/refind/blobdiff_plain/65b6176beb6171976d044fc17cc7ab6f98e458a1..b04a842814ccc991ed93a52acbd7ac27768be686:/mkdistrib diff --git a/mkdistrib b/mkdistrib index c12196f..6e46866 100755 --- a/mkdistrib +++ b/mkdistrib @@ -4,26 +4,231 @@ # By Rod Smith, 3/11/2012 # Updated 11/8/2012 to do more things automatically # Updated 12/6/2012 to sign binaries with the rEFInd MOK +# Updated 12/3/2015 to independently compile .zip, RPM, and Debian packages # -# Usage: ./mkdistrib version [--nosign] -# where "version" is a version number -# MUST be run from an x86-64 system, on which the TianoCore build -# includes both X64 and IA32 build support ("TARGET_ARCH = IA32 X64" -# in Conf/target.txt). The MOK files must be available from a disk -# partition to be mounted via /etc/fstab at /mnt/refind. - - -if [[ $2 == "--nosign" ]] ; then - SignIt=0 -else - SignIt=1 -fi +# Usage: ./mkdistrib [--nosign] [--norpm] [--nodebian] [--nozip] version +# where "version" is a version number. +# +# Build requirements: +# * Zip: x86-64 system with TianoCore configured for IA32, X64, and +# AARCH builds ("TARGET_ARCH = IA32 X64 AARCH64" in Conf/target.txt) +# * RPM: System with TianoCore or GNU-EFI of same CPU type as desired +# target architecture. (Tested only on X64/x86-64.) +# * Debian: System with GNU-EFI of same CPU type as desired target +# architecture. +# * MOK files: Used for zip and RPM builds; not used for building +# Debian packages. Must be mounted at /mnt/refind via /etc/fstab +# entry, unless --nosign is specified, in which case binaries are +# not signed. Only X64 binaries are signed. +SignIt=1 +MakeRpm=1 +MakeDebian=1 +MakeZip=1 +KeysDir=/mnt/refind +KeysInfo=`df $KeysDir 2> /dev/null | grep $KeysDir` StartDir=`pwd` SBSign=`which sbsign 2> /dev/null` -KeysDir=/mnt/refind -KeysInfo=`df $KeysDir 2> /dev/null | grep $KeysDir` +ShowUsage() { + echo "Usage:" + echo "$0 [--nosign] [--norpm] [--nodebian] [--nozip] version" + exit +} + +GetParams() { + while [[ $# -gt 0 ]]; do + echo "$1" + case $1 in + --nosign) SignIt=0 + ;; + --norpm) MakeRpm=0 + ;; + --nodebian) MakeDebian=0 + ;; + --nozip) MakeZip=0 + ;; + --help) ShowUsage $0 + ;; + * ) Version=$1 + esac + shift + done + if [[ -z "$Version" ]] ; then + ShowUsage $0 + fi +} # GetParams() + +# Copy rEFInd source files to refind-$Version inside $TargetDir directory +# and create a tarball from refind-$Version. Both the tarball and the +# source directory are left in $TargetDir when this function finishes, and +# $TargetDir is the current directory at the end. +MakeTarball() { + # Prepare a place and copy files there.... + mkdir -p $TargetDir/refind-$Version/icons/licenses $TargetDir/refind-$Version/icons/svg + cp --preserve=timestamps icons/*png icons/README $TargetDir/refind-$Version/icons/ + cp --preserve=timestamps -r icons/licenses/* $TargetDir/refind-$Version/icons/licenses/ + cp --preserve=timestamps -r icons/svg/* $TargetDir/refind-$Version/icons/svg/ + cp -a debian docs images keys fonts banners include EfiLib libeg mok net refind filesystems \ + gptsync refind.spec refind-install refind-mkdefault mkrlconf mvrefind mountesp CREDITS.txt \ + NEWS.txt BUILDING.txt COPYING.txt LICENSE.txt README.txt refind.inf Make.common Makefile \ + refind.conf-sample $TargetDir/refind-$Version + + # Go there and prepare a souce code tarball.... + cd $TargetDir + rm -f refind-src-$Version.tar.gz + tar cvf refind-src-$Version.tar refind-$Version + gzip -9 refind-src-$Version.tar + + # Remove SVG files, since they aren't needed for binary packages.... + rm -rf refind-$Version/icons/svg +} # MakeTarball() + +# Create two .zip packages containing the full binary builds of rEFInd for three +# platforms -- IA32, X64, and AARCH64. One binary is the regular build and the +# second is the same as the first but substitutes refind_x64.efi build with +# GNU-EFI for the usual TianoCore build. (This is to provide an alternative for +# those rare cases when the TianoCore build fails.) The X64 binaries are signed +# with my key *IF* --nosign is not specified and if the key is available. +MakeZipBinary() { + cd $TargetDir/refind-$Version + # Build the ARM64 binaries + ARCH=aarch64 make -j1 + ARCH=aarch64 make fs + mkdir -p refind-bin-$Version/refind/drivers_aa64 + cp --preserve=timestamps drivers_aa64/*_aa64.efi refind-bin-$Version/refind/drivers_aa64/ + cp --preserve=timestamps filesystems/LICENSE*txt refind-bin-$Version/refind/drivers_aa64/ + cp refind/refind_aa64.efi refind-bin-$Version/refind/refind_aa64.efi + cp refind/refind_aa64.efi $StartDir/ + mkdir -p refind-bin-$Version/refind/tools_aa64 + # Don't copy gptsync_aa64.efi because it won't build in cross-compile environment + # and because it's likely to be useless on ARM64. + + # Build the IA32 binaries + make clean + ARCH=ia32 make -j1 + ARCH=ia32 make fs + mkdir -p refind-bin-$Version/refind/drivers_ia32 + cp --preserve=timestamps drivers_ia32/*_ia32.efi refind-bin-$Version/refind/drivers_ia32/ + cp --preserve=timestamps filesystems/LICENSE*txt refind-bin-$Version/refind/drivers_ia32/ + cp refind/refind_ia32.efi refind-bin-$Version/refind/refind_ia32.efi + cp refind/refind_ia32.efi $StartDir/ + mkdir -p refind-bin-$Version/refind/tools_ia32 + cp --preserve=timestamps gptsync/gptsync_ia32.efi refind-bin-$Version/refind/tools_ia32/ + + # Build the X64 binaries + make clean + make -j1 + make fs + mkdir -p refind-bin-$Version/refind/drivers_x64 + cp -a icons refind-bin-$Version/refind/ + if [[ $SignIt == 1 ]] ; then + for File in `ls drivers_x64/*_x64.efi` ; do + $SBSign --key $KeysDir/refind.key --cert $KeysDir/refind.crt --output refind-bin-$Version/refind/$File $File + done + else + cp --preserve=timestamps drivers_x64/*_x64.efi refind-bin-$Version/refind/drivers_x64/ + fi + cp --preserve=timestamps filesystems/LICENSE*txt refind-bin-$Version/refind/drivers_x64/ + cp --preserve=timestamps refind.conf-sample refind-bin-$Version/refind/ + if [[ $SignIt == 1 ]] ; then + $SBSign --key $KeysDir/refind.key --cert $KeysDir/refind.crt --output refind-bin-$Version/refind/refind_x64.efi refind/refind_x64.efi + else + cp refind/refind_x64.efi refind-bin-$Version/refind/refind_x64.efi + fi + mkdir -p refind-bin-$Version/refind/tools_x64 + if [[ $SignIt == 1 ]] ; then + $SBSign --key $KeysDir/refind.key --cert $KeysDir/refind.crt --output refind-bin-$Version/refind/tools_x64/gptsync_x64.efi gptsync/gptsync_x64.efi + else + cp --preserve=timestamps gptsync/gptsync_x64.efi refind-bin-$Version/refind/tools_x64/ + fi + cp refind-bin-$Version/refind/refind_x64.efi $StartDir + cp -a docs keys banners fonts COPYING.txt LICENSE.txt README.txt CREDITS.txt NEWS.txt refind-install refind-mkdefault mkrlconf mvrefind mountesp refind-bin-$Version + + # Prepare the final .zip file + zip -9r ../refind-bin-$Version.zip refind-bin-$Version + + # Prepare a variant with the x86-64 version built with GNU-EFI.... + make clean + make -j1 gnuefi + if [[ $SignIt == 1 ]] ; then + $SBSign --key $KeysDir/refind.key --cert $KeysDir/refind.crt --output refind-bin-$Version/refind/refind_x64.efi refind/refind_x64.efi + else + cp refind/refind_x64.efi refind-bin-$Version/refind/refind_x64.efi + fi + zip -9r ../refind-bin-gnuefi-$Version.zip refind-bin-$Version + + cd $TargetDir + rm -r refind-$Version +} # MakeZipBinary() + +# Make Debian packages using native Debian calls. Note that the Debian +# rules currently do NOT use a signing key, so these binaries will be +# UNSIGNED! +MakeDebianPackage() { + cd $TargetDir + rm -rf debian-source + mkdir debian-source + cd debian-source + tar xvfz ../refind-src-$Version.tar.gz + ln -sf ../refind-src-$Version.tar.gz refind_$Version.orig.tar.gz + cd refind-$Version + debuild -S -sa -rfakeroot -k'Rod Smith ' + cd .. + rm -rf ../debian-binary + mkdir ../debian-binary + mv refind-$Version ../debian-binary + cd ../debian-binary + ln -sf ../refind-src-$Version.tar.gz refind_$Version.orig.tar.gz + cd refind-$Version + dpkg-buildpackage -us -uc + cd .. + rm -rf refind-$Version + cd .. +} # MakeDebianPackage + +# Make RPMs and then build Debian package from the RPM. Note that +# these files will be signed with my key, assuming --nosign was not +# passed as an option. (The RPM .spec file checks for the presence +# of my key files.) +MakeRpmPackage() { + cd $TargetDir + cp refind-src-$Version.tar.gz ~/rpmbuild/SOURCES/ + rpmbuild -ba $StartDir/refind.spec + mv ~/rpmbuild/RPMS/*/refind-$Version* ./ + mv ~/rpmbuild/SRPMS/refind-$Version* ./ + sudo alien --to-deb -k -c refind-$Version*x86_64.rpm + sudo chown rodsmith: refind*deb + rm ~/rpmbuild/SOURCES/refind-src-$Version.tar.gz + rm -rf ~/rpmbuild/BUILD/refind-$Version + rm -rf ~/rpmbuild/BUILDROOT/refind-$Version-* +} # MakeRpmPackage + +################################### +# +# Main part of script begins here +# +################################### + +GetParams "$@" + +# From here on, if there's an error, abort immediately. +set -e + +make clean + +# Remove temporary files from the "debian" subdirectory +rm -rf debian/refind debian/*.log + +# Convert man pages to HTML form +man2html docs/man/mkrlconf.8 > docs/refind/mkrlconf.html +man2html docs/man/mvrefind.8 > docs/refind/mvrefind.html +man2html docs/man/refind-mkdefault.8 > docs/refind/refind-mkdefault.html +man2html docs/man/refind-install.8 > docs/refind/refind-install.html + +mkdir -p ../snapshots/$Version +TargetDir=`cd -P ../snapshots/$Version && pwd` +echo $TargetDir if [[ ! -n $SBSign && $SignIt == 1 ]] ; then echo "Can't find sbsign binary! Aborting!" @@ -31,7 +236,7 @@ if [[ ! -n $SBSign && $SignIt == 1 ]] ; then fi if [[ ! -n $KeysInfo && $SignIt == 1 ]] ; then - mount /mnt/refind + mount $KeysDir if [[ $? -ne 0 ]] ; then echo "Error mounting $KeysDir! Aborting!" echo "" @@ -39,62 +244,24 @@ if [[ ! -n $KeysInfo && $SignIt == 1 ]] ; then fi fi -# From here on, if there's an error, abort immediately. -set -e +MakeTarball -make clean - -# Prepare a place and copy files there.... -mkdir -p ../snapshots/$1/refind-$1/icons -cp --preserve=timestamps icons/*icns ../snapshots/$1/refind-$1/icons/ -cp -a docs images include EfiLib libeg refind filesystems install.sh mkrlconf.sh CREDITS.txt NEWS.txt BUILDING.txt COPYING.txt LICENSE.txt README.txt refind.inf Make.tiano Make.common Makefile refind.conf-sample ../snapshots/$1/refind-$1 -if [[ SignIt == 1 ]] ; then - cp $KeysDir/refind.cer $KeysDir/refind.crt ../snapshots/$1/refind-$1/ +if [[ $MakeZip == 1 ]] ; then + MakeZipBinary fi -# Go there and prepare a souce code zip file.... -cd ../snapshots/$1/ -zip -9r refind-src-$1.zip refind-$1 - -# Build the IA32 binaries -cd refind-$1 -ARCH=ia32 make -ARCH=ia32 make fs -mkdir -p refind-bin-$1/refind/drivers_ia32 -cp --preserve=timestamps drivers_ia32/*_ia32.efi refind-bin-$1/refind/drivers_ia32/ -cp --preserve=timestamps filesystems/LICENSE*txt refind-bin-$1/refind/drivers_ia32/ -cp refind/refind_ia32.efi refind-bin-$1/refind/refind_ia32.efi -cp refind/refind_ia32.efi $StartDir/ - -# Build the X64 binaries -make clean -make -make fs -mkdir -p refind-bin-$1/refind/drivers_x64 -cp -a icons refind-bin-$1/refind/ -if [[ $SignIt == 1 ]] ; then - for File in `ls drivers_x64/*_x64.efi` ; do - $SBSign --key $KeysDir/refind.key --cert $KeysDir/refind.crt --output refind-bin-$1/refind/$File $File - done -else - cp --preserve=timestamps drivers_x64/*_x64.efi refind-bin-$1/refind/drivers_x64/ +if [[ $MakeDebian == 1 ]] ; then + MakeDebianPackage fi -cp --preserve=timestamps filesystems/LICENSE*txt refind-bin-$1/refind/drivers_x64/ -cp --preserve=timestamps refind.conf-sample refind-bin-$1/refind/ -if [[ $SignIt == 1 ]] ; then - $SBSign --key $KeysDir/refind.key --cert $KeysDir/refind.crt --output refind-bin-$1/refind/refind_x64.efi refind/refind_x64.efi -else - cp refind/refind_x64.efi refind-bin-$1/refind/refind_x64.efi + +if [[ $MakeRpm == 1 ]] ; then + MakeRpmPackage fi -cp refind-bin-$1/refind/refind_x64.efi $StartDir -cp -a COPYING.txt LICENSE.txt README.txt docs CREDITS.txt install.sh mkrlconf.sh refind-bin-$1 -# Prepare the final .zip file and clean up +# Clean up.... if [[ $SignIt == 1 ]] ; then - cp $KeysDir/refind.cer $KeysDir/refind.crt refind-bin-$1/ - umount $KeysDir + umount $KeysDir fi -zip -9r ../refind-bin-$1.zip refind-bin-$1 -cd .. -rm -r refind-$1 + +# Finish cd $StartDir