# Mf-base # Copyright 1984-2021 Cisco Systems, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Assumes recursive makes inherit command-line settings as in GNU make # Running "make" or "make all" in this directory runs the mats (test # programs) and produces a report of bugs and errors. Unless you make # changes to the mats or to the system, the report file report-$(conf) # (where $(conf) is set below) will be output in the $(outdir) directory. # If an error or bug report occurs, refer to the offending ".mo" file # produced by the mats and mentioned in the bug or error report to # determine what failed. # Running "make allx" runs a set of mats with various settings. "make # bullyx" runs a different, more stressful set. These targets allow make # to run the various configurations in parallel (if so configured, e.g. # with the -j flag). Most output from each parallel execution is directed # to (separate) files, with status printed to stdout when testing of each # different configuration begins and ends. In addition, each target # concatenates the summary file from all configurations run into "summary" # in the current directory. # Running make with the argument "clean" removes the .so files, .mo # files, report files, and temporary files generated by the mats. # The variables below may be changed to affect how the mats are run. # For example, "make o=2 cp0=t ctb=8192" causes the mats to be run at # optimize level 2 with cp0 enabled and collect-trip-bytes set to 8192. MatsDir = $(abspath .) ifeq (${OS},Windows_NT) dirsep = ; else dirsep = : endif # Explicit ".exe" needed for WSL ifeq ($(OS),Windows_NT) ExeSuffix = .exe else ExeSuffix = endif include ../c/Mf-config # Scheme is the scheme executable to test, SCHEMEHEAPDIRS tells # it where to find its boot files, and CHEZSCHEMELIBDIRS tells # it where to find libraries. Scheme = $(abspath ../bin/$m/scheme${ExeSuffix}) export SCHEMEHEAPDIRS=.${dirsep}$(abspath ../boot)/%m export CHEZSCHEMELIBDIRS=. # Include is the directory holding scheme.h. Include = ../boot/$m # patchfile is the name of a patch to be loaded while running the mats. patchfile = # o is the optimize level at which the mats should be run. o = 0 # p determines whether profiling is enabled: f for false, t for true. defaultp = f p = $(defaultp) # pdhtml determines whether profile-dump-html is called at end of a run: f for false, t for true. # NB: beware of lost profile information due to mats that call profile-clear defaultpdhtml = f pdhtml = $(defaultpdhtml) # cp0 determines whether cp0 is run: f for no, t for yes defaultcp0 = f cp0 = $(defaultcp0) # eval is the evaluator to use. defaulteval = compile eval = $(defaulteval) # ctb is the value to which collect-trip-bytes is set. defaultctb = (collect-trip-bytes) ctb = $(defaultctb) # cn defines the value to which collect-notify is set: f for #f, t for #t defaultcn = f cn = $(defaultcn) # cgr is the value to which collect-generation-radix is set. defaultcgr = (collect-generation-radix) cgr = $(defaultcgr) # cmg is the value to which collect-maximum-generation is set. defaultcmg = (collect-maximum-generation) cmg = $(defaultcmg) # rmg is the value to which release-minimum-generation is set. defaultrmg = (release-minimum-generation) rmg = $(defaultrmg) # cis defines the value to which compile-interpret-simple is set: f for # #f, t for #t defaultcis = f cis = $(defaultcis) # spi defines the value to which suppress-primitive-inlining is set: # f for #f, t for #t defaultspi = f spi = $(defaultspi) # hci defines the value to which heap-check-interval (mat.ss) is set: # 0 to disable, > 0 to enable defaulthci = 0 hci = $(defaulthci) # eoc determines whether object counts are enabled defaulteoc = t eoc = $(defaulteoc) # cl determines the commonization level defaultcl = (commonization-level) cl = $(defaultcl) # ecpf determines whether the compiler checks prelex flags defaultecpf = t ecpf = $(defaultecpf) # c determines whether mat coverage (.covout) files are created defaultc = f c = $(defaultc) # set of coverage files to load coverage-files = $(abspath ../boot/$m/petite.covin ../boot/$m/scheme.covin) # set of mats to run mats = primvars 3 4 5_1 5_2 5_3 5_4 5_5 bytevector thread profile\ misc cp0 5_6 5_7 5_8 6 io format 7 record hash enum 8 fx fl cfl foreign\ ftype unix windows examples ieee date exceptions oop Examples = $(abspath ../examples) MAKEFLAGS += --no-print-directory # directory where (most) output for this run will be written outdir=output conf = $(eval)-$o-$(spi)-$(cp0)-$(cis) objdir=output-$(conf) objname = $(mats:%=%.mo) obj = $(objname:%=$(objdir)/%) src = $(mats:%=%.ms) # prettysrc is src to use for pretty-print test; we leave out mat files # with cycles, e.g., primvars.ms, misc.ms, 4.ms, 5_1.ms, hash.ms prettysrc = 3.ms 5_3.ms 5_4.ms 5_5.ms bytevector.ms thread.ms profile.ms\ 5_6.ms 5_7.ms 5_8.ms 6.ms io.ms format.ms 7.ms record.ms enum.ms 8.ms\ fx.ms fl.ms cfl.ms foreign.ms unix.ms windows.ms examples.ms ieee.ms date.ms\ exceptions.ms define conf-scheme-code '(optimize-level $o)'\ '(#%$$suppress-primitive-inlining #${spi})'\ '(heap-check-interval ${hci})'\ '(#%$$enable-check-prelex-flags #${ecpf})'\ '(compile-profile #$p)'\ '(collect-notify #${cn})'\ '(collect-trip-bytes ${ctb})'\ '(collect-generation-radix ${cgr})'\ '(collect-maximum-generation ${cmg})'\ '(enable-object-counts #${eoc})'\ '(commonization-level ${cl})'\ '(release-minimum-generation ${rmg})'\ '(compile-interpret-simple #${cis})'\ '(set! *examples-directory* "${Examples}")'\ '(enable-cp0 #${cp0})'\ '(set! *scheme* "${Scheme}")'\ '(set! *mats-dir* "${MatsDir}")'\ '(set! $$cat_flush "${MatsDir}/cat_flush${ExeSuffix}")'\ '(current-eval ${eval})'\ '(when #$c (coverage-table (load-coverage-files ${coverage-files:%="%"})))' endef $(objdir)/%.mo : %.ms mat.so echo $(conf-scheme-code)\ '(time ((mat-file "$(objdir)") "$*"))'\ '(unless (= (#%$$check-heap-errors) 0)'\ ' (fprintf (console-error-port) "check heap detected errors---grep standard output for !!!\n")'\ ' (abort))'\ | ${Scheme} -q mat.so ${patchfile} # same as above except puts the .mo file in . %.mo : %.ms mat.so echo $(conf-scheme-code)\ '(time ((mat-file ".") "$*"))'\ '(parameterize ([source-directories (quote ("." "../s"))]) (when #${pdhtml} (profile-dump-html)))'\ '(unless (= (#%$$check-heap-errors) 0)'\ ' (fprintf (console-error-port) "check heap detected errors---grep standard output for !!!\n")'\ ' (abort))'\ | ${Scheme} -q mat.so ${patchfile} %.so : %.ss echo '(reset-handler abort) (time (compile-file "$*"))' | ${Scheme} -q ${patchfile} report: $(outdir)/report-$(conf) experr: experr-$(conf) $(outdir)/report-$(conf): $(outdir)/errors-$(conf) $(MAKE) doreport doreport: experr-$(conf) rm -f $(outdir)/report-$(conf) -diff experr-$(conf) $(outdir)/errors-$(conf) > $(outdir)/report-$(conf) 2>&1 maybe-doreport: -if [ -f $(outdir)/errors-$(conf) ] ; then\ $(MAKE) doreport ;\ fi $(outdir)/errors-$(conf): ${obj} $(MAKE) doerrors doerrors: $(outdir) rm -f $(outdir)/errors-$(conf) -(cd $(objdir); grep '^Error' $(objname)) > $(outdir)/errors-$(conf) -(cd $(objdir); grep '^Bug' $(objname)) >> $(outdir)/errors-$(conf) -(cd $(objdir); grep '^Warning' $(objname)) >> $(outdir)/errors-$(conf) -(cd $(objdir); grep '^Expected' $(objname))\ >> $(outdir)/errors-$(conf) fastreport: $(MAKE) doerrors $(MAKE) doreport docoverage: mat.so if [ "$c" = "t" ] ; then\ echo '(reset-handler abort) (combine-coverage-files "$(objdir)/all.covout" (quote ($(mats:%="$(objdir)/%.covout"))))' | ${Scheme} -q ${patchfile} mat.so ;\ echo '(reset-handler abort) (coverage-percent "$(objdir)/all.covout" ${coverage-files:%="%"})' | ${Scheme} -q ${patchfile} mat.so ;\ echo '(reset-handler abort) (coverage-percent "$(objdir)/run.covout" ${coverage-files:%="%"})' | ${Scheme} -q ${patchfile} mat.so ;\ fi doallcoverage: mat.so if [ "$c" = "t" ] ; then\ echo '(reset-handler abort) (combine-coverage-files "all.covout" (map symbol->string (quote ($(shell echo */all.covout)))))' | ${Scheme} -q ${patchfile} mat.so ;\ echo '(reset-handler abort) (coverage-percent "all.covout" ${coverage-files:%="%"})' | ${Scheme} -q ${patchfile} mat.so ;\ echo '(reset-handler abort) (combine-coverage-files "run.covout" (map symbol->string (quote ($(shell echo */run.covout)))))' | ${Scheme} -q ${patchfile} mat.so ;\ echo '(reset-handler abort) (coverage-percent "run.covout" ${coverage-files:%="%"})' | ${Scheme} -q ${patchfile} mat.so ;\ fi define parallel-config-template parallel$(1)-0: -@$$(MAKE) allxphelp outdir=output-$(1)-0 objdir=output-$(1)-0 o=0 $(2) parallel$(1)-3: -@$$(MAKE) allxphelp outdir=output-$(1)-3 objdir=output-$(1)-3 o=3 $(2) endef #configs from partialx and allx $(eval $(call parallel-config-template,1,)) $(eval $(call parallel-config-template,2,cp0=t)) $(eval $(call parallel-config-template,3,cp0=t cl=3)) $(eval $(call parallel-config-template,4,spi=t rmg=2 p=t)) $(eval $(call parallel-config-template,5,eval=interpret cl=6)) $(eval $(call parallel-config-template,6,eval=interpret cp0=t rmg=2)) $(eval $(call parallel-config-template,7,eoc=f hci=101 cl=9)) $(eval $(call parallel-config-template,8,eval=interpret hci=101 rmg=2)) #configs from bullyx $(eval $(call parallel-config-template,b1,allxphelp-target=allxhelpnotall spi=t cp0=f)) $(eval $(call parallel-config-template,b2,spi=f cp0=f cl=9 ctb='(/ (collect-trip-bytes) 64)' hci=503)) $(eval $(call parallel-config-template,b3,spi=t cp0=f cis=t cmg=1)) $(eval $(call parallel-config-template,b4,spi=f cp0=f cis=t cmg=6 hci=101)) $(eval $(call parallel-config-template,b5,spi=t cp0=t ctb='(/ (collect-trip-bytes) 64)' cgr=6)) $(eval $(call parallel-config-template,b6,spi=t cp0=f p=t eoc=f hci=101)) $(eval $(call parallel-config-template,b7,spi=f cp0=t cl=9 p=t hci=101)) $(eval $(call parallel-config-template,b8,eval=interpret spi=f cp0=f)) $(eval $(call parallel-config-template,b9,eval=interpret spi=f cp0=t)) $(eval $(call parallel-config-template,b10,eval=interpret spi=t cp0=f ctb='(/ (collect-trip-bytes) 64)' hci=503)) $(eval $(call parallel-config-template,b11,eval=interpret spi=t cp0=t cgr=2 hci=101 p=t)) partialx-confs = 1-0 1-3 2-3 6-3 allx-confs = 1-0 1-3 3-0 3-3 4-0 4-3 5-0 5-3 6-0 6-3 7-0 8-3 bullyx-confs = $(foreach n,1 2 3 4 5 6 7 8 9 10 11,b$(n)-0 b$(n)-3) define parallel-target-template $(1)-targets: $($(1)-confs:%=parallel%) $(1): prettyclean @echo building prereqs with output to Make.out @$$(MAKE) parallel-prereqs > Make.out 2>&1 @$$(MAKE) $(1)-targets $(if $(2),@$$(MAKE) $(2)) cat $($(1)-confs:%=output-%/summary) > summary && cat summary endef $(eval $(call parallel-target-template,partialx)) $(eval $(call parallel-target-template,allx,doallcoverage)) $(eval $(call parallel-target-template,bullyx,doallcoverage)) just-reports: for EVAL in compile interpret ; do\ for O in 0 2 3 ; do\ for SPI in f t ; do\ for CP0 in f t ; do\ for CIS in f t ; do\ $(MAKE) maybe-doreport eval=$$EVAL o=$$O spi=$$SPI cp0=$$CP0 cis=$$CIS ;\ done\ done\ done\ done\ done allxhelp: $(MAKE) doheader -$(MAKE) all $(MAKE) dosummary config-vars = spi hci ecpf cp0 cis p eval ctb cgr cmg eoc cl rmg full-config-str = $(strip o=$(o) $(foreach var, $(config-vars),$(if $(filter-out $($(var:%=default%)),$($(var))),$(var)=$($(var)))) $(hdrmsg)) allxphelp-target = allxhelp allxphelp: $(outdir) @echo "matting configuration ($(full-config-str)) with output to $(outdir)/Make.out" @$(MAKE) $(allxphelp-target) > "$(outdir)/Make.out" 2>&1 @echo "finished matting configuration $(full-config-str)" summary-file=$(outdir)/summary $(outdir): @mkdir -p "$(outdir)" doheader: $(outdir) printf "%s" "-------- o=$o" >> $(summary-file) if [ "$(spi)" != "$(defaultspi)" ] ; then printf " spi=$(spi)" >> $(summary-file) ; fi if [ "$(hci)" != "$(defaulthci)" ] ; then printf " hci=$(hci)" >> $(summary-file) ; fi if [ "$(ecpf)" != "$(defaultecpf)" ] ; then printf " ecpf(ecpf)" >> $(summary-file) ; fi if [ "$(cp0)" != "$(defaultcp0)" ] ; then printf " cp0=$(cp0)" >> $(summary-file) ; fi if [ "$(cis)" != "$(defaultcis)" ] ; then printf " cis=$(cis)" >> $(summary-file) ; fi if [ "$p" != "$(defaultp)" ] ; then printf " p=$p" >> $(summary-file) ; fi if [ "$(eval)" != "$(defaulteval)" ] ; then printf " eval=$(eval)" >> $(summary-file) ; fi if [ "$(ctb)" != "$(defaultctb)" ] ; then printf " ctb=$(ctb)" >> $(summary-file) ; fi if [ "$(cgr)" != "$(defaultcgr)" ] ; then printf " cgr=$(cgr)" >> $(summary-file) ; fi if [ "$(cmg)" != "$(defaultcmg)" ] ; then printf " cmg=$(cmg)" >> $(summary-file) ; fi if [ "$(eoc)" != "$(defaulteoc)" ] ; then printf " eoc=$(eoc)" >> $(summary-file) ; fi if [ "$(cl)" != "$(defaultcl)" ] ; then printf " cl=$(cl)" >> $(summary-file) ; fi if [ "$(rmg)" != "$(defaultrmg)" ] ; then printf " rmg=$(rmg)" >> $(summary-file) ; fi if [ "$(hdrmsg)" != "" ] ; then printf " $(hdrmsg)" >> $(summary-file) ; fi dosummary: printf " --------\n" >> $(summary-file) if [ -f $(outdir)/report-$(conf) ] ; then\ cat $(outdir)/report-$(conf) >> $(summary-file) ;\ else \ printf 'NO REPORT\n' >> $(summary-file) ;\ fi allxhelpnotall: rm -f mat.so $(MAKE) doheader hdrmsg="not all" -$(MAKE) $(MAKE) dosummary $(MAKE) docoverage all0: ; $(MAKE) all o=0 all1: ; $(MAKE) all o=1 all2: ; $(MAKE) all o=2 all3: ; $(MAKE) all o=3 parallel-prereqs: $(src) oop.ss ht.ss mat.so cat_flush${ExeSuffix} ${fobj} m4test.in m4test.out prettytest.ss ftype.h freq.in freq.out ${patchfile} build-examples all: $(outdir) $(outdir)/script.all $(src) oop.ss ht.ss mat.so cat_flush${ExeSuffix} ${fobj} m4test.in m4test.out prettytest.ss ftype.h freq.in freq.out ${patchfile} build-examples ${Scheme} --verbose -q mat.so ${patchfile} < $(outdir)/script.all $(MAKE) doerrors $(MAKE) doreport $(MAKE) docoverage $(outdir)/script.all: Mf-base $(outdir) $(outdir)/script.all makescript$o: echo $(conf-scheme-code)\ '(record-run-coverage "$(objdir)/run.covout"'\ ' (lambda ()'\ ' (time (for-each (lambda (x) (time ((mat-file "$(objdir)") x)))'\ ' (quote ($(mats:%="%")))))'\ ' (parameterize ([source-directories (quote ("." "../s"))]) (when #${pdhtml} (profile-dump-html)))'\ ' (unless (= (#%$$check-heap-errors) 0)'\ ' (fprintf (console-error-port) "check heap detected errors---grep standard output for !!!\n")'\ ' (abort))))'\ > $(outdir)/script.all source: $(MAKE) source0 o=0 $(MAKE) source2 o=2 $(MAKE) source3 o=3 source$o: ${src} mat.ss oop.ss ht.ss cat_flush.c ${fsrc} freq.in freq.out m4test.in m4test.out $(outdir)/script.all prettytest.ss ftype.h rootsrc = $(shell cd ../../mats; echo *) ${rootsrc}: ifeq ($(OS),Windows_NT) cp -p ../../mats/$@ $@ else ln -s ../../mats/$@ $@ endif prettytest.ss: rm -f prettytest.ss $(MAKE) ${prettysrc} cat ${prettysrc} > prettytest.ss bullyprettytest.ss: ${src} (cd ../s; make source) cat ${src} ../s/*.ss > prettytest.ss mat.so: ${patchfile} foreign.mo ${objdir}/foreign.mo: ${fobj} thread.mo ${objdir}/thread.mo: ${fobj} examples.mo ${objdir}/examples.mo: m4test.in m4test.out freq.in freq.out build-examples 6.mo ${objdir}/6.mo: prettytest.ss bytevector.mo ${objdir}/bytevector.mo: prettytest.ss io.mo ${objdir}/io.mo: prettytest.ss unix.mo ${objdir}/unix.mo io.mo ${objdir}/io.mo 6.mo ${objdir}/6.mo: cat_flush${ExeSuffix} oop.mo ${objdir}/oop.mo: oop.ss ftype.mo ${objdir}/ftype.mo: ftype.h hash.mo ${objdir}/hash.mo: ht.ss build-examples: ( cd ../examples && ${MAKE} Scheme=${Scheme} ) touch build-examples prettyclean: rm -f *.o ${mdclean} *.so *.mo *.covout experr* errors* report* summary testfile* testscript\ ${fobj} prettytest.ss cat_flush${ExeSuffix} so_locations\ build-examples script.all? *.html experr*.rej experr*.orig rm -rf testdir* rm -rf output output-* patches-work-dir ( cd ../examples && ${MAKE} Scheme=${Scheme} clean ) clean: prettyclean rm -f Make.out ### rules for generating various experr files # everything starts with the root experr files with default # settings for the various parameters experr-compile-$o-f-f-f: root-experr-compile-$o-f-f-f cp root-experr-compile-$o-f-f-f experr-compile-$o-f-f-f root-experr: # don't list dependencies! rm -f root-experr-compile-$o-f-f-f # use the shell glob mechanism to find the file in any output* dir err_file=(output*/errors-compile-$o-f-f-f); cp $${err_file[0]} root-experr-compile-$o-f-f-f root-experrs: # don't list dependencies! $(MAKE) root-experr o=0 $(MAKE) root-experr o=3 # derive spi=t experr files by patching spi=f experr files # cp first in case patch is empty, since patch produces an empty output # file rather than a copy of the input file if the patch file is empty experr-compile-$o-t-f-f: experr-compile-$o-f-f-f patch-compile-$o-t-f-f cp experr-compile-$o-f-f-f experr-compile-$o-t-f-f -patch experr-compile-$o-t-f-f patch-compile-$o-t-f-f # derive cp0=t experr files by patching cp0=f experr files experr-compile-$o-$(spi)-t-f: experr-compile-$o-$(spi)-f-f patch-compile-$o-$(spi)-t-f cp experr-compile-$o-$(spi)-f-f experr-compile-$o-$(spi)-t-f -patch experr-compile-$o-$(spi)-t-f patch-compile-$o-$(spi)-t-f # derive cis=t experr files by patching cis=f experr files experr-compile-$o-$(spi)-$(cp0)-t: experr-compile-$o-$(spi)-$(cp0)-f patch-compile-$o-$(spi)-$(cp0)-t cp experr-compile-$o-$(spi)-$(cp0)-f experr-compile-$o-$(spi)-$(cp0)-t -patch experr-compile-$o-$(spi)-$(cp0)-t patch-compile-$o-$(spi)-$(cp0)-t # derive eval=interpret experr files by patching eval=compile experr files # (with cis=f, since compile-interpret-simple does not affect interpret) experr-interpret-$o-$(spi)-$(cp0)-$(cis): experr-compile-$o-$(spi)-$(cp0)-f patch-interpret-$o-$(spi)-$(cp0)-f cp experr-compile-$o-$(spi)-$(cp0)-f experr-interpret-$o-$(spi)-$(cp0)-$(cis) -patch experr-interpret-$o-$(spi)-$(cp0)-$(cis) patch-interpret-$o-$(spi)-$(cp0)-f ### rebuilding patch files patches: rm -rf patches-work-dir mkdir patches-work-dir shopt -s nullglob; cp output*/errors-compile* output*/errors-interpret* patches-work-dir for O in 0 2 3 ; do\ if [ -f patches-work-dir/errors-compile-$$O-f-f-f -a -e patches-work-dir/errors-compile-$$O-t-f-f ] ; then \ $(MAKE) xpatch-compile-$$O-t-f-f o=$$O spi=t ; \ fi ;\ for SPI in f t ; do\ if [ -f patches-work-dir/errors-compile-$$O-$$SPI-f-f -a -e patches-work-dir/errors-compile-$$O-$$SPI-t-f ] ; then \ $(MAKE) xpatch-compile-$$O-$$SPI-t-f o=$$O spi=$$SPI cp0=t ;\ fi ;\ for CP0 in f t ; do\ if [ -f patches-work-dir/errors-compile-$$O-$$SPI-$$CP0-f -a -e patches-work-dir/errors-compile-$$O-$$SPI-$$CP0-t ] ; then \ $(MAKE) xpatch-compile-$$O-$$SPI-$$CP0-t o=$$O spi=$$SPI cp0=$$CP0 cis=t ;\ fi ;\ if [ -f patches-work-dir/errors-compile-$$O-$$SPI-$$CP0-f -a -e patches-work-dir/errors-interpret-$$O-$$SPI-$$CP0-f ] ; then \ $(MAKE) xpatch-interpret-$$O-$$SPI-$$CP0-f o=$$O spi=$$SPI cp0=$$CP0 ;\ fi\ done\ done\ done xpatch-compile-$o-t-f-f: # don't list dependencies! rm -f patch-compile-$o-t-f-f -diff --context patches-work-dir/errors-compile-$o-f-f-f\ patches-work-dir/errors-compile-$o-t-f-f\ > patch-compile-$o-t-f-f xpatch-compile-$o-$(spi)-t-f: # don't list dependencies! rm -f patch-compile-$o-$(spi)-t-f -diff --context patches-work-dir/errors-compile-$o-$(spi)-f-f\ patches-work-dir/errors-compile-$o-$(spi)-t-f\ > patch-compile-$o-$(spi)-t-f xpatch-compile-$o-$(spi)-$(cp0)-t: # don't list dependencies! rm -f patch-compile-$o-$(spi)-$(cp0)-t -diff --context patches-work-dir/errors-compile-$o-$(spi)-$(cp0)-f\ patches-work-dir/errors-compile-$o-$(spi)-$(cp0)-t\ > patch-compile-$o-$(spi)-$(cp0)-t xpatch-interpret-$o-$(spi)-$(cp0)-f: # don't list dependencies! rm -f patch-interpret-$o-$(spi)-$(cp0)-f -diff --context patches-work-dir/errors-compile-$o-$(spi)-$(cp0)-f\ patches-work-dir/errors-interpret-$o-$(spi)-$(cp0)-f\ > patch-interpret-$o-$(spi)-$(cp0)-f