| # Makefile for the pthreads test suite. |
| # If all of the .pass files can be created, the test suite has passed. |
| # |
| # -------------------------------------------------------------------------- |
| # |
| # Pthreads-win32 - POSIX Threads Library for Win32 |
| # Copyright(C) 1998 John E. Bossom |
| # Copyright(C) 1999,2005 Pthreads-win32 contributors |
| # |
| # Contact Email: rpj@callisto.canberra.edu.au |
| # |
| # The current list of contributors is contained |
| # in the file CONTRIBUTORS included with the source |
| # code distribution. The list can also be seen at the |
| # following World Wide Web location: |
| # http://sources.redhat.com/pthreads-win32/contributors.html |
| # |
| # This library is free software; you can redistribute it and/or |
| # modify it under the terms of the GNU Lesser General Public |
| # License as published by the Free Software Foundation; either |
| # version 2 of the License, or (at your option) any later version. |
| # |
| # This library is distributed in the hope that it will be useful, |
| # but WITHOUT ANY WARRANTY; without even the implied warranty of |
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| # Lesser General Public License for more details. |
| # |
| # You should have received a copy of the GNU Lesser General Public |
| # License along with this library in the file COPYING.LIB; |
| # if not, write to the Free Software Foundation, Inc., |
| # 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
| # |
| |
| DLL_VER = 2 |
| |
| .PRECIOUS: $(*.exe) $(*.pass) |
| .SECONDARY: |
| |
| target = $(CROSS) |
| |
| ifeq (,$(findstring i686, $(WTHR_TARGET_ARCH))) |
| ifeq (,$(findstring x86_64, $(target))) |
| #32bit |
| BITNESS=-m32 |
| DLLFLAG=-m i386 |
| WINDRESFLAG=pe-i386 |
| else |
| #64bit |
| BITNESS=-m64 |
| DLLFLAG=-m i386:x86-64 |
| WINDRESFLAG=pe-x86-64 |
| endif |
| else |
| ifeq (,$(findstring x86_64, $(WTHR_TARGET_ARCH))) |
| #32bit |
| BITNESS=-m32 |
| DLLFLAG=-m i386 |
| WINDRESFLAG=pe-i386 |
| else |
| BITNESS=-m64 |
| DLLFLAG=-m i386:x86-64 |
| WINDRESFLAG=pe-x86-64 |
| endif |
| endif |
| |
| CC = $(target)-gcc $(BITNESS) |
| CP = cp -f |
| MV = mv -f |
| RM = rm -f |
| CAT = cat |
| #CP = copy |
| #MV = rename |
| #RM = erase |
| #CAT = type |
| MKDIR = mkdir |
| TOUCH = echo Passed > |
| ECHO = @echo |
| MAKE = make -k |
| |
| # |
| # Mingw32 |
| # |
| XXCFLAGS = |
| XXLIBS = -lws2_32 |
| CFLAGS = -O3 -UNDEBUG -Wall $(XXCFLAGS) |
| BUILD_DIR = .. |
| INCLUDES = -I./include |
| |
| |
| TEST = GC |
| |
| # Default lib version |
| GCX = $(TEST)$(DLL_VER) |
| |
| # Files we need to run the tests |
| # - paths are relative to pthreads build dir. |
| HDR = include/pthread.h include/semaphore.h |
| ifeq (,$(findstring i686, $(WTHR_TARGET_ARCH))) |
| ifeq (,$(findstring x86_64, $(target))) |
| #32bit |
| LIB = ./outlib/libpthread$(GCX)-32.dll.a |
| LIBSTATIC = ./outlib/libpthread$(GCX)-32.a |
| DLL = ./outlib/pthread$(GCX)-32.dll |
| LINKAGEFLAG = -lpthread$(GCX)-32 |
| else |
| #64bit |
| LIB = ./outlib/libpthread$(GCX)-64.dll.a |
| LIBSTATIC = ./outlib/libpthread$(GCX)-64.a |
| DLL = ./outlib/pthread$(GCX)-64.dll |
| LINKAGEFLAG = -lpthread$(GCX)-64 |
| endif |
| else |
| ifeq (,$(findstring x86_64, $(WTHR_TARGET_ARCH))) |
| #32bit |
| LIB = ./outlib/libpthread$(GCX)-32.dll.a |
| LIBSTATIC = ./outlib/libpthread$(GCX)-32.a |
| DLL = ./outlib/pthread$(GCX)-32.dll |
| LINKAGEFLAG = -lpthread$(GCX)-32 |
| else |
| LIB = ./outlib/libpthread$(GCX)-64.dll.a |
| LIBSTATIC = ./outlib/libpthread$(GCX)-64.a |
| DLL = ./outlib/pthread$(GCX)-64.dll |
| LINKAGEFLAG = -lpthread$(GCX)-64 |
| endif |
| endif |
| |
| ifdef $(WTHR_STATIC_LIB) |
| LIB = $(LIBSTATIC) |
| endif |
| |
| # The next path is relative to $BUILD_DIR |
| # QAPC = ../QueueUserAPCEx/User/quserex.dll |
| |
| COPYFILES = $(HDR) $(QAPC) |
| |
| # If a test case returns a non-zero exit code to the shell, make will |
| # stop. |
| |
| TESTS = runall \ |
| sizes loadfree \ |
| self1 mutex5 mutex1 mutex1e mutex1n mutex1r \ |
| semaphore1 semaphore2 semaphore3 \ |
| condvar1 condvar1_1 condvar1_2 condvar2 condvar2_1 exit1 \ |
| create1 create2 reuse1 reuse2 equal1 \ |
| kill1 valid1 valid2 \ |
| exit2 exit3 exit4 exit5 \ |
| join0 join1 detach1 join2 join3 \ |
| mutex2 mutex2r mutex2e mutex3 mutex3r mutex3e \ |
| mutex4 mutex6 mutex6n mutex6e mutex6r \ |
| mutex6s mutex6es mutex6rs \ |
| mutex7 mutex7n mutex7e mutex7r mutex8 mutex8n mutex8e mutex8r \ |
| count1 \ |
| once1 once2 once3 once4 self2 \ |
| cancel1 cancel2 \ |
| semaphore4 semaphore4t semaphore5 \ |
| barrier1 barrier2 barrier3 barrier4 barrier5 barrier6 \ |
| tsd1 tsd2 openmp1 delay1 delay2 eyal1 \ |
| condvar3 condvar3_1 condvar3_2 condvar3_3 \ |
| condvar4 condvar5 condvar6 condvar7 condvar8 condvar9 \ |
| errno1 \ |
| rwlock1 rwlock2 rwlock3 rwlock4 rwlock5 rwlock6 rwlock7 rwlock8 \ |
| rwlock2_t rwlock3_t rwlock4_t rwlock5_t rwlock6_t rwlock6_t2 \ |
| context1 cancel3 cancel4 cancel5 cancel6a cancel6d \ |
| cancel7 cancel8 \ |
| cleanup0 cleanup1 cleanup2 cleanup3 \ |
| priority1 priority2 inherit1 \ |
| spin1 spin2 spin3 spin4 \ |
| exception1 exception2 exception3 \ |
| cancel9 create3 stress1 |
| |
| STRESSTESTS = \ |
| stress1 |
| |
| BENCHTESTS = \ |
| benchtest1 benchtest2 benchtest3 benchtest4 benchtest5 benchtest6 |
| |
| STATICTESTS = runall \ |
| sizes \ |
| self1 mutex5 mutex1 mutex1e mutex1n mutex1r \ |
| semaphore1 semaphore2 semaphore3 \ |
| condvar1 condvar1_1 condvar1_2 condvar2 condvar2_1 exit1 \ |
| create1 create2 reuse1 reuse2 equal1 \ |
| kill1 valid1 valid2 \ |
| exit2 exit3 exit4 exit5 \ |
| join0 join1 detach1 join2 join3 \ |
| mutex2 mutex2r mutex2e mutex3 mutex3r mutex3e \ |
| mutex4 mutex6 mutex6n mutex6e mutex6r \ |
| mutex6s mutex6es mutex6rs \ |
| mutex7 mutex7n mutex7e mutex7r mutex8 mutex8n mutex8e mutex8r \ |
| count1 \ |
| once1 once2 once3 once4 self2 \ |
| cancel1 cancel2 \ |
| semaphore4 semaphore4t semaphore5 \ |
| barrier1 barrier2 barrier3 barrier4 barrier5 barrier6 \ |
| tsd1 tsd2 delay1 delay2 eyal1 \ |
| condvar3 condvar3_1 condvar3_2 condvar3_3 \ |
| condvar4 condvar5 condvar6 condvar7 condvar8 condvar9 \ |
| errno1 \ |
| rwlock1 rwlock2 rwlock3 rwlock4 rwlock5 rwlock6 rwlock7 rwlock8 \ |
| rwlock2_t rwlock3_t rwlock4_t rwlock5_t rwlock6_t rwlock6_t2 \ |
| context1 cancel3 cancel4 cancel5 cancel6a cancel6d \ |
| cancel7 cancel8 \ |
| cleanup0 cleanup1 cleanup2 cleanup3 \ |
| priority1 priority2 inherit1 \ |
| spin1 spin2 spin3 spin4 \ |
| exception1 exception2 exception3 \ |
| cancel9 create3 stress1 |
| |
| PASSES = $(TESTS:%=%.pass) |
| BENCHRESULTS = $(BENCHTESTS:%=%.bench) |
| STRESSRESULTS = $(STRESSTESTS:%=%.pass) |
| STATICRESULTS = $(STATICTESTS:%=%.pass) |
| |
| help: |
| @ $(ECHO) "Run one of the following command lines:" |
| @ $(ECHO) "make clean GC (to test using GC dll with C (no EH) applications)" |
| @ $(ECHO) "make clean GCX (to test using GC dll with C++ (EH) applications)" |
| @ $(ECHO) "make clean GCE (to test using GCE dll with C++ (EH) applications)" |
| @ $(ECHO) "make clean GC-bench (to benchtest using GNU C dll with C cleanup code)" |
| @ $(ECHO) "make clean GCE-bench (to benchtest using GNU C dll with C++ exception handling)" |
| @ $(ECHO) "make clean GC-stress (to stresstest using GNU C dll with C cleanup code)" |
| @ $(ECHO) "make clean GCE-stress (to stresstest using GNU C dll with C++ exception handling)" |
| @ $(ECHO) "make clean GC-static (to test using GC static lib with C (no EH) applications)" |
| |
| all: |
| @ $(MAKE) clean GC |
| @ $(MAKE) clean GCX |
| @ $(MAKE) clean GCE |
| |
| GC: |
| @ $(ECHO) Copying $(BUILD_DIR)/$(LIB) |
| @ $(CP) $(BUILD_DIR)/$(LIB) . |
| @ $(ECHO) Copying $(BUILD_DIR)/$(DLL) |
| @ $(CP) $(BUILD_DIR)/$(DLL) . |
| $(MAKE) TEST=GC CC=$(CROSS)-gcc XXCFLAGS="-D__CLEANUP_C" all-pass |
| |
| GCE: |
| @ $(ECHO) Copying $(BUILD_DIR)/$(LIB) |
| @ $(CP) $(BUILD_DIR)/$(LIB) . |
| @ $(ECHO) Copying $(BUILD_DIR)/$(DLL) |
| @ $(CP) $(BUILD_DIR)/$(DLL) . |
| $(MAKE) TEST=GCE CC=$(CROSS)-g++ XXCFLAGS="-fopenmp -mthreads -D__CLEANUP_CXX" all-pass |
| |
| GCX: |
| @ $(ECHO) Copying $(BUILD_DIR)/$(LIB) |
| @ $(CP) $(BUILD_DIR)/$(LIB) . |
| @ $(ECHO) Copying $(BUILD_DIR)/$(DLL) |
| @ $(CP) $(BUILD_DIR)/$(DLL) . |
| $(MAKE) TEST=GC CC=$(CROSS)-g++ XXCFLAGS="-fopenmp -mthreads -D__CLEANUP_C" all-pass |
| |
| GC-bench: |
| @ $(ECHO) Copying $(BUILD_DIR)/$(LIB) |
| @ $(CP) $(BUILD_DIR)/$(LIB) . |
| @ $(ECHO) Copying $(BUILD_DIR)/$(DLL) |
| @ $(CP) $(BUILD_DIR)/$(DLL) . |
| $(MAKE) TEST=GC CC=$(CROSS)-gcc XXCFLAGS="-D__CLEANUP_C" XXLIBS="benchlib.o" all-bench |
| |
| GC-bench-static: |
| @ $(ECHO) Copying $(BUILD_DIR)/$(LIBSTATIC) |
| @ $(CP) $(BUILD_DIR)/$(LIBSTATIC) . |
| $(MAKE) TEST=GC CC=$(CROSS)-gcc XXCFLAGS="-D__CLEANUP_C -DWTHR_STATIC_LIB" XXLIBS="benchlib.o -lws2_32" all-bench |
| |
| GCE-bench: |
| @ $(ECHO) Copying $(BUILD_DIR)/$(LIB) |
| @ $(CP) $(BUILD_DIR)/$(LIB) . |
| @ $(ECHO) Copying $(BUILD_DIR)/$(DLL) |
| @ $(CP) $(BUILD_DIR)/$(DLL) . |
| $(MAKE) TEST=GCE CC=$(CROSS)-g++ XXCFLAGS="-mthreads -D__CLEANUP_CXX" XXLIBS="benchlib." all-bench |
| |
| GC-debug: |
| @ $(ECHO) Copying $(BUILD_DIR)/$(LIB) |
| @ $(CP) $(BUILD_DIR)/$(LIB) . |
| @ $(ECHO) Copying $(BUILD_DIR)/$(DLL) |
| @ $(CP) $(BUILD_DIR)/$(DLL) . |
| $(MAKE) TEST=GC CC=$(CROSS)-gcc XXCFLAGS="-fopenmp -D__CLEANUP_C" DLL_VER="$(DLL_VER)d" all-pass |
| |
| GC-static: |
| @ $(ECHO) Copying $(BUILD_DIR)/$(LIBSTATIC) |
| @ $(CP) $(BUILD_DIR)/$(LIBSTATIC) . |
| $(MAKE) TEST=GC CC=$(CROSS)-gcc XXCFLAGS="-D__CLEANUP_C -DWTHR_STATIC_LIB" XXLIBS="-lws2_32" DLL="" all-static |
| |
| GC-stress: |
| @ $(ECHO) Copying $(BUILD_DIR)/$(LIB) |
| @ $(CP) $(BUILD_DIR)/$(LIB) . |
| @ $(ECHO) Copying $(BUILD_DIR)/$(DLL) |
| @ $(CP) $(BUILD_DIR)/$(DLL) . |
| $(ECHO) Stress tests can take a long time since they are trying to |
| $(ECHO) expose weaknesses that may be intermittant or statistically rare. |
| $(ECHO) A pass does not prove correctness, but may give greater confidence. |
| $(MAKE) TEST=GC CC=$(CROSS)-gcc XXCFLAGS="-D__CLEANUP_C" XXLIBS="" all-stress |
| |
| GCE-stress: |
| @ $(ECHO) Copying $(BUILD_DIR)/$(LIB) |
| @ $(CP) $(BUILD_DIR)/$(LIB) . |
| @ $(ECHO) Copying $(BUILD_DIR)/$(DLL) |
| @ $(CP) $(BUILD_DIR)/$(DLL) . |
| $(MAKE) TEST=GCE CC=$(CROSS)-g++ XXCFLAGS="-mthreads -D__CLEANUP_CXX" XXLIBS="" all-stress |
| |
| all-pass: $(PASSES) |
| @ $(ECHO) ALL TESTS PASSED! Congratulations! |
| |
| all-bench: $(BENCHRESULTS) |
| @ $(ECHO) BENCH TESTS COMPLETED. |
| |
| all-stress: $(STRESSRESULTS) |
| @ $(ECHO) STRESS TESTS COMPLETED. |
| |
| all-static: $(STATICRESULTS) |
| @ $(ECHO) ALL STATIC TESTS PASSED! Congratulations! |
| |
| benchtest1.bench: |
| benchtest2.bench: |
| benchtest3.bench: |
| benchtest4.bench: |
| benchtest5.bench: |
| benchtest6.bench: |
| |
| barrier1.pass: semaphore4.pass |
| barrier2.pass: barrier1.pass |
| barrier3.pass: barrier2.pass |
| barrier4.pass: barrier3.pass |
| barrier5.pass: barrier4.pass |
| barrier6.pass: barrier5.pass |
| cancel1.pass: create1.pass |
| cancel2.pass: cancel1.pass |
| cancel2_1.pass: cancel2.pass |
| cancel3.pass: context1.pass |
| cancel4.pass: cancel3.pass |
| cancel5.pass: cancel3.pass |
| cancel6a.pass: cancel3.pass |
| cancel6d.pass: cancel3.pass |
| cancel7.pass: kill1.pass |
| cancel8.pass: cancel7.pass |
| cancel9.pass: cancel8.pass |
| cleanup0.pass: cancel5.pass |
| cleanup1.pass: cleanup0.pass |
| cleanup2.pass: cleanup1.pass |
| cleanup3.pass: cleanup2.pass |
| condvar1.pass: |
| condvar1_1.pass: condvar1.pass |
| condvar1_2.pass: join2.pass |
| condvar2.pass: condvar1.pass |
| condvar2_1.pass: condvar2.pass join2.pass |
| condvar3.pass: create1.pass condvar2.pass |
| condvar3_1.pass: condvar3.pass join2.pass |
| condvar3_2.pass: condvar3_1.pass |
| condvar3_3.pass: condvar3_2.pass |
| condvar4.pass: create1.pass |
| condvar5.pass: condvar4.pass |
| condvar6.pass: condvar5.pass |
| condvar7.pass: condvar6.pass cleanup1.pass |
| condvar8.pass: condvar7.pass |
| condvar9.pass: condvar8.pass |
| context1.pass: cancel2.pass |
| count1.pass: join1.pass |
| create1.pass: mutex2.pass |
| create2.pass: create1.pass |
| create3.pass: |
| delay1.pass: cancel2.pass |
| delay2.pass: delay1.pass |
| detach1.pass: join0.pass |
| equal1.pass: create1.pass |
| errno1.pass: mutex3.pass |
| exception1.pass: cancel4.pass |
| exception2.pass: exception1.pass |
| exception3.pass: exception2.pass |
| exit1.pass: |
| exit2.pass: create1.pass |
| exit3.pass: create1.pass |
| exit4.pass: |
| exit5.pass: exit4.pass kill1.pass |
| eyal1.pass: tsd1.pass |
| inherit1.pass: join1.pass priority1.pass |
| join0.pass: create1.pass |
| join1.pass: create1.pass |
| join2.pass: create1.pass |
| join3.pass: join2.pass |
| kill1.pass: |
| loadfree.pass: pthread.dll |
| mutex1.pass: self1.pass |
| mutex1n.pass: mutex1.pass |
| mutex1e.pass: mutex1.pass |
| mutex1r.pass: mutex1.pass |
| mutex2.pass: mutex1.pass |
| mutex2r.pass: mutex2.pass |
| mutex2e.pass: mutex2.pass |
| mutex3.pass: create1.pass |
| mutex3r.pass: mutex3.pass |
| mutex3e.pass: mutex3.pass |
| mutex4.pass: mutex3.pass |
| mutex5.pass: |
| mutex6.pass: mutex4.pass |
| mutex6n.pass: mutex4.pass |
| mutex6e.pass: mutex4.pass |
| mutex6r.pass: mutex4.pass |
| mutex6s.pass: mutex6.pass |
| mutex6rs.pass: mutex6r.pass |
| mutex6es.pass: mutex6e.pass |
| mutex7.pass: mutex6.pass |
| mutex7n.pass: mutex6n.pass |
| mutex7e.pass: mutex6e.pass |
| mutex7r.pass: mutex6r.pass |
| mutex8.pass: mutex7.pass |
| mutex8n.pass: mutex7n.pass |
| mutex8e.pass: mutex7e.pass |
| mutex8r.pass: mutex7r.pass |
| once1.pass: create1.pass |
| once2.pass: once1.pass |
| once3.pass: once2.pass |
| once4.pass: once3.pass |
| openmp1.pass: tsd2.pass |
| priority1.pass: join1.pass |
| priority2.pass: priority1.pass barrier3.pass |
| reuse1.pass: create2.pass |
| reuse2.pass: reuse1.pass |
| rwlock1.pass: condvar6.pass |
| rwlock2.pass: rwlock1.pass |
| rwlock3.pass: rwlock2.pass |
| rwlock4.pass: rwlock3.pass |
| rwlock5.pass: rwlock4.pass |
| rwlock6.pass: rwlock5.pass |
| rwlock7.pass: rwlock6.pass |
| rwlock8.pass: rwlock7.pass |
| rwlock2_t.pass: rwlock2.pass |
| rwlock3_t.pass: rwlock2_t.pass |
| rwlock4_t.pass: rwlock3_t.pass |
| rwlock5_t.pass: rwlock4_t.pass |
| rwlock6_t.pass: rwlock5_t.pass |
| rwlock6_t2.pass: rwlock6_t.pass |
| self1.pass: |
| self2.pass: create1.pass |
| semaphore1.pass: |
| semaphore2.pass: |
| semaphore3.pass: semaphore2.pass |
| semaphore4.pass: semaphore3.pass cancel1.pass |
| semaphore4t.pass: semaphore4.pass |
| semaphore5.pass: semaphore4.pass |
| sizes.pass: |
| spin1.pass: |
| spin2.pass: spin1.pass |
| spin3.pass: spin2.pass |
| spin4.pass: spin3.pass |
| stress1.pass: |
| tsd1.pass: barrier5.pass join1.pass |
| tsd2.pass: tsd1.pass |
| valid1.pass: join1.pass |
| valid2.pass: valid1.pass |
| runall.pass: |
| sizes.pass: sizes.exe |
| @ $(ECHO) Running $* |
| ./$< > SIZES.$(TEST) |
| @ $(CAT) SIZES.$(TEST) |
| @ $(ECHO) Passed |
| @ $(TOUCH) $@ |
| |
| %.pass: %.exe |
| @ $(ECHO) Running $* |
| ./$* |
| @ $(ECHO) Passed |
| @ $(TOUCH) $@ |
| |
| %.bench: $(HDR) $(QAPC) $(XXLIBS) %.exe |
| @ $(ECHO) Running $* |
| ./$* |
| @ $(ECHO) Done |
| @ $(TOUCH) $@ |
| |
| benchtest%.exe: benchtest%.c $(HDR) $(QAPC) |
| @ $(ECHO) Compiling $@ |
| @ $(ECHO) $(CC) $(CFLAGS) -o $@ $< $(INCLUDES) -L../outlib $(LINKAGEFLAG) -lsupc++ $(XXLIBS) |
| @ $(CC) $(CFLAGS) -o $@ $< $(INCLUDES) -L../outlib $(LINKAGEFLAG) -lsupc++ $(XXLIBS) |
| |
| %.exe: %.c $(HDR) $(QAPC) |
| @ $(ECHO) Compiling $@ |
| @ $(ECHO) $(CC) $(CFLAGS) -o $@ $< $(INCLUDES) -L../outlib $(LINKAGEFLAG) -lsupc++ $(XXLIBS) |
| @ $(CC) $(CFLAGS) -o $@ $< $(INCLUDES) -L../outlib $(LINKAGEFLAG) -lsupc++ $(XXLIBS) |
| |
| %.pre: %.c $(HDR) |
| @ $(CC) -E $(CFLAGS) -o $@ $< $(INCLUDES) |
| |
| %.s: %.c $(HDR) |
| @ $(CC) -S $(CFLAGS) -o $@ $< $(INCLUDES) |
| |
| $(COPYFILES): |
| @ $(ECHO) Copying $(BUILD_DIR)/$@ |
| @ $(CP) $(BUILD_DIR)/$@ . |
| |
| benchlib.o: benchlib.c |
| @ $(ECHO) Compiling $@ |
| @ $(ECHO) $(CC) -c $(CFLAGS) $< $(INCLUDES) |
| @ $(CC) -c $(CFLAGS) $< $(INCLUDES) |
| |
| pthread.dll: |
| @ $(ECHO) Preparing loadfree TESTS |
| |
| clean: |
| - $(RM) *.dll |
| - $(RM) *.lib |
| - $(RM) pthread.h |
| - $(RM) semaphore.h |
| - $(RM) sched.h |
| - $(RM) *.a |
| - $(RM) *.e |
| - $(RM) *.i |
| - $(RM) *.o |
| - $(RM) *.so |
| - $(RM) *.obj |
| - $(RM) *.pdb |
| - $(RM) *.exe |
| - $(RM) *.pass |
| - $(RM) *.fail |
| - $(RM) *.x |
| - $(RM) *.bench |
| - $(RM) *.static |
| - $(RM) *.log |