mirror of
				https://gitlab.com/freepascal.org/fpc/source.git
				synced 2025-11-04 12:39:38 +01:00 
			
		
		
		
	* more finegrained parallelism support for testsuite runs: the tests are no
longer split per directory, but in chunks of 100 tests (configurable via
    the new CHUNKSIZE=xxx Makefile parameter), which then all can be checked
    in parallel
   o dependencies between tests are handled by always putting tests whose
     name is the same except for the last character into the same chunk
   o as previously, -jx can only be used for the "all" target, other targets
     cannot be executed in parallel
   o the "units" directory has been renamed "tstunits" because otherwise
     "make distclean" will remove it entirely now that the main tests
     makefile also compiles a program
git-svn-id: trunk@21479 -
			
			
This commit is contained in:
		
							parent
							
								
									c7a90ef5d2
								
							
						
					
					
						commit
						04df0d537e
					
				
							
								
								
									
										13
									
								
								.gitattributes
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										13
									
								
								.gitattributes
									
									
									
									
										vendored
									
									
								
							@ -11445,12 +11445,12 @@ tests/test/uunit2b.pp svneol=native#text/plain
 | 
			
		||||
tests/test/uunit3a.pp svneol=native#text/plain
 | 
			
		||||
tests/test/uunit3b.pp svneol=native#text/plain
 | 
			
		||||
tests/test/uunit3c.pp svneol=native#text/plain
 | 
			
		||||
tests/units/MPWMake -text
 | 
			
		||||
tests/units/Makefile svneol=native#text/plain
 | 
			
		||||
tests/units/Makefile.fpc svneol=native#text/plain
 | 
			
		||||
tests/units/erroru.pp svneol=native#text/plain
 | 
			
		||||
tests/units/popuperr.pp svneol=native#text/plain
 | 
			
		||||
tests/units/win32err.pp svneol=native#text/plain
 | 
			
		||||
tests/tstunits/MPWMake -text
 | 
			
		||||
tests/tstunits/Makefile svneol=native#text/plain
 | 
			
		||||
tests/tstunits/Makefile.fpc svneol=native#text/plain
 | 
			
		||||
tests/tstunits/erroru.pp svneol=native#text/plain
 | 
			
		||||
tests/tstunits/popuperr.pp svneol=native#text/plain
 | 
			
		||||
tests/tstunits/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
 | 
			
		||||
@ -11461,6 +11461,7 @@ tests/utils/digest.pp svneol=native#text/plain
 | 
			
		||||
tests/utils/dotest.pp svneol=native#text/plain
 | 
			
		||||
tests/utils/fail.pp svneol=native#text/plain
 | 
			
		||||
tests/utils/fptime.pp svneol=native#text/plain
 | 
			
		||||
tests/utils/gparmake.pp svneol=native#text/plain
 | 
			
		||||
tests/utils/libtar.pas svneol=native#text/plain
 | 
			
		||||
tests/utils/macos/LinkRunDir -text
 | 
			
		||||
tests/utils/macos/LinkRunTests -text
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										16
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@ -7594,14 +7594,14 @@ tests/test/units/variants/*.ppu
 | 
			
		||||
tests/test/units/variants/*.s
 | 
			
		||||
tests/test/units/variants/fpcmade.*
 | 
			
		||||
tests/test/units/variants/units
 | 
			
		||||
tests/units/*-stamp.*
 | 
			
		||||
tests/units/*.bak
 | 
			
		||||
tests/units/*.exe
 | 
			
		||||
tests/units/*.o
 | 
			
		||||
tests/units/*.ppu
 | 
			
		||||
tests/units/*.s
 | 
			
		||||
tests/units/fpcmade.*
 | 
			
		||||
tests/units/units
 | 
			
		||||
tests/tstunits/*-stamp.*
 | 
			
		||||
tests/tstunits/*.bak
 | 
			
		||||
tests/tstunits/*.exe
 | 
			
		||||
tests/tstunits/*.o
 | 
			
		||||
tests/tstunits/*.ppu
 | 
			
		||||
tests/tstunits/*.s
 | 
			
		||||
tests/tstunits/fpcmade.*
 | 
			
		||||
tests/tstunits/units
 | 
			
		||||
tests/utils/*.bak
 | 
			
		||||
tests/utils/*.exe
 | 
			
		||||
tests/utils/*.o
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										712
									
								
								tests/Makefile
									
									
									
									
									
								
							
							
						
						
									
										712
									
								
								tests/Makefile
									
									
									
									
									
								
							@ -294,6 +294,216 @@ FPMAKE_SKIP_CONFIG=-n
 | 
			
		||||
FPCFPMAKE=$(FPC)
 | 
			
		||||
endif
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),i386-linux)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),i386-go32v2)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),i386-win32)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),i386-os2)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),i386-freebsd)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),i386-beos)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),i386-haiku)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),i386-netbsd)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),i386-solaris)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),i386-qnx)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),i386-netware)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),i386-openbsd)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),i386-wdosx)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),i386-darwin)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),i386-emx)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),i386-watcom)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),i386-netwlibc)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),i386-wince)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),i386-embedded)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),i386-symbian)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),i386-nativent)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),i386-iphonesim)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),m68k-linux)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),m68k-freebsd)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),m68k-netbsd)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),m68k-amiga)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),m68k-atari)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),m68k-openbsd)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),m68k-palmos)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),m68k-embedded)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),powerpc-linux)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),powerpc-netbsd)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),powerpc-amiga)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),powerpc-macos)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),powerpc-darwin)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),powerpc-morphos)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),powerpc-embedded)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),powerpc-wii)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),powerpc-aix)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),sparc-linux)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),sparc-netbsd)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),sparc-solaris)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),sparc-embedded)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),x86_64-linux)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),x86_64-freebsd)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),x86_64-netbsd)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),x86_64-solaris)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),x86_64-openbsd)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),x86_64-darwin)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),x86_64-win64)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),x86_64-embedded)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),arm-linux)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),arm-palmos)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),arm-darwin)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),arm-wince)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),arm-gba)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),arm-nds)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),arm-embedded)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),arm-symbian)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),powerpc64-linux)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),powerpc64-darwin)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),powerpc64-embedded)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),powerpc64-aix)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),avr-embedded)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),armeb-linux)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),armeb-embedded)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),mips-linux)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),mipsel-linux)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),jvm-java)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),jvm-android)
 | 
			
		||||
override TARGET_PROGRAMS+=gparmake
 | 
			
		||||
endif
 | 
			
		||||
override INSTALL_FPCPACKAGE=y
 | 
			
		||||
ifdef REQUIRE_UNITSDIR
 | 
			
		||||
override UNITSDIR+=$(REQUIRE_UNITSDIR)
 | 
			
		||||
@ -905,6 +1115,255 @@ else
 | 
			
		||||
TAROPT=vz
 | 
			
		||||
TAREXT=.tar.gz
 | 
			
		||||
endif
 | 
			
		||||
override REQUIRE_PACKAGES=rtl 
 | 
			
		||||
ifeq ($(FULL_TARGET),i386-linux)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),i386-go32v2)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),i386-win32)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),i386-os2)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),i386-freebsd)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),i386-beos)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),i386-haiku)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),i386-netbsd)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),i386-solaris)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),i386-qnx)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),i386-netware)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),i386-openbsd)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),i386-wdosx)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),i386-darwin)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),i386-emx)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),i386-watcom)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),i386-netwlibc)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),i386-wince)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),i386-embedded)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),i386-symbian)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),i386-nativent)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),i386-iphonesim)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),m68k-linux)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),m68k-freebsd)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),m68k-netbsd)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),m68k-amiga)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),m68k-atari)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),m68k-openbsd)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),m68k-palmos)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),m68k-embedded)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),powerpc-linux)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),powerpc-netbsd)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),powerpc-amiga)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),powerpc-macos)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),powerpc-darwin)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),powerpc-morphos)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),powerpc-embedded)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),powerpc-wii)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),powerpc-aix)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),sparc-linux)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),sparc-netbsd)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),sparc-solaris)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),sparc-embedded)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),x86_64-linux)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),x86_64-freebsd)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),x86_64-netbsd)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),x86_64-solaris)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),x86_64-openbsd)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),x86_64-darwin)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),x86_64-win64)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),x86_64-embedded)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),arm-linux)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),arm-palmos)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),arm-darwin)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),arm-wince)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),arm-gba)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),arm-nds)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),arm-embedded)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),arm-symbian)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),powerpc64-linux)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),powerpc64-darwin)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),powerpc64-embedded)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),powerpc64-aix)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),avr-embedded)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),armeb-linux)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),armeb-embedded)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),mips-linux)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),mipsel-linux)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),jvm-java)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(FULL_TARGET),jvm-android)
 | 
			
		||||
REQUIRE_PACKAGES_RTL=1
 | 
			
		||||
endif
 | 
			
		||||
ifdef REQUIRE_PACKAGES_RTL
 | 
			
		||||
PACKAGEDIR_RTL:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /rtl/Makefile.fpc,$(PACKAGESDIR))))))
 | 
			
		||||
ifneq ($(PACKAGEDIR_RTL),)
 | 
			
		||||
ifneq ($(wildcard $(PACKAGEDIR_RTL)/units/$(TARGETSUFFIX)),)
 | 
			
		||||
UNITDIR_RTL=$(PACKAGEDIR_RTL)/units/$(TARGETSUFFIX)
 | 
			
		||||
else
 | 
			
		||||
UNITDIR_RTL=$(PACKAGEDIR_RTL)
 | 
			
		||||
endif
 | 
			
		||||
ifneq ($(wildcard $(PACKAGEDIR_RTL)/units/$(SOURCESUFFIX)),)
 | 
			
		||||
UNITDIR_FPMAKE_RTL=$(PACKAGEDIR_RTL)/units/$(SOURCESUFFIX)
 | 
			
		||||
else
 | 
			
		||||
ifneq ($(wildcard $(PACKAGEDIR_RTL)/units_bs/$(SOURCESUFFIX)),)
 | 
			
		||||
UNITDIR_FPMAKE_RTL=$(PACKAGEDIR_RTL)/units_bs/$(SOURCESUFFIX)
 | 
			
		||||
else
 | 
			
		||||
UNITDIR_FPMAKE_RTL=$(PACKAGEDIR_RTL)
 | 
			
		||||
endif
 | 
			
		||||
endif
 | 
			
		||||
ifdef CHECKDEPEND
 | 
			
		||||
$(PACKAGEDIR_RTL)/$(OS_TARGET)/$(FPCMADE):
 | 
			
		||||
	$(MAKE) -C $(PACKAGEDIR_RTL)/$(OS_TARGET) $(FPCMADE)
 | 
			
		||||
override ALLDEPENDENCIES+=$(PACKAGEDIR_RTL)/$(OS_TARGET)/$(FPCMADE)
 | 
			
		||||
endif
 | 
			
		||||
else
 | 
			
		||||
PACKAGEDIR_RTL=
 | 
			
		||||
UNITDIR_RTL:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /rtl/Package.fpc,$(UNITSDIR)))))
 | 
			
		||||
ifneq ($(UNITDIR_RTL),)
 | 
			
		||||
UNITDIR_RTL:=$(firstword $(UNITDIR_RTL))
 | 
			
		||||
else
 | 
			
		||||
UNITDIR_RTL=
 | 
			
		||||
endif
 | 
			
		||||
endif
 | 
			
		||||
ifdef UNITDIR_RTL
 | 
			
		||||
override COMPILER_UNITDIR+=$(UNITDIR_RTL)
 | 
			
		||||
endif
 | 
			
		||||
ifdef UNITDIR_FPMAKE_RTL
 | 
			
		||||
override COMPILER_FPMAKE_UNITDIR+=$(UNITDIR_FPMAKE_RTL)
 | 
			
		||||
endif
 | 
			
		||||
endif
 | 
			
		||||
ifndef NOCPUDEF
 | 
			
		||||
override FPCOPTDEF=$(ARCH)
 | 
			
		||||
endif
 | 
			
		||||
@ -1059,10 +1518,170 @@ EXECPPAS:=@$(PPAS)
 | 
			
		||||
endif
 | 
			
		||||
endif
 | 
			
		||||
endif
 | 
			
		||||
.PHONY: fpc_exes
 | 
			
		||||
ifndef CROSSINSTALL
 | 
			
		||||
ifneq ($(TARGET_PROGRAMS),)
 | 
			
		||||
override EXEFILES=$(addsuffix $(EXEEXT),$(TARGET_PROGRAMS))
 | 
			
		||||
override EXEOFILES:=$(addsuffix $(OEXT),$(TARGET_PROGRAMS)) $(addprefix $(STATICLIBPREFIX),$(addsuffix $(STATICLIBEXT),$(TARGET_PROGRAMS))) $(addprefix $(IMPORTLIBPREFIX),$(addsuffix $(STATICLIBEXT),$(TARGET_PROGRAMS)))
 | 
			
		||||
override EXEDBGFILES:=$(addsuffix $(EXEDBGEXT),$(TARGET_PROGRAMS))
 | 
			
		||||
override ALLTARGET+=fpc_exes
 | 
			
		||||
override INSTALLEXEFILES+=$(EXEFILES)
 | 
			
		||||
override CLEANEXEFILES+=$(EXEFILES) $(EXEOFILES)
 | 
			
		||||
override CLEANEXEDBGFILES+=$(EXEDBGFILES)
 | 
			
		||||
ifeq ($(OS_TARGET),os2)
 | 
			
		||||
override CLEANEXEFILES+=$(addsuffix $(AOUTEXT),$(TARGET_PROGRAMS))
 | 
			
		||||
endif
 | 
			
		||||
ifeq ($(OS_TARGET),emx)
 | 
			
		||||
override CLEANEXEFILES+=$(addsuffix $(AOUTEXT),$(TARGET_PROGRAMS))
 | 
			
		||||
endif
 | 
			
		||||
endif
 | 
			
		||||
endif
 | 
			
		||||
fpc_exes: $(COMPILER_TARGETDIR) $(COMPILER_UNITTARGETDIR) $(EXEFILES)
 | 
			
		||||
ifdef TARGET_RSTS
 | 
			
		||||
override RSTFILES=$(addsuffix $(RSTEXT),$(TARGET_RSTS))
 | 
			
		||||
override CLEANRSTFILES+=$(RSTFILES)
 | 
			
		||||
endif
 | 
			
		||||
.PHONY: fpc_all fpc_smart fpc_debug fpc_release fpc_shared
 | 
			
		||||
$(FPCMADE): $(ALLDEPENDENCIES) $(ALLTARGET)
 | 
			
		||||
	@$(ECHOREDIR) Compiled > $(FPCMADE)
 | 
			
		||||
fpc_all: $(FPCMADE)
 | 
			
		||||
fpc_smart:
 | 
			
		||||
	$(MAKE) all LINKSMART=1 CREATESMART=1
 | 
			
		||||
fpc_debug:
 | 
			
		||||
	$(MAKE) all DEBUG=1
 | 
			
		||||
fpc_release:
 | 
			
		||||
	$(MAKE) all RELEASE=1
 | 
			
		||||
.SUFFIXES: $(EXEEXT) $(PPUEXT) $(OEXT) .pas .lpr .dpr .pp .rc .res
 | 
			
		||||
$(COMPILER_UNITTARGETDIR):
 | 
			
		||||
	$(MKDIRTREE) $(COMPILER_UNITTARGETDIR)
 | 
			
		||||
$(COMPILER_TARGETDIR):
 | 
			
		||||
	$(MKDIRTREE) $(COMPILER_TARGETDIR)
 | 
			
		||||
%$(PPUEXT): %.pp
 | 
			
		||||
	$(COMPILER) $<
 | 
			
		||||
	$(EXECPPAS)
 | 
			
		||||
%$(PPUEXT): %.pas
 | 
			
		||||
	$(COMPILER) $<
 | 
			
		||||
	$(EXECPPAS)
 | 
			
		||||
%$(EXEEXT): %.pp
 | 
			
		||||
	$(COMPILER) $<
 | 
			
		||||
	$(EXECPPAS)
 | 
			
		||||
%$(EXEEXT): %.pas
 | 
			
		||||
	$(COMPILER) $<
 | 
			
		||||
	$(EXECPPAS)
 | 
			
		||||
%$(EXEEXT): %.lpr
 | 
			
		||||
	$(COMPILER) $<
 | 
			
		||||
	$(EXECPPAS)
 | 
			
		||||
%$(EXEEXT): %.dpr
 | 
			
		||||
	$(COMPILER) $<
 | 
			
		||||
	$(EXECPPAS)
 | 
			
		||||
%.res: %.rc
 | 
			
		||||
	windres -i $< -o $@
 | 
			
		||||
vpath %.pp $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
 | 
			
		||||
vpath %.pas $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
 | 
			
		||||
vpath %.lpr $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
 | 
			
		||||
vpath %.dpr $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
 | 
			
		||||
vpath %.inc $(COMPILER_INCLUDEDIR)
 | 
			
		||||
vpath %$(OEXT) $(COMPILER_UNITTARGETDIR)
 | 
			
		||||
vpath %$(PPUEXT) $(COMPILER_UNITTARGETDIR)
 | 
			
		||||
.PHONY: fpc_shared
 | 
			
		||||
override INSTALLTARGET+=fpc_shared_install
 | 
			
		||||
ifndef SHARED_LIBVERSION
 | 
			
		||||
SHARED_LIBVERSION=$(FPC_VERSION)
 | 
			
		||||
endif
 | 
			
		||||
ifndef SHARED_LIBNAME
 | 
			
		||||
SHARED_LIBNAME=$(PACKAGE_NAME)
 | 
			
		||||
endif
 | 
			
		||||
ifndef SHARED_FULLNAME
 | 
			
		||||
SHARED_FULLNAME=$(SHAREDLIBPREFIX)$(SHARED_LIBNAME)-$(SHARED_LIBVERSION)$(SHAREDLIBEXT)
 | 
			
		||||
endif
 | 
			
		||||
ifndef SHARED_LIBUNITS
 | 
			
		||||
SHARED_LIBUNITS:=$(TARGET_UNITS) $(TARGET_IMPLICITUNITS)
 | 
			
		||||
override SHARED_LIBUNITS:=$(filter-out $(INSTALL_BUILDUNIT),$(SHARED_LIBUNITS))
 | 
			
		||||
endif
 | 
			
		||||
fpc_shared:
 | 
			
		||||
ifdef HASSHAREDLIB
 | 
			
		||||
	$(MAKE) all CREATESHARED=1 LINKSHARED=1 CREATESMART=1
 | 
			
		||||
ifneq ($(SHARED_BUILD),n)
 | 
			
		||||
	$(PPUMOVE) -q $(SHARED_LIBUNITS) -i$(COMPILER_UNITTARGETDIR) -o$(SHARED_FULLNAME) -d$(COMPILER_UNITTARGETDIR)
 | 
			
		||||
endif
 | 
			
		||||
else
 | 
			
		||||
	@$(ECHO) Shared Libraries not supported
 | 
			
		||||
endif
 | 
			
		||||
fpc_shared_install:
 | 
			
		||||
ifneq ($(SHARED_BUILD),n)
 | 
			
		||||
ifneq ($(SHARED_LIBUNITS),)
 | 
			
		||||
ifneq ($(wildcard $(COMPILER_UNITTARGETDIR)/$(SHARED_FULLNAME)),)
 | 
			
		||||
	$(INSTALL) $(COMPILER_UNITTARGETDIR)/$(SHARED_FULLNAME) $(INSTALL_SHAREDDIR)
 | 
			
		||||
endif
 | 
			
		||||
endif
 | 
			
		||||
endif
 | 
			
		||||
.PHONY: fpc_install fpc_sourceinstall fpc_exampleinstall
 | 
			
		||||
ifdef INSTALL_UNITS
 | 
			
		||||
override INSTALLPPUFILES+=$(addsuffix $(PPUEXT),$(INSTALL_UNITS))
 | 
			
		||||
endif
 | 
			
		||||
ifdef INSTALL_BUILDUNIT
 | 
			
		||||
override INSTALLPPUFILES:=$(filter-out $(INSTALL_BUILDUNIT)$(PPUEXT),$(INSTALLPPUFILES))
 | 
			
		||||
endif
 | 
			
		||||
ifdef INSTALLPPUFILES
 | 
			
		||||
override INSTALLPPULINKFILES:=$(subst $(PPUEXT),$(OEXT),$(INSTALLPPUFILES)) $(addprefix $(STATICLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(INSTALLPPUFILES))) $(addprefix $(IMPORTLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(INSTALLPPUFILES)))
 | 
			
		||||
ifneq ($(UNITTARGETDIRPREFIX),)
 | 
			
		||||
override INSTALLPPUFILES:=$(addprefix $(UNITTARGETDIRPREFIX),$(notdir $(INSTALLPPUFILES)))
 | 
			
		||||
override INSTALLPPULINKFILES:=$(wildcard $(addprefix $(UNITTARGETDIRPREFIX),$(notdir $(INSTALLPPULINKFILES))))
 | 
			
		||||
endif
 | 
			
		||||
override INSTALL_CREATEPACKAGEFPC=1
 | 
			
		||||
endif
 | 
			
		||||
ifdef INSTALLEXEFILES
 | 
			
		||||
ifneq ($(TARGETDIRPREFIX),)
 | 
			
		||||
override INSTALLEXEFILES:=$(addprefix $(TARGETDIRPREFIX),$(notdir $(INSTALLEXEFILES)))
 | 
			
		||||
endif
 | 
			
		||||
endif
 | 
			
		||||
fpc_install: all $(INSTALLTARGET)
 | 
			
		||||
ifdef INSTALLEXEFILES
 | 
			
		||||
	$(MKDIR) $(INSTALL_BINDIR)
 | 
			
		||||
	$(INSTALLEXE) $(INSTALLEXEFILES) $(INSTALL_BINDIR)
 | 
			
		||||
endif
 | 
			
		||||
ifdef INSTALL_CREATEPACKAGEFPC
 | 
			
		||||
ifdef FPCMAKE
 | 
			
		||||
ifdef PACKAGE_VERSION
 | 
			
		||||
ifneq ($(wildcard Makefile.fpc),)
 | 
			
		||||
	$(FPCMAKE) -p -T$(CPU_TARGET)-$(OS_TARGET) Makefile.fpc
 | 
			
		||||
	$(MKDIR) $(INSTALL_UNITDIR)
 | 
			
		||||
	$(INSTALL) Package.fpc $(INSTALL_UNITDIR)
 | 
			
		||||
endif
 | 
			
		||||
endif
 | 
			
		||||
endif
 | 
			
		||||
endif
 | 
			
		||||
ifdef INSTALLPPUFILES
 | 
			
		||||
	$(MKDIR) $(INSTALL_UNITDIR)
 | 
			
		||||
	$(INSTALL) $(INSTALLPPUFILES) $(INSTALL_UNITDIR)
 | 
			
		||||
ifneq ($(INSTALLPPULINKFILES),)
 | 
			
		||||
	$(INSTALL) $(INSTALLPPULINKFILES) $(INSTALL_UNITDIR)
 | 
			
		||||
endif
 | 
			
		||||
ifneq ($(wildcard $(LIB_FULLNAME)),)
 | 
			
		||||
	$(MKDIR) $(INSTALL_LIBDIR)
 | 
			
		||||
	$(INSTALL) $(LIB_FULLNAME) $(INSTALL_LIBDIR)
 | 
			
		||||
ifdef inUnix
 | 
			
		||||
	ln -sf $(LIB_FULLNAME) $(INSTALL_LIBDIR)/$(LIB_NAME)
 | 
			
		||||
endif
 | 
			
		||||
endif
 | 
			
		||||
endif
 | 
			
		||||
ifdef INSTALL_FILES
 | 
			
		||||
	$(MKDIR) $(INSTALL_DATADIR)
 | 
			
		||||
	$(INSTALL) $(INSTALL_FILES) $(INSTALL_DATADIR)
 | 
			
		||||
endif
 | 
			
		||||
fpc_sourceinstall: distclean
 | 
			
		||||
	$(MKDIR) $(INSTALL_SOURCEDIR)
 | 
			
		||||
	$(COPYTREE) $(BASEDIR)/* $(INSTALL_SOURCEDIR)
 | 
			
		||||
fpc_exampleinstall: $(addsuffix _distclean,$(TARGET_EXAMPLEDIRS))
 | 
			
		||||
ifdef HASEXAMPLES
 | 
			
		||||
	$(MKDIR) $(INSTALL_EXAMPLEDIR)
 | 
			
		||||
endif
 | 
			
		||||
ifdef EXAMPLESOURCEFILES
 | 
			
		||||
	$(COPY) $(EXAMPLESOURCEFILES) $(INSTALL_EXAMPLEDIR)
 | 
			
		||||
endif
 | 
			
		||||
ifdef TARGET_EXAMPLEDIRS
 | 
			
		||||
	$(COPYTREE) $(addsuffix /*,$(TARGET_EXAMPLEDIRS)) $(INSTALL_EXAMPLEDIR)
 | 
			
		||||
endif
 | 
			
		||||
.PHONY: fpc_clean fpc_cleanall fpc_distclean
 | 
			
		||||
ifdef EXEFILES
 | 
			
		||||
override CLEANEXEFILES:=$(addprefix $(TARGETDIRPREFIX),$(CLEANEXEFILES))
 | 
			
		||||
@ -1247,22 +1866,23 @@ endif
 | 
			
		||||
fpc_makefile_sub2: $(addsuffix _makefile_dirs,$(TARGET_DIRS) $(TARGET_EXAMPLEDIRS))
 | 
			
		||||
fpc_makefile_dirs: fpc_makefile_sub1 fpc_makefile_sub2
 | 
			
		||||
fpc_makefiles: fpc_makefile fpc_makefile_dirs
 | 
			
		||||
debug:
 | 
			
		||||
smart:
 | 
			
		||||
release:
 | 
			
		||||
debug: fpc_debug
 | 
			
		||||
smart: fpc_smart
 | 
			
		||||
release: fpc_release
 | 
			
		||||
units: fpc_units
 | 
			
		||||
examples:
 | 
			
		||||
shared:
 | 
			
		||||
install:
 | 
			
		||||
sourceinstall:
 | 
			
		||||
exampleinstall:
 | 
			
		||||
shared: fpc_shared
 | 
			
		||||
install: fpc_install
 | 
			
		||||
sourceinstall: fpc_sourceinstall
 | 
			
		||||
exampleinstall: fpc_exampleinstall
 | 
			
		||||
distinstall:
 | 
			
		||||
zipinstall:
 | 
			
		||||
zipsourceinstall:
 | 
			
		||||
zipexampleinstall:
 | 
			
		||||
zipdistinstall:
 | 
			
		||||
cleanall:
 | 
			
		||||
cleanall: fpc_cleanall
 | 
			
		||||
makefiles: fpc_makefiles
 | 
			
		||||
.PHONY: debug smart release examples shared install sourceinstall exampleinstall distinstall zipinstall zipsourceinstall zipexampleinstall zipdistinstall cleanall makefiles
 | 
			
		||||
.PHONY: debug smart release units examples shared install sourceinstall exampleinstall distinstall zipinstall zipsourceinstall zipexampleinstall zipdistinstall cleanall makefiles
 | 
			
		||||
ifneq ($(wildcard fpcmake.loc),)
 | 
			
		||||
include fpcmake.loc
 | 
			
		||||
endif
 | 
			
		||||
@ -1369,8 +1989,11 @@ export QUICKTEST
 | 
			
		||||
else
 | 
			
		||||
override TESTSUBDIRS+=$(TESTPACKAGESUBDIRS) alglib
 | 
			
		||||
endif
 | 
			
		||||
ifndef CHUNKSIZE
 | 
			
		||||
export CHUNKSIZE:=100
 | 
			
		||||
endif
 | 
			
		||||
TESTDIRS:=test $(addprefix test/,$(TESTSUBDIRS))
 | 
			
		||||
.PHONY: utils units copyfiles testprep
 | 
			
		||||
.PHONY: utils tstunits copyfiles testprep
 | 
			
		||||
utils:
 | 
			
		||||
	$(MAKE) -C utils utils
 | 
			
		||||
utilsdb:
 | 
			
		||||
@ -1384,11 +2007,14 @@ endif
 | 
			
		||||
ifndef CONCAT
 | 
			
		||||
CONCAT=utils/concat
 | 
			
		||||
endif
 | 
			
		||||
ifndef GPARMAKE
 | 
			
		||||
GPARMAKE=./gparmake$(EXEEXT)
 | 
			
		||||
endif
 | 
			
		||||
ifndef PREPUP
 | 
			
		||||
PREPUP=utils/prepup
 | 
			
		||||
endif
 | 
			
		||||
units:
 | 
			
		||||
	$(MAKE) -C units FPC_VERSION= FPC=$(TEST_FPC) CPU_TARGET=$(TEST_CPU_TARGET) OS_TARGET=$(TEST_OS_TARGET) OPT="$(TEST_OPT)" CCOMPILER=$(TEST_CCOMPILER) BINUTILSPREFIX=$(TEST_BINUTILSPREFIX)
 | 
			
		||||
tstunits:
 | 
			
		||||
	$(MAKE) -C tstunits FPC_VERSION= FPC=$(TEST_FPC) CPU_TARGET=$(TEST_CPU_TARGET) OS_TARGET=$(TEST_OS_TARGET) OPT="$(TEST_OPT)" CCOMPILER=$(TEST_CCOMPILER) BINUTILSPREFIX=$(TEST_BINUTILSPREFIX)
 | 
			
		||||
.PHONY: create_c_objects delete_c_objects copyfiles
 | 
			
		||||
C_SOURCE_DIR=test/cg/obj
 | 
			
		||||
C_SOURCES=ctest.c tcext3.c tcext4.c tcext5.c tcext6.c
 | 
			
		||||
@ -1427,9 +2053,8 @@ copyfiles: $(TEST_OUTPUTDIR)
 | 
			
		||||
	-$(COPY) $(C_OBJECTS) $(TEST_OUTPUTDIR)/test/cg
 | 
			
		||||
	-$(COPY) $(CPP_OBJECTS) $(TEST_OUTPUTDIR)/test/cg
 | 
			
		||||
	-$(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): utils units copyfiles
 | 
			
		||||
testprep-stamp.$(TEST_FULL_TARGET): utils tstunits copyfiles
 | 
			
		||||
	$(ECHOREDIR) $(DATE) > testprep-stamp.$(TEST_FULL_TARGET)
 | 
			
		||||
$(TEST_OUTPUTDIR):
 | 
			
		||||
	$(MKDIRTREE) $@
 | 
			
		||||
@ -1546,6 +2171,7 @@ ifndef SINGLEDOTESTRUNS
 | 
			
		||||
	$(Q)$(DOTEST) $(DOTESTOPT) -e $(wildcard $(addsuffix /t*.pp,$(TESTDIRS)))
 | 
			
		||||
endif
 | 
			
		||||
alltests: alltest alltbs alltbf allwebtbs allwebtbf
 | 
			
		||||
ifdef SINGLEDOTESTRUNS
 | 
			
		||||
.PHONY: allexectbs allexectbf allexecwebtbs allexecwebtbf allexectest allexectests
 | 
			
		||||
allexectbs: $(addsuffix .tbslog, $(LOGFILES))
 | 
			
		||||
allexectbf: $(addsuffix .tbflog, $(LOGFILES))
 | 
			
		||||
@ -1555,50 +2181,50 @@ 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) > $@
 | 
			
		||||
	$(Q)$(ECHO) -n >> $(TEST_OUTPUTDIR)/faillist.tbslog
 | 
			
		||||
	$(Q)$(ECHO) -n >> $(TEST_OUTPUTDIR)/longlog.tbslog
 | 
			
		||||
$(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) > $@
 | 
			
		||||
	$(Q)$(ECHO) -n >> $(TEST_OUTPUTDIR)/faillist.tbflog
 | 
			
		||||
	$(Q)$(ECHO) -n >> $(TEST_OUTPUTDIR)/longlog.tbflog
 | 
			
		||||
$(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) > $@
 | 
			
		||||
	$(Q)$(ECHO) -n >> $(TEST_OUTPUTDIR)/faillist.webtbslog
 | 
			
		||||
	$(Q)$(ECHO) -n >> $(TEST_OUTPUTDIR)/longlog.webtbslog
 | 
			
		||||
$(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) > $@
 | 
			
		||||
	$(Q)$(ECHO) -n >> $(TEST_OUTPUTDIR)/faillist.webtbflog
 | 
			
		||||
	$(Q)$(ECHO) -n >> $(TEST_OUTPUTDIR)/longlog.webtbflog
 | 
			
		||||
$(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))
 | 
			
		||||
	$(Q)$(ECHO) -n >> $(TEST_OUTPUTDIR)/faillist.testlog
 | 
			
		||||
	$(Q)$(ECHO) -n >> $(TEST_OUTPUTDIR)/longlog.testlog
 | 
			
		||||
allexectests:  $(TEST_OUTPUTDIR)/log.testlog $(TEST_OUTPUTDIR)/log.tbslog $(TEST_OUTPUTDIR)/log.tbflog $(TEST_OUTPUTDIR)/log.webtbslog $(TEST_OUTPUTDIR)/log.webtbflog $(addprefix $(TEST_OUTPUTDIR)/,$(foreach EXT, $(LOGEXT), $(addsuffix $(EXT), faillist longlog))) $(addsuffix .mergedlog, $(LOGFILES))
 | 
			
		||||
else
 | 
			
		||||
.PHONY: allexectests
 | 
			
		||||
$(GPARMAKE): $(COMPILER_UNITTARGETDIR) utils/gparmake.pp
 | 
			
		||||
	$(FPC) $(FPC_OPT) -FE. utils/gparmake.pp
 | 
			
		||||
$(TEST_OUTPUTDIR)/MakeChunks-$(TEST_TARGETSUFFIX).inc: $(GPARMAKE) $(TEST_OUTPUTDIR)
 | 
			
		||||
	$(Q)$(GPARMAKE) $(TEST_OUTPUTDIR)/MakeChunks-$(TEST_TARGETSUFFIX).inc 1 $(CHUNKSIZE) $(sort $(wildcard $(addsuffix /t*.pp,$(TESTDIRS))))
 | 
			
		||||
	$(Q)$(GPARMAKE) -a $(TEST_OUTPUTDIR)/MakeChunks-$(TEST_TARGETSUFFIX).inc 100000 $(CHUNKSIZE) $(sort $(wildcard tbs/t*.pp))
 | 
			
		||||
	$(Q)$(GPARMAKE) -a $(TEST_OUTPUTDIR)/MakeChunks-$(TEST_TARGETSUFFIX).inc 150000 $(CHUNKSIZE) $(sort $(wildcard tbf/t*.pp))
 | 
			
		||||
	$(Q)$(GPARMAKE) -a $(TEST_OUTPUTDIR)/MakeChunks-$(TEST_TARGETSUFFIX).inc 200000 $(CHUNKSIZE) $(sort $(wildcard webtbs/t*.pp))
 | 
			
		||||
	$(Q)$(GPARMAKE) -a $(TEST_OUTPUTDIR)/MakeChunks-$(TEST_TARGETSUFFIX).inc 300000 $(CHUNKSIZE) $(sort $(wildcard webtbf/t*.pp))
 | 
			
		||||
ifneq (,$(findstring all,$(MAKECMDGOALS)))
 | 
			
		||||
include $(TEST_OUTPUTDIR)/MakeChunks-$(TEST_TARGETSUFFIX).inc
 | 
			
		||||
endif
 | 
			
		||||
allexectests: $(TEST_OUTPUTDIR)/MakeChunks-$(TEST_TARGETSUFFIX).inc
 | 
			
		||||
endif
 | 
			
		||||
.PHONY: clean distclean clean_test clean_sources
 | 
			
		||||
clean_sources:
 | 
			
		||||
	-$(DEL) $(wildcard $(patsubst %.pp,%$(PPUEXT),$(wildcard $(addsuffix /*.pp,$(DIRS)))))
 | 
			
		||||
clean_test:
 | 
			
		||||
	-$(DELTREE) $(TEST_OUTPUTDIR)
 | 
			
		||||
	-$(DEL) core gmon.out testprep-stamp.$(TEST_FULL_TARGET) dotgz.bat
 | 
			
		||||
clean: clean_sources
 | 
			
		||||
clean: clean_sources fpc_clean
 | 
			
		||||
	$(MAKE) clean_test CPU_TARGET=$(TEST_CPU_TARGET) OS_TARGET=$(TEST_OS_TARGET)
 | 
			
		||||
	$(MAKE) -C units clean CPU_TARGET=$(TEST_CPU_TARGET) OS_TARGET=$(TEST_OS_TARGET)
 | 
			
		||||
	$(MAKE) -C tstunits clean CPU_TARGET=$(TEST_CPU_TARGET) OS_TARGET=$(TEST_OS_TARGET)
 | 
			
		||||
distclean: clean fpc_distclean
 | 
			
		||||
	$(DELTREE) output
 | 
			
		||||
	$(MAKE) -C utils distclean
 | 
			
		||||
	$(MAKE) -C units distclean
 | 
			
		||||
	$(MAKE) -C tstunits distclean
 | 
			
		||||
	-$(DEL) testprep-stamp.*
 | 
			
		||||
.PHONY: all full digest onlyknown onlygraph onlyinteractive
 | 
			
		||||
digest : utils
 | 
			
		||||
 | 
			
		||||
@ -9,6 +9,9 @@ fpcpackage=y
 | 
			
		||||
fpcdir=..
 | 
			
		||||
rule=allexectests
 | 
			
		||||
 | 
			
		||||
[target]
 | 
			
		||||
programs=gparmake
 | 
			
		||||
 | 
			
		||||
[rules]
 | 
			
		||||
unexport FPC_VERSION
 | 
			
		||||
 | 
			
		||||
@ -147,10 +150,15 @@ else
 | 
			
		||||
override TESTSUBDIRS+=$(TESTPACKAGESUBDIRS) alglib
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
# number of tests to run per (potentially parallel) chunk/dotest invocation
 | 
			
		||||
ifndef CHUNKSIZE
 | 
			
		||||
export CHUNKSIZE:=100
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
# All full dirnames in the test/ dir including the subdir self
 | 
			
		||||
TESTDIRS:=test $(addprefix test/,$(TESTSUBDIRS))
 | 
			
		||||
 | 
			
		||||
.PHONY: utils units copyfiles testprep
 | 
			
		||||
.PHONY: utils tstunits copyfiles testprep
 | 
			
		||||
 | 
			
		||||
################################
 | 
			
		||||
# Utilities
 | 
			
		||||
@ -174,6 +182,10 @@ ifndef CONCAT
 | 
			
		||||
CONCAT=utils/concat
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifndef GPARMAKE
 | 
			
		||||
GPARMAKE=./gparmake$(EXEEXT)
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifndef PREPUP
 | 
			
		||||
PREPUP=utils/prepup
 | 
			
		||||
endif
 | 
			
		||||
@ -183,8 +195,8 @@ endif
 | 
			
		||||
# Units
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
units:
 | 
			
		||||
        $(MAKE) -C units FPC_VERSION= FPC=$(TEST_FPC) CPU_TARGET=$(TEST_CPU_TARGET) OS_TARGET=$(TEST_OS_TARGET) OPT="$(TEST_OPT)" CCOMPILER=$(TEST_CCOMPILER) BINUTILSPREFIX=$(TEST_BINUTILSPREFIX)
 | 
			
		||||
tstunits:
 | 
			
		||||
        $(MAKE) -C tstunits FPC_VERSION= FPC=$(TEST_FPC) CPU_TARGET=$(TEST_CPU_TARGET) OS_TARGET=$(TEST_OS_TARGET) OPT="$(TEST_OPT)" CCOMPILER=$(TEST_CCOMPILER) BINUTILSPREFIX=$(TEST_BINUTILSPREFIX)
 | 
			
		||||
 | 
			
		||||
################################
 | 
			
		||||
# Copy test environment dependent files ctest.o, cext3.o, cext4.o to test/cg etc
 | 
			
		||||
@ -235,14 +247,13 @@ copyfiles: $(TEST_OUTPUTDIR)
 | 
			
		||||
        -$(COPY) $(C_OBJECTS) $(TEST_OUTPUTDIR)/test/cg
 | 
			
		||||
        -$(COPY) $(CPP_OBJECTS) $(TEST_OUTPUTDIR)/test/cg
 | 
			
		||||
        -$(MKDIRTREE) $(TEST_OUTPUTDIR)/test/units/system
 | 
			
		||||
        $(COPY) test/units/system/test*.txt $(TEST_OUTPUTDIR)/test/units/system
 | 
			
		||||
 | 
			
		||||
################################
 | 
			
		||||
# Preparation for tests
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
testprep: testprep-stamp.$(TEST_FULL_TARGET)
 | 
			
		||||
testprep-stamp.$(TEST_FULL_TARGET): utils units copyfiles
 | 
			
		||||
testprep-stamp.$(TEST_FULL_TARGET): utils tstunits copyfiles
 | 
			
		||||
        $(ECHOREDIR) $(DATE) > testprep-stamp.$(TEST_FULL_TARGET)
 | 
			
		||||
 | 
			
		||||
$(TEST_OUTPUTDIR):
 | 
			
		||||
@ -406,6 +417,7 @@ alltests: alltest alltbs alltbf allwebtbs allwebtbf
 | 
			
		||||
# Compile and Run tests
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
ifdef SINGLEDOTESTRUNS
 | 
			
		||||
.PHONY: allexectbs allexectbf allexecwebtbs allexecwebtbf allexectest allexectests
 | 
			
		||||
 | 
			
		||||
allexectbs: $(addsuffix .tbslog, $(LOGFILES))
 | 
			
		||||
@ -418,51 +430,74 @@ $(TEST_OUTPUTDIR)/%.mergedlog : $(TEST_OUTPUTDIR)/%.testlog $(TEST_OUTPUTDIR)/%.
 | 
			
		||||
	$(Q)$(CONCAT) $^ $@
 | 
			
		||||
	$(Q)$(COPY) $@ $(basename $@)
 | 
			
		||||
 | 
			
		||||
# the extra ECHOREDIR's below are in case a particular dir doesn't have any failures
 | 
			
		||||
 | 
			
		||||
$(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) > $@
 | 
			
		||||
	$(Q)$(ECHO) -n >> $(TEST_OUTPUTDIR)/faillist.tbslog
 | 
			
		||||
	$(Q)$(ECHO) -n >> $(TEST_OUTPUTDIR)/longlog.tbslog
 | 
			
		||||
 | 
			
		||||
$(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) > $@
 | 
			
		||||
	$(Q)$(ECHO) -n >> $(TEST_OUTPUTDIR)/faillist.tbflog
 | 
			
		||||
	$(Q)$(ECHO) -n >> $(TEST_OUTPUTDIR)/longlog.tbflog
 | 
			
		||||
 | 
			
		||||
$(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) > $@
 | 
			
		||||
	$(Q)$(ECHO) -n >> $(TEST_OUTPUTDIR)/faillist.webtbslog
 | 
			
		||||
	$(Q)$(ECHO) -n >> $(TEST_OUTPUTDIR)/longlog.webtbslog
 | 
			
		||||
 | 
			
		||||
$(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) > $@
 | 
			
		||||
	$(Q)$(ECHO) -n >> $(TEST_OUTPUTDIR)/faillist.webtbflog
 | 
			
		||||
	$(Q)$(ECHO) -n >> $(TEST_OUTPUTDIR)/longlog.webtbflog
 | 
			
		||||
 | 
			
		||||
$(TEST_OUTPUTDIR)/%.testlog : $(TESTREQ)
 | 
			
		||||
	$(Q)$(ECHOREDIR) -n >> $(TEST_OUTPUTDIR)/faillist.testlog
 | 
			
		||||
	$(Q)$(ECHOREDIR) -n >> $(TEST_OUTPUTDIR)/longlog.testlog
 | 
			
		||||
	$(Q)$(ECHO) -n >> $(TEST_OUTPUTDIR)/faillist.testlog
 | 
			
		||||
	$(Q)$(ECHO) -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))
 | 
			
		||||
# run all tests, then merge log files
 | 
			
		||||
allexectests:  $(TEST_OUTPUTDIR)/log.testlog $(TEST_OUTPUTDIR)/log.tbslog $(TEST_OUTPUTDIR)/log.tbflog $(TEST_OUTPUTDIR)/log.webtbslog $(TEST_OUTPUTDIR)/log.webtbflog $(addprefix $(TEST_OUTPUTDIR)/,$(foreach EXT, $(LOGEXT), $(addsuffix $(EXT), faillist longlog))) $(addsuffix .mergedlog, $(LOGFILES))
 | 
			
		||||
 | 
			
		||||
# SINGLEDOTESTRUNS
 | 
			
		||||
else
 | 
			
		||||
 | 
			
		||||
.PHONY: allexectests
 | 
			
		||||
 | 
			
		||||
$(GPARMAKE): $(COMPILER_UNITTARGETDIR) utils/gparmake.pp
 | 
			
		||||
        $(FPC) $(FPC_OPT) -FE. utils/gparmake.pp
 | 
			
		||||
 | 
			
		||||
# Can't have testprep as prerequisite, because that is a phony target and
 | 
			
		||||
# phony targets are always remade. Since the makefile will be reparsed 
 | 
			
		||||
# after making the MakeChunks file (because it has to be included) and all
 | 
			
		||||
# up-to-date checks will be re-evaluated, this means that the testprep rule
 | 
			
		||||
# (or testprep timestamp file, which depends on phony rules and hence has
 | 
			
		||||
# the same behaviour) will always be considered newer than the MakeChunks
 | 
			
		||||
# file and hence the MakeChunks will be regenerated in an infinite loop
 | 
			
		||||
# (although some make versions appear to contain a bug that prevents this
 | 
			
		||||
# from happening)
 | 
			
		||||
# As a result, we list TEST_OUTPUTDIR as a dependency (that just creates
 | 
			
		||||
# the directory) and have an explicit rule to build GPARMAKE rather than
 | 
			
		||||
# building it via the utils Makefile
 | 
			
		||||
$(TEST_OUTPUTDIR)/MakeChunks-$(TEST_TARGETSUFFIX).inc: $(GPARMAKE) $(TEST_OUTPUTDIR)
 | 
			
		||||
# generate rules for parallel executions of dotest
 | 
			
		||||
	$(Q)$(GPARMAKE) $(TEST_OUTPUTDIR)/MakeChunks-$(TEST_TARGETSUFFIX).inc 1 $(CHUNKSIZE) $(sort $(wildcard $(addsuffix /t*.pp,$(TESTDIRS))))
 | 
			
		||||
	$(Q)$(GPARMAKE) -a $(TEST_OUTPUTDIR)/MakeChunks-$(TEST_TARGETSUFFIX).inc 100000 $(CHUNKSIZE) $(sort $(wildcard tbs/t*.pp))
 | 
			
		||||
	$(Q)$(GPARMAKE) -a $(TEST_OUTPUTDIR)/MakeChunks-$(TEST_TARGETSUFFIX).inc 150000 $(CHUNKSIZE) $(sort $(wildcard tbf/t*.pp))
 | 
			
		||||
	$(Q)$(GPARMAKE) -a $(TEST_OUTPUTDIR)/MakeChunks-$(TEST_TARGETSUFFIX).inc 200000 $(CHUNKSIZE) $(sort $(wildcard webtbs/t*.pp))
 | 
			
		||||
	$(Q)$(GPARMAKE) -a $(TEST_OUTPUTDIR)/MakeChunks-$(TEST_TARGETSUFFIX).inc 300000 $(CHUNKSIZE) $(sort $(wildcard webtbf/t*.pp))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# only include the targets to compile/run the tests when we want to
 | 
			
		||||
# run them (in particular: not when cleaning)
 | 
			
		||||
ifneq (,$(findstring all,$(MAKECMDGOALS)))
 | 
			
		||||
# incude the rules we just generated
 | 
			
		||||
include $(TEST_OUTPUTDIR)/MakeChunks-$(TEST_TARGETSUFFIX).inc
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# this is pretty cool: MakeChunks-$(TEST_TARGETSUFFIX).inc will contain additional prerequisites
 | 
			
		||||
# for the allexectests target, and after it is generated it will be included by the above "include"
 | 
			
		||||
# statement, and those additional prerquisites will be added on the fly and also be evaluated
 | 
			
		||||
allexectests: $(TEST_OUTPUTDIR)/MakeChunks-$(TEST_TARGETSUFFIX).inc
 | 
			
		||||
 | 
			
		||||
# SINGLEDOTESTRUNS
 | 
			
		||||
endif
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
################################
 | 
			
		||||
@ -479,14 +514,14 @@ clean_test:
 | 
			
		||||
        -$(DELTREE) $(TEST_OUTPUTDIR)
 | 
			
		||||
        -$(DEL) core gmon.out testprep-stamp.$(TEST_FULL_TARGET) dotgz.bat
 | 
			
		||||
 | 
			
		||||
clean: clean_sources
 | 
			
		||||
clean: clean_sources fpc_clean
 | 
			
		||||
        $(MAKE) clean_test CPU_TARGET=$(TEST_CPU_TARGET) OS_TARGET=$(TEST_OS_TARGET)
 | 
			
		||||
        $(MAKE) -C units clean CPU_TARGET=$(TEST_CPU_TARGET) OS_TARGET=$(TEST_OS_TARGET)
 | 
			
		||||
        $(MAKE) -C tstunits clean CPU_TARGET=$(TEST_CPU_TARGET) OS_TARGET=$(TEST_OS_TARGET)
 | 
			
		||||
 | 
			
		||||
distclean: clean fpc_distclean
 | 
			
		||||
        $(DELTREE) output
 | 
			
		||||
        $(MAKE) -C utils distclean
 | 
			
		||||
        $(MAKE) -C units distclean
 | 
			
		||||
        $(MAKE) -C tstunits distclean
 | 
			
		||||
        -$(DEL) testprep-stamp.*
 | 
			
		||||
 | 
			
		||||
#cleanall: clean
 | 
			
		||||
 | 
			
		||||
@ -21,6 +21,25 @@ directory. Then webtbs/webtbf/test/tbs/tbf are searched for t*.pp to be
 | 
			
		||||
compiled and executed as tests.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Parallel test suite runs
 | 
			
		||||
------------------------
 | 
			
		||||
 | 
			
		||||
It is possible to run the test suite in parallel, but only when using the
 | 
			
		||||
"all" target and only if SINGLEDOTESTRUNS is not used. Under those
 | 
			
		||||
circumstances, it is safe to use -jx, with x the number of tests that can
 | 
			
		||||
be compiled and run in parallel. E.g.
 | 
			
		||||
 | 
			
		||||
  make all TEST_FPC=path_to_your_compiler -j 2
 | 
			
		||||
 | 
			
		||||
After running the tests in parallel, you will probably want to get the
 | 
			
		||||
summary. This can be achieved making the "digest" target after the "all"
 | 
			
		||||
target has finished, e.g.
 | 
			
		||||
 | 
			
		||||
  make digest TEST_FPC=path_to_your_compiler
 | 
			
		||||
 | 
			
		||||
Make sure to clean the test suite between two runs.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Directories
 | 
			
		||||
-----------
 | 
			
		||||
webtbs...........Tests for web-bug-database bugs (should compile/run)
 | 
			
		||||
@ -135,6 +154,8 @@ TEST_ABI               test a certain abi, this influences where the
 | 
			
		||||
                       c object files are taken from: TEST_ABI=eabi
 | 
			
		||||
                       takes the c*.o files from
 | 
			
		||||
                       test/cg/obj/linux/arm-eabi
 | 
			
		||||
CHUNKSIZE              Number of tests per chunk that can be potentially executed
 | 
			
		||||
                       in parallel with other chunks
 | 
			
		||||
 | 
			
		||||
  (Please add more test options if needed)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -3,15 +3,20 @@
 | 
			
		||||
program concat;
 | 
			
		||||
 | 
			
		||||
uses
 | 
			
		||||
  SysUtils;
 | 
			
		||||
  SysUtils, Classes;
 | 
			
		||||
 | 
			
		||||
var
 | 
			
		||||
  Dst: TextFile;
 | 
			
		||||
  FileList: TStringList;
 | 
			
		||||
  IgnoreNonExisting: boolean;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
procedure usage;
 | 
			
		||||
  begin
 | 
			
		||||
    Writeln('Usage: concat <srcfile1> [<srcfile2> ..] <dstfile>');
 | 
			
		||||
    Writeln('Usage: concat [-i] <srcfile1> [<srcfile2> ..] <dstfile>');
 | 
			
		||||
    Writeln;
 | 
			
		||||
    Writeln('Options:');
 | 
			
		||||
    Writeln('  -i      Ignore non-existent files');
 | 
			
		||||
    Writeln;
 | 
			
		||||
    halt(1);
 | 
			
		||||
  end;
 | 
			
		||||
@ -22,11 +27,23 @@ procedure DoConcat;
 | 
			
		||||
    Src: TextFile;
 | 
			
		||||
    I: Longint;
 | 
			
		||||
    Line: Ansistring;
 | 
			
		||||
    OldFilemode: byte;
 | 
			
		||||
  begin
 | 
			
		||||
    for I:=1 to ParamCount-1 do
 | 
			
		||||
    OldFilemode:=FileMode;
 | 
			
		||||
    Filemode:=0;
 | 
			
		||||
    for I:=0 to FileList.Count-1 do
 | 
			
		||||
      begin
 | 
			
		||||
        Assign(Src,ParamStr(I));
 | 
			
		||||
        Assign(Src,FileList[i]);
 | 
			
		||||
       {$i-}
 | 
			
		||||
        Reset(Src);
 | 
			
		||||
        while ioresult<>0 do
 | 
			
		||||
          begin
 | 
			
		||||
            { wait for lingering locks to disappear }
 | 
			
		||||
            Sleep(200);
 | 
			
		||||
            Reset(Src);
 | 
			
		||||
          end;
 | 
			
		||||
       {$i+}
 | 
			
		||||
 | 
			
		||||
        while not Eof(Src) do
 | 
			
		||||
          begin
 | 
			
		||||
            ReadLn(Src,Line);
 | 
			
		||||
@ -34,17 +51,28 @@ procedure DoConcat;
 | 
			
		||||
          end;
 | 
			
		||||
        Close(Src);
 | 
			
		||||
      end;
 | 
			
		||||
    Filemode:=OldFilemode;
 | 
			
		||||
    Close(Dst);
 | 
			
		||||
  end;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
procedure CheckParas;
 | 
			
		||||
  var
 | 
			
		||||
    FirstFile,
 | 
			
		||||
    I: Longint;
 | 
			
		||||
    Exists: boolean;
 | 
			
		||||
  begin
 | 
			
		||||
    { enough parameters? }
 | 
			
		||||
    if ParamCount<2 then
 | 
			
		||||
      Usage;
 | 
			
		||||
 | 
			
		||||
    FirstFile:=1;
 | 
			
		||||
    if UpperCase(ParamStr(1))='-i' then
 | 
			
		||||
        begin
 | 
			
		||||
          IgnoreNonExisting:=true;
 | 
			
		||||
          Inc(FirstFile);
 | 
			
		||||
        end;
 | 
			
		||||
 | 
			
		||||
    { check destination }
 | 
			
		||||
    if DirectoryExists(ParamStr(ParamCount)) then
 | 
			
		||||
      begin
 | 
			
		||||
@ -61,23 +89,32 @@ procedure CheckParas;
 | 
			
		||||
        halt(2);
 | 
			
		||||
      end;
 | 
			
		||||
    { check source(s) }
 | 
			
		||||
    for I:=1 to ParamCount-1 do
 | 
			
		||||
    for I:=FirstFile to ParamCount-1 do
 | 
			
		||||
      begin
 | 
			
		||||
        Exists:=True;
 | 
			
		||||
        if not FileExists(ParamStr(I)) then
 | 
			
		||||
          begin
 | 
			
		||||
            Writeln('File "',ParamStr(I),'" does not exist');
 | 
			
		||||
            halt(2);
 | 
			
		||||
          end;
 | 
			
		||||
        if DirectoryExists(ParamStr(I)) then
 | 
			
		||||
            if not IgnoreNonExisting then
 | 
			
		||||
              begin
 | 
			
		||||
                Writeln('File "',ParamStr(I),'" does not exist');
 | 
			
		||||
                halt(2);
 | 
			
		||||
              end;
 | 
			
		||||
            Exists:=False;
 | 
			
		||||
          end
 | 
			
		||||
        else if DirectoryExists(ParamStr(I)) then
 | 
			
		||||
          begin
 | 
			
		||||
            Writeln('"',ParamStr(I),'" is a directory');
 | 
			
		||||
            halt(2);
 | 
			
		||||
          end;
 | 
			
		||||
        end;
 | 
			
		||||
          end
 | 
			
		||||
        else if Exists then
 | 
			
		||||
          FileList.Add(ParamStr(I));
 | 
			
		||||
        end
 | 
			
		||||
  end;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
begin
 | 
			
		||||
  FileList:=TStringList.Create;
 | 
			
		||||
  CheckParas;
 | 
			
		||||
  DoConcat;
 | 
			
		||||
  FileList.Free;
 | 
			
		||||
end.
 | 
			
		||||
 | 
			
		||||
@ -431,6 +431,26 @@ begin
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
procedure ForceLog(const logfile:string);
 | 
			
		||||
var
 | 
			
		||||
  t : text;
 | 
			
		||||
begin
 | 
			
		||||
  assign(t,logfile);
 | 
			
		||||
  {$I-}
 | 
			
		||||
   append(t);
 | 
			
		||||
  {$I+}
 | 
			
		||||
  if ioresult<>0 then
 | 
			
		||||
   begin
 | 
			
		||||
     {$I-}
 | 
			
		||||
      rewrite(t);
 | 
			
		||||
     {$I+}
 | 
			
		||||
     if ioresult<>0 then
 | 
			
		||||
       Verbose(V_Abort,'Can''t Create '+logfile);
 | 
			
		||||
   end;
 | 
			
		||||
  close(t);
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
function GetCompilerInfo(c:tcompinfo):boolean;
 | 
			
		||||
 | 
			
		||||
  function GetToken(var s:string):string;
 | 
			
		||||
@ -697,6 +717,23 @@ begin
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
function TestLogFileName(Const pref,base,ext:String):String;
 | 
			
		||||
var
 | 
			
		||||
  LogDir: String;
 | 
			
		||||
begin
 | 
			
		||||
  LogDir:=TestOutputDir;
 | 
			
		||||
{$ifndef macos}
 | 
			
		||||
  if UniqueSuffix<>'' then
 | 
			
		||||
    LogDir:=LogDir+'/..';
 | 
			
		||||
  TestLogFileName:=LogDir+'/'+ForceExtension(pref+SplitFileName(base),ext);
 | 
			
		||||
{$else macos}
 | 
			
		||||
  if UniqueSuffix<>'' then
 | 
			
		||||
    LogDir:=LogDir+'::';
 | 
			
		||||
  TestLogFileName:=ConcatMacPath(LogDir,ForceExtension(pref+SplitFileName(base),ext));
 | 
			
		||||
{$endif macos}
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
function ExitWithInternalError(const OutName:string):boolean;
 | 
			
		||||
var
 | 
			
		||||
  t : text;
 | 
			
		||||
@ -855,6 +892,9 @@ var
 | 
			
		||||
begin
 | 
			
		||||
  RunCompiler:=false;
 | 
			
		||||
  args:='-n -T'+CompilerTarget+' -Fu'+RTLUnitsDir;
 | 
			
		||||
  { the helper object files have been copied to the common directory }
 | 
			
		||||
  if UniqueSuffix<>'' then
 | 
			
		||||
    args:=args+' -Fo'+TestOutputDir+'/..';
 | 
			
		||||
  args:=args+' -FE'+TestOutputDir;
 | 
			
		||||
  if TargetIsMacOS then
 | 
			
		||||
    args:=args+' -WT ';  {tests should be compiled as MPWTool}
 | 
			
		||||
@ -1092,6 +1132,7 @@ begin
 | 
			
		||||
    end;
 | 
			
		||||
  LibraryExists:=false;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
function ExecuteRemote(const prog,args:string;out StartTicks,EndTicks : int64):boolean;
 | 
			
		||||
const
 | 
			
		||||
  MaxTrials = 5;
 | 
			
		||||
@ -1134,18 +1175,60 @@ end;
 | 
			
		||||
function MaybeCopyFiles(const FileToCopy : string) : boolean;
 | 
			
		||||
var
 | 
			
		||||
  TestRemoteExe,
 | 
			
		||||
  s : string;
 | 
			
		||||
  pref     : string;
 | 
			
		||||
  LocalFile, RemoteFile: string;
 | 
			
		||||
  LocalPath: string;
 | 
			
		||||
  index    : integer;
 | 
			
		||||
  i       : integer;
 | 
			
		||||
  execres : boolean;
 | 
			
		||||
  EndTicks,
 | 
			
		||||
  StartTicks : int64;
 | 
			
		||||
  FileList   : TStringList;
 | 
			
		||||
 | 
			
		||||
  function BuildFileList: TStringList;
 | 
			
		||||
    var
 | 
			
		||||
      s      : string;
 | 
			
		||||
      index  : longint;
 | 
			
		||||
    begin
 | 
			
		||||
      s:=Config.Files;
 | 
			
		||||
      if length(s) = 0 then
 | 
			
		||||
        begin
 | 
			
		||||
          Result:=nil;
 | 
			
		||||
          exit;
 | 
			
		||||
        end;
 | 
			
		||||
      Result:=TStringList.Create;
 | 
			
		||||
      repeat
 | 
			
		||||
        index:=pos(' ',s);
 | 
			
		||||
        if index=0 then
 | 
			
		||||
          LocalFile:=s
 | 
			
		||||
        else
 | 
			
		||||
          LocalFile:=copy(s,1,index-1);
 | 
			
		||||
        Result.Add(LocalFile);
 | 
			
		||||
        if index=0 then
 | 
			
		||||
          break;
 | 
			
		||||
        s:=copy(s,index+1,length(s)-index);
 | 
			
		||||
      until false;
 | 
			
		||||
    end;
 | 
			
		||||
 | 
			
		||||
begin
 | 
			
		||||
  if RemoteAddr='' then
 | 
			
		||||
    begin
 | 
			
		||||
      exit(false);
 | 
			
		||||
      If UniqueSuffix<>'' then
 | 
			
		||||
        begin
 | 
			
		||||
          FileList:=BuildFileList;
 | 
			
		||||
          if assigned(FileList) then
 | 
			
		||||
            begin
 | 
			
		||||
              LocalPath:=SplitPath(PPFile[current]);
 | 
			
		||||
              if Length(LocalPath) > 0 then
 | 
			
		||||
                LocalPath:=LocalPath+'/';
 | 
			
		||||
              for i:=0 to FileList.count-1 do
 | 
			
		||||
                begin
 | 
			
		||||
                  LocalFile:=FileList[i];
 | 
			
		||||
                  CopyFile(LocalPath+LocalFile,TestOutputDir+'/'+LocalFile,false);
 | 
			
		||||
                end;
 | 
			
		||||
              FileList.Free;
 | 
			
		||||
            end;
 | 
			
		||||
        end;
 | 
			
		||||
      exit(true);
 | 
			
		||||
    end;
 | 
			
		||||
  execres:=true;
 | 
			
		||||
  { We don't want to create subdirs, remove paths from the test }
 | 
			
		||||
@ -1160,36 +1243,32 @@ begin
 | 
			
		||||
    Verbose(V_normal, 'Could not copy executable '+FileToCopy);
 | 
			
		||||
    exit(execres);
 | 
			
		||||
  end;
 | 
			
		||||
  s:=Config.Files;
 | 
			
		||||
  if length(s) > 0 then
 | 
			
		||||
  FileList:=BuildFileList;
 | 
			
		||||
  if assigned(FileList) then
 | 
			
		||||
  begin
 | 
			
		||||
    LocalPath:=SplitPath(PPFile[current]);
 | 
			
		||||
    if Length(LocalPath) > 0 then
 | 
			
		||||
      LocalPath:=LocalPath+'/';
 | 
			
		||||
    repeat
 | 
			
		||||
      index:=pos(' ',s);
 | 
			
		||||
      if index=0 then
 | 
			
		||||
        LocalFile:=s
 | 
			
		||||
      else
 | 
			
		||||
        LocalFile:=copy(s,1,index-1);
 | 
			
		||||
      RemoteFile:=RemotePath+'/'+SplitFileName(LocalFile);
 | 
			
		||||
      LocalFile:=LocalPath+LocalFile;
 | 
			
		||||
      if DoVerbose and (rcpprog='pscp') then
 | 
			
		||||
        pref:='-v '
 | 
			
		||||
      else
 | 
			
		||||
        pref:='';
 | 
			
		||||
      execres:=ExecuteRemote(rcpprog,pref+RemotePara+' '+LocalFile+' '+
 | 
			
		||||
                             RemoteAddr+':'+RemoteFile,StartTicks,EndTicks);
 | 
			
		||||
      if not execres then
 | 
			
		||||
    for i:=0 to FileList.count-1 do
 | 
			
		||||
      begin
 | 
			
		||||
        Verbose(V_normal, 'Could not copy required file '+LocalFile);
 | 
			
		||||
        exit(false);
 | 
			
		||||
        LocalFile:=FileList[i];
 | 
			
		||||
        RemoteFile:=RemotePath+'/'+SplitFileName(LocalFile);
 | 
			
		||||
        LocalFile:=LocalPath+LocalFile;
 | 
			
		||||
        if DoVerbose and (rcpprog='pscp') then
 | 
			
		||||
          pref:='-v '
 | 
			
		||||
        else
 | 
			
		||||
          pref:='';
 | 
			
		||||
        execres:=ExecuteRemote(rcpprog,pref+RemotePara+' '+LocalFile+' '+
 | 
			
		||||
                               RemoteAddr+':'+RemoteFile,StartTicks,EndTicks);
 | 
			
		||||
        if not execres then
 | 
			
		||||
        begin
 | 
			
		||||
          Verbose(V_normal, 'Could not copy required file '+LocalFile);
 | 
			
		||||
          FileList.Free;
 | 
			
		||||
          exit(false);
 | 
			
		||||
        end;
 | 
			
		||||
      end;
 | 
			
		||||
      if index=0 then
 | 
			
		||||
        break;
 | 
			
		||||
      s:=copy(s,index+1,length(s)-index);
 | 
			
		||||
    until false;
 | 
			
		||||
  end;
 | 
			
		||||
  FileList.Free;
 | 
			
		||||
  MaybeCopyFiles:=execres;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
@ -1213,8 +1292,9 @@ begin
 | 
			
		||||
  RunExecutable:=false;
 | 
			
		||||
  execres:=true;
 | 
			
		||||
 | 
			
		||||
  TestExe:=OutputFileName(PPFile[current],ExeExt);
 | 
			
		||||
  TestExe:=TestOutputFilename('',PPFile[current],ExeExt);
 | 
			
		||||
 | 
			
		||||
  execres:=MaybeCopyFiles(TestExe);
 | 
			
		||||
  if EmulatorName<>'' then
 | 
			
		||||
    begin
 | 
			
		||||
      { Get full name out log file, because we change the directory during
 | 
			
		||||
@ -1233,7 +1313,6 @@ begin
 | 
			
		||||
    end
 | 
			
		||||
  else if RemoteAddr<>'' then
 | 
			
		||||
    begin
 | 
			
		||||
      execres:=MaybeCopyFiles(TestExe);
 | 
			
		||||
      TestRemoteExe:=RemotePath+'/'+SplitFileName(TestExe);
 | 
			
		||||
      { rsh doesn't pass the exitcode, use a second command to print the exitcode
 | 
			
		||||
        on the remoteshell to stdout }
 | 
			
		||||
@ -1609,9 +1688,9 @@ begin
 | 
			
		||||
      Res:=GetCompilerCPU;
 | 
			
		||||
      Res:=GetCompilerTarget;
 | 
			
		||||
{$ifndef MACOS}
 | 
			
		||||
      RTLUnitsDir:='units/'+CompilerFullTarget;
 | 
			
		||||
      RTLUnitsDir:='tstunits/'+CompilerFullTarget;
 | 
			
		||||
{$else MACOS}
 | 
			
		||||
      RTLUnitsDir:=':units:'+CompilerFullTarget;
 | 
			
		||||
      RTLUnitsDir:=':tstunits:'+CompilerFullTarget;
 | 
			
		||||
{$endif MACOS}
 | 
			
		||||
      if not PathExists(RTLUnitsDir) then
 | 
			
		||||
        Verbose(V_Abort,'Unit path "'+RTLUnitsDir+'" does not exists');
 | 
			
		||||
@ -1630,22 +1709,30 @@ begin
 | 
			
		||||
        begin
 | 
			
		||||
{$ifndef MACOS}
 | 
			
		||||
          TestOutputDir:=OutputDir+'/'+PPDir;
 | 
			
		||||
          if UniqueSuffix<>'' then
 | 
			
		||||
            TestOutputDir:=TestOutputDir+'/'+UniqueSuffix;
 | 
			
		||||
{$else MACOS}
 | 
			
		||||
          TestOutputDir:=OutputDir+PPDir;
 | 
			
		||||
          if UniqueSuffix<>'' then
 | 
			
		||||
            TestOutputDir:=TestOutputDir+':'+UniqueSuffix;
 | 
			
		||||
{$endif MACOS}
 | 
			
		||||
          mkdirtree(TestOutputDir);
 | 
			
		||||
        end
 | 
			
		||||
      else
 | 
			
		||||
        TestOutputDir:=OutputDir;
 | 
			
		||||
      { Global log files (don't use UniqueSuffix here, it's not set in case of
 | 
			
		||||
        SINGLEDOTESTRUNS) }
 | 
			
		||||
      LogSuffix:=SplitBasePath(PPDir)+'log';
 | 
			
		||||
      if UniqueSuffix<>'' then
 | 
			
		||||
        LogSuffix:=UniqueSuffix
 | 
			
		||||
      else
 | 
			
		||||
        LogSuffix:=SplitBasePath(PPDir)+'log';
 | 
			
		||||
      ResLogFile:=OutputFileName('log',LogSuffix);
 | 
			
		||||
      LongLogFile:=OutputFileName('longlog',LogSuffix);
 | 
			
		||||
      FailLogFile:=OutputFileName('faillist',LogSuffix);
 | 
			
		||||
      ForceLog(ResLogFile);
 | 
			
		||||
      ForceLog(LongLogFile);
 | 
			
		||||
      ForceLog(FailLogFile);
 | 
			
		||||
      { Per test logfiles }
 | 
			
		||||
      CompilerLogFile:=TestOutputFileName('',SplitFileName(PPFile[current]),'log');
 | 
			
		||||
      ExeLogFile:=TestOutputFileName('',SplitFileName(PPFile[current]),'elg');
 | 
			
		||||
      CompilerLogFile:=TestLogFileName('',SplitFileName(PPFile[current]),'log');
 | 
			
		||||
      ExeLogFile:=TestLogFileName('',SplitFileName(PPFile[current]),'elg');
 | 
			
		||||
      Verbose(V_Debug,'Using Compiler logfile: '+CompilerLogFile);
 | 
			
		||||
      Verbose(V_Debug,'Using Execution logfile: '+ExeLogFile);
 | 
			
		||||
    end;
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										166
									
								
								tests/utils/gparmake.pp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										166
									
								
								tests/utils/gparmake.pp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,166 @@
 | 
			
		||||
{ See procedure "Usage". This code is in the public domain. }
 | 
			
		||||
 | 
			
		||||
Program GParMake;
 | 
			
		||||
 | 
			
		||||
procedure Usage;
 | 
			
		||||
  begin
 | 
			
		||||
    writeln('GParMake: create make rules for parallel execution of testsuite');
 | 
			
		||||
    writeln('Usage: gparmake [-a] <outputfile>  <startchunk> <tests_per_chunk> <test1> [<test2> ...]');
 | 
			
		||||
    writeln('Output: makefile fragment with rules to run the tests in sequences of <tests_per_chunk>');
 | 
			
		||||
    writeln;
 | 
			
		||||
    halt(1);
 | 
			
		||||
  end;
 | 
			
		||||
 | 
			
		||||
{ make all numbers of the same string length so they can be sorted
 | 
			
		||||
  lexographically }
 | 
			
		||||
function rulenr2str(rulenr: longint): string;
 | 
			
		||||
  var
 | 
			
		||||
    i: longint;
 | 
			
		||||
  begin
 | 
			
		||||
    str(rulenr:9,rulenr2str);
 | 
			
		||||
    for i:=1 to length(rulenr2str)-1 do
 | 
			
		||||
      if rulenr2str[i]=' ' then
 | 
			
		||||
        rulenr2str[i]:='0';
 | 
			
		||||
  end;
 | 
			
		||||
 | 
			
		||||
procedure WriteChunkRule(rulenr: longint; const files: ansistring);
 | 
			
		||||
  var
 | 
			
		||||
    rulestr: string;
 | 
			
		||||
  begin
 | 
			
		||||
    rulestr:=rulenr2str(rulenr);
 | 
			
		||||
    writeln('$(TEST_OUTPUTDIR)/testchunk_',rulestr,'-stamp.$(TEST_FULL_TARGET): testprep-stamp.$(TEST_FULL_TARGET)');
 | 
			
		||||
    writeln(#9'$(Q)$(DOTEST) $(DOTESTOPT) -Lchunk',rulestr,' -e ',files);
 | 
			
		||||
    writeln(#9'$(ECHOREDIR) $(DATE) > $@');
 | 
			
		||||
    writeln;
 | 
			
		||||
    writeln('$(addsuffix .chunk',rulestr,', $(LOGFILES)) : $(TEST_OUTPUTDIR)/testchunk_',rulestr,'-stamp.$(TEST_FULL_TARGET)');
 | 
			
		||||
    writeln;
 | 
			
		||||
    writeln('.INTERMEDIATE: $(addsuffix .chunk',rulestr,', $(LOGFILES)) $(TEST_OUTPUTDIR)/testchunk_',rulestr,'-stamp.$(TEST_FULL_TARGET)');
 | 
			
		||||
    writeln;
 | 
			
		||||
  end;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
var
 | 
			
		||||
  startchunk: longint;
 | 
			
		||||
  doappend: boolean;
 | 
			
		||||
 | 
			
		||||
Function ProcessArgs: longint;
 | 
			
		||||
  var
 | 
			
		||||
    i,
 | 
			
		||||
    paramnr,
 | 
			
		||||
    chunktargetsize,
 | 
			
		||||
    chunksize,
 | 
			
		||||
    chunknr,
 | 
			
		||||
    error: longint;
 | 
			
		||||
    testname,
 | 
			
		||||
    nexttestname,
 | 
			
		||||
    testlist,
 | 
			
		||||
    outputname: ansistring;
 | 
			
		||||
 | 
			
		||||
  procedure FlushChunk;
 | 
			
		||||
    begin
 | 
			
		||||
      WriteChunkRule(chunknr,testlist);
 | 
			
		||||
      inc(chunknr);
 | 
			
		||||
      testlist:='';
 | 
			
		||||
      chunksize:=0;
 | 
			
		||||
    end;
 | 
			
		||||
 | 
			
		||||
  begin
 | 
			
		||||
    if paramcount < 3 then
 | 
			
		||||
      Usage;
 | 
			
		||||
 | 
			
		||||
    doappend:=false;
 | 
			
		||||
 | 
			
		||||
    paramnr:=1;
 | 
			
		||||
    if paramstr(paramnr)='-a' then
 | 
			
		||||
      begin
 | 
			
		||||
        doappend:=true;
 | 
			
		||||
        inc(paramnr);
 | 
			
		||||
      end;
 | 
			
		||||
 | 
			
		||||
    outputname:=paramstr(paramnr);
 | 
			
		||||
    inc(paramnr);
 | 
			
		||||
 | 
			
		||||
    val(paramstr(paramnr),startchunk,error);
 | 
			
		||||
    if error<>0 then
 | 
			
		||||
      Usage;
 | 
			
		||||
    inc(paramnr);
 | 
			
		||||
 | 
			
		||||
    val(paramstr(paramnr),chunktargetsize,error);
 | 
			
		||||
    if error<>0 then
 | 
			
		||||
      Usage;
 | 
			
		||||
    inc(paramnr);
 | 
			
		||||
 | 
			
		||||
    { only redirect output after all possible cases where we may have to write
 | 
			
		||||
      the usage screen }
 | 
			
		||||
    assign(output,outputname);
 | 
			
		||||
    if doappend then
 | 
			
		||||
      append(output)
 | 
			
		||||
    else
 | 
			
		||||
      rewrite(output);
 | 
			
		||||
 | 
			
		||||
    chunknr:=startchunk;
 | 
			
		||||
    chunksize:=0;
 | 
			
		||||
    testlist:='';
 | 
			
		||||
    for i := paramnr to paramcount do
 | 
			
		||||
      begin
 | 
			
		||||
        testname:=paramstr(i);
 | 
			
		||||
        testlist:=testlist+' '+testname;
 | 
			
		||||
        inc(chunksize);
 | 
			
		||||
        if chunksize>=chunktargetsize then
 | 
			
		||||
          begin
 | 
			
		||||
            if (i=paramcount) then
 | 
			
		||||
              FlushChunk
 | 
			
		||||
            else
 | 
			
		||||
              begin
 | 
			
		||||
                { keep tests with the same name except for the last character in the same chunk,
 | 
			
		||||
                  because they may have to be executed in order (skip ".pp" suffix and last char) }
 | 
			
		||||
                nexttestname:=paramstr(i+1);
 | 
			
		||||
                if lowercase(copy(testname,1,length(testname)-4))<>lowercase(copy(nexttestname,1,length(nexttestname)-4)) then
 | 
			
		||||
                  FlushChunk;
 | 
			
		||||
              end;
 | 
			
		||||
          end;
 | 
			
		||||
      end;
 | 
			
		||||
    if chunksize<>0 then
 | 
			
		||||
      FlushChunk;
 | 
			
		||||
    ProcessArgs:=chunknr-1;
 | 
			
		||||
  end;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
procedure WriteWrapperRules(totalchunks: longint);
 | 
			
		||||
  const
 | 
			
		||||
    lognames: array[1..3] of string[11] = ('log','faillist','longlog');
 | 
			
		||||
  var
 | 
			
		||||
    logi,
 | 
			
		||||
    i: longint;
 | 
			
		||||
  begin
 | 
			
		||||
    for logi:=1 to 3 do
 | 
			
		||||
      begin
 | 
			
		||||
        write('$(TEST_OUTPUTDIR)/',lognames[logi],' :');
 | 
			
		||||
        for i:=startchunk to totalchunks do
 | 
			
		||||
          write(' $(TEST_OUTPUTDIR)/',lognames[logi],'.chunk',rulenr2str(i));
 | 
			
		||||
        writeln;
 | 
			
		||||
        { if you have multiple rules for one (non-pattern) target, all
 | 
			
		||||
          prerequisites will be merged, but only one of the rules can have a
 | 
			
		||||
          recipe }
 | 
			
		||||
        if not doappend then
 | 
			
		||||
          begin
 | 
			
		||||
            writeln(#9'$(Q)$(CONCAT) $(sort $^) $@');
 | 
			
		||||
            writeln;
 | 
			
		||||
          end;
 | 
			
		||||
        writeln;
 | 
			
		||||
      end;
 | 
			
		||||
    if not doappend then
 | 
			
		||||
      begin
 | 
			
		||||
        writeln('allexectests : $(LOGFILES)');
 | 
			
		||||
        writeln;
 | 
			
		||||
      end;
 | 
			
		||||
  end;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
var
 | 
			
		||||
  totalchunks: longint;
 | 
			
		||||
begin
 | 
			
		||||
  totalchunks:=ProcessArgs;
 | 
			
		||||
  WriteWrapperRules(totalchunks);
 | 
			
		||||
  close(output);
 | 
			
		||||
end.
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user