meta.autodep.mk revision 276305
1238104Sdes# $Id: meta.autodep.mk,v 1.35 2014/05/09 00:05:46 sjg Exp $ 2238104Sdes 3238104Sdes# 4238104Sdes# @(#) Copyright (c) 2010, Simon J. Gerraty 5238104Sdes# 6238104Sdes# This file is provided in the hope that it will 7238104Sdes# be of use. There is absolutely NO WARRANTY. 8238104Sdes# Permission to copy, redistribute or otherwise 9238104Sdes# use this file is hereby granted provided that 10246827Sdes# the above copyright notice and this notice are 11238104Sdes# left intact. 12238104Sdes# 13238104Sdes# Please send copies of changes and bug-fixes to: 14238104Sdes# sjg@crufty.net 15238104Sdes# 16238104Sdes 17238104Sdes_this ?= ${.PARSEFILE} 18238104Sdes.if !target(__${_this}__) 19238104Sdes__${_this}__: .NOTMAIN 20238104Sdes 21238104Sdes.-include "local.autodep.mk" 22238104Sdes 23238104Sdes.if defined(SRCS) 24238104Sdes# it would be nice to be able to query .SUFFIXES 25238104SdesOBJ_EXTENSIONS+= .o .po .lo .So 26238104Sdes 27238104Sdes# explicit dependencies help short-circuit .SUFFIX searches 28238104SdesSRCS_DEP_FILTER+= N*.[hly] 29238104Sdes.for s in ${SRCS:${SRCS_DEP_FILTER:O:u:ts:}} 30238104Sdes.for e in ${OBJ_EXTENSIONS:O:u} 31238104Sdes.if !target(${s:T:R}$e) 32238104Sdes${s:T:R}$e: $s 33238104Sdes.endif 34238104Sdes.endfor 35238104Sdes.endfor 36238104Sdes.endif 37238104Sdes 38238104Sdes.if make(gendirdeps) 39238104Sdes# you are supposed to know what you are doing! 40238104SdesUPDATE_DEPENDFILE = yes 41238104Sdes.elif !empty(.TARGETS) && !make(all) 42238104Sdes# do not update the *depend* files 43238104Sdes# unless we are building the entire directory or the default target. 44238104Sdes# NO means don't update .depend - or Makefile.depend* 45238104Sdes# no means update .depend but not Makefile.depend* 46238104SdesUPDATE_DEPENDFILE = NO 47238104Sdes.elif ${.MAKEFLAGS:M-k} != "" 48238104Sdes# it is a bad idea to update anything 49238104SdesUPDATE_DEPENDFILE = NO 50238104Sdes.endif 51238104Sdes 52238104Sdes_CURDIR ?= ${.CURDIR} 53238104Sdes_DEPENDFILE := ${_CURDIR}/${.MAKE.DEPENDFILE:T} 54238104Sdes 55238104Sdes.if ${.MAKE.LEVEL} == 0 56238104Sdes.if ${BUILD_AT_LEVEL0:Uyes:tl} == "no" 57238104SdesUPDATE_DEPENDFILE = NO 58238104Sdes.endif 59238104Sdes.endif 60238104Sdes.if !exists(${_DEPENDFILE}) 61238104Sdes_bootstrap_dirdeps = yes 62238104Sdes.endif 63238104Sdes_bootstrap_dirdeps ?= no 64238104SdesUPDATE_DEPENDFILE ?= yes 65238104Sdes 66238104Sdes.if ${DEBUG_AUTODEP:Uno:@m@${RELDIR:M$m}@} != "" 67238104Sdes.info ${_DEPENDFILE:S,${SRCTOP}/,,} update=${UPDATE_DEPENDFILE} 68238104Sdes.endif 69238104Sdes 70238104Sdes.if !empty(XMAKE_META_FILE) 71238104Sdes.if exists(${.OBJDIR}/${XMAKE_META_FILE}) 72238104Sdes# we cannot get accurate dependencies from an update build 73238104SdesUPDATE_DEPENDFILE = NO 74238104Sdes.else 75238104SdesMETA_XTRAS += ${XMAKE_META_FILE} 76238104Sdes.endif 77238104Sdes.endif 78238104Sdes 79238104Sdes.if ${_bootstrap_dirdeps} == "yes" || exists(${_DEPENDFILE}) 80238104Sdes# if it isn't supposed to be touched by us the Makefile should have 81238104Sdes# UPDATE_DEPENDFILE = no 82238104SdesWANT_UPDATE_DEPENDFILE ?= yes 83238104Sdes.endif 84238104Sdes 85238104Sdes.if ${WANT_UPDATE_DEPENDFILE:Uno:tl} != "no" 86238104Sdes.if ${.MAKE.MODE:Mmeta*} == "" || ${.MAKE.MODE:M*read*} != "" 87238104SdesUPDATE_DEPENDFILE = no 88238104Sdes.endif 89238104Sdes 90238104Sdes.if ${DEBUG_AUTODEP:Uno:@m@${RELDIR:M$m}@} != "" 91238104Sdes.info ${_DEPENDFILE:S,${SRCTOP}/,,} update=${UPDATE_DEPENDFILE} 92238104Sdes.endif 93238104Sdes 94238104Sdes.if ${UPDATE_DEPENDFILE:tl} == "yes" 95238104Sdes# sometimes we want .meta files generated to aid debugging/error detection 96238104Sdes# but do not want to consider them for dependencies 97238104Sdes# for example the result of running configure 98238104Sdes# just make sure this is not empty 99238104SdesMETA_FILE_FILTER ?= N.meta 100238104Sdes 101238104Sdes.if !empty(DPADD) 102238104Sdes# if we have any non-libs in DPADD, 103238104Sdes# they probably need to be paid attention to 104238104Sdes.if !empty(DPLIBS) 105246827SdesFORCE_DPADD = ${DPADD:${DPLIBS:${M_ListToSkip}}:${DPADD_LAST:${M_ListToSkip}}} 106238104Sdes.else 107238104Sdes_nonlibs := ${DPADD:T:Nlib*:N*include} 108238104Sdes.if !empty(_nonlibs) 109238104SdesFORCE_DPADD += ${_nonlibs:@x@${DPADD:M*/$x}@} 110238104Sdes.endif 111238104Sdes.endif 112238104Sdes.endif 113238104Sdes 114238104Sdes.if !make(gendirdeps) 115238104Sdes.END: gendirdeps 116238104Sdes.endif 117238104Sdes 118238104Sdes# if we don't have OBJS, then .depend isn't useful 119238104Sdes.if !target(.depend) && (!empty(OBJS) || ${.ALLTARGETS:M*.o} != "") 120238104Sdes# some makefiles and/or targets contain 121238104Sdes# circular dependencies if you dig too deep 122238104Sdes# (as meta mode is apt to do) 123238104Sdes# so we provide a means of suppressing them. 124238104Sdes# the input to the loop below is target: dependency 125238104Sdes# with just one dependency per line. 126238104Sdes# Also some targets are not really local, or use random names. 127238104Sdes# Use local.autodep.mk to provide local additions! 128238104SdesSUPPRESS_DEPEND += \ 129238104Sdes ${SB:S,/,_,g}* \ 130238104Sdes *:y.tab.c \ 131238104Sdes *.c:*.c \ 132238104Sdes *.h:*.h 133238104Sdes 134238104Sdes.NOPATH: .depend 135238104Sdes# we use ${.MAKE.META.CREATED} to trigger an update but 136238104Sdes# we process using ${.MAKE.META.FILES} 137238104Sdes# the double $$ defers initial evaluation 138238104Sdes# if necessary, we fake .po dependencies, just so the result 139238104Sdes# in Makefile.depend* is stable 140238104Sdes# The current objdir may be referred to in various ways 141238104SdesOBJDIR_REFS += ${.OBJDIR} ${.OBJDIR:tA} ${_OBJDIR} ${RELOBJTOP}/${RELDIR} 142238104Sdes_depend = .depend 143238104Sdes# it would be nice to be able to get .SUFFIXES as ${.SUFFIXES} 144238104Sdes# we actually only care about the .SUFFIXES of files that might be 145238104Sdes# generated by tools like yacc. 146238104SdesDEPEND_SUFFIXES += .c .h .cpp .hpp .cxx .hxx .cc .hh 147238104Sdes.depend: .NOMETA $${.MAKE.META.CREATED} ${_this} 148238104Sdes @echo "Updating $@: ${.OODATE:T:[1..8]}" 149238104Sdes @egrep -i '^R .*\.(${DEPEND_SUFFIXES:tl:O:u:S,^.,,:ts|})$$' /dev/null ${.MAKE.META.FILES:T:O:u:${META_FILE_FILTER:ts:}:M*o.meta} | \ 150238104Sdes sed -e 's, \./, ,${OBJDIR_REFS:O:u:@d@;s, $d/, ,@};/\//d' \ 151238104Sdes -e 's,^\([^/][^/]*\).meta...[0-9]* ,\1: ,' | \ 152238104Sdes sort -u | \ 153238104Sdes while read t d; do \ 154238104Sdes case "$$d:" in $$t) continue;; esac; \ 155238104Sdes case "$$t$$d" in ${SUPPRESS_DEPEND:U.:O:u:ts|}) continue;; esac; \ 156238104Sdes echo $$t $$d; \ 157238104Sdes done > $@.${.MAKE.PID} 158238104Sdes @case "${.MAKE.META.FILES:T:M*.po.*}" in \ 159238104Sdes *.po.*) mv $@.${.MAKE.PID} $@;; \ 160238104Sdes *) { cat $@.${.MAKE.PID}; \ 161238104Sdes sed 's,\.So:,.o:,;s,\.o:,.po:,' $@.${.MAKE.PID}; } | sort -u > $@; \ 162238104Sdes rm -f $@.${.MAKE.PID};; \ 163238104Sdes esac 164238104Sdes.else 165238104Sdes# make sure this exists 166238104Sdes.depend: 167246827Sdes# do _not_ assume that .depend is in any fit state for us to use 168238104SdesCAT_DEPEND = /dev/null 169238104Sdes.if ${.MAKE.LEVEL} > 0 170238104Sdes.export CAT_DEPEND 171238104Sdes.endif 172238104Sdes_depend = 173238104Sdes.endif 174238104Sdes 175238104Sdes.if ${DEBUG_AUTODEP:Uno:@m@${RELDIR:M$m}@} != "" 176238104Sdes.info ${_DEPENDFILE:S,${SRCTOP}/,,} _depend=${_depend} 177238104Sdes.endif 178238104Sdes 179238104Sdes.if ${UPDATE_DEPENDFILE} == "yes" 180238104Sdesgendirdeps: ${_DEPENDFILE} 181238104Sdes.endif 182238104Sdes 183238104Sdes.if !target(${_DEPENDFILE}) 184238104Sdes.if ${_bootstrap_dirdeps} == "yes" 185238104Sdes# We are boot-strapping a new directory 186238104Sdes# Use DPADD to seed DIRDEPS 187238104Sdes.if !empty(DPADD) 188238104Sdes# anything which matches ${_OBJROOT}* but not ${_OBJTOP}* 189238104Sdes# needs to be qualified in DIRDEPS 190238104Sdes# The pseudo machine "host" is used for HOST_TARGET 191238104SdesDIRDEPS = \ 192238104Sdes ${DPADD:M${_OBJTOP}*:H:C,${_OBJTOP}[^/]*/,,:N.:O:u} \ 193238104Sdes ${DPADD:M${_OBJROOT}*:N${_OBJTOP}*:H:S,${_OBJROOT},,:C,^([^/]+)/(.*),\2.\1,:S,${HOST_TARGET}$,host,:N.*:O:u} 194238104Sdes 195238104Sdes.endif 196238104Sdes.endif 197238104Sdes 198238104Sdes_gendirdeps_mutex = 199238104Sdes.if defined(NEED_GENDIRDEPS_MUTEX) 200238104Sdes# If a src dir gets built with multiple object dirs, 201238104Sdes# we need a mutex. Obviously, this is best avoided. 202238104Sdes# Note if .MAKE.DEPENDFILE is common for all ${MACHINE} 203238104Sdes# you either need to mutex, or ensure only one machine builds at a time! 204238104Sdes# lockf is an example of a suitable tool 205238104SdesLOCKF ?= /usr/bin/lockf 206238104Sdes.if exists(${LOCKF}) 207238104SdesGENDIRDEPS_MUTEXER ?= ${LOCKF} -k 208238104Sdes.endif 209238104Sdes.if empty(GENDIRDEPS_MUTEXER) 210238104Sdes.error NEED_GENDIRDEPS_MUTEX defined, but GENDIRDEPS_MUTEXER not set 211238104Sdes.else 212238104Sdes_gendirdeps_mutex = ${GENDIRDEPS_MUTEXER} ${GENDIRDEPS_MUTEX:U${_CURDIR}/Makefile} 213238104Sdes.endif 214238104Sdes.endif 215238104Sdes 216238104Sdes# If we have META_XTRAS we most likely did not create them 217238104Sdes# but we need to behave as if we did. 218238104Sdes# Avoid adding glob patterns to .MAKE.META.CREATED though. 219238104Sdes.MAKE.META.CREATED += ${META_XTRAS:N*\**:O:u} 220238104Sdes 221238104Sdes.if make(gendirdeps) 222238104SdesMETA_FILES = *.meta 223238104Sdes.elif ${OPTIMIZE_OBJECT_META_FILES:Uno:tl} == "no" 224238104SdesMETA_FILES = ${.MAKE.META.FILES:T:N.depend*:O:u} 225238104Sdes.else 226238104Sdes# if we have 1000's of .o.meta, .So.meta etc we need only look at one set 227238104Sdes# it is left as an exercise for the reader to work out what this does 228238104SdesMETA_FILES = ${.MAKE.META.FILES:T:N.depend*:N*o.meta:O:u} \ 229238104Sdes ${.MAKE.META.FILES:T:M*.${.MAKE.META.FILES:M*o.meta:R:E:O:u:[1]}.meta:O:u} 230238104Sdes.endif 231238104Sdes 232238104Sdes.if ${DEBUG_AUTODEP:Uno:@m@${RELDIR:M$m}@} != "" 233238104Sdes.info ${_DEPENDFILE:S,${SRCTOP}/,,}: ${_depend} ${.PARSEDIR}/gendirdeps.mk ${META2DEPS} xtras=${META_XTRAS} 234238104Sdes.endif 235238104Sdes 236238104Sdes.if ${.MAKE.LEVEL} > 0 && !empty(GENDIRDEPS_FILTER) 237238104Sdes.export GENDIRDEPS_FILTER 238238104Sdes.endif 239238104Sdes 240238104Sdes# we might have .../ in MAKESYSPATH 241238104Sdes_makesyspath:= ${_PARSEDIR} 242238104Sdes${_DEPENDFILE}: ${_depend} ${.PARSEDIR}/gendirdeps.mk ${META2DEPS} $${.MAKE.META.CREATED} 243238104Sdes @echo Checking $@: ${.OODATE:T:[1..8]} 244238104Sdes @(cd . && \ 245238104Sdes SKIP_GENDIRDEPS='${SKIP_GENDIRDEPS:O:u}' \ 246238104Sdes DPADD='${FORCE_DPADD:O:u}' ${_gendirdeps_mutex} \ 247238104Sdes MAKESYSPATH=${_makesyspath} \ 248238104Sdes ${.MAKE} -f gendirdeps.mk RELDIR=${RELDIR} _DEPENDFILE=${_DEPENDFILE} \ 249238104Sdes META_FILES='${META_XTRAS:T:O:u} ${META_FILES:T:O:u:${META_FILE_FILTER:ts:}}') 250238104Sdes @test -s $@ && touch $@; : 251238104Sdes.endif 252238104Sdes 253238104Sdes.endif 254238104Sdes.endif 255238104Sdes 256238104Sdes.if ${_bootstrap_dirdeps} == "yes" 257238104Sdes# make sure this is included at least once 258238104Sdes.include <dirdeps.mk> 259238104Sdes.else 260238104Sdes${_DEPENDFILE}: .PRECIOUS 261238104Sdes.endif 262238104Sdes 263238104SdesCLEANFILES += *.meta filemon.* *.db 264238104Sdes 265238104Sdes# these make it easy to gather some stats 266238104Sdesnow_utc = ${%s:L:gmtime} 267238104Sdesstart_utc := ${now_utc} 268238104Sdes 269238104Sdesmeta_stats= meta=${empty(.MAKE.META.FILES):?0:${.MAKE.META.FILES:[#]}} \ 270238104Sdes created=${empty(.MAKE.META.CREATED):?0:${.MAKE.META.CREATED:[#]}} 271238104Sdes 272238104Sdes#.END: _reldir_finish 273246827Sdes.if target(gendirdeps) 274238104Sdes_reldir_finish: gendirdeps 275238104Sdes.endif 276238104Sdes_reldir_finish: .NOMETA 277238104Sdes @echo "${TIME_STAMP} Finished ${RELDIR}.${TARGET_SPEC} seconds=$$(( ${now_utc} - ${start_utc} )) ${meta_stats}" 278238104Sdes 279238104Sdes#.ERROR: _reldir_failed 280238104Sdes_reldir_failed: .NOMETA 281238104Sdes @echo "${TIME_STAMP} Failed ${RELDIR}.${TARGET_SPEC} seconds=$$(( ${now_utc} - ${start_utc} )) ${meta_stats}" 282238104Sdes 283238104Sdes.if defined(WITH_META_STATS) && ${.MAKE.LEVEL} > 0 284238104Sdes.END: _reldir_finish 285238104Sdes.ERROR: _reldir_failed 286238104Sdes.endif 287238104Sdes 288238104Sdes.endif 289238104Sdes