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}