Import bmake-20180222

From ChangeLog

* VERSION: 20180222
  Merge with NetBSD make, pick up
  o parse.c: avoid calling sysconf for every call to loadfile

* VERSION: 20180218
  Merge with NetBSD make, pick up
  o var.c: Var_Set handle NULL value anytime.

* VERSION: 20180212
  Merge with NetBSD make, pick up
  o parse.c: do not treat .info as warning with -W

* VERSION: 20171207
  Merge with NetBSD make, pick up
  o var.c: Var_Append use Var_Set if var not previously set
    so that VAR_CMD is handled correctly.
    Add a suitable unit-test.

* VERSION: 20171126

* aclocal.m4: use AC_LINK_IFELSE for AC_C___ATTRIBUTE__
  since AC_TRY_COMPILE puts input inside main()
  which upsets modern compilers.

* VERSION: 20171118
  Merge with NetBSD make, pick up
  o var.c: do not append to variable set on command line
    add unit-test to catch this.
This commit is contained in:
Simon J. Gerraty 2018-03-01 23:45:44 +00:00
parent ade1697bee
commit 2358deb654
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/vendor/NetBSD/bmake/dist/; revision=330258
svn path=/vendor/NetBSD/bmake/20180222/; revision=330259; tag=vendor/NetBSD/bmake/20180222
29 changed files with 870 additions and 622 deletions

View File

@ -1,3 +1,44 @@
2018-02-22 Simon J. Gerraty <sjg@bad.crufty.net>
* VERSION: 20180222
Merge with NetBSD make, pick up
o parse.c: avoid calling sysconf for every call to loadfile
2018-02-18 Simon J. Gerraty <sjg@bad.crufty.net>
* VERSION: 20180218
Merge with NetBSD make, pick up
o var.c: Var_Set handle NULL value anytime.
2018-02-12 Simon J. Gerraty <sjg@bad.crufty.net>
* VERSION: 20180212
Merge with NetBSD make, pick up
o parse.c: do not treat .info as warning with -W
2017-12-07 Simon J. Gerraty <sjg@bad.crufty.net>
* VERSION: 20171207
Merge with NetBSD make, pick up
o var.c: Var_Append use Var_Set if var not previously set
so that VAR_CMD is handled correctly.
Add a suitable unit-test.
2017-11-26 Simon J. Gerraty <sjg@bad.crufty.net>
* VERSION (_MAKE_VERSION): 20171126
* aclocal.m4: use AC_LINK_IFELSE for AC_C___ATTRIBUTE__
since AC_TRY_COMPILE puts input inside main()
which upsets modern compilers.
2017-11-18 Simon J. Gerraty <sjg@bad.crufty.net>
* VERSION: 20171118
Merge with NetBSD make, pick up
o var.c: do not append to variable set on command line
add unit-test to catch this.
2017-10-28 Simon J. Gerraty <sjg@bad.crufty.net> 2017-10-28 Simon J. Gerraty <sjg@bad.crufty.net>
* VERSION: 20171028 * VERSION: 20171028

View File

@ -15,7 +15,7 @@ LDFLAGS= @LDFLAGS@
LIBOBJS= @LIBOBJS@ LIBOBJS= @LIBOBJS@
LDADD= @LIBS@ LDADD= @LIBS@
USE_META= @use_meta@ USE_META= @use_meta@
FILEMON_H= @filemon_h@ FILEMON_H?= @filemon_h@
BMAKE_PATH_MAX?= @bmake_path_max@ BMAKE_PATH_MAX?= @bmake_path_max@
# used if MAXPATHLEN not defined # used if MAXPATHLEN not defined
CPPFLAGS+= -DBMAKE_PATH_MAX=${BMAKE_PATH_MAX} CPPFLAGS+= -DBMAKE_PATH_MAX=${BMAKE_PATH_MAX}

View File

@ -1,2 +1,2 @@
# keep this compatible with sh and make # keep this compatible with sh and make
_MAKE_VERSION=20171028 _MAKE_VERSION=20180222

13
aclocal.m4 vendored
View File

@ -1,5 +1,5 @@
dnl RCSid: dnl RCSid:
dnl $Id: aclocal.m4,v 1.5 2003/03/06 21:21:30 sjg Exp $ dnl $Id: aclocal.m4,v 1.6 2017/11/26 22:39:20 sjg Exp $
dnl dnl
dnl dnl
@ -55,10 +55,9 @@ dnl
AC_DEFUN(AC_C___ATTRIBUTE__, [ AC_DEFUN(AC_C___ATTRIBUTE__, [
AC_MSG_CHECKING(for __attribute__) AC_MSG_CHECKING(for __attribute__)
AC_CACHE_VAL(ac_cv___attribute__, [ AC_CACHE_VAL(ac_cv___attribute__, [
AC_TRY_COMPILE([ AC_LINK_IFELSE([
#include <stdlib.h> #include <stdlib.h>
],
[
static void foo(void) __attribute__ ((noreturn)); static void foo(void) __attribute__ ((noreturn));
static void static void
@ -66,6 +65,12 @@ foo(void)
{ {
exit(1); exit(1);
} }
int
main(int argc, char **argv)
{
foo();
}
], ],
ac_cv___attribute__=yes, ac_cv___attribute__=yes,
ac_cv___attribute__=no)]) ac_cv___attribute__=no)])

1076
bmake.cat1

File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 81 KiB

After

Width:  |  Height:  |  Size: 78 KiB

34
configure vendored
View File

@ -1,6 +1,6 @@
#! /bin/sh #! /bin/sh
# Guess values for system-dependent variables and create Makefiles. # Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.64 for bmake 20170812. # Generated by GNU Autoconf 2.64 for bmake 20171126.
# #
# Report bugs to <sjg@NetBSD.org>. # Report bugs to <sjg@NetBSD.org>.
# #
@ -549,8 +549,8 @@ MAKEFLAGS=
# Identity of this package. # Identity of this package.
PACKAGE_NAME='bmake' PACKAGE_NAME='bmake'
PACKAGE_TARNAME='bmake' PACKAGE_TARNAME='bmake'
PACKAGE_VERSION='20170812' PACKAGE_VERSION='20171126'
PACKAGE_STRING='bmake 20170812' PACKAGE_STRING='bmake 20171126'
PACKAGE_BUGREPORT='sjg@NetBSD.org' PACKAGE_BUGREPORT='sjg@NetBSD.org'
PACKAGE_URL='' PACKAGE_URL=''
@ -1222,7 +1222,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing. # Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh. # This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF cat <<_ACEOF
\`configure' configures bmake 20170812 to adapt to many kinds of systems. \`configure' configures bmake 20171126 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]... Usage: $0 [OPTION]... [VAR=VALUE]...
@ -1283,7 +1283,7 @@ fi
if test -n "$ac_init_help"; then if test -n "$ac_init_help"; then
case $ac_init_help in case $ac_init_help in
short | recursive ) echo "Configuration of bmake 20170812:";; short | recursive ) echo "Configuration of bmake 20171126:";;
esac esac
cat <<\_ACEOF cat <<\_ACEOF
@ -1388,7 +1388,7 @@ fi
test -n "$ac_init_help" && exit $ac_status test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then if $ac_init_version; then
cat <<\_ACEOF cat <<\_ACEOF
bmake configure 20170812 bmake configure 20171126
generated by GNU Autoconf 2.64 generated by GNU Autoconf 2.64
Copyright (C) 2009 Free Software Foundation, Inc. Copyright (C) 2009 Free Software Foundation, Inc.
@ -1961,7 +1961,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake. running configure, to aid debugging if configure makes a mistake.
It was created by bmake $as_me 20170812, which was It was created by bmake $as_me 20171126, which was
generated by GNU Autoconf 2.64. Invocation command line was generated by GNU Autoconf 2.64. Invocation command line was
$ $0 $@ $ $0 $@
@ -4722,10 +4722,6 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
#include <stdlib.h> #include <stdlib.h>
int
main ()
{
static void foo(void) __attribute__ ((noreturn)); static void foo(void) __attribute__ ((noreturn));
static void static void
@ -4734,16 +4730,20 @@ foo(void)
exit(1); exit(1);
} }
; int
return 0; main(int argc, char **argv)
{
foo();
} }
_ACEOF _ACEOF
if ac_fn_c_try_compile "$LINENO"; then : if ac_fn_c_try_link "$LINENO"; then :
ac_cv___attribute__=yes ac_cv___attribute__=yes
else else
ac_cv___attribute__=no ac_cv___attribute__=no
fi fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
fi fi
if test "$ac_cv___attribute__" = "yes"; then if test "$ac_cv___attribute__" = "yes"; then
@ -6517,7 +6517,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their # report actual input values of CONFIG_FILES etc. instead of their
# values after options handling. # values after options handling.
ac_log=" ac_log="
This file was extended by bmake $as_me 20170812, which was This file was extended by bmake $as_me 20171126, which was
generated by GNU Autoconf 2.64. Invocation command line was generated by GNU Autoconf 2.64. Invocation command line was
CONFIG_FILES = $CONFIG_FILES CONFIG_FILES = $CONFIG_FILES
@ -6577,7 +6577,7 @@ Report bugs to <sjg@NetBSD.org>."
_ACEOF _ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_version="\\ ac_cs_version="\\
bmake config.status 20170812 bmake config.status 20171126
configured by $0, generated by GNU Autoconf 2.64, configured by $0, generated by GNU Autoconf 2.64,
with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"

View File

@ -1,11 +1,11 @@
dnl dnl
dnl RCSid: dnl RCSid:
dnl $Id: configure.in,v 1.58 2017/08/13 00:56:10 sjg Exp $ dnl $Id: configure.in,v 1.59 2017/11/26 22:39:20 sjg Exp $
dnl dnl
dnl Process this file with autoconf to produce a configure script dnl Process this file with autoconf to produce a configure script
dnl dnl
AC_PREREQ(2.50) AC_PREREQ(2.50)
AC_INIT([bmake], [20170812], [sjg@NetBSD.org]) AC_INIT([bmake], [20171126], [sjg@NetBSD.org])
AC_CONFIG_HEADERS(config.h) AC_CONFIG_HEADERS(config.h)
dnl make srcdir absolute dnl make srcdir absolute

8
job.c
View File

@ -1,4 +1,4 @@
/* $NetBSD: job.c,v 1.191 2017/07/20 19:29:54 sjg Exp $ */ /* $NetBSD: job.c,v 1.192 2018/02/08 09:05:21 dholland Exp $ */
/* /*
* Copyright (c) 1988, 1989, 1990 The Regents of the University of California. * Copyright (c) 1988, 1989, 1990 The Regents of the University of California.
@ -70,14 +70,14 @@
*/ */
#ifndef MAKE_NATIVE #ifndef MAKE_NATIVE
static char rcsid[] = "$NetBSD: job.c,v 1.191 2017/07/20 19:29:54 sjg Exp $"; static char rcsid[] = "$NetBSD: job.c,v 1.192 2018/02/08 09:05:21 dholland Exp $";
#else #else
#include <sys/cdefs.h> #include <sys/cdefs.h>
#ifndef lint #ifndef lint
#if 0 #if 0
static char sccsid[] = "@(#)job.c 8.2 (Berkeley) 3/19/94"; static char sccsid[] = "@(#)job.c 8.2 (Berkeley) 3/19/94";
#else #else
__RCSID("$NetBSD: job.c,v 1.191 2017/07/20 19:29:54 sjg Exp $"); __RCSID("$NetBSD: job.c,v 1.192 2018/02/08 09:05:21 dholland Exp $");
#endif #endif
#endif /* not lint */ #endif /* not lint */
#endif #endif
@ -102,7 +102,7 @@ __RCSID("$NetBSD: job.c,v 1.191 2017/07/20 19:29:54 sjg Exp $");
* a time given by the SEL_* constants, below, * a time given by the SEL_* constants, below,
* or until output is ready. * or until output is ready.
* *
* Job_Init Called to intialize this module. in addition, * Job_Init Called to initialize this module. in addition,
* any commands attached to the .BEGIN target * any commands attached to the .BEGIN target
* are executed before this function returns. * are executed before this function returns.
* Hence, the makefile must have been parsed * Hence, the makefile must have been parsed

3
make.h
View File

@ -1,4 +1,4 @@
/* $NetBSD: make.h,v 1.103 2017/07/20 19:29:54 sjg Exp $ */ /* $NetBSD: make.h,v 1.104 2018/02/12 21:38:09 sjg Exp $ */
/* /*
* Copyright (c) 1988, 1989, 1990, 1993 * Copyright (c) 1988, 1989, 1990, 1993
@ -346,6 +346,7 @@ typedef struct GNode {
* once the makefile has been parsed. PARSE_WARNING means it can. Passed * once the makefile has been parsed. PARSE_WARNING means it can. Passed
* as the first argument to Parse_Error. * as the first argument to Parse_Error.
*/ */
#define PARSE_INFO 3
#define PARSE_WARNING 2 #define PARSE_WARNING 2
#define PARSE_FATAL 1 #define PARSE_FATAL 1

4
meta.c
View File

@ -1,4 +1,4 @@
/* $NetBSD: meta.c,v 1.69 2017/08/10 21:07:48 sjg Exp $ */ /* $NetBSD: meta.c,v 1.70 2018/02/13 19:37:30 sjg Exp $ */
/* /*
* Implement 'meta' mode. * Implement 'meta' mode.
@ -790,7 +790,9 @@ meta_cmd_finish(void *pbmp)
{ {
int error = 0; int error = 0;
BuildMon *pbm = pbmp; BuildMon *pbm = pbmp;
#ifdef USE_FILEMON
int x; int x;
#endif
if (!pbm) if (!pbm)
pbm = &Mybm; pbm = &Mybm;

View File

@ -1,3 +1,21 @@
2018-01-18 Simon J Gerraty <sjg@beast.crufty.net>
* install-mk (MK_VERSION): 20180118
* ldorder.mk: let make compute correct link order
2017-12-12 Simon J Gerraty <sjg@beast.crufty.net>
* install-mk (MK_VERSION): 20171212
* gendirdeps.mk: guard against bogus entries in GENDIRDEPS_FILTER
2017-11-14 Simon J. Gerraty <sjg@bad.crufty.net>
* install-mk (MK_VERSION): 20171111
* lib.mk: ensure META_NOECHO is set
2017-10-25 Simon J. Gerraty <sjg@bad.crufty.net> 2017-10-25 Simon J. Gerraty <sjg@bad.crufty.net>
* Allow for host32 on rare occasions. * Allow for host32 on rare occasions.

View File

@ -17,6 +17,7 @@ inc.mk
init.mk init.mk
install-mk install-mk
java.mk java.mk
ldorder.mk
lib.mk lib.mk
libnames.mk libnames.mk
libs.mk libs.mk

View File

@ -1,4 +1,4 @@
# $Id: auto.obj.mk,v 1.14 2017/04/18 23:53:18 sjg Exp $ # $Id: auto.obj.mk,v 1.15 2017/11/04 21:05:04 sjg Exp $
# #
# @(#) Copyright (c) 2004, Simon J. Gerraty # @(#) Copyright (c) 2004, Simon J. Gerraty
# #
@ -60,11 +60,17 @@ __objdir_made != echo ${__objdir}/; umask ${OBJDIR_UMASK:U002}; \
.endif .endif
# This causes make to use the specified directory as .OBJDIR # This causes make to use the specified directory as .OBJDIR
.OBJDIR: ${__objdir} .OBJDIR: ${__objdir}
.if ${.OBJDIR:tA} != ${__objdir:tA} && ${__objdir_made:Uno:M${__objdir}/*} != "" .if ${.OBJDIR:tA} != ${__objdir:tA}
# we did not get what we want - do we care?
.if ${__objdir_made:Uno:M${__objdir}/*} != ""
# watch out for __objdir being relative path # watch out for __objdir being relative path
.if !(${__objdir:M/*} == "" && ${.OBJDIR:tA} == ${${.CURDIR}/${__objdir}:L:tA}) .if !(${__objdir:M/*} == "" && ${.OBJDIR:tA} == ${${.CURDIR}/${__objdir}:L:tA})
.error could not use ${__objdir}: .OBJDIR=${.OBJDIR} .error could not use ${__objdir}: .OBJDIR=${.OBJDIR}
.endif .endif
.endif .endif
# apparently we can live with it
# make sure we know what we have
.OBJDIR: ${.CURDIR}
.endif
.endif .endif
.endif .endif

View File

@ -1,4 +1,4 @@
# $Id: dpadd.mk,v 1.24 2017/10/25 23:44:20 sjg Exp $ # $Id: dpadd.mk,v 1.26 2018/02/12 21:54:26 sjg Exp $
# #
# @(#) Copyright (c) 2004, Simon J. Gerraty # @(#) Copyright (c) 2004, Simon J. Gerraty
# #
@ -60,6 +60,7 @@ LDADD += ${LDADD_${__lib:T:R}:U${__lib:T:R:S/lib/-l/:C/\.so.*//}}
# DPADD can contain things other than libs # DPADD can contain things other than libs
__dpadd_libs := ${DPADD:M*/lib*} __dpadd_libs := ${DPADD:M*/lib*}
.if defined(PROG) && ${MK_PROG_LDORDER_MK:Uno} != "no"
# some libs have dependencies... # some libs have dependencies...
# DPLIBS_* allows bsd.libnames.mk to flag libs which must be included # DPLIBS_* allows bsd.libnames.mk to flag libs which must be included
# in DPADD for a given library. # in DPADD for a given library.
@ -73,6 +74,7 @@ __ldadd_all_xtras+= ${LDADD_${__lib}:U${__lib:T:R:S/lib/-l/:C/\.so.*//}}
DPADD+= ${__lib} DPADD+= ${__lib}
.endif .endif
.endfor .endfor
.endif
# Last of all... for libc and libgcc # Last of all... for libc and libgcc
DPADD+= ${DPADD_LAST} DPADD+= ${DPADD_LAST}
@ -125,9 +127,11 @@ SRC_LIBS+= ${_OBJDIR}/lib${LIB}.a
# #
SRC_LIBS?= SRC_LIBS?=
__dpadd_libs += ${SRC_LIBS} # magic_libs includes those we want to link with
DPMAGIC_LIBS += ${__dpadd_libs} \ # as well as those we might look at
${__dpadd_libs:@d@${DPMAGIC_LIBS_${d:T:R}}@} __dpadd_magic_libs += ${__dpadd_libs} ${SRC_LIBS}
DPMAGIC_LIBS += ${__dpadd_magic_libs} \
${__dpadd_magic_libs:@d@${DPMAGIC_LIBS_${d:T:R}}@}
# we skip this for staged libs # we skip this for staged libs
.for __lib in ${DPMAGIC_LIBS:O:u:N${STAGE_OBJTOP:Unot}*/lib/*} .for __lib in ${DPMAGIC_LIBS:O:u:N${STAGE_OBJTOP:Unot}*/lib/*}
@ -189,11 +193,11 @@ LDADD := ${LDADD:S,^${__ldadd}$,${__ldadd}_p,g}
# #
# We take care of duplicate suppression later. # We take care of duplicate suppression later.
# don't apply :T:R too early # don't apply :T:R too early
__dpadd_incs += ${__dpadd_libs:u:@x@${INCLUDES_${x:T:R}}@} __dpadd_incs += ${__dpadd_magic_libs:u:@x@${INCLUDES_${x:T:R}}@}
__dpadd_incs += ${__dpadd_libs:O:u:@s@${SRC_LIBS_${s:T:R}:U}@:@x@${INCLUDES_${x:T:R}}@} __dpadd_incs += ${__dpadd_magic_libs:O:u:@s@${SRC_LIBS_${s:T:R}:U}@:@x@${INCLUDES_${x:T:R}}@}
__dpadd_last_incs += ${__dpadd_libs:u:@x@${INCLUDES_LAST_${x:T:R}}@} __dpadd_last_incs += ${__dpadd_magic_libs:u:@x@${INCLUDES_LAST_${x:T:R}}@}
__dpadd_last_incs += ${__dpadd_libs:O:u:@s@${SRC_LIBS_${s:T:R}:U}@:@x@${INCLUDES_LAST_${x:T:R}}@} __dpadd_last_incs += ${__dpadd_magic_libs:O:u:@s@${SRC_LIBS_${s:T:R}:U}@:@x@${INCLUDES_LAST_${x:T:R}}@}
.if defined(HOSTPROG) || ${MACHINE:Nhost*} == "" .if defined(HOSTPROG) || ${MACHINE:Nhost*} == ""
# we want any -I/usr/* last # we want any -I/usr/* last

View File

@ -1,4 +1,4 @@
# $Id: final.mk,v 1.8 2017/05/07 20:30:08 sjg Exp $ # $Id: final.mk,v 1.9 2018/01/24 22:57:11 sjg Exp $
.if !target(__${.PARSEFILE}__) .if !target(__${.PARSEFILE}__)
__${.PARSEFILE}__: __${.PARSEFILE}__:
@ -6,14 +6,14 @@ __${.PARSEFILE}__:
# provide a hook for folk who want to do scary stuff # provide a hook for folk who want to do scary stuff
.-include <${.CURDIR:H}/Makefile-final.inc> .-include <${.CURDIR:H}/Makefile-final.inc>
.-include <local.final.mk>
.if ${MK_STAGING} == "yes" .if ${MK_STAGING} == "yes"
.include <meta.stage.mk> .include <meta.stage.mk>
.elif !empty(STAGE) .elif !empty(STAGE)
.-include <stage.mk> .-include <stage.mk>
.endif .endif
.-include <local.final.mk>
.if empty(_SKIP_BUILD) .if empty(_SKIP_BUILD)
install: realinstall install: realinstall
.endif .endif

View File

@ -1,4 +1,4 @@
# $Id: gendirdeps.mk,v 1.34 2017/10/26 00:46:26 sjg Exp $ # $Id: gendirdeps.mk,v 1.37 2018/01/31 19:06:46 sjg Exp $
# Copyright (c) 2010-2013, Juniper Networks, Inc. # Copyright (c) 2010-2013, Juniper Networks, Inc.
# All rights reserved. # All rights reserved.
@ -255,7 +255,9 @@ DIRDEPS += \
${dirdep_list:M${RELDIR}/*:@d@${.MAKE.MAKEFILE_PREFERENCE:@m@${exists(${SRCTOP}/$d/$m):?$d:${exists(${SRCTOP}/${d:R}/$m):?$d:}}@}@} \ ${dirdep_list:M${RELDIR}/*:@d@${.MAKE.MAKEFILE_PREFERENCE:@m@${exists(${SRCTOP}/$d/$m):?$d:${exists(${SRCTOP}/${d:R}/$m):?$d:}}@}@} \
${qualdir_list:M${RELDIR}/*:@d@${.MAKE.MAKEFILE_PREFERENCE:@m@${exists(${SRCTOP}/${d:R}/$m):?$d:}@}@} ${qualdir_list:M${RELDIR}/*:@d@${.MAKE.MAKEFILE_PREFERENCE:@m@${exists(${SRCTOP}/${d:R}/$m):?$d:}@}@}
DIRDEPS := ${DIRDEPS:${GENDIRDEPS_FILTER:UNno:ts:}:C,//+,/,g:O:u} # what modifiers do we allow in GENDIRDEPS_FILTER
GENDIRDEPS_FILTER_MASK += @CMNS
DIRDEPS := ${DIRDEPS:${GENDIRDEPS_FILTER:UNno:M[${GENDIRDEPS_FILTER_MASK:O:u:ts}]*:ts:}:C,//+,/,g:O:u}
.if ${DEBUG_GENDIRDEPS:Uno:@x@${RELDIR:M$x}@} != "" .if ${DEBUG_GENDIRDEPS:Uno:@x@${RELDIR:M$x}@} != ""
.info ${RELDIR}: M2D_OBJROOTS=${M2D_OBJROOTS} .info ${RELDIR}: M2D_OBJROOTS=${M2D_OBJROOTS}

View File

@ -55,7 +55,7 @@
# Simon J. Gerraty <sjg@crufty.net> # Simon J. Gerraty <sjg@crufty.net>
# RCSid: # RCSid:
# $Id: install-mk,v 1.150 2017/10/19 03:50:51 sjg Exp $ # $Id: install-mk,v 1.153 2018/01/24 22:57:11 sjg Exp $
# #
# @(#) Copyright (c) 1994 Simon J. Gerraty # @(#) Copyright (c) 1994 Simon J. Gerraty
# #
@ -70,7 +70,7 @@
# sjg@crufty.net # sjg@crufty.net
# #
MK_VERSION=20171018 MK_VERSION=20180118
OWNER= OWNER=
GROUP= GROUP=
MODE=444 MODE=444

127
mk/ldorder.mk Normal file
View File

@ -0,0 +1,127 @@
# $Id: ldorder.mk,v 1.18 2018/02/11 18:27:59 sjg Exp $
#
# @(#) Copyright (c) 2015, 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
#
# Try to compute optimal link order.
# When using only shared libs link order does not much matter,
# but archive libs are a different matter.
# We can construct a graph of .ldorder-lib${LIB*} dependencies
# and associate each with _LDORDER_USE to output the relevant
# ld flags.
# Due to the nature of make, the result will be in the reverse order
# that we want to feed to ld.
# So we need to reverse it before use.
.if !target(_LDORDER_USE)
# does caller want to use ldorder?
# yes for prog, normally no for lib
_ldorder_use := ${.ALLTARGETS:Mldorder}
.-include <local.ldorder.mk>
# convert /path/to/libfoo.a into _{LIBFOO}
LDORDER_INC_FILTER += S,+,PLUS,g S,.so$$,,g
LDORDER_LIBS_FILTER += O:u
LDORDER_INC ?= ldorder.inc
REFERENCE_FILE ?= :
_LDORDER_USE: .ldorder-rm .USE .NOTMAIN
@echo depends: ${.ALLSRC:M.ldorder-lib*} > /dev/null
@echo ${LDADD_${.TARGET:T:S,.ldorder-,,}:U${.TARGET:T:S/.ldorder-lib/-l/}} >> .ldorder
@${META_COOKIE_TOUCH}
# we need to truncate our working file
.ldorder-rm: .NOTMAIN
@rm -f .ldorder ldorder-*
@${.ALLSRC:O:u:@f@${REFERENCE_FILE} < $f;@}
@${META_COOKIE_TOUCH}
# make sure this exists
.ldorder: .NOTMAIN
# and finally we need to reverse the order of content
ldorder: .ldorder .NOTMAIN
@{ test ! -s .ldorder || cat -n .ldorder | sort -rn | \
sed '/ldorder-/d;s,^[[:space:]0-9]*,,'; } > ${.TARGET}
# Initially we hook contents of DPLIBS and DPADD into our graph
LDORDER_LIBS ?= ${DPLIBS} ${DPADD:M*/lib*} ${__dpadd_libs}
# we need to remember this
_LDORDER_LIBS := ${LDORDER_LIBS:${LDORDER_LIBS_FILTER:ts:}}
.if empty(_LDORDER_LIBS)
# don't use stale ldorder
LDADD_LDORDER =
.else
# this is how you use it
LDADD_LDORDER ?= `cat ldorder`
.endif
# for debug below
_ldorder = ${RELDIR}.${TARGET_SPEC}
.endif # !target(_LDORDER_USE)
.if !empty(LDORDER_LIBS) && !empty(_ldorder_use)
# canonicalize - these are just tokens anyway
LDORDER_LIBS := ${LDORDER_LIBS:${LDORDER_LIBS_FILTER:ts:}:R:C/\.so.*//}
_ldorders := ${LDORDER_LIBS:T:Mlib*:S,^,.ldorder-,}
.for t in ${_ldorders}
.if !target($t)
$t: _LDORDER_USE
.endif
.endfor
# and this makes it all happen
.ldorder: ${_ldorders}
# this is how we get the dependencies
.if ${.INCLUDEDFROMFILE:M*.${LDORDER_INC}} != ""
_ldorder := .ldorder-${.INCLUDEDFROMFILE:S/.${LDORDER_INC}//}
${_ldorder}: ${_ldorders}
.ldorder-rm: ${.INCLUDEDFROMDIR}/${.INCLUDEDFROMFILE}
.endif
# set DEBUG_LDORDER to pattern[s] that match the dirs of interest
.if ${DEBUG_LDORDER:Uno:@x@${RELDIR:M$x}@} != ""
.info ${_ldorder}: ${_ldorders}
.endif
# now try to find more ...
# each *.${LDORDER_INC} should set LDORDER_LIBS to what it needs
# it can also add to CFLAGS etc.
.for __inc in ${LDORDER_LIBS:S,$,.${LDORDER_INC},}
.if !target(__${__inc}__)
__${__inc}__:
# make sure this is reset
LDORDER_LIBS =
.-include <${__inc}>
.endif
.endfor
.endif # !empty(LDORDER_LIBS)
.ifdef LIB
# you can make this depend on files (must match *ldorder*)
# to add extra content - like CFLAGS
libLDORDER_INC = lib${LIB}.${LDORDER_INC}
.if !commands(${libLDORDER_INC})
${libLDORDER_INC}:
@(cat /dev/null ${.ALLSRC:M*ldorder*}; \
echo 'LDORDER_LIBS= ${_LDORDER_LIBS:T:R:${LDORDER_INC_FILTER:ts:}:tu:C,.*,_{&},}'; \
echo; echo '.include <ldorder.mk>' ) | sed 's,_{,$${,g' > ${.TARGET}
.endif
.endif

View File

@ -1,4 +1,4 @@
# $Id: lib.mk,v 1.62 2017/06/11 03:24:04 sjg Exp $ # $Id: lib.mk,v 1.68 2018/01/26 20:08:16 sjg Exp $
.if !target(__${.PARSEFILE}__) .if !target(__${.PARSEFILE}__)
__${.PARSEFILE}__: __${.PARSEFILE}__:
@ -37,6 +37,8 @@ PICO?= .pico
CFLAGS+= ${COPTS} CFLAGS+= ${COPTS}
META_NOECHO?= echo
# Originally derrived from NetBSD-1.6 # Originally derrived from NetBSD-1.6
# Set PICFLAGS to cc flags for producing position-independent code, # Set PICFLAGS to cc flags for producing position-independent code,
@ -370,6 +372,11 @@ _LIBS+=llib-l${LIB}.ln
.if empty(LIB) .if empty(LIB)
_LIBS= _LIBS=
.elif ${MK_LDORDER_MK} != "no"
# Record any libs that we need to be linked with
_LIBS+= ${libLDORDER_INC}
.include <ldorder.mk>
.endif .endif
.if !defined(_SKIP_BUILD) .if !defined(_SKIP_BUILD)
@ -507,20 +514,24 @@ libinstall:
[ -d ${DESTDIR}/${LIBDIR} ] || \ [ -d ${DESTDIR}/${LIBDIR} ] || \
${INSTALL} -d ${LIB_INSTALL_OWN} -m 775 ${DESTDIR}${LIBDIR} ${INSTALL} -d ${LIB_INSTALL_OWN} -m 775 ${DESTDIR}${LIBDIR}
.if ${MK_ARCHIVE} != "no" .if ${MK_ARCHIVE} != "no"
${INSTALL} ${COPY} ${LIB_INSTALL_OWN} -m 600 lib${LIB}.a \ ${INSTALL} ${COPY} ${LIB_INSTALL_OWN} -m 644 lib${LIB}.a \
${DESTDIR}${LIBDIR} ${DESTDIR}${LIBDIR}
${RANLIB} ${DESTDIR}${LIBDIR}/lib${LIB}.a ${RANLIB} ${DESTDIR}${LIBDIR}/lib${LIB}.a
chmod ${LIBMODE} ${DESTDIR}${LIBDIR}/lib${LIB}.a chmod ${LIBMODE} ${DESTDIR}${LIBDIR}/lib${LIB}.a
.endif .endif
.if ${MK_PROFILE} != "no" .if ${MK_PROFILE} != "no"
${INSTALL} ${COPY} ${LIB_INSTALL_OWN} -m 600 \ ${INSTALL} ${COPY} ${LIB_INSTALL_OWN} -m 644 \
lib${LIB}_p.a ${DESTDIR}${LIBDIR} lib${LIB}_p.a ${DESTDIR}${LIBDIR}
${RANLIB} ${DESTDIR}${LIBDIR}/lib${LIB}_p.a ${RANLIB} ${DESTDIR}${LIBDIR}/lib${LIB}_p.a
chmod ${LIBMODE} ${DESTDIR}${LIBDIR}/lib${LIB}_p.a chmod ${LIBMODE} ${DESTDIR}${LIBDIR}/lib${LIB}_p.a
.endif .endif
.if ${MK_LDORDER_MK} != "no"
${INSTALL} ${COPY} ${LIB_INSTALL_OWN} -m 644 \
lib${LIB}.ldorder.inc ${DESTDIR}${LIBDIR}
.endif
.if ${MK_PIC} != "no" .if ${MK_PIC} != "no"
.if ${MK_PICLIB} != "no" .if ${MK_PICLIB} != "no"
${INSTALL} ${COPY} ${LIB_INSTALL_OWN} -m 600 \ ${INSTALL} ${COPY} ${LIB_INSTALL_OWN} -m 644 \
lib${LIB}_pic.a ${DESTDIR}${LIBDIR} lib${LIB}_pic.a ${DESTDIR}${LIBDIR}
${RANLIB} ${DESTDIR}${LIBDIR}/lib${LIB}_pic.a ${RANLIB} ${DESTDIR}${LIBDIR}/lib${LIB}_pic.a
chmod ${LIBMODE} ${DESTDIR}${LIBDIR}/lib${LIB}_pic.a chmod ${LIBMODE} ${DESTDIR}${LIBDIR}/lib${LIB}_pic.a

View File

@ -1,4 +1,4 @@
# $Id: own.mk,v 1.36 2017/07/08 21:58:46 sjg Exp $ # $Id: own.mk,v 1.39 2018/01/26 20:08:16 sjg Exp $
.if !target(__${.PARSEFILE}__) .if !target(__${.PARSEFILE}__)
__${.PARSEFILE}__: __${.PARSEFILE}__:
@ -91,6 +91,7 @@ OPTIONS_DEFAULT_NO+= DPADD_MK
OPTIONS_DEFAULT_NO+= \ OPTIONS_DEFAULT_NO+= \
INSTALL_AS_USER \ INSTALL_AS_USER \
GPROF \ GPROF \
LDORDER_MK \
LIBTOOL \ LIBTOOL \
LINT \ LINT \
@ -113,6 +114,7 @@ OPTIONS_DEFAULT_YES+= \
OPTIONS_DEFAULT_DEPENDENT+= \ OPTIONS_DEFAULT_DEPENDENT+= \
CATPAGES/MAN \ CATPAGES/MAN \
PROG_LDORDER_MK/LDORDER_MK \
OBJDIRS/OBJ \ OBJDIRS/OBJ \
PICINSTALL/LINKLIB \ PICINSTALL/LINKLIB \
PICLIB/PIC \ PICLIB/PIC \

View File

@ -1,4 +1,4 @@
# $Id: prog.mk,v 1.32 2017/05/06 17:30:09 sjg Exp $ # $Id: prog.mk,v 1.35 2018/01/26 20:04:07 sjg Exp $
.if !target(__${.PARSEFILE}__) .if !target(__${.PARSEFILE}__)
__${.PARSEFILE}__: __${.PARSEFILE}__:
@ -109,15 +109,21 @@ _SUPCXX= -lstdc++ -lm
_CCLINK?= ${CC} _CCLINK?= ${CC}
.if ${MK_PROG_LDORDER_MK} != "no"
${PROG}: ldorder
.include <ldorder.mk>
.endif
.if defined(DESTDIR) && exists(${LIBCRT0}) && ${LIBCRT0} != "/dev/null" .if defined(DESTDIR) && exists(${LIBCRT0}) && ${LIBCRT0} != "/dev/null"
${PROG}: ${LIBCRT0} ${OBJS} ${LIBC} ${DPADD} ${PROG}: ${LIBCRT0} ${OBJS} ${LIBC} ${DPADD}
${_CCLINK} ${LDFLAGS} ${LDSTATIC} -o ${.TARGET} -nostdlib ${_PROGLDOPTS} -L${DESTDIR}/usr/lib ${LIBCRT0} ${LIBCRTBEGIN} ${OBJS} ${LDADD} -L${DESTDIR}/usr/lib ${_SUPCXX} -lgcc -lc -lgcc ${LIBCRTEND} ${_CCLINK} ${LDFLAGS} ${LDSTATIC} -o ${.TARGET} -nostdlib ${_PROGLDOPTS} -L${DESTDIR}/usr/lib ${LIBCRT0} ${LIBCRTBEGIN} ${OBJS} ${LDADD_LDORDER} ${LDADD} -L${DESTDIR}/usr/lib ${_SUPCXX} -lgcc -lc -lgcc ${LIBCRTEND}
.else .else
${PROG}: ${LIBCRT0} ${OBJS} ${LIBC} ${DPADD} ${PROG}: ${LIBCRT0} ${OBJS} ${LIBC} ${DPADD}
${_CCLINK} ${LDFLAGS} ${LDSTATIC} -o ${.TARGET} ${_PROGLDOPTS} ${OBJS} ${LDADD} ${_CCLINK} ${LDFLAGS} ${LDSTATIC} -o ${.TARGET} ${_PROGLDOPTS} ${OBJS} ${LDADD_LDORDER} ${LDADD}
.endif # defined(DESTDIR) .endif # defined(DESTDIR)
.endif # defined(OBJS) && !empty(OBJS) .endif # defined(OBJS) && !empty(OBJS)

View File

@ -1,4 +1,4 @@
# $Id: sys.mk,v 1.45 2017/02/05 01:26:13 sjg Exp $ # $Id: sys.mk,v 1.46 2017/11/15 22:59:23 sjg Exp $
# #
# @(#) Copyright (c) 2003-2009, Simon J. Gerraty # @(#) Copyright (c) 2003-2009, Simon J. Gerraty
# #
@ -84,7 +84,7 @@ OPTIONS_DEFAULT_DEPENDENT += \
MK_META_MODE = yes MK_META_MODE = yes
.-include <meta.sys.mk> .-include <meta.sys.mk>
.elif ${MK_META_MODE:Uno} == "yes" .elif ${MK_META_MODE:Uno} == "yes"
.MAKE.MODE = meta verbose .MAKE.MODE = meta verbose ${META_MODE}
.endif .endif
# make sure we have a harmless value # make sure we have a harmless value
.MAKE.MODE ?= normal .MAKE.MODE ?= normal

View File

@ -1,4 +1,4 @@
# $Id: sys.vars.mk,v 1.2 2017/01/31 07:44:45 sjg Exp $ # $Id: sys.vars.mk,v 1.3 2018/02/06 00:51:53 sjg Exp $
# #
# @(#) Copyright (c) 2003-2009, Simon J. Gerraty # @(#) Copyright (c) 2003-2009, Simon J. Gerraty
# #
@ -45,7 +45,7 @@ M_L_TARGETS = ${M_ListToMatch:S,V,_TARGETS,}
# turn a list into a set of :N modifiers # turn a list into a set of :N modifiers
# NskipFoo = ${Foo:${M_ListToSkip}} # NskipFoo = ${Foo:${M_ListToSkip}}
M_ListToSkip= O:u:ts::S,:,:N,g:S,^,N, M_ListToSkip= O:u:S,^,N,:ts:
# type should be a builtin in any sh since about 1980, # type should be a builtin in any sh since about 1980,
# but sadly there are exceptions! # but sadly there are exceptions!

5
os.sh
View File

@ -17,7 +17,7 @@
# Simon J. Gerraty <sjg@crufty.net> # Simon J. Gerraty <sjg@crufty.net>
# RCSid: # RCSid:
# $Id: os.sh,v 1.54 2017/09/08 06:17:22 sjg Exp $ # $Id: os.sh,v 1.55 2017/12/11 20:31:41 sjg Exp $
# #
# @(#) Copyright (c) 1994 Simon J. Gerraty # @(#) Copyright (c) 1994 Simon J. Gerraty
# #
@ -138,6 +138,7 @@ SunOS)
# so NetBSD/i386 is good enough # so NetBSD/i386 is good enough
case $OS in case $OS in
NetBSD) NetBSD)
LOCALBASE=/usr/pkg
HOST_ARCH=$MACHINE HOST_ARCH=$MACHINE
SHARE_ARCH=$OS/$HOST_ARCH SHARE_ARCH=$OS/$HOST_ARCH
;; ;;
@ -196,6 +197,7 @@ Haiku)
esac esac
;; ;;
esac esac
LOCALBASE=${LOCALBASE:-/usr/local}
HOSTNAME=${HOSTNAME:-`( hostname ) 2>/dev/null`} HOSTNAME=${HOSTNAME:-`( hostname ) 2>/dev/null`}
HOSTNAME=${HOSTNAME:-`( uname -n ) 2>/dev/null`} HOSTNAME=${HOSTNAME:-`( uname -n ) 2>/dev/null`}
@ -237,6 +239,7 @@ Echo() {
export HOSTNAME HOST export HOSTNAME HOST
export OS MACHINE MACHINE_ARCH OSREL OSMAJOR LOCAL_FS TMP_DIRS MAILER N C K PS_AXC export OS MACHINE MACHINE_ARCH OSREL OSMAJOR LOCAL_FS TMP_DIRS MAILER N C K PS_AXC
export LN SHARE_ARCH TR export LN SHARE_ARCH TR
export LOCALBASE
case /$0 in case /$0 in
*/os.sh) */os.sh)

17
parse.c
View File

@ -1,4 +1,4 @@
/* $NetBSD: parse.c,v 1.225 2017/04/17 13:29:07 maya Exp $ */ /* $NetBSD: parse.c,v 1.227 2018/02/22 01:59:28 sjg Exp $ */
/* /*
* Copyright (c) 1988, 1989, 1990, 1993 * Copyright (c) 1988, 1989, 1990, 1993
@ -69,14 +69,14 @@
*/ */
#ifndef MAKE_NATIVE #ifndef MAKE_NATIVE
static char rcsid[] = "$NetBSD: parse.c,v 1.225 2017/04/17 13:29:07 maya Exp $"; static char rcsid[] = "$NetBSD: parse.c,v 1.227 2018/02/22 01:59:28 sjg Exp $";
#else #else
#include <sys/cdefs.h> #include <sys/cdefs.h>
#ifndef lint #ifndef lint
#if 0 #if 0
static char sccsid[] = "@(#)parse.c 8.3 (Berkeley) 3/19/94"; static char sccsid[] = "@(#)parse.c 8.3 (Berkeley) 3/19/94";
#else #else
__RCSID("$NetBSD: parse.c,v 1.225 2017/04/17 13:29:07 maya Exp $"); __RCSID("$NetBSD: parse.c,v 1.227 2018/02/22 01:59:28 sjg Exp $");
#endif #endif
#endif /* not lint */ #endif /* not lint */
#endif #endif
@ -490,7 +490,7 @@ loadfile(const char *path, int fd)
{ {
struct loadedfile *lf; struct loadedfile *lf;
#ifdef HAVE_MMAP #ifdef HAVE_MMAP
long pagesize; static long pagesize = 0;
#endif #endif
ssize_t result; ssize_t result;
size_t bufpos; size_t bufpos;
@ -515,9 +515,8 @@ loadfile(const char *path, int fd)
if (load_getsize(fd, &lf->len) == SUCCESS) { if (load_getsize(fd, &lf->len) == SUCCESS) {
/* found a size, try mmap */ /* found a size, try mmap */
#ifdef _SC_PAGESIZE #ifdef _SC_PAGESIZE
pagesize = sysconf(_SC_PAGESIZE); if (pagesize == 0)
#else pagesize = sysconf(_SC_PAGESIZE);
pagesize = 0;
#endif #endif
if (pagesize <= 0) { if (pagesize <= 0) {
pagesize = 0x1000; pagesize = 0x1000;
@ -720,6 +719,8 @@ ParseVErrorInternal(FILE *f, const char *cfname, size_t clineno, int type,
(void)vfprintf(f, fmt, ap); (void)vfprintf(f, fmt, ap);
(void)fprintf(f, "\n"); (void)fprintf(f, "\n");
(void)fflush(f); (void)fflush(f);
if (type == PARSE_INFO)
return;
if (type == PARSE_FATAL || parseWarnFatal) if (type == PARSE_FATAL || parseWarnFatal)
fatals += 1; fatals += 1;
if (parseWarnFatal && !fatal_warning_error_printed) { if (parseWarnFatal && !fatal_warning_error_printed) {
@ -812,7 +813,7 @@ ParseMessage(char *line)
switch(*line) { switch(*line) {
case 'i': case 'i':
mtype = 0; mtype = PARSE_INFO;
break; break;
case 'w': case 'w':
mtype = PARSE_WARNING; mtype = PARSE_WARNING;

View File

@ -1,4 +1,4 @@
/* $NetBSD: stresep.c,v 1.2 2007/12/06 22:07:07 seb Exp $ */ /* $NetBSD: stresep.c,v 1.4 2017/08/23 10:27:41 christos Exp $ */
/*- /*-
* Copyright (c) 1990, 1993 * Copyright (c) 1990, 1993
@ -59,6 +59,7 @@ stresep(char **stringp, const char *delim, int esc)
char *s; char *s;
const char *spanp; const char *spanp;
int c, sc; int c, sc;
size_t l;
char *tok; char *tok;
if (stringp == NULL || delim == NULL) if (stringp == NULL || delim == NULL)
@ -66,23 +67,26 @@ stresep(char **stringp, const char *delim, int esc)
if ((s = *stringp) == NULL) if ((s = *stringp) == NULL)
return NULL; return NULL;
l = strlen(s) + 1;
for (tok = s;;) { for (tok = s;;) {
c = *s++; c = *s++;
l--;
while (esc != '\0' && c == esc) { while (esc != '\0' && c == esc) {
(void)strcpy(s - 1, s); memmove(s - 1, s, l);
c = *s++; c = *s++;
l--;
} }
spanp = delim; spanp = delim;
do { do {
if ((sc = *spanp++) == c) { if ((sc = *spanp++) == c) {
if (c == 0) if (c == '\0')
s = NULL; s = NULL;
else else
s[-1] = 0; s[-1] = '\0';
*stringp = s; *stringp = s;
return tok; return tok;
} }
} while (sc != 0); } while (sc != '\0');
} }
} }
#endif #endif

View File

@ -1,5 +1,7 @@
default FU=<v>fu</v> FOO=<v>foo</v> VAR=<v></v> default FU=<v>fu</v> FOO=<v>foo</v> VAR=<v></v>
two FU=<v>bar</v> FOO=<v>goo</v> VAR=<v></v> two FU=<v>bar</v> FOO=<v>goo</v> VAR=<v></v>
immutable FU='bar'
immutable FOO='goo'
three FU=<v>bar</v> FOO=<v>goo</v> VAR=<v></v> three FU=<v>bar</v> FOO=<v>goo</v> VAR=<v></v>
four FU=<v>bar</v> FOO=<v>goo</v> VAR=<v>Internal</v> four FU=<v>bar</v> FOO=<v>goo</v> VAR=<v>Internal</v>
five FU=<v>bar</v> FOO=<v>goo</v> VAR=<v>Internal</v> five FU=<v>bar</v> FOO=<v>goo</v> VAR=<v>Internal</v>

View File

@ -1,4 +1,4 @@
# $Id: varcmd.mk,v 1.1.1.1 2014/08/30 18:57:18 sjg Exp $ # $Id: varcmd.mk,v 1.1.1.3 2017/12/08 03:37:54 sjg Exp $
# #
# Test behaviour of recursive make and vars set on command line. # Test behaviour of recursive make and vars set on command line.
@ -15,7 +15,7 @@ show:
@echo "${TAG} FU=<v>${FU}</v> FOO=<v>${FOO}</v> VAR=<v>${VAR}</v>" @echo "${TAG} FU=<v>${FU}</v> FOO=<v>${FOO}</v> VAR=<v>${VAR}</v>"
one: show one: show
@${.MAKE} -f ${MAKEFILE} FU=bar FOO=goo two @${.MAKE} -f ${MAKEFILE} FU=bar FOO+=goo two
two: show two: show
@${.MAKE} -f ${MAKEFILE} three @${.MAKE} -f ${MAKEFILE} three
@ -24,6 +24,17 @@ three: show
@${.MAKE} -f ${MAKEFILE} four @${.MAKE} -f ${MAKEFILE} four
.ifmake two
# this should not work
FU+= oops
FOO+= oops
_FU:= ${FU}
_FOO:= ${FOO}
two: immutable
immutable:
@echo "$@ FU='${_FU}'"
@echo "$@ FOO='${_FOO}'"
.endif
.ifmake four .ifmake four
VAR=Internal VAR=Internal
.MAKEOVERRIDES+= VAR .MAKEOVERRIDES+= VAR

17
var.c
View File

@ -1,4 +1,4 @@
/* $NetBSD: var.c,v 1.215 2017/04/16 21:39:49 riastradh Exp $ */ /* $NetBSD: var.c,v 1.218 2018/02/18 00:52:42 sjg Exp $ */
/* /*
* Copyright (c) 1988, 1989, 1990, 1993 * Copyright (c) 1988, 1989, 1990, 1993
@ -69,14 +69,14 @@
*/ */
#ifndef MAKE_NATIVE #ifndef MAKE_NATIVE
static char rcsid[] = "$NetBSD: var.c,v 1.215 2017/04/16 21:39:49 riastradh Exp $"; static char rcsid[] = "$NetBSD: var.c,v 1.218 2018/02/18 00:52:42 sjg Exp $";
#else #else
#include <sys/cdefs.h> #include <sys/cdefs.h>
#ifndef lint #ifndef lint
#if 0 #if 0
static char sccsid[] = "@(#)var.c 8.3 (Berkeley) 3/19/94"; static char sccsid[] = "@(#)var.c 8.3 (Berkeley) 3/19/94";
#else #else
__RCSID("$NetBSD: var.c,v 1.215 2017/04/16 21:39:49 riastradh Exp $"); __RCSID("$NetBSD: var.c,v 1.218 2018/02/18 00:52:42 sjg Exp $");
#endif #endif
#endif /* not lint */ #endif /* not lint */
#endif #endif
@ -970,7 +970,8 @@ Var_Set(const char *name, const char *val, GNode *ctxt, int flags)
VarAdd(name, val, ctxt); VarAdd(name, val, ctxt);
} else { } else {
Buf_Empty(&v->val); Buf_Empty(&v->val);
Buf_AddBytes(&v->val, strlen(val), val); if (val)
Buf_AddBytes(&v->val, strlen(val), val);
if (DEBUG(VAR)) { if (DEBUG(VAR)) {
fprintf(debug_file, "%s:%s = %s\n", ctxt->name, name, val); fprintf(debug_file, "%s:%s = %s\n", ctxt->name, name, val);
@ -997,7 +998,7 @@ Var_Set(const char *name, const char *val, GNode *ctxt, int flags)
* Makefile settings. * Makefile settings.
*/ */
if (varNoExportEnv != TRUE) if (varNoExportEnv != TRUE)
setenv(name, val, 1); setenv(name, val ? val : "", 1);
Var_Append(MAKEOVERRIDES, name, VAR_GLOBAL); Var_Append(MAKEOVERRIDES, name, VAR_GLOBAL);
} }
@ -1060,11 +1061,11 @@ Var_Append(const char *name, const char *val, GNode *ctxt)
name = expanded_name; name = expanded_name;
} }
v = VarFind(name, ctxt, (ctxt == VAR_GLOBAL) ? FIND_ENV : 0); v = VarFind(name, ctxt, (ctxt == VAR_GLOBAL) ? (FIND_CMD|FIND_ENV) : 0);
if (v == NULL) { if (v == NULL) {
VarAdd(name, val, ctxt); Var_Set(name, val, ctxt, 0);
} else { } else if (ctxt == VAR_CMD || !(v->flags & VAR_FROM_CMD)) {
Buf_AddByte(&v->val, ' '); Buf_AddByte(&v->val, ' ');
Buf_AddBytes(&v->val, strlen(val), val); Buf_AddBytes(&v->val, strlen(val), val);