################################################################################ # # 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 :) # ################################################################################ ################################################################################ # # Given that we print out our own messages, I see no point in splurging # "Entering...leaving directory" messages all over the screen. It's hard # enough to figure out what's going on already :) # MAKEFLAGS=--no-print-directory ################################################################################ # # 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)