DOCDIR:=../doc/latex/lettre TEXDIR:=../tex/latex/lettre ONE_PASS?=# TEST_SERIES:=pdftest grtest PDFTEST:=pdftest$(ONE_PASS) REFERENCE:=reference$(ONE_PASS) GRTEST:=grtest$(ONE_PASS) GRTEST_DIFF:=$(GRTEST)s-diff SUBDIR:=$(addsuffix $(ONE_PASS)s,$(TEST_SERIES)) $(GRTEST_DIFF) $(REFERENCE)s-pages $(REFERENCE)s-text DASHES:='==================================================================================================' ENUMERATION:=1 2 3 4 5 6 REDOCDIR:=$(subst .,\.,$(subst /,\/,$(DOCDIR)/)) MAGICK_HOME?=# # On s'assure que si MAGICK_HOME est configuré, alors ça se termine par / ifeq ($(MAGICK_HOME),) else ifeq ($(patsubst %/,[:found:],$(lastword $(MAGICK_HOME))),[:found:]) else MAGICK_HOME:=$(MAGICK_HOME)/# endif CLEAN_EXT:=odt tns aux fax include $(DOCDIR)/lettre-makedefinitions.mak VERSION_M4:=$(DOCDIR)/version.m4 LOCAL_TESTS:=1 anglais angmlp allemlp centerflush francais frdeenmlp \ latin9avecbab latin9avecmlp latin9frenbab latin9sansmlp \ longlongnoms marge romand utf8avecbab utf8avecmlp utf8frenbab \ utf8sansmlp # On permet de faire les test sur un ensemble réduit de fichier # par ex. : # make realclean all "TESTS=anglais testfaxe" TESTS?=$(LOCAL_TESTS) $(EXAMPLES) DATE_1:=2015 12 25 DATE_allemlp:=2015 11 18 DATE_anglais:=2015 11 18 DATE_angmlp:=2015 11 18 DATE_francais:=2015 11 18 DATE_frdeenmlp:=2015 11 18 DATE_romand:=2015 11 18 DATE_latin9avecbab:=2015 12 26 DATE_latin9avecmlp:=2015 12 26 DATE_latin9frenbab:=2015 12 26 DATE_latin9sansmlp:=2015 12 26 DATE_utf8avecbab:=2015 12 26 DATE_utf8avecmlp:=2015 12 25 DATE_utf8frenbab:=2015 12 26 DATE_utf8sansmlp:=2015 12 26 DATE_marge:=2017 1 06 DATE_centerflush:=2017 8 10 define _1 DATE_$(1):=2015 12 6 endef $(eval $(foreach EXAMPLE,$(EXAMPLES),$(call _1,$(EXAMPLE)))) MAKELEVELBASE_P1:=$(shell expr $(MAKELEVEL) + 1) ifeq ($(PAGES_KNOWN),1) include $(REFERENCE)s/number-of-pages.mak define _1 PAGES_T_$(1)?=1 endef $(eval $(foreach TEST,$(TESTS),$(call _1,$(TEST)))) endif define GET_INSTITUT_AWK function file_exists(filename){ \ if((getline junk < filename) < 0) \ return 0; \ else{ \ close(filename); \ return 1; \ } \ }; \ BEGIN { exitstatus = 0 }; \ BEGINFILE { strict = 0; institut = ""; \ var_assign = gensub(/^(test-|$(REDOCDIR))([a-zA-Z0-9]+)\.tex$$/,"INSTITUT_\\2:=",1,FILENAME); \ if(FILENAME ~ /^$(REDOCDIR)/) \ dir = "$(DOCDIR)/"; \ else \ dir = ""; \ };\ /^ *\\documentclass *\[([a-zA-Z0-9 ]+( *=[a-zA-Z0-9 ]+)?, *)*strict( *,[a-zA-Z0-9 ]+( *=[a-zA-Z0-9 ]+)?)* *\] *{lettre}/ { strict = 1 }; \ /\\institut *{/ { institut= gensub(/^.*\\institut *{[./]*([a-zA-Z0-9]+)}.*$$/,"\\1",1); \ if(file_exists(dir "lettre-" institut ".cfg")){ \ print var_assign "lettre-" institut ".cfg"; \ close((dir "lettre-" institut ".cfg"));\ } else if(strict){ \ print "Institut non trouvé dans " FILENAME > "/dev/stderr"; \ exitstatus = 126; \ }\ else \ print var_assign institut ".ins"; \ nextfile; \ }; \ ENDFILE { if(institut == "") print var_assign}; \ END { exit(exitstatus) } endef $(foreach EXPR,$(shell awk '$(GET_INSTITUT_AWK)' \ $(patsubst %,test-%.tex, $(LOCAL_TESTS)) \ $(patsubst %,$(DOCDIR)/%.tex, $(EXAMPLES)) ),$(eval $(EXPR))) define ERROR_COUNT_AWK BEGIN { failcount=0} ;\ /^Test [^:]+: failed/ { ++failcount } ;\ END { print "\nTotal failure count = " failcount} endef define TOTAL_FAILURE_COUNT_AWK BEGIN { tfc=0; found=0}; \ /Total failure count = / && found == 1 { print "Deux occurrences de \"Total failure count\" dans le log " FILENAME; exit(-1); }; \ /Total failure count = / && found == 0 { split($$0,a," *= *"); tfc += a[2]; found = 1}; \ END { print tfc} endef .PHONY: all all: $(addsuffix $(ONE_PASS)s.log,$(TEST_SERIES)) @declare -i failure_count; \ for w in $(addsuffix $(ONE_PASS)s.log,$(TEST_SERIES)); do\ failure_count=$$failure_count+$$(awk '$(TOTAL_FAILURE_COUNT_AWK)' $$w); \ done; \ echo $(DASHES);\ echo "== GRAND TOTAL FAILURE COUNT = $$failure_count"; \ if [ $$failure_count -ne 0 ]; then \ echo "== ERROR: please correct failed test(s) before commiting changes"; \ echo $(DASHES);\ exit -1; \ fi;\ echo $(DASHES); define _1 .PHONY: echo_$(1) ifeq ($(1),grtest) echo_$(1): $(GRTEST_DIFF)/.dir rm -f $(GRTEST_DIFF)/failed-toc.html $(GRTEST_DIFF)/success-toc.html $(GRTEST_DIFF)/failed-body.html printf "" > $(GRTEST_DIFF)/failed-toc.html printf "" > $(GRTEST_DIFF)/success-toc.html printf "" > $(GRTEST_DIFF)/failed-body.html else echo_$(1): endif rm -f $(1)$(ONE_PASS)s.log @echo $(DASHES) @echo '== Début cible $(1)' @echo $(DASHES) .PHONY: $(1) $(1): $(1)$(ONE_PASS)s.log @declare -i failure_count=$$$$(awk '$$(TOTAL_FAILURE_COUNT_AWK)' $$<); \ echo $(DASHES);\ echo "== $(1) TOTAL FAILURE COUNT = $$$$failure_count"; \ if [ $$$$failure_count -ne 0 ]; then \ echo "== ERROR: please correct failed test(s) before commiting changes"; \ echo $(DASHES);\ exit -1; \ fi;\ echo $(DASHES) endef define _2 .PHONY: echo_$(1) echo_$(1): ; endef ifeq ($(PAGES_KNOWN),1) $(eval $(call _1,grtest) \ $(foreach TARGET,$(filter-out grtest,$(TEST_SERIES)),$(call _2,$(TARGET)))) else $(eval $(foreach TARGET,$(TEST_SERIES),$(call _1,$(TARGET)))) endif define _1 $(1)/.dir: mkdir -p $(1) echo "" > $$@ endef $(eval $(foreach TARGET,$(SUBDIR),$(call _1,$(TARGET)))) $(PDFTEST)s.log: $(patsubst %,textdiff-%,$(TESTS)) total_pdftests .PHONY: total_pdftests total_pdftests: $(patsubst %,$(PDFTEST)s/test-%.txt,$(TESTS)) awk '$(ERROR_COUNT_AWK)' $(PDFTEST)s.log >> $(PDFTEST)s.log @echo $(DASHES) @echo '== End target pdftests' @echo $(DASHES) define _1 .PHONY: textdiff-$(1) textdiff-$(1): $(PDFTEST)s/test-$(1).txt $(REFERENCE)s-text/test-$(1).txt echo_pdftest if diff -abs $(PDFTEST)s/test-$(1).txt $(REFERENCE)s-text/test-$(1).txt; then \ echo "Test $(1): ok" >> $(PDFTEST)s.log; \ else echo "Test $(1): failed = différent de la référence" >> $(PDFTEST)s.log; \ fi endef $(eval $(foreach TEST,$(TESTS),$(call _1,$(TEST)))) $(patsubst %,$(PDFTEST)s/test-%.txt,$(TESTS)):$(PDFTEST)s/test-%.txt:$(PDFTEST)s/test-%.pdf $(PDFTEST)s/.dir pdftotext $< $@ $(patsubst %,$(REFERENCE)s-text/test-%.txt,$(TESTS)):$(REFERENCE)s-text/%.txt:$(REFERENCE)s/%.pdf $(REFERENCE)s-text/.dir pdftotext $< $@ ifeq ($(PAGES_KNOWN),1) PDFTEST_PHONY_DEPS:= else PDFTEST_PHONY_DEPS:=echo_pdftest styfiles endif $(patsubst %,$(PDFTEST)s/test-%.pdf,$(TESTS)):$(PDFTEST)s/test-%.pdf: test-%.tex $(INSTITUT_%) $(PDFTEST)s/.dir $(PDFTEST_PHONY_DEPS) ifndef ONE_PASS cd $(PDFTEST)s/; \ if [ -f ../$(basename $<).odt ]; then\ ln -s ../$(basename $<).odt $(basename $<).odt;\ fi; \ templatexmkrc=$$(mktemp /tmp/latexmkrc.XXXXXXXXXX); \ echo '$MSWin_back_slash=0;' > $templatexmkrc; \ fake_date="-r $$templatexmkrc"; \ if [ -n "$(DATE_$*)" ]; then \ printf '$$pdflatex='"'"'pdflatex %%O "\\year=%d \\month=%d \\day=%d \\input" %%S'"'"';' $(DATE_$*) >> $$templatexmkrc; \ else \ echo '$$pdflatex='"'"'pdflatex %O %S'"'" >> $templatexmkrc; \ fi; \ if latexmk -pdf -interaction=nonstopmode $$fake_date ../$<; then :; \ else echo "Test $*: failed = échec compilation, état de sortie = $$?" >> ../$(PDFTEST)s.log; \ fi; \ rm $$templatexmkrc; else ifeq ($(ONE_PASS),1) cd $(PDFTEST)s/; \ if [ -f ../$(basename $<).odt ]; then\ ln -s ../$(basename $<).odt $(basename $<).odt;\ fi; \ echo $(patsubst %,$(basename $<).%,$(CLEAN_EXT)) | xargs rm -f; \ cmd="pdflatex -interaction=nonstopmode "; \ if [ -n "$(DATE_$*)" ]; then \ cmd="$$cmd\\\\relax`printf '\\\\\\\\year=%d \\\\\\\\month=%d \\\\\\\\day=%d ' $(DATE_$*)`"; \ fi; \ cmd="$$cmd\\\\input ../$<"; \ echo "Exécution de : $$cmd."; \ if eval "$$cmd"; then :; \ else echo "Test $*: failed = échec compilation, état de sortie = $$?" >> ../$(PDFTEST)s.log; \ fi endif endif ifeq ($(PAGES_KNOWN),1) define _1 $(REFERENCE)s-pages/test-$(1)-p$(2).pdf:$(REFERENCE)s/test-$(1).pdf $(REFERENCE)s-pages/.dir pdftk $$< cat $(2) output $$@ endef $(eval $(foreach TEST,$(TESTS),$(foreach PAGE,$(wordlist 1,$(PAGES_R_$(TEST)),$(ENUMERATION)),$(call _1,$(TEST),$(PAGE))))) define _1 $(GRTEST)s/test-$(1)-p$(2).pdf:$(PDFTEST)s/test-$(1).pdf $(GRTEST)s/.dir pdftk $$< cat $(2) output $$@ endef $(eval $(foreach TEST,$(TESTS),$(foreach PAGE,$(wordlist 1,$(PAGES_T_$(TEST)),$(ENUMERATION)),$(call _1,$(TEST),$(PAGE))))) endif $(GRTEST)s.log: $(patsubst %,grdiff-%,$(TESTS)) total_grtests ifeq ($(PAGES_KNOWN),1) define MAKE_GRDIFF $(call MAKE_GRDIFF_1,$(1)) $(call MAKE_GRDIFF_2,$(1)) $(foreach PAGE,$(wordlist 1,$(PAGES_R_$(1)),$(ENUMERATION)),$(call MAKE_GRDIFF_3,$(1),$(PAGE))) endef else define MAKE_GRDIFF $(call MAKE_GRDIFF_1,$(1)) endef endif define GET_NUMBER_OF_PAGES_AWK BEGIN { exitstatus = 1;}; \ $$1 == "NumberOfPages:" { \ if($$2 > $(lastword $(ENUMERATION))){\ print "Erreur: ENUMERATION trop court" > "/dev/stderr"; \ exitstatus = 125; exit}; \ print "PAGES_" fn ":=" $$2; exitstatus= 0; exit }; \ END { exit exitstatus } endef define MAKE_GRDIFF_1 .PHONY: grdiff-$(1) grdiff-$(1): $(PDFTEST)s/test-$(1).pdf echo_grtest $(REFERENCE)s/number-of-pages.mak $(MAKE) _grdiff-$(1) \ "`pdftk $$< dump_data | awk -v fn=T_$(1) '$$(GET_NUMBER_OF_PAGES_AWK)'`" \ PAGES_KNOWN=1 endef $(REFERENCE)s/number-of-pages.mak: $(patsubst %,$(REFERENCE)s/test-%.pdf,$(TESTS)) -rm $@ for w in $(TESTS); do \ echo "`pdftk $(REFERENCE)s/test-$$w.pdf dump_data | awk -v fn=R_$$w '$(GET_NUMBER_OF_PAGES_AWK)'`" >> $@; \ done define MAKE_GRDIFF_2 .PHONY: _grdiff-$(1) _grdiff-$(1): $(foreach PAGE,$(wordlist 1,$(PAGES_T_$(1)),$(ENUMERATION)),$(GRTEST)s/test-$(1)-p$(PAGE).pdf) \ $(foreach PAGE,$(wordlist 1,$(PAGES_R_$(1)),$(ENUMERATION)),$(REFERENCE)s-pages/test-$(1)-p$(PAGE).pdf) ref_page_count=$(PAGES_R_$(1)); \ tst_page_count=$(PAGES_T_$(1)); \ if [ $$$$ref_page_count -lt $$$$tst_page_count ]; then \ page_count=$$$$ref_page_count; \ echo "Test $(1) page $$$$tst_page_count: failed, nombre de pages plus petit dans la référence." >> $(GRTEST)s.log; \ elif [ $$$$ref_page_count -gt $$$$tst_page_count ]; then \ page_count=$$$$tst_page_count; \ echo "Test $(1) page $$$$ref_page_count: failed, nombre de pages plus grand dans la référence." >> $(GRTEST)s.log; \ else \ page_count=$$$$ref_page_count; \ fi; \ echo '
Dans les .gif l'image qui clignote en « 120 allumé/40 éteint » est la référence, l'image qui est fixe est le nouvel état.
">> $@ printf "