af126b8f0cf9ddc553a78869a3c820a4bd4fdc59 braney Mon Aug 17 13:36:13 2026 -0700 build: link the browser against zlib-ng instead of the system zlib, refs #38125 Adds zlib-ng as a second git submodule, alongside htslib, and points ZLIB at it. It is built with --zlib-compat, so the header and the symbol names are the ordinary zlib ones and no calling code has to change. Measured over the eight Recommended Track Set pages, hgTracks uses 29 percent less processor time and 26 percent less wall clock, and the image it produces is pixel identical. Writing the PNG is about three times faster and reading a bigBed data block about twice as fast, which is why the gain is larger than the image work alone would give. This also makes the platforms agree. x86_64 was linking a static /lib64/libz.a only because that file happened to be present, the arm64 Docker build fell through to a shared -lz, and Darwin was taking MacPorts zlib. All three now use the submodule. Verified on x86_64 Linux, aarch64 Linux and Apple silicon: zlib-ng builds, its own test suite passes, the makefiles pick it up, and bigBedToBed output is byte identical to before the change. diff --git src/makefile src/makefile index 5063b868a3a..de267ff054f 100644 --- src/makefile +++ src/makefile @@ -1,202 +1,210 @@ include inc/localEnvironment.mk include inc/common.mk all: utils cgi blatSuite alpha: clean ${MAKE} utils-alpha cgi-alpha blatSuite beta: check-beta clean ${MAKE} cgi-beta # do a git update and clean update: ${GIT} pull ${MAKE} clean ## # topLibs ## TOP_LIBS = lib parasol/lib submodules/htslib ifneq ($(wildcard jkOwnLib/*),) TOP_LIBS += jkOwnLib endif -topLibs: ${TOP_LIBS:%=%.topLibs} +topLibs: zlibNg ${TOP_LIBS:%=%.topLibs} %.topLibs: topChecks ${MAKE} -C $* +# zlib-ng is a submodule but it is not in TOP_LIBS, because its default target +# builds the shared library and the test programs too and we only link libz.a. +# Its Makefile is written by configure, which topChecks runs. refs #38125 +.PHONY: zlibNg +zlibNg: topChecks + ${MAKE} -C submodules/zlib-ng libz.a + .PHONY: topChecks topChecks: @./checkUmask.sh @./checkCompileFlags.sh @MACHTYPE=${MACHTYPE} ./machTest.sh @./submodules/submoduleSetup optLib: cd optimalLeaf && ${MAKE} ## # hgLib ## ifneq ($(wildcard hg/makefile),) HGLIB_DIRS += hg/lib HGLIB_CHECK = hgLibChecks endif ifneq ($(wildcard hg/cgilib/makefile),) HGLIB_DIRS += hg/cgilib endif hgLib: ${HGLIB_CHECK} | ${HGLIB_DIRS:%=%.hgLib} %.hgLib: ${MAKE} -C $* hgLibChecks: @./hg/sqlEnvTest.sh libs: topLibs hgLib optLib cgi: libs cd hg && ${MAKE} cgi cd utils/bedToBigBed && ${MAKE} cgi cgi-alpha: libs logUser cd hg && ${MAKE} alpha cd utils/bedToBigBed && ${MAKE} alpha cgi-beta: check-beta libs logUser cd hg && ${MAKE} beta cd utils/bedToBigBed && ${MAKE} beta # This log file can be useful when debugging problems on the alpha and beta builds. logUser: ifeq (${IS_HGWDEV},yes) echo ${USER}, $(MAKECMDGOALS), `date` >> ${CGI_BIN}/buildLog.txt endif check-beta: # this will fail if we are not in a beta checkout: ${GIT} branch | egrep '\* v[0-9]+_branch' > /dev/null BLAT_SUITE_DIRS = blat gfClient gfServer webBlat hg/pslPretty hg/pslReps \ hg/pslSort utils/nibFrag utils/faToNib utils/faToTwoBit utils/twoBitToFa \ utils/twoBitInfo isPcr blatz blatSuite: ${BLAT_SUITE_DIRS:%=%.blatSuite} %.blatSuite: topLibs hgLib ${MAKE} -C $* # all of these application makefiles have been updated to include use # of DESTDIR and BINDIR # common subdirs uses by multiple targets STD_DIRS = ameme index dnaDust protDust weblet aladdin primeMate fuse meta tagStorm \ tabFile parasol blat USER_APP_DIRS = utils parasol hg hg/utils \ hg/makeDb tabFile ALMOST_USER_APP_DIRS = blat gfClient gfServer isPcr ameme index/ixIxx utils/userApps .PHONY: userApps userApps: ${USER_APP_DIRS:%=%.userApps} ${ALMOST_USER_APP_DIRS:%=%.almostUserApps} %.userApps: topLibs hgLib destBin ${MAKE} -C $* userApps # these dont have userApps targets %.almostUserApps: topLibs hgLib destBin ${MAKE} -C $* destBin: ${MKDIR} ${DESTBINDIR} CLEAN_DIRS = ${STD_DIRS} lib hg jkOwnLib submodules/htslib utils webBat isPcr clean: ${CLEAN_DIRS:%=%.clean} + if [ -e submodules/zlib-ng/Makefile ] ; then ${MAKE} -C submodules/zlib-ng clean ; fi find . -name \*.o -print | xargs --no-run-if-empty rm rm -f tags TAGS rm -f cscope.out cscope.files cscope.po.out %.clean: if [ -e "$*/makefile" ] ; then ${MAKE} -C $* clean ; fi TEST_DIRS = blat gfServer hg lib utils test:: $(TEST_DIRS:%=%.test) %.test: if test -d $* ; then ${MAKE} -C $* test; fi LIB_TAGS_IN = lib/*.[hc] */lib/*.[hc] */*/lib/*.[hc] */*/*/lib/*.[hc] jkOwnLib/*.c \ inc/*.h */inc/*.h */*/inc/*.h */*/*/inc/*.h */cgilib/*.[hc] # build tags for libraries .PHONY: tags tags: ctags ${LIB_TAGS_IN} cscope.out: find `pwd` -name '*.c' -o -name '*.h' > cscope.files cscope -qRb `cat cscope.files` search: cscope.out cscope -d # build emacs tags for libraries .PHONY: etags etags: etags ${LIB_TAGS_IN} # build tags for all files .PHONY: tags-all tags-all: find . -name '*.[ch]' | grep -v "/userApps/" | ctags -L - # build emacs tags for all files .PHONY: etags-all etags-all: find . -name '*.[ch]' | etags - UTILS_DIRS = ${DIRS} utils .PHONY: utils utils: ${UTILS_DIRS:%=%.utils} ${STD_DIRS:%=%.utils} %.utils: libs destBin hgutils @${MKDIR} ${SCRIPTS} ${MAKE} -C $* utils-alpha: ${UTILS_DIRS:%=%.utils-alpha} %.utils-alpha: libs destBin hgutils if [ -e "$*/makefile" ] ; then ${MAKE} -C $* ; fi hgutils: libs destBin cd hg && ${MAKE} utils ## cellar archive for obsolete programs cellarDirs = cdnaAli getgene idbQuery reformat scanIntrons tracks wormAli \ xenoAli buildCellar: $(cellarDirs:%=%.cellar) %.cellar: libs destBin cd $* && echo $* && $(MAKE) cleanCellar: $(cellarDirs:%=%.cellarClean) %.cellarClean: cd $* && echo $* && $(MAKE) clean ## top level target for everything html related DOCS_LIST = hg/htdocs hg/js hg/htdocs/style doc: ${DOCS_LIST:%=%.docuser} %.docuser: cd $* && $(MAKE) doc-alpha: ${DOCS_LIST:%=%.docalpha} %.docalpha: cd $* && $(MAKE) alpha doc-beta: ${DOCS_LIST:%=%.docbeta} %.docbeta: cd $* && $(MAKE) beta doc-install: ${DOCS_LIST:%=%.docinstall} %.docinstall: cd $* && $(MAKE) install