1#!/usr/bin/env bash 2# 3# Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR> 4# Copyright (c) 2010 - 2019, Intel Corporation. All rights reserved.<BR> 5# 6# SPDX-License-Identifier: BSD-2-Clause-Patent 7# 8 9set -e 10shopt -s nocasematch 11 12 13# 14# Setup workspace if it is not set 15# 16if [ -z "$WORKSPACE" ] 17then 18 echo Initializing workspace 19 if [ ! -e `pwd`/edksetup.sh ] 20 then 21 cd .. 22 fi 23# This version is for the tools in the BaseTools project. 24# this assumes svn pulls have the same root dir 25# export EDK_TOOLS_PATH=`pwd`/../BaseTools 26# This version is for the tools source in edk2 27 export EDK_TOOLS_PATH=`pwd`/BaseTools 28 echo $EDK_TOOLS_PATH 29 source edksetup.sh BaseTools 30else 31 echo Building from: $WORKSPACE 32fi 33 34# 35# Configure defaults for various options 36# 37 38ARCH_IA32=no 39ARCH_X64=no 40BUILDTARGET=DEBUG 41BUILD_OPTIONS= 42PLATFORMFILE= 43THREADNUMBER=1 44LAST_ARG= 45RUN_QEMU=no 46ENABLE_FLASH=no 47 48# 49# Pick a default tool type for a given OS 50# 51TARGET_TOOLS=MYTOOLS 52case `uname` in 53 CYGWIN*) 54 echo Cygwin not fully supported yet. 55 ;; 56 Darwin*) 57 Major=$(uname -r | cut -f 1 -d '.') 58 # Major is Darwin version, not OS X version. 59 # OS X Yosemite 10.10.2 returns 14. 60 case $Major in 61 [156789]) 62 echo OvmfPkg requires OS X Snow Leopard 10.6 or newer OS 63 exit 1 64 ;; 65 10) 66 TARGET_TOOLS=XCODE32 67 ;; 68 1[12]) 69 TARGET_TOOLS=XCLANG 70 ;; 71 *) 72 # Mavericks and future assume XCODE5 (clang + lldb) 73 TARGET_TOOLS=XCODE5 74 ;; 75 esac 76 ;; 77 Linux*) 78 gcc_version=$(gcc -v 2>&1 | tail -1 | awk '{print $3}') 79 case $gcc_version in 80 [1-3].*|4.[0-7].*) 81 echo OvmfPkg requires GCC4.8 or later 82 exit 1 83 ;; 84 4.8.*) 85 TARGET_TOOLS=GCC48 86 ;; 87 4.9.*|6.[0-2].*) 88 TARGET_TOOLS=GCC49 89 ;; 90 *) 91 TARGET_TOOLS=GCC5 92 ;; 93 esac 94esac 95 96# 97# Scan command line to override defaults 98# 99 100for arg in "$@" 101do 102 if [ -z "$LAST_ARG" ]; then 103 case $arg in 104 -a|-b|-t|-p|-n) 105 LAST_ARG=$arg 106 ;; 107 qemu) 108 RUN_QEMU=yes 109 shift 110 break 111 ;; 112 --enable-flash) 113 ENABLE_FLASH=yes 114 ;; 115 *) 116 BUILD_OPTIONS="$BUILD_OPTIONS $arg" 117 ;; 118 esac 119 else 120 case $LAST_ARG in 121 -a) 122 if [[ x"$arg" != x"IA32" && x"$arg" != x"X64" ]]; then 123 echo Unsupported processor architecture: $arg 124 echo Only IA32 or X64 is supported 125 exit 1 126 fi 127 eval ARCH_$arg=yes 128 ;; 129 -b) 130 BUILDTARGET=$arg 131 ;; 132 -p) 133 PLATFORMFILE=$arg 134 ;; 135 -t) 136 TARGET_TOOLS=$arg 137 ;; 138 -n) 139 THREADNUMBER=$arg 140 ;; 141 *) 142 BUILD_OPTIONS="$BUILD_OPTIONS $arg" 143 ;; 144 esac 145 LAST_ARG= 146 fi 147 shift 148done 149 150if [[ "$ARCH_IA32" == "yes" && "$ARCH_X64" == "yes" ]]; then 151 PROCESSOR=IA32X64 152 Processor=Ia32X64 153 BUILD_OPTIONS="$BUILD_OPTIONS -a IA32 -a X64" 154 PLATFORM_BUILD_DIR=Ovmf3264 155 BUILD_ROOT_ARCH=X64 156elif [[ "$ARCH_IA32" == "yes" && "$ARCH_X64" == "no" ]]; then 157 PROCESSOR=IA32 158 Processor=Ia32 159 BUILD_OPTIONS="$BUILD_OPTIONS -a IA32" 160 PLATFORM_BUILD_DIR=Ovmf$Processor 161 BUILD_ROOT_ARCH=$PROCESSOR 162else 163 PROCESSOR=X64 164 Processor=X64 165 BUILD_OPTIONS="$BUILD_OPTIONS -a X64" 166 PLATFORM_BUILD_DIR=Ovmf$Processor 167 BUILD_ROOT_ARCH=X64 168fi 169 170case $PROCESSOR in 171 IA32) 172 if [ -n "$QEMU_COMMAND" ]; then 173 # 174 # The user set the QEMU_COMMAND variable. We'll use it to run QEMU. 175 # 176 : 177 elif [ -x `which qemu-system-i386` ]; then 178 QEMU_COMMAND=qemu-system-i386 179 elif [ -x `which qemu-system-x86_64` ]; then 180 QEMU_COMMAND=qemu-system-x86_64 181 elif [ -x `which qemu` ]; then 182 QEMU_COMMAND=qemu 183 else 184 echo Unable to find QEMU for IA32 architecture! 185 exit 1 186 fi 187 ;; 188 X64|IA32X64) 189 if [ -z "$QEMU_COMMAND" ]; then 190 # 191 # The user didn't set the QEMU_COMMAND variable. 192 # 193 QEMU_COMMAND=qemu-system-x86_64 194 fi 195 ;; 196 *) 197 echo Unsupported processor architecture: $PROCESSOR 198 echo Only IA32 or X64 is supported 199 exit 1 200 ;; 201esac 202 203if [ -z "$PLATFORMFILE" ]; then 204 PLATFORMFILE=$WORKSPACE/OvmfPkg/OvmfPkg$Processor.dsc 205fi 206 207if [[ "$RUN_QEMU" == "yes" ]]; then 208 qemu_version=$($QEMU_COMMAND -version 2>&1 | \ 209 grep -o -E 'version [0-9]+\.[0-9]+\.[0-9]+' | \ 210 awk '{print $2}') 211 case $qemu_version in 212 1.[6-9].*|[2-9].*.*|[1-9][0-9]*.*.*) 213 ENABLE_FLASH=yes 214 ;; 215 esac 216 217 ADD_QEMU_HDA=yes 218 for arg in "$@" 219 do 220 case $arg in 221 -hd[a-d]|-fd[ab]|-cdrom) 222 ADD_QEMU_HDA=no 223 break 224 ;; 225 esac 226 done 227fi 228 229# 230# Uncomment this block for parameter parsing debug 231# 232#echo RUN_QEMU=$RUN_QEMU 233#echo BUILD_OPTIONS=$BUILD_OPTIONS 234#echo BUILDTARGET=$BUILDTARGET 235#echo TARGET_TOOLS=$TARGET_TOOLS 236#echo PROCESSOR=$PROCESSOR 237#echo Remaining for qemu: $* 238#exit 1 239 240BUILD_ROOT=$WORKSPACE/Build/$PLATFORM_BUILD_DIR/"$BUILDTARGET"_"$TARGET_TOOLS" 241FV_DIR=$BUILD_ROOT/FV 242BUILD_ROOT_ARCH=$BUILD_ROOT/$BUILD_ROOT_ARCH 243QEMU_FIRMWARE_DIR=$BUILD_ROOT/QEMU 244 245if [[ ! -f `which build` || ! -f `which GenFv` ]]; 246then 247 # build the tools if they don't yet exist. Bin scheme 248 echo Building tools as they are not in the path 249 make -C $WORKSPACE/BaseTools 250elif [[ ( -f `which build` || -f `which GenFv` ) && ! -d $EDK_TOOLS_PATH/Source/C/bin ]]; 251then 252 # build the tools if they don't yet exist. BinWrapper scheme 253 echo Building tools no $EDK_TOOLS_PATH/Source/C/bin directory 254 make -C $WORKSPACE/BaseTools 255else 256 echo using prebuilt tools 257fi 258 259 260if [[ "$RUN_QEMU" == "yes" ]]; then 261 if [[ ! -d $QEMU_FIRMWARE_DIR ]]; then 262 mkdir $QEMU_FIRMWARE_DIR 263 fi 264 ln -sf $FV_DIR/OVMF.fd $QEMU_FIRMWARE_DIR/bios.bin 265 if [[ "$ENABLE_FLASH" == "yes" ]]; then 266 QEMU_COMMAND="$QEMU_COMMAND -pflash $QEMU_FIRMWARE_DIR/bios.bin" 267 else 268 QEMU_COMMAND="$QEMU_COMMAND -L $QEMU_FIRMWARE_DIR" 269 fi 270 if [[ "$ADD_QEMU_HDA" == "yes" ]]; then 271 QEMU_COMMAND="$QEMU_COMMAND -hda fat:$BUILD_ROOT_ARCH" 272 fi 273 echo Running: $QEMU_COMMAND "$@" 274 $QEMU_COMMAND "$@" 275 exit $? 276fi 277 278# 279# Build the edk2 OvmfPkg 280# 281echo Running edk2 build for OvmfPkg$Processor 282build -p $PLATFORMFILE $BUILD_OPTIONS -b $BUILDTARGET -t $TARGET_TOOLS -n $THREADNUMBER 283exit $? 284 285