92 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			92 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #! /bin/bash
 | |
| #
 | |
| # Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
 | |
| # Distributed under the terms of the GNU General Public License v2
 | |
| 
 | |
| # Print help if no args provided, or if the user is requesting help.
 | |
| if [[ $# -eq 0 || $1 == "--help" || $1 == "-h" ]]; then
 | |
| 	name=$(basename $0)
 | |
| 	cat <<-EOF
 | |
| 	USAGE: ./${name} [list of boards]
 | |
| 	  e.g. ./${name} x86-generic amd64-generic daisy
 | |
| 	  This command will build kernel for the following boards:
 | |
| 	    - x86-generic
 | |
| 	    - amd64-generic
 | |
| 	    - daisy
 | |
| 	  It will then generate a file containing all smatch errors not already
 | |
| 	  in the known errors whitelist.  Duplicates will be listed only once.
 | |
| 
 | |
| 	  If chromeos-kernel is not cros_workon'd for a board, that board will
 | |
| 	  be skipped.
 | |
| 	EOF
 | |
| 	exit
 | |
| fi
 | |
| 
 | |
| # Put board name arguments into a list.
 | |
| BOARDS=()
 | |
| SKIPPED_BOARDS=()
 | |
| while [[ $# -gt 0 ]]; do
 | |
| 	board=$1
 | |
| 	# If kernel is not cros-workon'd, then skip this board.
 | |
| 	if cros_workon-${board} list | grep -q chromeos-kernel; then
 | |
| 		BOARDS+=( "${board}" )
 | |
| 	else
 | |
| 		SKIPPED_BOARDS+=( "${board}" )
 | |
| 	fi
 | |
| 	shift
 | |
| done
 | |
| 
 | |
| datestamp() {
 | |
| 	date +%Y%m%d%H%M%s
 | |
| }
 | |
| 
 | |
| # We want to ignore smatch test errors when building kernel, so that we can
 | |
| # collect those errors for updating the whitelist.
 | |
| export FEATURES='test test-fail-continue'
 | |
| export USE="smatch ignore_test_errors"
 | |
| LOG_FILES=()
 | |
| for board in "${BOARDS[@]}"; do
 | |
| 	LOG_FILE=/tmp/${board}-kernel-$(datestamp).log
 | |
| 
 | |
| 	emerge-${board} chromeos-kernel |& tee "${LOG_FILE}"
 | |
| 	pipestatus=${PIPESTATUS[*]}
 | |
| 	if [[ ${pipestatus// } -ne 0 ]]; then
 | |
| 		echo "Error building kernel for ${board}" >&2
 | |
| 		exit 1
 | |
| 	fi
 | |
| 	grep "Non-whitelisted error found:" "${LOG_FILE}" | cut -f 2- -d: | \
 | |
| 		sed -e 's/"$//g' | cut -f 2- -d '"' | \
 | |
| 		sort > "${LOG_FILE}.new_errors"
 | |
| 	LOG_FILES+=( "${LOG_FILE}.new_errors" )
 | |
| done
 | |
| 
 | |
| # Create a new log file to contain all errors, overwriting it if it already
 | |
| # exists.  For each board's new errors, add to this log file the errors that
 | |
| # haven't already been added.  This creates the union of all new errors.
 | |
| NEW_ERRORS_FILE=/tmp/smatch_new_errors-$(datestamp).log
 | |
| for log_file in "${LOG_FILES[@]}"; do
 | |
| 	while read line; do
 | |
| 		fgrep -q "${line}" "${NEW_ERRORS_FILE}" && continue
 | |
| 		echo "${line}"
 | |
| 	done < "${log_file}"
 | |
| done > "${NEW_ERRORS_FILE}"
 | |
| 
 | |
| # Rename the new errors file to reflect the new boards, and move it to the
 | |
| # current working directory.
 | |
| BOARDS_NO_SPACES=$(printf -- -%s "${BOARDS[@]}")
 | |
| NEW_ERRORS_FILE_FINAL=smatch_new_errors${BOARDS_NO_SPACES}.log
 | |
| if [[ $(wc -l < "${NEW_ERRORS_FILE}") -ne 0 ]]; then
 | |
| 	mv "${NEW_ERRORS_FILE}" "${NEW_ERRORS_FILE_FINAL}" || exit
 | |
| fi
 | |
| 
 | |
| echo "*****************************************************"
 | |
| echo "Done building kernel for these boards: ${BOARDS[*]}"
 | |
| [[ ${#SKIPPED_BOARDS[@]} -gt 0 ]] && \
 | |
| 	echo "Skipped these boards because kernel was not cros_workon'd:" \
 | |
| 		"${SKIPPED_BOARDS[*]}"
 | |
| if [[ -e ${NEW_ERRORS_FILE_FINAL} ]]; then
 | |
| 	echo "New smatch errors are in ${NEW_ERRORS_FILE_FINAL}"
 | |
| else
 | |
| 	echo "No new smatch errors found."
 | |
| fi
 |