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