bsd.obj.mk revision 35789
1178481Sjb#	$Id: bsd.obj.mk,v 1.23 1998/03/14 14:08:29 bde Exp $
2178481Sjb#
3178481Sjb# The include file <bsd.obj.mk> handles creating the 'obj' directory
4178481Sjb# and cleaning up object files, etc.
5178481Sjb#
6178481Sjb# Under construction: it also contains the _SUBDIR target (which is used
7178481Sjb# by most `mk' files to recurse into subdirectories) and defaults for the
8178481Sjb# cleandepend, depend and tags targets.  It may eventually be merged with
9178481Sjb# with bsd.subdir.mk.
10178481Sjb#
11178481Sjb# +++ variables +++
12178481Sjb#
13178481Sjb# CLEANDIRS	Additional directories to remove for the clean target.
14178481Sjb#
15178481Sjb# CLEANFILES	Additional files to remove for the clean target.
16178481Sjb#
17178481Sjb# MAKEOBJDIR 	A pathname for the directory where the targets 
18178481Sjb#		are built.  Note: MAKEOBJDIR is an *enviroment* variable
19178481Sjb#		and works properly only if set as an enviroment variable,
20178481Sjb#		not as a global or command line variable!
21178481Sjb#
22178481Sjb#		E.g. use `env MAKEOBJDIR=temp-obj make'
23178481Sjb#
24178481Sjb# MAKEOBJDIRPREFIX  Specifies somewhere other than /usr/obj to root the object
25178481Sjb#		tree.  Note: MAKEOBJDIRPREFIX is an *enviroment* variable
26178481Sjb#		and works properly only if set as an enviroment variable,
27178481Sjb#		not as a global or command line variable!
28178481Sjb#
29178481Sjb#		E.g. use `env MAKEOBJDIRPREFIX=/somewhere/obj make'
30178481Sjb#
31178481Sjb# NOOBJ		Do not create object directories.  This should not be set
32178481Sjb#		if anything is built.
33178481Sjb#
34178481Sjb# OBJLINK	Create a symbolic link from ${.CURDIR}/obj to
35178481Sjb#		${CANONICALOBJDIR}.  Note: this BREAKS the read-only source
36178481Sjb#		tree rule!
37178481Sjb#
38178481Sjb# +++ targets +++
39178481Sjb#
40249656Sed#	clean:
41249656Sed#		remove ${CLEANFILES}; remove ${CLEANDIRS} and all contents.
42178481Sjb#
43178481Sjb#	cleandir:
44178481Sjb#		remove the build directory (and all its contents) created by obj
45178481Sjb#
46178481Sjb#	obj:
47178481Sjb#		create build directory.
48178481Sjb#
49178481Sjb
50178481Sjb.if defined(MAKEOBJDIRPREFIX)
51178481SjbCANONICALOBJDIR:=${MAKEOBJDIRPREFIX}${.CURDIR}
52178481Sjb.else
53178481SjbCANONICALOBJDIR:=/usr/obj${.CURDIR}
54178481Sjb.endif
55178481Sjb
56178481Sjb#
57178481Sjb# Warn of unorthodox object directory
58178481Sjb#
59178481Sjbobjwarn:
60178481Sjb.if !defined(NOOBJ) && ${.OBJDIR} != ${CANONICALOBJDIR}
61178481Sjb.if ${.OBJDIR} == ${.CURDIR}
62178481Sjb	@${ECHO} "Warning: Object directory not changed from original ${.CURDIR}"
63178481Sjb.elif !defined(MAKEOBJDIR) && !defined(MAKEOBJDIRPREFIX) && !defined(OBJLINK)
64178481Sjb	@${ECHO} "Warning: Using ${.OBJDIR} as object directory instead of\
65178481Sjb		canonical ${CANONICALOBJDIR}"
66178481Sjb.endif
67178481Sjb.endif
68178481Sjb
69178546Sjb.if !target(obj)
70178481Sjb.if defined(NOOBJ)
71178481Sjbobj:
72178481Sjb.else
73178481Sjb.if !defined(OBJLINK)
74178481Sjbobj:	_SUBDIR
75178481Sjb	@if ! test -d ${CANONICALOBJDIR}/; then \
76178481Sjb		mkdir -p ${CANONICALOBJDIR}; \
77178481Sjb		if ! test -d ${CANONICALOBJDIR}/; then \
78178481Sjb			${ECHO} "Unable to create ${CANONICALOBJDIR}."; \
79178481Sjb			exit 1; \
80178481Sjb		fi; \
81178481Sjb		${ECHO} "${CANONICALOBJDIR} created for ${.CURDIR}"; \
82178481Sjb	fi
83178481Sjb.else
84178481Sjbobj:	_SUBDIR
85178481Sjb	@if ! test -d ${CANONICALOBJDIR}/; then \
86178481Sjb		mkdir -p ${CANONICALOBJDIR}; \
87178481Sjb		if ! test -d ${CANONICALOBJDIR}/; then \
88178481Sjb			${ECHO} "Unable to create ${CANONICALOBJDIR}."; \
89178481Sjb			exit 1; \
90178481Sjb		fi; \
91178481Sjb		rm -f ${.CURDIR}/obj; \
92178481Sjb		ln -s ${CANONICALOBJDIR} ${.CURDIR}/obj; \
93178481Sjb		${ECHO} "${.CURDIR} -> ${CANONICALOBJDIR}"; \
94178481Sjb	fi
95178481Sjb.endif
96178481Sjb.endif
97178481Sjb.endif
98178481Sjb
99178481Sjb.if !target(objlink)
100178481Sjbobjlink: _SUBDIR
101178481Sjb	@if test -d ${CANONICALOBJDIR}/; then \
102178481Sjb		rm -f ${.CURDIR}/obj; \
103178481Sjb		ln -s ${CANONICALOBJDIR} ${.CURDIR}/obj; \
104178481Sjb	else \
105178481Sjb		echo "No ${CANONICALOBJDIR} to link to - do a make obj."; \
106178481Sjb	fi
107178546Sjb.endif
108178481Sjb
109178481Sjb#
110178481Sjb# where would that obj directory be?
111178481Sjb#
112178481Sjb.if !target(whereobj)
113178481Sjbwhereobj:
114249656Sed	@cd ${.CURDIR}; ${MAKE} -V .OBJDIR
115178481Sjb.endif
116178481Sjb
117178481Sjbcleanobj:
118178481Sjb	@if [ -d ${CANONICALOBJDIR}/ ]; then \
119178481Sjb		rm -rf ${CANONICALOBJDIR}; \
120178481Sjb	else \
121178481Sjb		cd ${.CURDIR} && ${MAKE} clean cleandepend; \
122178481Sjb	fi
123178481Sjb	@if [ -h ${.CURDIR}/obj ]; then rm -f ${.CURDIR}/obj; fi
124178481Sjb
125178481Sjb.if !target(clean)
126178481Sjbclean: _SUBDIR
127178481Sjb.if defined(CLEANFILES) && !empty(CLEANFILES)
128178481Sjb	rm -f ${CLEANFILES} 
129178481Sjb.endif
130178481Sjb.if defined(CLEANDIRS) && !empty(CLEANDIRS)
131249656Sed	rm -rf ${CLEANDIRS}
132178481Sjb.endif
133178481Sjb.endif
134178481Sjb
135178481Sjb.if !target(checkdpadd)
136178481Sjbcheckdpadd: _SUBDIR
137178481Sjb.if (defined(DPADD) || defined(LDADD))
138178481Sjbcheckdpadd:
139178481Sjb.if ${BINFORMAT} != aout
140178481Sjb	@ldadd=`echo \`for lib in ${DPADD} ; do \
141178481Sjb		echo $$lib | sed 's;^/usr/lib/lib\(.*\)\.a;-l\1;' ; \
142178481Sjb	done \`` ; \
143178481Sjb	ldadd1=`echo ${LDADD}` ; \
144178481Sjb	if [ "$$ldadd" != "$$ldadd1" ] ; then \
145178481Sjb		echo ${.CURDIR} ; \
146178481Sjb		echo "DPADD -> $$ldadd" ; \
147178481Sjb		echo "LDADD -> $$ldadd1" ; \
148178481Sjb	fi
149178481Sjb.else
150178481Sjb	@dpadd=`echo \`ld -Bstatic -f ${LDDESTDIR} ${LDADD}\`` ; \
151178481Sjb	if [ "$$dpadd" != "${DPADD}" ] ; then \
152178546Sjb		echo ${.CURDIR} ; \
153178481Sjb		echo "LDADD -> $$dpadd" ; \
154178481Sjb		echo "DPADD =  ${DPADD}" ; \
155178481Sjb	fi
156178481Sjb.endif
157178481Sjb.endif
158178481Sjb.endif
159178481Sjb
160178481Sjbcleandir: cleanobj _SUBDIR
161178481Sjb
162178481Sjb.for __target in cleandepend depend tags
163178481Sjb.if !target(${__target})
164178481Sjb${__target}: _SUBDIR
165178481Sjb.endif
166178481Sjb.endfor
167178481Sjb
168178481Sjb_SUBDIR: .USE
169178481Sjb.if defined(SUBDIR) && !empty(SUBDIR)
170178481Sjb	@for entry in ${SUBDIR}; do \
171178481Sjb		(${ECHODIR} "===> ${DIRPRFX}$$entry"; \
172178481Sjb		if test -d ${.CURDIR}/$${entry}.${MACHINE}; then \
173178481Sjb			cd ${.CURDIR}/$${entry}.${MACHINE}; \
174178481Sjb		else \
175178481Sjb			cd ${.CURDIR}/$${entry}; \
176178481Sjb		fi; \
177178481Sjb		${MAKE} ${.TARGET:S/realinstall/install/:S/.depend/depend/} DIRPRFX=${DIRPRFX}$$entry/); \
178178481Sjb	done
179178481Sjb.endif
180178481Sjb