SRC=src
HOST=https://github.com
REPO=$(HOST)/libxml-raku/LibXML-raku
DocProj=libxml-raku.github.io
DocRepo=$(HOST)/libxml-raku/$(DocProj)
DocLinker=etc/resolve-links.raku
TEST_JOBS ?= 6

all : lib

lib : resources/libraries/libxml6.so

# 'all', with compilation warnings and debug symbols enabled
debug :
	make "DBG=-Wall -DDEBUG -g"  all

coverage :
	make "DBG=-fprofile-arcs -ftest-coverage" "LD_DBG=-coverage -lgcov" all

# compile against checked out libxml2 source (pre-built)
all-via-libxml2-src : ../libxml2/include
	raku Build.pm6 -I ../libxml2/include
	make clean
	make all
	raku Build.pm6;
	@echo "** Please set LD_LIBRARY_PATH to ../libxml2/.libs ***"

resources/libraries/libxml6.so : $(SRC)/dom.o $(SRC)/domXPath.o $(SRC)/xml6_parser_ctx.o $(SRC)/xml6_config.o $(SRC)/xml6_doc.o $(SRC)/xml6_entity.o $(SRC)/xml6_gbl.o $(SRC)/xml6_hash.o $(SRC)/xml6_input.o $(SRC)/xml6_node.o $(SRC)/xml6_notation.o  $(SRC)/xml6_ns.o $(SRC)/xml6_sax.o $(SRC)/xml6_ref.o $(SRC)/xml6_reader.o $(SRC)/xml6_xpath.o $(SRC)/xml6_error.o
	gcc -shared -fPIC -O3 -Lresources/libraries -o resources/libraries/libxml6.so \
        $(SRC)/dom.o  $(SRC)/domXPath.o $(SRC)/xml6_parser_ctx.o $(SRC)/xml6_config.o $(SRC)/xml6_doc.o $(SRC)/xml6_entity.o $(SRC)/xml6_gbl.o $(SRC)/xml6_hash.o $(SRC)/xml6_input.o $(SRC)/xml6_node.o  $(SRC)/xml6_notation.o $(SRC)/xml6_ns.o $(SRC)/xml6_sax.o $(SRC)/xml6_ref.o  $(SRC)/xml6_reader.o $(SRC)/xml6_xpath.o  $(SRC)/xml6_error.o \
        -lxml2 $(LD_DBG)

$(SRC)/dom.o : $(SRC)/dom.c $(SRC)/dom.h
	gcc -I $(SRC) -c -fPIC -fPIC -O3 -DNDEBUG --std=gnu99 -Wextra -Wall -o $(SRC)/dom.o $(SRC)/dom.c -I/usr/include/libxml2 $(DBG)

$(SRC)/domXPath.o : $(SRC)/domXPath.c $(SRC)/domXPath.h
	gcc -I $(SRC) -c -fPIC -fPIC -O3 -DNDEBUG --std=gnu99 -Wextra -Wall -o $(SRC)/domXPath.o $(SRC)/domXPath.c -I/usr/include/libxml2 $(DBG)

$(SRC)/xml6_parser_ctx.o : $(SRC)/xml6_parser_ctx.c $(SRC)/xml6_parser_ctx.h
	gcc -I $(SRC) -c -fPIC -fPIC -O3 -DNDEBUG --std=gnu99 -Wextra -Wall -o $(SRC)/xml6_parser_ctx.o $(SRC)/xml6_parser_ctx.c -I/usr/include/libxml2 $(DBG)

$(SRC)/xml6_config.o : $(SRC)/xml6_config.c $(SRC)/xml6_config.h
	gcc -I $(SRC) -c -fPIC -fPIC -O3 -DNDEBUG --std=gnu99 -Wextra -Wall -o $(SRC)/xml6_config.o $(SRC)/xml6_config.c -I/usr/include/libxml2 $(DBG)

$(SRC)/xml6_doc.o : $(SRC)/xml6_doc.c $(SRC)/xml6_doc.h
	gcc -I $(SRC) -c -fPIC -fPIC -O3 -DNDEBUG --std=gnu99 -Wextra -Wall -o $(SRC)/xml6_doc.o $(SRC)/xml6_doc.c -I/usr/include/libxml2 $(DBG)

$(SRC)/xml6_entity.o : $(SRC)/xml6_entity.c $(SRC)/xml6_entity.h
	gcc -I $(SRC) -c -fPIC -fPIC -O3 -DNDEBUG --std=gnu99 -Wextra -Wall -o $(SRC)/xml6_entity.o $(SRC)/xml6_entity.c -I/usr/include/libxml2 $(DBG)

$(SRC)/xml6_gbl.o : $(SRC)/xml6_gbl.c $(SRC)/xml6_gbl.h
	gcc -I $(SRC) -c -fPIC -fPIC -O3 -DNDEBUG --std=gnu99 -Wextra -Wall -o $(SRC)/xml6_gbl.o $(SRC)/xml6_gbl.c -I/usr/include/libxml2 $(DBG)

$(SRC)/xml6_hash.o : $(SRC)/xml6_hash.c $(SRC)/xml6_hash.h
	gcc -I $(SRC) -c -fPIC -fPIC -O3 -DNDEBUG --std=gnu99 -Wextra -Wall -o $(SRC)/xml6_hash.o $(SRC)/xml6_hash.c -I/usr/include/libxml2 $(DBG)

$(SRC)/xml6_input.o : $(SRC)/xml6_input.c $(SRC)/xml6_input.h
	gcc -I $(SRC) -c -fPIC -fPIC -O3 -DNDEBUG --std=gnu99 -Wextra -Wall -o $(SRC)/xml6_input.o $(SRC)/xml6_input.c -I/usr/include/libxml2 $(DBG)

$(SRC)/xml6_node.o : $(SRC)/xml6_node.c $(SRC)/xml6_node.h
	gcc -I $(SRC) -c -fPIC -fPIC -O3 -DNDEBUG --std=gnu99 -Wextra -Wall -o $(SRC)/xml6_node.o $(SRC)/xml6_node.c -I/usr/include/libxml2 $(DBG)

$(SRC)/xml6_notation.o : $(SRC)/xml6_notation.c $(SRC)/xml6_notation.h
	gcc -I $(SRC) -c -fPIC -fPIC -O3 -DNDEBUG --std=gnu99 -Wextra -Wall -o $(SRC)/xml6_notation.o $(SRC)/xml6_notation.c -I/usr/include/libxml2 $(DBG)

$(SRC)/xml6_ns.o : $(SRC)/xml6_ns.c $(SRC)/xml6_ns.h
	gcc -I $(SRC) -c -fPIC -fPIC -O3 -DNDEBUG --std=gnu99 -Wextra -Wall -o $(SRC)/xml6_ns.o $(SRC)/xml6_ns.c -I/usr/include/libxml2 $(DBG)

$(SRC)/xml6_sax.o : $(SRC)/xml6_sax.c $(SRC)/xml6_sax.h
	gcc -I $(SRC) -c -fPIC -fPIC -O3 -DNDEBUG --std=gnu99 -Wextra -Wall -o $(SRC)/xml6_sax.o $(SRC)/xml6_sax.c -I/usr/include/libxml2 $(DBG)

$(SRC)/xml6_ref.o : $(SRC)/xml6_ref.c $(SRC)/xml6_ref.h
	gcc -I $(SRC) -c -fPIC -fPIC -O3 -DNDEBUG --std=gnu99 -Wextra -Wall -o $(SRC)/xml6_ref.o $(SRC)/xml6_ref.c -I/usr/include/libxml2 $(DBG)

$(SRC)/xml6_reader.o : $(SRC)/xml6_reader.c $(SRC)/xml6_reader.h
	gcc -I $(SRC) -c -fPIC -fPIC -O3 -DNDEBUG --std=gnu99 -Wextra -Wall -o $(SRC)/xml6_reader.o $(SRC)/xml6_reader.c -I/usr/include/libxml2 $(DBG)

$(SRC)/xml6_xpath.o : $(SRC)/xml6_xpath.c $(SRC)/xml6_xpath.h
	gcc -I $(SRC) -c -fPIC -fPIC -O3 -DNDEBUG --std=gnu99 -Wextra -Wall -o $(SRC)/xml6_xpath.o $(SRC)/xml6_xpath.c -I/usr/include/libxml2 $(DBG)

$(SRC)/xml6_error.o : $(SRC)/xml6_error.c $(SRC)/xml6_error.h
	gcc -I $(SRC) -c -fPIC -fPIC -O3 -DNDEBUG --std=gnu99 -Wextra -Wall -o $(SRC)/xml6_error.o $(SRC)/xml6_error.c -I/usr/include/libxml2 $(DBG)

test : all
	@prove6 -I . -j $(TEST_JOBS) t

xtest : all
	@prove6 -I . t -j $(TEST_JOBS) xt

loudtest : all
	@prove6 -I . -v t

clean :
	@rm -f $(SRC)/xml6_*.o $(SRC)/dom.o $(SRC)/domXPath.o resources/libraries/*libxml6.so

realclean : clean
	@rm -f Makefile docs/*.md docs/*/*.md

Pod-To-Markdown-installed :
	@raku -M Pod::To::Markdown -c

doc : Pod-To-Markdown-installed docs/index.md docs/Attr.md docs/Attr/Map.md docs/CDATA.md docs/Comment.md docs/Config.md docs/Dict.md docs/Document.md docs/DocumentFragment.md\
      docs/Dtd.md docs/Dtd/AttrDecl.md  docs/Dtd/Entity.md docs/Dtd/ElementDecl.md docs/Dtd/Notation.md docs/Dtd/ElementContent.md docs/DOM.md docs/Element.md docs/Enums.md docs/EntityRef.md docs/ErrorHandling.md docs/InputCallback.md docs/Item.md docs/Namespace.md docs/HashMap.md docs/Raw.md\
      docs/Node.md docs/Node/List.md docs/Node/Set.md docs/PI.md docs/RelaxNG.md docs/Text.md docs/Pattern.md\
      docs/Parser.md docs/PushParser.md docs/RegExp.md docs/Reader.md docs/Schema.md\
      docs/XInclude/Context.md docs/XPath/Context.md docs/XPath/Expression.md\
      docs/SAX/Handler/SAX2.md docs/SAX/Handler/XML.md\
      docs/SAX/Builder.md docs/Threads.md\
      docs/_CharacterData.md

docs/index.md : lib/LibXML.rakumod
	@raku -I . -c $<
	(\
	    echo '[![Actions Status]($(REPO)/workflows/test/badge.svg)]($(REPO)/actions)'; \
            echo '[![SparrowCI](https://ci.sparrowhub.io/project/git-dwarring-LibXML-raku/badge)](https://ci.sparrowhub.io)'; \
            echo '';\
            raku -I . --doc=Markdown $< \
            | TRAIL=LibXML/$* raku -p -n $(DocLinker) \
        ) > $@

docs/%.md : lib/LibXML/%.rakumod
	@raku -I . -c $<
	raku -I . --doc=Markdown $< \
	| TRAIL=LibXML/$* raku -p -n $(DocLinker) \
        > $@

docs/%.md : lib/LibXML/%.pod6
	@raku -I . -c $<
	raku -I . --doc=Markdown $< \
	| TRAIL=LibXML/$* raku -p -n $(DocLinker) \
        > $@
