xref: /dragonfly/contrib/bmake/mk/dpadd.mk (revision 6a91b982)
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