diff --git a/Makefile b/Makefile index 084b7cdf1..3a1d5ad98 100644 --- a/Makefile +++ b/Makefile @@ -281,19 +281,7 @@ clean: wire-clean find . -name '*gcno' -delete update-mocks/%: % - @set -e; BASE=/tmp/mocktmp.$$$$.`echo $* | tr / _`; trap "rm -f $$BASE.*" EXIT; \ - START=`fgrep -n '/* AUTOGENERATED MOCKS START */' $< | cut -d: -f1`;\ - END=`fgrep -n '/* AUTOGENERATED MOCKS END */' $< | cut -d: -f1`; \ - if [ -n "$$START" ]; then \ - echo $<: ; \ - head -n $$START $< > $$BASE.new; \ - (cat $$BASE.new; tail -n +$$END $<) > $$BASE.test.c; \ - if ! $(CC) $(CFLAGS) $$BASE.test.c -o $$BASE.out $(HELPER_OBJS) $(CCAN_OBJS) $(LDLIBS) 2>$$BASE.err; then \ - test/scripts/mockup.sh < $$BASE.err >> $$BASE.new; \ - sed -n 's,.*Generated stub for \(.*\) .*,\t\1,p' < $$BASE.new; \ - fi; \ - tail -n +$$END $< >> $$BASE.new; mv $$BASE.new $<; \ - fi + @tools/update-mocks.sh "$*" unittest/%: % $(VALGRIND) $(VALGRIND_TEST_ARGS) $* diff --git a/test/scripts/mockup.sh b/tools/mockup.sh similarity index 94% rename from test/scripts/mockup.sh rename to tools/mockup.sh index 1c88f3042..1fd293ab4 100755 --- a/test/scripts/mockup.sh +++ b/tools/mockup.sh @@ -15,7 +15,7 @@ if [ $# -eq 0 ]; then fi for SYMBOL; do - WHERE=$(grep -nH "^[a-z0-9_ ]* [*]*$SYMBOL(" daemon/*.h) + WHERE=$(grep -nH "^[a-z0-9_ ]* [*]*$SYMBOL(" */*.h ) if [ x"$WHERE" != x ]; then STUB='\n{ fprintf(stderr, "'$SYMBOL' called!\\n"); abort(); }' else diff --git a/tools/update-mocks.sh b/tools/update-mocks.sh new file mode 100755 index 000000000..4802f9147 --- /dev/null +++ b/tools/update-mocks.sh @@ -0,0 +1,39 @@ +#! /bin/sh +# Script to rewrite the autogenerated mocks in a unit test between +# /* AUTOGENERATED MOCKS START */ and /* AUTOGENERATED MOCKS END */ +# based on link failures. + +set -e +FILE="$1" + +BASE=/tmp/mocktmp.$$.`echo $@ | tr / _` +trap "mv $BASE.old $FILE; rm -f $BASE.*" EXIT + +START=`fgrep -n '/* AUTOGENERATED MOCKS START */' $FILE | cut -d: -f1` +END=`fgrep -n '/* AUTOGENERATED MOCKS END */' $FILE | cut -d: -f1` + +if [ -n "$START" ]; then + mv $FILE $BASE.old + echo $FILE: + head -n $START $BASE.old > $FILE + tail -n +$END $BASE.old >> $FILE + # Try to make binary. + if ! make `echo $FILE | sed 's/.c$//'` 2> $BASE.err >/dev/null; then + tools/mockup.sh < $BASE.err >> $BASE.stubs + # If there are no link errors, maybe compile fail for other reason? + if ! fgrep -q 'Generated stub for' $BASE.stubs; then + cat $BASE.err + exit 1 + fi + sed -n 's,.*Generated stub for \(.*\) .*,\t\1,p' < $BASE.stubs + head -n $START $BASE.old > $FILE + cat $BASE.stubs >> $FILE + tail -n +$END $BASE.old >> $FILE + else + echo "...build succeeded without stubs" + fi +fi + +# All good. +rm -f $BASE.* +trap "" EXIT