| #!/bin/sh |
| |
| # |
| # This script is designed to quickly create lots of files in underlying |
| # test-* directories, do lots of other magic stuff and exit cleanly. |
| # |
| |
| set -e |
| |
| if [ "x$1" = "x" ]; then |
| echo "Usage: $0 <check-NN.c>" |
| exit |
| fi |
| |
| srcdir="${srcdir:-.}" |
| abs_top_srcdir="${abs_top_srcdir:-$(pwd)/../../}" |
| abs_top_builddir="${abs_top_builddir:-$(pwd)/../../}" |
| |
| if echo "$*" | grep -q -- -- ; then |
| TEST_DRIVER=$(echo "$*" | sed -e 's/ -- .*/ -- /g') |
| source_full=$(echo "$*" | sed -e 's/.* //g') |
| else |
| TEST_DRIVER="" |
| source_full="$1" |
| fi |
| |
| # Compute the .asn1 spec name by the given file name. |
| source_short=$(echo "$source_full" | sed -e 's/.*\///') |
| testno=$(echo "$source_short" | cut -f2 -d'-' | cut -f1 -d'.') |
| |
| CODECS_FLAGS="" |
| has_oer=$(echo "$source_short" | grep "gen-OER" || :) |
| if [ ! "$has_oer" ]; then |
| CODECS_FLAGS="${CODECS_FLAGS} -DASN_DISABLE_OER_SUPPORT" |
| fi |
| has_per=$(echo "$source_short" | grep "gen-PER" || :) |
| if [ ! "$has_per" ]; then |
| CODECS_FLAGS="${CODECS_FLAGS} -DASN_DISABLE_PER_SUPPORT" |
| fi |
| |
| args=$(echo "$source_short" | sed -E -e 's/\.c+$//') |
| source_obj=$(echo "$source_short" | sed -E -e 's/\.c+$/.o/') |
| |
| OFS=$IFS |
| IFS="." |
| set $args |
| shift |
| IFS=$OFS |
| AFLAGS="$*" |
| |
| # Assume the test fails. Will be removed when it passes well. |
| testdir=test-${args} |
| if [ -f "${testdir}-FAILED" ]; then |
| rm -rf "${testdir}" |
| fi |
| touch "${testdir}-FAILED" |
| |
| mkdir -p "${testdir}" |
| ln -fns "../${source_full}" "${testdir}" |
| |
| if test "${LIBFUZZER_CFLAGS}" && grep LLVMFuzzer ${source_full} > /dev/null; |
| then |
| MAKE_FUZZER=yes |
| else |
| MAKE_FUZZER=no |
| fi |
| |
| asn_module=$(echo "${abs_top_srcdir}/tests/tests-asn1c-compiler/${testno}"-*.asn1) |
| |
| AUTOGENERATED="# This file is autogenerated by $0 ${source_full} ${AFLAGS}" |
| |
| # Create a common Makefile for the project |
| cat <<TARGETS > "${testdir}/Makefile.targets" |
| ${AUTOGENERATED} |
| |
| COMMON_FLAGS= -I. |
| CFLAGS = \${COMMON_FLAGS} ${CFLAGS:-} -g -O1 |
| CFLAGS += -DSRCDIR=../${srcdir} ${CODECS_FLAGS} |
| CXXFLAGS = \${CFLAGS} ${CXXFLAGS} |
| LIBFUZZER_CFLAGS = ${LIBFUZZER_CFLAGS} |
| LDFLAGS = ${LDFLAGS:-} |
| |
| CC ?= ${CC} |
| CXX ?= ${CXX} |
| |
| all: compiled-module |
| \$(MAKE) check-executable |
| |
| check-executable: \$(OBJS) |
| @rm -f *.core |
| \$(CC) \$(CFLAGS) \$(LDFLAGS) -o check-executable \$(OBJS) -lm |
| |
| # Compile the corresponding .asn1 spec. |
| compiled-module: ${asn_module} ${abs_top_builddir}/asn1c/asn1c |
| ${abs_top_builddir}/asn1c/asn1c \\ |
| -S ${abs_top_srcdir}/skeletons \\ |
| -Wdebug-compiler \\ |
| ${AFLAGS} ${asn_module} |
| rm -f converter-sample.c |
| @touch compiled-module |
| |
| TARGETS |
| |
| |
| if [ "${MAKE_FUZZER}" != "yes" ]; then |
| CHECK_FUZZER=": # No fuzzer defined" |
| cat <<TARGETS >> "${testdir}/Makefile.targets" |
| .PHONY check-fuzzer: |
| check-fuzzer: |
| TARGETS |
| else |
| CHECK_FUZZER="./check-fuzzer -timeout=3 -max_total_time=60 -max-len 512 -detect_leaks=1" |
| cat <<TARGETS >> "${testdir}/Makefile.targets" |
| check-fuzzer: \$(OBJS) |
| rm -f ${source_obj} |
| \$(CC) \$(CFLAGS) \$(LIBFUZZER_CFLAGS) -c -o ${source_obj} ${source_short} |
| \$(CC) \$(CFLAGS) \$(LIBFUZZER_CFLAGS) \$(LDFLAGS) -o check-fuzzer \$(OBJS) |
| rm -f ${source_obj} |
| TARGETS |
| fi |
| |
| cat <<TARGETS >> "${testdir}/Makefile.targets" |
| |
| check-succeeded: compiled-module |
| \$(MAKE) check-executable |
| \$(MAKE) check-fuzzer |
| @rm -f check-succeeded |
| ./check-executable |
| ${CHECK_FUZZER} |
| @touch check-succeeded |
| |
| check: check-succeeded |
| |
| clean: |
| @rm -f *.o check-executable |
| TARGETS |
| |
| # Create a BSD- or GNU-specific Makefile for the project. |
| produce_specific_makefile() { |
| local make_type=$1 |
| local make_file="$testdir/${make_type}makefile" |
| |
| if [ ${make_type} = "BSD" ]; then |
| cat <<-OBJECTS > ${make_file} |
| ${AUTOGENERATED} |
| SRCS_C!=find . -name \*.c |
| SRCS_CXX!=find . -name \*.cc |
| SRCS=\$(SRCS_C) \$(SRCS_CXX) |
| OBJS=\${SRCS_C:.c=.o} ${SRCS_CXX:.cc=.o} |
| .sinclude <Makefile.targets> |
| OBJECTS |
| else |
| cat <<-OBJECTS > ${make_file} |
| ${AUTOGENERATED} |
| SRCS_C := \$(wildcard *.c) |
| SRCS_CXX := \$(wildcard *.cc) |
| SRCS = \$(SRCS_C) \$(SRCS_CXX) |
| OBJS =\$(patsubst %.c,%.o,\$(SRCS_C)) |
| OBJS+=\$(patsubst %.cc,%.o,\$(SRCS_CXX)) |
| -include Makefile.targets |
| OBJECTS |
| fi |
| |
| } |
| |
| produce_specific_makefile BSD |
| produce_specific_makefile GNU |
| |
| # Perform building and checking |
| ${TEST_DRIVER} make -C "$testdir" check |
| |
| # Make sure the test is not marked as failed any longer. |
| rm -f "${testdir}-FAILED" |