16a91b982SJohn Marino# $Id: dpadd.mk,v 1.19 2014/04/05 22:56:54 sjg Exp $ 25f1e34d9SAlexandre Perrin# 35f1e34d9SAlexandre Perrin# @(#) Copyright (c) 2004, Simon J. Gerraty 45f1e34d9SAlexandre Perrin# 55f1e34d9SAlexandre Perrin# This file is provided in the hope that it will 65f1e34d9SAlexandre Perrin# be of use. There is absolutely NO WARRANTY. 75f1e34d9SAlexandre Perrin# Permission to copy, redistribute or otherwise 85f1e34d9SAlexandre Perrin# use this file is hereby granted provided that 95f1e34d9SAlexandre Perrin# the above copyright notice and this notice are 105f1e34d9SAlexandre Perrin# left intact. 115f1e34d9SAlexandre Perrin# 125f1e34d9SAlexandre Perrin# Please send copies of changes and bug-fixes to: 135f1e34d9SAlexandre Perrin# sjg@crufty.net 145f1e34d9SAlexandre Perrin# 155f1e34d9SAlexandre Perrin 165f1e34d9SAlexandre Perrin.if !target(__${.PARSEFILE}__) 175f1e34d9SAlexandre Perrin__${.PARSEFILE}__: 185f1e34d9SAlexandre Perrin 195f1e34d9SAlexandre Perrin# sometimes we play games with .CURDIR etc 205f1e34d9SAlexandre Perrin# _* hold the original values of .* 215f1e34d9SAlexandre Perrin_OBJDIR?= ${.OBJDIR} 225f1e34d9SAlexandre Perrin_CURDIR?= ${.CURDIR} 235f1e34d9SAlexandre Perrin 245f1e34d9SAlexandre Perrin# DPLIBS helps us ensure we keep DPADD and LDADD in sync 255f1e34d9SAlexandre PerrinDPLIBS+= ${DPLIBS_LAST} 265f1e34d9SAlexandre PerrinDPADD+= ${DPLIBS} 275f1e34d9SAlexandre Perrin.for __lib in ${DPLIBS:T:R} 285f1e34d9SAlexandre PerrinLDADD+= ${LDADD_${__lib}:U${__lib:T:R:S/lib/-l/:C/\.so.*//}} 295f1e34d9SAlexandre Perrin.endfor 305f1e34d9SAlexandre Perrin 315f1e34d9SAlexandre Perrin# DPADD can contain things other than libs 325f1e34d9SAlexandre Perrin__dpadd_libs = ${DPADD:M*/lib*} 335f1e34d9SAlexandre Perrin 345f1e34d9SAlexandre Perrin# some libs have dependencies... 355f1e34d9SAlexandre Perrin# DPLIBS_* allows bsd.libnames.mk to flag libs which must be included 365f1e34d9SAlexandre Perrin# in DPADD for a given library. 375f1e34d9SAlexandre Perrin.for __lib in ${__dpadd_libs:@d@${DPLIBS_${d:T:R}}@} 385f1e34d9SAlexandre Perrin.if "${DPADD:M${__lib}}" == "" 395f1e34d9SAlexandre PerrinDPADD+= ${__lib} 405f1e34d9SAlexandre PerrinLDADD+= ${LDADD_${__lib}:U${__lib:T:R:S/lib/-l/:C/\.so.*//}} 415f1e34d9SAlexandre Perrin.endif 425f1e34d9SAlexandre Perrin.endfor 435f1e34d9SAlexandre Perrin# Last of all... for libc and libgcc 445f1e34d9SAlexandre PerrinDPADD+= ${DPADD_LAST} 455f1e34d9SAlexandre Perrin 465f1e34d9SAlexandre Perrin# Convert DPADD into -I and -L options and add them to CPPFLAGS and LDADD 475f1e34d9SAlexandre Perrin# For the -I's convert the path to a relative one. For separate objdirs 485f1e34d9SAlexandre Perrin# the DPADD paths will be to the obj tree so we need to subst anyway. 495f1e34d9SAlexandre Perrin 505f1e34d9SAlexandre Perrin# If USE_PROFILE is yes, then check for profiled versions of libs 515f1e34d9SAlexandre Perrin# and use them. 525f1e34d9SAlexandre Perrin 535f1e34d9SAlexandre PerrinUSE_PROFILE?=no 545f1e34d9SAlexandre Perrin.if defined(LIBDL) && exists(${LIBDL}) 555f1e34d9SAlexandre Perrin.if defined(PROG) && (make(${PROG}_p) || ${USE_PROFILE} == yes) && \ 565f1e34d9SAlexandre Perrin defined(LDFLAGS) && ${LDFLAGS:M-export-dynamic} 575f1e34d9SAlexandre Perrin# building profiled version of a prog that needs dlopen to work 585f1e34d9SAlexandre PerrinDPLIBS+= ${LIBDL} 595f1e34d9SAlexandre Perrin.endif 605f1e34d9SAlexandre Perrin.endif 615f1e34d9SAlexandre Perrin 625f1e34d9SAlexandre Perrin.if defined(LIBDMALLOC) && exists(${LIBDMALLOC}) 635f1e34d9SAlexandre Perrin.if defined(USE_DMALLOC) && ${USE_DMALLOC} != no 645f1e34d9SAlexandre Perrin.if !defined(NO_DMALLOC) 655f1e34d9SAlexandre PerrinCPPFLAGS+= -DUSE_DMALLOC 665f1e34d9SAlexandre Perrin.endif 675f1e34d9SAlexandre PerrinDPLIBS+= ${LIBDMALLOC} 685f1e34d9SAlexandre Perrin.endif 695f1e34d9SAlexandre Perrin.endif 705f1e34d9SAlexandre Perrin 716a91b982SJohn Marino# Order -L's to search ours first. 725f1e34d9SAlexandre Perrin# Avoids picking up old versions already installed. 735f1e34d9SAlexandre Perrin__dpadd_libdirs := ${__dpadd_libs:R:H:S/^/-L/g:O:u:N-L} 745f1e34d9SAlexandre PerrinLDADD += ${__dpadd_libdirs:M-L${OBJTOP}/*} 755f1e34d9SAlexandre PerrinLDADD += ${__dpadd_libdirs:N-L${OBJTOP}/*} 765f1e34d9SAlexandre Perrin 775f1e34d9SAlexandre Perrin.if ${.CURDIR} == ${SRCTOP} 785f1e34d9SAlexandre PerrinRELDIR=. 795f1e34d9SAlexandre PerrinRELTOP=. 805f1e34d9SAlexandre Perrin.else 815f1e34d9SAlexandre PerrinRELDIR?= ${.CURDIR:S,${SRCTOP}/,,} 825f1e34d9SAlexandre Perrin.if ${RELDIR} == ${.CURDIR} 835f1e34d9SAlexandre PerrinRELDIR?= ${.OBJDIR:S,${OBJTOP}/,,} 845f1e34d9SAlexandre Perrin.endif 855f1e34d9SAlexandre PerrinRELTOP?= ${RELDIR:C,[^/]+,..,g} 865f1e34d9SAlexandre Perrin.endif 875f1e34d9SAlexandre PerrinRELOBJTOP?= ${OBJTOP} 885f1e34d9SAlexandre PerrinRELSRCTOP?= ${SRCTOP} 895f1e34d9SAlexandre Perrin 905f1e34d9SAlexandre Perrin.if !make(dpadd) 915f1e34d9SAlexandre Perrin.ifdef LIB 925f1e34d9SAlexandre Perrin# Each lib is its own src_lib, we want to include it in SRC_LIBS 935f1e34d9SAlexandre Perrin# so that the correct INCLUDES_* will be picked up automatically. 945f1e34d9SAlexandre PerrinSRC_LIBS+= ${_OBJDIR}/lib${LIB}.a 955f1e34d9SAlexandre Perrin.endif 965f1e34d9SAlexandre Perrin.endif 975f1e34d9SAlexandre Perrin 985f1e34d9SAlexandre Perrin# 995f1e34d9SAlexandre Perrin# This little bit of magic, assumes that SRC_libfoo will be 1005f1e34d9SAlexandre Perrin# set if it cannot be correctly derrived from ${LIBFOO} 1015f1e34d9SAlexandre Perrin# Note that SRC_libfoo and INCLUDES_libfoo should be named for the 1026a91b982SJohn Marino# actual library name not the variable name that might refer to it. 1035f1e34d9SAlexandre Perrin# 99% of the time the two are the same, but the DPADD logic 1046a91b982SJohn Marino# only has the library name available, so stick to that. 1055f1e34d9SAlexandre Perrin# 1065f1e34d9SAlexandre Perrin 1075f1e34d9SAlexandre PerrinSRC_LIBS?= 1085f1e34d9SAlexandre Perrin__dpadd_libs += ${SRC_LIBS} 1095f1e34d9SAlexandre PerrinDPMAGIC_LIBS += ${__dpadd_libs} \ 1105f1e34d9SAlexandre Perrin ${__dpadd_libs:@d@${DPMAGIC_LIBS_${d:T:R}}@} 1115f1e34d9SAlexandre Perrin 1125f1e34d9SAlexandre Perrin.for __lib in ${DPMAGIC_LIBS:O:u} 1135f1e34d9SAlexandre Perrin# 1145f1e34d9SAlexandre Perrin# if SRC_libfoo is not set, then we assume that the srcdir corresponding 1155f1e34d9SAlexandre Perrin# to where we found the library is correct. 1165f1e34d9SAlexandre Perrin# 1175f1e34d9SAlexandre PerrinSRC_${__lib:T:R} ?= ${__lib:H:S,${OBJTOP},${RELSRCTOP},} 1185f1e34d9SAlexandre Perrin# 1195f1e34d9SAlexandre Perrin# This is a no-brainer but just to be complete... 1205f1e34d9SAlexandre Perrin# 1215f1e34d9SAlexandre PerrinOBJ_${__lib:T:R} ?= ${__lib:H:S,${OBJTOP},${RELOBJTOP},} 1225f1e34d9SAlexandre Perrin# 1235f1e34d9SAlexandre Perrin# If INCLUDES_libfoo is not set, then we'll use ${SRC_libfoo}/h if it exists, 1245f1e34d9SAlexandre Perrin# else just ${SRC_libfoo}. 1255f1e34d9SAlexandre Perrin# 1265f1e34d9SAlexandre PerrinINCLUDES_${__lib:T:R}?= -I${exists(${SRC_${__lib:T:R}}/h):?${SRC_${__lib:T:R}}/h:${SRC_${__lib:T:R}}} 1275f1e34d9SAlexandre Perrin 1285f1e34d9SAlexandre Perrin.endfor 1295f1e34d9SAlexandre Perrin 1305f1e34d9SAlexandre Perrin# Now for the bits we actually need 1315f1e34d9SAlexandre Perrin__dpadd_incs= 1325f1e34d9SAlexandre Perrin.for __lib in ${__dpadd_libs:u} 1335f1e34d9SAlexandre Perrin.if (make(${PROG}_p) || defined(NEED_GPROF)) && exists(${__lib:R}_p.a) 1345f1e34d9SAlexandre Perrin__ldadd=-l${__lib:T:R:S,lib,,} 1355f1e34d9SAlexandre PerrinLDADD := ${LDADD:S,^${__ldadd}$,${__ldadd}_p,g} 1365f1e34d9SAlexandre Perrin.endif 1375f1e34d9SAlexandre Perrin 1385f1e34d9SAlexandre Perrin# 1395f1e34d9SAlexandre Perrin# Some libs generate headers, so we potentially need both 1405f1e34d9SAlexandre Perrin# the src dir and the obj dir. 1415f1e34d9SAlexandre Perrin# If ${INCLUDES_libfoo} contains a word ending in /h, we assume that either 1425f1e34d9SAlexandre Perrin# 1. it does not generate headers or 1435f1e34d9SAlexandre Perrin# 2. INCLUDES_libfoo will have been set correctly 1445f1e34d9SAlexandre Perrin# XXX it gets ugly avoiding duplicates... 1455f1e34d9SAlexandre Perrin# use :? to ensure .for does not prevent correct evaluation 1465f1e34d9SAlexandre Perrin# 1475f1e34d9SAlexandre Perrin# We take care of duplicate suppression later. 1485f1e34d9SAlexandre Perrin__dpadd_incs += ${"${INCLUDES_${__lib:T:R}:M*/h}":? :-I${OBJ_${__lib:T:R}}} 1495f1e34d9SAlexandre Perrin__dpadd_incs += ${INCLUDES_${__lib:T:R}} 1505f1e34d9SAlexandre Perrin.endfor 1515f1e34d9SAlexandre Perrin 1525f1e34d9SAlexandre Perrin# 1535f1e34d9SAlexandre Perrin# eliminate any duplicates - but don't mess with the order 1545f1e34d9SAlexandre Perrin# force evaluation now - to avoid giving make a headache 1555f1e34d9SAlexandre Perrin# 1565f1e34d9SAlexandre Perrin.for t in CFLAGS CXXFLAGS 1575f1e34d9SAlexandre Perrin# avoid duplicates 1585f1e34d9SAlexandre Perrin__$t_incs:=${$t:M-I*:O:u} 1595f1e34d9SAlexandre Perrin.for i in ${__dpadd_incs} 1605f1e34d9SAlexandre Perrin.if "${__$t_incs:M$i}" == "" 1615f1e34d9SAlexandre Perrin$t+= $i 1625f1e34d9SAlexandre Perrin__$t_incs+= $i 1635f1e34d9SAlexandre Perrin.endif 1645f1e34d9SAlexandre Perrin.endfor 1655f1e34d9SAlexandre Perrin.endfor 1665f1e34d9SAlexandre Perrin 1675f1e34d9SAlexandre Perrin# This target is used to gather a list of 1685f1e34d9SAlexandre Perrin# dir: ${DPADD} 1695f1e34d9SAlexandre Perrin# entries 1705f1e34d9SAlexandre Perrin.if make(*dpadd*) 1715f1e34d9SAlexandre Perrin# allow overrides 1725f1e34d9SAlexandre Perrin.-include "dpadd++.mk" 1735f1e34d9SAlexandre Perrin 1745f1e34d9SAlexandre Perrin.if !target(dpadd) 1755f1e34d9SAlexandre Perrindpadd: .NOTMAIN 1765f1e34d9SAlexandre Perrin.if defined(DPADD) && ${DPADD} != "" 1775f1e34d9SAlexandre Perrin @echo "${RELDIR}: ${DPADD:S,${OBJTOP}/,,}" 1785f1e34d9SAlexandre Perrin.endif 1795f1e34d9SAlexandre Perrin.endif 1805f1e34d9SAlexandre Perrin.endif 1815f1e34d9SAlexandre Perrin 1825f1e34d9SAlexandre Perrin.ifdef SRC_PATHADD 1835f1e34d9SAlexandre Perrin# We don't want to assume that we need to .PATH every element of 1845f1e34d9SAlexandre Perrin# SRC_LIBS, but the Makefile cannot do 1855f1e34d9SAlexandre Perrin# .PATH: ${SRC_libfoo} 1865f1e34d9SAlexandre Perrin# since the value of SRC_libfoo must be available at the time .PATH: 1875f1e34d9SAlexandre Perrin# is read - and we only just worked it out. 1885f1e34d9SAlexandre Perrin# Further, they can't wait until after include of {lib,prog}.mk as 1895f1e34d9SAlexandre Perrin# the .PATH is needed before then. 1905f1e34d9SAlexandre Perrin# So we let the Makefile do 1915f1e34d9SAlexandre Perrin# SRC_PATHADD+= ${SRC_libfoo} 1925f1e34d9SAlexandre Perrin# and we defer the .PATH: until now so that SRC_libfoo will be available. 1935f1e34d9SAlexandre Perrin.PATH: ${SRC_PATHADD} 1945f1e34d9SAlexandre Perrin.endif 1955f1e34d9SAlexandre Perrin 1965f1e34d9SAlexandre Perrin.endif 197