# 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
