From 891f0c5577e98a4386e4da380124ee681ca56270 Mon Sep 17 00:00:00 2001 From: sjg Date: Thu, 8 Nov 2012 21:14:57 +0000 Subject: [PATCH] Latest dirdeps etc from Juniper Networks. --- share/mk/dirdeps.mk | 64 +++++++++++++++++++++++++++++++++++++------ share/mk/meta2deps.py | 14 ++++++++-- 2 files changed, 66 insertions(+), 12 deletions(-) diff --git a/share/mk/dirdeps.mk b/share/mk/dirdeps.mk index e8c02b781d2f..9f051e9203e7 100644 --- a/share/mk/dirdeps.mk +++ b/share/mk/dirdeps.mk @@ -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 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 diff --git a/share/mk/meta2deps.py b/share/mk/meta2deps.py index 8e33e2c82696..cb6d3213b221 100755 --- a/share/mk/meta2deps.py +++ b/share/mk/meta2deps.py @@ -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)