#!/bin/bash # Copyright (c) 2013 Intel Corporation. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in # the documentation and/or other materials provided with the # distribution. # * Neither the name of Intel Corporation nor the names of its # contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # This build script is: # 1. An implementation of the Tianocore instructions for GCC, plus # 2. Clanton-specific build steps # This script automates compiling the default configs. For anything # more custom edit the Conf/target.txt file and use the original # Tianocore 'build' command # http://sourceforge.net/apps/mediawiki/tianocore/index.php?title=Using_EDK_II_with_Native_GCC_4.4 set -e build_all() { test -d ./BaseTools || die "Missing required directories, have you run 'svn update'?\n" test -e ./QuarkSocPkg/QuarkNorthCluster/Binary/QuarkMicrocode/RMU.bin || { echo "Trying to fetch Chipset Microcode" ./fetchCMCBinary.py || die "Missing Chipset Microcode\n" } mkdir -p Conf ############################################################################## ######################## PreBuild-processing ##################### ############################################################################## # Provide default config files when the user has not for cfgf in tools_def build_rule; do [ -e ./Conf/"${cfgf}".txt ] || cp -f ./QuarkPlatformPkg/Override/BaseTools/Conf/"${cfgf}".template ./Conf/"${cfgf}".txt done make -C BaseTools # This defines EDK_TOOLS_PATH=..../BaseTools and others # Note: this script will also provide all the other default Conf/ # files (from BaseTools/), i.e., all config files besides the ones # we provided just above . ./edksetup.sh local thread_number_opt='' if test -n "${THREAD_NUMBER}"; then thread_number_opt="-n ${THREAD_NUMBER}" fi #################################################################################################################### ###### Perform the actual build ############# ###### Warning: parameters here are supposed to override any corresponding value in Conf/target.txt ############# #################################################################################################################### build -p ${platform}Pkg/${platform}Pkg.dsc -b ${target} -a IA32 ${thread_number_opt} -t $tool_opt -y Report.log $_args ${debug_print_error_level} ${debug_property_mask} ############################################################################### ######################## PostBuild-processing ##################### ############################################################################### ./QuarkPlatformPkg/Tools/QuarkSpiFixup/QuarkSpiFixup.py $platform $target $tool_opt #################################################################################################################### ###### Perform EDKII build again after QuarkSpiFixup so that output .fd file usable. ############# ###### Warning: parameters here are supposed to override any corresponding value in Conf/target.txt ############# #################################################################################################################### build -p ${platform}Pkg/${platform}Pkg.dsc -b ${target} -a IA32 ${thread_number_opt} -t $tool_opt -y Report.log $_args ${debug_print_error_level} ${debug_property_mask} OutputModulesDir=$WORKSPACE/Build/${platform}/${target}_$tool_opt/FV # Copy build output .fd file int0 FlashModules directory. # Use similar name to full Quark Spi Flash tools but emphasise only EDKII assets in bin file. cp -f $OutputModulesDir/QUARK.fd $OutputModulesDir/FlashModules/Flash-EDKII-missingPDAT.bin ############################################################################### ######################## Image signing stage #################### ######################## (dummy signing) #################### ############################################################################### if [ ! -e $WORKSPACE/QuarkPlatformPkg/Tools/SignTool/DummySignTool ] then make -C $WORKSPACE/QuarkPlatformPkg/Tools/SignTool fi $WORKSPACE/QuarkPlatformPkg/Tools/SignTool/DummySignTool ${OutputModulesDir}/FlashModules/EDKII_BOOT_STAGE1_IMAGE1.Fv $OutputModulesDir/EDKII_BOOT_STAGE1_IMAGE1.Fv.signed $WORKSPACE/QuarkPlatformPkg/Tools/SignTool/DummySignTool ${OutputModulesDir}/FlashModules/EDKII_BOOT_STAGE1_IMAGE2.Fv $OutputModulesDir/EDKII_BOOT_STAGE1_IMAGE2.Fv.signed $WORKSPACE/QuarkPlatformPkg/Tools/SignTool/DummySignTool ${OutputModulesDir}/FlashModules/EDKII_BOOT_STAGE2_RECOVERY.Fv $OutputModulesDir/EDKII_BOOT_STAGE2_RECOVERY.Fv.signed $WORKSPACE/QuarkPlatformPkg/Tools/SignTool/DummySignTool ${OutputModulesDir}/FlashModules/EDKII_BOOT_STAGE2_COMPACT.Fv $OutputModulesDir/EDKII_BOOT_STAGE2_COMPACT.Fv.signed $WORKSPACE/QuarkPlatformPkg/Tools/SignTool/DummySignTool ${OutputModulesDir}/FlashModules/EDKII_BOOT_STAGE2.Fv $OutputModulesDir/EDKII_BOOT_STAGE2.Fv.signed $WORKSPACE/QuarkPlatformPkg/Tools/SignTool/DummySignTool ${OutputModulesDir}/FlashModules/EDKII_RECOVERY_IMAGE1.Fv $OutputModulesDir/EDKII_RECOVERY_IMAGE1.Fv.signed ############################################################################### #################### Capsule creation stage ################ #################### (Recovery and Update capsules) ################ ############################################################################### CapsuleConfigFile=$WORKSPACE/${platform}Pkg/Tools/CapsuleCreate/${platform}PkgCapsuleComponents.inf CapsuleOutputFileReset=$OutputModulesDir/${platform}PkgReset.Cap # CAPSULE_FLAGS_PERSIST_ACROSS_RESET 0x00010000 # CAPSULE_FLAGS_INITIATE_RESET 0x00040000 CapsuleFlagsNoReset=0x00000000 CapsuleFlagsReset=0x00050000 if [ ! -e $WORKSPACE/QuarkPlatformPkg/Tools/CapsuleCreate/CapsuleCreate ] then make -C $WORKSPACE/QuarkPlatformPkg/Tools/CapsuleCreate fi if [ -e $WORKSPACE/${platform}Pkg/Tools/CapsuleCreate/${platform}PkgCapsuleComponents.inf ] then $WORKSPACE/QuarkPlatformPkg/Tools/CapsuleCreate/CapsuleCreate $CapsuleConfigFile $OutputModulesDir $CapsuleOutputFileReset $CapsuleFlagsReset fi $WORKSPACE/QuarkPlatformPkg/Tools/SignTool/DummySignTool $CapsuleOutputFileReset ${CapsuleOutputFileReset}.signed cat $OutputModulesDir/EDKII_BOOT_STAGE2_RECOVERY.Fv.signed $CapsuleOutputFileReset.signed > $OutputModulesDir/FVMAIN.fv ############################################################################### ################ Create useful output directories ################ ############################################################################### # Create Remediation directory if [ ! -e $OutputModulesDir/RemediationModules ] then mkdir $OutputModulesDir/RemediationModules fi # Copy the 'Recovery Capsule' and 'Update Capsules' to the RemediationModules directory # Use same/similar names in stand-alone builds compared to full Quark Spi Flash tools. cp -f $OutputModulesDir/FVMAIN.fv $OutputModulesDir/RemediationModules/. cp -f ${CapsuleOutputFileReset}.signed $OutputModulesDir/RemediationModules/Flash-EDKII.cap cp -f $WORKSPACE/QuarkPlatformPkg/Applications/CapsuleApp.efi $OutputModulesDir/RemediationModules/. # Create Tools directory if [ ! -e $OutputModulesDir/Tools ] then mkdir $OutputModulesDir/Tools fi # Copy the 'CapsuleCreate' tool to the Tools directory cp -f $WORKSPACE/QuarkPlatformPkg/Tools/CapsuleCreate/CapsuleCreate $OutputModulesDir/Tools/. # Create Applications directory if [ ! -e $OutputModulesDir/Applications ] then mkdir $OutputModulesDir/Applications fi # Copy the 'CapsuleApp.efi' application to the Application directory cp -f $WORKSPACE/QuarkPlatformPkg/Applications/CapsuleApp.efi $OutputModulesDir/Applications/. ######################################################################################## ######## Remove build files created (now that we are finished using them) ######## ######################################################################################## rm -f $WORKSPACE/QuarkPlatformPkg/Tools/SignTool/DummySignTool rm -f $WORKSPACE/QuarkPlatformPkg/Tools/SignTool/DummySignTool.o rm -f $WORKSPACE/QuarkPlatformPkg/Tools/SignTool/DummySignTool.d rm -f $WORKSPACE/QuarkPlatformPkg/Tools/CapsuleCreate/CapsuleCreate rm -f $WORKSPACE/QuarkPlatformPkg/Tools/CapsuleCreate/CapsuleCreate.o rm -f $WORKSPACE/QuarkPlatformPkg/Tools/CapsuleCreate/CapsuleCreate.d cp -f ./Report.log ./Build/${platform}/${target}_$tool_opt } die() { printf "ERROR: " printf "$@"; exit 1 } usage() { die "$0 [-r32|-d32|-clean] [GCC43|GCC44|GCC45|GCC46|GCC47] [PlatformName] [-DSECURE_LD(optional)] [-DSECURE_BOOT(optional)]\n" } clean() { printf "Warning: this option is different from every EDK2's 'build cleanXXX' feature\n" ( set -x rm -rf Conf Build ) } main() { case "$1" in -clean) clean; exit 0 ;; -r32) target=RELEASE debug_print_error_level=-DDEBUG_PRINT_ERROR_LEVEL=0x80000000 debug_property_mask=-DDEBUG_PROPERTY_MASK=0x23 ;; -d32) target=DEBUG debug_print_error_level=-DDEBUG_PRINT_ERROR_LEVEL=0x80000042 debug_property_mask=-DDEBUG_PROPERTY_MASK=0x27 ;; *) usage esac case "$2" in GCC43) ;; GCC44) ;; GCC45) ;; GCC46) ;; GCC47) ;; *) usage esac # 2nd argument is the build tools tool_opt=$2 # 3rd argument is the platform name platform=$3 # Add all arguments after the 3rd to the _args array array=( $@ ) _args=${array[@]:3:$#} build_all } main "$@"