# Copyright 2012-2024, Alexander Shibakov
# This file is part of SPLinT
#
# SPLinT is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# SPLinT is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with SPLinT.  If not, see <http://www.gnu.org/licenses/>.
docs:                           splint.pdf

include ../makefile.inc

tables:                         ${SPLINT_PTABLES} ${SPLINT_LTABLES}

bdout bbout bgout \
bfout:b%out:                    mkeparser.c b%.c
                               ${CC} ${BISON_STATE} -DPARSER_FILE=\"$(lastword $^)\" -DYYPARSE_PARAMETERS= -o $@ $<

bd.yy bg.yy \
bb.yy bf.yy:b%.yy:              bo.u bo.m
                               ${CTANGLE} $<

bd.yx bg.yx \
bb.yx bf.yx:%.yx:               %.yy
                               ${BRACK} --replace-only --bison-link=bo.m $*.yy $*.yx

bd.y bg.y \
bb.y bf.y:%.y:                  %.yx
                               cp -f $^ $@

byytab.tex gyytab.tex \
dyytab.tex fyytab.tex:\
%yytab.tex:                     b%out
                               ${SPLINT_DRIVER_DIR}/$< --optimize-actions $@

ltab.tex:                       ltout
                               ${SPLINT_DRIVER_DIR}/$< --optimize-actions $@

ltout:                          mkscanner.c lo_states.h lo.c
                               ${CC} -DLEXER_FILE=\"$(lastword $^)\" -o $@ $<

lo.ll: %.ll:                    %.x
                               ${CTANGLE} $< && rm $(patsubst %.x, %.c, $^)

fil.ll:                         so.x
                               ${CTANGLE} $< && rm $(patsubst %.x, %.c, $^)

fip.yy rep.yy rap.yy ddp.yy:    fo.x
                               ${CTANGLE} $< && rm $(patsubst %.x, %.c, $^)

# flex parser

fil.c:                          fil.l
                               ${FLEX} -o $@ $<

fil_out:                        mkscanner.c fil_states.h fil.c
                               ${CC} -DLEXER_FILE=\"$(lastword $^)\" -o $@ $<

filtab.tex:                     fil_out
                               ${SPLINT_DRIVER_DIR}/$< --optimize-actions --optimize-tables $@

# state parsing for the \flex\ input scanner

fil_states.h:                   so.tex ssfstab.tex ddptab.tex ${SPLINT_ROOT}tex/grabstates.sty
                               @echo "Generating state list for the flex lexer ..."
                               @${PDFTEX} $<

fip.c rep.c rap.c ddp.c:%.c:    %.y
                               ${BISON} -o $@ $<

fip_out rap_out \
ddp_out rep_out:%_out:          mkeparser.c %.c
                               ${CC} ${BISON_STATE} -DPARSER_FILE=\"$(lastword $^)\" -DYYPARSE_PARAMETERS= -o $@ $<

fiptab.tex raptab.tex \
ddptab.tex reptab.tex:%tab.tex: %_out
                               ${SPLINT_DRIVER_DIR}/$< --optimize-actions --optimize-tables $@

so.tex:                         so.x
                               ${CWEAVE} $<

fo.tex:                         fo.x
                               -${CWEAVE} $<

fo.tok:                         fo.tex ltab.tex dyytab.tex bo.tok
                               @echo "Generating token equivalences for flex input parser ..."
                               @${TEX} ${MODEBOOTSTRAP} \\input $<

lo.c:                           lo.l
                               ${FLEX} -o $@ $<

mkscanner.c mkeparser.c: \
%.c:                            %.w
                               ${CTANGLE} $<

# bootstrap flex parser

ssfs.ll:                        so.x
                               ${CTANGLE} $< && rm $(patsubst %.x, %.c, $^)

ssfs.c:                         ssfs.l
                               ${FLEX} -o $@ $<

ssfs_out:                       mkscanner.c ssfs.c
                               ${CC} -DLEXER_FILE=\"$(lastword $^)\" -o $@ $<

ssfstab.tex:                    ssfs_out
                               ${SPLINT_DRIVER_DIR}/$< --optimize-actions --optimize-tables $@

# name parser

smallp_out:                     mkeparser.c small_parser.c
                               ${CC} ${BISON_STATE} -DPARSER_FILE=\"$(lastword $^)\" -DYYPARSE_PARAMETERS= -o $@ $<

smalll_out:                     mkscanner.c small_lexer.c
                               ${CC} -DLEXER_FILE=\"$(lastword $^)\" -o $@ $<

small_tab.tex:                  smallp_out
                               ${SPLINT_DRIVER_DIR}/$< --optimize-actions $@

small_dfa.tex:                  smalll_out
                               ${SPLINT_DRIVER_DIR}/$< --optimize-actions $@

small_parser.yy \
small_lexer.ll:                 np.x
                               @${CTANGLE} $<

bo.tex:                         bo.x
                               -${CWEAVE} -x $< 1>/dev/null

splint.tex \
splint.idx \
splint.scn:                     splint.x bo.x lo.x fo.x so.x np.x common.w bs.w \
                               fk.w philosophy.w checklists.w references.w alphas.hx
                               -${CWEAVE} $< 1>/dev/null

alphas.hx:
                               @${MISCCW} --alpha-list --alpha-length=1 $@

bo.tok:                         bo.tex ltab.tex byytab.tex
                               @echo "Making token equivalence tables for the bison parser ..."
                               @${TEX} ${MODEBOOTSTRAP} \\input $< #1>/dev/null

splint.gdx splint.aux:          ${SPLINT_DOC_PREREQS_XREF}
                               @echo "Making the bison and TeX indices ..."
                               @${PDFTEX} splint.tex #1>/dev/null

# remove the implicit rule before building the main index

%.gdy:                          %.gdx

splint.gdy:                     splint.gdx
                               ${BINDX} --fine $^ $@

splint.pdf: %.pdf:              ${SPLINT_DOC_PREREQS_XREF} %.gdy %.aux
                               @echo "Generating SPLinT documentation (splint.pdf) ..."
                               while test "`diff --new-file splint.pdf /tmp/splint.pdf`"; do \
                                       echo "Files differ" && mv splint.pdf /tmp/; \
                                       ${PDFTEX} \\input $*.tex && touch $*.gdy && touch $*.pdf; \
                               done

splint.dvi: %.dvi:              ${SPLINT_DOC_PREREQS_XREF} %.gdy
                               @${TEX} $*.tex && touch $*.gdy && touch $*.dvi && rm $*.ftn

# state parsing

lo.tex:                         lo.x
                               ${CWEAVE} $<

lo_states.h:                    lo.tex ssfstab.tex ddptab.tex ${SPLINT_ROOT}tex/grabstates.sty
                               @echo "Generating state list for the bison lexer ..."
                               @${PDFTEX} $<

# clean will erase all automatically generated files in the current directory

clean:                          clean_core
                               -rm -f ctablesout b?out ltout smallp_out /tmp/splint.pdf \
                               smalll_out ssfs_out fil_out fip_out rep_out rap_out ddp_out

include ${SPLINT_ROOT}makefile.loc

# since bg.yy is not an intermediate file in examples/symbols/Makefile, repeated 'make all'
# remakes bg.yy thereby forcing make to update byytab.tex, etc., which results in remaking
# of bo.tok, lo.tex, eventually leading to remaking of splint.pdf;
# the special target below tells make to treat bg.yy as if it were not an intermediate file

PRECIOUS:                       %.yy bo.tok fo.tok %.ll b%.y splint.gdx

# the files below appear as targets but are really intermediaries for other files

INTERMEDIATE:                   smallp_out smalll_out ssfs_out ltout fil_out \
                               fip_out rep_out rap_out ddp_out splint.gdx