| 1 | # $FreeBSD: src/share/mk/bsd.obj.mk,v 1.30.2.10 2003/02/15 05:36:25 kris Exp $ |
| 2 | # |
| 3 | # The include file <bsd.obj.mk> handles creating the 'obj' directory |
| 4 | # and cleaning up object files, etc. |
| 5 | # |
| 6 | # +++ variables +++ |
| 7 | # |
| 8 | # CLEANDIRS Additional directories to remove for the clean target. |
| 9 | # |
| 10 | # CLEANFILES Additional files to remove for the clean target. |
| 11 | # |
| 12 | # MAKEOBJDIR A pathname for the directory where the targets |
| 13 | # are built. Note: MAKEOBJDIR is an *environment* variable |
| 14 | # and works properly only if set as an environment variable, |
| 15 | # not as a global or command line variable! |
| 16 | # |
| 17 | # E.g. use `env MAKEOBJDIR=temp-obj make' |
| 18 | # |
| 19 | # MAKEOBJDIRPREFIX Specifies somewhere other than /usr/obj to root the object |
| 20 | # tree. Note: MAKEOBJDIRPREFIX is an *environment* variable |
| 21 | # and works properly only if set as an environment variable, |
| 22 | # not as a global or command line variable! |
| 23 | # |
| 24 | # E.g. use `env MAKEOBJDIRPREFIX=/somewhere/obj make' |
| 25 | # |
| 26 | # NOOBJ Do not create object directories. This should not be set |
| 27 | # if anything is built. |
| 28 | # |
| 29 | # +++ targets +++ |
| 30 | # |
| 31 | # clean: |
| 32 | # remove ${CLEANFILES}; remove ${CLEANDIRS} and all contents. |
| 33 | # |
| 34 | # cleandir: |
| 35 | # remove the build directory (and all its contents) created by obj |
| 36 | # |
| 37 | # obj: |
| 38 | # create build directory. |
| 39 | # |
| 40 | |
| 41 | .if !target(__<bsd.obj.mk>__) |
| 42 | __<bsd.obj.mk>__: |
| 43 | .include <bsd.own.mk> |
| 44 | |
| 45 | .if defined(MAKEOBJDIRPREFIX) |
| 46 | CANONICALOBJDIR:=${MAKEOBJDIRPREFIX}${.CURDIR} |
| 47 | .elif defined(MAKEOBJDIR) && ${MAKEOBJDIR:M/*} != "" |
| 48 | CANONICALOBJDIR:=${MAKEOBJDIR} |
| 49 | .else |
| 50 | CANONICALOBJDIR:=/usr/obj${.CURDIR} |
| 51 | .endif |
| 52 | |
| 53 | # |
| 54 | # Warn of unorthodox object directory. |
| 55 | # |
| 56 | # The following directories are tried in order for ${.OBJDIR}: |
| 57 | # |
| 58 | # 1. ${MAKEOBJDIRPREFIX}/`pwd` |
| 59 | # 2. ${MAKEOBJDIR} |
| 60 | # 3. obj.${MACHINE} |
| 61 | # 4. obj |
| 62 | # 5. /usr/obj/`pwd` |
| 63 | # 6. ${.CURDIR} |
| 64 | # |
| 65 | # If ${.OBJDIR} is constructed using canonical cases 1 or 5, or |
| 66 | # case 2 (using MAKEOBJDIR), don't issue a warning. Otherwise, |
| 67 | # issue a warning differentiating between cases 6 and (3 or 4). |
| 68 | # |
| 69 | objwarn: |
| 70 | .if !defined(NOOBJ) && ${.OBJDIR} != ${CANONICALOBJDIR} && \ |
| 71 | !(defined(MAKEOBJDIRPREFIX) && exists(${CANONICALOBJDIR}/)) && \ |
| 72 | !(defined(MAKEOBJDIR) && exists(${MAKEOBJDIR}/)) |
| 73 | .if ${.OBJDIR} == ${.CURDIR} |
| 74 | @${ECHO} "Warning: Object directory not changed from original ${.CURDIR}" |
| 75 | .elif exists(${.CURDIR}/obj.${MACHINE}/) || exists(${.CURDIR}/obj/) |
| 76 | @${ECHO} "Warning: Using ${.OBJDIR} as object directory instead of\ |
| 77 | canonical ${CANONICALOBJDIR}" |
| 78 | .endif |
| 79 | .endif |
| 80 | |
| 81 | .if !defined(NOOBJ) |
| 82 | .if !target(obj) |
| 83 | obj: |
| 84 | @if ! test -d ${CANONICALOBJDIR}/; then \ |
| 85 | mkdir -p ${CANONICALOBJDIR}; \ |
| 86 | if ! test -d ${CANONICALOBJDIR}/; then \ |
| 87 | ${ECHO} "Unable to create ${CANONICALOBJDIR}."; \ |
| 88 | exit 1; \ |
| 89 | fi; \ |
| 90 | ${ECHO} "${CANONICALOBJDIR} created for ${.CURDIR}"; \ |
| 91 | fi |
| 92 | .endif |
| 93 | |
| 94 | .if !target(objlink) |
| 95 | objlink: |
| 96 | @if test -d ${CANONICALOBJDIR}/; then \ |
| 97 | rm -f ${.CURDIR}/obj; \ |
| 98 | ${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(NOOBJ) |
| 104 | |
| 105 | # |
| 106 | # where would that obj directory be? |
| 107 | # |
| 108 | .if !target(whereobj) |
| 109 | whereobj: |
| 110 | @echo ${.OBJDIR} |
| 111 | .endif |
| 112 | |
| 113 | cleanobj: |
| 114 | .if ${CANONICALOBJDIR} != ${.CURDIR} && exists(${CANONICALOBJDIR}/) |
| 115 | rm -rf ${CANONICALOBJDIR} |
| 116 | .else |
| 117 | @cd ${.CURDIR} && ${MAKE} clean cleandepend |
| 118 | .endif |
| 119 | @if [ -L ${.CURDIR}/obj ]; then \ |
| 120 | echo rm -f ${.CURDIR}/obj; \ |
| 121 | rm -f ${.CURDIR}/obj; \ |
| 122 | fi |
| 123 | |
| 124 | # Tell bmake not to look for generated files via .PATH |
| 125 | .if !empty(CLEANFILES) |
| 126 | .NOPATH: ${CLEANFILES} |
| 127 | .endif |
| 128 | |
| 129 | .if !target(clean) |
| 130 | clean: |
| 131 | .if defined(CLEANFILES) && !empty(CLEANFILES) |
| 132 | rm -f ${CLEANFILES} |
| 133 | .endif |
| 134 | .if defined(CLEANDIRS) && !empty(CLEANDIRS) |
| 135 | rm -rf ${CLEANDIRS} |
| 136 | .endif |
| 137 | .endif |
| 138 | |
| 139 | cleandir: cleanobj |
| 140 | |
| 141 | .include <bsd.subdir.mk> |
| 142 | |
| 143 | .endif # !target(__<bsd.obj.mk>__) |