1*5f1e34d9SAlexandre Perrin# $Id: dpadd.mk,v 1.18 2011/11/10 05:13:37 sjg Exp $ 2*5f1e34d9SAlexandre Perrin# 3*5f1e34d9SAlexandre Perrin# @(#) Copyright (c) 2004, Simon J. Gerraty 4*5f1e34d9SAlexandre Perrin# 5*5f1e34d9SAlexandre Perrin# This file is provided in the hope that it will 6*5f1e34d9SAlexandre Perrin# be of use. There is absolutely NO WARRANTY. 7*5f1e34d9SAlexandre Perrin# Permission to copy, redistribute or otherwise 8*5f1e34d9SAlexandre Perrin# use this file is hereby granted provided that 9*5f1e34d9SAlexandre Perrin# the above copyright notice and this notice are 10*5f1e34d9SAlexandre Perrin# left intact. 11*5f1e34d9SAlexandre Perrin# 12*5f1e34d9SAlexandre Perrin# Please send copies of changes and bug-fixes to: 13*5f1e34d9SAlexandre Perrin# sjg@crufty.net 14*5f1e34d9SAlexandre Perrin# 15*5f1e34d9SAlexandre Perrin 16*5f1e34d9SAlexandre Perrin.if !target(__${.PARSEFILE}__) 17*5f1e34d9SAlexandre Perrin__${.PARSEFILE}__: 18*5f1e34d9SAlexandre Perrin 19*5f1e34d9SAlexandre Perrin# sometimes we play games with .CURDIR etc 20*5f1e34d9SAlexandre Perrin# _* hold the original values of .* 21*5f1e34d9SAlexandre Perrin_OBJDIR?= ${.OBJDIR} 22*5f1e34d9SAlexandre Perrin_CURDIR?= ${.CURDIR} 23*5f1e34d9SAlexandre Perrin 24*5f1e34d9SAlexandre Perrin# DPLIBS helps us ensure we keep DPADD and LDADD in sync 25*5f1e34d9SAlexandre PerrinDPLIBS+= ${DPLIBS_LAST} 26*5f1e34d9SAlexandre PerrinDPADD+= ${DPLIBS} 27*5f1e34d9SAlexandre Perrin.for __lib in ${DPLIBS:T:R} 28*5f1e34d9SAlexandre PerrinLDADD+= ${LDADD_${__lib}:U${__lib:T:R:S/lib/-l/:C/\.so.*//}} 29*5f1e34d9SAlexandre Perrin.endfor 30*5f1e34d9SAlexandre Perrin 31*5f1e34d9SAlexandre Perrin# DPADD can contain things other than libs 32*5f1e34d9SAlexandre Perrin__dpadd_libs = ${DPADD:M*/lib*} 33*5f1e34d9SAlexandre Perrin 34*5f1e34d9SAlexandre Perrin# some libs have dependencies... 35*5f1e34d9SAlexandre Perrin# DPLIBS_* allows bsd.libnames.mk to flag libs which must be included 36*5f1e34d9SAlexandre Perrin# in DPADD for a given library. 37*5f1e34d9SAlexandre Perrin.for __lib in ${__dpadd_libs:@d@${DPLIBS_${d:T:R}}@} 38*5f1e34d9SAlexandre Perrin.if "${DPADD:M${__lib}}" == "" 39*5f1e34d9SAlexandre PerrinDPADD+= ${__lib} 40*5f1e34d9SAlexandre PerrinLDADD+= ${LDADD_${__lib}:U${__lib:T:R:S/lib/-l/:C/\.so.*//}} 41*5f1e34d9SAlexandre Perrin.endif 42*5f1e34d9SAlexandre Perrin.endfor 43*5f1e34d9SAlexandre Perrin# Last of all... for libc and libgcc 44*5f1e34d9SAlexandre PerrinDPADD+= ${DPADD_LAST} 45*5f1e34d9SAlexandre Perrin 46*5f1e34d9SAlexandre Perrin# Convert DPADD into -I and -L options and add them to CPPFLAGS and LDADD 47*5f1e34d9SAlexandre Perrin# For the -I's convert the path to a relative one. For separate objdirs 48*5f1e34d9SAlexandre Perrin# the DPADD paths will be to the obj tree so we need to subst anyway. 49*5f1e34d9SAlexandre Perrin 50*5f1e34d9SAlexandre Perrin# If USE_PROFILE is yes, then check for profiled versions of libs 51*5f1e34d9SAlexandre Perrin# and use them. 52*5f1e34d9SAlexandre Perrin 53*5f1e34d9SAlexandre PerrinUSE_PROFILE?=no 54*5f1e34d9SAlexandre Perrin.if defined(LIBDL) && exists(${LIBDL}) 55*5f1e34d9SAlexandre Perrin.if defined(PROG) && (make(${PROG}_p) || ${USE_PROFILE} == yes) && \ 56*5f1e34d9SAlexandre Perrin defined(LDFLAGS) && ${LDFLAGS:M-export-dynamic} 57*5f1e34d9SAlexandre Perrin# building profiled version of a prog that needs dlopen to work 58*5f1e34d9SAlexandre PerrinDPLIBS+= ${LIBDL} 59*5f1e34d9SAlexandre Perrin.endif 60*5f1e34d9SAlexandre Perrin.endif 61*5f1e34d9SAlexandre Perrin 62*5f1e34d9SAlexandre Perrin.if defined(LIBDMALLOC) && exists(${LIBDMALLOC}) 63*5f1e34d9SAlexandre Perrin.if defined(USE_DMALLOC) && ${USE_DMALLOC} != no 64*5f1e34d9SAlexandre Perrin.if !defined(NO_DMALLOC) 65*5f1e34d9SAlexandre PerrinCPPFLAGS+= -DUSE_DMALLOC 66*5f1e34d9SAlexandre Perrin.endif 67*5f1e34d9SAlexandre PerrinDPLIBS+= ${LIBDMALLOC} 68*5f1e34d9SAlexandre Perrin.endif 69*5f1e34d9SAlexandre Perrin.endif 70*5f1e34d9SAlexandre Perrin 71*5f1e34d9SAlexandre Perrin# Order -L's to seach ours first. 72*5f1e34d9SAlexandre Perrin# Avoids picking up old versions already installed. 73*5f1e34d9SAlexandre Perrin__dpadd_libdirs := ${__dpadd_libs:R:H:S/^/-L/g:O:u:N-L} 74*5f1e34d9SAlexandre PerrinLDADD += ${__dpadd_libdirs:M-L${OBJTOP}/*} 75*5f1e34d9SAlexandre PerrinLDADD += ${__dpadd_libdirs:N-L${OBJTOP}/*} 76*5f1e34d9SAlexandre Perrin 77*5f1e34d9SAlexandre Perrin.if ${.CURDIR} == ${SRCTOP} 78*5f1e34d9SAlexandre PerrinRELDIR=. 79*5f1e34d9SAlexandre PerrinRELTOP=. 80*5f1e34d9SAlexandre Perrin.else 81*5f1e34d9SAlexandre PerrinRELDIR?= ${.CURDIR:S,${SRCTOP}/,,} 82*5f1e34d9SAlexandre Perrin.if ${RELDIR} == ${.CURDIR} 83*5f1e34d9SAlexandre PerrinRELDIR?= ${.OBJDIR:S,${OBJTOP}/,,} 84*5f1e34d9SAlexandre Perrin.endif 85*5f1e34d9SAlexandre PerrinRELTOP?= ${RELDIR:C,[^/]+,..,g} 86*5f1e34d9SAlexandre Perrin.endif 87*5f1e34d9SAlexandre PerrinRELOBJTOP?= ${OBJTOP} 88*5f1e34d9SAlexandre PerrinRELSRCTOP?= ${SRCTOP} 89*5f1e34d9SAlexandre Perrin 90*5f1e34d9SAlexandre Perrin.if !make(dpadd) 91*5f1e34d9SAlexandre Perrin.ifdef LIB 92*5f1e34d9SAlexandre Perrin# Each lib is its own src_lib, we want to include it in SRC_LIBS 93*5f1e34d9SAlexandre Perrin# so that the correct INCLUDES_* will be picked up automatically. 94*5f1e34d9SAlexandre PerrinSRC_LIBS+= ${_OBJDIR}/lib${LIB}.a 95*5f1e34d9SAlexandre Perrin.endif 96*5f1e34d9SAlexandre Perrin.endif 97*5f1e34d9SAlexandre Perrin 98*5f1e34d9SAlexandre Perrin# 99*5f1e34d9SAlexandre Perrin# This little bit of magic, assumes that SRC_libfoo will be 100*5f1e34d9SAlexandre Perrin# set if it cannot be correctly derrived from ${LIBFOO} 101*5f1e34d9SAlexandre Perrin# Note that SRC_libfoo and INCLUDES_libfoo should be named for the 102*5f1e34d9SAlexandre Perrin# actual libary name not the variable name that might refer to it. 103*5f1e34d9SAlexandre Perrin# 99% of the time the two are the same, but the DPADD logic 104*5f1e34d9SAlexandre Perrin# only has the libary name available, so stick to that. 105*5f1e34d9SAlexandre Perrin# 106*5f1e34d9SAlexandre Perrin 107*5f1e34d9SAlexandre PerrinSRC_LIBS?= 108*5f1e34d9SAlexandre Perrin__dpadd_libs += ${SRC_LIBS} 109*5f1e34d9SAlexandre PerrinDPMAGIC_LIBS += ${__dpadd_libs} \ 110*5f1e34d9SAlexandre Perrin ${__dpadd_libs:@d@${DPMAGIC_LIBS_${d:T:R}}@} 111*5f1e34d9SAlexandre Perrin 112*5f1e34d9SAlexandre Perrin.for __lib in ${DPMAGIC_LIBS:O:u} 113*5f1e34d9SAlexandre Perrin# 114*5f1e34d9SAlexandre Perrin# if SRC_libfoo is not set, then we assume that the srcdir corresponding 115*5f1e34d9SAlexandre Perrin# to where we found the library is correct. 116*5f1e34d9SAlexandre Perrin# 117*5f1e34d9SAlexandre PerrinSRC_${__lib:T:R} ?= ${__lib:H:S,${OBJTOP},${RELSRCTOP},} 118*5f1e34d9SAlexandre Perrin# 119*5f1e34d9SAlexandre Perrin# This is a no-brainer but just to be complete... 120*5f1e34d9SAlexandre Perrin# 121*5f1e34d9SAlexandre PerrinOBJ_${__lib:T:R} ?= ${__lib:H:S,${OBJTOP},${RELOBJTOP},} 122*5f1e34d9SAlexandre Perrin# 123*5f1e34d9SAlexandre Perrin# If INCLUDES_libfoo is not set, then we'll use ${SRC_libfoo}/h if it exists, 124*5f1e34d9SAlexandre Perrin# else just ${SRC_libfoo}. 125*5f1e34d9SAlexandre Perrin# 126*5f1e34d9SAlexandre PerrinINCLUDES_${__lib:T:R}?= -I${exists(${SRC_${__lib:T:R}}/h):?${SRC_${__lib:T:R}}/h:${SRC_${__lib:T:R}}} 127*5f1e34d9SAlexandre Perrin 128*5f1e34d9SAlexandre Perrin.endfor 129*5f1e34d9SAlexandre Perrin 130*5f1e34d9SAlexandre Perrin# Now for the bits we actually need 131*5f1e34d9SAlexandre Perrin__dpadd_incs= 132*5f1e34d9SAlexandre Perrin.for __lib in ${__dpadd_libs:u} 133*5f1e34d9SAlexandre Perrin.if (make(${PROG}_p) || defined(NEED_GPROF)) && exists(${__lib:R}_p.a) 134*5f1e34d9SAlexandre Perrin__ldadd=-l${__lib:T:R:S,lib,,} 135*5f1e34d9SAlexandre PerrinLDADD := ${LDADD:S,^${__ldadd}$,${__ldadd}_p,g} 136*5f1e34d9SAlexandre Perrin.endif 137*5f1e34d9SAlexandre Perrin 138*5f1e34d9SAlexandre Perrin# 139*5f1e34d9SAlexandre Perrin# Some libs generate headers, so we potentially need both 140*5f1e34d9SAlexandre Perrin# the src dir and the obj dir. 141*5f1e34d9SAlexandre Perrin# If ${INCLUDES_libfoo} contains a word ending in /h, we assume that either 142*5f1e34d9SAlexandre Perrin# 1. it does not generate headers or 143*5f1e34d9SAlexandre Perrin# 2. INCLUDES_libfoo will have been set correctly 144*5f1e34d9SAlexandre Perrin# XXX it gets ugly avoiding duplicates... 145*5f1e34d9SAlexandre Perrin# use :? to ensure .for does not prevent correct evaluation 146*5f1e34d9SAlexandre Perrin# 147*5f1e34d9SAlexandre Perrin# We take care of duplicate suppression later. 148*5f1e34d9SAlexandre Perrin__dpadd_incs += ${"${INCLUDES_${__lib:T:R}:M*/h}":? :-I${OBJ_${__lib:T:R}}} 149*5f1e34d9SAlexandre Perrin__dpadd_incs += ${INCLUDES_${__lib:T:R}} 150*5f1e34d9SAlexandre Perrin.endfor 151*5f1e34d9SAlexandre Perrin 152*5f1e34d9SAlexandre Perrin# 153*5f1e34d9SAlexandre Perrin# eliminate any duplicates - but don't mess with the order 154*5f1e34d9SAlexandre Perrin# force evaluation now - to avoid giving make a headache 155*5f1e34d9SAlexandre Perrin# 156*5f1e34d9SAlexandre Perrin.for t in CFLAGS CXXFLAGS 157*5f1e34d9SAlexandre Perrin# avoid duplicates 158*5f1e34d9SAlexandre Perrin__$t_incs:=${$t:M-I*:O:u} 159*5f1e34d9SAlexandre Perrin.for i in ${__dpadd_incs} 160*5f1e34d9SAlexandre Perrin.if "${__$t_incs:M$i}" == "" 161*5f1e34d9SAlexandre Perrin$t+= $i 162*5f1e34d9SAlexandre Perrin__$t_incs+= $i 163*5f1e34d9SAlexandre Perrin.endif 164*5f1e34d9SAlexandre Perrin.endfor 165*5f1e34d9SAlexandre Perrin.endfor 166*5f1e34d9SAlexandre Perrin 167*5f1e34d9SAlexandre Perrin# This target is used to gather a list of 168*5f1e34d9SAlexandre Perrin# dir: ${DPADD} 169*5f1e34d9SAlexandre Perrin# entries 170*5f1e34d9SAlexandre Perrin.if make(*dpadd*) 171*5f1e34d9SAlexandre Perrin# allow overrides 172*5f1e34d9SAlexandre Perrin.-include "dpadd++.mk" 173*5f1e34d9SAlexandre Perrin 174*5f1e34d9SAlexandre Perrin.if !target(dpadd) 175*5f1e34d9SAlexandre Perrindpadd: .NOTMAIN 176*5f1e34d9SAlexandre Perrin.if defined(DPADD) && ${DPADD} != "" 177*5f1e34d9SAlexandre Perrin @echo "${RELDIR}: ${DPADD:S,${OBJTOP}/,,}" 178*5f1e34d9SAlexandre Perrin.endif 179*5f1e34d9SAlexandre Perrin.endif 180*5f1e34d9SAlexandre Perrin.endif 181*5f1e34d9SAlexandre Perrin 182*5f1e34d9SAlexandre Perrin.ifdef SRC_PATHADD 183*5f1e34d9SAlexandre Perrin# We don't want to assume that we need to .PATH every element of 184*5f1e34d9SAlexandre Perrin# SRC_LIBS, but the Makefile cannot do 185*5f1e34d9SAlexandre Perrin# .PATH: ${SRC_libfoo} 186*5f1e34d9SAlexandre Perrin# since the value of SRC_libfoo must be available at the time .PATH: 187*5f1e34d9SAlexandre Perrin# is read - and we only just worked it out. 188*5f1e34d9SAlexandre Perrin# Further, they can't wait until after include of {lib,prog}.mk as 189*5f1e34d9SAlexandre Perrin# the .PATH is needed before then. 190*5f1e34d9SAlexandre Perrin# So we let the Makefile do 191*5f1e34d9SAlexandre Perrin# SRC_PATHADD+= ${SRC_libfoo} 192*5f1e34d9SAlexandre Perrin# and we defer the .PATH: until now so that SRC_libfoo will be available. 193*5f1e34d9SAlexandre Perrin.PATH: ${SRC_PATHADD} 194*5f1e34d9SAlexandre Perrin.endif 195*5f1e34d9SAlexandre Perrin 196*5f1e34d9SAlexandre Perrin.endif 197