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 '
  • Test $(1) : ' >> $(GRTEST_DIFF)/success-toc.html; \ echo '
  • Test $(1) : ' >> $(GRTEST_DIFF)/failed-toc.html; \ declare -i success=0; \ declare -i failed=0; \ for ((w=1; $$$$w <= $$$$page_count; ++w )); do \ stats=$$$$("$(MAGICK_HOME)magick" compare -metric MAE $(GRTEST)s/test-$(1)-p$$$$w.pdf $(REFERENCE)s-pages/test-$(1)-p$$$$w.pdf null: 2>&1); \ if [ "$$$$stats" == "0 (0)" ]; then \ echo "Test $(1) page $$$$w: ok" >> $(GRTEST)s.log; \ if [ $$$$success -eq 0 ]; then echo '
  • ' >> $(GRTEST_DIFF)/success-toc.html ; fi \ endef # Dans le .gif l'image qui clignote 120on/40off est la référence, l'image qui est fixe est le nouvel état. define MAKE_GRDIFF_3 $(GRTEST_DIFF)/test-$(1)-p$(2).gif: $(GRTEST)s/test-$(1)-p$(2).pdf $(REFERENCE)s-pages/test-$(1)-p$(2).pdf $(GRTEST_DIFF)/grtests-diff.html "$(MAGICK_HOME)magick" convert -delay 40 -fill red -opaque black $(GRTEST)s/test-$(1)-p$(2).pdf -delay 120 \ -fill green -opaque black $(REFERENCE)s-pages/test-$(1)-p$(2).pdf -loop 0 $$@ if [ $(2) -eq 1 ]; then echo '

    Test $(1)

    ' >> $(GRTEST_DIFF)/grtests-diff.html; fi echo '

    Test $(1) page $(2)/$(PAGES_R_$(1))

    ' >> $(GRTEST_DIFF)/failed-body.html echo '

    ' >> $(GRTEST_DIFF)/failed-body.html echo '
    ' >> $(GRTEST_DIFF)/failed-body.html echo '
  • Test $(1) page $(2)/$(PAGES_R_$(1))
  • ' >> $(GRTEST_DIFF)/failed-toc.html endef $(eval $(foreach TEST,$(TESTS),$(call MAKE_GRDIFF,$(TEST)))) $(GRTEST_DIFF)/grtests-diff.html: $(GRTEST_DIFF)/.dir $(REFERENCE)s/number-of-pages.mak ifeq ($(PAGES_KNOWN),1) echo '' > $@ echo '' >> $@ echo "">> $@ echo "

    Avant propos

    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 "

    Table des matières des tests en échec

    \n

    Liste des tests en succès

    \n" >> $(GRTEST_DIFF)/grtests-diff.html cat $(GRTEST_DIFF)/failed-body.html >> $(GRTEST_DIFF)/grtests-diff.html rm $(GRTEST_DIFF)/failed-body.html echo "" >> $(GRTEST_DIFF)/grtests-diff.html @echo $(DASHES) @echo '== End target grtests' @echo $(DASHES) .PHONY: styfiles styfiles: $(addprefix $(PDFTEST)s/,$(STYFILES) $(LOGOS) $(MAINSRC)) $(addprefix $(PDFTEST)s/,$(STYFILES_PLAIN)):$(PDFTEST)s/%:$(TEXDIR)/% $(PDFTEST)s/.dir cp -u $< -T $@ $(addprefix $(PDFTEST)s/,$(MAINSRC)):$(PDFTEST)s/%:$(DOCDIR)/% $(PDFTEST)s/.dir cp -u $< -T $@ $(addprefix $(PDFTEST)s/,$(STYFILES_INDOC)):$(PDFTEST)s/%:$(TEXDIR)/% $(DOCDIR)/version.m4 $(PDFTEST)s/.dir m4 $(DOCDIR)/version.m4 $< > $@ $(addprefix $(PDFTEST)s/,$(LOGOS)):$(PDFTEST)s/%:$(DOCDIR)/% $(PDFTEST)s/.dir cp -uT $< $@ $(addprefix $(DOCDIR)/,$(SCRIPTOUT_SRC)):%.tex:$(DOCDIR)/lettre-script.tex $(MAKE) -C $(DOCDIR) $(notdir $@) MAKELEVELBASE=$(MAKELEVELBASE_P1) $(DOCDIR)/lettre-path.tex: $(DOCDIR)/version.m4 $(MAKE) -C $(DOCDIR) $(notdir $@) MAKELEVELBASE=$(MAKELEVELBASE_P1) $(DOCDIR)/version.m4: $(DOCDIR)/release-notes $(MAKE) -C $(DOCDIR) version.m4 $(patsubst %,test-%.tex,$(EXAMPLES)):test-%.tex:$(DOCDIR)/%.tex echo "\input{../$(DOCDIR)/$*.tex}" > $@ define MAKE_DIFF .PHONY: diff-$(1) diff-$(1): $(PDFTEST)s/test-$(1).txt $(REFERENCE)s-text/test-$(1).txt diff -abs $(PDFTEST)s/test-$(1).txt $(REFERENCE)s-text/test-$(1).txt endef $(foreach TEST,$(TESTS),$(eval $(call MAKE_DIFF,$(TEST)))) .PHONY: realclean realclean: echo $(SUBDIR) $(patsubst %,test-%.tex,$(EXAMPLES)) \ | xargs rm -fr .PHONY: test_get_institut_awk test_get_institut_awk: # REDOCDIR=$(REDOCDIR). # GET_INSTITUT_AWK=$(GET_INSTITUT_AWK). @echo "$(shell awk '$(GET_INSTITUT_AWK)' $(patsubst %,test-%.tex, $(LOCAL_TESTS)) $(patsubst %,$(DOCDIR)/%.tex, $(EXAMPLES)))" @echo "INSTITUT_anglais:=$(INSTITUT_anglais)---lettre-juillerat.cfg." @echo "INSTITUT_testfaxf:=$(INSTITUT_testfaxf)---lettre-obs.cfg." @echo "INSTITUT_letex1:=$(INSTITUT_letex1)---." .PHONY: help help: @echo 'make realclean : Nettoyage complet avant essais avec toutes les passes' @echo 'make realclean ONE_PASS=1 : Nettoyage complet avant essais avec une seule passe' @echo 'make all : Tous les tests avec toutes les passes' @echo 'make all ONE_PASS=1 : Tous les tests avec une seule passe' @echo 'make all ONE_PASS=1 \ ' @echo ' "TESTS=anglais 1" : Seulement les tests "anglais" et "1", et avec une seule passe' @echo 'make all "TESTS=marge 1" : Seulement les tests "marge" et "1", et avec toutes les passes' @echo "Liste des tests : $(TESTS)" # Contrôle de cohérence # ====================================================================== ifeq ($(ONE_PASS),1) else ifndef ONE_PASS else $(error ONE_PASS invalide) endif endif