bsd.obj.mk revision 252048
155714Skris# $FreeBSD: stable/9/share/mk/bsd.obj.mk 252048 2013-06-20 22:50:08Z sjg $
255714Skris#
355714Skris# The include file <bsd.obj.mk> handles creating the 'obj' directory
455714Skris# and cleaning up object files, etc.
555714Skris#
655714Skris# +++ variables +++
755714Skris#
855714Skris# CLEANDIRS	Additional directories to remove for the clean target.
955714Skris#
1055714Skris# CLEANFILES	Additional files to remove for the clean target.
1155714Skris#
1255714Skris# MAKEOBJDIR 	A pathname for the directory where the targets
1355714Skris#		are built.  Note: MAKEOBJDIR is an *environment* variable
1455714Skris#		and works properly only if set as an environment variable,
1555714Skris#		not as a global or command line variable!
1655714Skris#
1755714Skris#		E.g. use `env MAKEOBJDIR=temp-obj make'
1855714Skris#
1955714Skris# MAKEOBJDIRPREFIX  Specifies somewhere other than /usr/obj to root the object
2055714Skris#		tree.  Note: MAKEOBJDIRPREFIX is an *environment* variable
2155714Skris#		and works properly only if set as an environment variable,
2255714Skris#		not as a global or command line variable!
2355714Skris#
2455714Skris#		E.g. use `env MAKEOBJDIRPREFIX=/somewhere/obj make'
2555714Skris#
2655714Skris# NO_OBJ	Do not create object directories.  This should not be set
2755714Skris#		if anything is built.
2855714Skris#
2955714Skris# +++ targets +++
3055714Skris#
3155714Skris#	clean:
3255714Skris#		remove ${CLEANFILES}; remove ${CLEANDIRS} and all contents.
3355714Skris#
3455714Skris#	cleandir:
3555714Skris#		remove the build directory (and all its contents) created by obj
3655714Skris#
3755714Skris#	obj:
3855714Skris#		create build directory.
3955714Skris#
4055714Skris
4155714Skris.if !target(__<bsd.obj.mk>__)
4255714Skris__<bsd.obj.mk>__:
4355714Skris.include <bsd.own.mk>
4455714Skris
4555714Skris.if defined(MAKEOBJDIRPREFIX)
4655714SkrisCANONICALOBJDIR:=${MAKEOBJDIRPREFIX}${.CURDIR}
4755714Skris.elif defined(MAKEOBJDIR) && ${MAKEOBJDIR:M/*} != ""
4855714SkrisCANONICALOBJDIR:=${MAKEOBJDIR}
4955714Skris.else
5055714SkrisCANONICALOBJDIR:=/usr/obj${.CURDIR}
5155714Skris.endif
5255714Skris
5355714Skris#
5455714Skris# Warn of unorthodox object directory.
5555714Skris#
5655714Skris# The following directories are tried in order for ${.OBJDIR}:
5755714Skris#
5855714Skris# 1.  ${MAKEOBJDIRPREFIX}/`pwd`
5955714Skris# 2.  ${MAKEOBJDIR}
6055714Skris# 3.  obj.${MACHINE}
6155714Skris# 4.  obj
6255714Skris# 5.  /usr/obj/`pwd`
6355714Skris# 6.  ${.CURDIR}
6455714Skris#
6555714Skris# If ${.OBJDIR} is constructed using canonical cases 1 or 5, or
6655714Skris# case 2 (using MAKEOBJDIR), don't issue a warning.  Otherwise,
6755714Skris# issue a warning differentiating between cases 6 and (3 or 4).
6855714Skris#
6955714Skrisobjwarn:
7055714Skris.if !defined(NO_OBJ) && ${.OBJDIR} != ${CANONICALOBJDIR} && \
7155714Skris    !(defined(MAKEOBJDIRPREFIX) && exists(${CANONICALOBJDIR}/)) && \
7255714Skris    !(defined(MAKEOBJDIR) && exists(${MAKEOBJDIR}/))
7355714Skris.if ${.OBJDIR} == ${.CURDIR}
7455714Skris	@${ECHO} "Warning: Object directory not changed from original ${.CURDIR}"
7555714Skris.elif exists(${.CURDIR}/obj.${MACHINE}/) || exists(${.CURDIR}/obj/)
7655714Skris	@${ECHO} "Warning: Using ${.OBJDIR} as object directory instead of\
7755714Skris		canonical ${CANONICALOBJDIR}"
7855714Skris.endif
7955714Skris.endif
8055714Skris
8155714Skris.if !defined(NO_OBJ)
8255714Skris.if !target(obj)
8355714Skrisobj: .PHONY
8455714Skris	@if ! test -d ${CANONICALOBJDIR}/; then \
8555714Skris		mkdir -p ${CANONICALOBJDIR}; \
8655714Skris		if ! test -d ${CANONICALOBJDIR}/; then \
8755714Skris			${ECHO} "Unable to create ${CANONICALOBJDIR}."; \
8855714Skris			exit 1; \
8955714Skris		fi; \
9055714Skris		${ECHO} "${CANONICALOBJDIR} created for ${.CURDIR}"; \
9155714Skris	fi
9255714Skris.endif
9355714Skris
9455714Skris.if !target(objlink)
9555714Skrisobjlink:
9655714Skris	@if test -d ${CANONICALOBJDIR}/; then \
9755714Skris		rm -f ${.CURDIR}/obj; \
9855714Skris		ln -s ${CANONICALOBJDIR} ${.CURDIR}/obj; \
99	else \
100		echo "No ${CANONICALOBJDIR} to link to - do a make obj."; \
101	fi
102.endif
103.endif # !defined(NO_OBJ)
104
105#
106# where would that obj directory be?
107#
108.if !target(whereobj)
109whereobj:
110	@echo ${.OBJDIR}
111.endif
112
113.if ${CANONICALOBJDIR} != ${.CURDIR} && exists(${CANONICALOBJDIR}/)
114cleanobj:
115	@rm -rf ${CANONICALOBJDIR}
116.else
117cleanobj: clean cleandepend
118.endif
119	@if [ -L ${.CURDIR}/obj ]; then rm -f ${.CURDIR}/obj; fi
120
121# Tell bmake not to look for generated files via .PATH
122.if !empty(CLEANFILES)
123.NOPATH: ${CLEANFILES}
124.endif
125
126.if !target(clean)
127clean:
128.if defined(CLEANFILES) && !empty(CLEANFILES)
129	rm -f ${CLEANFILES}
130.endif
131.if defined(CLEANDIRS) && !empty(CLEANDIRS)
132	rm -rf ${CLEANDIRS}
133.endif
134.endif
135
136cleandir: cleanobj
137
138.include <bsd.subdir.mk>
139
140.endif # !target(__<bsd.obj.mk>__)
141