# $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
# 
define txt_files
ChangeLog Makefile.1 license.texi $(subst -$(default_language),,NEWS-$(1) README-$(1)) ltx-help.el
endef

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) $(subst Makefile.1,Makefile,$(file));) \
cd $(3);
endef

# Distribution per language.
define lang_template
.PHONY: dist-$(1)
dist-$(1): updated-$(1)
	@uncommited=`svn status $$(call dist_output,$(1)) $$(call txt_files,$(1))`; \
	echo -n "$$$$uncommited"; \
	if [ -n "$$$$uncommited" -a -z "$(DIST_FORCE)" ]; \
	then \
		echo ""; \
		echo "There are uncommited changes."; \
		echo "Commit them before making the distribution zip..."; \
		echo "or make again with DIST_FORCE=1."; \
		exit 2; \
	fi
	@echo ""
	rm -fr $(dist-$(1))
	$$(call make_dist_dir,$(dist-$(1)),$(1),..,$$(call txt_files,$(1)))
	-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
	@uncommited=`svn status $(foreach lang,$(languages),$(call dist_output,$(lang)) $(call txt_files,$(lang)))`; \
	echo -n "$$uncommited"; \
	if [ -n "$$uncommited" -a -z "$(DIST_FORCE)" ]; \
	then \
		echo ""; \
		echo "There are uncommited changes."; \
		echo "Commit them before making the distribution zip..."; \
		echo "or make again with DIST_FORCE=1."; \
		exit 2; \
	fi
	@echo ""
	rm -fr $(dist)
	$(call make_dist_dir,$(dist),$(default_language),..,$(call txt_files,$(default_language)))
	$(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 $(foreach lang,$(languages),$(call txt_files,$(lang))) $(patsubst %,aspell.%.pws,$(languages)) *.texi

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