diff --git a/header_compilation_tests.sh b/header_compilation_tests.sh index aaf44c842..b64d850f2 100755 --- a/header_compilation_tests.sh +++ b/header_compilation_tests.sh @@ -1,7 +1,9 @@ #!/bin/bash +export LOCALE=C set -e -exec >&2 + +exec 2>&1 if [[ ! -e build/release/include/rocblas-export.h ]]; then echo "Please run this script after at least one build of rocBLAS." @@ -10,26 +12,6 @@ fi script=$(realpath "$0") -echocmd() -{ - cat < and (sometimes due to bugs) are -incompatible with C, so they should only be included in the rocBLAS internal -C++ implemenation, not in the public headers, which must be compatible with C. - -EOF -} - # Returns whether the output file is up to date. # Prints the output file. # The first argument is the source header file name. @@ -38,9 +20,10 @@ EOF out_uptodate() { local file="$1_$2" - local out="build/compilation_tests/$file.o" - mkdir -p $(dirname "$out") - realpath "$out" + local filename="build/compilation_tests/$file.o" + mkdir -p $(dirname "$filename") + local out=$(realpath -m "$filename") + echo "$out" [[ -n "$3" && "$out" -nt "$script" ]] || return find library clients \( -iname \*.hpp -o -iname \*.h \) -print0 \ | while read -r -d $'\0' file; do @@ -61,24 +44,50 @@ C99="$HCC -xc-header -std=c99" CPP11="$HCC -xc++-header -std=c++11" CPP14="$HCC -xc++-header -std=c++14" +if [[ -e /.dockerenv ]]; then + NP=4 # limit parallelism to 4 +else + NP=0 # unlimited +fi + +# xargs commands to perform parallel builds +xargs_coproc() +{ + { coproc { xargs "-P$NP" -d "\n" -n1 /bin/bash -xc --; } 4>&1 >&3 2>&1; } 3>&1 + XARGS_PID=$! + exec {XARGS_OUT}<&${COPROC[0]}- {XARGS_IN}>&${COPROC[1]}- + echo true >&$XARGS_IN # At least one command is necessary +} + +xargs_wait() +{ + XARGS_OUTPUT="" + exec {XARGS_IN}<&- + if ! wait $XARGS_PID; then + read -t 0.1 -u $XARGS_OUT XARGS_OUTPUT + return 1 + fi +} + # Every header file must compile on its own, by including all of its # dependencies. This avoids creating dependencies on the order of -# included files. We define _ROCBLAS_INTERNAL_BFLOAT16_ to enable the -# internal rocblas_bfloat16 code. testing_trmm.hpp is excluded for now. +# included files. testing_trmm.hpp is excluded for now. # +xargs_coproc find library clients \( -iname \*.hpp -o -iname \*.h \) \ \! -name testing_trmm.hpp -print0 | while read -r -d $'\0' file; do - if ! out=$(out_uptodate $file cpp14 true) && \ - ! echocmd $CPP14 -c -o "$out" -D_ROCBLAS_INTERNAL_BFLOAT16_ \ - $HCC_OPTS $GPU_OPTS "$file"; then - rm -f "$out" + out=$(out_uptodate "$file" cpp14 true) || \ + echo "$CPP14 -c -o "$out" $HCC_OPTS $GPU_OPTS "$file" || (rm -f "$out"; echo "$file" >&4; exit 255)" >&$XARGS_IN +done + +if ! xargs_wait; then cat <&4; exit 255)" >&$XARGS_IN + done + + if ! xargs_wait; then + cat < and (sometimes due to bugs) are +incompatible with C, so they should only be included in the rocBLAS internal +C++ implemenation, not in the public headers, which must be compatible with C. EOF - hip_warning - exit 1 - fi + exit 1 fi - if ! out=$(out_uptodate $file c99) && \ - ! echocmd $C99 -c -o "$out" $HCC_OPTS $GPU_OPTS $file; then - rm -f "$out" - cat <&4; exit 255)" >&$XARGS_IN +done + +if ! xargs_wait; then + cat < and (sometimes due to bugs) are +incompatible with C, so they should only be included in the rocBLAS internal +C++ implemenation, not in the public headers, which must be compatible with C. EOF - hip_warning exit 1 - elif ! out=$(out_uptodate $file cpp11) && \ - ! echocmd $CPP11 -c -o "$out" $HCC_OPTS $GPU_OPTS $file; then - rm -f "$out" +fi + +xargs_coproc +for file in library/include/*.{h,in}; do + out=$(out_uptodate $file cpp11) || + echo "$CPP11 -c -o "$out" $HCC_OPTS $GPU_OPTS "$file" || (rm -f "$out"; echo "$file" >&4; exit 255)" >&$XARGS_IN +done + +if ! xargs_wait; then cat <