# 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/>.

# this Makefile uses a flat directory structure for demonstration
# purposes; the main directory (../..) contains a slightly more
# modular organization.

PARSER = ldp
LEXER = ldl
MANUAL = ldman

LD_CORE_PREREQS = ${SPLINT_XTEXSTYLES} ${SPLINT_XTABLES}
LD_DOC_PREREQS_STATIC = ldunion.sty ldtexlex.sty ldint.sty ltokenset.sty lstokenset.sty
LD_DOC_PREREQS_GEN = ldptab.tex ldltab.tex ld_small_tab.tex ld_small_dfa.tex ${PARSER}.tok ldsetup.sty
LD_DOC_PREREQS_XREF = ${LD_CORE_PREREQS} %.sty ${LD_DOC_PREREQS_STATIC} %.tex ${LD_DOC_PREREQS_GEN} %.scn %.idx
LD_DOC_PREREQS_XREF += ldfrontmatter.sty

include ../../makefile.inc
include ${SPLINT_ROOT}makefile.loc

# rules specific to this example

ptabout:        ${SPLINT_ROOT}cweb/mkeparser.c ${PARSER}.c
               ${CC} ${BISON_STATE} -DPARSER_FILE=\"../examples/ld/$(lastword $^)\" -DYYPARSE_PARAMETERS= -o $@ $<

ldptab.tex:     ptabout
               $< --optimize-actions --optimize-tables $@

ltabout:        ${SPLINT_ROOT}cweb/mkscanner.c ldl_states.h ${LEXER}.c
               ${CC} -DLEXER_FILE=\"../examples/ld/$(lastword $^)\" -o $@ $<

ldltab.tex:     ltabout
               $< --optimize-actions --optimize-tables $@

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

${PARSER}.yy :  ldgram.x
               @${CTANGLE} $<

${LEXER}.ll:    ldlex.x
               @${CTANGLE} $<

${MANUAL}.stx \
ldsetup.stx:    ${MANUAL}.x ldgram.x ldlex.x ldlexo.x ldgramo.x ldnp.x ldexample_l.hx ldexample_t.hx alphas.hx
               @${CTANGLE} $<

# term name parser for ld grammar

ldsmallp_out:   ${SPLINT_ROOT}cweb/mkeparser.c ld_small_parser.c
               ${CC} ${BISON_STATE} -DPARSER_FILE=\"../examples/ld/$(lastword $^)\" -DYYPARSE_PARAMETERS= -o $@ $<

ldsmalll_out:   ${SPLINT_ROOT}cweb/mkscanner.c ld_small_lexer.c
               ${CC} -DLEXER_FILE=\"../examples/ld/$(lastword $^)\" -o $@ $<

ld_small_tab.tex:       ldsmallp_out
                       $< --optimize-actions --optimize-tables $@

ld_small_dfa.tex:       ldsmalll_out
                       $< --optimize-actions --optimize-tables $@

ld_small_parser.yy \
ld_small_lexer.ll:      ldnp.x
                       @${CTANGLE} $<

# numeric parser for ld grammar

ldnump_out:     ${SPLINT_ROOT}cweb/mkeparser.c ld_num_parser.c
               ${CC} ${BISON_STATE} -DPARSER_FILE=\"../examples/ld/$(lastword $^)\" -DYYPARSE_PARAMETERS= -o $@ $<

ldnuml_out:     ${SPLINT_ROOT}cweb/mkscanner.c ld_num_lexer.c
               ${CC} -DLEXER_FILE=\"../examples/ld/$(lastword $^)\" -o $@ $<

ld_num_tab.tex: ldnump_out
                       $< --optimize-actions --optimize-tables $@

ld_num_dfa.tex: ldnuml_out
                       $< --optimize-actions --optimize-tables $@

ld_num_parser.yy \
ld_num_lexer.ll:        ldnump.x
                       @${CTANGLE} $<

ldexample_%.hx: ldexample.hw
               echo $(patsubst ldexample_%.hx, "@G(%)", $@) >> $(patsubst %.hx, %.hy, $@)
               cat $< >> $(patsubst %.hx, %.hy, $@)
               echo "@g" >> $(patsubst %.hx, %.hy, $@)
               ${BRACK} $(patsubst %.hx, %.hy, $@) $@

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

${MANUAL}.tex:  ${MANUAL}.x ldgram.x ldlex.x ldlexo.x ldgramo.x ldnp.x ldexample_l.hx ldexample_t.hx alphas.hx
               @echo "Preparing the ${MANUAL}.tex file ..."
               -${CWEAVE} $<

${MANUAL}.sty \
ldsetup.sty:%.sty:      %.stx
                       ${UNLINE} $< $@

${MANUAL}.gdx: %.gdx:   ${LD_DOC_PREREQS_XREF} ${PARSER}.tok
                       @echo "Making the bison and TeX indices ..."
                       ${TEX} $*.tex

%.gdy:          %.gdx

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

${MANUAL}.pdf: %.pdf:   ${LD_DOC_PREREQS_XREF} %.gdy %.aux
                       ${PDFTEX} $*.tex && touch $*.gdy && touch $*.pdf

${PARSER}.tok:  ldgram.tex ${MANUAL}.sty ${LD_CORE_PREREQS}
               ${TEX} ${MODEBOOTSTRAP} \\input $<

ldl_states.h:   ldlex.tex ${MANUAL}.sty ${LD_CORE_PREREQS}
               ${TEX} ${MODEBOOTSTRAP} \\input $<

ldgram.tex ldlex.tex: \
%.tex:          %.x
               @echo "Building ldgram.tex and ldlex.tex."
               -${CWEAVE} -x $*.x

docs:           ${MANUAL}.pdf

install:        docs
               @cp ${LD_DOC_PREREQS_STATIC} ${SPLINT_INSTALL_DIR}/tex/
               @cp ${LD_DOC_PREREQS_GEN} ${SPLINT_INSTALL_DIR}/cweb/

uninstall:
               @rm -f $(patsubst %, ${SPLINT_INSTALL_DIR}/tex/%, ${LD_DOC_PREREQS_STATIC})
               @rm -f $(patsubst %, ${SPLINT_INSTALL_DIR}/cweb/%, ${LD_DOC_PREREQS_GEN})

mostlyclean:    clean_temp
               -rm -f ptabout ltabout ldsmalll_out ldsmallp_out ldnump_out ldnuml_out ${MANUAL}.c

clean:          clean_core
               -rm -f ptabout ltabout ldsmalll_out ldsmallp_out ldnump_out ldnuml_out *.stx \
               ldman.sty ldsetup.sty

distclean:      clean
               cd ${SPLINT_ROOT} && ${MAKE} clean