[latexrefman-discuss] Makefile upgrade

Vincent Belaïche vincent.belaiche at domain.hid
Thu Apr 7 11:38:01 CEST 2016


Dear all,

As this is a big change, and it concerns all the languages, so I prefer
to submit it to discussion prior to comitting the change.

Changes
~~~~~~~

The changes are as follows, where xx denotes the language, ie is a two
letter word in {en,fr,es}:

- make it futureproof w.r.t. to new languages addition.

- make it safer:
  - test for uncommitted changes before preparing distribution zip
  - automate @set UPDATED flag before preparing distribution zip

- add target dist-xx, to prepare distribution for language xx only, this
  triggers automatic update of @set UPDATED flag for the corresponding
  language

- modify spell and spell-en target so as to support all languages. I had
  to add custom dicitionnary for fr and es. spell will check all the
  languages, use spell-en for English only. My aspell seems to be too
  old to support --mode=texinfo, so I could not test it.

- modify target dist so that french is added to the zip file. Please
  note that dist will not trigger automatic update of the @set UPDATED
  flag, before Makefile cannot know which manual has been updated and
  which not. This will also make the uncommitted check.
  
- add target updated-date-xx to automatically update @set UPDATED flag
  in the xx manual
  
- add target updated-xx to do updated-date-xx + rebuild all outputs for
  xx

- add target tag to make a tag, you can use this as follows for default
  CTAN tag (which is `ctanYYYY-MM-DDTHH:mm:SS', where
  YYYY-MM-DDTHH:mm:SS is an ISO time stamp):

     make tag


  or you can do this for make tag `foo' with message `Some message':

     make tag TAG=foo "MESSAGE=Some message"


Discussion
~~~~~~~~~~

Hopefully Karl you don't mind that I made so many changes. To distribute
English only just use target `dist-en', the zip file will be named
latex2e-help-texinfo-en.zip instead of latex2e-help-texinfo.zip. If you
use target `dist' the zip file will be named latex2e-help-texinfo.zip
and will contain all the languages.

For the @set UPDATED flag, I had to do custom awk scripts to format the
date, because setting LC_TIME=fr and relying on the date shell command,
or on the AWK time formatting commands does not work for me. I presume
that this is due to how I have installed coreutils over MSYS. It seemed
simpler and more portable to me to do this hack. However I don't find
that sort of solution where you `re-invent the wheel' statisfactory. On
second thought what would be best is that Texinfo would support some
date parsing/formatting. Then the Texinfo source code could be as
follows:

@parsetime{svn,$Date: 2016-04-02 17:46:27 +0200 (Sat, 02 Apr 2016) $,updated}
@set UPDATED @formattime{%B %Y,updated}

@parsetime would have 3 arguments:

- arg 1 = format of time stamp to be parsed, svn  for SVN date time stamp.

- arg 2 = time stamp

- arg 3 = optional time stamp object, if omitted defaults to `now'

@formattime would have 3 arguments:

- arg 1 = *nixy like date/time format specifier

- arg 2 = optional time stamp object, if omitted defaults to `now'

at startup time stamp object now would be initialized with TeX
year/month/day counters.

Locale in use for specifiers like %B would be that derived from
@documentlanguage.

I am pretty sure that the above would be quite usefull to many other
manuals, not only latexrefman. If you, Karl, like it, I can file the
proposal to the Texinfo page, and provide some patch to the texinfo.tex,
after getting Patrice's opinion and whether he volunteers to do it on
the perl side.

VBR,
	Vincent Belaïche 









-------------- next part --------------
# $Id: Makefile 466 2015-10-27 11:31:20Z jhefferon $
# Public domain.  Originally written 2006, Karl Berry.
# Makefile for latexrefman.

# Adding a new langage xx (for instance xx is ru for Russian) is as
# follows:
#  1) add xx to the list in other_languages
#  2) add definition of xx_longname, for instance if xx is ru,
#  xx_longname:=russian
#  3) add definition of xx_updated_awk, script for formatting @set
#     UPDATED tag.

manual=latex2e
default_language=en
other_languages=fr es
languages=$(default_language) $(other_languages)

#
xref_suffixes := ky cp vr fn cp pg tp
xref_suffixes := $(xref_suffixes) $(addsuffix s,$(xref_suffixes))
xref_suffixes := aux log toc $(xref_suffixes)
tex_suffixes = dvi pdf
makeinfo_suffixes = dbk html info txt xml
en_longname:=english
es_longname:=spanish
fr_longname:=french

define lang_template
dist-$(1):=$(manual)-help-texinfo-$(1)
$(1)_manual:=$$(subst -$(default_language),,$(manual)-$(1))
$(1)_tex_output := $$(addprefix $$($(1)_manual).,$(tex_suffixes))
$(1)_makeinfo_output := $$(addprefix $$($(1)_manual).,$(makeinfo_suffixes))
$(1)_output := $$($(1)_tex_output) $$($(1)_makeinfo_output)
tex_output+= $$($(1)_tex_output)
makeinfo_output+= $$($(1)_makeinfo_output)
endef
$(foreach lang,$(languages), $(eval $(call lang_template,$(lang))))

#
all_suffixes = dvi pdf $(makeinfo_suffixes)


# 
 how to build.
# 
texi2dvi = texi2dvi --batch --tidy --build-dir=$*.t2dvi
texi2pdf = texi2pdf --batch --tidy --build-dir=$*.t2pdf
#
makeinfo = makeinfo
texi2docbook = $(makeinfo) --docbook
texi2html = $(makeinfo) --html --no-split $(texi2html_top)
texi2info = $(makeinfo) --no-split
texi2txt = $(makeinfo) --plaintext --no-split
texi2xml = $(makeinfo) --xml
#
# Go somewhere useful from Top.
texi2html_top = -c TOP_NODE_UP_URL=http://tug.org/texinfohtml/

%.pdf: %.texi
	$(texi2pdf) $<
%.dvi: %.texi
	$(texi2dvi) $<
#
%.dbk: %.texi
	$(texi2docbook) -o $@ $<
%.html: %.texi
	$(texi2html) $<

%/index.html: %.texi
	$(makeinfo) --html $(texi2html_top) $<

%.info: %.texi
	$(texi2info) $<
%.txt: %.texi
	$(texi2txt) -o $@ $<
%.xml: %.texi
	$(texi2xml) $<


# 
 targets follow.
#
default: check-en

# to test changes, build a subset: html and info (since these formats
# exercise significantly different code paths), and pdf for tex.
check_suffixes = html info pdf
#
.PHONY: check
check: $(addprefix check-,$(languages))
define lang_template
.PHONY:check-$(1)
check-$(1): spell-$(lang) $(addprefix $($(1)_manual), $(check_suffixes))
endef
$(foreach lang,$(languages), $(eval $(call lang_template,$(lang))))



# Build per language.
define lang_template
.PHONY: $(1)
$(1): $($(lang)_output)
endef
$(foreach lang,$(languages), $(eval $(call lang_template,$(lang))))


# Build per language with UPDATED flag refresh setttig LC_TIME to fr
# or es does not change the format %B under MSYS, neither with awk
# time function, nor with date bash command. This is why we emulate
# this.
define fr_updated_awk
function updated(){\
  monthes[1]="Janvier";\
  monthes[2]="Février";\
  monthes[3]="Mars";\
  monthes[4]="Avril";\
  monthes[5]="Mai";\
  monthes[6]="Juin";\
  monthes[7]="Juillet";\
  monthes[8]="Août";\
  monthes[9]="Septembre";\
  monthes[10]="Octobre";\
  monthes[11]="Novembre";\
  monthes[12]="Décembre";\
  return monthes[month] " " year;\
}
endef
define en_updated_awk
function updated(){\
  return strftime("%B %Y",time_stamp);\
}
endef
define es_updated_awk
function updated(){\
  monthes[1] = "Enero";\
  monthes[2] = "Febrero";\
  monthes[3] = "Marzo";\
  monthes[4] = "Abril";\
  monthes[5] = "Mayo";\
  monthes[6] = "Junio";\
  monthes[7] = "Julio";\
  monthes[8] = "Agosto";\
  monthes[09] = "Septiembre";\
  monthes[10] = "Octubre";\
  monthes[11] = "Noviembre";\
  monthes[12] = "Diciembre";\
  return monthes[month] " " year;\
}
endef
define set_updated_awk
$($(1)_updated_awk);\
BEGIN { time_stamp=systime();\
	year=strftime("%Y",time_stamp);\
	month=strftime("%m",time_stamp) + 0;\
      };\
/^ *@set +UPDATED/ { the_func="updated_" lang;\
                     $$$$0="@set UPDATED " updated();};\
                   { print}
endef
define lang_template
.PHONY: updated-$(1)
updated-date-$(1):
	LC_TIME=C; \
	awk -v lang=$(1) '$(call set_updated_awk,$(1))' $($(1)_manual).texi > temp.texi; \
	if diff $($(1)_manual).texi  temp.texi > /dev/null; then \
		rm temp.texi; \
	else \
		mv temp.texi $($(1)_manual).texi; \
	fi

updated-$(1): updated-date-$(1)
	$$(MAKE) $(1)
endef
$(foreach lang,$(languages), $(eval $(call lang_template,$(lang))))


# To build everything in all languages.
.PHONY: all
all: $(languages)

# following the GNU sequence of clean targets.
.PHONY: distclean clean mostlyclean
distclean clean mostlyclean:
	rm -rf $(manual)*.t2*

.PHONY: realclean maintainer-clean
realclean maintainer-clean: distclean
	rm -f $(addprefix $(manual)*., $(tex_suffixes) $(makeinfo_suffixes) $(xref_suffixes))
	rm -fr $(foreach lang,$(addprefix dist-,$(languages)),$($(lang)) $($(lang)).zip)
	rm -fr $(manual)-help-texinfo $(manual)-help-texinfo.zip


# 
 dist for CTAN.  Also update NEWS
# 
txt_files = ChangeLog Makefile NEWS README ltx-help.el

define dist_output
$($(1)_makeinfo_output) $(addprefix $($(1)_manual).,pdf texi) aspell.$(1).pws
endef

define make_dist_dir
mkdir -p $(1); \
cd $(1); \
$(foreach file,$(call dist_output,$(2)) $(4), \
	ln -s $(3)/$(file) $(file);) \
cd $(3);
endef

# Distribution per language.
define lang_template
.PHONY: dist-$(1)
dist-$(1): updated-$(1)
	@if svn status $(call dist_output,$(1)) $(txt_files) \
		&& test -z "$(DIST_FORCE)"; \
	then \
		echo "There are uncommited changes."; \
		echo "Commit them before making the distribution zip..."; \
		echo "or make again with DIST_FORCE=1."; \
		exit 2; \
	fi
	rm -fr $(dist-$(1))
	$(call make_dist_dir,$(dist-$(1)),$(1),..,$(txt_files))
	-zip -qr $(dist-$(1)).zip $(dist-$(1)) 
	rm -fr $(dist-$(1))
	@ls -l $(dist-$(1)).zip; unzip -t $(dist-$(1)).zip
endef
$(foreach lang,$(languages), $(eval $(call lang_template,$(lang))))



dist = $(manual)-help-texinfo
#
.PHONY: dist
dist: all
	@if svn status $(foreach lang,$(languages),$(call dist_output,$(lang))) $(txt_files) \
		&& test -z "$(DIST_FORCE)"; \
	then \
		echo "There are uncommited changes."; \
		echo "Commit them before making the distribution zip..."; \
		echo "or make again with DIST_FORCE=1."; \
		exit 2; \
	fi
	rm -fr $(dist)
	$(call make_dist_dir,$(dist),$(default_language),..,$(txt_files))
	$(foreach lang,$(other_languages), \
		$(call make_dist_dir,$(dist)/$($(lang)_longname),$(lang),../..,))
	-zip -qr $(dist).zip $(dist)
	rm -fr $(dist)
	@ls -l $(dist).zip; unzip -t $(dist)



# A hacky spell check target.
# Remove \commandnames to reduce exception list, but not {args} or
# [args], since they are often words.
.PHONY: spell
spell: $(addprefix spell-,$(languages))
define lang_template
.PHONY: spell-$(1)
spell-$(1):
	sed -e 's/\\[a-zA-z]*//g' $($(1)_manual).texi \
	| aspell list --mode=texinfo --add-extra-dicts=`pwd`/aspell.$(1).pws \
        | sort -f -u
endef
$(foreach lang,$(languages), $(eval $(call lang_template,$(lang))))

# Check for doubled words.
# http://www.math.utah.edu/~beebe/software/file-tools.html#dw
check-dw:
	grep -v '^@item' $(manual).texi | dw

# Convenience target to tag a delivery to CTAN
GNA_USERID&=vincentb1
TAG?=ctan$(VERSION)
MESSAGE?=Delivery to CTAN $(VERSION)
CTANTAG?=svn copy svn+ssh://$(GNA_USERID)@svn.gna.org/svn/latexrefman/trunk svn+ssh://$(GNA_USERID)@svn.gna.org/svn/latexrefman/tags/$(TAG) -m "$(MESSAGE)"
.PHONY: tag
tag:
ifeq ($(GNA_USERID),)
	echo 'Please define GNA_USERID variable in your environment to your GNA! user id'
	exit -1
else ifeq ($(TAG),ctan)
	@if test -z '$(GNA_USERID)'; then \
		echo 'Please define GNA_USERID variable in your environment to your GNA! user id'; \
		exit -1; \
	else \
		$(MAKE) $@ "VERSION=$(shell date '+%Y-%m-%dT%T')"; \
	fi
else
	@echo 'Will you run the following command:'
	@echo '$(CTANTAG)'
	@select w in yes no; \
	do \
		case $$w in \
			yes) \
				$(CTANTAG); \
				break;; \
			no) \
				echo 'Cancelled'; \
				break;; \
		esac; \
	done
endif

# Convenience targets to svn revert the generated files,
# and svn diff the source files.
svr:
	svn revert $(addprefix $(manual)*., $(all_suffixes))
svd:
	svn diff $(txt_files) $(patsubst %,aspell.%.pws,$(languages)) *.texi

# Local Variables:
# coding: utf-8
# End:


More information about the latexrefman mailing list