Cygwin: testsuite: Build testcases using automake

Build all the testcase executables directly using automake, rather than
passing the compiler information into DejaGnu to have it build them.

(This means you get build avoidance for these executables, so they only
get built once, rather than every time you run the test, and makes it
much easier to run them in isolatation against the installed Cygwin,
which is really nice to have when trying to fix broken tests...)

Rename the 'cygrun' subdirectory to 'mingw', and build all the testsuite
MinGW executables there.

Drop sample-miscompile.c (testing that compile failure is detected is
perhaps useful, but not here...)
This commit is contained in:
Jon Turney 2022-08-24 16:01:52 +01:00
parent 50a741e2f1
commit daeeaa97b3
No known key found for this signature in database
GPG Key ID: C7C86F0370285C81
7 changed files with 325 additions and 67 deletions

View File

@ -126,7 +126,7 @@ AC_CONFIG_FILES([
utils/Makefile utils/Makefile
utils/mingw/Makefile utils/mingw/Makefile
testsuite/Makefile testsuite/Makefile
testsuite/cygrun/Makefile testsuite/mingw/Makefile
]) ])
AC_OUTPUT AC_OUTPUT

View File

@ -31,6 +31,300 @@ libltp_a_SOURCES = \
libltp/lib/tst_tmpdir.c \ libltp/lib/tst_tmpdir.c \
libltp/lib/write_log.c libltp/lib/write_log.c
check_PROGRAMS = \
winsup.api/checksignal \
winsup.api/crlf \
winsup.api/devdsp \
winsup.api/devzero \
winsup.api/iospeed \
winsup.api/mmaptest01 \
winsup.api/mmaptest02 \
winsup.api/mmaptest03 \
winsup.api/mmaptest04 \
winsup.api/msgtest \
winsup.api/nullgetcwd \
winsup.api/resethand \
winsup.api/semtest \
winsup.api/shmtest \
winsup.api/sigchld \
winsup.api/signal-into-win32-api \
winsup.api/systemcall \
winsup.api/user_malloc \
winsup.api/waitpid \
winsup.api/ltp/access01 \
winsup.api/ltp/access03 \
winsup.api/ltp/access04 \
winsup.api/ltp/access05 \
winsup.api/ltp/alarm01 \
winsup.api/ltp/alarm02 \
winsup.api/ltp/alarm03 \
winsup.api/ltp/alarm07 \
winsup.api/ltp/asyncio02 \
winsup.api/ltp/chdir02 \
winsup.api/ltp/chdir04 \
winsup.api/ltp/chmod01 \
winsup.api/ltp/chmod02 \
winsup.api/ltp/chown01 \
winsup.api/ltp/close01 \
winsup.api/ltp/close02 \
winsup.api/ltp/close08 \
winsup.api/ltp/creat01 \
winsup.api/ltp/creat03 \
winsup.api/ltp/creat09 \
winsup.api/ltp/dup01 \
winsup.api/ltp/dup02 \
winsup.api/ltp/dup03 \
winsup.api/ltp/dup04 \
winsup.api/ltp/dup05 \
winsup.api/ltp/execl01 \
winsup.api/ltp/execle01 \
winsup.api/ltp/execlp01 \
winsup.api/ltp/execv01 \
winsup.api/ltp/execve01 \
winsup.api/ltp/execvp01 \
winsup.api/ltp/exit01 \
winsup.api/ltp/exit02 \
winsup.api/ltp/fchdir01 \
winsup.api/ltp/fchdir02 \
winsup.api/ltp/fchmod01 \
winsup.api/ltp/fchown01 \
winsup.api/ltp/fcntl02 \
winsup.api/ltp/fcntl03 \
winsup.api/ltp/fcntl04 \
winsup.api/ltp/fcntl05 \
winsup.api/ltp/fcntl07 \
winsup.api/ltp/fcntl07B \
winsup.api/ltp/fcntl08 \
winsup.api/ltp/fcntl09 \
winsup.api/ltp/fcntl10 \
winsup.api/ltp/fork01 \
winsup.api/ltp/fork02 \
winsup.api/ltp/fork03 \
winsup.api/ltp/fork04 \
winsup.api/ltp/fork06 \
winsup.api/ltp/fork07 \
winsup.api/ltp/fork09 \
winsup.api/ltp/fork10 \
winsup.api/ltp/fork11 \
winsup.api/ltp/fpathconf01 \
winsup.api/ltp/fstat01 \
winsup.api/ltp/fstat02 \
winsup.api/ltp/fstat03 \
winsup.api/ltp/fstat04 \
winsup.api/ltp/fsync01 \
winsup.api/ltp/ftruncate01 \
winsup.api/ltp/ftruncate02 \
winsup.api/ltp/ftruncate03 \
winsup.api/ltp/getegid01 \
winsup.api/ltp/geteuid01 \
winsup.api/ltp/getgid01 \
winsup.api/ltp/getgid02 \
winsup.api/ltp/getgid03 \
winsup.api/ltp/getgroups01 \
winsup.api/ltp/getgroups02 \
winsup.api/ltp/gethostid01 \
winsup.api/ltp/gethostname01 \
winsup.api/ltp/getpgid01 \
winsup.api/ltp/getpgid02 \
winsup.api/ltp/getpgrp01 \
winsup.api/ltp/getpid01 \
winsup.api/ltp/getpid02 \
winsup.api/ltp/getppid01 \
winsup.api/ltp/getppid02 \
winsup.api/ltp/getuid01 \
winsup.api/ltp/getuid02 \
winsup.api/ltp/getuid03 \
winsup.api/ltp/kill01 \
winsup.api/ltp/kill02 \
winsup.api/ltp/kill03 \
winsup.api/ltp/kill04 \
winsup.api/ltp/kill09 \
winsup.api/ltp/link02 \
winsup.api/ltp/link03 \
winsup.api/ltp/link04 \
winsup.api/ltp/link05 \
winsup.api/ltp/lseek01 \
winsup.api/ltp/lseek02 \
winsup.api/ltp/lseek03 \
winsup.api/ltp/lseek04 \
winsup.api/ltp/lseek05 \
winsup.api/ltp/lseek06 \
winsup.api/ltp/lseek07 \
winsup.api/ltp/lseek08 \
winsup.api/ltp/lseek09 \
winsup.api/ltp/lseek10 \
winsup.api/ltp/lstat02 \
winsup.api/ltp/mkdir01 \
winsup.api/ltp/mkdir08 \
winsup.api/ltp/mknod01 \
winsup.api/ltp/mmap001 \
winsup.api/ltp/mmap02 \
winsup.api/ltp/mmap03 \
winsup.api/ltp/mmap04 \
winsup.api/ltp/mmap05 \
winsup.api/ltp/mmap06 \
winsup.api/ltp/mmap07 \
winsup.api/ltp/mmap08 \
winsup.api/ltp/munmap01 \
winsup.api/ltp/munmap02 \
winsup.api/ltp/nice05 \
winsup.api/ltp/open02 \
winsup.api/ltp/open03 \
winsup.api/ltp/pathconf01 \
winsup.api/ltp/pause01 \
winsup.api/ltp/pipe01 \
winsup.api/ltp/pipe08 \
winsup.api/ltp/pipe09 \
winsup.api/ltp/pipe10 \
winsup.api/ltp/pipe11 \
winsup.api/ltp/poll01 \
winsup.api/ltp/read01 \
winsup.api/ltp/read04 \
winsup.api/ltp/readdir01 \
winsup.api/ltp/readlink01 \
winsup.api/ltp/readlink02 \
winsup.api/ltp/readlink03 \
winsup.api/ltp/rename01 \
winsup.api/ltp/rename02 \
winsup.api/ltp/rename08 \
winsup.api/ltp/rename10 \
winsup.api/ltp/rmdir01 \
winsup.api/ltp/rmdir04 \
winsup.api/ltp/rmdir05 \
winsup.api/ltp/sbrk01 \
winsup.api/ltp/select01 \
winsup.api/ltp/select02 \
winsup.api/ltp/select03 \
winsup.api/ltp/setgid01 \
winsup.api/ltp/setgroups01 \
winsup.api/ltp/setpgid01 \
winsup.api/ltp/setregid01 \
winsup.api/ltp/setreuid01 \
winsup.api/ltp/setuid01 \
winsup.api/ltp/setuid02 \
winsup.api/ltp/signal03 \
winsup.api/ltp/stat01 \
winsup.api/ltp/stat02 \
winsup.api/ltp/stat03 \
winsup.api/ltp/stat05 \
winsup.api/ltp/stat06 \
winsup.api/ltp/symlink01 \
winsup.api/ltp/symlink02 \
winsup.api/ltp/symlink03 \
winsup.api/ltp/symlink04 \
winsup.api/ltp/symlink05 \
winsup.api/ltp/sync01 \
winsup.api/ltp/sync02 \
winsup.api/ltp/time01 \
winsup.api/ltp/time02 \
winsup.api/ltp/times01 \
winsup.api/ltp/times02 \
winsup.api/ltp/times03 \
winsup.api/ltp/truncate01 \
winsup.api/ltp/truncate02 \
winsup.api/ltp/umask01 \
winsup.api/ltp/umask02 \
winsup.api/ltp/umask03 \
winsup.api/ltp/uname01 \
winsup.api/ltp/unlink05 \
winsup.api/ltp/unlink06 \
winsup.api/ltp/unlink07 \
winsup.api/ltp/unlink08 \
winsup.api/ltp/vfork01 \
winsup.api/ltp/wait02 \
winsup.api/ltp/wait401 \
winsup.api/ltp/wait402 \
winsup.api/ltp/write01 \
winsup.api/ltp/write02 \
winsup.api/ltp/write03 \
winsup.api/pthread/cancel1 \
winsup.api/pthread/cancel10 \
winsup.api/pthread/cancel11 \
winsup.api/pthread/cancel12 \
winsup.api/pthread/cancel2 \
winsup.api/pthread/cancel3 \
winsup.api/pthread/cancel4 \
winsup.api/pthread/cancel5 \
winsup.api/pthread/cancel6 \
winsup.api/pthread/cancel7 \
winsup.api/pthread/cancel8 \
winsup.api/pthread/cancel9 \
winsup.api/pthread/cleanup2 \
winsup.api/pthread/cleanup3 \
winsup.api/pthread/condvar1 \
winsup.api/pthread/condvar2 \
winsup.api/pthread/condvar2_1 \
winsup.api/pthread/condvar3 \
winsup.api/pthread/condvar3_1 \
winsup.api/pthread/condvar3_2 \
winsup.api/pthread/condvar3_3 \
winsup.api/pthread/condvar4 \
winsup.api/pthread/condvar5 \
winsup.api/pthread/condvar6 \
winsup.api/pthread/condvar7 \
winsup.api/pthread/condvar8 \
winsup.api/pthread/condvar9 \
winsup.api/pthread/count1 \
winsup.api/pthread/create1 \
winsup.api/pthread/create2 \
winsup.api/pthread/equal1 \
winsup.api/pthread/exit1 \
winsup.api/pthread/exit2 \
winsup.api/pthread/exit3 \
winsup.api/pthread/inherit1 \
winsup.api/pthread/join0 \
winsup.api/pthread/join1 \
winsup.api/pthread/join2 \
winsup.api/pthread/mainthreadexits \
winsup.api/pthread/mutex1 \
winsup.api/pthread/mutex1d \
winsup.api/pthread/mutex1e \
winsup.api/pthread/mutex1n \
winsup.api/pthread/mutex1r \
winsup.api/pthread/mutex2 \
winsup.api/pthread/mutex3 \
winsup.api/pthread/mutex4 \
winsup.api/pthread/mutex5 \
winsup.api/pthread/mutex6d \
winsup.api/pthread/mutex6e \
winsup.api/pthread/mutex6n \
winsup.api/pthread/mutex6r \
winsup.api/pthread/mutex7 \
winsup.api/pthread/mutex7d \
winsup.api/pthread/mutex7e \
winsup.api/pthread/mutex7n \
winsup.api/pthread/mutex7r \
winsup.api/pthread/mutex8e \
winsup.api/pthread/mutex8n \
winsup.api/pthread/mutex8r \
winsup.api/pthread/once1 \
winsup.api/pthread/priority1 \
winsup.api/pthread/priority2 \
winsup.api/pthread/rwlock1 \
winsup.api/pthread/rwlock2 \
winsup.api/pthread/rwlock3 \
winsup.api/pthread/rwlock4 \
winsup.api/pthread/rwlock5 \
winsup.api/pthread/rwlock6 \
winsup.api/pthread/rwlock7 \
winsup.api/pthread/self1 \
winsup.api/pthread/self2 \
winsup.api/pthread/threadidafterfork \
winsup.api/pthread/tsd1 \
winsup.api/samples/sample-fail \
winsup.api/samples/sample-pass
# winsup.api/ltp/ulimit01 is omitted as we don't have <ulimit.h>
# flags for linking against the just built implib
# TODO: use -nostdinc and to-be-installed headers as well?
LDFLAGS_FOR_TESTDLL = -nodefaultlibs
LDADD_FOR_TESTDLL = $(builddir)/../cygwin/libcygwin.a -lgcc -lkernel32 -luser32
# flags for test executables
AM_CPPFLAGS = -I$(srcdir)/libltp/include
AM_LDFLAGS = $(LDFLAGS_FOR_TESTDLL)
LDADD = $(builddir)/libltp.a $(builddir)/../cygwin/binmode.o $(LDADD_FOR_TESTDLL)
DEJATOOL = winsup DEJATOOL = winsup
# Add '-v' to RUNTESTFLAGS if V=1 # Add '-v' to RUNTESTFLAGS if V=1
@ -46,22 +340,19 @@ testdll_tmpdir = $(shell cygpath -ma $(tmpdir) | sed -e 's#^\([A-Z]\):#/cygdrive
site-extra.exp: ../config.status Makefile site-extra.exp: ../config.status Makefile
@rm -f ./tmp0 @rm -f ./tmp0
@echo "set runtime_root \"`pwd`/runtime\"" >> ./tmp0 @echo "set runtime_root \"`pwd`/runtime\"" >> ./tmp0
@echo "set libdir \"`pwd`/../cygwin\"" >> ./tmp0
@echo "set CC \"$(CC)\"" >> ./tmp0
@echo "set CFLAGS \"\"" >> ./tmp0
@echo "set MINGW_CXX \"$(MINGW_CXX)\"" >> ./tmp0
@echo "set tmpdir $(tmpdir)" >> ./tmp0 @echo "set tmpdir $(tmpdir)" >> ./tmp0
@echo "set testdll_tmpdir $(testdll_tmpdir)" >> ./tmp0 @echo "set testdll_tmpdir $(testdll_tmpdir)" >> ./tmp0
@echo "set ltp_includes \"$(srcdir)/libltp/include\"" >> ./tmp0 @echo "set cygrun \"`pwd`/mingw/cygrun\"" >> ./tmp0
@echo "set ltp_libs \"`pwd`/libltp.a\"" >> ./tmp0
@echo "set cygrun \"`pwd`/cygrun/cygrun\"" >> ./tmp0
@mv ./tmp0 site-extra.exp @mv ./tmp0 site-extra.exp
EXTRA_DEJAGNU_SITE_CONFIG = site-extra.exp EXTRA_DEJAGNU_SITE_CONFIG = site-extra.exp
# target to build all the programs needed by check, without running check
check_programs: $(check_PROGRAMS)
clean-local: clean-local:
rm -f *.log *.exe *.exp *.bak *.stackdump winsup.sum rm -f *.log *.exe *.exp *.bak *.stackdump winsup.sum
if CROSS_BOOTSTRAP if CROSS_BOOTSTRAP
SUBDIRS = cygrun SUBDIRS = mingw
endif endif

View File

@ -21,7 +21,7 @@ cygwin1.dll ONLY. Create other subdirs under testsuite/ for other
classes of testing. classes of testing.
Tests in winsup.api/*.c or winsup.api/*/*.c (only one subdirectory Tests in winsup.api/*.c or winsup.api/*/*.c (only one subdirectory
level is allowed) either compile, run, and exit(0) or they fail. level is allowed) either run, and exit(0) or they fail.
Either abort or exit with a non-zero code to indicate failure. Don't Either abort or exit with a non-zero code to indicate failure. Don't
print anything to the screen if you can avoid it (except for failure print anything to the screen if you can avoid it (except for failure
reasons, of course). One .c file per test, no compile options are reasons, of course). One .c file per test, no compile options are

View File

@ -1,4 +1,4 @@
# Makefile.am for Cygwin the testsuite wrapper cygrun. # Makefile.am for Cygwin testsuite MINGW executables
# #
# This file is part of Cygwin. # This file is part of Cygwin.
# #
@ -8,14 +8,19 @@
# This makefile requires GNU make. # This makefile requires GNU make.
# This is built with the MinGW compiler, so is in a separate Makefile here # These are built with the MinGW compiler, so are in a separate Makefile here
# because it's tricky with Automake to use different compilers for the same # because it's tricky with Automake to use different compilers for the same
# language in the same Makefile. # language in the same Makefile.
override CC = @MINGW_CC@ override CC = @MINGW_CC@
override CXX = @MINGW_CXX@
AM_CPPFLAGS = AM_CPPFLAGS =
noinst_PROGRAMS = cygrun noinst_PROGRAMS = cygrun cygload
cygrun_SOURCES = \ cygrun_SOURCES = \
../cygrun.c ../cygrun.c
cygload_SOURCES = \
../winsup.api/cygload.cc
cygload_LDFLAGS=-static -Wl,-e,cygloadCRTStartup

View File

@ -14,33 +14,17 @@ proc ws_spawn {cmd args} {
verbose send "catchCode = $rv\n" verbose send "catchCode = $rv\n"
} }
if { [string match "i686" $target_alias] } { if { $verbose } {
set entrypoint "_cygloadCRTStartup@0" set redirect_output "./mingw-cygwin.log"
} else { } else {
set entrypoint "cygloadCRTStartup" set redirect_output /dev/null
} }
ws_spawn "$MINGW_CXX $srcdir/$subdir/cygload.cc -o mingw-cygload.exe -static -Wl,-e,$entrypoint" set windows_runtime_root [exec cygpath -m $runtime_root]
ws_spawn "./mingw/cygload.exe -cygwin $windows_runtime_root/cygwin1.dll > $redirect_output"
if { $rv != {0 {}} } { if { $rv != {0 {}} } {
verbose -log "$rv" verbose -log "cygload: $rv"
fail "cygload (compile)" fail "cygload"
} else { } else {
if { $verbose } { pass "cygload"
set redirect_output "./mingw-cygwin.log"
} else {
set redirect_output /dev/null
}
set windows_runtime_root [exec cygpath -m $runtime_root]
ws_spawn "./mingw-cygload.exe -cygwin $windows_runtime_root/cygwin1.dll > $redirect_output"
if { $rv != {0 {}} } {
verbose -log "cygload: $rv"
fail "cygload (execute)"
} else {
pass "cygload"
}
catch { file delete "mingw-cygload.exe" } err
if { $err != "" } {
note "error deleting mingw-cygload.exe: $err"
}
} }

View File

@ -1 +0,0 @@
foo bar grill

View File

@ -8,12 +8,6 @@ if { ! [isnative] } {
set rv "" set rv ""
set ltp_includes "-I$ltp_includes"
set ltp_libs "$ltp_libs"
set add_includes $ltp_includes
set add_libs $ltp_libs
set orig_path "$env(PATH)" set orig_path "$env(PATH)"
set test_filter "" set test_filter ""
@ -48,7 +42,9 @@ foreach src [lsort [glob -nocomplain $srcdir/$subdir/*.c $srcdir/$subdir/*/*.{cc
regsub "^$srcdir/$subdir/" $src "" testcase regsub "^$srcdir/$subdir/" $src "" testcase
regsub ".c$" $testcase "" base regsub ".c$" $testcase "" base
regsub ".*/" $base "" basename regsub ".*/" $base "" basename
regsub "/" $base "-" base regsub "/" $base "-" tmpfile
set exec "./winsup.api/$base.exe"
if { [lsearch -exact $xfail_list $basename] >= 0 } { if { [lsearch -exact $xfail_list $basename] >= 0 } {
set xfail_expected 1 set xfail_expected 1
@ -61,37 +57,20 @@ foreach src [lsort [glob -nocomplain $srcdir/$subdir/*.c $srcdir/$subdir/*/*.{cc
if [ file exists "$srcdir/$subdir/$basename.exp" ] then { if [ file exists "$srcdir/$subdir/$basename.exp" ] then {
source "$srcdir/$subdir/$basename.exp" source "$srcdir/$subdir/$basename.exp"
} else { } else {
ws_spawn "$CC -nodefaultlibs -mwin32 $CFLAGS $src $add_includes $add_libs $libdir/binmode.o -lgcc $libdir/libcygwin.a -lkernel32 -luser32 -o $base.exe"
if { $rv } {
fail "$testcase (compile)"
} else {
if { $verbose } { if { $verbose } {
set redirect_output "./$base.log" set redirect_output "./$tmpfile.log"
} else { } else {
set redirect_output /dev/null set redirect_output /dev/null
} }
file mkdir $tmpdir/$base file mkdir $tmpdir/$tmpfile
set env(PATH) "$runtime_root:$env(PATH)" set env(PATH) "$runtime_root:$env(PATH)"
ws_spawn "$cygrun ./$base.exe $testdll_tmpdir/$base > $redirect_output" ws_spawn "$cygrun $exec $testdll_tmpdir/$tmpfile > $redirect_output"
file delete -force $tmpdir/$base file delete -force $tmpdir/$tmpfile
set env(PATH) "$orig_path" set env(PATH) "$orig_path"
if { $rv } { if { $rv } {
fail "$testcase (execute)" fail "$testcase"
if { $xfail_expected } {
catch { file delete "$base.exe" } err
if { $err != "" } {
note "error deleting $base.exe: $err"
}
}
} else { } else {
pass "$testcase" pass "$testcase"
if { ! $xfail_expected } {
catch { file delete "$base.exe" } err
if { $err != "" } {
note "error deleting $base.exe: $err"
}
}
} }
}
} }
} }