forked from LeenkxTeam/LNXSDK
		
	
		
			
	
	
		
			454 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			454 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|  | #! /bin/sh | ||
|  | 
 | ||
|  | # This is a script for the use of PCRE2 maintainers. It configures and rebuilds | ||
|  | # PCRE2 with a variety of configuration options, and in each case runs the | ||
|  | # tests to ensure that all goes well. Every possible combination would take far | ||
|  | # too long, so we use a representative sample. This script should be run in the | ||
|  | # PCRE2 source directory. | ||
|  | 
 | ||
|  | # While debugging, it is sometimes useful to be able to cut out some of the | ||
|  | # tests, in order to run those that are giving errors. The following options | ||
|  | # do this: | ||
|  | # | ||
|  | # -noasan         skip the test that uses -fsanitize=address | ||
|  | # -nousan         skip the test that uses -fsanitize=undefined | ||
|  | # -nodebug        skip the test that uses --enable-debug | ||
|  | # -nojit          skip all JIT tests | ||
|  | # -nojitmain      skip non-valgrind JIT tests | ||
|  | # -nojitvalgrind  skip JIT tests with valgrind | ||
|  | # -nomain         skip all the main (non-JIT) set of tests | ||
|  | # -nomainvalgrind skip the main (non-JIT) valgrind tests | ||
|  | # -notmp          skip the test in a temporary directory | ||
|  | # -novalgrind     skip all the valgrind tests | ||
|  | 
 | ||
|  | # Alternatively, if any of those names are given with '+' instead of '-no', | ||
|  | # only those groups named with '+' are run (e.g. +jit). If -dummy is given, | ||
|  | # no tests are actually run - this provides a means of testing the selectors. | ||
|  | 
 | ||
|  | # The -v option causes a call to 'pcre2test -C' to happen for each | ||
|  | # configuration. | ||
|  | 
 | ||
|  | useasan=1 | ||
|  | useusan=1 | ||
|  | usedebug=1 | ||
|  | usejit=1 | ||
|  | usejitvalgrind=1 | ||
|  | usemain=1 | ||
|  | usemainvalgrind=1 | ||
|  | usetmp=1 | ||
|  | usevalgrind=1 | ||
|  | 
 | ||
|  | dummy=0 | ||
|  | seenplus=0 | ||
|  | verbose=0 | ||
|  | 
 | ||
|  | while [ $# -gt 0 ] ; do | ||
|  |   case $1 in | ||
|  |     +*) if [ $seenplus -eq 0 ]; then | ||
|  |           useasan=0 | ||
|  |           useusan=0 | ||
|  |           usedebug=0 | ||
|  |           usejit=0 | ||
|  |           usejitvalgrind=0 | ||
|  |           usemain=0 | ||
|  |           usemainvalgrind=0 | ||
|  |           usetmp=0 | ||
|  |           seenplus=1 | ||
|  |         fi;; | ||
|  |   esac | ||
|  | 
 | ||
|  |   case $1 in | ||
|  |     -dummy)          dummy=1;; | ||
|  |     -v)              verbose=1;; | ||
|  |     -noasan)         useasan=0;; | ||
|  |     -nousan)         useusan=0;; | ||
|  |     -nodebug)        usedebug=0;; | ||
|  |     -nojit)          usejit=0; usejitvalgrind=0;; | ||
|  |     -nojitmain)      usejit=0;; | ||
|  |     -nojitvalgrind)  usejitvalgrind=0;; | ||
|  |     -nomain)         usemain=0; usemainvalgrind=0;; | ||
|  |     -nomainvalgrind) usemainvalgrind=0;; | ||
|  |     -notmp)          usetmp=0;; | ||
|  |     -novalgrind)     usevalgrind=0;; | ||
|  |     +asan)           useasan=1;; | ||
|  |     +usan)           useusan=1;; | ||
|  |     +debug)          usedebug=1;; | ||
|  |     +jit)            usejit=1; usejitvalgrind=1;; | ||
|  |     +jitmain)        usejit=1;; | ||
|  |     +jitvalgrind)    usejitvalgrind=1;; | ||
|  |     +main)           usemain=1; usemainvalgrind=1;; | ||
|  |     +mainvalgrind)   usemainvalgrind=1;; | ||
|  |     +tmp)            usetmp=1;; | ||
|  |     +valgrind)       usevalgrind=1; usejitvalgrind=1; usemainvalgrind=1;; | ||
|  |     *)               echo "Unknown option '$1'"; exit 1;; | ||
|  |   esac | ||
|  |   shift | ||
|  | done | ||
|  | 
 | ||
|  | if [ $usejitvalgrind -eq 0 -a $usemainvalgrind -eq 0 ] ; then | ||
|  |   usevalgrind=0 | ||
|  | fi | ||
|  | 
 | ||
|  | # This is in case the caller has set aliases (as I do - PH) | ||
|  | 
 | ||
|  | unset cp ls mv rm | ||
|  | 
 | ||
|  | # This is a temporary directory for testing out-of-line builds | ||
|  | 
 | ||
|  | tmp=/tmp/pcre2testing | ||
|  | 
 | ||
|  | # Don't bother with compiler optimization for most tests; it just slows down | ||
|  | # compilation a lot (and running the tests themselves is quick). However, one | ||
|  | # special test turns optimization on, because it can provoke some compiler | ||
|  | # warnings. | ||
|  | 
 | ||
|  | CFLAGS="-g" | ||
|  | OFLAGS="-O0" | ||
|  | ISGCC=0 | ||
|  | 
 | ||
|  | # If the compiler is gcc, add a lot of warning switches. | ||
|  | 
 | ||
|  | cc --version >/tmp/pcre2ccversion 2>/dev/null | ||
|  | if [ $? -eq 0 ] && grep GCC /tmp/pcre2ccversion >/dev/null; then | ||
|  |   ISGCC=1 | ||
|  |   CFLAGS="$CFLAGS -Wall" | ||
|  |   CFLAGS="$CFLAGS -Wno-overlength-strings" | ||
|  |   CFLAGS="$CFLAGS -Wpointer-arith" | ||
|  |   CFLAGS="$CFLAGS -Wwrite-strings" | ||
|  |   CFLAGS="$CFLAGS -Wundef -Wshadow" | ||
|  |   CFLAGS="$CFLAGS -Wmissing-field-initializers" | ||
|  |   CFLAGS="$CFLAGS -Wunused-parameter" | ||
|  |   CFLAGS="$CFLAGS -Wextra -Wformat" | ||
|  |   CFLAGS="$CFLAGS -Wbad-function-cast" | ||
|  |   CFLAGS="$CFLAGS -Wmissing-declarations" | ||
|  |   CFLAGS="$CFLAGS -Wnested-externs" | ||
|  |   CFLAGS="$CFLAGS -pedantic" | ||
|  |   CFLAGS="$CFLAGS -Wuninitialized" | ||
|  |   CFLAGS="$CFLAGS -Wmaybe-uninitialized"  | ||
|  |   CFLAGS="$CFLAGS -Wmissing-prototypes" | ||
|  |   CFLAGS="$CFLAGS -Wstrict-prototypes" | ||
|  | fi | ||
|  | rm -f /tmp/pcre2ccversion | ||
|  | 
 | ||
|  | # This function runs a single test with the set of configuration options that | ||
|  | # are in $opts. The source directory must be set in srcdir. The function must | ||
|  | # be defined as "runtest()" not "function runtest()" in order to run on | ||
|  | # Solaris. | ||
|  | 
 | ||
|  | runtest() | ||
|  |   { | ||
|  |   rm -f $srcdir/pcre2test $srcdir/pcre2grep $srcdir/pcre2_jit_test | ||
|  |   testcount=`expr $testcount + 1` | ||
|  | 
 | ||
|  |   if [ "$opts" = "" ] ; then | ||
|  |     echo "[$testcount/$testtotal] Configuring with: default settings" | ||
|  |   else | ||
|  |     echo "[$testcount/$testtotal] Configuring with:" | ||
|  |     echo "  $opts" | ||
|  |   fi | ||
|  | 
 | ||
|  |   if [ $dummy -eq 1 ]; then return; fi | ||
|  | 
 | ||
|  |   CFLAGS="$CFLAGS" \ | ||
|  |     $srcdir/configure $opts >/dev/null 2>teststderrM | ||
|  |   if [ $? -ne 0 ]; then | ||
|  |     echo " " | ||
|  |     echo "******** Error while configuring ********" | ||
|  |     cat teststderrM | ||
|  |     exit 1 | ||
|  |   fi | ||
|  | 
 | ||
|  | # There is an infelicity in the Autotools world (as of October 2015) which | ||
|  | # causes the message | ||
|  | # | ||
|  | # ar: `u' modifier ignored since `D' is the default (see `U') | ||
|  | # | ||
|  | # to be output while linking. This triggers an unwanted error report from this | ||
|  | # script, because it expects no stderr output while making. To get round this | ||
|  | # we filter the stderr output through sed, removing all occurrences of the | ||
|  | # above lines. Just for paranoia, check that sed is available before doing | ||
|  | # this. | ||
|  | 
 | ||
|  |   echo "Making" | ||
|  |   make -j >/dev/null 2>teststderrM | ||
|  |   makeRC=$? | ||
|  |   if command -v sed >/dev/null 2>&1 ; then | ||
|  |     sed "/\`u' modifier ignored since \`D' is the default/ d" \ | ||
|  |       teststderrM > teststderrMM | ||
|  |     mv -f teststderrMM teststderrM | ||
|  |   fi | ||
|  |   if [ $makeRC -ne 0 -o -s teststderrM ]; then | ||
|  |     echo " " | ||
|  |     echo "******** Errors or warnings while making ********" | ||
|  |     echo " " | ||
|  |     cat teststderrM | ||
|  |     exit 1 | ||
|  |   fi | ||
|  | 
 | ||
|  |   if [ $verbose -eq 1 ]; then | ||
|  |     ./pcre2test -C | ||
|  |   fi | ||
|  | 
 | ||
|  |   ./pcre2test -C jit >/dev/null | ||
|  |   jit=$? | ||
|  |   ./pcre2test -C pcre2-8 >/dev/null | ||
|  |   pcre2_8=$? | ||
|  | 
 | ||
|  |   echo "Running PCRE2 library tests $withvalgrind" | ||
|  |   $srcdir/RunTest $valgrind >teststdoutM 2>teststderrM | ||
|  | 
 | ||
|  |   if [ $? -ne 0 -o -s teststderrM ]; then | ||
|  |     echo " " | ||
|  |     echo "**** Test failed ****" | ||
|  |     if [ -s teststderrM ] ; then | ||
|  |       cat teststderrM | ||
|  |     else | ||
|  |       cat teststdoutM | ||
|  |     fi | ||
|  |     exit 1 | ||
|  |   fi | ||
|  | 
 | ||
|  |   if [ $pcre2_8 -gt 0 ]; then | ||
|  |     echo "Running pcre2grep tests $withvalgrind" | ||
|  |     $srcdir/RunGrepTest $valgrind >teststdoutM 2>teststderrM | ||
|  |     if [ $? -ne 0 -o -s teststderrM ]; then | ||
|  |       echo " " | ||
|  |       echo "**** Test failed ****" | ||
|  |       cat teststderrM | ||
|  |       cat teststdoutM | ||
|  |       exit 1 | ||
|  |     fi | ||
|  |   else | ||
|  |     echo "Skipping pcre2grep tests: 8-bit library not compiled" | ||
|  |   fi | ||
|  | 
 | ||
|  |   if [ "$jit" -gt 0 ]; then | ||
|  |     echo "Running JIT regression tests $withvalgrind" | ||
|  |     $jrvalgrind $srcdir/pcre2_jit_test >teststdoutM 2>teststderrM | ||
|  |     if [ $? -ne 0 -o -s teststderrM ]; then | ||
|  |       echo " " | ||
|  |       echo "**** Test failed ****" | ||
|  |       cat teststderrM | ||
|  |       cat teststdoutM | ||
|  |       exit 1 | ||
|  |     fi | ||
|  |   else | ||
|  |     echo "Skipping JIT regression tests: JIT is not enabled" | ||
|  |   fi | ||
|  |   } | ||
|  | 
 | ||
|  | # Update the total count whenever a new test is added; it is used to show | ||
|  | # progess as each test is run. | ||
|  | 
 | ||
|  | testtotal=`expr 17 \* $usemain + \ | ||
|  |   1 \* $usemain \* $usedebug + \ | ||
|  |   1 \* $usetmp + \ | ||
|  |   1 \* $ISGCC \* $usemain + \ | ||
|  |   1 \* $ISGCC \* $usemain \* $useasan + \ | ||
|  |   1 \* $ISGCC \* $usemain \* $useusan + \ | ||
|  |   13 \* $usejit + \ | ||
|  |   2 \* $usemainvalgrind + \ | ||
|  |   2 \* $usejitvalgrind` | ||
|  | 
 | ||
|  | testcount=0 | ||
|  | 
 | ||
|  | if [ $testtotal -eq 0 ] ; then | ||
|  |   echo "** No tests selected" | ||
|  |   exit 1 | ||
|  | fi | ||
|  | 
 | ||
|  | valgrind= | ||
|  | jrvalgrind= | ||
|  | withvalgrind= | ||
|  | srcdir=. | ||
|  | export srcdir | ||
|  | 
 | ||
|  | if [ $usejit -ne 0 ]; then | ||
|  |   enable_jit=--enable-jit | ||
|  | else | ||
|  |   enable_jit= | ||
|  | fi | ||
|  | 
 | ||
|  | # If gcc is in use, run a maximally configured test with -O2, because that can | ||
|  | # throw up warnings that are not detected with -O0. Then run a second test with | ||
|  | # -fsanitize=address, which also may throw up new warnings as well as checking | ||
|  | # things at runtime. Finally, run another test using -fsanitize=undefined | ||
|  | # -std-gnu99 to check for runtime actions that are not well defined. However, | ||
|  | # we also use -fno-sanitize=shift to avoid warnings for shifts of negative | ||
|  | # numbers, which occur in src/pcre2_jit_compile.c. | ||
|  | 
 | ||
|  | if [ $ISGCC -ne 0 -a $usemain -ne 0 ]; then | ||
|  |   echo "---------- Maximally configured test with -O2 ----------" | ||
|  |   SAVECFLAGS="$CFLAGS" | ||
|  |   CFLAGS="-O2 $CFLAGS" | ||
|  |   echo "CFLAGS=$CFLAGS" | ||
|  |   opts="--disable-shared $enable_jit --enable-pcre2-16 --enable-pcre2-32" | ||
|  |   runtest | ||
|  |   if [ $useasan -ne 0 ]; then | ||
|  |     echo "---------- Maximally configured test with -fsanitize=address ----------" | ||
|  | # Following a kernel change, sanitize address doesn't work unless the extra | ||
|  | # PIE options are also set. | ||
|  |     CFLAGS="$OFLAGS $SAVECFLAGS -no-pie -fno-PIE -fsanitize=address" | ||
|  |     echo "CFLAGS=$CFLAGS" | ||
|  |     opts="--disable-shared $enable_jit --enable-pcre2-16 --enable-pcre2-32" | ||
|  |     runtest | ||
|  |   fi | ||
|  | # This also seems to be the case for sanitize undefined.    | ||
|  |   if [ $useusan -ne 0 ]; then | ||
|  |     echo "------- Maximally configured test with -fsanitize=undefined -fno-sanitize=shift -fno-sanitize=alignment -std=gnu99 -------" | ||
|  |     CFLAGS="$OFLAGS $SAVECFLAGS -no-pie -fno-PIE -fsanitize=undefined -fno-sanitize=shift -fno-sanitize=alignment -std=gnu99" | ||
|  |     echo "CFLAGS=$CFLAGS" | ||
|  |     opts="--disable-shared $enable_jit --enable-pcre2-16 --enable-pcre2-32" | ||
|  |     runtest | ||
|  |   fi | ||
|  |   CFLAGS="$OFLAGS $SAVECFLAGS" | ||
|  | fi | ||
|  | 
 | ||
|  | # This set of tests builds PCRE2 and runs the tests with a variety of configure | ||
|  | # options, in the current (source) directory. The empty configuration builds | ||
|  | # with all the default settings. As well as testing that these options work, we | ||
|  | # use --disable-shared or --disable-static except for the default test (which | ||
|  | # builds both) to save a bit of time by building only one version of the | ||
|  | # library for the subsequent tests. | ||
|  | 
 | ||
|  | echo "---------- CFLAGS for the remaining tests ----------" | ||
|  | echo "CFLAGS=$CFLAGS" | ||
|  | 
 | ||
|  | if [ $usemain -ne 0 ]; then | ||
|  |   if [ $usedebug -ne 0 ]; then | ||
|  |     echo "---------- Maximally configured test with --enable-debug ----------" | ||
|  |     opts="--disable-shared $enable_jit --enable-pcre2-16 --enable-pcre2-32 --enable-debug" | ||
|  |     runtest | ||
|  |   fi | ||
|  | 
 | ||
|  |   echo "---------- Non-JIT tests in the current directory ----------" | ||
|  |   for opts in \ | ||
|  |     "" \ | ||
|  |     "--disable-static" \ | ||
|  |     "--disable-shared" \ | ||
|  |     "--disable-unicode --disable-shared --enable-never-backslash-C" \ | ||
|  |     "--with-link-size=3 --disable-shared --disable-pcre2grep-callout" \ | ||
|  |     "--disable-unicode --enable-rebuild-chartables --disable-shared" \ | ||
|  |     "--disable-unicode --enable-newline-is-any --disable-shared" \ | ||
|  |     "--disable-unicode --enable-newline-is-cr --disable-shared" \ | ||
|  |     "--disable-unicode --enable-newline-is-crlf --disable-shared" \ | ||
|  |     "--disable-unicode --enable-newline-is-anycrlf --enable-bsr-anycrlf --disable-shared" \ | ||
|  |     "--enable-newline-is-any --disable-static" \ | ||
|  |     "--disable-unicode --enable-pcre2-16" \ | ||
|  |     "--enable-pcre2-16 --disable-shared" \ | ||
|  |     "--disable-unicode --enable-pcre2-32" \ | ||
|  |     "--enable-pcre2-32 --disable-shared" \ | ||
|  |     "--disable-unicode --enable-pcre2-32 --enable-pcre2-16 --disable-shared" \ | ||
|  |     "--disable-unicode --enable-pcre2-32 --enable-pcre2-16 --disable-pcre2-8 --disable-shared" | ||
|  |   do | ||
|  |     runtest | ||
|  |   done | ||
|  | fi | ||
|  | 
 | ||
|  | # Now run the JIT tests unless disabled | ||
|  | 
 | ||
|  | if [ $usejit -ne 0 ]; then | ||
|  |   echo "---------- JIT tests in the current directory ----------" | ||
|  |   for opts in \ | ||
|  |     "--disable-unicode --enable-jit --disable-shared" \ | ||
|  |     "--enable-jit --disable-shared" \ | ||
|  |     "--enable-jit --with-link-size=3 --disable-shared" \ | ||
|  |     "--enable-jit --enable-pcre2-16 --disable-shared" \ | ||
|  |     "--disable-unicode --enable-jit --enable-pcre2-16 --disable-pcre2-8 --disable-shared" \ | ||
|  |     "--enable-jit --enable-pcre2-16 --disable-pcre2-8 --disable-shared" \ | ||
|  |     "--enable-jit --enable-pcre2-16 --with-link-size=3 --disable-shared" \ | ||
|  |     "--enable-jit --enable-pcre2-16 --with-link-size=4 --disable-shared" \ | ||
|  |     "--enable-jit --enable-pcre2-32 --disable-shared" \ | ||
|  |     "--disable-unicode --enable-jit --enable-pcre2-32 --disable-pcre2-8 --disable-shared" \ | ||
|  |     "--enable-jit --enable-pcre2-32 --disable-pcre2-8 --disable-shared" \ | ||
|  |     "--enable-jit --enable-pcre2-32 --with-link-size=4 --disable-shared" \ | ||
|  |     "--enable-jit --enable-pcre2-32 --enable-pcre2-16 --disable-pcre2-8 --enable-newline-is-anycrlf --enable-bsr-anycrlf --disable-shared" | ||
|  |   do | ||
|  |     runtest | ||
|  |   done | ||
|  | fi | ||
|  | 
 | ||
|  | # Now re-run some of the tests under valgrind. | ||
|  | 
 | ||
|  | if [ $usevalgrind -ne 0 ]; then | ||
|  |   echo "---------- Tests in the current directory using valgrind ----------" | ||
|  |   valgrind=valgrind | ||
|  |   withvalgrind="with valgrind" | ||
|  | 
 | ||
|  |   if [ $usemainvalgrind -ne 0 ]; then | ||
|  |     for opts in \ | ||
|  |       "--disable-shared" \ | ||
|  |       "--with-link-size=3 --enable-pcre2-16 --enable-pcre2-32 --disable-shared" | ||
|  |     do | ||
|  |       opts="--enable-valgrind $opts" | ||
|  |       runtest | ||
|  |     done | ||
|  |   fi | ||
|  | 
 | ||
|  |   if [ $usejitvalgrind -ne 0 ]; then | ||
|  |     jrvalgrind="valgrind --tool=memcheck -q --smc-check=all-non-file --suppressions=$srcdir/testdata/valgrind-jit.supp"  | ||
|  |     for opts in \ | ||
|  |       "--enable-jit --disable-shared" \ | ||
|  |       "--enable-jit --enable-pcre2-16 --enable-pcre2-32" | ||
|  |     do | ||
|  |       opts="--enable-valgrind $opts" | ||
|  |       runtest | ||
|  |     done | ||
|  |   fi | ||
|  | fi | ||
|  | 
 | ||
|  | valgrind= | ||
|  | jrvalgrind= | ||
|  | withvalgrind= | ||
|  | 
 | ||
|  | # Clean up the distribution and then do at least one build and test in a | ||
|  | # directory other than the source directory. It doesn't work unless the | ||
|  | # source directory is cleaned up first. | ||
|  | 
 | ||
|  | if [ -f Makefile ]; then | ||
|  |   echo "Running 'make distclean'" | ||
|  |   make distclean >/dev/null 2>&1 | ||
|  |   if [ $? -ne 0 ]; then | ||
|  |     echo "** 'make distclean' failed" | ||
|  |     exit 1 | ||
|  |   fi | ||
|  | fi | ||
|  | 
 | ||
|  | echo "---------- End of tests in the source directory ----------" | ||
|  | echo "Removing teststdoutM and teststderrM" | ||
|  | rm -rf teststdoutM teststderrM | ||
|  | 
 | ||
|  | if [ $usetmp -ne 0 ]; then | ||
|  |   echo "---------- Tests in the $tmp directory ----------" | ||
|  |   srcdir=`pwd` | ||
|  |   export srcdir | ||
|  | 
 | ||
|  |   if [ ! -e $tmp ]; then | ||
|  |     mkdir $tmp | ||
|  |   fi | ||
|  | 
 | ||
|  |   if [ ! -d $tmp ]; then | ||
|  |     echo "** Failed to create $tmp or it is not a directory" | ||
|  |     exit 1 | ||
|  |   fi | ||
|  | 
 | ||
|  |   cd $tmp | ||
|  |   if [ $? -ne 0 ]; then | ||
|  |     echo "** Failed to cd to $tmp" | ||
|  |     exit 1 | ||
|  |   fi | ||
|  | 
 | ||
|  |   for opts in \ | ||
|  |     "--disable-shared" | ||
|  |   do | ||
|  |     runtest | ||
|  |   done | ||
|  | 
 | ||
|  |   echo "Removing $tmp" | ||
|  |   rm -rf $tmp | ||
|  | fi | ||
|  | 
 | ||
|  | echo "---------- All done ----------" | ||
|  | 
 | ||
|  | # End |