| #! /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 |