build.sh 5.9 KB

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