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/hgTracks/makefile src/hg/hgTracks/makefile
index 3c7dcc4a522..a736f3f3a1f 100644
--- src/hg/hgTracks/makefile
+++ src/hg/hgTracks/makefile
@@ -1,68 +1,68 @@
 kentSrc = ../..
 include ../../inc/common.mk
 
 HG_INC += -I../../optimalLeaf
 L += ${MYSQLLIBS}
 MYLIBDIR = ../../lib/${MACHTYPE}
 MYLIBS =  ${MYLIBDIR}/jkhgapcgi.a ${MYLIBDIR}/jkhgap.a  ${MYLIBDIR}/jkweb.a ${MYLIBDIR}/optimalLeaf.a
 
 A = hgTracks
 RENDERA = hgRenderTracks
 
 COMMONO = adjacencyTrack.o pubsTracks.o altGraphXTrack.o bamTrack.o barChartTrack.o baseTrack.o bedGraph.o \
 	bedTrack.o  bigBedTrack.o bigRmskTrack.o bigWarn.o bigWigTrack.o \
 	chainTrack.o cgapSageTrack.o chromGraphTrack.o config.o container.o contigTrack.o \
 	coverageTrack.o cytoBandTrack.o cutterTrack.o decorator.o exportedDataHubs.o \
 	expRatioTracks.o factorSource.o hgTracks.o interactTrack.o \
 	gencodeTracks.o goldTrack.o gtexTracks.o gtexEqtlClusterTrack.o gvfTrack.o \
 	halSnakeTrack.o lollyTrack.o longRangeTrack.o loraxTrack.o loweLabTracks.o lrgTrack.o \
 	mafTrack.o myVariantsTrack.o menu.o mouseOver.o multiWig.o netTrack.o peptideAtlasTrack.o \
 	pslTrack.o quickLift.o recTrackSets.o rmskJoinedTrack.o rmskTrack.o \
 	sampleTracks.o searchTracks.o simpleTracks.o snake.o sortWig.o switchGear.o transMapTracks.o \
 	wabaTrack.o wigTrack.o cds.o \
 	wigMafTrack.o encode.o variation.o vcfTrack.o transcriptome.o\
 	rnaFoldTrack.o retroGene.o hapmapTrack.o rnaPLFoldTrack.o\
 	wiki.o wikiTrack.o imageV2.o extTools.o hicTrack.o heatmap.o
 
 O = mainMain.o ${COMMONO} 
 
 export RENDERO = renderMain.o ${COMMONO}
 
 include ../../inc/cgi_build_rules.mk
 
 ifeq (${GBROWSE}, 1)
   GBROWSE_D=-DGBROWSE
   A = gbrowseTest
   O = $A.o oneTrack.o \
       bedGraph.o cds.o chainTrack.o mafTrack.o netTrack.o pslTrack.o \
       simpleTracks.o wigMafTrack.o wigTrack.o imageV2.o
 else
   GBROWSE_D=
 endif
 
 %.o: %.c
-	${CC} ${COPT} ${CFLAGS} ${GBROWSE_D} ${LOWELAB_DEFS} ${HG_DEFS} ${HG_WARN} ${HG_INC} ${XINC} -o $@ -c $<
+	${CC} ${COPT} ${CFLAGS} ${GBROWSE_D} ${LOWELAB_DEFS} ${HG_DEFS} ${HG_WARN} ${HG_INC} ${XINC} ${DEPGEN} -o $@ -c $<
 
 mgsc: strip
 	mv $A ${CGI_BIN}/$A
 
 compile: compileMain ${RENDERA}
 
-compileMain: $O
+compileMain: $O ${MYLIBS}
 	${CC} ${CFLAGS} -o $A $O ${MYLIBS} ${L}
 	cp extTools.ra ${CGI_BIN_DEST}
 
 ${RENDERA}: ${RENDERO}
 	${MAKE} -f makefile.hgRenderTracks ${MAKECMDGOALS}
 
 wigTrack.o:	wigCommon.h
 bedGraph.o:	wigCommon.h
 
 switchGear.o:	switchGear.h
 cds.o:		cds.h
 hgTracks.o:	cds.h
 pslTrack.o:	cds.h
 
 clean::
 	rm -f ct_hgwdev_*.bed hgtIdeo_*.gif hgt_*.gif
 	rm -f ${RENDERA} ${RENDERO}