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