07639647efe6cfe6dbc643b8fae13c3dd153c528
markd
  Fri Jan 17 19:07:18 2025 -0800
work on docker utils build

diff --git src/inc/common.mk src/inc/common.mk
index c77d41d8676..58892a92fea 100644
--- src/inc/common.mk
+++ src/inc/common.mk
@@ -16,30 +16,43 @@
 endif
 ifneq (,$(findstring -,$(MACHTYPE)))
 #    $(info MACHTYPE has - sign ${MACHTYPE})
     MACHTYPE:=$(shell uname -m)
 #    $(info MACHTYPE has - sign set to: ${MACHTYPE})
 endif
 
 HG_DEFS=-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_GNU_SOURCE -DMACHTYPE_${MACHTYPE}
 HG_INC+=-I../inc -I../../inc -I../../../inc -I../../../../inc -I../../../../../inc -I$(kentSrc)/htslib
 
 # to check for Mac OSX Darwin specifics:
 UNAME_S := $(shell uname -s)
 # to check for builds on hgwdev
 HOSTNAME = $(shell uname -n)
 
+# Semi-static builds, normally done in Docker
+#
+# set SEMI_STATIC=yes to enable
+#  
+# These use static libraries except for -ldl, -lm, and -lc
+# which must be dynamic.
+#
+ifeq (${SEMI_STATIC},yes)
+    # switch to static libraries
+    STATIC_PRE = -Wl,-Bstatic
+endif
+L = ${STATIC_PRE}
+
 ifeq (${HOSTNAME},hgwdev)
   IS_HGWDEV = yes
   OURSTUFF = /cluster/software/r9
 else
   ifeq (${HOSTNAME},hgwdev-old.gi.ucsc.edu)
     IS_HGWDEV = yes
     OURSTUFF = /cluster/software
   else
      IS_HGWDEV = no
   endif
 endif
 
 ifeq (${ZLIB},)
   ifneq ($(wildcard /lib64/libz.a),)
     ZLIB=/lib64/libz.a
@@ -195,35 +208,30 @@
     HG_INC+=-I${HALDIR}/inc -I${HALDIR}/hal/blockViz/inc
 endif
 # on hgwdev, include HAL by defaults
 ifeq (${IS_HGWDEV},yes)
    L+=${HALLIBS}
 endif
 
 ifeq (${USE_HIC},)
     USE_HIC=1
 endif
 
 ifeq (${USE_HIC},1)
     HG_DEFS+=-DUSE_HIC
 endif
 
-# autodetect where libm is installed
-ifeq (${MLIB},)
-  MLIB=-lm
-endif
-
 # autodetect where png is installed
 ifeq (${PNGLIB},)
       PNGLIB := $(shell libpng-config --ldflags  || true)
 endif
 ifeq (${PNGLIB},)
   PNGLIB=-lpng
 endif
 ifeq (${PNGINCL},)
   PNGINCL := $(shell libpng-config --I_opts  || true)
 #       $(info using libpng-config to set PNGINCL: ${PNGINCL})
 endif
 
 # autodetect where mysql includes and libraries are installed
 # do not need to do this during 'clean' target (this is very slow for 'clean')
 ifneq ($(MAKECMDGOALS),clean)
@@ -235,31 +243,33 @@
   endif
   ifeq (${MYSQLINC},)
     ifneq ($(wildcard /usr/local/mysql/include/mysql.h),)
 	  MYSQLINC=/usr/local/mysql/include
     endif
   endif
   ifeq (${MYSQLINC},)
     ifneq ($(wildcard /usr/include/mysql/mysql.h),)
 	  MYSQLINC=/usr/include/mysql
     endif
   endif
 
   # this does *not* work on Mac OSX with the dynamic libraries
   ifneq ($(UNAME_S),Darwin)
     ifeq (${MYSQLLIBS},)
-      MYSQLLIBS := $(shell mysql_config --libs || true)
+      # mysql_config --libs includes -lm, however libm must be a dynamic library
+      # so to handle SEMI_STATIC it is removed here and will be added at the end
+      MYSQLLIBS := $(shell mysql_config --libs | sed 's/-lm$$//' || true)
 #        $(info using mysql_config to set MYSQLLIBS: ${MYSQLLIBS})
     endif
   endif
   ifeq ($(findstring src/hg/,${CURDIR}),src/hg/)
     ifeq (${MYSQLINC},)
         $(error can not find installed mysql development system)
     endif
   endif
   ifeq (${MYSQLLIBS},)
     ifneq ($(wildcard /usr/lib64/libmysqlclient.a),)
       MYSQLLIBS = /usr/lib64/libmysqlclient.a
     endif
   endif
     # last resort, hoping the compiler can find it in standard locations
   ifeq (${MYSQLLIBS},)
@@ -282,75 +292,82 @@
 
 ifeq (${BZ2LIB},)
   ifneq ($(wildcard /lib64/libbz2.a),)
     BZ2LIB=/lib64/libbz2.a
   else
     BZ2LIB=-lbz2
   endif
 endif
 
 # on hgwdev, use the static libraries
 ifeq (${IS_HGWDEV},yes)
    HG_INC += -I${OURSTUFF}/include
    HG_INC += -I${OURSTUFF}/include/mariadb 
    FULLWARN = yes
    L+=/hive/groups/browser/freetype/freetype-2.10.0/objs/.libs/libfreetype.a
-   L+=${OURSTUFF}/lib64/libssl.a ${OURSTUFF}/lib64/libcrypto.a -ldl
+   L+=${OURSTUFF}/lib64/libssl.a ${OURSTUFF}/lib64/libcrypto.a
 
    ifeq (${HOSTNAME},hgwdev)
        PNGLIB=${OURSTUFF}/lib/libpng.a
        PNGINCL=-I${OURSTUFF}/include/libpng16
    else
        PNGLIB=/usr/lib64/libpng.a
        PNGINCL=-I/usr/include/libpng15
    endif
 
    MYSQLINC=/usr/include/mysql
-   MYSQLLIBS=${OURSTUFF}/lib64/libmariadbclient.a ${OURSTUFF}/lib64/libssl.a ${OURSTUFF}/lib64/libcrypto.a -ldl ${ZLIB}
+   MYSQLLIBS=${OURSTUFF}/lib64/libmariadbclient.a ${OURSTUFF}/lib64/libssl.a ${OURSTUFF}/lib64/libcrypto.a ${ZLIB}
 
    ifeq (${HOSTNAME},hgwdev)
        MYSQLLIBS += /usr/lib/gcc/x86_64-redhat-linux/11/libstdc++.a /usr/lib64/librt.a
    else
        MYSQLLIBS += /usr/lib/gcc/x86_64-redhat-linux/4.8.5/libstdc++.a /usr/lib64/librt.a
    endif
 
 else
    ifeq (${CONDA_BUILD},1)
-       L+=${PREFIX}/lib/libssl.a ${PREFIX}/lib/libcrypto.a -ldl
+       L+=${PREFIX}/lib/libssl.a ${PREFIX}/lib/libcrypto.a
    else
        ifneq (${SSLLIB},)
           L+=${SSLLIB}
        else
           L+=-lssl
        endif
        ifneq (${CRYPTOLIB},)
           L+=${CRYPTOLIB}
        else
-          L+=-lcrypto -ldl
-       endif
-       ifeq (${DLLIB},)
-          L+=-ldl
+          L+=-lcrypto
        endif
    endif
 endif
 
 #global external libraries
 L += $(kentSrc)/htslib/libhts.a
-
 L+=${PNGLIB} ${MLIB} ${ZLIB} ${BZ2LIB} ${ICONVLIB}
 HG_INC+=${PNGINCL}
 
+# NOTE: these must be last libraries and must be dynamic.
+# We switched by to dynamic with SEMI_STATIC
+ifeq (${SEMI_STATIC},yes)
+    # switch back to dynamic libraries
+    DYNAMIC_PRE = -Wl,-Bdynamic
+endif
+DYNAMIC_LIBS =  ${DYNAMIC_PRE} -ldl -lm -lc
+
+L+= ${DYNAMIC_LIBS}
+
+
 # pass through COREDUMP
 ifneq (${COREDUMP},)
     HG_DEFS+=-DCOREDUMP
 endif
 
 # autodetect UCSC additional source code with password for some external tracks on gbib
 GBIBDIR = /hive/groups/browser/gbib/
 ifneq ($(wildcard ${GBIBDIR}/*.c),)
   HG_DEFS+=-DUSE_GBIB_PWD
   HG_INC += -I${GBIBDIR}
 endif
 
 SYS = $(shell uname -s)
 
 ifeq (${HG_WARN},)