+
+SAWSIM_MODS = $(NW_SAWSIM_MODS) $(FREE_SAWSIM_MODS)
+
+# Everything needed for sawsim under one roof. sawsim.c must come first
+SAWSIM_SRC = $(BUILD_DIR)/sawsim.c $(BUILD_DIR)/global.h \
+ $(SAWSIM_MODS:%=$(BUILD_DIR)/%.c) $(SAWSIM_MODS:%=$(BUILD_DIR)/%.h)
+# Libraries needed to compile sawsim
+LIBS = gsl gslcblas m
+CHECK_LIBS = gsl gslcblas m check
+# The non-check binaries generated
+BINS = sawsim tension_model_utils k_model_utils sawsim_profile
+DOCS = sawsim.pdf
+
+# Define the major targets
+all : ./Makefile $(BINS:%=$(BIN_DIR)/%) $(DOCS:%=$(DOC_DIR)/%) ;
+
+view : $(DOC_DIR)/sawsim.pdf
+ xpdf $< &
+profile : $(BIN_DIR)/sawsim_profile $(BIN_DIR)
+ $(BIN_DIR)/sawsim_profile -v1e-6 -Mhooke -A.05 -U1 -kkramers_integ \
+ -mnull -Mwlc -A0.39e-9,28e-9 -F8
+ gprof $(BIN_DIR)/sawsim_profile gmon.out > $@
+check : $(CHECK_BINS:%=$(BIN_DIR)/%) $(BIN_DIR)/check_sawsim
+ $(SHELL) -e -c 'for B in $^; do ./$$B; done'
+clean : $(CHECK_BINS:%=clean_%) clean_tension_model_utils \
+ clean_k_model_utils clean_latex
+ rm -f $(BIN_DIR)/sawsim $(BIN_DIR)/sawsim_static \
+ $(BIN_DIR)/sawsim_profile $(BUILD_DIR)/sawsim.c \
+ $(BUILD_DIR)/interp.c $(BUILD_DIR)/interp.h \
+ $(BUILD_DIR)/tavl.c $(BUILD_DIR)/tavl.h \
+ $(BUILD_DIR)/global.h ./gmon.out
+ $(SHELL) -e -c "rmdir $(BUILD_DIR) $(BIN_DIR) $(DOC_DIR)"
+
+# Various builds of sawsim
+$(BIN_DIR)/sawsim : $(SAWSIM_SRC) $(BIN_DIR)
+ gcc -g -o $@ $< $(SAWSIM_MODS:%=$(BUILD_DIR)/%.c) $(LIBS:%=-l%)
+$(BIN_DIR)/sawsim_static : $(SAWSIM_SRC) $(BIN_DIR)
+ gcc -g -static -o $@ $< $(SAWSIM_MODS:%=$(BUILD_DIR)/%.c) $(LIBS:%=-l%)
+$(BIN_DIR)/sawsim_profile : $(SAWSIM_SRC) $(BIN_DIR)
+ gcc -g -pg -o $@ $< $(SAWSIM_MODS:%=$(BUILD_DIR)/%.c) $(LIBS:%=-l%)
+
+# Create the directories
+$(BUILD_DIR) $(BIN_DIR) $(DOC_DIR) :
+ mkdir $@
+
+# Copy over the source external to sawsim
+# Note: Cannot use, for example, `./build', because make eats the `./'
+# and then $(BUILD_DIR) doesn't match in $$(subst $(BUILD_DIR), ...)
+.SECONDEXPANSION:
+$(FREE_SAWSIM_MODS:%=$(BUILD_DIR)/%.h) : $$(subst $(BUILD_DIR),$(SRC_DIR),$$@)\
+ $(BUILD_DIR)
+ cp -f $< $@
+.SECONDEXPANSION:
+$(FREE_SAWSIM_MODS:%=$(BUILD_DIR)/%.c) : $$(subst $(BUILD_DIR),$(SRC_DIR),$$@)\
+ $(BUILD_DIR)
+ cp -f $< $@
+
+## Basic source generated with noweb
+# The central files sawsim.c and global.h...
+$(BUILD_DIR)/sawsim.c : $(SRC_DIR)/sawsim.nw $(BUILD_DIR)
+ notangle $< > $@
+$(BUILD_DIR)/global.h : $(SRC_DIR)/sawsim.nw $(BUILD_DIR)
+ notangle -Rglobal.h $< > $@
+# ... and the modules
+$(NW_SAWSIM_MODS:%=$(BUILD_DIR)/%.h) : $(SRC_DIR)/sawsim.nw $(BUILD_DIR)
+ notangle -R$(subst _,-,$(@:$(BUILD_DIR)/%=%)) $< > $@
+$(NW_SAWSIM_MODS:%=$(BUILD_DIR)/%.c) : $(SRC_DIR)/sawsim.nw $(BUILD_DIR)
+ notangle -R$(subst _,-,$(@:$(BUILD_DIR)/%=%)) $< > $@
+$(CHECK_BINS:%=$(BUILD_DIR)/%.c) : $(SRC_DIR)/sawsim.nw $(BUILD_DIR)
+ notangle -R$(subst _,-,$(@:$(BUILD_DIR)/%=%)) $< > $@
+# Note: I use `_' as a space in my file names, but noweb doesn't like
+# that so we use `-' to name the noweb roots and substitute here.
+
+## Building the unit-test programs
+# for sawsim.c...
+$(BUILD_DIR)/check_sawsim.c : $(SRC_DIR)/sawsim.nw
+ notangle -Rchecks $< > $@
+$(BIN_DIR)/check_sawsim : $(BUILD_DIR)/check_sawsim.c $(BUILD_DIR)/global.h \
+ $(SAWSIM_MODS:%=$(BUILD_DIR)/%.c) \
+ $(SAWSIM_MODS:%=$(BUILD_DIR)/%.h) $(BIN_DIR)
+ gcc -g -o $@ $< $(SAWSIM_MODS:%=$(BUILD_DIR)/%.c) $(CHECK_LIBS:%=-l%)
+clean_check_sawsim :
+ rm -f $(BIN_DIR)/check_sawsim $(BUILD_DIR)/check_sawsim.c
+# ... and the modules
+.SECONDEXPANSION:
+$(CHECK_BINS:%=$(BIN_DIR)/%) : $$(subst $(BIN_DIR),$(BUILD_DIR),$$@).c \
+ $$(subst $(BIN_DIR)/check_,$(BUILD_DIR)/,$$@).c \
+ $$(subst $(BIN_DIR)/check_,$(BUILD_DIR)/,$$@).h \
+ $$(patsubst %,$(BUILD_DIR)/%.c,$$($$(subst $(BIN_DIR)/,,$$@_MODS)))\
+ $$(patsubst %,$(BUILD_DIR)/%.h,$$($$(subst $(BIN_DIR)/,,$$@_MODS)))\
+ $$(BUILD_DIR)/global.h $(BIN_DIR)
+ gcc -g -o $@ $< $(@:$(BIN_DIR)/check_%=$(BUILD_DIR)/%.c) \
+ $(patsubst %,$(BUILD_DIR)/%.c,$($(subst $(BIN_DIR)/,,$@_MODS)))\
+ $(CHECK_LIBS:%=-l%)
+# todo: clean up the required modules to
+$(CHECK_BINS:%=clean_%) :
+ rm -f $(@:clean_%=$(BIN_DIR)/%) $(@:clean_%=$(BUILD_DIR)/%.c)
+
+# Cleaning up the modules
+.SECONDEXPANSION:
+$(SAWSIM_MODS:%=clean_%) :
+ rm -f $(@:clean_%=$(BUILD_DIR)/%.c) $(@:clean_%=$(BUILD_DIR)/%.h)
+
+<<tension model utils makefile lines>>
+<<k model utils makefile lines>>