| #!/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] [ALLOWLIST] [STAMP] [--warn]" |
| echo "Verifies the list of imported symbols against an allowlist." |
| 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_imported_symbols script" |
| echo "[ALLOWLIST]: path to the checked in symbol allowlist" |
| 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 ALLOWLIST=$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: Cannot import 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 "$ALLOWLIST" ]]; then |
| echo "Error: $ALLOWLIST not found" >&2 |
| usage |
| fi |
| |
| VIOLATIONS=$(comm -23 <(cat ${CURRENT} | sort) <(cat ${ALLOWLIST} | sort)) |
| if ! [[ -z "${VIOLATIONS}" ]]; then |
| echo |
| echo "Error: Library $LIBRARY_NAME contains symbols not on the allowlist" |
| echo |
| |
| echo "NOTE: the following symbols were not on the allowlist:" |
| echo "${VIOLATIONS}" |
| echo |
| echo "The allowlist is located at: ${ALLOWLIST}" |
| |
| if [[ "$WARN_ON_CHANGES" -eq 0 ]]; then |
| exit 1 |
| fi |
| fi |
| |
| touch ${STAMP} |