aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog14
-rw-r--r--FILES110
-rw-r--r--Makefile4
-rw-r--r--meta.c4
-rw-r--r--mk/ChangeLog20
-rw-r--r--mk/FILES1
-rw-r--r--mk/gendirdeps.mk28
-rw-r--r--mk/install-mk4
-rw-r--r--mk/meta.stage.mk15
-rwxr-xr-xmk/meta2deps.py41
-rwxr-xr-xmk/meta2deps.sh95
-rw-r--r--mk/options.mk23
-rw-r--r--mk/progs.mk9
-rwxr-xr-xmk/stage-install.sh98
-rw-r--r--suff.c191
-rw-r--r--var.c21
16 files changed, 435 insertions, 243 deletions
diff --git a/ChangeLog b/ChangeLog
index f0374ba707eb..0af20cade14a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,17 @@
+2013-05-20 Simon J. Gerraty <sjg@bad.crufty.net>
+
+ * Makefile (MAKE_VERSION): 20130520
+ generate manifest from component FILES rather than have to
+ update FILES when mk/FILES changes.
+
+2013-05-18 Simon J. Gerraty <sjg@bad.crufty.net>
+
+ * Makefile (MAKE_VERSION): 20130518
+ Merge with NetBSD make, pick up
+ o suff.c: don't skip all processsing for .PHONY targets
+ else wildcard srcs do not get expanded.
+ o var.c: expand name of variable to delete if necessary.
+
2013-03-30 Simon J. Gerraty <sjg@bad.crufty.net>
* Makefile (MAKE_VERSION): 20130330
diff --git a/FILES b/FILES
index dedc1ac8b07c..b0d8b2ed6954 100644
--- a/FILES
+++ b/FILES
@@ -1,29 +1,26 @@
-FILES
ChangeLog
-bmake.cat1
-boot-strap
-bsd.after-import.mk
-os.sh
-makefile.in
+FILES
Makefile
Makefile.config.in
PSD.doc/Makefile
PSD.doc/tutorial.ms
README
+aclocal.m4
arch.c
+bmake.1
+bmake.cat1
+boot-strap
+bsd.after-import.mk
buf.c
buf.h
compat.c
cond.c
-make-conf.h
-make_malloc.c
-make_malloc.h
config.h.in
configure
-aclocal.m4
configure.in
dir.c
dir.h
+dirname.c
find_lib.sh
for.c
getopt.c
@@ -32,16 +29,6 @@ hash.h
install-sh
job.c
job.h
-meta.c
-meta.h
-dirname.c
-realpath.c
-strlcpy.c
-strlist.c
-strlist.h
-stresep.c
-trace.c
-trace.h
lst.h
lst.lib/Makefile
lst.lib/lstAppend.c
@@ -74,26 +61,36 @@ lst.lib/lstReplace.c
lst.lib/lstSucc.c
machine.sh
main.c
+make-bootstrap.sh.in
+make-conf.h
make.1
-bmake.1
make.c
make.h
-make-bootstrap.sh.in
+make_malloc.c
+make_malloc.h
+makefile.in
+meta.c
+meta.h
missing/sys/cdefs.h
mkdeps.sh
nonints.h
+os.sh
parse.c
pathnames.h
ranlib.h
+realpath.c
setenv.c
sigcompat.c
sprite.h
str.c
+stresep.c
+strlcpy.c
+strlist.c
+strlist.h
suff.c
targ.c
-util.c
-var.c
-wait.h
+trace.c
+trace.h
unit-tests/Makefile.in
unit-tests/comment
unit-tests/cond1
@@ -123,63 +120,6 @@ unit-tests/test.exp
unit-tests/unexport
unit-tests/unexport-env
unit-tests/varcmd
-mk/ChangeLog
-mk/FILES
-mk/README
-mk/auto.obj.mk
-mk/autoconf.mk
-mk/autodep.mk
-mk/auto.dep.mk
-mk/dep.mk
-mk/doc.mk
-mk/dpadd.mk
-mk/final.mk
-mk/host-target.mk
-mk/host.libnames.mk
-mk/inc.mk
-mk/init.mk
-mk/install-mk
-mk/java.mk
-mk/lib.mk
-mk/libnames.mk
-mk/libs.mk
-mk/links.mk
-mk/man.mk
-mk/mk-files.txt
-mk/nls.mk
-mk/obj.mk
-mk/options.mk
-mk/own.mk
-mk/prlist.mk
-mk/prog.mk
-mk/progs.mk
-mk/rst2htm.mk
-mk/scripts.mk
-mk/srctop.mk
-mk/subdir.mk
-mk/sys.mk
-mk/sys.clean-env.mk
-mk/sys.dependfile.mk
-mk/sys/AIX.mk
-mk/sys/Darwin.mk
-mk/sys/Generic.mk
-mk/sys/HP-UX.mk
-mk/sys/IRIX.mk
-mk/sys/Linux.mk
-mk/sys/NetBSD.mk
-mk/sys/OSF1.mk
-mk/sys/OpenBSD.mk
-mk/sys/SunOS.mk
-mk/sys/UnixWare.mk
-mk/target-flags.mk
-mk/warnings.mk
-mk/yacc.mk
-mk/dirdeps.mk
-mk/gendirdeps.mk
-mk/install-new.mk
-mk/meta2deps.py
-mk/meta2deps.sh
-mk/meta.sys.mk
-mk/meta.autodep.mk
-mk/meta.stage.mk
-mk/meta.subdir.mk
+util.c
+var.c
+wait.h
diff --git a/Makefile b/Makefile
index edf0bd8b8e68..084142a2f401 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
-# $Id: Makefile,v 1.10 2013/03/31 05:57:19 sjg Exp $
+# $Id: Makefile,v 1.12 2013/05/20 16:05:10 sjg Exp $
# Base version on src date
-MAKE_VERSION= 20130330
+MAKE_VERSION= 20130520
PROG= bmake
diff --git a/meta.c b/meta.c
index 1bbbe33ec529..3aec19a78907 100644
--- a/meta.c
+++ b/meta.c
@@ -1,4 +1,4 @@
-/* $NetBSD: meta.c,v 1.29 2013/03/31 05:49:51 sjg Exp $ */
+/* $NetBSD: meta.c,v 1.30 2013/05/16 21:56:56 sjg Exp $ */
/*
* Implement 'meta' mode.
@@ -543,7 +543,7 @@ boolValue(char *s)
* Initialization we need before reading makefiles.
*/
void
-meta_init()
+meta_init(void)
{
#ifdef USE_FILEMON
/* this allows makefiles to test if we have filemon support */
diff --git a/mk/ChangeLog b/mk/ChangeLog
index 0f49477da486..32e064ba44d5 100644
--- a/mk/ChangeLog
+++ b/mk/ChangeLog
@@ -1,3 +1,23 @@
+2013-05-10 Simon J. Gerraty <sjg@bad.crufty.net>
+
+ * install-mk (MK_VERSION): 20130505
+ * gendirdeps.mk, meta2deps.py, meta2deps.sh: handle $TARGET_SPEC
+ for when $MACHINE isn't enough for objdir distinction.
+ Bring meta2deps.sh closer to par with meta2deps.py.
+
+2013-04-18 Simon J. Gerraty <sjg@bad.crufty.net>
+
+ * meta.stage.mk: set INSTALL to STAGE_INSTALL when making 'all'
+ also if the target 'beforeinstall' exists, make it depend on
+ .dirdep (incase it uses STAGE_INSTALL).
+
+2013-04-17 Simon J. Gerraty <sjg@bad.crufty.net>
+
+ * install-mk (MK_VERSION): 20130401 ;-)
+ * meta.stage.mk (STAGE_INSTALL_SH): add stage-install.sh as
+ wrapper around install(1).
+ * options.mk (OPTION_PREFIX): Allow a prefix other than MK_
+
2013-03-30 Simon J. Gerraty <sjg@bad.crufty.net>
* meta2deps.py (MetaFile.__init__): ensure self.cwd is initialized.
diff --git a/mk/FILES b/mk/FILES
index 7a2bf294e43f..443aa2e9644c 100644
--- a/mk/FILES
+++ b/mk/FILES
@@ -31,6 +31,7 @@ progs.mk
rst2htm.mk
scripts.mk
srctop.mk
+stage-install.sh
subdir.mk
sys.mk
sys.clean-env.mk
diff --git a/mk/gendirdeps.mk b/mk/gendirdeps.mk
index 5742c6fbcc1d..9be367369f57 100644
--- a/mk/gendirdeps.mk
+++ b/mk/gendirdeps.mk
@@ -1,4 +1,4 @@
-# $Id: gendirdeps.mk,v 1.21 2013/03/28 20:01:05 sjg Exp $
+# $Id: gendirdeps.mk,v 1.22 2013/05/11 05:16:26 sjg Exp $
# Copyright (c) 2010-2013, Juniper Networks, Inc.
# All rights reserved.
@@ -111,13 +111,24 @@ _py_d =
.if ${META2DEPS:E} == "py"
# we can afford to do this all the time.
DPDEPS ?= no
-META2DEPS_CMD = ${_time} ${PYTHON} ${META2DEPS} ${_py_d} \
- -R ${RELDIR} -H ${HOST_TARGET} \
- ${M2D_OBJROOTS:O:u:@o@-O $o@}
-
+META2DEPS_CMD = ${_time} ${PYTHON} ${META2DEPS} ${_py_d}
.if ${DPDEPS:tl} != "no"
META2DEPS_CMD += -D ${DPDEPS}
.endif
+META2DEPS_FILTER = sed 's,^src:,${SRCTOP}/,;s,^\([^/]\),${OBJTOP}/\1,' |
+.elif ${META2DEPS:E} == "sh"
+META2DEPS_CMD = ${_time} ${_sh_x} ${META2DEPS} OBJTOP=${_OBJTOP}
+.else
+META2DEPS_CMD ?= ${META2DEPS}
+.endif
+
+.if ${TARGET_OBJ_SPEC:U${MACHINE}} != ${MACHINE}
+META2DEPS_CMD += -T ${TARGET_OBJ_SPEC}
+.endif
+META2DEPS_CMD += \
+ -R ${RELDIR} -H ${HOST_TARGET} \
+ ${M2D_OBJROOTS:O:u:@o@-O $o@}
+
M2D_OBJROOTS += ${OBJTOP} ${_OBJROOT} ${_objroot}
.if defined(SB_OBJROOT)
@@ -133,13 +144,6 @@ META2DEPS_ARGS += MACHINE=none
META2DEPS_CMD += -S ${SB_BACKING_SB}/src
M2D_OBJROOTS += ${SB_BACKING_SB}/${SB_OBJPREFIX}
.endif
-META2DEPS_FILTER = sed 's,^src:,${SRCTOP}/,;s,^\([^/]\),${OBJTOP}/\1,' |
-.elif ${META2DEPS:E} == "sh"
-META2DEPS_CMD = ${_time} ${_sh_x} ${META2DEPS} \
- OBJTOP=${_objtop} SB_OBJROOT=${_objroot}
-.else
-META2DEPS_CMD ?= ${META2DEPS}
-.endif
# we are only interested in the dirs
# sepecifically those we read something from.
diff --git a/mk/install-mk b/mk/install-mk
index c45c6ca828d0..da15d8041d14 100644
--- a/mk/install-mk
+++ b/mk/install-mk
@@ -55,7 +55,7 @@
# Simon J. Gerraty <sjg@crufty.net>
# RCSid:
-# $Id: install-mk,v 1.88 2013/03/31 22:31:59 sjg Exp $
+# $Id: install-mk,v 1.90 2013/05/11 05:16:26 sjg Exp $
#
# @(#) Copyright (c) 1994 Simon J. Gerraty
#
@@ -70,7 +70,7 @@
# sjg@crufty.net
#
-MK_VERSION=20130330
+MK_VERSION=20130505
OWNER=
GROUP=
MODE=444
diff --git a/mk/meta.stage.mk b/mk/meta.stage.mk
index 0faeef34cbcc..2f02700fdc19 100644
--- a/mk/meta.stage.mk
+++ b/mk/meta.stage.mk
@@ -1,4 +1,4 @@
-# $Id: meta.stage.mk,v 1.24 2013/03/23 02:25:19 sjg Exp $
+# $Id: meta.stage.mk,v 1.30 2013/04/19 16:32:57 sjg Exp $
#
# @(#) Copyright (c) 2011, Simon J. Gerraty
#
@@ -228,4 +228,17 @@ STAGING_WAIT ?= .WAIT
all: ${STAGING_WAIT} staging
+.if exists(${.PARSEDIR}/stage-install.sh) && !defined(STAGE_INSTALL)
+# this will run install(1) and then followup with .dirdep files.
+STAGE_INSTALL := sh ${.PARSEDIR:tA}/stage-install.sh INSTALL="${INSTALL}" OBJDIR=${.OBJDIR:tA}
+.endif
+
+# if ${INSTALL} gets run during 'all' assume it is for staging?
+.if ${.TARGETS:Nall} == "" && defined(STAGE_INSTALL)
+INSTALL := ${STAGE_INSTALL}
+.if target(beforeinstall)
+beforeinstall: .dirdep
+.endif
+.endif
+
.endif
diff --git a/mk/meta2deps.py b/mk/meta2deps.py
index 6b6157c3ab4c..8c42303373f0 100755
--- a/mk/meta2deps.py
+++ b/mk/meta2deps.py
@@ -35,7 +35,7 @@ We only pay attention to a subset of the information in the
"""
RCSid:
- $Id: meta2deps.py,v 1.12 2013/03/31 22:31:59 sjg Exp $
+ $Id: meta2deps.py,v 1.13 2013/05/11 05:16:26 sjg Exp $
Copyright (c) 2011-2013, Juniper Networks, Inc.
All rights reserved.
@@ -124,6 +124,12 @@ def sort_unique(list, cmp=None, key=None, reverse=False):
nl.append(e)
return nl
+def add_trims(x):
+ return ['/' + x + '/',
+ '/' + x,
+ x + '/',
+ x]
+
class MetaFile:
"""class to parse meta files generated by bmake."""
@@ -152,6 +158,9 @@ class MetaFile:
set to 'none' if we are not cross-building.
More specifically if machine cannot be deduced from objdirs.
+ TARGET_SPEC
+ Sometimes MACHINE isn't enough.
+
HOST_TARGET
when we build for the psuedo machine 'host'
the object tree uses HOST_TARGET rather than MACHINE.
@@ -177,6 +186,8 @@ class MetaFile:
self.debug_out = getv(conf, 'debug_out', sys.stderr)
self.machine = getv(conf, 'MACHINE', '')
+ self.machine_arch = getv(conf, 'MACHINE_ARCH', '')
+ self.target_spec = getv(conf, 'TARGET_SPEC', '')
self.curdir = getv(conf, 'CURDIR')
self.reldir = getv(conf, 'RELDIR')
self.dpdeps = getv(conf, 'DPDEPS')
@@ -196,16 +207,11 @@ class MetaFile:
if not _srctop in self.srctops:
self.srctops.append(_srctop)
- trim_list = ['/' + self.machine + '/',
- '/' + self.machine,
- self.machine + '/',
- self.machine]
-
+ trim_list = add_trims(self.machine)
if self.machine == 'host':
- trim_list += ['/' + self.host_target + '/',
- '/' + self.host_target,
- self.host_target + '/',
- self.host_target]
+ trim_list += add_trims(self.host_target)
+ if self.target_spec:
+ trim_list += add_trims(self.target_spec)
for objroot in getv(conf, 'OBJROOTS', []):
for e in trim_list:
@@ -303,6 +309,8 @@ class MetaFile:
print >> self.debug_out, "found %s: %s\n" % (ddepf, ddep)
if ddep.endswith(self.machine):
ddep = ddep[0:-(1+len(self.machine))]
+ elif self.target_spec and ddep.endswith(self.target_spec):
+ ddep = ddep[0:-(1+len(self.target_spec))]
if not ddep:
# no .dirdeps, so remember that we've seen the raw input
@@ -520,6 +528,8 @@ def main(argv, klass=MetaFile, xopts='', xoptf=None):
-m "MACHINE"
+ -a "MACHINE_ARCH"
+
-H "HOST_TARGET"
-D "DPDEPS"
@@ -548,6 +558,9 @@ def main(argv, klass=MetaFile, xopts='', xoptf=None):
machine = os.environ['MACHINE']
if machine:
conf['MACHINE'] = machine
+ machine_arch = os.environ['MACHINE_ARCH']
+ if machine_arch:
+ conf['MACHINE_ARCH'] = machine_arch
srctop = os.environ['SB_SRC']
if srctop:
conf['SRCTOPS'].append(srctop)
@@ -560,9 +573,11 @@ def main(argv, klass=MetaFile, xopts='', xoptf=None):
debug = 0
output = True
- opts, args = getopt.getopt(argv[1:], 'dS:C:O:R:m:D:H:q' + xopts)
+ opts, args = getopt.getopt(argv[1:], 'a:dS:C:O:R:m:D:H:qT:' + xopts)
for o, a in opts:
- if o == '-d':
+ if o == '-a':
+ conf['MACHINE_ARCH'] = a
+ elif o == '-d':
debug += 1
elif o == '-q':
output = False
@@ -582,6 +597,8 @@ def main(argv, klass=MetaFile, xopts='', xoptf=None):
conf['DPDEPS'] = a
elif o == '-m':
conf['MACHINE'] = a
+ elif o == '-T':
+ conf['TARGET_SPEC'] = a
elif xoptf:
xoptf(o, a, conf)
diff --git a/mk/meta2deps.sh b/mk/meta2deps.sh
index 9c76b77964dd..f63aee329b6b 100755
--- a/mk/meta2deps.sh
+++ b/mk/meta2deps.sh
@@ -49,8 +49,8 @@
# The output, is a set of absolute paths with "SB" like:
#.nf
#
-# $SB/obj-i386/junos/gnu/lib/csu
-# $SB/obj-i386/junos/gnu/lib/libgcc
+# $SB/obj-i386/bsd/gnu/lib/csu
+# $SB/obj-i386/bsd/gnu/lib/libgcc
# $SB/obj-i386/bsd/include
# $SB/obj-i386/bsd/lib/csu/i386-elf
# $SB/obj-i386/bsd/lib/libc
@@ -77,9 +77,9 @@
# RCSid:
-# $Id: meta2deps.sh,v 1.5 2013/02/10 19:21:46 sjg Exp $
+# $Id: meta2deps.sh,v 1.6 2013/05/11 05:16:26 sjg Exp $
-# Copyright (c) 2010-2012, Juniper Networks, Inc.
+# Copyright (c) 2010-2013, Juniper Networks, Inc.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
@@ -115,16 +115,89 @@ meta2dirs() {
sort -u
}
+add_list() {
+ sep=' '
+ suffix=
+ while :
+ do
+ case "$1" in
+ "|") sep="$1"; shift;;
+ -s) suffix="$2"; shift 2;;
+ *) break;;
+ esac
+ done
+ name=$1
+ shift
+ eval list="\$$name"
+ for top in "$@"
+ do
+ case "$sep$list$sep" in
+ *"$sep$top$suffix$sep"*) continue;;
+ esac
+ list="${list:+$list$sep}$top$suffix"
+ done
+ eval "$name=\"$list\""
+}
+
meta2deps() {
DPDEPS=
+ SRCTOPS=$SRCTOP
+ OBJROOTS=
while :
do
case "$1" in
*=*) eval export "$1"; shift;;
+ -a) MACHINE_ARCH=$2; shift 2;;
+ -m) MACHINE=$2; shift 2;;
+ -C) CURDIR=$2; shift 2;;
+ -H) HOST_TARGET=$2; shift 2;;
+ -S) add_list SRCTOPS $2; shift 2;;
+ -O) add_list OBJROOTS $2; shift 2;;
+ -R) RELDIR=$2; shift 2;;
+ -T) TARGET_SPEC=$2; shift 2;;
*) break;;
esac
done
+ _th= _o=
+ case "$MACHINE" in
+ host) _ht=$HOST_TARGET;;
+ esac
+
+ for o in $OBJROOTS
+ do
+ case "$MACHINE,/$o/" in
+ host,*$HOST_TARGET*) ;;
+ *$MACHINE*|*${TARGET_SPEC:-$MACHINE}*) ;;
+ *) add_list _o $o; continue;;
+ esac
+ for x in $_ht $TARGET_SPEC $MACHINE
+ do
+ case "$o" in
+ "") continue;;
+ */$x/) add_list _o ${o%$x/}; o=;;
+ */$x) add_list _o ${o%$x}; o=;;
+ *$x/) add_list _o ${o%$x/}; o=;;
+ *$x) add_list _o ${o%$x}; o=;;
+ esac
+ done
+ done
+ OBJROOTS="$_o"
+
+ case "$OBJTOP" in
+ "")
+ for o in $OBJROOTS
+ do
+ OBJTOP=$o${TARGET_SPEC:-$MACHINE}
+ break
+ done
+ ;;
+ esac
+ src_re=
+ obj_re=
+ add_list '|' -s '/*' src_re $SRCTOPS
+ add_list '|' -s '*' obj_re $OBJROOTS
+
[ -z "$RELDIR" ] && unset DPDEPS
tf=/tmp/m2d$$-$USER
rm -f $tf.*
@@ -166,8 +239,7 @@ meta2deps() {
esac
case "$op,$path" in
- *.dirdep) continue;;
- W,*srcrel) continue;;
+ W,*srcrel|*.dirdep) continue;;
C,*)
case "$path" in
/*) cwd=$path;;
@@ -182,8 +254,7 @@ meta2deps() {
;;
*) dir=${path%/*}
case "$path" in
- $SB/*|${SB_BACKING_SB:-$SB}/*) ;;
- $SB_OBJROOT*) ;;
+ $src_re|$obj_re) ;;
/*/stage/*) ;;
/*) continue;;
*) for path in $ldir/$path $cwd/$path
@@ -215,7 +286,7 @@ meta2deps() {
esac
case "$dir" in
${CURDIR:-.}|${CURDIR:-.}/*|"") continue;;
- $SRCTOP/*|${SB_BACKING_SB:-$SB}/src/*)
+ $src_re)
# avoid repeating ourselves...
case "$DPDEPS,$seensrc," in
,*)
@@ -241,7 +312,7 @@ meta2deps() {
[ -f $path ] || continue
case "$dir" in
$CWD) continue;; # ignore
- $SRCTOP/*|${SB_BACKING_SB:-$SB}/src/*)
+ $src_re)
seenit="$seenit,$seen"
echo $dir >> $tf.srcdep
case "$DPDEPS,$reldir,$seensrc," in
@@ -267,7 +338,7 @@ meta2deps() {
fi
seenit="$seenit,$seen"
case "$dir" in
- $SB/*|${SB_OBJROOT:-$SB/}*|${SB_BACKING_SB:-$SB}/*)
+ $obj_re)
echo $dir;;
esac
done > $tf.dirdep
@@ -283,7 +354,7 @@ meta2deps() {
# qualified with .<machine> as needed.
# We strip .$MACHINE though
xargs cat < $f | sort -u |
- sed "s,^# ,,;s,^,$OBJTOP/,;s,\.$MACHINE\$,,"
+ sed "s,^# ,,;s,^,$OBJTOP/,;s,\.${TARGET_SPEC:-$MACHINE}\$,,;s,\.$MACHINE\$,,"
;;
*) sort -u $f;;
esac
diff --git a/mk/options.mk b/mk/options.mk
index 7d1bf67915a0..aa54754b2ff4 100644
--- a/mk/options.mk
+++ b/mk/options.mk
@@ -1,4 +1,4 @@
-# $Id: options.mk,v 1.6 2013/01/28 19:28:52 sjg Exp $
+# $Id: options.mk,v 1.7 2013/04/17 20:32:38 sjg Exp $
#
# @(#) Copyright (c) 2012, Simon J. Gerraty
#
@@ -13,7 +13,7 @@
# sjg@crufty.net
#
-# Inspired by FreeBSD bsd.own.mk, but intentionally simpler.
+# Inspired by FreeBSD bsd.own.mk, but intentionally simpler and more flexible.
# Options are normally listed in either OPTIONS_DEFAULT_{YES,NO}
# We convert these to ${OPTION}/{yes,no} in OPTIONS_DEFAULT_VALUES.
@@ -24,35 +24,36 @@
# ${OPTION}/yes in OPTIONS_DEFAULT_VALUES.
# A makefile may set NO_* (or NO*) to indicate it cannot do something.
# User sets WITH_* and WITHOUT_* to indicate what they want.
-# We set MK_* which is then all we need care about.
+# We set ${OPTION_PREFIX:UMK_}* which is then all we need care about.
OPTIONS_DEFAULT_VALUES += \
${OPTIONS_DEFAULT_NO:O:u:S,$,/no,} \
${OPTIONS_DEFAULT_YES:O:u:S,$,/yes,}
+OPTION_PREFIX ?= MK_
.for o in ${OPTIONS_DEFAULT_VALUES:M*/*}
.if ${o:T:tl} == "no"
.if defined(WITH_${o:H}) && !defined(NO_${o:H}) && !defined(NO${o:H})
-MK_${o:H} ?= yes
+${OPTION_PREFIX}${o:H} ?= yes
.else
-MK_${o:H} ?= no
+${OPTION_PREFIX}${o:H} ?= no
.endif
.else
.if defined(WITHOUT_${o:H}) || defined(NO_${o:H}) || defined(NO${o:H})
-MK_${o:H} ?= no
+${OPTION_PREFIX}${o:H} ?= no
.else
-MK_${o:H} ?= yes
+${OPTION_PREFIX}${o:H} ?= yes
.endif
.endif
.endfor
# OPTIONS_DEFAULT_DEPENDENT += FOO_UTILS/FOO
-# if neither WITH[OUT]_FOO_UTILS is set, use value of MK_FOO
+# if neither WITH[OUT]_FOO_UTILS is set, use value of ${OPTION_PREFIX}FOO
.for o in ${OPTIONS_DEFAULT_DEPENDENT:M*/*:O:u}
.if defined(WITH_${o:H}) && !defined(NO_${o:H}) && !defined(NO${o:H})
-MK_${o:H} ?= yes
+${OPTION_PREFIX}${o:H} ?= yes
.elif defined(WITHOUT_${o:H}) || defined(NO_${o:H}) || defined(NO${o:H})
-MK_${o:H} ?= no
+${OPTION_PREFIX}${o:H} ?= no
.else
-MK_${o:H} ?= ${MK_${o:T}}
+${OPTION_PREFIX}${o:H} ?= ${${OPTION_PREFIX}${o:T}}
.endif
.endfor
diff --git a/mk/progs.mk b/mk/progs.mk
index 0fd23120b620..f74f64012849 100644
--- a/mk/progs.mk
+++ b/mk/progs.mk
@@ -1,4 +1,4 @@
-# $Id: progs.mk,v 1.11 2012/11/06 17:18:54 sjg Exp $
+# $Id: progs.mk,v 1.12 2013/04/22 18:10:04 sjg Exp $
#
# @(#) Copyright (c) 2006, Simon J. Gerraty
#
@@ -35,9 +35,11 @@ PROG ?= $t
.if defined(PROG)
# just one of many
-PROG_VARS += CFLAGS CPPFLAGS CXXFLAGS DPADD DPLIBS LDADD MAN SRCS
+PROG_VARS += BINDIR CFLAGS CPPFLAGS CXXFLAGS DPADD DPLIBS LDADD MAN SRCS
.for v in ${PROG_VARS:O:u}
+.if defined(${v}.${PROG})
$v += ${${v}_${PROG}:U${${v}.${PROG}}}
+.endif
.endfor
# for meta mode, there can be only one!
@@ -63,7 +65,8 @@ UPDATE_DEPENDFILE = NO
.include <${.PARSEFILE:S,progs,prog,}>
.ifndef PROG
-PROGS_TARGETS += clean
+# tell progs.mk we might want to install things
+PROGS_TARGETS+= cleandepend cleandir cleanobj depend install
.for p in ${PROGS}
.if defined(PROGS_CXX) && !empty(PROGS_CXX:M$p)
diff --git a/mk/stage-install.sh b/mk/stage-install.sh
new file mode 100755
index 000000000000..64d044fa048c
--- /dev/null
+++ b/mk/stage-install.sh
@@ -0,0 +1,98 @@
+#!/bin/sh
+
+# NAME:
+# stage-install.sh - wrapper around install
+#
+# SYNOPSIS:
+# stage-install.sh [variable="value"] "args" "dest"
+#
+# DESCRIPTION:
+# This script is a wrapper around the normal install(1).
+# Its role is to add '.dirdep' files to the destination.
+# The variables we might use are:
+#
+# INSTALL
+# Path to actual install(1), default is
+# $REAL_INSTALL
+#
+# OBJDIR
+# Path to the dir where '.dirdep' was generated,
+# default is '.'
+#
+# _DIRDEP
+# Path to actual '.dirdep' file, default is
+# $OBJDIR/.dirdep
+#
+# The "args" and "dest" are passed as is to install(1), and if a
+# '.dirdep' file exists it will be linked or copied to each
+# "file".dirdep placed in "dest" or "dest".dirdep if it happed
+# to be a file rather than a directory.
+#
+# SEE ALSO:
+# meta.stage.mk
+#
+
+# RCSid:
+# $Id: stage-install.sh,v 1.5 2013/04/19 16:32:24 sjg Exp $
+#
+# @(#) Copyright (c) 2013, Simon J. Gerraty
+#
+# This file is provided in the hope that it will
+# be of use. There is absolutely NO WARRANTY.
+# Permission to copy, redistribute or otherwise
+# use this file is hereby granted provided that
+# the above copyright notice and this notice are
+# left intact.
+#
+# Please send copies of changes and bug-fixes to:
+# sjg@crufty.net
+#
+
+INSTALL=${REAL_INSTALL:-install}
+OBJDIR=.
+
+while :
+do
+ case "$1" in
+ *=*) eval "$1"; shift;;
+ *) break;;
+ esac
+done
+
+# if .dirdep doesn't exist, just run install and be done
+_DIRDEP=${_DIRDEP:-$OBJDIR/.dirdep}
+[ -s $_DIRDEP ] && EXEC= || EXEC=exec
+$EXEC $INSTALL "$@" || exit 1
+
+# from meta.stage.mk
+LnCp() {
+ rm -f $2 2> /dev/null
+ ln $1 $2 2> /dev/null || cp -p $1 $2
+}
+
+StageDirdep() {
+ t=$1
+ if [ -s $t.dirdep ]; then
+ cmp -s $_DIRDEP $t.dirdep && return
+ echo "ERROR: $t installed by `cat $t.dirdep` not `cat $_DIRDEP`" >&2
+ exit 1
+ fi
+ LnCp $_DIRDEP $t.dirdep || exit 1
+}
+
+args="$@"
+while [ $# -gt 8 ]
+do
+ shift 8
+done
+eval dest=\$$#
+if [ -f $dest ]; then
+ # a file, there can be only one .dirdep needed
+ StageDirdep $dest
+elif [ -d $dest ]; then
+ for f in $args
+ do
+ test -f $f || continue
+ StageDirdep $dest/${f##*/}
+ done
+fi
diff --git a/suff.c b/suff.c
index 6abdeb0459e5..d4f0eb183fc7 100644
--- a/suff.c
+++ b/suff.c
@@ -1,4 +1,4 @@
-/* $NetBSD: suff.c,v 1.69 2011/09/29 23:38:04 sjg Exp $ */
+/* $NetBSD: suff.c,v 1.70 2013/05/18 13:13:34 sjg Exp $ */
/*
* Copyright (c) 1988, 1989, 1990, 1993
@@ -69,14 +69,14 @@
*/
#ifndef MAKE_NATIVE
-static char rcsid[] = "$NetBSD: suff.c,v 1.69 2011/09/29 23:38:04 sjg Exp $";
+static char rcsid[] = "$NetBSD: suff.c,v 1.70 2013/05/18 13:13:34 sjg Exp $";
#else
#include <sys/cdefs.h>
#ifndef lint
#if 0
static char sccsid[] = "@(#)suff.c 8.4 (Berkeley) 3/21/94";
#else
-__RCSID("$NetBSD: suff.c,v 1.69 2011/09/29 23:38:04 sjg Exp $");
+__RCSID("$NetBSD: suff.c,v 1.70 2013/05/18 13:13:34 sjg Exp $");
#endif
#endif /* not lint */
#endif
@@ -2058,118 +2058,124 @@ SuffFindNormalDeps(GNode *gn, Lst slst)
* children, then look for any overriding transformations they imply.
* Should we find one, we discard the one we found before.
*/
+ bottom = NULL;
+ targ = NULL;
- while (ln != NULL) {
- /*
- * Look for next possible suffix...
- */
- ln = Lst_FindFrom(sufflist, ln, &sd, SuffSuffIsSuffixP);
-
- if (ln != NULL) {
- int prefLen; /* Length of the prefix */
+ if (!(gn->type & OP_PHONY)) {
+ while (ln != NULL) {
/*
- * Allocate a Src structure to which things can be transformed
+ * Look for next possible suffix...
*/
+ ln = Lst_FindFrom(sufflist, ln, &sd, SuffSuffIsSuffixP);
+
+ if (ln != NULL) {
+ int prefLen; /* Length of the prefix */
+
+ /*
+ * Allocate a Src structure to which things can be transformed
+ */
+ targ = bmake_malloc(sizeof(Src));
+ targ->file = bmake_strdup(gn->name);
+ targ->suff = (Suff *)Lst_Datum(ln);
+ targ->suff->refCount++;
+ targ->node = gn;
+ targ->parent = NULL;
+ targ->children = 0;
+#ifdef DEBUG_SRC
+ targ->cp = Lst_Init(FALSE);
+#endif
+
+ /*
+ * Allocate room for the prefix, whose end is found by
+ * subtracting the length of the suffix from
+ * the end of the name.
+ */
+ prefLen = (eoname - targ->suff->nameLen) - sopref;
+ targ->pref = bmake_malloc(prefLen + 1);
+ memcpy(targ->pref, sopref, prefLen);
+ targ->pref[prefLen] = '\0';
+
+ /*
+ * Add nodes from which the target can be made
+ */
+ SuffAddLevel(srcs, targ);
+
+ /*
+ * Record the target so we can nuke it
+ */
+ (void)Lst_AtEnd(targs, targ);
+
+ /*
+ * Search from this suffix's successor...
+ */
+ ln = Lst_Succ(ln);
+ }
+ }
+
+ /*
+ * Handle target of unknown suffix...
+ */
+ if (Lst_IsEmpty(targs) && suffNull != NULL) {
+ if (DEBUG(SUFF)) {
+ fprintf(debug_file, "\tNo known suffix on %s. Using .NULL suffix\n", gn->name);
+ }
+
targ = bmake_malloc(sizeof(Src));
targ->file = bmake_strdup(gn->name);
- targ->suff = (Suff *)Lst_Datum(ln);
+ targ->suff = suffNull;
targ->suff->refCount++;
targ->node = gn;
targ->parent = NULL;
targ->children = 0;
+ targ->pref = bmake_strdup(sopref);
#ifdef DEBUG_SRC
targ->cp = Lst_Init(FALSE);
#endif
/*
- * Allocate room for the prefix, whose end is found by subtracting
- * the length of the suffix from the end of the name.
+ * Only use the default suffix rules if we don't have commands
+ * defined for this gnode; traditional make programs used to
+ * not define suffix rules if the gnode had children but we
+ * don't do this anymore.
*/
- prefLen = (eoname - targ->suff->nameLen) - sopref;
- targ->pref = bmake_malloc(prefLen + 1);
- memcpy(targ->pref, sopref, prefLen);
- targ->pref[prefLen] = '\0';
+ if (Lst_IsEmpty(gn->commands))
+ SuffAddLevel(srcs, targ);
+ else {
+ if (DEBUG(SUFF))
+ fprintf(debug_file, "not ");
+ }
- /*
- * Add nodes from which the target can be made
- */
- SuffAddLevel(srcs, targ);
+ if (DEBUG(SUFF))
+ fprintf(debug_file, "adding suffix rules\n");
- /*
- * Record the target so we can nuke it
- */
(void)Lst_AtEnd(targs, targ);
-
- /*
- * Search from this suffix's successor...
- */
- ln = Lst_Succ(ln);
- }
- }
-
- /*
- * Handle target of unknown suffix...
- */
- if (Lst_IsEmpty(targs) && suffNull != NULL) {
- if (DEBUG(SUFF)) {
- fprintf(debug_file, "\tNo known suffix on %s. Using .NULL suffix\n", gn->name);
}
- targ = bmake_malloc(sizeof(Src));
- targ->file = bmake_strdup(gn->name);
- targ->suff = suffNull;
- targ->suff->refCount++;
- targ->node = gn;
- targ->parent = NULL;
- targ->children = 0;
- targ->pref = bmake_strdup(sopref);
-#ifdef DEBUG_SRC
- targ->cp = Lst_Init(FALSE);
-#endif
-
/*
- * Only use the default suffix rules if we don't have commands
- * defined for this gnode; traditional make programs used to
- * not define suffix rules if the gnode had children but we
- * don't do this anymore.
+ * Using the list of possible sources built up from the target
+ * suffix(es), try and find an existing file/target that matches.
*/
- if (Lst_IsEmpty(gn->commands))
- SuffAddLevel(srcs, targ);
- else {
- if (DEBUG(SUFF))
- fprintf(debug_file, "not ");
- }
-
- if (DEBUG(SUFF))
- fprintf(debug_file, "adding suffix rules\n");
-
- (void)Lst_AtEnd(targs, targ);
- }
-
- /*
- * Using the list of possible sources built up from the target suffix(es),
- * try and find an existing file/target that matches.
- */
- bottom = SuffFindThem(srcs, slst);
+ bottom = SuffFindThem(srcs, slst);
- if (bottom == NULL) {
- /*
- * No known transformations -- use the first suffix found for setting
- * the local variables.
- */
- if (!Lst_IsEmpty(targs)) {
- targ = (Src *)Lst_Datum(Lst_First(targs));
+ if (bottom == NULL) {
+ /*
+ * No known transformations -- use the first suffix found
+ * for setting the local variables.
+ */
+ if (!Lst_IsEmpty(targs)) {
+ targ = (Src *)Lst_Datum(Lst_First(targs));
+ } else {
+ targ = NULL;
+ }
} else {
- targ = NULL;
+ /*
+ * Work up the transformation path to find the suffix of the
+ * target to which the transformation was made.
+ */
+ for (targ = bottom; targ->parent != NULL; targ = targ->parent)
+ continue;
}
- } else {
- /*
- * Work up the transformation path to find the suffix of the
- * target to which the transformation was made.
- */
- for (targ = bottom; targ->parent != NULL; targ = targ->parent)
- continue;
}
Var_Set(TARGET, gn->path ? gn->path : gn->name, gn, 0);
@@ -2419,12 +2425,7 @@ SuffFindDeps(GNode *gn, Lst slst)
*/
Var_Set(TARGET, gn->path ? gn->path : gn->name, gn, 0);
Var_Set(PREFIX, gn->name, gn, 0);
- if (gn->type & OP_PHONY) {
- /*
- * If this is a .PHONY target, we do not apply suffix rules.
- */
- return;
- }
+
if (DEBUG(SUFF)) {
fprintf(debug_file, "SuffFindDeps (%s)\n", gn->name);
}
diff --git a/var.c b/var.c
index c8fd8f50c933..fa58be6304df 100644
--- a/var.c
+++ b/var.c
@@ -1,4 +1,4 @@
-/* $NetBSD: var.c,v 1.173 2013/02/24 19:43:37 christos Exp $ */
+/* $NetBSD: var.c,v 1.174 2013/05/18 13:12:45 sjg Exp $ */
/*
* Copyright (c) 1988, 1989, 1990, 1993
@@ -69,14 +69,14 @@
*/
#ifndef MAKE_NATIVE
-static char rcsid[] = "$NetBSD: var.c,v 1.173 2013/02/24 19:43:37 christos Exp $";
+static char rcsid[] = "$NetBSD: var.c,v 1.174 2013/05/18 13:12:45 sjg Exp $";
#else
#include <sys/cdefs.h>
#ifndef lint
#if 0
static char sccsid[] = "@(#)var.c 8.3 (Berkeley) 3/19/94";
#else
-__RCSID("$NetBSD: var.c,v 1.173 2013/02/24 19:43:37 christos Exp $");
+__RCSID("$NetBSD: var.c,v 1.174 2013/05/18 13:12:45 sjg Exp $");
#endif
#endif /* not lint */
#endif
@@ -529,11 +529,20 @@ void
Var_Delete(const char *name, GNode *ctxt)
{
Hash_Entry *ln;
-
- ln = Hash_FindEntry(&ctxt->context, name);
+ char *cp;
+
+ if (strchr(name, '$')) {
+ cp = Var_Subst(NULL, name, VAR_GLOBAL, 0);
+ } else {
+ cp = (char *)name;
+ }
+ ln = Hash_FindEntry(&ctxt->context, cp);
if (DEBUG(VAR)) {
fprintf(debug_file, "%s:delete %s%s\n",
- ctxt->name, name, ln ? "" : " (not found)");
+ ctxt->name, cp, ln ? "" : " (not found)");
+ }
+ if (cp != name) {
+ free(cp);
}
if (ln != NULL) {
Var *v;