Latest dirdeps etc from Juniper Networks.

This commit is contained in:
sjg 2012-11-08 21:14:57 +00:00
parent 778e93c51a
commit 891f0c5577
2 changed files with 66 additions and 12 deletions

View File

@ -1,4 +1,4 @@
# $Id: dirdeps.mk,v 1.22 2012/04/25 15:12:29 sjg Exp $
# $Id: dirdeps.mk,v 1.23 2012/11/06 05:44:03 sjg Exp $
# Copyright (c) 2010-2012, Juniper Networks, Inc.
#
@ -55,6 +55,39 @@
# Indicates whether .MAKE.LEVEL 0 builds anything:
# if "no" sub-makes are used to build everything,
# if "yes" sub-makes are only used to build for other machines.
#
# TARGET_SPEC_VARS
# All the description above (and below) assumes <machine> is the
# only data needed to control the build.
# This is not always the case. So in addition to setting
# MACHINE in the build environment we set TARGET_SPEC which is
# composed of the values of TARGET_SPEC_VARS separated by
# commas. The default is just MACHINE.
#
# If more that MACHINE is needed then sys.mk needs to decompose
# TARGET_SPEC and set the relevant variables accordingly.
# It is important that MACHINE be included in TARGET_SPEC_VARS
# since if there is more the value passed as MACHINE will infact
# be the TARGET_SPEC.
# Note: TARGET_SPEC cannot contain any '.'s so the target
# tripple used by compiler folk won't work (directly anyway).
#
# For example:
#
# # variables other than MACHINE might be optional
# TARGET_SPEC_VARS = MACHINE TARGET_OS
# .if ${TARGET_SPEC:Uno:M*,*} != ""
# _tspec := ${TARGET_SPEC:S/,/ /g}
# MACHINE := ${_tspec:[1]}
# TARGET_OS := ${_tspec:[2]}
# # etc.
# .for v in ${TARGET_SPEC_VARS:O:u}
# .if empty($v)
# .undef $v
# .endif
# .endfor
# .endif
#
.if ${.MAKE.LEVEL} == 0
# only the first instance is interested in all this
@ -67,16 +100,26 @@
# do some setup we only need once
_CURDIR ?= ${.CURDIR}
# If TARGET_SPEC_VARS is other than just MACHINE
# it should be set by sys.mk or similar by now.
# TARGET_SPEC must not contain any '.'s.
TARGET_SPEC_VARS ?= MACHINE
TARGET_SPEC = ${TARGET_SPEC_VARS:@v@${$v:U}@:ts,}
.if !defined(.MAKE.DEPENDFILE_PREFERENCE)
# this makes the logic below neater?
.MAKE.DEPENDFILE_PREFERENCE = ${_CURDIR}/${.MAKE.DEPENDFILE:T}
.if ${.MAKE.DEPENDFILE:E} == "${MACHINE}"
.if ${.MAKE.DEPENDFILE:E} == "${TARGET_SPEC}"
.if ${TARGET_SPEC} != ${MACHINE}
.MAKE.DEPENDFILE_PREFERENCE += ${_CURDIR}/${.MAKE.DEPENDFILE:T:R}.$${MACHINE}
.endif
.MAKE.DEPENDFILE_PREFERENCE += ${_CURDIR}/${.MAKE.DEPENDFILE:T:R}
.endif
.endif
_default_dependfile := ${.MAKE.DEPENDFILE_PREFERENCE:[1]:T}
_machine_dependfiles := ${.MAKE.DEPENDFILE_PREFERENCE:M*.${MACHINE}}
_machine_dependfiles := ${.MAKE.DEPENDFILE_PREFERENCE:M*.${TARGET_SPEC}} \
${.MAKE.DEPENDFILE_PREFERENCE:M*.${MACHINE}}
# for machine specific dependfiles we require ${MACHINE} to be at the end
# also for the sake of sanity we require a common prefix
@ -90,7 +133,7 @@ _machine_dependfiles := ${.MAKE.DEPENDFILE_PREFERENCE:M*.${MACHINE}}
# this is how we identify non-machine specific dependfiles
N_notmachine := ${.MAKE.DEPENDFILE_PREFERENCE:E:N${MACHINE}:${M_ListToSkip}}
N_notmachine := ${.MAKE.DEPENDFILE_PREFERENCE:E:N${TARGET_SPEC}:N${MACHINE}:${M_ListToSkip}}
.endif # !target(_DIRDEP_USE)
@ -100,11 +143,11 @@ _last_dependfile := ${.MAKE.MAKEFILES:M*/${.MAKE.DEPENDFILE_PREFIX}*:[-1]}
# will not work, so we also test for DEP_MACHINE==depend below.
.if empty(_last_dependfile)
# we haven't included one yet
DEP_MACHINE ?= ${TARGET_MACHINE:U${MACHINE}}
DEP_MACHINE ?= ${TARGET_MACHINE:U${TARGET_SPEC}}
# else it should be correctly set by ${.MAKE.DEPENDFILE}
.elif ${_last_dependfile:E:${N_notmachine}} == "" || ${DEP_MACHINE:Uno:${N_notmachine}} == ""
# don't rely on manually maintained files to be correct
DEP_MACHINE := ${_DEP_MACHINE:U${MACHINE}}
DEP_MACHINE := ${_DEP_MACHINE:U${TARGET_SPEC}}
.else
# just in case
DEP_MACHINE ?= ${_last_dependfile:E}
@ -159,6 +202,7 @@ _DIRDEP_USE: .USE .MAKE
@for m in ${.MAKE.MAKEFILE_PREFERENCE}; do \
test -s ${.TARGET:R}/$$m || continue; \
echo "${TRACER}Checking ${.TARGET:R} for ${.TARGET:E} ..."; \
TARGET_SPEC=${.TARGET:E} \
MACHINE=${.TARGET:E} MACHINE_ARCH= NO_SUBDIR=1 \
${.MAKE} -C ${.TARGET:R} || exit 1; \
break; \
@ -216,7 +260,7 @@ _this_dir := ${SRCTOP}/${DEP_RELDIR}
_dep_hack := ${_this_dir}/${.MAKE.DEPENDFILE_PREFIX}.inc
.-include "${_dep_hack}"
.if ${DEP_RELDIR} != ${_DEP_RELDIR} || ${DEP_MACHINE} != ${MACHINE}
.if ${DEP_RELDIR} != ${_DEP_RELDIR} || ${DEP_MACHINE} != ${TARGET_SPEC}
# this should be all
_machines := ${DEP_MACHINE}
.else
@ -231,7 +275,9 @@ _machines += host
_machines := ${_machines:O:u}
.endif
# reset these each time through
_build_dirs =
_depdir_files =
.if ${DEP_RELDIR} == ${_DEP_RELDIR}
# pickup other machines for this dir if necessary
@ -239,7 +285,7 @@ _build_dirs =
_build_dirs += ${_machines:@m@${_CURDIR}.$m@}
.else
_build_dirs += ${_machines:N${DEP_MACHINE}:@m@${_CURDIR}.$m@}
.if ${DEP_MACHINE} == ${MACHINE}
.if ${DEP_MACHINE} == ${TARGET_SPEC}
# pickup local dependencies now
.-include <.depend>
.endif
@ -295,7 +341,7 @@ _depdir_files += ${.MAKE.DEPENDFILE_PREFERENCE:T:@m@${exists($d/$m):?$d/$m:}@:[1
# a little more complex - building for another machine
# we will ensure the file is qualified with a machine
# so that if necessary _DEP_MACHINE can be set below
_depdir_files += ${.MAKE.DEPENDFILE_PREFERENCE:T:S,.${MACHINE}$,.${d:E},:@m@${exists(${d:R}/$m):?${d:R}/$m:}@:[1]:@m@${"${m:M*.${d:E}}":?$m:$m.${d:E}}@}
_depdir_files += ${.MAKE.DEPENDFILE_PREFERENCE:T:S,.${TARGET_SPEC}$,.${d:E},:S,.${MACHINE}$,.${d:E},:@m@${exists(${d:R}/$m):?${d:R}/$m:}@:[1]:@m@${"${m:M*.${d:E}}":?$m:$m.${d:E}}@}
.endif
.endfor

View File

@ -35,7 +35,7 @@
"""
RCSid:
$Id: meta2deps.py,v 1.5 2011/11/14 00:18:42 sjg Exp $
$Id: meta2deps.py,v 1.7 2012/11/06 05:44:03 sjg Exp $
Copyright (c) 2011, Juniper Networks, Inc.
@ -183,6 +183,11 @@ def __init__(self, name, conf={}):
srctop += '/'
if not srctop in self.srctops:
self.srctops.append(srctop)
_srctop = os.path.realpath(srctop)
if _srctop[-1] != '/':
_srctop += '/'
if not _srctop in self.srctops:
self.srctops.append(_srctop)
for objroot in getv(conf, 'OBJROOTS', []):
if not objroot in self.objroots:
@ -190,8 +195,8 @@ def __init__(self, name, conf={}):
_objroot = os.path.realpath(objroot)
if objroot[-1] == '/':
_objroot += '/'
if not _objroot in self.objroots:
self.objroots.append(_objroot)
if not _objroot in self.objroots:
self.objroots.append(_objroot)
if self.debug:
print >> self.debug_out, "host_target=", self.host_target
@ -397,6 +402,9 @@ def parse(self, name=None, file=None):
path = w[2].strip("'")
else:
path = w[2]
# we are never interested in .dirdep files as dependencies
if path.endswith('.dirdep'):
continue
# we don't want to resolve the last component if it is
# a symlink
path = resolve(path, cwd, last_dir, self.debug, self.debug_out)