# ---------------------------------------------------------------------------- #
## \file LaTeXmakefile.mk
## \author Sebastien Beaugrand
## \sa http://beaugrand.chez.com/
## \copyright CeCILL 2.1 Free Software license
# ---------------------------------------------------------------------------- #
#
# Utilisation :
#
# - mettre dans un Makefile, par exemple :
#
# PROJET=p1
# include ../LaTeXmakefile.mk
#
# - generer les dependances avec "make dep"
#
# - compiler le projet avec "make p1"
#
# - compiler les sections modifiees avec "make"
#
# Les sections sont donc dans des fichiers separes (par exemple src/s1.tex)
# et leurs compilations separees se font avec d'autres fichiers dont le nom
# commence par sec/section-.
# Par exemple sec/section-s1.tex pourrait ressembler a :
#
# \documentclass{section}
# \begin{document}
# \input s1
# \end{document}
#
# Et le fichier du projet pourrait ressembler a :
#
# \documentclass{livret}
# \begin{document}
# \input s1
# \newpage
# \input s2
# \newpage
# \input s3
# \end{document}
#
# Remarque : ces exemples sont adaptes a la production de livrets A5 sans
# changement d'echelle. (Utilisation du fichier livret.cls et "pdfbook".)
#
# Si une dependance est modifiee (ajout ou suppression d'un \input,
# \includegraphics de pdf, ou \verbatiminput), les regenerer avec "make dep".
# Ne regenerer qu'un seul fichier de dependance :
# make dep DEP=dep/src/s1.dep
# make dep DEP=dep/sec/section-s1.tex
#
# - verifier l'orthographe avec "make spell"
#
# Ceci fonctionne pour tous les fichiers ayant un fichier .dic correspondant
# dans le repertoire dic. Pour ajouter une verification sur un nouveau fichier,
# faire par exemple "touch dic/s1.dic && touch src/s1.tex". Normalement les
# fichiers sec/section-*.tex n'ont pas besoin de fichiers .dic associes.
#
# - produire un extrait  : make pdf/extrait-<pdf> P=2,3,4,1
#
# - produire un livret   : make pdf/livret-<pdf>
#
# - produire un portrait : make pdf/portrait-<pdf>
#
# ---------------------------------------------------------------------------- #
PDFDIR  = pdf
SRCDIR  = src/
SECDIR  = sec/
MAKEDOC = @pdflatex --halt-on-error -output-directory $(PDFDIR) $<
PURGE   = @$(RM) -f $(PDFDIR)/*.aux $(PDFDIR)/*.log $(SRCDIR)*~ $(SECDIR)*~
DEP = $(patsubst %.tex,dep/%.dep,$(wildcard */*.tex))
OBJ = $(patsubst $(SECDIR)%.tex,$(PDFDIR)/%.pdf,\
      $(wildcard $(SECDIR)section-*.tex))
DIC = $(wildcard dic/*.dic)

.SUFFIXES:

.PHONY: all
all: $(PDFDIR) $(OBJ)
    $(PURGE)

$(PDFDIR) dep/$(SRCDIR) dep/$(SECDIR) dic:
    @mkdir -p $@

$(OBJ): $(PDFDIR)/section-%.pdf: $(SECDIR)section-%.tex
    $(MAKEDOC)

.PHONY: $(PROJET)
$(PROJET): $(PDFDIR) $(PDFDIR)/$(PROJET).pdf

$(PDFDIR)/$(PROJET).pdf: $(SRCDIR)$(PROJET).tex
    $(MAKEDOC)
    $(PURGE)

.PHONY: spell
spell: dic $(DIC)
    $(PURGE)

$(DIC): dic/%.dic: $(SRCDIR)%.tex
    aspell -d francais -p ./$@ -t -c $<
    @touch $@

$(PDFDIR)/livret-%.pdf: $(PDFDIR)/%.pdf
    pdfxup -b -kbb -ow -o $@ $< >/dev/null
$(PDFDIR)/portrait-%.pdf: $(PDFDIR)/livret-%.pdf
    pdfjam --angle 90 -q -o $@ $<
$(PDFDIR)/extrait-%.pdf: $(PDFDIR)/%.pdf
    pdfjam -q -o $@ $< $(P)

define dependances-courantes
    deps=`sed \
    -e 's/^.*: //' \
    -e '/^[^ ]* $$/d' \
    -e '/^section-.*/d' $1`
endef
define dependances-uniques
    sed 's/ /\n/g' $1 | sed -n '1p' >$1.tmp; \
    sed 's/ /\n/g' $1 | sed -e '1d' -e '/^$$/d' | \
    sort | uniq >>$1.tmp; \
    cat $1.tmp | tr '\n' ' ' >$1; \
    echo >>$1; \
    $(RM) $1.tmp
endef
define dependances-vers-les-autres
    $(call dependances-courantes,$1); \
    if [ -n "$$deps" ]; then \
        cible=`echo $1 | sed \
        -e 's@dep/\(.*\)\.dep@\1.tex@'`; \
        for f in `ls dep/*/*.dep`; do \
            if [ $$f != $1 ]; then \
                sed -i "s@ $$cible @ $$deps@" $$f; \
                $(call dependances-uniques,$$f); \
            fi; \
        done; \
    fi
endef
define dependances-depuis-les-autres
    for f in `ls dep/*/*.dep`; do \
        if [ $$f != $1 ]; then \
            $(call dependances-courantes,$$f); \
            if [ -n "$$deps" ]; then \
                cible=`echo $$f | sed \
                -e 's@dep/\(.*\)\.dep@\1.tex@'`; \
                sed -i "s@ $$cible @ $$deps@" $1; \
            fi; \
        fi; \
    done; \
    $(call dependances-uniques,$1)
endef
define dependances
    name=`echo $1 | sed 's@dep/\(.*\)\.dep@\1@'`; \
    echo -n  "$(PDFDIR)/`basename $1 .dep`.pdf: $$name.tex " \
    >dep/$$name.dep; \
    sed \
    -e 's/\\%/PourCent/g' \
    -e 's/%.*//' \
    -e 's/PourCent/\\%/g' $$name.tex | \
    grep -e '\\input' -e '\\includegraphics' -e '\\verbatiminput' | \
    tr '\n' ' ' | \
    sed 's/\\input[{ ]*\([^} ]*\)/\n\1.tex\n/g' | \
    sed 's/\\includegraphics[{ ]*\([^} ]*\)/\n\1.pdf\n/g' | \
    sed 's/\\verbatiminput[{ ]*\([^} ]*\)/\n\1.sh\n/g' | \
    grep -e '.tex' -e '.pdf' -e '.sh' | \
    sed \
    -e 's/\.tex\.tex/.tex/g' \
    -e 's/\.pdf\.pdf/.pdf/g' \
    -e 's/\.sh\.sh/.sh/g' | \
    tr '\n' ' ' >>dep/$$name.dep; \
    echo >>dep/$$name.dep; \
    $(call dependances-vers-les-autres,dep/$$name.dep); \
    $(call dependances-depuis-les-autres,dep/$$name.dep)
endef

.PHONY: dep
dep:
    @for file in $(DEP); do \
        if [ -f $$file ]; then \
            mv $$file $$file.bak; \
        fi; \
    done
    @for file in $(DEP); do \
        $(call dependances,$$file); \
        echo -n "Dependances de "; cat $$file; \
    done
    @for file in `find . -name "*.dep" -print`; do \
        if diff $$file.bak $$file >/dev/null 2>&1; then \
            mv $$file.bak $$file; \
        fi; \
    done
-include $(wildcard dep/*/*.dep)

dep: dep/$(SRCDIR) dep/$(SECDIR)

$(OBJ) $(PDFDIR)/$(PROJET).pdf: $(MAKEFILE_LIST)