bsd.obj.mk revision 68151
11573Srgrimes# $FreeBSD: head/share/mk/bsd.obj.mk 68151 2000-11-01 07:09:38Z obrien $
21573Srgrimes#
31573Srgrimes# The include file <bsd.obj.mk> handles creating the 'obj' directory
41573Srgrimes# and cleaning up object files, etc.
51573Srgrimes#
61573Srgrimes# Under construction: it also contains the _SUBDIR target (which is used
71573Srgrimes# by most `mk' files to recurse into subdirectories) and defaults for the
8227753Stheraven# cleandepend, depend and tags targets.  It may eventually be merged with
9227753Stheraven# with bsd.subdir.mk.
10227753Stheraven#
11227753Stheraven# +++ variables +++
12227753Stheraven#
131573Srgrimes# CLEANDIRS	Additional directories to remove for the clean target.
141573Srgrimes#
151573Srgrimes# CLEANFILES	Additional files to remove for the clean target.
161573Srgrimes#
171573Srgrimes# MAKEOBJDIR 	A pathname for the directory where the targets 
181573Srgrimes#		are built.  Note: MAKEOBJDIR is an *enviroment* variable
191573Srgrimes#		and works properly only if set as an enviroment variable,
201573Srgrimes#		not as a global or command line variable!
21249808Semaste#
221573Srgrimes#		E.g. use `env MAKEOBJDIR=temp-obj make'
231573Srgrimes#
241573Srgrimes# MAKEOBJDIRPREFIX  Specifies somewhere other than /usr/obj to root the object
251573Srgrimes#		tree.  Note: MAKEOBJDIRPREFIX is an *enviroment* variable
261573Srgrimes#		and works properly only if set as an enviroment variable,
271573Srgrimes#		not as a global or command line variable!
281573Srgrimes#
291573Srgrimes#		E.g. use `env MAKEOBJDIRPREFIX=/somewhere/obj make'
301573Srgrimes#
311573Srgrimes# NOOBJ		Do not create object directories.  This should not be set
321573Srgrimes#		if anything is built.
331573Srgrimes#
341573Srgrimes# +++ targets +++
351573Srgrimes#
361573Srgrimes#	clean:
371573Srgrimes#		remove ${CLEANFILES}; remove ${CLEANDIRS} and all contents.
381573Srgrimes#
391573Srgrimes#	cleandir:
401573Srgrimes#		remove the build directory (and all its contents) created by obj
4192986Sobrien#
4292986Sobrien#	obj:
431573Srgrimes#		create build directory.
441573Srgrimes#
451573Srgrimes
461573Srgrimes.if defined(MAKEOBJDIRPREFIX)
471573SrgrimesCANONICALOBJDIR:=${MAKEOBJDIRPREFIX}${.CURDIR}
481573Srgrimes.else
491573SrgrimesCANONICALOBJDIR:=/usr/obj${.CURDIR}
5071579Sdeischen.endif
511573Srgrimes
521573Srgrimes#
5387113Sfenner# Warn of unorthodox object directory
54234531Sdas#
551573Srgrimesobjwarn:
5687490Sphantom.if !defined(NOOBJ) && ${.OBJDIR} != ${CANONICALOBJDIR}
5787113Sfenner.if ${.OBJDIR} == ${.CURDIR}
5887113Sfenner	@${ECHO} "Warning: Object directory not changed from original ${.CURDIR}"
591573Srgrimes.elif !defined(MAKEOBJDIR) && !defined(MAKEOBJDIRPREFIX)
601573Srgrimes	@${ECHO} "Warning: Using ${.OBJDIR} as object directory instead of\
611573Srgrimes		canonical ${CANONICALOBJDIR}"
62103633Stjr.endif
63153486Sphk.endif
641573Srgrimes
651573Srgrimes.if !target(obj)
66227753Stheraven.if defined(NOOBJ)
6771579Sdeischenobj:
681573Srgrimes.else
6971579Sdeischenobj:	_SUBDIR
701573Srgrimes	@if ! test -d ${CANONICALOBJDIR}/; then \
711573Srgrimes		mkdir -p ${CANONICALOBJDIR}; \
72180104Sdas		if ! test -d ${CANONICALOBJDIR}/; then \
731573Srgrimes			${ECHO} "Unable to create ${CANONICALOBJDIR}."; \
74227753Stheraven			exit 1; \
75227753Stheraven		fi; \
76187369Sdas		${ECHO} "${CANONICALOBJDIR} created for ${.CURDIR}"; \
77103633Stjr	fi
7816586Sjraynard.endif
79187277Sdas.endif
80187277Sdas
81187277Sdas.if !target(objlink)
82187582Sdasobjlink: _SUBDIR
83187582Sdas	@if test -d ${CANONICALOBJDIR}/; then \
84187582Sdas		rm -f ${.CURDIR}/obj; \
85187582Sdas		ln -s ${CANONICALOBJDIR} ${.CURDIR}/obj; \
86187582Sdas	else \
87187582Sdas		echo "No ${CANONICALOBJDIR} to link to - do a make obj."; \
88187582Sdas	fi
89187582Sdas.endif
90187582Sdas
911573Srgrimes#
92187582Sdas# where would that obj directory be?
93187582Sdas#
94187582Sdas.if !target(whereobj)
95187582Sdaswhereobj:
96187582Sdas	@echo ${.OBJDIR}
97227753Stheraven.endif
98187582Sdas
99187582Sdascleanobj:
100187582Sdas	@if [ -z "${MAKEOBJDIRPREFIX}" -a -d ${CANONICALOBJDIR}/ ]; then \
101227753Stheraven		rm -rf ${CANONICALOBJDIR}; \
102187582Sdas	else \
103187582Sdas		cd ${.CURDIR} && ${MAKE} clean cleandepend; \
104187582Sdas	fi
105187582Sdas	@if [ -h ${.CURDIR}/obj ]; then rm -f ${.CURDIR}/obj; fi
106187582Sdas
107187582Sdas.if !target(clean)
108187582Sdasclean: _SUBDIR
109187582Sdas.if defined(CLEANFILES) && !empty(CLEANFILES)
110187582Sdas	rm -f ${CLEANFILES} 
111187582Sdas.endif
112187582Sdas.if defined(CLEANDIRS) && !empty(CLEANDIRS)
113187582Sdas	rm -rf ${CLEANDIRS}
114187582Sdas.endif
115187582Sdas.endif
116187582Sdas
117187582Sdas.if !target(checkdpadd)
118187582Sdascheckdpadd: _SUBDIR
119187582Sdas.if (defined(DPADD) || defined(LDADD))
120187582Sdascheckdpadd:
121187582Sdas.if ${OBJFORMAT} != aout
122187582Sdas	@ldadd=`echo \`for lib in ${DPADD} ; do \
123187582Sdas		echo $$lib | sed 's;^/usr/lib/lib\(.*\)\.a;-l\1;' ; \
124187582Sdas	done \`` ; \
125187582Sdas	ldadd1=`echo ${LDADD}` ; \
126227753Stheraven	if [ "$$ldadd" != "$$ldadd1" ] ; then \
127187582Sdas		echo ${.CURDIR} ; \
128187582Sdas		echo "DPADD -> $$ldadd" ; \
129187582Sdas		echo "LDADD -> $$ldadd1" ; \
130227753Stheraven	fi
131187582Sdas.else
132187582Sdas	@dpadd=`echo \`ld -Bstatic -f ${LDDESTDIR} ${LDADD}\`` ; \
133187582Sdas	if [ "$$dpadd" != "${DPADD}" ] ; then \
134187582Sdas		echo ${.CURDIR} ; \
135187582Sdas		echo "LDADD -> $$dpadd" ; \
136187582Sdas		echo "DPADD =  ${DPADD}" ; \
137187582Sdas	fi
138187582Sdas.endif
139187582Sdas.endif
140227753Stheraven.endif
141187582Sdas
142227753Stheravencleandir: cleanobj _SUBDIR
143187582Sdas
144187582Sdas.for __target in cleandepend depend tags
145187582Sdas.if !target(${__target})
146187582Sdas${__target}: _SUBDIR
147187582Sdas.endif
148187582Sdas.endfor
149187582Sdas
150187582Sdas_SUBDIR: .USE
151187582Sdas.if defined(SUBDIR) && !empty(SUBDIR)
1521573Srgrimes	@for entry in ${SUBDIR}; do \
1531573Srgrimes		(${ECHODIR} "===> ${DIRPRFX}$$entry"; \
1541573Srgrimes		if test -d ${.CURDIR}/$${entry}.${MACHINE_ARCH}; then \
1551573Srgrimes			cd ${.CURDIR}/$${entry}.${MACHINE_ARCH}; \
156227753Stheraven		else \
1571573Srgrimes			cd ${.CURDIR}/$${entry}; \
15871579Sdeischen		fi; \
1591573Srgrimes		${MAKE} ${.TARGET:S/realinstall/install/:S/.depend/depend/} DIRPRFX=${DIRPRFX}$$entry/); \
1601573Srgrimes	done
1611573Srgrimes.endif
1621573Srgrimes