Newer
Older
Handbook / make-includes / build_content_rules.make
################################################################################
#
# File: $Id$
#
# Standard variables and rules for building everything associated with a
# content file, including graphics and supporting files. Only content
# files that have such supporting files need to have (custom) rules
# defined for them, all other content files will be handled by make's
# default behaviour.
#
# Note that all versions of the graphics for a content file will be
# generated, regardless of whether we are building the web or print
# versions. This may seem a little wasteful, but there are two points to
# consider here:
# 
# 	1. At the time this makefile is executed, we have no easy way
# 	   to determine which "build mode" we are in. (It could be done
# 	   with exported variables from the parent makefile, but see below.)
# 
# 	2. This makefile will only be executed once for the document in
# 	   question anyway, because once make has processed the parent
# 	   file, that file will be considered "up-to-date", and make will
# 	   therefore not come back to it again, even though both the print
# 	   and web targets depend on it.
# 
# So, even if we just were clever enough to set up conditionals based on
# the "build mode", if we just went "make", we would almost certainly find
# that make would build either the web graphics only, or the print
# graphics only, but not both. We therefore leave this file as is, and
# build both web and print graphics regardless. It doesn't take that much
# longer anyway, especially since we won't be regenerating all of the
# graphics for _everything_ when only one file has changed :)
#
################################################################################


################################################################################
#
# Path to the build directory. This must be passed in from the calling
# environment. We don't default to the current directory because it makes
# it more difficult to clean up.
#
BUILD_DIR?=$(error The variable BUILD_DIR has not been defined)


################################################################################
#
# Paths. All original graphics should normally be in ./graphics or
# ./images (where . represents the current content directory), and derived
# versions should normally be placed in $(BUILD_DIR). If you want
# something different, write your own rules, you deviant!
#
vpath %-web.png $(BUILD_DIR)
vpath %-web-zoom.png $(BUILD_DIR)
# vpath %-web-hires.png $(BUILD_DIR)
vpath %-print.pdf $(BUILD_DIR)
vpath %.eps graphics images
vpath %-print.png $(BUILD_DIR)
vpath %.png graphics images


################################################################################
#
# List of possible targets. If you need to add to this for a specific
# case, use TARGETS+=xxx in the actual makefile.
#
TARGETS:=all clean web-clean print-clean targets debug

.PHONY: $(TARGETS)


################################################################################
#
# Default rule, for those who are misguided enough to try running a bare
# "make" on the makefile.
#
all:
	$(error You need to call this makefile with the name of a specific content file as the target)


################################################################################
#
# Build correctly cropped EPS (for printing) from original source EPS.
#
%-print.pdf: %.eps
	@announce "Generating $@ (print)"
	@ps2pdf -dEPSCrop -dNOCACHE $< $@
	@mv $@ $(BUILD_DIR)


################################################################################
#
# Build correctly cropped PNGs for web display from the original source
# EPS.
#
# It might seem to make more sense to generate the PNGs from the print
# EPS, which has already been appropriately cropped. However, the results
# of directory searches using vpath are rather unpredictable when the
# source file is not guaranteed to exist. If we depended on %-print.eps,
# which is generated by the rule above, it's not guaranteed that the file
# will exist at the time that make performs its directory search (which
# seems to be done statically). The source EPS isn't generated and can
# thus be guaranteed to always exist. Give me guaranteed correct operation
# over efficiency any day! :)
#
# Build 96 DPI version for normal web display
#
%-web.png: %.eps
	@announce "Generating $@ (web)"
	@gs -q -dNOPAUSE -dBATCH -dSAFER -sDEVICE=png16m -dEPSCrop -r96 \
		-dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sOutputFile=$@ $<
	@mv $@ $(BUILD_DIR)

#
# Build 144 DPI version for zoomed web display
#
%-web-zoom.png: %.eps
	@announce "Generating $@ (zoomed web)"
	@gs -q -dNOPAUSE -dBATCH -dSAFER -sDEVICE=png16m -dEPSCrop -r144 \
		-dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sOutputFile=$@ $<
	@mv $@ $(BUILD_DIR)

#
# Are 600 DPI versions even needed?? They don't seem to be used anywhere...
#
# %-web-hires.png: %.eps
# 	@announce "Generating $@ (600 dpi)"
# 	@gs -q -dNOPAUSE -dBATCH -dSAFER -sDEVICE=png16m -dEPSCrop -r600 \
# 		-dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sOutputFile=$@ $<
# 	@mv $@ $(BUILD_DIR)


################################################################################
#
# Some graphics start out as bitmaps (e.g., screenshots) and will
# therefore not have an EPS version. We assume that the source for such
# images is a PNG file instead. We don't need to generate anything; rather
# we just copy the original file to the build directory, because we're
# using PNG for the web version anyway, and PDFLaTeX supports PNG
# natively.
#
%-print.png: %.png
	@announce "Generating $@ (print)"
	@cp $< $(BUILD_DIR)/$@

%-web.png: %.png
	@announce "Generating $@ (web)"
	@cp $< $(BUILD_DIR)/$@



################################################################################
#
# Clean up. These targets are probably no longer needed, as the build
# versions are now generated in the build directory. There should
# consequently be no extraneous files floating around in the content
# directory that need to be cleaned.
#
# clean: web-clean print-clean
# 
# web-clean:
# 	rm -f *.png
# 
# print-clean:
# 	rm -f *.pdf


################################################################################
#
# Debugging information, mostly lists of the generated variables.
#
debug:
	@announce Externally defined variables
	@echo "TEACHING_SHARED = [$(TEACHING_SHARED)]"
	@echo "BUILD_DIR = [$(BUILD_DIR)]"
	@announce Internally defined variables
	@echo "GLOBAL_HANDBOOK_INCLUDE = [$(GLOBAL_HANDBOOK_INCLUDE)]"
	@echo "LOCAL_HANDBOOK_INCLUDE = [$(LOCAL_HANDBOOK_INCLUDE)]"


################################################################################
#
# Print out the list of targets. Handy for when you forget!
#
targets:
	@echo $(TARGETS)