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},)