| #!/usr/bin/env bash |
| |
| # Copyright 2019 The Fuchsia Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| set -euo pipefail |
| |
| function usage() { |
| echo "Usage: $0 [CXXFILT] [LIBRARY_NAME] [CURRENT_SYMBOLS] [REFERENCE_SYMBOLS] [STAMP] [--warn]" |
| echo "Verifies the list of public symbols against a golden file." |
| echo "Additionally, checks that none of the symbols is a C++ symbol." |
| echo "[CXXFILT]: path to the llvm-cxxfilt binary" |
| echo "[LIBRARY_NAME]: a human-readable name for the library" |
| echo "[CURRENT]: path to the generated symbols file from the extract_public_symbols script" |
| echo "[REFERENCE]: path to the checked in reference symbol file" |
| echo "[STAMP]: touch this file when the script succeeds" |
| echo "[--warn]: (optional) if is specified, only output warnings and do not fail the build" |
| exit 1 |
| } |
| |
| WARN_ON_CHANGES=0 |
| |
| if [[ $# -ne 5 ]] |
| then |
| if [[ $# -ne 6 ]] |
| then |
| usage |
| else |
| if ! [[ $6 == "--warn" ]]; then |
| usage |
| else |
| WARN_ON_CHANGES=1 |
| fi |
| fi |
| fi |
| |
| readonly CXXFILT=$1 |
| readonly LIBRARY_NAME=$2 |
| readonly CURRENT=$3 |
| readonly REFERENCE=$4 |
| readonly STAMP=$5 |
| |
| if ! [[ -e "$CXXFILT" ]]; then |
| echo "Error: $CXXFILT not found" >&2 |
| usage |
| fi |
| |
| if ! [[ -e "$CURRENT" ]]; then |
| echo "Error: $CURRENT not found" >&2 |
| usage |
| fi |
| |
| # Detect presence of C++ symbols |
| ORIGINAL_SYMBOLS=$(cat ${CURRENT}) |
| DEMANGLED_SYMBOLS=$(${CXXFILT} < ${CURRENT}) |
| |
| if ! [[ "$ORIGINAL_SYMBOLS" == "$DEMANGLED_SYMBOLS" ]]; then |
| echo |
| echo "Error: Prebuilt libraries exported to the SDK should not have C++ symbols" |
| echo "In library $LIBRARY_NAME" |
| echo "NOTE: the following functions are exported with C++ linkage:" |
| while read original <&3 && read demangled <&4; do |
| if ! [[ "$original" == "$demangled" ]]; then |
| echo "$demangled" |
| fi |
| done 3<<<"$ORIGINAL_SYMBOLS" 4<<<"$DEMANGLED_SYMBOLS" |
| echo |
| |
| if [[ "$WARN_ON_CHANGES" -eq 0 ]]; then |
| exit 1 |
| fi |
| fi |
| |
| if ! [[ -e "$REFERENCE" ]]; then |
| echo "Error: $REFERENCE not found" >&2 |
| usage |
| fi |
| |
| if ! diff ${CURRENT} ${REFERENCE} >/dev/null; then |
| echo |
| echo "Error: ABI has changed! In library $LIBRARY_NAME" |
| echo |
| |
| ONLY_IN_CURRENT=$(comm -23 <(cat ${CURRENT}) <(cat ${REFERENCE})) |
| ONLY_IN_REFERENCE=$(comm -13 <(cat ${CURRENT}) <(cat ${REFERENCE})) |
| |
| if ! [[ -z ${ONLY_IN_CURRENT} ]]; then |
| echo "NOTE: the following symbols were added:" |
| echo ${ONLY_IN_CURRENT} |
| echo |
| fi |
| |
| if ! [[ -z ${ONLY_IN_REFERENCE} ]]; then |
| echo "NOTE: the following symbols were removed:" |
| echo ${ONLY_IN_REFERENCE} |
| echo |
| fi |
| |
| echo "Please acknowledge this change by running:" |
| echo "cp $CURRENT $REFERENCE" |
| echo |
| |
| if [[ "$WARN_ON_CHANGES" -eq 0 ]]; then |
| exit 1 |
| fi |
| fi |
| |
| touch ${STAMP} |