Home | History | Annotate | Download | only in uefi-tools
      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 . "$TOOLS_DIR"/common-functions
     16 PLATFORM_CONFIG=""
     17 VERBOSE=0
     18 ATF_DIR=
     19 TOS_DIR=
     20 TOOLCHAIN=
     21 OPENSSL_CONFIGURED=FALSE
     22 
     23 # Number of threads to use for build
     24 export NUM_THREADS=$((`getconf _NPROCESSORS_ONLN` + 1))
     25 
     26 function build_platform
     27 {
     28 	PLATFORM_NAME="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $board get -o longname`"
     29 	PLATFORM_PREBUILD_CMDS="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $board get -o prebuild_cmds`"
     30 	PLATFORM_BUILDFLAGS="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $board get -o buildflags`"
     31 	PLATFORM_BUILDFLAGS="$PLATFORM_BUILDFLAGS ${EXTRA_OPTIONS[@]}"
     32 	PLATFORM_BUILDCMD="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $board get -o buildcmd`"
     33 	PLATFORM_DSC="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $board get -o dsc`"
     34 	PLATFORM_ARCH="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $board get -o arch`"
     35 	PLATFORM_PACKAGES_PATH="$PWD"
     36 
     37 	TEMP_PACKAGES_PATH="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $board get -o packages_path`"
     38 	if [ -n "$TEMP_PACKAGES_PATH" ]; then
     39 		IFS=:
     40 		for path in "$TEMP_PACKAGES_PATH"; do
     41 			case "$path" in
     42 				/*)
     43 					PLATFORM_PACKAGES_PATH="$PLATFORM_PACKAGES_PATH:$path"
     44 				;;
     45 				*)
     46 					PLATFORM_PACKAGES_PATH="$PLATFORM_PACKAGES_PATH:$PWD/$path"
     47 				;;
     48 		        esac
     49 		done
     50 		unset IFS
     51 	fi
     52 	if [ $VERBOSE -eq 1 ]; then
     53 		echo "Setting build parallellism to $NUM_THREADS processes\n"
     54 		echo "PLATFORM_NAME=$PLATFORM_NAME"
     55 		echo "PLATFORM_PREBUILD_CMDS=$PLATFORM_PREBUILD_CMDS"
     56 		echo "PLATFORM_BUILDFLAGS=$PLATFORM_BUILDFLAGS"
     57 		echo "PLATFORM_BUILDCMD=$PLATFORM_BUILDCMD"
     58 		echo "PLATFORM_DSC=$PLATFORM_DSC"
     59 		echo "PLATFORM_ARCH=$PLATFORM_ARCH"
     60 		echo "PLATFORM_PACKAGES_PATH=$PLATFORM_PACKAGES_PATH"
     61 	fi
     62 
     63 	set_cross_compile
     64 	CROSS_COMPILE="$TEMP_CROSS_COMPILE"
     65 
     66 	echo "Building $PLATFORM_NAME - $PLATFORM_ARCH"
     67 	echo "CROSS_COMPILE=\"$TEMP_CROSS_COMPILE\""
     68 	echo "$board"_BUILDFLAGS="'$PLATFORM_BUILDFLAGS'"
     69 
     70 	if [ "$TARGETS" == "" ]; then
     71 		TARGETS=( RELEASE )
     72 	fi
     73 
     74 	case $TOOLCHAIN in
     75 		"gcc")
     76 			export TOOLCHAIN=`get_gcc_version "$CROSS_COMPILE"gcc`
     77 			;;
     78 		"clang")
     79 			export TOOLCHAIN=`get_clang_version clang`
     80 			;;
     81 	esac
     82 	echo "TOOLCHAIN is ${TOOLCHAIN}"
     83 
     84 	export ${TOOLCHAIN}_${PLATFORM_ARCH}_PREFIX=$CROSS_COMPILE
     85 	echo "Toolchain prefix: ${TOOLCHAIN}_${PLATFORM_ARCH}_PREFIX=$CROSS_COMPILE"
     86 
     87 	export PACKAGES_PATH="$PLATFORM_PACKAGES_PATH"
     88 	for target in "${TARGETS[@]}" ; do
     89 		if [ X"$PLATFORM_PREBUILD_CMDS" != X"" ]; then
     90 			echo "Run pre build commands"
     91 			eval ${PLATFORM_PREBUILD_CMDS}
     92 		fi
     93 		if [ X"$PLATFORM_BUILDCMD" == X"" ]; then
     94 			echo  ${TOOLCHAIN}_${PLATFORM_ARCH}_PREFIX=$CROSS_COMPILE build -n $NUM_THREADS -a "$PLATFORM_ARCH" -t ${TOOLCHAIN} -p "$PLATFORM_DSC" -b "$target" \
     95 				${PLATFORM_BUILDFLAGS}
     96 			build -n $NUM_THREADS -a "$PLATFORM_ARCH" -t ${TOOLCHAIN} -p "$PLATFORM_DSC" -b "$target" \
     97 				${PLATFORM_BUILDFLAGS}
     98 		else
     99 			${PLATFORM_BUILDCMD} -b "$target" ${PLATFORM_BUILDFLAGS}
    100 		fi
    101 		RESULT=$?
    102 		if [ $RESULT -eq 0 ]; then
    103 			if [ X"$TOS_DIR" != X"" ]; then
    104 				pushd $TOS_DIR >/dev/null
    105 				if [ $VERBOSE -eq 1 ]; then
    106 					echo "$TOOLS_DIR/tos-build.sh -e "$EDK2_DIR" -t "$target"_${TOOLCHAIN} $board"
    107 				fi
    108 				$TOOLS_DIR/tos-build.sh -e "$EDK2_DIR" -t "$target"_${TOOLCHAIN} $board
    109 				RESULT=$?
    110 				popd >/dev/null
    111 			fi
    112 		fi
    113 		if [ $RESULT -eq 0 ]; then
    114 			if [ X"$ATF_DIR" != X"" ]; then
    115 				pushd $ATF_DIR >/dev/null
    116 				if [ $VERBOSE -eq 1 ]; then
    117 					echo "$TOOLS_DIR/atf-build.sh -e "$EDK2_DIR" -t "$target"_${TOOLCHAIN} $board"
    118 				fi
    119 				$TOOLS_DIR/atf-build.sh -e "$EDK2_DIR" -t "$target"_${TOOLCHAIN} $board
    120 				RESULT=$?
    121 				popd >/dev/null
    122 			fi
    123 		fi
    124 		result_log $RESULT "$PLATFORM_NAME $target"
    125 	done
    126 	unset PACKAGES_PATH
    127 }
    128 
    129 
    130 function uefishell
    131 {
    132 	BUILD_ARCH=`uname -m`
    133 	case $BUILD_ARCH in
    134 		arm*)
    135 			ARCH=ARM
    136 			;;
    137 		aarch64)
    138 			ARCH=AARCH64
    139 			;;
    140 		*)
    141 			unset ARCH
    142 			;;
    143 	esac
    144 	export ARCH
    145 	if [ $VERBOSE -eq 1 ]; then
    146 		echo "Building BaseTools"
    147 	fi
    148 	export EDK_TOOLS_PATH=`pwd`/BaseTools
    149 	. edksetup.sh BaseTools
    150 	make -C $EDK_TOOLS_PATH
    151 	if [ $? -ne 0 ]; then
    152 		echo " !!! UEFI BaseTools failed to build !!! " >&2
    153 		exit 1
    154 	fi
    155 }
    156 
    157 
    158 function usage
    159 {
    160 	echo "usage:"
    161 	echo -n "uefi-build.sh [-b DEBUG | RELEASE] [ all "
    162 	for board in "${boards[@]}" ; do
    163 	    echo -n "| $board "
    164 	done
    165 	echo "]"
    166 	printf "%8s\tbuild %s\n" "all" "all supported platforms"
    167 	for board in "${boards[@]}" ; do
    168 		PLATFORM_NAME="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG -p $board get -o longname`"
    169 		printf "%8s\tbuild %s\n" "$board" "${PLATFORM_NAME}"
    170 	done
    171 }
    172 
    173 #
    174 # Since we do a command line validation on whether specified platforms exist or
    175 # not, do a first pass of command line to see if there is an explicit config
    176 # file there to read valid platforms from.
    177 #
    178 commandline=( "$@" )
    179 i=0
    180 for arg;
    181 do
    182 	if [ $arg == "-c" ]; then
    183 		FILE_ARG=${commandline[i + 1]}
    184 		if [ ! -f "$FILE_ARG" ]; then
    185 			echo "ERROR: configuration file '$FILE_ARG' not found" >&2
    186 			exit 1
    187 		fi
    188 		case "$FILE_ARG" in
    189 			/*)
    190 				PLATFORM_CONFIG="-c \"$FILE_ARG\""
    191 			;;
    192 			*)
    193 				PLATFORM_CONFIG="-c `readlink -f \"$FILE_ARG\"`"
    194 			;;
    195 		esac
    196 		echo "Platform config file: '$FILE_ARG'"
    197 		export PLATFORM_CONFIG
    198 	fi
    199 	i=$(($i + 1))
    200 done
    201 
    202 builds=()
    203 boards=()
    204 boardlist="`$TOOLS_DIR/parse-platforms.py $PLATFORM_CONFIG shortlist`"
    205 for board in $boardlist; do
    206     boards=(${boards[@]} $board)
    207 done
    208 
    209 NUM_TARGETS=0
    210 
    211 while [ "$1" != "" ]; do
    212 	case $1 in
    213 		all )
    214 			builds=(${boards[@]})
    215 			NUM_TARGETS=$(($NUM_TARGETS + 1))
    216 			;;
    217 		"/h" | "/?" | "-?" | "-h" | "--help" )
    218 			usage
    219 			exit
    220 			;;
    221 		"-v" )
    222 			VERBOSE=1
    223 			;;
    224 		"-a" )
    225 			shift
    226 			ATF_DIR="$1"
    227 			;;
    228 		"-c" )
    229 			# Already parsed above - skip this + option
    230 			shift
    231 			;;
    232 		"-s" )
    233 			shift
    234 			export TOS_DIR="$1"
    235 			;;
    236 		"-b" | "--build" )
    237 			shift
    238 			echo "Adding Build profile: $1"
    239 			TARGETS=( ${TARGETS[@]} $1 )
    240 			;;
    241 		"-D" )
    242 			shift
    243 			echo "Adding option: -D $1"
    244 			EXTRA_OPTIONS=( ${EXTRA_OPTIONS[@]} "-D" $1 )
    245 			;;
    246 		"-T" )
    247 			shift
    248 			echo "Setting toolchain to '$1'"
    249 			TOOLCHAIN="$1"
    250 			;;
    251 		"-1" )
    252 			NUM_THREADS=1
    253 			;;
    254 		* )
    255 			MATCH=0
    256 			for board in "${boards[@]}" ; do
    257 				if [ "$1" == $board ]; then
    258 					MATCH=1
    259 					builds=(${builds[@]} "$board")
    260 					break
    261 				fi
    262 			done
    263 
    264 			if [ $MATCH -eq 0 ]; then
    265 				echo "unknown arg $1"
    266 				usage
    267 				exit 1
    268 			fi
    269 			NUM_TARGETS=$(($NUM_TARGETS + 1))
    270 			;;
    271 	esac
    272 	shift
    273 done
    274 
    275 # If there were no args, use a menu to select a single board / all boards to build
    276 if [ $NUM_TARGETS -eq 0 ]
    277 then
    278 	read -p "$(
    279 			f=0
    280 			for board in "${boards[@]}" ; do
    281 					echo "$((++f)): $board"
    282 			done
    283 			echo $((++f)): all
    284 
    285 			echo -ne '> '
    286 	)" selection
    287 
    288 	if [ "$selection" -eq $((${#boards[@]} + 1)) ]; then
    289 		builds=(${boards[@]})
    290 	else
    291 		builds="${boards[$((selection-1))]}"
    292 	fi
    293 fi
    294 
    295 # Check to see if we are in a UEFI repository
    296 # refuse to continue if we aren't
    297 if [ ! -e BaseTools ]
    298 then
    299 	echo "ERROR: we aren't in the UEFI directory."
    300 	echo "       I can tell because I can't see the BaseTools directory"
    301 	exit 1
    302 fi
    303 
    304 EDK2_DIR="$PWD"
    305 export VERBOSE
    306 
    307 if [[ "${EXTRA_OPTIONS[@]}" != *"FIRMWARE_VER"* ]]; then
    308 	if test -d .git && head=`git rev-parse --verify --short HEAD 2>/dev/null`; then
    309 		FIRMWARE_VER=`git rev-parse --short HEAD`
    310 		if ! git diff-index --quiet HEAD --; then
    311 			FIRMWARE_VER="${FIRMWARE_VER}-dirty"
    312 		fi
    313 		EXTRA_OPTIONS=( ${EXTRA_OPTIONS[@]} "-D" FIRMWARE_VER=$FIRMWARE_VER )
    314 		if [ $VERBOSE -eq 1 ]; then
    315 			echo "FIRMWARE_VER=$FIRMWARE_VER"
    316 			echo "EXTRA_OPTIONS=$EXTRA_OPTIONS"
    317 		fi
    318 	fi
    319 fi
    320 
    321 uefishell
    322 
    323 if [ X"$TOOLCHAIN" = X"" ]; then
    324 	TOOLCHAIN=gcc
    325 fi
    326 
    327 for board in "${builds[@]}" ; do
    328 	build_platform
    329 done
    330 
    331 result_print
    332