1 #!/bin/bash 2 3 # 4 # Board Configuration Section 5 # =========================== 6 # 7 # Board configuration moved to parse-platforms.py and platforms.config. 8 # 9 # No need to edit below unless you are changing script functionality. 10 # 11 12 unset WORKSPACE EDK_TOOLS_DIR MAKEFLAGS 13 14 TOOLS_DIR="`dirname $0`" 15 export TOOLS_DIR 16 . "$TOOLS_DIR"/common-functions 17 PLATFORM_CONFIG="" 18 VERBOSE=0 19 ATF_DIR= 20 TOS_DIR= 21 TOOLCHAIN= 22 OPENSSL_CONFIGURED=FALSE 23 24 # Number of threads to use for build 25 export NUM_THREADS=$((`getconf _NPROCESSORS_ONLN` + 1)) 26 27 function do_build 28 { 29 PLATFORM_NAME="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $board get -o longname`" 30 PLATFORM_PREBUILD_CMDS="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $board get -o prebuild_cmds`" 31 PLATFORM_BUILDFLAGS="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $board get -o buildflags`" 32 PLATFORM_BUILDFLAGS="$PLATFORM_BUILDFLAGS ${EXTRA_OPTIONS[@]}" 33 PLATFORM_BUILDCMD="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $board get -o buildcmd`" 34 PLATFORM_DSC="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $board get -o dsc`" 35 PLATFORM_PACKAGES_PATH="$PWD" 36 COMPONENT_INF="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $board get -o inf`" 37 38 PLATFORM_ARCH="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $board get -o arch`" 39 if [ -n "$PLATFORM_ARCH" ]; then 40 if [ -n "$DEFAULT_PLATFORM_ARCH" -a "$DEFAULT_PLATFORM_ARCH" != "$PLATFORM_ARCH" ]; then 41 echo "Command line specified architecture '$DEFAULT_PLATFORM_ARCH'" >&2 42 echo "differs from config file specified '$PLATFORM_ARCH'" >&2 43 return 1 44 fi 45 else 46 if [ ! -n "$DEFAULT_PLATFORM_ARCH" ]; then 47 echo "Unknown target architecture - aborting!" >&2 48 return 1 49 fi 50 PLATFORM_ARCH="$DEFAULT_PLATFORM_ARCH" 51 fi 52 TEMP_PACKAGES_PATH="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $board get -o packages_path`" 53 if [ -n "$TEMP_PACKAGES_PATH" ]; then 54 IFS=: 55 for path in "$TEMP_PACKAGES_PATH"; do 56 case "$path" in 57 /*) 58 PLATFORM_PACKAGES_PATH="$PLATFORM_PACKAGES_PATH:$path" 59 ;; 60 *) 61 PLATFORM_PACKAGES_PATH="$PLATFORM_PACKAGES_PATH:$PWD/$path" 62 ;; 63 esac 64 done 65 unset IFS 66 fi 67 if [ $VERBOSE -eq 1 ]; then 68 echo "Setting build parallellism to $NUM_THREADS processes\n" 69 echo "PLATFORM_NAME=$PLATFORM_NAME" 70 echo "PLATFORM_PREBUILD_CMDS=$PLATFORM_PREBUILD_CMDS" 71 echo "PLATFORM_BUILDFLAGS=$PLATFORM_BUILDFLAGS" 72 echo "PLATFORM_BUILDCMD=$PLATFORM_BUILDCMD" 73 echo "PLATFORM_DSC=$PLATFORM_DSC" 74 echo "PLATFORM_ARCH=$PLATFORM_ARCH" 75 echo "PLATFORM_PACKAGES_PATH=$PLATFORM_PACKAGES_PATH" 76 fi 77 78 if [[ "${PLATFORM_BUILDFLAGS}" =~ "SECURE_BOOT_ENABLE=TRUE" ]]; then 79 import_openssl 80 fi 81 82 if [ -n "$CROSS_COMPILE_64" -a "$PLATFORM_ARCH" == "AARCH64" ]; then 83 TEMP_CROSS_COMPILE="$CROSS_COMPILE_64" 84 elif [ -n "$CROSS_COMPILE_32" -a "$PLATFORM_ARCH" == "ARM" ]; then 85 TEMP_CROSS_COMPILE="$CROSS_COMPILE_32" 86 else 87 set_cross_compile 88 fi 89 90 CROSS_COMPILE="$TEMP_CROSS_COMPILE" 91 92 echo "Building $PLATFORM_NAME - $PLATFORM_ARCH" 93 echo "CROSS_COMPILE=\"$TEMP_CROSS_COMPILE\"" 94 echo "$board"_BUILDFLAGS="'$PLATFORM_BUILDFLAGS'" 95 96 if [ "$TARGETS" == "" ]; then 97 TARGETS=( RELEASE ) 98 fi 99 100 case $TOOLCHAIN in 101 "gcc") 102 TOOLCHAIN=`get_gcc_version "$CROSS_COMPILE"gcc` 103 if [ $? -ne 0 ]; then 104 echo "${CROSS_COMPILE}gcc not found!" >&2 105 return 1 106 fi 107 ;; 108 "clang") 109 TOOLCHAIN=`get_clang_version clang` 110 if [ $? -ne 0 ]; then 111 return 1 112 fi 113 ;; 114 esac 115 export TOOLCHAIN 116 echo "TOOLCHAIN is ${TOOLCHAIN}" 117 118 export ${TOOLCHAIN}_${PLATFORM_ARCH}_PREFIX=$CROSS_COMPILE 119 echo "Toolchain prefix: ${TOOLCHAIN}_${PLATFORM_ARCH}_PREFIX=$CROSS_COMPILE" 120 121 export PACKAGES_PATH="$PLATFORM_PACKAGES_PATH" 122 for target in "${TARGETS[@]}" ; do 123 if [ X"$PLATFORM_PREBUILD_CMDS" != X"" ]; then 124 echo "Run pre build commands" 125 eval ${PLATFORM_PREBUILD_CMDS} 126 fi 127 128 if [ -n "$COMPONENT_INF" ]; then 129 # Build a standalone component 130 build -n $NUM_THREADS -a "$PLATFORM_ARCH" -t ${TOOLCHAIN} -p "$PLATFORM_DSC" \ 131 -m "$COMPONENT_INF" -b "$target" ${PLATFORM_BUILDFLAGS} 132 else 133 # Build a platform 134 build -n $NUM_THREADS -a "$PLATFORM_ARCH" -t ${TOOLCHAIN} -p "$PLATFORM_DSC" \ 135 -b "$target" ${PLATFORM_BUILDFLAGS} 136 fi 137 138 RESULT=$? 139 if [ $RESULT -eq 0 ]; then 140 if [ X"$TOS_DIR" != X"" ]; then 141 pushd $TOS_DIR >/dev/null 142 if [ $VERBOSE -eq 1 ]; then 143 echo "$TOOLS_DIR/tos-build.sh -e "$EDK2_DIR" -t "$target"_${TOOLCHAIN} $board" 144 fi 145 $TOOLS_DIR/tos-build.sh -e "$EDK2_DIR" -t "$target"_${TOOLCHAIN} $board 146 RESULT=$? 147 popd >/dev/null 148 fi 149 fi 150 if [ $RESULT -eq 0 ]; then 151 if [ X"$ATF_DIR" != X"" ]; then 152 pushd $ATF_DIR >/dev/null 153 if [ $VERBOSE -eq 1 ]; then 154 echo "$TOOLS_DIR/atf-build.sh -e "$EDK2_DIR" -t "$target"_${TOOLCHAIN} $board" 155 fi 156 $TOOLS_DIR/atf-build.sh -e "$EDK2_DIR" -t "$target"_${TOOLCHAIN} $board 157 RESULT=$? 158 popd >/dev/null 159 fi 160 fi 161 result_log $RESULT "$PLATFORM_NAME $target" 162 done 163 unset PACKAGES_PATH 164 } 165 166 167 function clearcache 168 { 169 CONF_FILES="build_rule target tools_def" 170 if [ -z "$EDK_TOOLS_PATH" ] 171 then 172 TEMPLATE_PATH=./BaseTools/Conf/ 173 else 174 TEMPLATE_PATH="$EDK_TOOLS_PATH/Conf/" 175 fi 176 177 for File in $CONF_FILES 178 do 179 TEMPLATE_FILE="$TEMPLATE_PATH/$File.template" 180 CACHE_FILE="Conf/$File.txt" 181 if [ -e "$CACHE_FILE" -a "$TEMPLATE_FILE" -nt "$CACHE_FILE" ] 182 then 183 echo "Removing outdated '$CACHE_FILE'." 184 rm "$CACHE_FILE" 185 fi 186 done 187 188 unset TEMPLATE_PATH TEMPLATE_FILE CACHE_FILE 189 } 190 191 192 function uefishell 193 { 194 BUILD_ARCH=`uname -m` 195 case $BUILD_ARCH in 196 arm*) 197 ARCH=ARM 198 ;; 199 aarch64) 200 ARCH=AARCH64 201 ;; 202 *) 203 unset ARCH 204 ;; 205 esac 206 export ARCH 207 export EDK_TOOLS_PATH=`pwd`/BaseTools 208 clearcache 209 . edksetup.sh BaseTools 210 if [ $VERBOSE -eq 1 ]; then 211 echo "Building BaseTools" 212 fi 213 make -C $EDK_TOOLS_PATH 214 if [ $? -ne 0 ]; then 215 echo " !!! UEFI BaseTools failed to build !!! " >&2 216 exit 1 217 fi 218 } 219 220 221 function usage 222 { 223 echo "usage:" 224 echo -n "uefi-build.sh [-b DEBUG | RELEASE] [ all " 225 for board in "${boards[@]}" ; do 226 echo -n "| $board " 227 done 228 echo "]" 229 printf "%8s\tbuild %s\n" "all" "all supported platforms" 230 for board in "${boards[@]}" ; do 231 PLATFORM_NAME="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $board get -o longname`" 232 printf "%8s\tbuild %s\n" "$board" "${PLATFORM_NAME}" 233 done 234 } 235 236 # 237 # Since we do a command line validation on whether specified platforms exist or 238 # not, do a first pass of command line to see if there is an explicit config 239 # file there to read valid platforms from. 240 # 241 commandline=( "$@" ) 242 i=0 243 for arg; 244 do 245 if [ $arg == "-c" ]; then 246 FILE_ARG=${commandline[i + 1]} 247 if [ ! -f "$FILE_ARG" ]; then 248 echo "ERROR: configuration file '$FILE_ARG' not found" >&2 249 exit 1 250 fi 251 case "$FILE_ARG" in 252 /*) 253 PLATFORM_CONFIG="-c $FILE_ARG" 254 ;; 255 *) 256 PLATFORM_CONFIG="-c `readlink -f \"$FILE_ARG\"`" 257 ;; 258 esac 259 echo "Platform config file: '$FILE_ARG'" 260 export PLATFORM_CONFIG 261 fi 262 i=$(($i + 1)) 263 done 264 265 builds=() 266 boards=() 267 boardlist="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG shortlist`" 268 for board in $boardlist; do 269 boards=(${boards[@]} $board) 270 done 271 272 NUM_TARGETS=0 273 274 while [ "$1" != "" ]; do 275 case $1 in 276 all ) 277 builds=(${boards[@]}) 278 NUM_TARGETS=$(($NUM_TARGETS + 1)) 279 ;; 280 "/h" | "/?" | "-?" | "-h" | "--help" ) 281 usage 282 exit 283 ;; 284 "-v" ) 285 VERBOSE=1 286 ;; 287 "-a" ) 288 shift 289 ATF_DIR="$1" 290 ;; 291 "-A" ) 292 shift 293 DEFAULT_PLATFORM_ARCH="$1" 294 ;; 295 "-c" ) 296 # Already parsed above - skip this + option 297 shift 298 ;; 299 "-s" ) 300 shift 301 export TOS_DIR="$1" 302 ;; 303 "-b" | "--build" ) 304 shift 305 echo "Adding Build profile: $1" 306 TARGETS=( ${TARGETS[@]} $1 ) 307 ;; 308 "-D" ) 309 shift 310 echo "Adding option: -D $1" 311 EXTRA_OPTIONS=( ${EXTRA_OPTIONS[@]} "-D" $1 ) 312 ;; 313 "-T" ) 314 shift 315 echo "Setting toolchain to '$1'" 316 TOOLCHAIN="$1" 317 ;; 318 "-1" ) 319 NUM_THREADS=1 320 ;; 321 * ) 322 MATCH=0 323 for board in "${boards[@]}" ; do 324 if [ "$1" == $board ]; then 325 MATCH=1 326 builds=(${builds[@]} "$board") 327 break 328 fi 329 done 330 331 if [ $MATCH -eq 0 ]; then 332 echo "unknown arg $1" 333 usage 334 exit 1 335 fi 336 NUM_TARGETS=$(($NUM_TARGETS + 1)) 337 ;; 338 esac 339 shift 340 done 341 342 # If there were no args, use a menu to select a single board / all boards to build 343 if [ $NUM_TARGETS -eq 0 ] 344 then 345 read -p "$( 346 f=0 347 for board in "${boards[@]}" ; do 348 echo "$((++f)): $board" 349 done 350 echo $((++f)): all 351 352 echo -ne '> ' 353 )" selection 354 355 if [ "$selection" -eq $((${#boards[@]} + 1)) ]; then 356 builds=(${boards[@]}) 357 else 358 builds="${boards[$((selection-1))]}" 359 fi 360 fi 361 362 # Check to see if we are in a UEFI repository 363 # refuse to continue if we aren't 364 if [ ! -e BaseTools ] 365 then 366 echo "ERROR: we aren't in the UEFI directory." 367 echo " I can tell because I can't see the BaseTools directory" 368 exit 1 369 fi 370 371 EDK2_DIR="$PWD" 372 export VERBOSE 373 374 if [[ "${EXTRA_OPTIONS[@]}" != *"FIRMWARE_VER"* ]]; then 375 if test -d .git && head=`git rev-parse --verify --short HEAD 2>/dev/null`; then 376 FIRMWARE_VER=`git rev-parse --short HEAD` 377 if ! git diff-index --quiet HEAD --; then 378 FIRMWARE_VER="${FIRMWARE_VER}-dirty" 379 fi 380 EXTRA_OPTIONS=( ${EXTRA_OPTIONS[@]} "-D" FIRMWARE_VER=$FIRMWARE_VER ) 381 if [ $VERBOSE -eq 1 ]; then 382 echo "FIRMWARE_VER=$FIRMWARE_VER" 383 echo "EXTRA_OPTIONS=$EXTRA_OPTIONS" 384 fi 385 fi 386 fi 387 388 uefishell 389 390 if [ X"$TOOLCHAIN" = X"" ]; then 391 TOOLCHAIN=gcc 392 fi 393 394 for board in "${builds[@]}" ; do 395 do_build 396 done 397 398 result_print 399