mirror of
https://github.com/hendricius/the-sourdough-framework
synced 2025-11-12 22:21:12 -06:00
* Use standard practices for website build - Declare your dependencies - Do not rebuild unless dependencies changed - Cleanup after yourself - Document your targets - COMMANDS in upper case and variables/rules in lowercase * Prevent bundle install to re-run Split it into two separate targets one for installing env and one for actually reworking the html. * Fix typo in makefile comment Co-authored-by: Hendrik Kleinwaechter <hendrik.kleinwaechter@gmail.com> --------- Co-authored-by: Hendrik Kleinwaechter <hendrik.kleinwaechter@gmail.com>
298 lines
8.7 KiB
Makefile
298 lines
8.7 KiB
Makefile
# Macros for commands
|
|
LATEX := latexmk -cd -pdflua -lualatex="lualatex -interaction=nonstopmode" -use-make
|
|
EBOOK := tex4ebook --lua -d epub -c tex4ebook.cfg
|
|
WEBSITE := make4ht --lua -c website.cfg -a debug -uf html5+tidy+common_domfilters+dvisvgm_hashes
|
|
CLEAN := latexmk -cd -lualatex -c -use-make
|
|
EBOOK_CONVERT := kindlegen
|
|
CHECK_1 := lacheck
|
|
CHECK_2 := chktex
|
|
|
|
ifdef DEBUG
|
|
EBOOK += -a debug
|
|
WEBSITE += -a debug
|
|
endif
|
|
|
|
website_dir := static_website_html
|
|
|
|
# List all files that are dependencies
|
|
chapters = baking basics bread-types flour-types history intro\
|
|
non-wheat-sourdough sourdough-starter storing-bread troubleshooting\
|
|
wheat-sourdough
|
|
|
|
src_tables := $(wildcard tables/table-*.tex)
|
|
src_figures := $(wildcard figures/fig-*.tex)
|
|
|
|
src_tex := $(foreach directory, $(chapters), $(wildcard $(directory)/*.tex))
|
|
src_tex += book.tex book_sans_serif.tex references.bib figures/vars.tex
|
|
src_tex += supporters.csv sourdough.sty
|
|
|
|
images := $(wildcard images/*/*.jpg)
|
|
images += $(wildcard images/*/*.png)
|
|
images += $(foreach directory, $(chapters), $(wildcard $(directory)/*.jpg))
|
|
images += $(foreach directory, $(chapters), $(wildcard $(directory)/*.png))
|
|
|
|
src_all := $(src_tex) $(src_figures) $(src_tables) tex4ebook.cfg book.mk4 $(images)
|
|
|
|
website_src := $(src_all) website.cfg
|
|
|
|
website_assets := $(wildcard ../website/assets/*)
|
|
ruby_src := ../website/modify_build.rb $(website_assets)
|
|
ruby_pkg := ../website/Gemfile ../website/Gemfile.lock
|
|
|
|
tgt_figures := $(patsubst %.tex, %.png,$(src_figures))
|
|
|
|
# Default rules for pdf and ebooks, getting overwritten when built in a
|
|
# sub-directory
|
|
%.pdf: %.tex
|
|
$(LATEX) $<
|
|
|
|
# TODO: check if it works on github CI
|
|
%.png: %.tex
|
|
@echo "\input{./vars}" > $@.in
|
|
# \b is backspace..
|
|
@echo "\\\begin{document}" >> $@.in
|
|
@cat $< >> $@.in
|
|
@echo "\end{document}" >> $@.in
|
|
$(LATEX) $@.in
|
|
|
|
book_serif/book.pdf: $(src_all)
|
|
$(LATEX) -output-directory=book_serif book.tex
|
|
|
|
book_sans_serif/book_sans_serif.pdf: $(src_all)
|
|
$(LATEX) -output-directory=book_sans_serif book_sans_serif.tex
|
|
|
|
epub/%.epub: %.tex $(src_all)
|
|
$(EBOOK) -f epub $<
|
|
|
|
epub/%.mobi: epub/%.epub
|
|
$(EBOOK_CONVERT) $< -o $(notdir $@)
|
|
|
|
epub/%.azw3: epub/%.epub
|
|
$(EBOOK_CONVERT) $< -o $(notdir $@)
|
|
|
|
# Now with the rules
|
|
# Expected usual rules first
|
|
.PHONY: default
|
|
default: build_serif_pdf
|
|
|
|
.PHONY: all
|
|
all: bake
|
|
|
|
.PHONY: help
|
|
help:
|
|
@echo ""
|
|
@echo "default: builds the book in pdf format (serif)"
|
|
@echo ""
|
|
@echo "all: pdf and ebooks serif and sans-serif accessible version, same as"
|
|
@echo " build release"
|
|
@echo "bake: same as build all"
|
|
@echo ""
|
|
@echo "check: runs static analysis checker on LaTeX source to spot"
|
|
@echo " programming or typographic mistakes"
|
|
@echo ""
|
|
@echo "clean: delete all intermediate files keep targets (pdf/ebooks/website)"
|
|
@echo "mrproper: delete all generated files intermediate and pdf/ebooks/website"
|
|
@echo " clean_figures: delete intermediate TikZ files"
|
|
@echo " clean_website_build: delete intermediate website files"
|
|
@echo " clean_ebook_build: delete intermediate ebook files"
|
|
@echo ""
|
|
@echo "build_ebook: builds only the ebook serif and accessible version"
|
|
@echo "build_pdf: builds both serif and accessible pdf"
|
|
@echo ""
|
|
@echo "build_sans_serif_ebook: build accessible ebook only"
|
|
@echo "build_sans_serif_pdf: build accessible pdf only"
|
|
@echo ""
|
|
@echo "build_serif_ebook: build serif ebook only"
|
|
@echo "build_serif_pdf: build serif pdf only"
|
|
@echo ""
|
|
@echo "figures: build TikZ figures"
|
|
@echo ""
|
|
@echo "release_serif: build serif only version of pdf and ebooks"
|
|
@echo "release_sans_serif: build sans-serif/accessible version of pdf and ebooks"
|
|
@echo ""
|
|
@echo "website: build the static website from LaTeX sources and post-process it"
|
|
@echo "html: build the static website from LaTeX sources _without_ post-processing"
|
|
@echo ""
|
|
@echo "Debug targets:"
|
|
@echo ""
|
|
@echo "show_tools_version: Show version of tools used on the build machine"
|
|
@echo ""
|
|
@echo "print-X: print makefile variable X"
|
|
@echo ""
|
|
@echo "printvars: print all variables in the makefile"
|
|
@echo ""
|
|
@echo "set DEBUG i.e make DEBUG=1 build_ebook to add debug flags to commands"
|
|
|
|
|
|
# Finally project specif targets
|
|
.PHONY: build_pdf
|
|
build_pdf: build_serif_pdf build_sans_serif_pdf
|
|
|
|
.PHONY: build_serif_pdf
|
|
build_serif_pdf: book_serif/book.pdf
|
|
|
|
.PHONY: build_sans_serif_pdf
|
|
build_sans_serif_pdf: book_sans_serif/book_sans_serif.pdf
|
|
|
|
.PHONY: build_ebook
|
|
build_ebook: build_serif_ebook build_sans_serif_ebook
|
|
|
|
.PHONY: build_serif_ebook
|
|
build_serif_ebook: epub/book.epub epub/book.mobi epub/book.azw3 | make_release_dir
|
|
|
|
.PHONY: build_sans_serif_ebook
|
|
build_sans_serif_ebook: epub/book_sans_serif.epub epub/book_sans_serif.mobi \
|
|
epub/book_sans_serif.azw3 | make_release_dir
|
|
|
|
.PHONY: export_figures
|
|
# Requires that you have docker running on your computer.
|
|
export_figures: build_pdf $(tgt_figures)
|
|
cd figures/ && bash export_figures.sh
|
|
|
|
# Goal is not really to have 0 warning reported but we should check we don't
|
|
# add many and if we do, we know they are false positive
|
|
PHONY: check
|
|
check: $(SRC_TEX)
|
|
@echo "Running: " $(CHECK_1)
|
|
$(CHECK_1) book.tex
|
|
@echo ""
|
|
@echo "Running: " $(CHECK_2)
|
|
$(CHECK_2) book.tex
|
|
|
|
.PHONY: clean_figures
|
|
clean_figures:
|
|
- $(CLEAN) $(patsubst %.tex, %.png.in, $(src_figures))
|
|
- rm $(patsubst %.tex, %.png.pdf, $(src_figures))
|
|
- rm $(patsubst %.tex, %.png.in, $(src_figures))
|
|
|
|
.PHONY: clean_ebook_build
|
|
clean_ebook_build:
|
|
-rm book*.aux
|
|
-rm book*.run.xml
|
|
-rm book*.bcf
|
|
-rm book*.blg
|
|
-rm book*.log
|
|
-rm book*.4tc
|
|
-rm book*.4ct
|
|
-rm book*.dvi
|
|
-rm book.css
|
|
-rm book_sans_serif.css
|
|
-rm book*.idv
|
|
-rm book*.lg
|
|
-rm book*.ncx
|
|
-rm book*.tmp
|
|
-rm book*.xref
|
|
-rm book*.html
|
|
-rm book*.fls
|
|
-rm book*.fdb_latexmk
|
|
-rm book*.bbl
|
|
-rm content.opf
|
|
-rm book*x.svg
|
|
|
|
.PHONY: clean_website_build
|
|
clean_website_build: clean_ebook_build
|
|
-rm book-*.svg
|
|
-rm book.dlog
|
|
-rm $(subst $(website_dir)/,, $(wildcard $(website_dir)/*.html))
|
|
|
|
.PHONY: clean
|
|
clean: clean_ebook_build clean_figures clean_website_build
|
|
$(CLEAN) -output-directory=book_serif book.tex
|
|
$(CLEAN) -output-directory=book_sans_serif book_sans_serif.tex
|
|
-rm book*/*.bbl
|
|
-rm book*/*.run.xml
|
|
-rm -rf book*-epub/META-INF
|
|
-rm -rf book*-epub/OEBPS
|
|
-rm book*-epub/mimetype
|
|
|
|
.PHONY: mrproper
|
|
mrproper: clean
|
|
$(CLEAN) -C $(src_figures)
|
|
$(CLEAN) -C -output-directory=book_serif book.tex
|
|
$(CLEAN) -C -output-directory=book_sans_serif book_sans_serif.tex
|
|
-rm figures/*.png
|
|
-rm *.html
|
|
-rm *.svg
|
|
rm -rf epub/
|
|
rm -rf release/
|
|
rm -rf book_serif/
|
|
rm -rf book_sans_serif/
|
|
rm -rf book-epub/
|
|
rm -rf book_sans_serif-epub/
|
|
rm -rf $(website_dir)
|
|
|
|
.PHONY: bake
|
|
bake: release_serif release_sans_serif
|
|
|
|
.PHONY: make_release_dir
|
|
make_release_dir:
|
|
mkdir -p release
|
|
|
|
.PHONY: release_serif
|
|
release_serif: build_serif_pdf build_serif_ebook | make_release_dir
|
|
cp book_serif/book.pdf release/TheBreadCode-The-Sourdough-Framework.pdf
|
|
cp epub/book.mobi release/TheBreadCode-The-Sourdough-Framework.mobi
|
|
cp epub/book.epub release/TheBreadCode-The-Sourdough-Framework.epub
|
|
cp epub/book.azw3 release/TheBreadCode-The-Sourdough-Framework.azw3
|
|
|
|
.PHONY: release_sans_serif
|
|
release_sans_serif: build_sans_serif_pdf build_sans_serif_ebook | make_release_dir
|
|
cp book_sans_serif/book_sans_serif.pdf release/TheBreadCode-The-Sourdough-Framework-sans-serif.pdf
|
|
cp epub/book_sans_serif.mobi release/TheBreadCode-The-Sourdough-Framework-sans-serif.mobi
|
|
cp epub/book_sans_serif.epub release/TheBreadCode-The-Sourdough-Framework-sans-serif.epub
|
|
cp epub/book_sans_serif.azw3 release/TheBreadCode-The-Sourdough-Framework-sans-serif.azw3
|
|
|
|
# Website stuff
|
|
$(website_dir)/book.html: $(website_src)
|
|
$(WEBSITE) -d $(website_dir) book.tex
|
|
|
|
.PHONY: html
|
|
html: $(website_dir)/book.html
|
|
cp $< $(website_dir)/index.html
|
|
|
|
# Because packages will be installed in hard to predict places use a file as
|
|
# marker..
|
|
../website/_bundle_install_done: $(ruby_pkg)
|
|
- rm ../website/$@
|
|
cd ../website && bundle install
|
|
touch ../website/$@
|
|
|
|
# TODO: this will run every single time, but is so fast we don't really care
|
|
.PHONY: website
|
|
website: html ../website/_bundle_install_done $(ruby_src)
|
|
cd ../website && ruby modify_build.rb
|
|
|
|
# Debug Stuff from now on
|
|
.PHONY: show_tools_version
|
|
show_tools_version: # Show version of tools used on the build machine
|
|
- latexmk --version
|
|
@echo ""
|
|
- lualatex --version
|
|
@echo ""
|
|
- tex4ebook --version
|
|
@echo ""
|
|
- make4ht --version
|
|
@echo ""
|
|
- tidy -version
|
|
@echo ""
|
|
- kindlegen --version
|
|
@echo ""
|
|
- lacheck --version
|
|
@echo ""
|
|
- chktex --version
|
|
@echo ""
|
|
- make --version
|
|
@echo ""
|
|
- biber -version
|
|
@echo ""
|
|
|
|
# You can find the value of variable X with the following command:
|
|
# make print-X
|
|
print-%: ; @echo $* = $($*) # Print a makefile variable
|
|
|
|
.PHONY: printvars
|
|
printvars: # Print all variables in the makefile
|
|
@$(foreach V,$(sort $(.VARIABLES)), \
|
|
$(if $(filter-out environ% default automatic, \
|
|
$(origin $V)),$(info $V=$($V) ($(value $V)))))
|