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