xref: /freebsd-src/share/mk/bsd.obj.mk (revision d0b2dbfa0ecf2bbc9709efc5e20baf8e4b44bbbf)
144d97e5bSWolfram Schneider#
22986df98SBruce Evans# The include file <bsd.obj.mk> handles creating the 'obj' directory
3939d5a3dSBruce Evans# and cleaning up object files, etc.
444d97e5bSWolfram Schneider#
544d97e5bSWolfram Schneider# +++ variables +++
644d97e5bSWolfram Schneider#
70f608029SBruce Evans# CLEANDIRS	Additional directories to remove for the clean target.
80f608029SBruce Evans#
90f608029SBruce Evans# CLEANFILES	Additional files to remove for the clean target.
10125e8ffdSWolfram Schneider#
112986df98SBruce Evans# MAKEOBJDIR 	A pathname for the directory where the targets
1293329c3cSRuslan Ermilov#		are built.  Note: MAKEOBJDIR is an *environment* variable
1393329c3cSRuslan Ermilov#		and works properly only if set as an environment variable,
142986df98SBruce Evans#		not as a global or command line variable!
152986df98SBruce Evans#
162986df98SBruce Evans#		E.g. use `env MAKEOBJDIR=temp-obj make'
172986df98SBruce Evans#
182986df98SBruce Evans# MAKEOBJDIRPREFIX  Specifies somewhere other than /usr/obj to root the object
1993329c3cSRuslan Ermilov#		tree.  Note: MAKEOBJDIRPREFIX is an *environment* variable
2093329c3cSRuslan Ermilov#		and works properly only if set as an environment variable,
212986df98SBruce Evans#		not as a global or command line variable!
22125e8ffdSWolfram Schneider#
23b3618bcfSSteven Wallace#		E.g. use `env MAKEOBJDIRPREFIX=/somewhere/obj make'
2444d97e5bSWolfram Schneider#
25e653b48cSRuslan Ermilov# NO_OBJ	Do not create object directories.  This should not be set
262986df98SBruce Evans#		if anything is built.
2744d97e5bSWolfram Schneider#
2844d97e5bSWolfram Schneider# +++ targets +++
2944d97e5bSWolfram Schneider#
3044d97e5bSWolfram Schneider#	clean:
310f608029SBruce Evans#		remove ${CLEANFILES}; remove ${CLEANDIRS} and all contents.
3244d97e5bSWolfram Schneider#
3344d97e5bSWolfram Schneider#	cleandir:
34cd9a2f5cSJordan K. Hubbard#		remove the build directory (and all its contents) created by obj
3544d97e5bSWolfram Schneider#
3644d97e5bSWolfram Schneider#	obj:
37cd9a2f5cSJordan K. Hubbard#		create build directory.
3844d97e5bSWolfram Schneider#
39accb7fafSWolfram Schneider
402bdaf7e8SRuslan Ermilov.if !target(__<bsd.obj.mk>__)
412bdaf7e8SRuslan Ermilov__<bsd.obj.mk>__:
422bdaf7e8SRuslan Ermilov.include <bsd.own.mk>
432bdaf7e8SRuslan Ermilov
44aba77dddSBryan Drewery# This is also done in bsd.init.mk
45fa65e3a5SBryan Drewery.if defined(NO_OBJ) && ${.OBJDIR} != ${.CURDIR}
46e5b44e37SSimon J. Gerraty# but this makefile does not want it!
47e5b44e37SSimon J. Gerraty.OBJDIR: ${.CURDIR}
48e5b44e37SSimon J. Gerraty.endif
49*33ae1ff7SBryan Drewery.if ${MK_AUTO_OBJ} == "yes"
50*33ae1ff7SBryan Drewery# it is done by now
51*33ae1ff7SBryan Dreweryobjwarn: .PHONY
52*33ae1ff7SBryan Dreweryobj: .PHONY
53*33ae1ff7SBryan DreweryCANONICALOBJDIR= ${.OBJDIR}
5482d38881SBryan Drewery# Handle special case where SRCS is full-pathed and requires
5582d38881SBryan Drewery# nested objdirs.  This duplicates some auto.obj.mk logic.
5682d38881SBryan Drewery.if (!empty(SRCS:M*/*) || !empty(DPSRCS:M*/*)) && \
57b00a5bd5SBryan Drewery    (${.TARGETS} == "" || ${.TARGETS:Nclean*:N*clean:Ndestroy*} != "") && \
58b00a5bd5SBryan Drewery    !make(print-dir) && empty(.MAKEFLAGS:M-[nN])
5982d38881SBryan Drewery_wantdirs=	${SRCS:M*/*:H} ${DPSRCS:M*/*:H}
6082d38881SBryan Drewery.if !empty(_wantdirs)
6182d38881SBryan Drewery_wantdirs:=	${_wantdirs:O:u}
6282d38881SBryan Drewery_needdirs=
6382d38881SBryan Drewery.for _dir in ${_wantdirs}
6482d38881SBryan Drewery.if !exists(${.OBJDIR}/${_dir}/)
6582d38881SBryan Drewery_needdirs+=	${_dir}
6682d38881SBryan Drewery.endif
6782d38881SBryan Drewery.endfor
6882d38881SBryan Drewery.endif
6982d38881SBryan Drewery.if !empty(_needdirs)
7082d38881SBryan Drewery#_mkneededdirs!=	umask ${OBJDIR_UMASK:U002}; ${Mkdirs} ${_needdirs}
7182d38881SBryan Drewery__objdir_made != umask ${OBJDIR_UMASK:U002}; ${Mkdirs}; \
7282d38881SBryan Drewery	for dir in ${_needdirs}; do \
7382d38881SBryan Drewery	  dir=${.OBJDIR}/$${dir}; \
7482d38881SBryan Drewery	  ${ECHO_TRACE} "[Creating nested objdir $${dir}...]" >&2; \
7582d38881SBryan Drewery          Mkdirs $${dir}; \
7682d38881SBryan Drewery	done
7782d38881SBryan Drewery.endif
7882d38881SBryan Drewery.endif	# !empty(SRCS:M*/*) || !empty(DPSRCS:M*/*)
79dfa09989SBryan Drewery.elif !empty(MAKEOBJDIRPREFIX)
80b3618bcfSSteven WallaceCANONICALOBJDIR:=${MAKEOBJDIRPREFIX}${.CURDIR}
817750ad47SMarcel Moolenaar.elif defined(MAKEOBJDIR) && ${MAKEOBJDIR:M/*} != ""
827750ad47SMarcel MoolenaarCANONICALOBJDIR:=${MAKEOBJDIR}
8311ffa20fSBryan DreweryOBJTOP?= ${MAKEOBJDIR}
84b3618bcfSSteven Wallace.else
85b3618bcfSSteven WallaceCANONICALOBJDIR:=/usr/obj${.CURDIR}
86b3618bcfSSteven Wallace.endif
87b3618bcfSSteven Wallace
88c6d98d62SBryan Drewery.if defined(SRCTOP) && defined(RELDIR) && \
89d949e92aSBryan Drewery    (${CANONICALOBJDIR} == /${RELDIR} || ${.OBJDIR} == /${RELDIR})
90968be8a7SBryan Drewery.error .OBJDIR incorrectly set to /${RELDIR}
91968be8a7SBryan Drewery.endif
92968be8a7SBryan Drewery
9311ffa20fSBryan DreweryOBJTOP?= ${.OBJDIR:S,${.CURDIR},,}${SRCTOP}
9411ffa20fSBryan Drewery
95b3618bcfSSteven Wallace#
962b1f35a9SRuslan Ermilov# Warn of unorthodox object directory.
972b1f35a9SRuslan Ermilov#
982b1f35a9SRuslan Ermilov# The following directories are tried in order for ${.OBJDIR}:
992b1f35a9SRuslan Ermilov#
1002b1f35a9SRuslan Ermilov# 1.  ${MAKEOBJDIRPREFIX}/`pwd`
1012b1f35a9SRuslan Ermilov# 2.  ${MAKEOBJDIR}
1022b1f35a9SRuslan Ermilov# 3.  obj.${MACHINE}
1032b1f35a9SRuslan Ermilov# 4.  obj
1042b1f35a9SRuslan Ermilov# 5.  /usr/obj/`pwd`
1052b1f35a9SRuslan Ermilov# 6.  ${.CURDIR}
1062b1f35a9SRuslan Ermilov#
1072b1f35a9SRuslan Ermilov# If ${.OBJDIR} is constructed using canonical cases 1 or 5, or
1082b1f35a9SRuslan Ermilov# case 2 (using MAKEOBJDIR), don't issue a warning.  Otherwise,
1092b1f35a9SRuslan Ermilov# issue a warning differentiating between cases 6 and (3 or 4).
110b3618bcfSSteven Wallace#
11185ec5050SBryan Dreweryobjwarn: .PHONY
112e653b48cSRuslan Ermilov.if !defined(NO_OBJ) && ${.OBJDIR} != ${CANONICALOBJDIR} && \
1132b1f35a9SRuslan Ermilov    !(defined(MAKEOBJDIRPREFIX) && exists(${CANONICALOBJDIR}/)) && \
1142b1f35a9SRuslan Ermilov    !(defined(MAKEOBJDIR) && exists(${MAKEOBJDIR}/))
115b3618bcfSSteven Wallace.if ${.OBJDIR} == ${.CURDIR}
11632b11525SPeter Wemm	@${ECHO} "Warning: Object directory not changed from original ${.CURDIR}"
1172b1f35a9SRuslan Ermilov.elif exists(${.CURDIR}/obj.${MACHINE}/) || exists(${.CURDIR}/obj/)
11832b11525SPeter Wemm	@${ECHO} "Warning: Using ${.OBJDIR} as object directory instead of\
119b3618bcfSSteven Wallace		canonical ${CANONICALOBJDIR}"
120b3618bcfSSteven Wallace.endif
121b3618bcfSSteven Wallace.endif
1221bd4272fSBryan Drewerybeforebuild: objwarn
123accb7fafSWolfram Schneider
124e653b48cSRuslan Ermilov.if !defined(NO_OBJ)
125c1c9929eSRuslan Ermilov.if !target(obj)
126b5db19d0SRuslan Ermilovobj: .PHONY
127409ac84cSBruce Evans	@if ! test -d ${CANONICALOBJDIR}/; then \
128b3618bcfSSteven Wallace		mkdir -p ${CANONICALOBJDIR}; \
129409ac84cSBruce Evans		if ! test -d ${CANONICALOBJDIR}/; then \
130b3618bcfSSteven Wallace			${ECHO} "Unable to create ${CANONICALOBJDIR}."; \
131cd9a2f5cSJordan K. Hubbard			exit 1; \
132accb7fafSWolfram Schneider		fi; \
133b3618bcfSSteven Wallace		${ECHO} "${CANONICALOBJDIR} created for ${.CURDIR}"; \
134cd9a2f5cSJordan K. Hubbard	fi
13510757290SDimitry Andric.for dir in ${SRCS:H:O:u} ${DPSRCS:H:O:u}
136cee9be49SDimitry Andric	@if ! test -d ${CANONICALOBJDIR}/${dir}/; then \
137cee9be49SDimitry Andric		mkdir -p ${CANONICALOBJDIR}/${dir}; \
138cee9be49SDimitry Andric		if ! test -d ${CANONICALOBJDIR}/${dir}/; then \
139cee9be49SDimitry Andric			${ECHO} "Unable to create ${CANONICALOBJDIR}/${dir}."; \
140cee9be49SDimitry Andric			exit 1; \
141cee9be49SDimitry Andric		fi; \
142cee9be49SDimitry Andric		${ECHO} "${CANONICALOBJDIR}/${dir} created for ${.CURDIR}"; \
143cee9be49SDimitry Andric	fi
144cee9be49SDimitry Andric.endfor
145accb7fafSWolfram Schneider.endif
146cd9a2f5cSJordan K. Hubbard
147760a0960SBruce Evans.if !target(objlink)
14813ea0779SBryan Dreweryobjlink: .PHONY
149760a0960SBruce Evans	@if test -d ${CANONICALOBJDIR}/; then \
150760a0960SBruce Evans		rm -f ${.CURDIR}/obj; \
151760a0960SBruce Evans		ln -s ${CANONICALOBJDIR} ${.CURDIR}/obj; \
152760a0960SBruce Evans	else \
153760a0960SBruce Evans		echo "No ${CANONICALOBJDIR} to link to - do a make obj."; \
154760a0960SBruce Evans	fi
155760a0960SBruce Evans.endif
15684aac273SHartmut Brandt.endif # !defined(NO_OBJ)
157760a0960SBruce Evans
158fe51f270SWolfram Schneider#
159120a0656SPaul Traina# where would that obj directory be?
160120a0656SPaul Traina#
161120a0656SPaul Traina.if !target(whereobj)
16213ea0779SBryan Drewerywhereobj: .PHONY
1630b3f8389SPeter Wemm	@echo ${.OBJDIR}
164120a0656SPaul Traina.endif
165120a0656SPaul Traina
16613353986SBryan Drewery# Same check in bsd.progs.mk
167b284f322SBryan Drewery.if ${CANONICALOBJDIR} != ${.CURDIR} && exists(${CANONICALOBJDIR}/) && \
168b284f322SBryan Drewery    (${MK_AUTO_OBJ} == "no" || ${.TARGETS:Nclean*:N*clean:Ndestroy*} == "")
16913ea0779SBryan Drewerycleanobj: .PHONY
1702ae97682SBryan Drewery	-rm -rf ${CANONICALOBJDIR}
171d79f28bbSRuslan Ermilov.else
17213ea0779SBryan Drewerycleanobj: .PHONY clean cleandepend
173d79f28bbSRuslan Ermilov.endif
174b5cdcc00SKris Kennaway	@if [ -L ${.CURDIR}/obj ]; then rm -f ${.CURDIR}/obj; fi
175fe51f270SWolfram Schneider
1767750ad47SMarcel Moolenaar# Tell bmake not to look for generated files via .PATH
17749217bc5SSimon J. GerratyNOPATH_FILES+=	${CLEANFILES}
17849217bc5SSimon J. Gerraty.if !empty(NOPATH_FILES)
17949217bc5SSimon J. Gerraty.NOPATH: ${NOPATH_FILES}
1807750ad47SMarcel Moolenaar.endif
1817750ad47SMarcel Moolenaar
182fe51f270SWolfram Schneider.if !target(clean)
18313ea0779SBryan Dreweryclean: .PHONY
184939d5a3dSBruce Evans.if defined(CLEANFILES) && !empty(CLEANFILES)
185939d5a3dSBruce Evans	rm -f ${CLEANFILES}
186939d5a3dSBruce Evans.endif
1870f608029SBruce Evans.if defined(CLEANDIRS) && !empty(CLEANDIRS)
188bd808d41SWarner Losh	-rm -rf ${CLEANDIRS}
1890f608029SBruce Evans.endif
190fe51f270SWolfram Schneider.endif
191190348aeSBryan Drewery.ORDER: clean all
192b284f322SBryan Drewery.if ${MK_AUTO_OBJ} == "yes"
193b284f322SBryan Drewery.ORDER: cleanobj all
194b284f322SBryan Drewery.ORDER: cleandir all
195b284f322SBryan Drewery.endif
196fe51f270SWolfram Schneider
197b25a566dSRuslan Ermilov.include <bsd.subdir.mk>
1982bdaf7e8SRuslan Ermilov
19913ea0779SBryan Drewerycleandir: .PHONY .WAIT cleanobj
20001ba2b63SBryan Drewery
20147f881afSSimon J. Gerraty.if make(destroy*) && defined(OBJROOT)
202dccf7cedSSimon J. Gerraty# this (rm -rf objdir) is much faster and more reliable than cleaning.
20347f881afSSimon J. Gerraty
20447f881afSSimon J. Gerraty# just in case we are playing games with these...
20547f881afSSimon J. Gerraty_OBJDIR?= ${.OBJDIR}
20647f881afSSimon J. Gerraty_CURDIR?= ${.CURDIR}
20747f881afSSimon J. Gerraty
20809cd1cf1SSimon J. Gerraty# destroy almost everything
20913ea0779SBryan Drewerydestroy: .PHONY destroy-all
21013ea0779SBryan Drewerydestroy-all: .PHONY
21109cd1cf1SSimon J. Gerraty
21209cd1cf1SSimon J. Gerraty# just remove our objdir
21313ea0779SBryan Drewerydestroy-arch: .PHONY .NOMETA
21447f881afSSimon J. Gerraty.if ${_OBJDIR} != ${_CURDIR}
21547f881afSSimon J. Gerraty	cd ${_CURDIR} && rm -rf ${_OBJDIR}
21647f881afSSimon J. Gerraty.endif
21747f881afSSimon J. Gerraty
21809cd1cf1SSimon J. Gerraty.if defined(HOST_OBJTOP)
21909cd1cf1SSimon J. Gerratydestroy-host: destroy.host
22013ea0779SBryan Drewerydestroy.host: .PHONY .NOMETA
22109cd1cf1SSimon J. Gerraty	cd ${_CURDIR} && rm -rf ${HOST_OBJTOP}/${RELDIR:N.}
22209cd1cf1SSimon J. Gerraty.endif
22347f881afSSimon J. Gerraty
22409cd1cf1SSimon J. Gerraty.if make(destroy-all) && ${RELDIR} == "."
22509cd1cf1SSimon J. Gerratydestroy-all: destroy-stage
22609cd1cf1SSimon J. Gerraty.endif
22709cd1cf1SSimon J. Gerraty
22809cd1cf1SSimon J. Gerraty# remove the stage tree
22913ea0779SBryan Drewerydestroy-stage: .PHONY .NOMETA
23009cd1cf1SSimon J. Gerraty.if defined(STAGE_ROOT)
23109cd1cf1SSimon J. Gerraty	cd ${_CURDIR} && rm -rf ${STAGE_ROOT}
23209cd1cf1SSimon J. Gerraty.endif
23309cd1cf1SSimon J. Gerraty
23409cd1cf1SSimon J. Gerraty# allow parallel destruction
235005cfa50SSimon J. Gerraty_destroy_machine_list = common host ${ALL_MACHINE_LIST}
236005cfa50SSimon J. Gerraty.for m in ${_destroy_machine_list:O:u}
23747f881afSSimon J. Gerratydestroy-all: destroy.$m
23809cd1cf1SSimon J. Gerraty.if !target(destroy.$m)
23913ea0779SBryan Drewerydestroy.$m: .PHONY .NOMETA
24009cd1cf1SSimon J. Gerraty.if ${_OBJDIR} != ${_CURDIR}
24147f881afSSimon J. Gerraty	cd ${_CURDIR} && rm -rf ${OBJROOT}$m*/${RELDIR:N.}
24247f881afSSimon J. Gerraty.endif
24309cd1cf1SSimon J. Gerraty.endif
24409cd1cf1SSimon J. Gerraty.endfor
24547f881afSSimon J. Gerraty
24647f881afSSimon J. Gerraty.endif
24747f881afSSimon J. Gerraty
24884aac273SHartmut Brandt.endif # !target(__<bsd.obj.mk>__)
249