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