| #!/bin/sh |
| |
| srcdir="$(cd "${0%/*}" && pwd)" |
| driver="$srcdir/driver.sh" |
| srcdir="$srcdir/tests" |
| sim= |
| rm_logs=true |
| dst=. |
| testflags= |
| |
| usage() { |
| cat <<EOF |
| Usage: $0 [Options] <g++ invocation> |
| |
| Options: |
| -h, --help Print this message and exit. |
| --srcdir <path> The source directory of the tests (default: $srcdir). |
| --sim <executable> Path to an executable that is prepended to the test |
| execution binary (default: none). |
| --keep-intermediate-logs |
| Keep intermediate logs. |
| --testflags <flags> Force initial TESTFLAGS contents. |
| -d <path>, --destination <path> |
| Destination for the generated Makefile. If the directory |
| does not exist it is created (default: $dst). |
| EOF |
| } |
| |
| while [ $# -gt 0 ]; do |
| case "$1" in |
| -h|--help) |
| usage |
| exit |
| ;; |
| --testflags) |
| testflags="$2" |
| shift |
| ;; |
| --testflags=*) |
| testflags="${1#--testflags=}" |
| ;; |
| -d|--destination) |
| dst="$2" |
| shift |
| ;; |
| --destination=*) |
| dst="${1#--destination=}" |
| ;; |
| --keep-intermediate-logs) |
| rm_logs=false |
| ;; |
| --srcdir) |
| srcdir="$2" |
| shift |
| ;; |
| --srcdir=*) |
| srcdir="${1#--srcdir=}" |
| ;; |
| --sim) |
| sim="$2" |
| shift |
| ;; |
| --sim=*) |
| sim="${1#--sim=}" |
| ;; |
| --) |
| shift |
| break |
| ;; |
| *) |
| break |
| ;; |
| esac |
| shift |
| done |
| |
| mkdir -p "$dst" |
| dst="$dst/Makefile" |
| if [ -f "$dst" ]; then |
| echo "Error: $dst already exists. Aborting." 1>&2 |
| exit 1 |
| fi |
| |
| CXX="$1" |
| shift |
| |
| echo "TESTFLAGS ?=" > "$dst" |
| echo "test_flags := $testflags \$(TESTFLAGS)" >> "$dst" |
| echo CXXFLAGS = "$@" "\$(test_flags)" >> "$dst" |
| [ -n "$sim" ] && echo "export GCC_TEST_SIMULATOR = $sim" >> "$dst" |
| cat >> "$dst" <<EOF |
| srcdir = ${srcdir} |
| CXX = ${CXX} |
| DRIVER = ${driver} |
| DRIVEROPTS ?= |
| driveroptions := \$(DRIVEROPTS) |
| |
| all: simd_testsuite.sum |
| |
| simd_testsuite.sum: .progress .progress_total simd_testsuite.log |
| @printf "\n\t\t=== simd_testsuite \$(test_flags) Summary ===\n\n"\\ |
| "# of expected passes:\t\t\$(shell grep -c '^PASS:' \$@)\n"\\ |
| "# of unexpected passes:\t\t\$(shell grep -c '^XPASS:' \$@)\n"\\ |
| "# of unexpected failures:\t\$(shell grep -c '^FAIL:' \$@)\n"\\ |
| "# of expected failures:\t\t\$(shell grep -c '^XFAIL:' \$@)\n"\\ |
| "# of unsupported tests:\t\t\$(shell grep -c '^UNSUPPORTED:' \$@)\n"\\ |
| | tee -a \$@ |
| |
| EOF |
| |
| matches() { |
| eval "case '$1' in |
| $2) return 0;; esac" |
| return 1 |
| } |
| |
| cxx_type() { |
| case "$1" in |
| ldouble) echo "long double";; |
| ullong) echo "unsigned long long";; |
| ulong) echo "unsigned long";; |
| llong) echo "long long";; |
| uint) echo "unsigned int";; |
| ushort) echo "unsigned short";; |
| uchar) echo "unsigned char";; |
| schar) echo "signed char";; |
| *) echo "$1";; |
| esac |
| } |
| |
| filter_types() { |
| only="$1" |
| skip="$2" |
| shift 2 |
| if [ -z "$only" -a -z "$skip" ]; then |
| for x in "$@"; do |
| cxx_type "$x" |
| echo "$x" |
| done |
| elif [ -z "$skip" ]; then |
| for x in "$@"; do |
| if matches "$x" "$only"; then |
| cxx_type "$x" |
| echo "$x" |
| fi |
| done |
| elif [ -z "$only" ]; then |
| for x in "$@"; do |
| matches "$x" "$skip" && continue |
| cxx_type "$x" |
| echo "$x" |
| done |
| else |
| for x in "$@"; do |
| matches "$x" "$skip" && continue |
| if matches "$x" "$only"; then |
| cxx_type "$x" |
| echo "$x" |
| fi |
| done |
| fi |
| } |
| |
| all_types() { |
| src="$1" |
| only= |
| skip= |
| if [ -n "$src" ]; then |
| only="$(head -n25 "$src"| grep '^//\s*only: [^ ]* \* \* \*')" |
| only="${only#*: }" |
| only="${only%% *}" |
| skip="$(head -n25 "$src"| grep '^//\s*skip: [^ ]* \* \* \*')" |
| skip="${skip#*: }" |
| skip="${skip%% *}" |
| fi |
| filter_types "$only" "$skip" \ |
| "ldouble" \ |
| "double" \ |
| "float" \ |
| "llong" \ |
| "ullong" \ |
| "ulong" \ |
| "long" \ |
| "int" \ |
| "uint" \ |
| "short" \ |
| "ushort" \ |
| "char" \ |
| "schar" \ |
| "uchar" \ |
| "char32_t" \ |
| "char16_t" \ |
| "wchar_t" |
| } |
| |
| all_tests() { |
| if [ -f testsuite_files_simd ]; then |
| sed 's,^experimental/simd/tests/,,' testsuite_files_simd | while read file; do |
| echo "$srcdir/$file" |
| echo "${file%.cc}" |
| done |
| else |
| for file in ${srcdir}/*.cc; do |
| echo "$file" |
| name="${file%.cc}" |
| echo "${name##*/}" |
| done |
| fi |
| } |
| |
| { |
| rmline="" |
| if $rm_logs; then |
| rmline=" |
| @rm \$^ \$(^:log=sum)" |
| fi |
| echo -n "simd_testsuite.log:" |
| all_tests | while read file && read name; do |
| echo -n " $name.log" |
| done |
| cat <<EOF |
| |
| @cat $^ > \$@ |
| @cat \$(^:log=sum) > \$(@:log=sum)${rmline} |
| |
| EOF |
| all_tests | while read file && read name; do |
| echo -n "$name.log:" |
| all_types "$file" | while read t && read type; do |
| echo -n " $name-$type.log" |
| done |
| cat <<EOF |
| |
| @cat $^ > \$@ |
| @cat \$(^:log=sum) > \$(@:log=sum)${rmline} |
| |
| EOF |
| done |
| all_types | while read t && read type; do |
| cat <<EOF |
| %-$type.log: %-$type-0.log %-$type-1.log %-$type-2.log %-$type-3.log \ |
| %-$type-4.log %-$type-5.log %-$type-6.log %-$type-7.log \ |
| %-$type-8.log %-$type-9.log |
| @cat \$^ > \$@ |
| @cat \$(^:log=sum) > \$(@:log=sum)${rmline} |
| |
| EOF |
| for i in $(seq 0 9); do |
| cat <<EOF |
| %-$type-$i.log: \$(srcdir)/%.cc |
| @\$(DRIVER) \$(driveroptions) -t "$t" -a $i -n \$* \$(CXX) \$(CXXFLAGS) |
| |
| EOF |
| done |
| done |
| cat <<EOF |
| run-%: export GCC_TEST_RUN_EXPENSIVE=yes |
| run-%: driveroptions += -vv |
| run-%: %.log |
| @rm \$^ \$(^:log=sum) |
| |
| help: .make_help.txt |
| @cat \$< |
| |
| EOF |
| dsthelp="${dst%Makefile}.make_help.txt" |
| cat <<EOF > "$dsthelp" |
| use DRIVEROPTS=<options> to pass the following options: |
| -q, --quiet Disable same-line progress output (default if stdout is |
| not a tty). |
| -p, --percentage Add percentage to default same-line progress output. |
| -v, --verbose Print one line per test and minimal extra information on |
| failure. |
| -vv Print all compiler and test output. |
| -k, --keep-failed Keep executables of failed tests. |
| --sim <executable> Path to an executable that is prepended to the test |
| execution binary (default: the value of |
| GCC_TEST_SIMULATOR). |
| --timeout-factor <x> |
| Multiply the default timeout with x. |
| -x, --run-expensive Compile and run tests marked as expensive (default: |
| true if GCC_TEST_RUN_EXPENSIVE is set, false otherwise). |
| -o <pattern>, --only <pattern> |
| Compile and run only tests matching the given pattern. |
| |
| use TESTFLAGS=<flags> to pass additional compiler flags |
| |
| The following are some of the valid targets for this Makefile: |
| ... all |
| ... clean |
| ... help" |
| EOF |
| N=$(((0$( |
| all_tests | while read file && read name; do |
| all_types "$file" | printf " + %d" $(wc -l) |
| done) ) * 5)) |
| all_tests | while read file && read name; do |
| echo "... run-${name}" |
| all_types "$file" | while read t && read type; do |
| echo "... run-${name}-${type}" |
| for i in $(seq 0 9); do |
| echo "... run-${name}-${type}-$i" |
| done |
| done |
| done >> "$dsthelp" |
| cat <<EOF |
| |
| .progress: |
| @echo 0 > .progress |
| |
| .progress_total: |
| @echo $N > .progress_total |
| |
| clean: |
| rm -f -- *.sum *.log *.exe .progress .progress_total |
| |
| .PHONY: all clean help .progress .progress_total |
| |
| .PRECIOUS: %.log %.sum |
| EOF |
| } >> "$dst" |
| |