You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

57 lines
1.8 KiB

#!/usr/bin/env bash
if [ $# -eq 0 ]; then
# With no args, read stdin to scrape compiler output.
# shellcheck disable=SC2046
set -- $(while read -r LINE; do
case "$LINE" in
*undefined\ reference\ to*)
# file.cc:(.text+0x10): undefined reference to `foo()'
LINE=${LINE#*undefined reference to \`}
echo "${LINE%\'*}"
;;
*undefined\ symbol:*)
# ld: error: undefined symbol: foo()
echo "${LINE#*undefined symbol: }"
;;
tools-make: add mock parser for clang ld output According to #3226, it looks like clang's LD error format has changed. This patch adds the new format so we can parse the mocks successfully. Apple clang version 11.0.3 (clang-1103.0.32.29) ``` checking for ANSI C header files... Undefined symbols for architecture x86_64: "_fromwire_amount_msat", referenced from: _fromwire_tlv_test_n1_tlv3 in ccj4zKdV.o "_fromwire_bool", referenced from: _fromwire_test_msg in ccj4zKdV.o _fromwire_test_msg_option_short_id in ccj4zKdV.o _fromwire_test_msg_option_one in ccj4zKdV.o _fromwire_test_msg_option_two in ccj4zKdV.o "_fromwire_test_enum", referenced from: _fromwire_test_msg in ccj4zKdV.o _fromwire_test_msg_option_short_id in ccj4zKdV.o _fromwire_test_msg_option_one in ccj4zKdV.o _fromwire_test_msg_option_two in ccj4zKdV.o "_fromwire_tlvs", referenced from: _fromwire_test_tlv1 in ccj4zKdV.o _fromwire_test_tlv2 in ccj4zKdV.o _fromwire_test_tlv3 in ccj4zKdV.o "_fromwire_tu32", referenced from: _fromwire_tlv_test_n2_tlv2 in ccj4zKdV.o "_fromwire_tu64", referenced from: _fromwire_tlv_test_n1_tlv1 in ccj4zKdV.o _fromwire_tlv_test_n2_tlv1 in ccj4zKdV.o "_fromwire_u16", referenced from: _fromwire_test_features in ccj4zKdV.o _fromwire_subtype_var_assign in ccj4zKdV.o _fromwire_subtype_arrays in ccj4zKdV.o _fromwire_tlv_test_n1_tlv4 in ccj4zKdV.o _fromwire_tlv_test_n3_tlv3 in ccj4zKdV.o _fromwire_test_msg in ccj4zKdV.o _fromwire_test_tlv1 in ccj4zKdV.o ... "_fromwire_u32", referenced from: _fromwire_tlv_test_n3_tlv3 in ccj4zKdV.o _fromwire_test_msg in ccj4zKdV.o _fromwire_test_msg_option_short_id in ccj4zKdV.o _fromwire_test_msg_option_one in ccj4zKdV.o _fromwire_test_msg_option_two in ccj4zKdV.o "_fromwire_u64", referenced from: _fromwire_test_short_id in ccj4zKdV.o _fromwire_tlv_test_n3_tlv3 in ccj4zKdV.o "_fromwire_u8", referenced from: _fromwire_subtype_var_assign in ccj4zKdV.o _fromwire_subtype_var_len in ccj4zKdV.o _fromwire_subtype_varlen_varsize in ccj4zKdV.o _fromwire_tlv_test_n3_tlv3 in ccj4zKdV.o "_fromwire_u8_array", referenced from: _fromwire_test_features in ccj4zKdV.o _fromwire_subtype_arrays in ccj4zKdV.o _fromwire_tlv_test_n3_tlv3 in ccj4zKdV.o _fromwire_test_msg in ccj4zKdV.o _fromwire_test_msg_option_short_id in ccj4zKdV.o _fromwire_test_msg_option_one in ccj4zKdV.o _fromwire_test_msg_option_two in ccj4zKdV.o ... ``` Changelog-Fixed: Build for macOS Catalina / Apple clang v11.0.3 fixed
5 years ago
*,\ referenced\ from:*)
# Apple clang version 11.0.3 (clang-1103.0.32.29)
# "_towire", referenced from:
LINE=${LINE#\"_}
echo "${LINE%\"*}"
;;
*)
continue
;;
esac; done | LC_ALL=C sort -u)
fi
for SYMBOL; do
# If there are multiple declarations, pick first (eg. common/memleak.h
# has notleak_ as a declaration, and then an inline).
WHERE=$(grep -nH "^[a-zA-Z0-9_ (),]* [*]*$SYMBOL(" ./*/*.h | head -n1)
if [ x"$WHERE" = x ]; then
echo "/* Could not find declaration for $SYMBOL */"
continue
fi
FILE=${WHERE%%:*}
FILE_AND_LINE=${WHERE%:*}
LINE=${FILE_AND_LINE#*:}
END=$(tail -n "+${LINE}" < "$FILE" | grep -n ';$');
NUM=${END%%:*}
if grep -q "$SYMBOL.*mock empty" "$FILE"; then
STUB="{ }"
else
# \n on RHS is a GNU extension, and we want to work on FreeBSD
# shellcheck disable=SC1004
STUB='\
{ fprintf(stderr, "'$SYMBOL' called!\\n"); abort(); }'
fi
echo "/* Generated stub for $SYMBOL */"
tail -n "+${LINE}" < "$FILE" | head -n "$NUM" | sed 's/^extern *//' | sed 's/PRINTF_FMT([^)]*)//' | sed 's/NON_NULL_ARGS([^)]*)//' | sed 's/NO_NULL_ARGS//g' | sed 's/NORETURN//g' | sed 's/LAST_ARG_NULL//g' | sed 's/WARN_UNUSED_RESULT//g' | sed 's/,/ UNNEEDED,/g' | sed 's/\([a-z0-9A-Z*_]* [a-z0-9A-Z*_]*\));/\1 UNNEEDED);/' | sed "s/;\$/$STUB/" | sed 's/[[:space:]]*$//'
done