+clean :
+ rm -f *.tag *.o sample
+
+# The `.tag' mechanism allows for proper recompilation when a header file
+# changes, considering that some header files may include others.
+#
+# If a header file X includes other header
+# files Y and Z, we create a file X.tag that depends
+# on X, Y.tag, and Z.tag. Other headers that include X should
+# depend on X.tag.
+#
+# Suppose Y is subsequently changed. X doesn't get ``recompiled'',
+# but anything that includes X should be recompiled. Well, Y.tag becomes
+# out-of-date, so X.tag becomes out-of-date, so anything depending on X.tag
+# (that is, anything including X) becomes out-of-date. Magic!
+#
+# In this system, the tag files are empty files used only for their
+# timestamps. If one wished to use precompiled headers, one could use
+# ``.gch'' files exactly how ``.tag'' files are used now, except that
+# their contents would be meaningful.
+#
+# However, the same sort of ``deadly diamond'' problem that surfaces with
+# multiple inheritance also applies to precompiled headers. The ``#ifndef''
+# mechanism that prevents multiple inclusion doesn't work when headers are
+# compiled independently in a hierarchical structure, since the second
+# inclusion of a file won't even know there was a first inclusion. For
+# this reason, I just use ``.tag''s.