Browse Source

+ support for running the testsuite in parallel. Note that only the "all"
target can be run in parallel, so "clean", "digest" and/or "dbdigest"
have to be run in separate make invocations if you wish to use -j for
running the testsuite

git-svn-id: trunk@21406 -

Jonas Maebe 13 years ago
parent
commit
252483ffd8
9 changed files with 393 additions and 153 deletions
  1. 1 0
      .gitattributes
  2. 77 35
      tests/Makefile
  3. 76 28
      tests/Makefile.fpc
  4. 29 7
      tests/units/Makefile
  5. 1 0
      tests/units/Makefile.fpc
  6. 97 75
      tests/utils/Makefile
  7. 2 1
      tests/utils/Makefile.fpc
  8. 83 0
      tests/utils/concat.pp
  9. 27 7
      tests/utils/dotest.pp

+ 1 - 0
.gitattributes

@@ -11458,6 +11458,7 @@ tests/units/win32err.pp svneol=native#text/plain
 tests/utils/Makefile svneol=native#text/plain
 tests/utils/Makefile.fpc svneol=native#text/plain
 tests/utils/bench.pp svneol=native#text/plain
+tests/utils/concat.pp svneol=native#text/plain
 tests/utils/dbdigest.pp svneol=native#text/plain
 tests/utils/dbtests.pp svneol=native#text/plain
 tests/utils/digest.pp svneol=native#text/plain

+ 77 - 35
tests/Makefile

@@ -1,8 +1,8 @@
 #
-# Don't edit, this file is generated by FPCMake Version 2.0.0 [2012/04/25]
+# Don't edit, this file is generated by FPCMake Version 2.0.0 [2012/05/27]
 #
 default: allexectests
-MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-haiku i386-netbsd i386-solaris i386-qnx i386-netware i386-openbsd i386-wdosx i386-darwin i386-emx i386-watcom i386-netwlibc i386-wince i386-embedded i386-symbian i386-nativent i386-iphonesim m68k-linux m68k-freebsd m68k-netbsd m68k-amiga m68k-atari m68k-openbsd m68k-palmos m68k-embedded powerpc-linux powerpc-netbsd powerpc-amiga powerpc-macos powerpc-darwin powerpc-morphos powerpc-embedded powerpc-wii powerpc-aix sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-netbsd x86_64-solaris x86_64-openbsd x86_64-darwin x86_64-win64 x86_64-embedded arm-linux arm-palmos arm-darwin arm-wince arm-gba arm-nds arm-embedded arm-symbian powerpc64-linux powerpc64-darwin powerpc64-embedded powerpc64-aix avr-embedded armeb-linux armeb-embedded mips-linux mipsel-linux
+MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-haiku i386-netbsd i386-solaris i386-qnx i386-netware i386-openbsd i386-wdosx i386-darwin i386-emx i386-watcom i386-netwlibc i386-wince i386-embedded i386-symbian i386-nativent i386-iphonesim m68k-linux m68k-freebsd m68k-netbsd m68k-amiga m68k-atari m68k-openbsd m68k-palmos m68k-embedded powerpc-linux powerpc-netbsd powerpc-amiga powerpc-macos powerpc-darwin powerpc-morphos powerpc-embedded powerpc-wii powerpc-aix sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-netbsd x86_64-solaris x86_64-openbsd x86_64-darwin x86_64-win64 x86_64-embedded arm-linux arm-palmos arm-darwin arm-wince arm-gba arm-nds arm-embedded arm-symbian powerpc64-linux powerpc64-darwin powerpc64-embedded powerpc64-aix avr-embedded armeb-linux armeb-embedded mips-linux mipsel-linux jvm-java jvm-android
 BSDs = freebsd netbsd openbsd darwin
 UNIXs = linux $(BSDs) solaris qnx haiku aix
 LIMIT83fs = go32v2 os2 emx watcom
@@ -258,11 +258,13 @@ ifndef BINUTILSPREFIX
 ifndef CROSSBINDIR
 ifdef CROSSCOMPILE
 ifndef DARWIN2DARWIN
+ifneq ($(CPU_TARGET),jvm)
 BINUTILSPREFIX=$(CPU_TARGET)-$(OS_TARGET)-
 endif
 endif
 endif
 endif
+endif
 UNITSDIR:=$(wildcard $(FPCDIR)/units/$(TARGETSUFFIX))
 ifeq ($(UNITSDIR),)
 UNITSDIR:=$(wildcard $(FPCDIR)/units/$(OS_TARGET))
@@ -650,6 +652,18 @@ BATCHEXT=.sh
 EXEEXT=
 SHORTSUFFIX=aix
 endif
+ifeq ($(OS_TARGET),java)
+OEXT=.class
+ASMEXT=.j
+SHAREDLIBEXT=.jar
+SHORTSUFFIX=java
+endif
+ifeq ($(OS_TARGET),android)
+OEXT=.class
+ASMEXT=.j
+SHAREDLIBEXT=.jar
+SHORTSUFFIX=android
+endif
 ifneq ($(findstring $(OS_SOURCE),$(LIMIT83fs)),)
 FPCMADE=fpcmade.$(SHORTSUFFIX)
 ZIPSUFFIX=$(SHORTSUFFIX)
@@ -1003,17 +1017,12 @@ endif
 endif
 ifdef CREATESHARED
 override FPCOPT+=-Cg
-ifeq ($(CPU_TARGET),i386)
-override FPCOPT+=-Aas
-endif
 endif
-ifeq ($(findstring 2.0.,$(FPC_VERSION)),)
 ifneq ($(findstring $(OS_TARGET),freebsd openbsd netbsd linux solaris),)
 ifeq ($(CPU_TARGET),x86_64)
 override FPCOPT+=-Cg
 endif
 endif
-endif
 ifdef LINKSHARED
 endif
 ifdef OPT
@@ -1351,6 +1360,8 @@ endif
 ifndef LOG
 export LOG:=$(TEST_OUTPUTDIR)/log
 endif
+LOGFILES=$(TEST_OUTPUTDIR)/log $(TEST_OUTPUTDIR)/longlog $(TEST_OUTPUTDIR)/faillist
+LOGEXT=.testlog .tbslog .tbflog .webtbslog .webtbflog
 TESTSUBDIRS=cg cg/variants cg/cdecl library opt units/system units/dos units/crt units/objects units/strings units/sysutils units/math units/sharemem units/strutils units/matrix units/lineinfo
 TESTPACKAGESUBDIRS=packages/win-base packages/webtbs packages/hash packages/fcl-registry packages/fcl-process packages/zlib packages/fcl-db packages/fcl-base packages/fcl-xml packages/cocoaint packages/bzip2
 ifdef QUICKTEST
@@ -1370,6 +1381,9 @@ endif
 ifndef DOTEST
 DOTEST=utils/dotest
 endif
+ifndef CONCAT
+CONCAT=utils/concat
+endif
 ifndef PREPUP
 PREPUP=utils/prepup
 endif
@@ -1415,8 +1429,8 @@ copyfiles: $(TEST_OUTPUTDIR)
 	-$(MKDIRTREE) $(TEST_OUTPUTDIR)/test/units/system
 	$(COPY) test/units/system/test*.txt $(TEST_OUTPUTDIR)/test/units/system
 testprep: testprep-stamp.$(TEST_FULL_TARGET)
-testprep-stamp.$(TEST_FULL_TARGET): $(TEST_OUTPUTDIR) utils units copyfiles
-	$(ECHO) $(DATE) > testprep-stamp.$(TEST_FULL_TARGET)
+testprep-stamp.$(TEST_FULL_TARGET): utils units copyfiles
+	$(ECHOREDIR) $(DATE) > testprep-stamp.$(TEST_FULL_TARGET)
 $(TEST_OUTPUTDIR):
 	$(MKDIRTREE) $@
 ifneq ($(TEST_FPC),ppc386$(EXEEXT))
@@ -1497,14 +1511,25 @@ DIRS=webtbs webtbf tbs tbf $(TESTDIRS)
 vpath %.log $(TEST_OUTPUTDIR)
 vpath %.elg $(TEST_OUTPUTDIR)
 vpath %.o $(C_SUBDIR)
-%.log : %.pp
+ifdef SINGLEDOTESTRUNS
+TBSREQ=$(patsubst %.pp,%.elg,$(sort $(wildcard tbs/t*.pp)))
+TBFREQ=$(patsubst %.pp,%.elg,$(sort $(wildcard tbf/t*.pp)))
+WEBTBSREQ=$(patsubst %.pp,%.elg,$(sort $(wildcard webtbs/t*.pp)))
+WEBTBFREQ=$(patsubst %.pp,%.elg,$(sort $(wildcard webtbf/t*.pp)))
+TESTREQ=$(patsubst %.pp,%.elg,$(sort $(wildcard $(addsuffix /t*.pp,$(TESTDIRS)))))
+else
+TBSREQ=$(TEST_OUTPUTDIR)/tbsdir-stamp.$(TEST_FULL_TARGET)
+TBFREQ=$(TEST_OUTPUTDIR)/tbfdir-stamp.$(TEST_FULL_TARGET)
+WEBTBSREQ=$(TEST_OUTPUTDIR)/webtbsdir-stamp.$(TEST_FULL_TARGET)
+WEBTBFREQ=$(TEST_OUTPUTDIR)/webtbfdir-stamp.$(TEST_FULL_TARGET)
+TESTREQ=$(TEST_OUTPUTDIR)/testdir-stamp.$(TEST_FULL_TARGET)
+endif
+%.log : %.pp testprep-stamp.$(TEST_FULL_TARGET)
 	$(call QECHO,"  COMPILE $<")
 	$(Q)$(DOTEST) $(DOTESTOPT) $<
-%.elg : %.pp
+%.elg : %.pp testprep-stamp.$(TEST_FULL_TARGET)
 	$(call QECHO,"  EXECUTE $<")
-ifdef SINGLEDOTESTRUNS
 	$(Q)$(DOTEST) $(DOTESTOPT) -e $<
-endif
 ifdef TEST_CCOMPILER
 %.o : %.c
 	$(TEST_CCOMPILER) -c $< -o $(@D)/$(C_SUBDIR)/$(@F)
@@ -1522,33 +1547,50 @@ ifndef SINGLEDOTESTRUNS
 endif
 alltests: alltest alltbs alltbf allwebtbs allwebtbf
 .PHONY: allexectbs allexectbf allexecwebtbs allexecwebtbf allexectest allexectests
-allexectbs : testprep $(patsubst %.pp,%.elg,$(sort $(wildcard tbs/t*.pp)))
-ifndef SINGLEDOTESTRUNS
-	$(Q)$(DOTEST) $(DOTESTOPT) -e $(sort $(wildcard tbs/t*.pp))
-endif
-allexectbf : testprep $(patsubst %.pp,%.elg,$(sort $(wildcard tbf/t*.pp)))
-ifndef SINGLEDOTESTRUNS
-	$(Q)$(DOTEST) $(DOTESTOPT) -e $(sort $(wildcard tbf/t*.pp))
-endif
-allexecwebtbs : testprep $(patsubst %.pp,%.elg,$(sort $(wildcard webtbs/t*.pp)))
-ifndef SINGLEDOTESTRUNS
-	$(Q)$(DOTEST) $(DOTESTOPT) -e $(sort $(wildcard webtbs/t*.pp))
-endif
-allexecwebtbf : testprep $(patsubst %.pp,%.elg,$(sort $(wildcard webtbf/t*.pp)))
-ifndef SINGLEDOTESTRUNS
-	$(Q)$(DOTEST) $(DOTESTOPT) -e $(sort $(wildcard webtbf/t*.pp))
-endif
-allexectest : testprep $(patsubst %.pp,%.elg,$(sort $(wildcard $(addsuffix /t*.pp,$(TESTDIRS)))))
-ifndef SINGLEDOTESTRUNS
-	$(Q)$(DOTEST) $(DOTESTOPT) -e $(sort $(wildcard $(addsuffix /t*.pp,$(TESTDIRS))))
-endif
-allexectests: allexectest allexectbs allexectbf allexecwebtbs allexecwebtbf
+allexectbs: $(addsuffix .tbslog, $(LOGFILES))
+allexectbf: $(addsuffix .tbflog, $(LOGFILES))
+allexecwebtbs: $(addsuffix .webtbslog, $(LOGFILES))
+allexecwebtbf: $(addsuffix .webtbflog, $(LOGFILES))
+allexectest: $(addsuffix .testlog, $(LOGFILES))
+$(TEST_OUTPUTDIR)/%.mergedlog : $(TEST_OUTPUTDIR)/%.testlog $(TEST_OUTPUTDIR)/%.tbslog $(TEST_OUTPUTDIR)/%.tbflog $(TEST_OUTPUTDIR)/%.webtbslog $(TEST_OUTPUTDIR)/%.webtbflog
+	$(Q)$(CONCAT) $^ $@
+	$(Q)$(COPY) $@ $(basename $@)
+$(TEST_OUTPUTDIR)/tbsdir-stamp.$(TEST_FULL_TARGET): testprep-stamp.$(TEST_FULL_TARGET)
+	$(Q)$(DOTEST) $(DOTESTOPT) -Ltbslog -e $(sort $(wildcard tbs/t*.pp))
+	$(ECHOREDIR) $(DATE) > $@
+$(TEST_OUTPUTDIR)/%.tbslog : $(TBSREQ)
+	$(Q)$(ECHOREDIR) -n >> $(TEST_OUTPUTDIR)/faillist.tbslog
+	$(Q)$(ECHOREDIR) -n >> $(TEST_OUTPUTDIR)/longlog.tbslog
+$(TEST_OUTPUTDIR)/tbfdir-stamp.$(TEST_FULL_TARGET): testprep-stamp.$(TEST_FULL_TARGET)
+	$(Q)$(DOTEST) $(DOTESTOPT) -Ltbflog -e $(sort $(wildcard tbf/t*.pp))
+	$(ECHOREDIR) $(DATE) > $@
+$(TEST_OUTPUTDIR)/%.tbflog : $(TBFREQ)
+	$(Q)$(ECHOREDIR) -n >> $(TEST_OUTPUTDIR)/faillist.tbflog
+	$(Q)$(ECHOREDIR) -n >> $(TEST_OUTPUTDIR)/longlog.tbflog
+$(TEST_OUTPUTDIR)/webtbsdir-stamp.$(TEST_FULL_TARGET): testprep-stamp.$(TEST_FULL_TARGET)
+	$(Q)$(DOTEST) $(DOTESTOPT) -Lwebtbslog -e $(sort $(wildcard webtbs/t*.pp))
+	$(Q)$(ECHOREDIR) $(DATE) > $@
+$(TEST_OUTPUTDIR)/%.webtbslog : $(WEBTBSREQ)
+	$(Q)$(ECHOREDIR) -n >> $(TEST_OUTPUTDIR)/faillist.webtbslog
+	$(Q)$(ECHOREDIR) -n >> $(TEST_OUTPUTDIR)/longlog.webtbslog
+$(TEST_OUTPUTDIR)/webtbfdir-stamp.$(TEST_FULL_TARGET): testprep-stamp.$(TEST_FULL_TARGET)
+	$(Q)$(DOTEST) $(DOTESTOPT) -Lwebtbflog -e $(sort $(wildcard webtbf/t*.pp))
+	$(ECHOREDIR) $(DATE) > $@
+$(TEST_OUTPUTDIR)/%.webtbflog : $(WEBTBFREQ)
+	$(Q)$(ECHOREDIR) -n >> $(TEST_OUTPUTDIR)/faillist.webtbflog
+	$(Q)$(ECHOREDIR) -n >> $(TEST_OUTPUTDIR)/longlog.webtbflog
+$(TEST_OUTPUTDIR)/testdir-stamp.$(TEST_FULL_TARGET): testprep-stamp.$(TEST_FULL_TARGET)
+	$(Q)$(DOTEST) $(DOTESTOPT)  -Ltestlog -e $(sort $(wildcard $(addsuffix /t*.pp,$(TESTDIRS))))
+	$(ECHOREDIR) $(DATE) > $@
+$(TEST_OUTPUTDIR)/%.testlog : $(TESTREQ)
+	$(Q)$(ECHOREDIR) -n >> $(TEST_OUTPUTDIR)/faillist.testlog
+	$(Q)$(ECHOREDIR) -n >> $(TEST_OUTPUTDIR)/longlog.testlog
+allexectests: $(TEST_OUTPUTDIR)/log.webtbslog $(TEST_OUTPUTDIR)/log.testlog $(TEST_OUTPUTDIR)/log.tbslog $(TEST_OUTPUTDIR)/log.tbflog $(TEST_OUTPUTDIR)/log.webtbflog  $(addprefix $(TEST_OUTPUTDIR)/,$(foreach EXT, $(LOGEXT), $(addsuffix $(EXT), faillist longlog))) $(addsuffix .mergedlog, $(LOGFILES))
 .PHONY: clean distclean clean_test clean_sources
 clean_sources:
 	-$(DEL) $(wildcard $(patsubst %.pp,%$(PPUEXT),$(wildcard $(addsuffix /*.pp,$(DIRS)))))
 clean_test:
 	-$(DELTREE) $(TEST_OUTPUTDIR)
-	-$(DEL) $(LOG) $(LONGLOG) $(FAILLIST)
 	-$(DEL) core gmon.out testprep-stamp.$(TEST_FULL_TARGET) dotgz.bat
 clean: clean_sources
 	$(MAKE) clean_test CPU_TARGET=$(TEST_CPU_TARGET) OS_TARGET=$(TEST_OS_TARGET)

+ 76 - 28
tests/Makefile.fpc

@@ -133,6 +133,9 @@ ifndef LOG
 export LOG:=$(TEST_OUTPUTDIR)/log
 endif
 
+# locations of all logfiles
+LOGFILES=$(TEST_OUTPUTDIR)/log $(TEST_OUTPUTDIR)/longlog $(TEST_OUTPUTDIR)/faillist
+LOGEXT=.testlog .tbslog .tbflog .webtbslog .webtbflog
 
 # Subdirs available in the test subdir
 TESTSUBDIRS=cg cg/variants cg/cdecl library opt units/system units/dos units/crt units/objects units/strings units/sysutils units/math units/sharemem units/strutils units/matrix units/lineinfo
@@ -167,6 +170,10 @@ ifndef DOTEST
 DOTEST=utils/dotest
 endif
 
+ifndef CONCAT
+CONCAT=utils/concat
+endif
+
 ifndef PREPUP
 PREPUP=utils/prepup
 endif
@@ -235,8 +242,8 @@ copyfiles: $(TEST_OUTPUTDIR)
 #
 
 testprep: testprep-stamp.$(TEST_FULL_TARGET)
-testprep-stamp.$(TEST_FULL_TARGET): $(TEST_OUTPUTDIR) utils units copyfiles
-        $(ECHO) $(DATE) > testprep-stamp.$(TEST_FULL_TARGET)
+testprep-stamp.$(TEST_FULL_TARGET): utils units copyfiles
+        $(ECHOREDIR) $(DATE) > testprep-stamp.$(TEST_FULL_TARGET)
 
 $(TEST_OUTPUTDIR):
         $(MKDIRTREE) $@
@@ -346,15 +353,27 @@ vpath %.log $(TEST_OUTPUTDIR)
 vpath %.elg $(TEST_OUTPUTDIR)
 vpath %.o $(C_SUBDIR)
 
-%.log : %.pp
+ifdef SINGLEDOTESTRUNS
+TBSREQ=$(patsubst %.pp,%.elg,$(sort $(wildcard tbs/t*.pp)))
+TBFREQ=$(patsubst %.pp,%.elg,$(sort $(wildcard tbf/t*.pp)))
+WEBTBSREQ=$(patsubst %.pp,%.elg,$(sort $(wildcard webtbs/t*.pp)))
+WEBTBFREQ=$(patsubst %.pp,%.elg,$(sort $(wildcard webtbf/t*.pp)))
+TESTREQ=$(patsubst %.pp,%.elg,$(sort $(wildcard $(addsuffix /t*.pp,$(TESTDIRS)))))
+else
+TBSREQ=$(TEST_OUTPUTDIR)/tbsdir-stamp.$(TEST_FULL_TARGET)
+TBFREQ=$(TEST_OUTPUTDIR)/tbfdir-stamp.$(TEST_FULL_TARGET)
+WEBTBSREQ=$(TEST_OUTPUTDIR)/webtbsdir-stamp.$(TEST_FULL_TARGET)
+WEBTBFREQ=$(TEST_OUTPUTDIR)/webtbfdir-stamp.$(TEST_FULL_TARGET)
+TESTREQ=$(TEST_OUTPUTDIR)/testdir-stamp.$(TEST_FULL_TARGET)
+endif
+
+%.log : %.pp testprep-stamp.$(TEST_FULL_TARGET)
 	$(call QECHO,"  COMPILE $<")
 	$(Q)$(DOTEST) $(DOTESTOPT) $<
 
-%.elg : %.pp
+%.elg : %.pp testprep-stamp.$(TEST_FULL_TARGET)
 	$(call QECHO,"  EXECUTE $<")
-ifdef SINGLEDOTESTRUNS
 	$(Q)$(DOTEST) $(DOTESTOPT) -e $<
-endif
 
 ifdef TEST_CCOMPILER
 %.o : %.c
@@ -389,32 +408,62 @@ alltests: alltest alltbs alltbf allwebtbs allwebtbf
 
 .PHONY: allexectbs allexectbf allexecwebtbs allexecwebtbf allexectest allexectests
 
-allexectbs : testprep $(patsubst %.pp,%.elg,$(sort $(wildcard tbs/t*.pp)))
-ifndef SINGLEDOTESTRUNS
-	$(Q)$(DOTEST) $(DOTESTOPT) -e $(sort $(wildcard tbs/t*.pp))
-endif
+allexectbs: $(addsuffix .tbslog, $(LOGFILES))
+allexectbf: $(addsuffix .tbflog, $(LOGFILES))
+allexecwebtbs: $(addsuffix .webtbslog, $(LOGFILES))
+allexecwebtbf: $(addsuffix .webtbflog, $(LOGFILES))
+allexectest: $(addsuffix .testlog, $(LOGFILES))
 
-allexectbf : testprep $(patsubst %.pp,%.elg,$(sort $(wildcard tbf/t*.pp)))
-ifndef SINGLEDOTESTRUNS
-	$(Q)$(DOTEST) $(DOTESTOPT) -e $(sort $(wildcard tbf/t*.pp))
-endif
+$(TEST_OUTPUTDIR)/%.mergedlog : $(TEST_OUTPUTDIR)/%.testlog $(TEST_OUTPUTDIR)/%.tbslog $(TEST_OUTPUTDIR)/%.tbflog $(TEST_OUTPUTDIR)/%.webtbslog $(TEST_OUTPUTDIR)/%.webtbflog
+	$(Q)$(CONCAT) $^ $@
+	$(Q)$(COPY) $@ $(basename $@)
 
-allexecwebtbs : testprep $(patsubst %.pp,%.elg,$(sort $(wildcard webtbs/t*.pp)))
-ifndef SINGLEDOTESTRUNS
-	$(Q)$(DOTEST) $(DOTESTOPT) -e $(sort $(wildcard webtbs/t*.pp))
-endif
+# the extra ECHOREDIR's below are in case a particular dir doesn't have any failures
 
-allexecwebtbf : testprep $(patsubst %.pp,%.elg,$(sort $(wildcard webtbf/t*.pp)))
-ifndef SINGLEDOTESTRUNS
-	$(Q)$(DOTEST) $(DOTESTOPT) -e $(sort $(wildcard webtbf/t*.pp))
-endif
+$(TEST_OUTPUTDIR)/tbsdir-stamp.$(TEST_FULL_TARGET): testprep-stamp.$(TEST_FULL_TARGET)
+	$(Q)$(DOTEST) $(DOTESTOPT) -Ltbslog -e $(sort $(wildcard tbs/t*.pp))
+	$(ECHOREDIR) $(DATE) > $@
 
-allexectest : testprep $(patsubst %.pp,%.elg,$(sort $(wildcard $(addsuffix /t*.pp,$(TESTDIRS)))))
-ifndef SINGLEDOTESTRUNS
-	$(Q)$(DOTEST) $(DOTESTOPT) -e $(sort $(wildcard $(addsuffix /t*.pp,$(TESTDIRS))))
-endif
+$(TEST_OUTPUTDIR)/%.tbslog : $(TBSREQ)
+	$(Q)$(ECHOREDIR) -n >> $(TEST_OUTPUTDIR)/faillist.tbslog
+	$(Q)$(ECHOREDIR) -n >> $(TEST_OUTPUTDIR)/longlog.tbslog
+
+$(TEST_OUTPUTDIR)/tbfdir-stamp.$(TEST_FULL_TARGET): testprep-stamp.$(TEST_FULL_TARGET)
+	$(Q)$(DOTEST) $(DOTESTOPT) -Ltbflog -e $(sort $(wildcard tbf/t*.pp))
+	$(ECHOREDIR) $(DATE) > $@
+
+$(TEST_OUTPUTDIR)/%.tbflog : $(TBFREQ)
+	$(Q)$(ECHOREDIR) -n >> $(TEST_OUTPUTDIR)/faillist.tbflog
+	$(Q)$(ECHOREDIR) -n >> $(TEST_OUTPUTDIR)/longlog.tbflog
+
+$(TEST_OUTPUTDIR)/webtbsdir-stamp.$(TEST_FULL_TARGET): testprep-stamp.$(TEST_FULL_TARGET)
+	$(Q)$(DOTEST) $(DOTESTOPT) -Lwebtbslog -e $(sort $(wildcard webtbs/t*.pp))
+	$(Q)$(ECHOREDIR) $(DATE) > $@
+
+$(TEST_OUTPUTDIR)/%.webtbslog : $(WEBTBSREQ)
+	$(Q)$(ECHOREDIR) -n >> $(TEST_OUTPUTDIR)/faillist.webtbslog
+	$(Q)$(ECHOREDIR) -n >> $(TEST_OUTPUTDIR)/longlog.webtbslog
+
+$(TEST_OUTPUTDIR)/webtbfdir-stamp.$(TEST_FULL_TARGET): testprep-stamp.$(TEST_FULL_TARGET)
+	$(Q)$(DOTEST) $(DOTESTOPT) -Lwebtbflog -e $(sort $(wildcard webtbf/t*.pp))
+	$(ECHOREDIR) $(DATE) > $@
+
+$(TEST_OUTPUTDIR)/%.webtbflog : $(WEBTBFREQ)
+	$(Q)$(ECHOREDIR) -n >> $(TEST_OUTPUTDIR)/faillist.webtbflog
+	$(Q)$(ECHOREDIR) -n >> $(TEST_OUTPUTDIR)/longlog.webtbflog
+
+$(TEST_OUTPUTDIR)/testdir-stamp.$(TEST_FULL_TARGET): testprep-stamp.$(TEST_FULL_TARGET)
+	$(Q)$(DOTEST) $(DOTESTOPT)  -Ltestlog -e $(sort $(wildcard $(addsuffix /t*.pp,$(TESTDIRS))))
+	$(ECHOREDIR) $(DATE) > $@
+
+$(TEST_OUTPUTDIR)/%.testlog : $(TESTREQ)
+	$(Q)$(ECHOREDIR) -n >> $(TEST_OUTPUTDIR)/faillist.testlog
+	$(Q)$(ECHOREDIR) -n >> $(TEST_OUTPUTDIR)/longlog.testlog
+
+# run all tests (ordered by longest running to shortest), then merge log files
+allexectests: $(TEST_OUTPUTDIR)/log.webtbslog $(TEST_OUTPUTDIR)/log.testlog $(TEST_OUTPUTDIR)/log.tbslog $(TEST_OUTPUTDIR)/log.tbflog $(TEST_OUTPUTDIR)/log.webtbflog  $(addprefix $(TEST_OUTPUTDIR)/,$(foreach EXT, $(LOGEXT), $(addsuffix $(EXT), faillist longlog))) $(addsuffix .mergedlog, $(LOGFILES))
 
-allexectests: allexectest allexectbs allexectbf allexecwebtbs allexecwebtbf
+  
 
 ################################
 # Clean
@@ -428,7 +477,6 @@ clean_sources:
 
 clean_test:
         -$(DELTREE) $(TEST_OUTPUTDIR)
-        -$(DEL) $(LOG) $(LONGLOG) $(FAILLIST)
         -$(DEL) core gmon.out testprep-stamp.$(TEST_FULL_TARGET) dotgz.bat
 
 clean: clean_sources

+ 29 - 7
tests/units/Makefile

@@ -1,8 +1,8 @@
 #
-# Don't edit, this file is generated by FPCMake Version 2.0.0 [2012/04/25]
+# Don't edit, this file is generated by FPCMake Version 2.0.0 [2012/05/27]
 #
 default: all
-MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-haiku i386-netbsd i386-solaris i386-qnx i386-netware i386-openbsd i386-wdosx i386-darwin i386-emx i386-watcom i386-netwlibc i386-wince i386-embedded i386-symbian i386-nativent i386-iphonesim m68k-linux m68k-freebsd m68k-netbsd m68k-amiga m68k-atari m68k-openbsd m68k-palmos m68k-embedded powerpc-linux powerpc-netbsd powerpc-amiga powerpc-macos powerpc-darwin powerpc-morphos powerpc-embedded powerpc-wii powerpc-aix sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-netbsd x86_64-solaris x86_64-openbsd x86_64-darwin x86_64-win64 x86_64-embedded arm-linux arm-palmos arm-darwin arm-wince arm-gba arm-nds arm-embedded arm-symbian powerpc64-linux powerpc64-darwin powerpc64-embedded powerpc64-aix avr-embedded armeb-linux armeb-embedded mips-linux mipsel-linux
+MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-haiku i386-netbsd i386-solaris i386-qnx i386-netware i386-openbsd i386-wdosx i386-darwin i386-emx i386-watcom i386-netwlibc i386-wince i386-embedded i386-symbian i386-nativent i386-iphonesim m68k-linux m68k-freebsd m68k-netbsd m68k-amiga m68k-atari m68k-openbsd m68k-palmos m68k-embedded powerpc-linux powerpc-netbsd powerpc-amiga powerpc-macos powerpc-darwin powerpc-morphos powerpc-embedded powerpc-wii powerpc-aix sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-netbsd x86_64-solaris x86_64-openbsd x86_64-darwin x86_64-win64 x86_64-embedded arm-linux arm-palmos arm-darwin arm-wince arm-gba arm-nds arm-embedded arm-symbian powerpc64-linux powerpc64-darwin powerpc64-embedded powerpc64-aix avr-embedded armeb-linux armeb-embedded mips-linux mipsel-linux jvm-java jvm-android
 BSDs = freebsd netbsd openbsd darwin
 UNIXs = linux $(BSDs) solaris qnx haiku aix
 LIMIT83fs = go32v2 os2 emx watcom
@@ -258,11 +258,13 @@ ifndef BINUTILSPREFIX
 ifndef CROSSBINDIR
 ifdef CROSSCOMPILE
 ifndef DARWIN2DARWIN
+ifneq ($(CPU_TARGET),jvm)
 BINUTILSPREFIX=$(CPU_TARGET)-$(OS_TARGET)-
 endif
 endif
 endif
 endif
+endif
 UNITSDIR:=$(wildcard $(FPCDIR)/units/$(TARGETSUFFIX))
 ifeq ($(UNITSDIR),)
 UNITSDIR:=$(wildcard $(FPCDIR)/units/$(OS_TARGET))
@@ -496,6 +498,12 @@ endif
 ifeq ($(FULL_TARGET),mipsel-linux)
 override CLEAN_UNITS+=erroru popuperr ptest
 endif
+ifeq ($(FULL_TARGET),jvm-java)
+override CLEAN_UNITS+=erroru popuperr ptest
+endif
+ifeq ($(FULL_TARGET),jvm-android)
+override CLEAN_UNITS+=erroru popuperr ptest
+endif
 override INSTALL_FPCPACKAGE=y
 ifeq ($(FULL_TARGET),i386-linux)
 override COMPILER_TARGETDIR+=$(TARGETSUFFIX)
@@ -701,6 +709,12 @@ endif
 ifeq ($(FULL_TARGET),mipsel-linux)
 override COMPILER_TARGETDIR+=$(TARGETSUFFIX)
 endif
+ifeq ($(FULL_TARGET),jvm-java)
+override COMPILER_TARGETDIR+=$(TARGETSUFFIX)
+endif
+ifeq ($(FULL_TARGET),jvm-android)
+override COMPILER_TARGETDIR+=$(TARGETSUFFIX)
+endif
 ifdef REQUIRE_UNITSDIR
 override UNITSDIR+=$(REQUIRE_UNITSDIR)
 endif
@@ -1058,6 +1072,18 @@ BATCHEXT=.sh
 EXEEXT=
 SHORTSUFFIX=aix
 endif
+ifeq ($(OS_TARGET),java)
+OEXT=.class
+ASMEXT=.j
+SHAREDLIBEXT=.jar
+SHORTSUFFIX=java
+endif
+ifeq ($(OS_TARGET),android)
+OEXT=.class
+ASMEXT=.j
+SHAREDLIBEXT=.jar
+SHORTSUFFIX=android
+endif
 ifneq ($(findstring $(OS_SOURCE),$(LIMIT83fs)),)
 FPCMADE=fpcmade.$(SHORTSUFFIX)
 ZIPSUFFIX=$(SHORTSUFFIX)
@@ -1411,17 +1437,12 @@ endif
 endif
 ifdef CREATESHARED
 override FPCOPT+=-Cg
-ifeq ($(CPU_TARGET),i386)
-override FPCOPT+=-Aas
-endif
 endif
-ifeq ($(findstring 2.0.,$(FPC_VERSION)),)
 ifneq ($(findstring $(OS_TARGET),freebsd openbsd netbsd linux solaris),)
 ifeq ($(CPU_TARGET),x86_64)
 override FPCOPT+=-Cg
 endif
 endif
-endif
 ifdef LINKSHARED
 endif
 ifdef OPT
@@ -1667,6 +1688,7 @@ makefiles: fpc_makefiles
 ifneq ($(wildcard fpcmake.loc),)
 include fpcmake.loc
 endif
+.NOTPARALLEL:
 .PHONY: rtl extra fpcunit packages all clean distclean clean_ctest
 .PHONY: cleanrtl distcleanrtl
 .PHONY: cleanfpcunit distcleanfpcunit

+ 1 - 0
tests/units/Makefile.fpc

@@ -17,6 +17,7 @@ targetdir=$(TARGETSUFFIX)
 fpcdir=../..
 
 [rules]
+.NOTPARALLEL:
 .PHONY: rtl extra fpcunit packages all clean distclean clean_ctest
 .PHONY: cleanrtl distcleanrtl
 .PHONY: cleanfpcunit distcleanfpcunit

+ 97 - 75
tests/utils/Makefile

@@ -1,8 +1,8 @@
 #
-# Don't edit, this file is generated by FPCMake Version 2.0.0 [2012/04/25]
+# Don't edit, this file is generated by FPCMake Version 2.0.0 [2012/05/27]
 #
 default: all
-MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-haiku i386-netbsd i386-solaris i386-qnx i386-netware i386-openbsd i386-wdosx i386-darwin i386-emx i386-watcom i386-netwlibc i386-wince i386-embedded i386-symbian i386-nativent i386-iphonesim m68k-linux m68k-freebsd m68k-netbsd m68k-amiga m68k-atari m68k-openbsd m68k-palmos m68k-embedded powerpc-linux powerpc-netbsd powerpc-amiga powerpc-macos powerpc-darwin powerpc-morphos powerpc-embedded powerpc-wii powerpc-aix sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-netbsd x86_64-solaris x86_64-openbsd x86_64-darwin x86_64-win64 x86_64-embedded arm-linux arm-palmos arm-darwin arm-wince arm-gba arm-nds arm-embedded arm-symbian powerpc64-linux powerpc64-darwin powerpc64-embedded powerpc64-aix avr-embedded armeb-linux armeb-embedded mips-linux mipsel-linux
+MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-haiku i386-netbsd i386-solaris i386-qnx i386-netware i386-openbsd i386-wdosx i386-darwin i386-emx i386-watcom i386-netwlibc i386-wince i386-embedded i386-symbian i386-nativent i386-iphonesim m68k-linux m68k-freebsd m68k-netbsd m68k-amiga m68k-atari m68k-openbsd m68k-palmos m68k-embedded powerpc-linux powerpc-netbsd powerpc-amiga powerpc-macos powerpc-darwin powerpc-morphos powerpc-embedded powerpc-wii powerpc-aix sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-netbsd x86_64-solaris x86_64-openbsd x86_64-darwin x86_64-win64 x86_64-embedded arm-linux arm-palmos arm-darwin arm-wince arm-gba arm-nds arm-embedded arm-symbian powerpc64-linux powerpc64-darwin powerpc64-embedded powerpc64-aix avr-embedded armeb-linux armeb-embedded mips-linux mipsel-linux jvm-java jvm-android
 BSDs = freebsd netbsd openbsd darwin
 UNIXs = linux $(BSDs) solaris qnx haiku aix
 LIMIT83fs = go32v2 os2 emx watcom
@@ -258,11 +258,13 @@ ifndef BINUTILSPREFIX
 ifndef CROSSBINDIR
 ifdef CROSSCOMPILE
 ifndef DARWIN2DARWIN
+ifneq ($(CPU_TARGET),jvm)
 BINUTILSPREFIX=$(CPU_TARGET)-$(OS_TARGET)-
 endif
 endif
 endif
 endif
+endif
 UNITSDIR:=$(wildcard $(FPCDIR)/units/$(TARGETSUFFIX))
 ifeq ($(UNITSDIR),)
 UNITSDIR:=$(wildcard $(FPCDIR)/units/$(OS_TARGET))
@@ -293,208 +295,214 @@ FPCFPMAKE=$(FPC)
 endif
 endif
 ifeq ($(FULL_TARGET),i386-linux)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),i386-go32v2)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)  prepup
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)  prepup
 endif
 ifeq ($(FULL_TARGET),i386-win32)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)  prepup
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)  prepup
 endif
 ifeq ($(FULL_TARGET),i386-os2)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),i386-freebsd)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),i386-beos)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),i386-haiku)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),i386-netbsd)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),i386-solaris)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),i386-qnx)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),i386-netware)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),i386-openbsd)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),i386-wdosx)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),i386-darwin)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),i386-emx)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),i386-watcom)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),i386-netwlibc)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),i386-wince)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),i386-embedded)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),i386-symbian)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),i386-nativent)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),i386-iphonesim)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),m68k-linux)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),m68k-freebsd)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),m68k-netbsd)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),m68k-amiga)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),m68k-atari)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),m68k-openbsd)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),m68k-palmos)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),m68k-embedded)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),powerpc-linux)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),powerpc-netbsd)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),powerpc-amiga)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),powerpc-macos)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),powerpc-darwin)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),powerpc-morphos)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),powerpc-embedded)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),powerpc-wii)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),powerpc-aix)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),sparc-linux)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),sparc-netbsd)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),sparc-solaris)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),sparc-embedded)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),x86_64-linux)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),x86_64-freebsd)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),x86_64-netbsd)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),x86_64-solaris)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),x86_64-openbsd)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),x86_64-darwin)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),x86_64-win64)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)  prepup
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)  prepup
 endif
 ifeq ($(FULL_TARGET),x86_64-embedded)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),arm-linux)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),arm-palmos)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),arm-darwin)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),arm-wince)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),arm-gba)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),arm-nds)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),arm-embedded)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),arm-symbian)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),powerpc64-linux)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),powerpc64-darwin)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),powerpc64-embedded)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),powerpc64-aix)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),avr-embedded)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),armeb-linux)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),armeb-embedded)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),mips-linux)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),mipsel-linux)
-override TARGET_PROGRAMS+=dotest fptime fail testfail digest $(DBDIGEST)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
+endif
+ifeq ($(FULL_TARGET),jvm-java)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
+endif
+ifeq ($(FULL_TARGET),jvm-android)
+override TARGET_PROGRAMS+=dotest fptime fail testfail digest concat $(DBDIGEST)
 endif
 ifeq ($(FULL_TARGET),i386-linux)
 override CLEAN_PROGRAMS+=dbdigest
@@ -700,6 +708,12 @@ endif
 ifeq ($(FULL_TARGET),mipsel-linux)
 override CLEAN_PROGRAMS+=dbdigest
 endif
+ifeq ($(FULL_TARGET),jvm-java)
+override CLEAN_PROGRAMS+=dbdigest
+endif
+ifeq ($(FULL_TARGET),jvm-android)
+override CLEAN_PROGRAMS+=dbdigest
+endif
 override INSTALL_FPCPACKAGE=y
 ifdef REQUIRE_UNITSDIR
 override UNITSDIR+=$(REQUIRE_UNITSDIR)
@@ -1058,6 +1072,18 @@ BATCHEXT=.sh
 EXEEXT=
 SHORTSUFFIX=aix
 endif
+ifeq ($(OS_TARGET),java)
+OEXT=.class
+ASMEXT=.j
+SHAREDLIBEXT=.jar
+SHORTSUFFIX=java
+endif
+ifeq ($(OS_TARGET),android)
+OEXT=.class
+ASMEXT=.j
+SHAREDLIBEXT=.jar
+SHORTSUFFIX=android
+endif
 ifneq ($(findstring $(OS_SOURCE),$(LIMIT83fs)),)
 FPCMADE=fpcmade.$(SHORTSUFFIX)
 ZIPSUFFIX=$(SHORTSUFFIX)
@@ -1411,17 +1437,12 @@ endif
 endif
 ifdef CREATESHARED
 override FPCOPT+=-Cg
-ifeq ($(CPU_TARGET),i386)
-override FPCOPT+=-Aas
-endif
 endif
-ifeq ($(findstring 2.0.,$(FPC_VERSION)),)
 ifneq ($(findstring $(OS_TARGET),freebsd openbsd netbsd linux solaris),)
 ifeq ($(CPU_TARGET),x86_64)
 override FPCOPT+=-Cg
 endif
 endif
-endif
 ifdef LINKSHARED
 endif
 ifdef OPT
@@ -1830,6 +1851,7 @@ makefiles: fpc_makefiles
 ifneq ($(wildcard fpcmake.loc),)
 include fpcmake.loc
 endif
+.NOTPARALLEL:
 utils: all
 utilsdb:
 	$(MAKE) utils DBDIGEST=dbdigest

+ 2 - 1
tests/utils/Makefile.fpc

@@ -13,7 +13,7 @@ fpcdir=../..
 nortl=y
 
 [target]
-programs=dotest fptime fail testfail digest $(DBDIGEST)
+programs=dotest fptime fail testfail digest concat $(DBDIGEST)
 programs_win32=prepup
 programs_win64=prepup
 programs_go32v2=prepup
@@ -22,6 +22,7 @@ programs_go32v2=prepup
 programs=dbdigest
 
 [rules]
+.NOTPARALLEL:
 
 utils: all
 

+ 83 - 0
tests/utils/concat.pp

@@ -0,0 +1,83 @@
+{ Concatenates a number of text files. This code is in the public domain. }
+
+program concat;
+
+uses
+  SysUtils;
+
+var
+  Dst: TextFile;
+
+
+procedure usage;
+  begin
+    Writeln('Usage: concat <srcfile1> [<srcfile2> ..] <dstfile>');
+    Writeln;
+    halt(1);
+  end;
+
+
+procedure DoConcat;
+  var
+    Src: TextFile;
+    I: Longint;
+    Line: Ansistring;
+  begin
+    for I:=1 to ParamCount-1 do
+      begin
+        Assign(Src,ParamStr(I));
+        Reset(Src);
+        while not Eof(Src) do
+          begin
+            ReadLn(Src,Line);
+            Writeln(Dst,Line);
+          end;
+        Close(Src);
+      end;
+    Close(Dst);
+  end;
+
+
+procedure CheckParas;
+  var
+    I: Longint;
+  begin
+    { enough parameters? }
+    if ParamCount<2 then
+      Usage;
+    { check destination }
+    if DirectoryExists(ParamStr(ParamCount)) then
+      begin
+        Writeln('Destination "',ParamStr(ParamCount),'" is a directory');
+        halt(2);
+      end;
+    Assign(Dst,ParamStr(ParamCount));
+{$i-}
+    Rewrite(Dst);
+{$i+}
+    if IOResult<>0 then
+      begin
+        Writeln('Unable to create destination file "',ParamStr(ParamCount),'"');
+        halt(2);
+      end;
+    { check source(s) }
+    for I:=1 to ParamCount-1 do
+      begin
+        if not FileExists(ParamStr(I)) then
+          begin
+            Writeln('File "',ParamStr(I),'" does not exist');
+            halt(2);
+          end;
+        if DirectoryExists(ParamStr(I)) then
+          begin
+            Writeln('"',ParamStr(I),'" is a directory');
+            halt(2);
+          end;
+        end;
+  end;
+
+
+begin
+  CheckParas;
+  DoConcat;
+end.

+ 27 - 7
tests/utils/dotest.pp

@@ -104,6 +104,7 @@ const
   UseTimeout : boolean = false;
   emulatorname : string = '';
   TargetCanCompileLibraries : boolean = true;
+  UniqueSuffix: string = '';
 
 { Constants used in IsAbsolute function }
   TargetHasDosStyleDirectories : boolean = false;
@@ -264,6 +265,18 @@ begin
 end;
 
 
+function SplitBasePath(const s:string): string;
+var
+  i : longint;
+begin
+  i:=1;
+  while (i<length(s)) and not(s[i] in ['/','\'{$IFDEF MACOS},':'{$ENDIF}]) do
+   inc(i);
+  if s[i] in  ['/','\'{$IFDEF MACOS},':'{$ENDIF}] then
+    dec(i);
+  SplitBasePath:=Copy(s,1,i);
+end;
+
 Function SplitFileName(const s:string):string;
 var
   p : dirstr;
@@ -468,8 +481,8 @@ begin
         hs:='-iTOTPV';
       end;
   end;
-  ExecuteRedir(CompilerBin,hs,'','out','');
-  assign(t,'out');
+  ExecuteRedir(CompilerBin,hs,'','out.'+UniqueSuffix,'');
+  assign(t,'out.'+UniqueSuffix);
   {$I-}
    reset(t);
    readln(t,hs);
@@ -1408,6 +1421,7 @@ procedure getargs;
     writeln('  -G            include graph tests');
     writeln('  -I            include interactive tests');
     writeln('  -K            include known bug tests');
+    writeln('  -L<ext>       set extension of temporary files (prevent conflicts with parallel invocations)');
     writeln('  -M<emulator>  run the tests using the given emulator');
     writeln('  -O            use timeout wrapper for (remote) execution');
     writeln('  -P<path>      path to the tests tree on the remote machine');
@@ -1467,6 +1481,10 @@ procedure getargs;
                DoUsual:=false;
            end;
 
+     'L' : begin
+             UniqueSuffix:=Para;
+           end;
+
      'M' : EmulatorName:=Para;
 
      'O' : UseTimeout:=true;
@@ -1581,7 +1599,7 @@ end;
 
 procedure RunTest;
 var
-  PPDir,LibraryName : string;
+  PPDir,LibraryName,LogSuffix : string;
   Res : boolean;
 begin
   Res:=GetConfig(PPFile[current],Config);
@@ -1604,10 +1622,6 @@ begin
 {$endif MACOS}
       if not PathExists(OutputDir) then
         Verbose(V_Abort,'Output path "'+OutputDir+'" does not exists');
-      { Global log files }
-      ResLogFile:=OutputFileName('log','');
-      LongLogFile:=OutputFileName('longlog','');
-      FailLogFile:=OutputFileName('faillist','');
       { Make subdir in output if needed }
       PPDir:=SplitPath(PPFile[current]);
       if PPDir[length(PPDir)] in ['/','\'{$ifdef MACOS},':'{$endif MACOS}] then
@@ -1623,6 +1637,12 @@ begin
         end
       else
         TestOutputDir:=OutputDir;
+      { Global log files (don't use UniqueSuffix here, it's not set in case of
+        SINGLEDOTESTRUNS) }
+      LogSuffix:=SplitBasePath(PPDir)+'log';
+      ResLogFile:=OutputFileName('log',LogSuffix);
+      LongLogFile:=OutputFileName('longlog',LogSuffix);
+      FailLogFile:=OutputFileName('faillist',LogSuffix);
       { Per test logfiles }
       CompilerLogFile:=TestOutputFileName('',SplitFileName(PPFile[current]),'log');
       ExeLogFile:=TestOutputFileName('',SplitFileName(PPFile[current]),'elg');