.EXPORT_ALL_VARIABLES:

SHELL=/bin/bash

# for pdflatex
ENGINE=pdftex
RENDER=pdflatex

# for luatex
#ENGINE=luatex
#RENDER=lualatex

# for xetex
#ENGINE=xetex
#RENDER=xelatex

LATEX=$(RENDER) --shell-escape

INDEX=makeindex

NCPUS=$(shell grep ^processor /proc/cpuinfo | wc -l)
MAKEFLAGS += "-j $(NCPUS)"

COURSE=$(shell basename $(PWD))
# only define $COURSE if Undefined
COURSE ?= $(shell basename $(PWD))

INPUT=$(COURSE).tex
SLIDES=$(COURSE)-SLIDES

COMMON=./common
export TEXMFHOME=$(COMMON)/texmf

SRC_TEXFILES= $(wildcard CHAPS/*/*.*) $(INPUT)

PDFS = $(shell ls *.pdf 2>/dev/null | sed -e s/.pdf//g )
HTMLS = $(shell ls *.html 2>/dev/null | sed -e s/.html//g )

VERSION=$(shell grep '\\newcommand{\\version}' $(INPUT) \
    | sed -e s/'\\newcommand{\\version}{'//g \
    | sed -e s/'}'//g)
RELVER=V"$(VERSION)"

COURSETITLE=$(shell grep '\\newcommand{\\coursetitle}' $(INPUT) \
    | sed -e s/'\\newcommand{\\coursetitle}{'//g \
    | sed -e s/'}'//g)

# one cannot make covers on paleo tex in RHEL6, so must make
#  on a modern platform and import; this prevents cover making
# from being triggered when make the book or slides

FRONTCOVER = $(COURSE)-COVER-FRONT
BACKCOVER = $(COURSE)-COVER-BACK
SLIDECOVER = $(COURSE)-COVER-SLIDE
LABS = $(COURSE)-labs

.PHONY: $(COURSE) SOLUTIONS RESOURCES slides SLIDES release RELEASE \
	clean veryclean help COVERS covers labs LABS\
	checkurls checkkernlinks checkfilelinks checklinks splitlabs \
	labsplit findoverfull FINDOVERFULL findlong FINDLONG \
	release-elearning

ifneq "$(DRYRUN)" ""
ROPTS += --dry-run
endif

FAKEROOT:= $(shell which fakeroot >/dev/null && echo fakeroot || true)
TAR	= $(FAKEROOT) tar
RSYNC	= rsync -crlptvHxP --inplace --exclude old $(ROPTS)

################################

COURSEOPT="\newcommand{\ENGINE}{$(ENGINE)}  \input{$(COURSE)}"
class:	$(COURSE).pdf
$(COURSE).pdf:	$(SRC_TEXFILES) $(FRONTCOVER).pdf
	echo $(COURSEOPT) | $(LATEX) -jobname $(COURSE)
	$(INDEX) $(COURSE)
	echo $(COURSEOPT) | $(LATEX) -jobname $(COURSE)
	$(INDEX) $(COURSE) > /dev/null 
	$(INDEX) $(COURSE) > /dev/null
	echo $(COURSEOPT) | $(LATEX) -jobname $(COURSE)

SLIDEOPT="\newcommand{\ENGINE}{$(ENGINE)} \def\slideoutput{1} \input{$(COURSE)}"
slides SLIDES: $(SLIDES).pdf
$(SLIDES).pdf:  $(SRC_TEXFILES) $(SLIDECOVER).pdf
	echo $(SLIDEOPT) | $(LATEX) -jobname $(SLIDES) 
	$(INDEX) $(SLIDES)
	echo $(SLIDEOPT) | $(LATEX) -jobname $(SLIDES) 
	$(INDEX) $(SLIDES) > /dev/null
	$(INDEX) $(SLIDES) > /dev/null
	echo $(SLIDEOPT) | $(LATEX) -jobname $(SLIDES) 

LABSPLITOPT="\PassOptionsToClass{splitlabs}{LFD} \newcommand{\ENGINE}{$(ENGINE)} \input{$(INPUT)}"
$(COURSE)-labsplit.pdf: $(FRONTCOVER).pdf
	echo $(LABSPLITOPT) | $(LATEX) -jobname $(COURSE)-labsplit
	echo $(LABSPLITOPT) | $(LATEX) -jobname $(COURSE)-labsplit

splitlabs labsplit: $(COURSE)-labsplit.pdf
	if [ ! -f LABSPLIT_ARE_DONE ] ; then \
	cat ./labcontents.data | while read ex pg ; do \
	read pgend ; \
	pg=$$(( $$pg + 1)) ;    pgend=$$(( $$pgend + 1)) ; \
	qpdf --empty --pages $(COURSE)-labsplit.pdf $$pg-$$pgend -- LAB_$$ex.pdf ; \
	echo qpdf $(COURSE)-labsplit.pdf cat $$pg-$$pgend output LAB_$$ex.pdf ; \
	done ; \
	rm -rf ./LABSPLIT ; mkdir LABSPLIT ; \
	mv LAB*.pdf LABSPLIT ; \
	touch LABSPLIT_ARE_DONE ; \
	fi
#	@rm $(COURSE)-labsplit.pdf  Keep to speed up make

labs: $(LABS).pdf
$(LABS).pdf:
	[ -f LABS_ARE_DONE ] || $(COMMON)/LABS_ONLY.sh && touch LABS_ARE_DONE 

#	if [ ! -f LABS_ARE_DONE ] ; then  \
#	$(COMMON)/LABS_ONLY.sh ; \
#	touch LABS_ARE_DONE ; \
#	fi

WATERMARK=$(COURSE)-WM
WATERMARKSLIDES=$(COURSE)-SLIDES-WM
WMOPT="\newcommand{\ENGINE}{$(ENGINE)} \def\watermark{1} \input{$(COURSE)}" 
WMSLIDESOPT="\newcommand{\ENGINE}{$(ENGINE)} \def\watermark{1} \def\slideoutput{1} \input{$(COURSE)}" 
watermark WATERMARK: $(WATERMARK).pdf
$(WATERMARK).pdf:  $(SRC_TEXFILES) $(FRONTCOVER).pdf
	echo $(WMOPT) | $(LATEX) -jobname $(WATERMARK)
	$(INDEX) $(WATERMARK)
	echo $(WMOPT) | $(LATEX) -jobname $(WATERMARK)
	$(INDEX) $(WATERMARK) > /dev/null
	$(INDEX) $(WATERMARK) > /dev/null
	echo $(WMOPT) | $(LATEX) -jobname $(WATERMARK)
$(WATERMARKSLIDES).pdf:  $(SRC_TEXFILES) $(SLIDECOVER).pdf
	echo $(WMSLIDESOPT) | $(LATEX) -jobname $(WATERMARKSLIDES)
	$(INDEX) $(WATERMARKSLIDES)
	echo $(WMSLIDESOPT) | $(LATEX) -jobname $(WATERMARKSLIDES)
	$(INDEX) $(WATERMARKSLIDES) > /dev/null
	$(INDEX) $(WATERMARKSLIDES) > /dev/null
	echo $(WMSLIDESOPT) | $(LATEX) -jobname $(WATERMARKSLIDES)

APPENDIX=$(shell if [ -f appendices.tex ] ; then echo YES ; else echo NO; fi )

APPOPT="\newcommand{\ENGINE}{$(ENGINE)} \input{$(APPENDICES)}"

ifeq "$(APPENDIX)" "YES"

APPENDICES	= $(COURSE)-APPENDICES-WM
appendices: $(SRC_TEXFILES) $(FRONTCOVER).pdf outlines
	    if [ ! -f APPENDICES_ARE_DONE ] ; then \
	echo make somewhatclean ; \
	cat $(COURSE).tex \
	    | sed s/'\\subimport'/'%%\\subimport'/g \
	    | sed -e 1,/'%%\\subimport'/s/'%%\\subimport'/'\\subimport'/ \
	    | sed -e s/'\\documentclass'/'\\\def\\\wmappendix{1}\\\documentclass'/  \
	    > $(APPENDICES).tex ; \
	echo $(APPOPT) | $(LATEX) ; \
	$(INDEX) $(APPENDICES) ; \
	echo $(APPOPT) | $(LATEX) ; \
	$(INDEX) $(APPENDICES) >/dev/null ; \
	$(INDEX) $(APPENDICES) >/dev/null ; \
	echo $(APPOPT) | $(LATEX) ; \
		fi
		touch APPENDICES_ARE_DONE
else
appendices:
	@ echo No appendices.tex , no need to make appendices
endif

RELEASE_DIR=./RELEASE

#PDFS = $(subst .pdf,,$(wildcard *.pdf))

RELEASE release: all watermark appendices
	echo Making Release VERSION = $(VERSION)
	@if [ ! -d $(RELEASE_DIR) ] ; then mkdir $(RELEASE_DIR) ; fi

	@for names in $(PDFS) ; do \
	cp "$$names".pdf $(RELEASE_DIR)/"$$names"_$(RELVER).pdf ; \
	done

	@for names in $(HTMLS) ; do \
	cp "$$names".html $(RELEASE_DIR)/"$$names"_$(RELVER).html ; \
	done

	$(TAR) -c -h -v -J -f \
		$(RELEASE_DIR)/$(COURSE)_$(RELVER)_LABSPLIT.tar.xz \
		-C .. $(COURSE)/LABSPLIT
	$(TAR) -c -h -v -z -f \
		$(RELEASE_DIR)/$(COURSE)_$(RELVER)_LABSPLIT.tar.gz \
		-C .. $(COURSE)/LABSPLIT

	rm $(RELEASE_DIR)/*labsplit*pdf

	ls -l $(RELEASE_DIR)

SOLUTIONS_FILE = $(COURSE)_$(RELVER)_SOLUTIONS.tar.bz2
RESOURCES_FILE = $(COURSE)_$(RELVER)_RESOURCES.tar
SOLUTIONS RESOURCES:
	if [ ! -f  SOLUTIONS_ARE_DONE ] ; then 	\
	$(COMMON)/PREP_SOLUTIONS.sh ; fi
	touch SOLUTIONS_ARE_DONE
SOLUTIONS-tar: $(SOLUTIONS_FILE)
$(SOLUTIONS_FILE): SOLUTIONS
	if [ -f SOLUTIONS/.broken ] ; then echo "YOU HAVE BROKEN SOLUTIONS (e.g. bad link) - go fix."; exit 1 ; fi
	$(TAR) -c -h -v -j -f $(SOLUTIONS_FILE) -C .. $(COURSE)/SOLUTIONS
RESOURCES-tar: $(RESOURCES_FILE)
$(RESOURCES_FILE): RESOURCES
	if [ -f SOLUTIONS/.broken ] ; then echo "YOU HAVE BROKEN SOLUTIONS (e.g. bad link) - go fix."; exit 1 ; fi
	$(TAR) -c -h -v -f $(RESOURCES_FILE) -C .. $(COURSE)/RESOURCES

release-full RELEASE_FULL: release SOLUTIONS-tar RESOURCES-tar
	mv $(SOLUTIONS_FILE) $(RESOURCES_FILE) $(RELEASE_DIR)
	ls -l $(RELEASE_DIR)

release-generic: class slides watermark outlines
	@mkdir RELEASE
	@for names in $(PDFS) ; do \
	cp "$$names".pdf $(RELEASE_DIR)/"$$names"_$(RELVER).pdf ; \
	done

	@for names in $(HTMLS) ; do \
	cp "$$names".html $(RELEASE_DIR)/"$$names"_$(RELVER).html ; \
	done


release-elearning: labs splitlabs SOLUTIONS-tar RESOURCES-tar
	echo Making Release VERSION = $(VERSION)
	@if [ ! -d $(RELEASE_DIR) ] ; then mkdir $(RELEASE_DIR) ; fi

	@for names in $(COURSE)-labs ; do \
	cp "$$names".pdf $(RELEASE_DIR)/"$$names"_$(RELVER).pdf ; \
	done

	mv $(SOLUTIONS_FILE) $(RESOURCES_FILE) $(RELEASE_DIR)

	$(TAR) -c -h -v -J -f \
		$(RELEASE_DIR)/$(COURSE)_$(RELVER)_LABSPLIT.tar.xz \
		-C .. $(COURSE)/LABSPLIT
	$(TAR) -c -h -v -z -f \
		$(RELEASE_DIR)/$(COURSE)_$(RELVER)_LABSPLIT.tar.gz \
		-C .. $(COURSE)/LABSPLIT

	ls -l $(RELEASE_DIR)

generic GENERIC:
	$(COMMON)/do_GENERIC.sh

checkurls:
	@echo I am checking the URLs in $(COURSE):
	$(COMMON)/checkurls.sh $(COURSE)

checkkernlinks:
	@echo I am checking the kernel source links in $(COURSE):
	$(COMMON)/checkkernlinks.sh $(COURSE)

checkfilelinks:
	@echo I am checking the file system links in $(COURSE):
	$(COMMON)/checkfilelinks.sh $(COURSE)

#checklinks: checkurls checkkernlinks checkfilelinks
checklinks: checkurls

outline_old: class
	@$(COMMON)/get_long_html_outline.sh $(COURSE)
	@$(COMMON)/get_short_html_outline.sh $(COURSE)
#	@$(COMMON)/get_long_txt_outline.sh $(COURSE)
	@ if [[ -f appendices.tex ]] ; then  \
	$(COMMON)/get_appendix_html_outline.sh $(COURSE) ; fi


outlines: class
	if [ ! -f OUTLINES_ARE_DONE ] ; then \
		$(COMMON)/build_outlines.sh long ; \
		$(COMMON)/build_outlines.sh short ; \
	touch OUTLINES_ARE_DONE ; \
	fi

#################################

REMOTE		= course-material-001.p.c.linuxfoundation.org:/var/www/html/cm

RESlocal	= ../RESOURCES/$(COURSE)
RESremote	= $(REMOTE)/RESOURCES/$(COURSE)$(REMOTEPOSTFIX)
CMremote	= $(REMOTE)/$(COURSE)
resources-upload:
	$(info Uploading RESOURCES/$(COURSE) to CM website)
	$(RSYNC) ${RESlocal}/ ${RESremote}/
resources-upload-delete:
	$(info Uploading RESOURCES/$(COURSE) to CM website)
	$(RSYNC) --delete ${RESlocal}/ ${RESremote}/
resources-download:
	$(info Downloading RESOURCES/$(COURSE) from CM website)
	$(RSYNC) ${RESremote}/ ${RESlocal}/
resources-download-delete:
	$(info Downloading RESOURCES/$(COURSE) from CM website)
	$(RSYNC) --delete ${RESremote}/ ${RESlocal}/
cm-upload SOLUTIONS-upload:
	$(info Uploading $(SOLUTIONS_FILE) $(RESOURCES_FILE) to CM website)
	$(RSYNC) $(SOLUTIONS_FILE) $(RESOURCES_FILE) ${CMremote}/
cm-upload-staging: SOLUTIONS-upload-staging RESOURCES-upload-staging
SOLUTIONS-upload-staging:
	$(info Uploading $(SOLUTIONS_FILE) to CM website)
	$(RSYNC) $(SOLUTIONS_FILE) ${CMremote}/STAGING/
RESOURCES-upload-staging:
	$(info Uploading $(RESOURCES_FILE) to CM website)
	$(RSYNC) $(RESOURCES_FILE) ${CMremote}/STAGING/

#################################

COVERS covers: $(FRONTCOVER).pdf $(BACKCOVER).pdf $(SLIDECOVER).pdf
# FRONT COVER
#$(FRONTCOVER).pdf: $(INPUT)
COVEROPT="\newcommand{\ENGINE}{$(ENGINE)}"
$(FRONTCOVER).pdf:
	echo \\newcommand{\\coverheight}{11.0in} > $(FRONTCOVER).tex
	echo \\newcommand{\\ENGINE}{$(ENGINE)}  >> $(FRONTCOVER).tex
	echo \\documentclass{LFcover} >> $(FRONTCOVER).tex
	echo \\title{$(COURSETITLE)}\\subtitle{$(COURSE)}\\myversion{$(VERSION)} >> $(FRONTCOVER).tex
	echo \\begin{document}\\makefront\\end{document} >> $(FRONTCOVER).tex
	$(LATEX) $(FRONTCOVER) && $(LATEX) $(FRONTCOVER) && $(LATEX) $(FRONTCOVER)
	rm $(FRONTCOVER).tex
# BACK COVER
$(BACKCOVER).pdf:
	echo \\newcommand{\\coverheight}{11.0in} > $(BACKCOVER).tex
	echo \\newcommand{\\ENGINE}{$(ENGINE)}  >> $(BACKCOVER).tex
	echo \\documentclass{LFcover} >> $(BACKCOVER).tex
	echo \\title{$(COURSETITLE)}\\subtitle{$(COURSE)}\\myversion{$(VERSION)} >> $(BACKCOVER).tex
	echo \\begin{document}\\makeback\\end{document} >> $(BACKCOVER).tex
	$(LATEX) $(BACKCOVER) && $(LATEX) $(BACKCOVER) && $(LATEX) $(BACKCOVER)
	rm $(BACKCOVER).tex
# SLIDE FRONT COVER
#$(SLIDECOVER).pdf: $(INPUT)
# remove $(INPUT) target as it malfunctions on RHEL6
$(SLIDECOVER).pdf:
	echo \\newcommand{\\coverheight}{6.375in} > $(SLIDECOVER).tex
	echo \\newcommand{\\ENGINE}{$(ENGINE)}  >> $(SLIDECOVER).tex
	echo \\documentclass{LFcover} >> $(SLIDECOVER).tex
	echo \\title{$(COURSETITLE)}\\subtitle{$(COURSE)}\\myversion{$(VERSION)} >> $(SLIDECOVER).tex
	echo \\begin{document}\\makefront\\end{document} >> $(SLIDECOVER).tex
	$(LATEX) $(SLIDECOVER) && $(LATEX) $(SLIDECOVER) && $(LATEX) $(SLIDECOVER)
	rm $(SLIDECOVER).tex

help HELP usage:
	@echo "make TARGETS: "
	@echo "none or class:  Produces $(COURSE).pdf (full-size, color)"
	@echo "slides/SLIDES:  Produces $(COURSE)-SLIDES.pdf (slide-size, color)"
	@echo "outline:        Produces $(COURSE)_{short,long,appendix}_outline.tml (do make first)"
	@echo "outlines:        Produces $(COURSE)_{short,long,appendix}_outline.tml (do make first) and pdf outlines"
	@echo "checklinks:     Checks all URLs and file and kernel source links"
	@echo "                can also do just checkurls, checkefilelinkes, checkkernlinks"
	@echo "SOLUTIONS       Produces the SOlUTIONS directory"
	@echo "COVERS          Produces full, front and slides covers"
	@echo "RELEASE/release Populate RELEASE directory with all PDFS with version numbers embedded"
	@echo "release-elearning Populate RELEASE directory with all PDFS with version numbers embedded for ELEARNING COURSE"
	@echo "generic         Make a non branded release with no course number"
	@echo "release-generic Same as generic, but no SOLUTIONS or RESOURCE files"
	@echo "resources-upload   sync up to   ../RESOURCES/$(COURSE)"
	@echo "resources-download sync down from ../RESOURCES/$(COURSE)"
	@echo "SOLUTIONS-upload   SOLUTIONS tar ball To cm website"
	@echo "watermark/WATERMARK Produce watermaked copies"
	@echo "labs               Produce a labs only version"
	@echo 'labsplit/splitlabs Produces separate files for each lab+solution'
	@echo 'spellcheck      Check spelling'
	@echo 'spellcheck-list-files  List files that would be spell-checked'
	@echo 'FINDOVERFULL    Find vertical and horizonal overruns'
	@echo 'FINDLONG        Find too long lines in raw sections'
	@echo "help HELP or usage: Produces this message"
#	@echo "blackandwhite"  Produce a black and white  $(COURSE).pdf called $(COURSE)-bw.pdf

all: class slides outlines SOLUTIONS COVERS labs splitlabs

# You can add options for spellcheck.sh here or in $(COURSE)/.spellcheckrc
#SPELLOPTS="-e inc"

spellcheck:
	$(COMMON)/spellcheck.sh $(SPELLOPTS) $(COURSE).tex
spellcheck-list-files:
	$(COMMON)/spellcheck.sh -l $(SPELLOPTS) $(COURSE).tex

# check for horizontal and vertical overruns:

FINDLONG findlong:
	$(COMMON)/findlong CHAPS/*/*.tex

FINDOVERFULL findoverfull: $(COURSE).pdf
	@echo FINDING VERTICAL OVERRUNS .........
	@if grep -H -A3 -B5 'Overfull \\vbox ([0-9][0-9]' $(COURSE).log ; then echo "">/dev/null ; fi
	@echo FINDING HORIZONTAL  OVERRUNS .........
	@if grep --color -H -A3 -B5 'Overfull \\hbox ([0-9][0-9].*[0-9]' $(COURSE).log ; then echo "">/dev/null ; fi
	$(COMMON)/findlong CHAPS/*/*.tex

#	LEN=110 $(COMMON)/do_getlonglines.sh CHAPS/*/*.tex | grep -v url

#################################
somewhatclean:
	rm -rf *~ *log *aux *dvi *.out *.lof *.mtc* *.bmt *.lot *.maf *.cpt \
	*.ind *.ilg *.idx $(COURSE)_*_LABSPLIT *COVER*.tex \
	labcontents.data $(COURSE)-labsplit* RESOURCES *.pyg

clean veryclean: somewhatclean
	rm -rf $(COURSE).pdf $(COURSE)-SLIDES.pdf $(COURSE)-*COVER*.pdf \
	$(COURSE)*WM.{pdf,tex} $(COURSE)-labs.pdf *.toc *.html RELEASE* *LABSPLIT 
	rm -rf $(COURSE)-LABS SOLUTIONS/s_* $(COURSE)-*outline*.pdf
	rm -rf _minted-* *.listing *.mw
	rm -f $(COURSE)-labsplit.pdf
	rm -f SOLUTIONS_ARE_DONE LABSPLIT_ARE_DONE OUTLINES_ARE_DONE APPENDICES_ARE_DONE LABS_ARE_DONE

labs: $(LABS).pdf
$(LABS).pdf:

#################################

## BELOW HERE IS OBSOLETE STUFF

blackandwhite: $(COURSE).pdf
	echo converting $(COURSE).pdf to $(COURSE-PRINT).pdf
	gs -o $(COURSE)-bw.pdf \
	    -sDEVICE=pdfwrite \
	    -sColorConversionStrategy=Gray \
	    -dProcessColorModel=/DeviceGray \
	    -dCompatibilityLevel=1.4 \
	    -dNumRenderingThreads=4 \
	    -dNOPAUSE \
	    -dBATCH \
	    $(COURSE).pdf


