]> code.delx.au - refind/blobdiff - mkdistrib
Misc small changes, mostly to refind-mkdefault
[refind] / mkdistrib
index 30c98255e053232f91e97911a329637899aa702a..6e46866b5e14305f807fae54ce35d01255ce2f66 100755 (executable)
--- a/mkdistrib
+++ b/mkdistrib
 #
 # Script to prepare source code and binary distribution files of rEFInd.
 # 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
-# where "version" is a version number
-# MUST be run from an x86-64 system, on which the current IA32 build
-# (refind_ia32.efi) is already present in the same directory as this script
-
+# 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`
+
+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 <rodsmith@rodsbooks.com>'
+    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
 
-# 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 libeg refind install.sh CREDITS.txt NEWS.txt BUILDING.txt COPYING.txt LICENSE.txt README.txt Make.common Makefile refind.conf-sample ../snapshots/$1/refind-$1
-
-# Go there are prepare a souce code zip file....
-cd ../snapshots/$1/
-zip -9r refind-src-$1.zip refind-$1
-
-# Build the source code into a binary
-cd refind-$1
-make
-mkdir -p refind-bin-$1/refind
-cp -a icons refind-bin-$1/refind/
-cp --preserve=timestamps refind.conf-sample refind-bin-$1/refind/
-cp refind/refind_x64.efi refind-bin-$1/refind/refind_x64.efi
-cp $StartDir/refind_ia32.efi refind-bin-$1/refind/
-cp -a COPYING.txt LICENSE.txt README.txt docs CREDITS.txt install.sh refind-bin-$1
-zip -9r ../refind-bin-$1.zip refind-bin-$1
-cd ..
-rm -r refind-$1
+# 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!"
+   exit 1
+fi
+
+if [[ ! -n $KeysInfo && $SignIt == 1 ]] ; then
+   mount $KeysDir
+   if [[ $? -ne 0 ]] ; then
+      echo "Error mounting $KeysDir! Aborting!"
+      echo ""
+      exit 1
+   fi
+fi
+
+MakeTarball
+
+if [[ $MakeZip == 1 ]] ; then
+    MakeZipBinary
+fi
+
+if [[ $MakeDebian == 1 ]] ; then
+    MakeDebianPackage
+fi
+
+if [[ $MakeRpm == 1 ]] ; then
+    MakeRpmPackage
+fi
+
+# Clean up....
+if [[ $SignIt == 1 ]] ; then
+    umount $KeysDir
+fi
+
+# Finish
 cd $StartDir