5f47cb8c328b76c41a9a21599477bfacf4d91a37
braney
  Sun Sep 6 16:57:16 2026 -0700
makefiles: let the compiler write the header dependencies

The tree had 72 hand-written "foo.o: bar.h" lines across 15 makefiles, so
almost every object was rebuilt only when its own .c file changed.  Editing a
header left every other object that included it holding the old layout, and the
crash landed somewhere the change never touched.

The %.o: %.c rule in inc/common.mk now passes -MMD -MP.  The compiler writes
foo.d beside foo.o listing the headers that compile really read, and an
-include reads them back.  Nine makefiles keep a compile rule of their own,
because they add -DGBROWSE, -DGFSERVER_HUGE or -DCGI_BIN=; each got ${DEPGEN}
too.  lib and hg/lib are the only two that build objects into a subdirectory,
and each reads its own subdirectory .d files at the foot of its own file.

Touching hg/hgTracks/wigCommon.h used to rebuild 2 objects.  It now rebuilds
11, which is every .c file in that directory that includes the header.

A .d file holds rules, and make takes its default goal from the first rule it
reads, included files and all.  common.mk is read before a makefile's own
rules, so the include has to save $(.DEFAULT_GOAL) and set it back afterwards;
without that, make in lib built adjacency.o and stopped.

Fifteen link rules in directories the build enters named a library on the
command line without depending on it.  Each now lists it.  hg/hgPhyloPlace,
hg/visiGene/hgVisiGene and hg/orthoMap were the three whose target is a real
file and could go stale.

make clean still leaves the .d files.  A shared clean:: rule in common.mk would
first mean converting about 320 single-colon clean: rules, since make refuses
to mix the two forms on one target.  A leftover .d cannot break a build: -MP
writes an empty target for each header, so a deleted or renamed one does not
leave make asking for a file no rule can build.

refs #36621

diff --git src/hg/nci60/makefile src/hg/nci60/makefile
index 89340f40ed8..b4348a1280b 100644
--- src/hg/nci60/makefile
+++ src/hg/nci60/makefile
@@ -1,20 +1,20 @@
 kentSrc = ../..
 include ../../inc/common.mk
 
 L += -lm $(MYSQLLIBS)
 MYLIBDIR = ../../lib/$(MACHTYPE)
 MYLIBS =  $(MYLIBDIR)/jkhgap.a $(MYLIBDIR)/jkweb.a $(L)
 
 O = findStanAlignments  stanToBedAndExpRecs
 
-%: %.c 
+%: %.c $(MYLIBDIR)/jkhgap.a $(MYLIBDIR)/jkweb.a
 	${CC} ${COPT} ${CFLAGS}  -Wimplicit  -I../inc -I../../inc  -o ${DESTDIR}${BINDIR}/$@ $(addsuffix .c,$@) $(MYLIBS) ${L}
 	${STRIP} ${DESTDIR}${BINDIR}/$@
 
 all: $(O)
 
 #$(O): %: %.c ../lib/$(ARCHTYPE)/libsugnet.a 
 #	${CC} ${COPT} ${CFLAGS} -Wimplicit  -I../inc -I$(KENT_DIR)/inc -I$(KENT_DIR)/hg/inc -o $@ $(addsuffix .c,$@)  $(SUGNET_LIBS) $(KENT_LIBS)
 
 clean::
 	rm -fr ${O} ${ARCHTYPE}