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