bsd.obj.mk revision 38655
1#	$Id: bsd.obj.mk,v 1.25 1998/06/04 15:31:55 peter Exp $
2#
3# The include file <bsd.obj.mk> handles creating the 'obj' directory
4# and cleaning up object files, etc.
5#
6# Under construction: it also contains the _SUBDIR target (which is used
7# by most `mk' files to recurse into subdirectories) and defaults for the
8# cleandepend, depend and tags targets.  It may eventually be merged with
9# with bsd.subdir.mk.
10#
11# +++ variables +++
12#
13# CLEANDIRS	Additional directories to remove for the clean target.
14#
15# CLEANFILES	Additional files to remove for the clean target.
16#
17# MAKEOBJDIR 	A pathname for the directory where the targets 
18#		are built.  Note: MAKEOBJDIR is an *enviroment* variable
19#		and works properly only if set as an enviroment variable,
20#		not as a global or command line variable!
21#
22#		E.g. use `env MAKEOBJDIR=temp-obj make'
23#
24# MAKEOBJDIRPREFIX  Specifies somewhere other than /usr/obj to root the object
25#		tree.  Note: MAKEOBJDIRPREFIX is an *enviroment* variable
26#		and works properly only if set as an enviroment variable,
27#		not as a global or command line variable!
28#
29#		E.g. use `env MAKEOBJDIRPREFIX=/somewhere/obj make'
30#
31# NOOBJ		Do not create object directories.  This should not be set
32#		if anything is built.
33#
34# OBJLINK	Create a symbolic link from ${.CURDIR}/obj to
35#		${CANONICALOBJDIR}.  Note: this BREAKS the read-only source
36#		tree rule!
37#
38# +++ targets +++
39#
40#	clean:
41#		remove ${CLEANFILES}; remove ${CLEANDIRS} and all contents.
42#
43#	cleandir:
44#		remove the build directory (and all its contents) created by obj
45#
46#	obj:
47#		create build directory.
48#
49
50.if defined(MAKEOBJDIRPREFIX)
51CANONICALOBJDIR:=${MAKEOBJDIRPREFIX}${.CURDIR}
52.else
53CANONICALOBJDIR:=/usr/obj${.CURDIR}
54.endif
55
56#
57# Warn of unorthodox object directory
58#
59objwarn:
60.if !defined(NOOBJ) && ${.OBJDIR} != ${CANONICALOBJDIR}
61.if ${.OBJDIR} == ${.CURDIR}
62	@${ECHO} "Warning: Object directory not changed from original ${.CURDIR}"
63.elif !defined(MAKEOBJDIR) && !defined(MAKEOBJDIRPREFIX) && !defined(OBJLINK)
64	@${ECHO} "Warning: Using ${.OBJDIR} as object directory instead of\
65		canonical ${CANONICALOBJDIR}"
66.endif
67.endif
68
69.if !target(obj)
70.if defined(NOOBJ)
71obj:
72.else
73.if !defined(OBJLINK)
74obj:	_SUBDIR
75	@if ! test -d ${CANONICALOBJDIR}/; then \
76		mkdir -p ${CANONICALOBJDIR}; \
77		if ! test -d ${CANONICALOBJDIR}/; then \
78			${ECHO} "Unable to create ${CANONICALOBJDIR}."; \
79			exit 1; \
80		fi; \
81		${ECHO} "${CANONICALOBJDIR} created for ${.CURDIR}"; \
82	fi
83.else
84obj:	_SUBDIR
85	@if ! test -d ${CANONICALOBJDIR}/; then \
86		mkdir -p ${CANONICALOBJDIR}; \
87		if ! test -d ${CANONICALOBJDIR}/; then \
88			${ECHO} "Unable to create ${CANONICALOBJDIR}."; \
89			exit 1; \
90		fi; \
91		rm -f ${.CURDIR}/obj; \
92		ln -s ${CANONICALOBJDIR} ${.CURDIR}/obj; \
93		${ECHO} "${.CURDIR} -> ${CANONICALOBJDIR}"; \
94	fi
95.endif
96.endif
97.endif
98
99.if !target(objlink)
100objlink: _SUBDIR
101	@if test -d ${CANONICALOBJDIR}/; then \
102		rm -f ${.CURDIR}/obj; \
103		ln -s ${CANONICALOBJDIR} ${.CURDIR}/obj; \
104	else \
105		echo "No ${CANONICALOBJDIR} to link to - do a make obj."; \
106	fi
107.endif
108
109#
110# where would that obj directory be?
111#
112.if !target(whereobj)
113whereobj:
114	@echo ${.OBJDIR}
115.endif
116
117cleanobj:
118	@if [ -d ${CANONICALOBJDIR}/ ]; then \
119		rm -rf ${CANONICALOBJDIR}; \
120	else \
121		cd ${.CURDIR} && ${MAKE} clean cleandepend; \
122	fi
123	@if [ -h ${.CURDIR}/obj ]; then rm -f ${.CURDIR}/obj; fi
124
125.if !target(clean)
126clean: _SUBDIR
127.if defined(CLEANFILES) && !empty(CLEANFILES)
128	rm -f ${CLEANFILES} 
129.endif
130.if defined(CLEANDIRS) && !empty(CLEANDIRS)
131	rm -rf ${CLEANDIRS}
132.endif
133.endif
134
135.if !target(checkdpadd)
136checkdpadd: _SUBDIR
137.if (defined(DPADD) || defined(LDADD))
138checkdpadd:
139.if ${OBJFORMAT} != aout
140	@ldadd=`echo \`for lib in ${DPADD} ; do \
141		echo $$lib | sed 's;^/usr/lib/lib\(.*\)\.a;-l\1;' ; \
142	done \`` ; \
143	ldadd1=`echo ${LDADD}` ; \
144	if [ "$$ldadd" != "$$ldadd1" ] ; then \
145		echo ${.CURDIR} ; \
146		echo "DPADD -> $$ldadd" ; \
147		echo "LDADD -> $$ldadd1" ; \
148	fi
149.else
150	@dpadd=`echo \`ld -Bstatic -f ${LDDESTDIR} ${LDADD}\`` ; \
151	if [ "$$dpadd" != "${DPADD}" ] ; then \
152		echo ${.CURDIR} ; \
153		echo "LDADD -> $$dpadd" ; \
154		echo "DPADD =  ${DPADD}" ; \
155	fi
156.endif
157.endif
158.endif
159
160cleandir: cleanobj _SUBDIR
161
162.for __target in cleandepend depend tags
163.if !target(${__target})
164${__target}: _SUBDIR
165.endif
166.endfor
167
168_SUBDIR: .USE
169.if defined(SUBDIR) && !empty(SUBDIR)
170	@for entry in ${SUBDIR}; do \
171		(${ECHODIR} "===> ${DIRPRFX}$$entry"; \
172		if test -d ${.CURDIR}/$${entry}.${MACHINE}; then \
173			cd ${.CURDIR}/$${entry}.${MACHINE}; \
174		else \
175			cd ${.CURDIR}/$${entry}; \
176		fi; \
177		${MAKE} ${.TARGET:S/realinstall/install/:S/.depend/depend/} DIRPRFX=${DIRPRFX}$$entry/); \
178	done
179.endif
180