Newer
Older
Handbook / make-includes / build_lecture_rules.make
################################################################################
#
# File: $Id$
#
# Standard variables and rules for building a set of lecture files.
# Altering these definitions will affect ALL LECTURE MAKEFILES FOR ALL
# PAPERS!! If you need to do something specific for a particular paper,
# include a custom rule in its makefile. DON'T add it here!
#
################################################################################


################################################################################
#
# Add standard file suffixes.
#
include $(GLOBAL_HANDBOOK_INCLUDE)/standard_suffixes.make


################################################################################
#
# Standard directories.
#
IMGDIR=images


################################################################################
#
# Standard paths.
#
include $(GLOBAL_HANDBOOK_INCLUDE)/standard_paths.make


################################################################################
#
# Files to be cleaned by the various "clean" targets. Note that we don't
# "tidy" .aux files because they may be needed by the xr package for inter-
# document cross references, but won't get regenerated if the final target
# PDF files exist. They will be caught by by the "clean" target though.
#
TIDY_FILES+=*.tmp *.out *.log *.nav *.toc *.snm *.head *.dvi \
	slides-combined.pdf slides-notes.pdf
CLEAN_FILES+=*.aux *.pdf


################################################################################
#
# Various environment variables.
#
include $(GLOBAL_HANDBOOK_INCLUDE)/standard_environment.make
#
# Base file names for the various documents.
#
SLIDES?=Chapter$(CHAPTER)slides
FIGURES?=Chapter$(CHAPTER)figures
COMBINED?=Chapter$(CHAPTER)combined
NOTES?=Chapter$(CHAPTER)notes
#
# Standard files to be installed on the web server.
#
ifneq ($(strip $(SLIDES)),)
INSTALL_FILES+=$(SLIDES).pdf
endif
ifneq ($(strip $(FIGURES)),)
INSTALL_FILES+=$(FIGURES).pdf $(FIGURES)-reduced.pdf
endif
ifneq ($(strip $(COMBINED)),)
INSTALL_FILES+=$(COMBINED).pdf
endif
#
# List of standard "phony" build targets.
#
TARGETS+=slides notes slides-combined slides-notes figures figures2up combined
#
.PHONY: $(TARGETS)


################################################################################
#
# Display a message if someone tries to build a target that has been
# disabled (by setting the appropriate variable to empty in the makefile).
#
disabled_message=@echo The \"$(1)\" target has been disabled for this chapter.


################################################################################
#
# Build everything.
#
all: slides notes figures figures2up combined


################################################################################
#
# Build presentation slides. If $(SLIDES) is empty, these rules are ignored.
#
ifneq ($(strip $(SLIDES)),)

#
# Set the prerequisites for the "slides" build target, depending on
# whether the figures document exists. If $(FIGURES) is non-empty, we need
# to include the figures .aux file for inter-document cross-references.
#
ifeq ($(strip $(FIGURES)),)
SLIDES_PREREQS:=$(SLIDES).pdf
else
SLIDES_PREREQS:=figures $(SLIDES).pdf
endif

#
# Build the slides for the presentation.
#
slides: $(SLIDES_PREREQS)

$(SLIDES).pdf: $(SLIDES).tex $(SLIDE_IMAGES) $(SLIDE_BACKGROUNDS) $(SLIDE_FILES)
	pdflatex --jobname=$(SLIDES) '\documentclass[$(LATEX_OPTS)]{lectureslides}\input{$(SLIDES)}'
	pdflatex --jobname=$(SLIDES) '\documentclass[$(LATEX_OPTS)]{lectureslides}\input{$(SLIDES)}'

else

slides:
	$(call disabled_message,$@)

endif


################################################################################
#
# Build the presentation notes. If $(NOTES) is empty, these rules are
# ignored.
#
ifneq ($(strip $(NOTES)),)

#
# Build the slides with notes.
#
slides-notes: slides-notes.pdf

slides-notes.pdf: $(SLIDES).tex $(SLIDE_IMAGES) $(SLIDE_BACKGROUNDS) $(SLIDE_FILES)
	pdflatex --jobname=slides-notes '\documentclass[$(LATEX_OPTS),notes=onlyslideswithnotes]{lectureslides}\input{$(SLIDES)}'
	pdflatex --jobname=slides-notes '\documentclass[$(LATEX_OPTS),notes=onlyslideswithnotes]{lectureslides}\input{$(SLIDES)}'

#
# Build the slides with notes, 6-up.
#
notes: $(NOTES).pdf

$(NOTES).pdf: $(NOTES).tex slides-notes.pdf
	pdflatex $<
	pdflatex $<

else

notes slides-notes:
	$(call disabled_message,$@)

endif


################################################################################
#
# Build the complete combined lecture document. If $(COMBINED) is empty,
# these rules are ignored.
#
ifneq ($(strip $(COMBINED)),)

#
# Set the prerequisites for the "combined" build target, depending on
# whether the figures document exists. If $(FIGURES) is empty, they are
# omitted from the combined document.
#
ifeq ($(strip $(FIGURES)),)
COMBINED_PREREQS:=$(COMBINED).tex slides-combined.pdf
else
COMBINED_PREREQS:=$(COMBINED).tex slides-combined.pdf $(FIGURES).pdf
endif

#
# Build the slides for the combined document.
#
slides-combined: slides-combined.pdf

slides-combined.pdf: $(SLIDES).tex $(SLIDE_IMAGES) $(SLIDE_BACKGROUNDS)
	pdflatex --jobname=slides-combined '\documentclass[$(LATEX_OPTS),handout]{lectureslides}\input{$(SLIDES)}'
	pdflatex --jobname=slides-combined '\documentclass[$(LATEX_OPTS),handout]{lectureslides}\input{$(SLIDES)}'

#
# Build the complete combined document.
#
combined: $(COMBINED).pdf

$(COMBINED).pdf: $(COMBINED_PREREQS) $(COMBI_IMAGES) $(COMBI_FILES)
	pdflatex $<
	pdflatex $<

else

combined slides-combined:
	$(call disabled_message,$@)

endif


################################################################################
#
# Build the figures and examples document. If $(FIGURES) is empty, these
# rules are ignored.
#
ifneq ($(strip $(FIGURES)),)

figures: $(FIGURES).pdf

$(FIGURES).pdf: $(FIGURES).tex $(FIG_IMAGES) $(FIG_FILES)
	pdflatex $<
	pdflatex $<

figures2up: $(FIGURES)-reduced.pdf

$(FIGURES)-reduced.pdf: $(FIGURES).pdf
	pdfnup $< --nup 2x1 --outfile $@

else

figures figures2up:
	$(call disabled_message,$@)

endif


################################################################################
#
# Build the test document.
#
test: test.pdf

test.pdf: test.tex


################################################################################
#
# Install the appropriate files on the web server. This relies on the
# environment variable HANDBOOK_INSTALL_ROOT being defined, and
# (assuming that this variable points to a directory on the network) the
# appropriate share has been mounted.
#
# See build_document_rules.make for an explanation of why the install
# uses a foreach.
#
# Note that this won't do anything clever if you give it files that are
# in subdirectories of the current directory. Everything will be flattened
# at the other end. That is, something like "images/foo.pdf" will go into
# the installation directory as "foo.pdf", not "images/foo.pdf".
#
install:
	@announce "Copying files to web server --- make sure that you have the share mounted!"
	@test -d $(HANDBOOK_INSTALL_ROOT)
	@mkdir -p $(INSTALL_DIRECTORY)
	@$(foreach f,$(INSTALL_FILES),if test ! -f $(INSTALL_DIRECTORY)/$(f) -o $(f) -nt $(INSTALL_DIRECTORY)/$(f); then echo "Installing $(f)"; cp $(f) $(INSTALL_DIRECTORY); fi;)


################################################################################
#
# Debugging: print the values of the standard variables.
#
debug:
	@announce Externally defined variables
	@echo "TEACHING_SHARED = [$(TEACHING_SHARED)]"
	@echo "HANDBOOK_INSTALL_ROOT = [$(HANDBOOK_INSTALL_ROOT)]"
	@echo "CHAPTER = [$(CHAPTER)]"
	@announce Internally defined variables
	@echo "SUBJECT_CODE = [$(SUBJECT_CODE)]"
	@echo "PAPER_NUMBER = [$(PAPER_NUMBER)]"
	@echo "GLOBAL_HANDBOOK_INCLUDE = [$(GLOBAL_HANDBOOK_INCLUDE)]"
	@echo "INSTALL_DIRECTORY = [$(INSTALL_DIRECTORY)]"
	@echo "INSTALL_FILES = [$(INSTALL_FILES)]"
	@echo "SLIDE_IMAGES = [$(SLIDE_IMAGES)]"
	@echo "SLIDE_BACKGROUNDS = [$(SLIDE_BACKGROUNDS)]"
	@echo "SLIDE_FILES = [$(SLIDE_FILES)]"
	@echo "FIG_IMAGES = [$(FIG_IMAGES)]"
	@echo "FIG_FILES = [$(FIG_FILES)]"
	@echo "TIDY_FILES = [$(TIDY_FILES)]"
	@echo "CLEAN_FILES = [$(CLEAN_FILES)]"
	@echo "DRAFT = [$(DRAFT)]"
	@echo "LATEX_OPTS = [$(LATEX_OPTS)]"
	@echo "SLIDES = [$(SLIDES)]"
	@echo "FIGURES = [$(FIGURES)]"
	@echo "COMBINED = [$(COMBINED)]"
	@echo "NOTES = [$(NOTES)]"
	@echo "SLIDES_PREREQS = [$(SLIDES_PREREQS)]"
	@echo "COMBINED_PREREQS = [$(COMBINED_PREREQS)]"
	@echo "TARGETS = [$(TARGETS)]"


################################################################################
#
# Clean up: get rid of all the temporary files.
#
tidy:
	rm -f $(TIDY_FILES)
#
# Clean up: get rid of everything except the original source.
#
clean: tidy
	rm -f $(CLEAN_FILES)


################################################################################
#
# List all "phony" build targets.
#
targets:
	@echo "targets: $(TARGETS)"


################################################################################
#
# Standard default rules.
#
include $(GLOBAL_HANDBOOK_INCLUDE)/standard_rules.make