.EXPORT_ALL_VARIABLES:

SHELL=/bin/bash

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

JAPANESE=$(shell echo $(COURSE) | grep JP)

# for luatex
#ENGINE=luatex
#RENDER=lualatex

# for pdflatex
ENGINE=pdftex
RENDER=pdflatex

# for xetex
ifneq "$(JAPANESE)" ""
      ENGINE=xetex
      RENDER=xelatex
endif

LATEX=$(RENDER) --shell-escape

#NCPUS=$(shell nproc)
#MAKEFLAGS += "-j $(NCPUS)"
# Let it go infinite!
MAKEFLAGS += "-j "

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)

DOINDEX=$(shell grep printindex $(INPUT))
ifeq "$(DOINDEX)" "\printindex"
     INDEX=makeindex
else
     INDEX=echo
endif

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 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)

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

FILTEROUTPUT= grep CHAPS | sed -e s/.*CHAPS/CHAPS/  -e s/\.tex.*/\.tex/

COURSEOPT="\newcommand{\ENGINE}{$(ENGINE)}  \input{$(COURSE)}"
class:	$(COURSE).pdf
$(COURSE).pdf:	$(SRC_TEXFILES) $(FRONTCOVER).pdf
	echo $(COURSEOPT) | $(LATEX) -jobname $(COURSE)
	$(INDEX) $(COURSE) > /dev/null
	echo $(COURSEOPT) | $(LATEX) -jobname $(COURSE) | $(FILTEROUTPUT)
	$(INDEX) $(COURSE) >& /dev/null 
	$(INDEX) $(COURSE) >& /dev/null
	if [ "$(INDEX)" = "makeindex"  ] ; then \
	echo $(COURSEOPT) | $(LATEX) -jobname $(COURSE) > /dev/null ; fi

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) > /dev/null
	echo $(SLIDEOPT) | $(LATEX) -jobname $(SLIDES) | $(FILTEROUTPUT)
	$(INDEX) $(SLIDES) >& /dev/null
	$(INDEX) $(SLIDES) >& /dev/null
	if [ "$(INDEX)" = "makeindex"  ] ; then \
	echo $(SLIDEOPT) | $(LATEX) -jobname $(SLIDES) > /dev/null ; fi

LABSPLITOPT="\PassOptionsToClass{splitlabs}{LFD} \newcommand{\ENGINE}{$(ENGINE)} \def\watermark{1} \input{$(INPUT)}"
$(COURSE)-labsplit.pdf: $(FRONTCOVER).pdf
	echo $(LABSPLITOPT) | $(LATEX) -jobname $(COURSE)-labsplit | $(FILTEROUTPUT)
	echo $(LABSPLITOPT) | $(LATEX) -jobname $(COURSE)-labsplit > /dev/null

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:
	# need to not do parallel here
	[ -f LABS_ARE_DONE ] || \
	MAKEFLAGS="-j1" $(COMMON)/LABS_ONLY.sh && touch LABS_ARE_DONE 

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) | $(FILTEROUTPUT)
	$(INDEX) $(WATERMARK) >& /dev/null
	echo $(WMOPT) | $(LATEX) -jobname $(WATERMARK) > /dev/null
	$(INDEX) $(WATERMARK) >& /dev/null
	$(INDEX) $(WATERMARK) >& /dev/null
	if [ "$(INDEX)" = "makeindex"  ] ; then \
	echo $(WMOPT) | $(LATEX) -jobname $(WATERMARK) > /dev/null ; fi
$(WATERMARKSLIDES).pdf:  $(SRC_TEXFILES) $(SLIDECOVER).pdf | $(FILTEROUTPUT)
	echo $(WMSLIDESOPT) | $(LATEX) -jobname $(WATERMARKSLIDES) 
	$(INDEX) $(WATERMARKSLIDES) >& /dev/null
	echo $(WMSLIDESOPT) | $(LATEX) -jobname $(WATERMARKSLIDES) > /dev/null
	$(INDEX) $(WATERMARKSLIDES) >& /dev/null
	$(INDEX) $(WATERMARKSLIDES) >& /dev/null
	if [ "$(INDEX)" = "makeindex"  ] ; then \
	echo $(WMSLIDESOPT) | $(LATEX) -jobname $(WATERMARKSLIDES)> /dev/null ; fi

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) >& /dev/null; \
	echo $(APPOPT) | $(LATEX) | $(FILTEROUTPUT) ; \
	$(INDEX) $(APPENDICES) >& /dev/null ; \
	$(INDEX) $(APPENDICES) >& /dev/null ; \
	echo $(APPOPT) | $(LATEX) | $(FILTEROUTPUT); \
	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

	cp "$(COURSE).pdf.outline" \
	$(RELEASE_DIR)/"$(COURSE).pdf_$(RELVER).outline"

	$(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 RESOURCES:
	if [ ! -f  SOLUTIONS_ARE_DONE ] ; then 	\
	$(COMMON)/PREP_SOLUTIONS.sh ; fi
	if [ -f SOLUTIONS/.broken ] ; then echo \
	"YOU HAVE BROKEN SOLUTIONS or RESOURCES (e.g. bad link) - go fix."; exit 1 ; fi	
	touch SOLUTIONS_ARE_DONE

solutions-tar SOLUTIONS-TAR: SOLUTIONS
	@if [ ! -d $(RELEASE_DIR) ] ; then mkdir $(RELEASE_DIR) ; fi
	$(TAR) -C .. $(COURSE)/SOLUTIONS -c -h -v -J -f $(RELEASE_DIR)/$(COURSE)_$(RELVER)_SOLUTIONS.tar.xz
	$(TAR) -C .. $(COURSE)/RESOURCES -c -h -v -f $(RELEASE_DIR)/$(COURSE)_$(RELVER)_RESOURCES.tar
	ls -l $(RELEASE_DIR)

release-full RELEASE_FULL: release SOLUTIONS SOLUTIONS-TAR
	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 release-elearning : labs splitlabs SOLUTIONS-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

	$(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

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)  > /dev/null
	@$(LATEX) $(FRONTCOVER) > /dev/null
#	@$(LATEX) $(FRONTCOVER) > /dev/null
	@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)  > /dev/null
	@$(LATEX) $(BACKCOVER) > /dev/null
#	@$(LATEX) $(BACKCOVER) > /dev/null
	@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)  > /dev/null
	@$(LATEX) $(SLIDECOVER) > /dev/null
#	@$(LATEX) $(SLIDECOVER) > /dev/null
	@rm $(SLIDECOVER).tex

help HELP usage:
	@echo "make TARGETS: "
	@echo "none or class:  Produces $(COURSE).pdf (full-size, color)"
	@echo "COVERS          Produces full, front and slides covers"	
	@echo "slides/SLIDES:  Produces $(COURSE)-SLIDES.pdf (slide-size, color)"
	@echo "watermark/WATERMARK Produce watermaked copies"
	@echo 
	@echo "outlines:       Produces $(COURSE)_{short,long}_outline.{html,pdf}"
	@echo 
	@echo "checklinks:     Checks all URLs and file and kernel source links"
	@echo "                can also do just checkurls, checkfilelinks, checkkernlinks"
	@echo 
	@echo "SOLUTIONS       Produces and populates SOLUTIONS and RESOUREC directories"
	@echo "SOLUTIONS-TAR   Places a SOLUTIONS and RESOURCE tar balls in RELEASE directory"
	@echo 
	@echo "RELEASE/release Populate RELEASE with version numbers embedded in all files for ILT"
	@echo "release-full/RELEASE_FULL" release plus SOLUTIONS and RESOURCES in RELEASE directory
	@echo "release-elearning Populate RELEASE with version numbers embedded in all files EL"
	@echo 
	@echo "generic         Make a non branded release with no course number"
	@echo "release-generic Same as generic, but no SOLUTIONS or RESOURCE files"
	@echo 	
	@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 
	@echo "labs               Produce a labs only version"
	@echo 'labsplit/splitlabs Produces separate files for each lab+solution'
	@echo 
	@echo 'spellcheck      Check spelling'
	@echo 'spellcheck-list-files  List files that would be spell-checked'
	@echo 
	@echo 'FINDOVERFULL    Find vertical and horizonal overruns'
	@echo 'FINDLONG        Find too long lines in raw sections'
	@echo 
	@echo "help HELP or usage: Produces this message"

all: class slides outlines SOLUTIONS COVERS labs splitlabs

# You can add options for spellcheck.sh here 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 \
	*SOLUTIONS*.tar.xz

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 $(COURSE).pdf.outline
	rm -f SOLUTIONS_ARE_DONE LABSPLIT_ARE_DONE OUTLINES_ARE_DONE APPENDICES_ARE_DONE LABS_ARE_DONE

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