summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--share/mk/meta.stage.mk80
-rw-r--r--share/mk/sys.dependfile.mk9
2 files changed, 64 insertions, 25 deletions
diff --git a/share/mk/meta.stage.mk b/share/mk/meta.stage.mk
index f43fd01..a24ef9d 100644
--- a/share/mk/meta.stage.mk
+++ b/share/mk/meta.stage.mk
@@ -1,4 +1,4 @@
-# $Id: meta.stage.mk,v 1.11 2011/05/05 15:01:05 sjg Exp $
+# $Id: meta.stage.mk,v 1.15 2012/10/14 02:50:38 sjg Exp $
#
# @(#) Copyright (c) 2011, Simon J. Gerraty
#
@@ -35,23 +35,47 @@ _stage_file_basename = $${f\#\#*/}
_stage_target_dirname = $${t%/*}
.endif
+_objroot ?= ${_OBJROOT:tA}
+# make sure this is global
+_STAGED_DIRS ?=
+.export _STAGED_DIRS
+# add each dir we stage to to _STAGED_DIRS
+# and make sure we have absolute paths so that bmake
+# will match against .MAKE.META.BAILIWICK
+STAGE_DIR_FILTER = tA:@d@$${_STAGED_DIRS::+=$$d}$$d@
+# convert _STAGED_DIRS into suitable filters
+GENDIRDEPS_FILTER += Nnot-empty-is-important \
+ ${_STAGED_DIRS:O:u:M${OBJTOP}*:S,${OBJTOP}/,N,} \
+ ${_STAGED_DIRS:O:u:N${OBJTOP}*:S,${_objroot},,:C,^([^/]+)/(.*),N\2.\1,:S,${HOST_TARGET},.host,}
+
+# it is an error for more than one src dir to try and stage
+# the same file
+STAGE_DIRDEP_SCRIPT = StageDirdep() { \
+ t=$$1; \
+ if [ -s $$t.dirdep ]; then \
+ cmp -s .dirdep $$t.dirdep && return; \
+ echo "ERROR: $$t installed by `cat $$t.dirdep` not ${_dirdep}" >&2; \
+ exit 1; \
+ fi; \
+ ln .dirdep $$t.dirdep 2> /dev/null || \
+ cp .dirdep $$t.dirdep; }
+
# common logic for staging files
# this all relies on RELDIR being set to a subdir of SRCTOP
# we use ln(1) if we can, else cp(1)
-STAGE_FILE_SCRIPT = StageFiles() { \
+STAGE_FILE_SCRIPT = ${STAGE_DIRDEP_SCRIPT}; StageFiles() { \
dest=$$1; shift; \
mkdir -p $$dest; \
[ -s .dirdep ] || echo '${_dirdep}' > .dirdep; \
for f in "$$@"; do \
case "$$f" in */*) t=$$dest/${_stage_file_basename};; *) t=$$dest/$$f;; esac; \
- rm -f $$t $$t.dirdep; \
+ StageDirdep $$t; \
+ rm -f $$t; \
{ ln $$f $$t 2> /dev/null || \
- cp -p $$f $$t; } && \
- { ln .dirdep $$t.dirdep 2> /dev/null || \
- cp .dirdep $$t.dirdep; }; \
- done; }
+ cp -p $$f $$t; }; \
+ done; :; }
-STAGE_LINKS_SCRIPT = StageLinks() { \
+STAGE_LINKS_SCRIPT = ${STAGE_DIRDEP_SCRIPT}; StageLinks() { \
case "$$1" in --) shift;; -*) lnf=$$1; shift;; esac; \
dest=$$1; shift; \
mkdir -p $$dest; \
@@ -61,13 +85,12 @@ STAGE_LINKS_SCRIPT = StageLinks() { \
t=$$dest/$$1; \
case "$$1" in */*) mkdir -p ${_stage_target_dirname};; esac; \
shift; \
- rm -f $$t $$t.dirdep 2>/dev/null; \
+ StageDirdep $$t; \
+ rm -f $$t 2>/dev/null; \
ln $$lnf $$l $$t; \
- { ln .dirdep $$t.dirdep 2> /dev/null || \
- cp .dirdep $$t.dirdep; }; \
done; :; }
-STAGE_AS_SCRIPT = StageAs() { \
+STAGE_AS_SCRIPT = ${STAGE_DIRDEP_SCRIPT}; StageAs() { \
dest=$$1; shift; \
mkdir -p $$dest; \
[ -s .dirdep ] || echo '${_dirdep}' > .dirdep; \
@@ -76,35 +99,38 @@ STAGE_AS_SCRIPT = StageAs() { \
t=$$dest/$$1; \
case "$$1" in */*) mkdir -p ${_stage_target_dirname};; esac; \
shift; \
- rm -f $$t $$t.dirdep; \
+ StageDirdep $$t; \
+ rm -f $$t; \
{ ln $$s $$t 2> /dev/null || \
- cp -p $$s $$t; } && \
- { ln .dirdep $$t.dirdep 2> /dev/null || \
- cp .dirdep $$t.dirdep; }; \
- done; }
+ cp -p $$s $$t; }; \
+ done; :; }
# this is simple, a list of the "staged" files depends on this,
_STAGE_BASENAME_USE: .USE ${.TARGET:T}
- @${STAGE_FILE_SCRIPT}; StageFiles ${.TARGET:H} ${.TARGET:T}
+ @${STAGE_FILE_SCRIPT}; StageFiles ${.TARGET:H:${STAGE_DIR_FILTER}} ${.TARGET:T}
.if !empty(STAGE_INCSDIR)
+CLEANFILES += stage_incs
+
STAGE_INCS ?= ${.ALLSRC:N.dirdep}
stage_incs: .dirdep
- @${STAGE_FILE_SCRIPT}; StageFiles ${STAGE_INCSDIR} ${STAGE_INCS}
+ @${STAGE_FILE_SCRIPT}; StageFiles ${STAGE_INCSDIR:${STAGE_DIR_FILTER}} ${STAGE_INCS}
@touch $@
.endif
.if !empty(STAGE_LIBDIR)
+CLEANFILES += stage_libs
+
STAGE_LIBS ?= ${.ALLSRC:N.dirdep}
stage_libs: .dirdep
- @${STAGE_FILE_SCRIPT}; StageFiles ${STAGE_LIBDIR} ${STAGE_LIBS}
+ @${STAGE_FILE_SCRIPT}; StageFiles ${STAGE_LIBDIR:${STAGE_DIR_FILTER}} ${STAGE_LIBS}
.if !empty(SHLIB_LINKS)
- @${STAGE_LINKS_SCRIPT}; StageLinks -s ${STAGE_LIBDIR} \
+ @${STAGE_LINKS_SCRIPT}; StageLinks -s ${STAGE_LIBDIR:${STAGE_DIR_FILTER}} \
${SHLIB_LINKS:@t@${STAGE_LIBS:T:M$t.*} $t@}
.elif !empty(SHLIB_LINK) && !empty(SHLIB_NAME)
- @${STAGE_LINKS_SCRIPT}; StageLinks -s ${STAGE_LIBDIR} ${SHLIB_NAME} ${SHLIB_LINK} ${SYMLINKS:T}
+ @${STAGE_LINKS_SCRIPT}; StageLinks -s ${STAGE_LIBDIR:${STAGE_DIR_FILTER}} ${SHLIB_NAME} ${SHLIB_LINK} ${SYMLINKS:T}
.endif
@touch $@
.endif
@@ -121,6 +147,8 @@ STAGE_SYMLINKS ?= ${.ALLSRC:T:N.dirdep:Nstage_*}
.if !empty(STAGE_SETS)
+CLEANFILES += ${STAGE_SETS:@s@stage*$s@}
+
# some makefiles need to populate multiple directories
.for s in ${STAGE_SETS:O:u}
STAGE_FILES.$s ?= ${.ALLSRC:N.dirdep}
@@ -132,7 +160,7 @@ stage_files.$s: .dirdep
.else
stage_files: .dirdep
.endif
- @${STAGE_FILE_SCRIPT}; StageFiles ${STAGE_FILES_DIR.$s:U${STAGE_DIR.$s}} ${STAGE_FILES.$s}
+ @${STAGE_FILE_SCRIPT}; StageFiles ${STAGE_FILES_DIR.$s:U${STAGE_DIR.$s}:${STAGE_DIR_FILTER}} ${STAGE_FILES.$s}
@touch $@
.if $s != "_default"
@@ -141,7 +169,7 @@ stage_symlinks.$s: .dirdep
.else
stage_symlinks: .dirdep
.endif
- @${STAGE_LINKS_SCRIPT}; StageLinks -s ${STAGE_SYMLINKS_DIR.$s:U${STAGE_DIR.$s}} ${STAGE_SYMLINKS.$s}
+ @${STAGE_LINKS_SCRIPT}; StageLinks -s ${STAGE_SYMLINKS_DIR.$s:U${STAGE_DIR.$s}:${STAGE_DIR_FILTER}} ${STAGE_SYMLINKS.$s}
@touch $@
.endfor
@@ -149,6 +177,8 @@ stage_symlinks: .dirdep
.if !empty(STAGE_AS_SETS)
+CLEANFILES += ${STAGE_AS_SETS:@s@stage*$s@}
+
# sometimes things need to be renamed as they are staged
# each ${file} will be staged as ${STAGE_AS_${file:T}}
# one could achieve the same with SYMLINKS
@@ -157,7 +187,7 @@ STAGE_AS.$s ?= ${.ALLSRC:N.dirdep}
stage_as: stage_as.$s
stage_as.$s: .dirdep
- @${STAGE_AS_SCRIPT}; StageAs ${STAGE_FILES_DIR.$s:U${STAGE_DIR.$s}} ${STAGE_AS.$s:@f@$f ${STAGE_AS_${f:T}:U${f:T}}@}
+ @${STAGE_AS_SCRIPT}; StageAs ${STAGE_FILES_DIR.$s:U${STAGE_DIR.$s}:${STAGE_DIR_FILTER}} ${STAGE_AS.$s:@f@$f ${STAGE_AS_${f:T}:U${f:T}}@}
@touch $@
.endfor
diff --git a/share/mk/sys.dependfile.mk b/share/mk/sys.dependfile.mk
index 2b99f84..432cc4f 100644
--- a/share/mk/sys.dependfile.mk
+++ b/share/mk/sys.dependfile.mk
@@ -34,5 +34,14 @@
_e := ${.MAKE.DEPENDFILE_PREFERENCE:@m@${exists($m):?$m:}@}
.if !empty(_e)
.MAKE.DEPENDFILE := ${_e:[1]}
+.elif ${.MAKE.DEPENDFILE_PREFERENCE:M*${MACHINE}} != "" && ${.MAKE.DEPENDFILE_PREFERENCE:[1]:E} != ${MACHINE}
+# MACHINE specific depend files are supported, but *not* default.
+# If any already exist, we should follow suit.
+_aml = ${ALL_MACHINE_LIST:Uarm amd64 i386 powerpc:N${MACHINE}} ${MACHINE}
+# MACHINE must be the last entry in _aml ;-)
+_e := ${_aml:@MACHINE@${.MAKE.DEPENDFILE_PREFERENCE:@m@${exists($m):?$m:}@}@}
+.if !empty(_e)
+.MAKE.DEPENDFILE ?= ${.MAKE.DEPENDFILE_PREFERENCE:M*${MACHINE}:[1]}
+.endif
.endif
.MAKE.DEPENDFILE ?= ${.MAKE.DEPENDFILE_PREFERENCE:[1]}
OpenPOWER on IntegriCloud