The branch main has been updated by sjg:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=9bbb08f9055d03d41597abc9312620d0ab50444c

commit 9bbb08f9055d03d41597abc9312620d0ab50444c
Author:     Simon J. Gerraty <[email protected]>
AuthorDate: 2025-12-10 05:06:31 +0000
Commit:     Simon J. Gerraty <[email protected]>
CommitDate: 2025-12-10 05:06:31 +0000

    Update share/mk files from bmake
    
    Update to the latest makefiles etc from bmake.
    Mostly this just replaces sjg license with an SPDX tag.
    
    There are also some improvements to meta2deps* and optimizations
    to leverage POSIX shell features in some target scripts.
    Default isPOSIX_SHELL to ':' in sys.mk to enable these.
    
    Use :sh1 in M_type if possible.
    
    bsd.progs.mk has diverged too much to touch beyond making the
    SPDX tag update.
    
    Reviewed by:    stevek
    Differential Revision:  https://reviews.freebsd.org/D54150
---
 share/mk/auto.obj.mk        | 11 ++----
 share/mk/bsd.progs.mk       |  7 +---
 share/mk/dirdeps-options.mk | 11 ++----
 share/mk/dirdeps-targets.mk | 18 +++-------
 share/mk/gendirdeps.mk      | 24 +++++++++----
 share/mk/install-new.mk     | 50 ++++++++++++---------------
 share/mk/jobs.mk            | 11 ++----
 share/mk/local.sys.env.mk   |  9 ++++-
 share/mk/meta.autodep.mk    | 83 ++++++++++++++++++++++++++++-----------------
 share/mk/meta.stage.mk      | 46 +++++++++++++++----------
 share/mk/meta.subdir.mk     | 12 ++-----
 share/mk/meta.sys.mk        | 12 ++-----
 share/mk/meta2deps.py       | 49 ++++++++++++++++++++------
 share/mk/meta2deps.sh       | 54 ++++++++++++++++++++++-------
 share/mk/stage-install.sh   |  9 ++---
 share/mk/sys.dependfile.mk  | 11 ++----
 share/mk/sys.dirdeps.mk     | 11 ++----
 share/mk/sys.mk             |  3 ++
 18 files changed, 232 insertions(+), 199 deletions(-)

diff --git a/share/mk/auto.obj.mk b/share/mk/auto.obj.mk
index 4b8c5325b71f..140764860de3 100644
--- a/share/mk/auto.obj.mk
+++ b/share/mk/auto.obj.mk
@@ -1,15 +1,8 @@
-# SPDX-License-Identifier: BSD-2-Clause
-#
-# $Id: auto.obj.mk,v 1.20 2025/05/17 15:29:55 sjg Exp $
+# $Id: auto.obj.mk,v 1.21 2025/08/09 22:42:24 sjg Exp $
 #
 #      @(#) Copyright (c) 2004-2025, 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.
+#      SPDX-License-Identifier: BSD-2-Clause
 #
 #      Please send copies of changes and bug-fixes to:
 #      [email protected]
diff --git a/share/mk/bsd.progs.mk b/share/mk/bsd.progs.mk
index 4d1ff354edfb..007e8a843944 100644
--- a/share/mk/bsd.progs.mk
+++ b/share/mk/bsd.progs.mk
@@ -2,12 +2,7 @@
 #
 #      @(#) Copyright (c) 2006, 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. 
+#      SPDX-License-Identifier: BSD-2-Clause
 #      
 #      Please send copies of changes and bug-fixes to:
 #      [email protected]
diff --git a/share/mk/dirdeps-options.mk b/share/mk/dirdeps-options.mk
index e12dcec40ac7..d173cb7d1e97 100644
--- a/share/mk/dirdeps-options.mk
+++ b/share/mk/dirdeps-options.mk
@@ -1,15 +1,8 @@
-# SPDX-License-Identifier: BSD-2-Clause
-#
-# $Id: dirdeps-options.mk,v 1.22 2024/02/17 17:26:57 sjg Exp $
+# $Id: dirdeps-options.mk,v 1.23 2025/08/09 22:42:24 sjg Exp $
 #
 #      @(#) Copyright (c) 2018-2022, 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.
+#      SPDX-License-Identifier: BSD-2-Clause
 #
 #      Please send copies of changes and bug-fixes to:
 #      [email protected]
diff --git a/share/mk/dirdeps-targets.mk b/share/mk/dirdeps-targets.mk
index a8a547c0ce9b..1d00c5f418d2 100644
--- a/share/mk/dirdeps-targets.mk
+++ b/share/mk/dirdeps-targets.mk
@@ -1,19 +1,11 @@
-# SPDX-License-Identifier: BSD-2-Clause
+# $Id: dirdeps-targets.mk,v 1.29 2025/08/09 22:42:24 sjg Exp $
 #
-# RCSid:
-#       $Id: dirdeps-targets.mk,v 1.28 2024/10/19 00:47:38 sjg Exp $
+#      @(#) Copyright (c) 2019-2020 Simon J. Gerraty
 #
-#       @(#) Copyright (c) 2019-2020 Simon J. Gerraty
+#      SPDX-License-Identifier: BSD-2-Clause
 #
-#       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:
-#       [email protected]
+#      Please send copies of changes and bug-fixes to:
+#      [email protected]
 #
 
 ##
diff --git a/share/mk/gendirdeps.mk b/share/mk/gendirdeps.mk
index 53e736da3391..ab1786f3603f 100644
--- a/share/mk/gendirdeps.mk
+++ b/share/mk/gendirdeps.mk
@@ -1,8 +1,8 @@
-# $Id: gendirdeps.mk,v 1.51 2025/01/05 01:16:19 sjg Exp $
+# $Id: gendirdeps.mk,v 1.54 2025/08/12 21:36:43 sjg Exp $
 
 # SPDX-License-Identifier: BSD-2-Clause
 #
-# Copyright (c) 2011-2020, Simon J. Gerraty
+# Copyright (c) 2011-2025, Simon J. Gerraty
 # Copyright (c) 2010-2018, Juniper Networks, Inc.
 # All rights reserved.
 #
@@ -76,6 +76,12 @@
 # 
 .MAIN: all
 
+.if ${DEBUG_GENDIRDEPS:Uno:@m@${RELDIR:M$m}@} != ""
+_debug.gendirdeps = 1
+.else
+_debug.gendirdeps = 0
+.endif
+
 # keep this simple
 .MAKE.MODE = compat
 
@@ -108,6 +114,9 @@ META_FILES += ${META_XTRAS:N\*.meta}
 .endif
 
 .if !empty(META_FILES)
+.if ${_debug.gendirdeps} && ${DEBUG_GENDIRDEPS:Mmeta*} != ""
+.info ${RELDIR}: META_FILES=${META_FILES}
+.endif
 
 .if ${.MAKE.LEVEL} > 0 && !empty(GENDIRDEPS_FILTER)
 # so we can compare below
@@ -146,7 +155,7 @@ GENDIRDEPS_FILTER += 
${GENDIRDEPS_FILTER_VARS:@v@S,/${$v}/,/_{${v}}/,@:NS,//,*:u
 META2DEPS ?= ${.PARSEDIR}/meta2deps.sh
 META2DEPS := ${META2DEPS}
 
-.if ${DEBUG_GENDIRDEPS:Uno:@x@${RELDIR:M$x}@} != "" && 
${DEBUG_GENDIRDEPS:Uno:Mmeta2d*} != ""
+.if ${_debug.gendirdeps} && ${DEBUG_GENDIRDEPS:Mmeta2d*} != ""
 _time = time
 _sh_x = sh -x
 _py_d = -ddd
@@ -260,7 +269,7 @@ dpadd_dir_list += ${f:H:tA}
 ddeps != cat ${ddep_list:O:u} | ${META2DEPS_FILTER} ${_skip_gendirdeps} \
        sed ${GENDIRDEPS_SEDCMDS}
 
-.if ${DEBUG_GENDIRDEPS:Uno:@x@${RELDIR:M$x}@} != ""
+.if ${_debug.gendirdeps}
 .info ${RELDIR}: raw_dir_list='${dir_list}'
 .info ${RELDIR}: ddeps='${ddeps}'
 .endif
@@ -289,12 +298,13 @@ M2D_OBJROOTS := ${M2D_OBJROOTS:O:u:[-1..1]}
 # anything we use from an object dir other than ours
 # needs to be qualified with its .<machine> suffix
 # (we used the pseudo machine "host" for the HOST_TARGET).
-skip_ql= ${SRCTOP}* ${_objtops:@o@$o*@}
+skip_ql = ${SRCTOP}* ${_objtops:@o@$o*@}
+M_ListToSkip ?= O:u:S,^,N,:ts:
 .for o in ${M2D_OBJROOTS:${skip_ql:${M_ListToSkip}}}
 # we need := so only skip_ql to this point applies
 ql.$o := 
${dir_list:${skip_ql:${M_ListToSkip}}:M$o*/*/*:C,$o([^/]+)/(.*),\2.\1,:S,.${HOST_TARGET},.host,}
 qualdir_list += ${ql.$o}
-.if ${DEBUG_GENDIRDEPS:Uno:@x@${RELDIR:M$x}@} != ""
+.if ${_debug.gendirdeps}
 .info ${RELDIR}: o=$o ${ql.$o qualdir_list:L:@v@$v=${$v}@}
 .endif
 skip_ql+= $o*
@@ -323,7 +333,7 @@ DIRDEPS += \
 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}
 .info ${RELDIR}: M2D_OBJROOTS=${M2D_OBJROOTS}
 .info ${RELDIR}: M2D_EXCLUDES=${M2D_EXCLUDES}
 .info ${RELDIR}: dir_list='${dir_list}'
diff --git a/share/mk/install-new.mk b/share/mk/install-new.mk
index 19a2b2a10061..2fb9725a7a47 100644
--- a/share/mk/install-new.mk
+++ b/share/mk/install-new.mk
@@ -1,53 +1,41 @@
-# $Id: install-new.mk,v 1.3 2012/03/24 18:25:49 sjg Exp $
+# $Id: install-new.mk,v 1.9 2025/11/19 17:44:15 sjg Exp $
 #
 #      @(#) Copyright (c) 2009, 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. 
-#      
+#      SPDX-License-Identifier: BSD-2-Clause
+#
 #      Please send copies of changes and bug-fixes to:
 #      [email protected]
 #
 
 .if !defined(InstallNew)
 
-# copy if src and target are different making a backup if desired
-CmpCp= CmpCp() { \
+# How do we want CmpCpMv to do the final operation?
+# the backup (if any) will use the opposite.
+CPMV_OP ?= mv
+# clear this if not supported
+CPMV_f ?= -f
+
+# copy/move if src and target are different making a backup if desired
+CmpCpMv= CmpCpMv() { \
        src=$$1 target=$$2 _bak=$$3; \
        if ! test -s $$target || ! cmp -s $$target $$src; then \
                trap "" 1 2 3 15; \
+               case "/${CPMV_OP}" in */cp) bop=mv;; */mv) bop=cp;; esac; \
                if test -s $$target; then \
                        if test "x$$_bak" != x; then \
                                rm -f $$target$$_bak; \
-                               mv $$target $$target$$_bak; \
+                               $$bop ${CPMV_f} $$target $$target$$_bak; \
                        else \
                                rm -f $$target; \
                        fi; \
                fi; \
-               cp $$src $$target; \
-       fi; }
-
-# Replace the file if they are different and make a backup if desired
-CmpReplace= CmpReplace() { \
-       src=$$1 target=$$2 _bak=$$3; \
-       if ! test -s $$target || ! cmp -s $$target $$src; then \
-               trap "" 1 2 3 15; \
-               if test -s $$target; then \
-                       if test "x$$_bak" != x; then \
-                               rm -f $$target$$_bak; \
-                               cp -f $$target $$target$$_bak; \
-                       fi; \
-               fi; \
-               mv -f $$src $$target; \
+               ${CPMV_OP} ${CPMV_f} $$src $$target; \
        fi; }
 
 # If the .new file is different, we want it.
 # Note: this function will work as is for *.new$RANDOM"
-InstallNew= ${CmpReplace}; InstallNew() { \
+InstallNew= ${CmpCpMv}; InstallNew() { \
        _t=-e; _bak=; \
        while :; do \
                case "$$1" in \
@@ -58,8 +46,12 @@ InstallNew= ${CmpReplace}; InstallNew() { \
        done; \
        for new in "$$@"; do \
                if test $$_t $$new; then \
-                       target=`expr $$new : '\(.*\).new'`; \
-                       CmpReplace $$new $$target $$_bak; \
+                       if ${isPOSIX_SHELL:Ufalse}; then \
+                               target=$${new%.new}; \
+                       else \
+                               target=`expr $$new : '\(.*\).new'`; \
+                       fi; \
+                       CmpCpMv $$new $$target $$_bak; \
                fi; \
                rm -f $$new; \
        done; :; }
diff --git a/share/mk/jobs.mk b/share/mk/jobs.mk
index e304e16a9c56..874e7deeb107 100644
--- a/share/mk/jobs.mk
+++ b/share/mk/jobs.mk
@@ -1,15 +1,8 @@
-# SPDX-License-Identifier: BSD-2-Clause
-#
-# $Id: jobs.mk,v 1.19 2025/02/03 21:18:44 sjg Exp $
+# $Id: jobs.mk,v 1.20 2025/08/09 22:42:24 sjg Exp $
 #
 #      @(#) Copyright (c) 2012-2025, 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.
+#      SPDX-License-Identifier: BSD-2-Clause
 #
 #      Please send copies of changes and bug-fixes to:
 #      [email protected]
diff --git a/share/mk/local.sys.env.mk b/share/mk/local.sys.env.mk
index 470c2d8559eb..79a8a775f5c2 100644
--- a/share/mk/local.sys.env.mk
+++ b/share/mk/local.sys.env.mk
@@ -22,9 +22,16 @@ M_L_TARGETS = ${M_ListToMatch:S,V,_TARGETS,}
 # NskipFoo = ${Foo:${M_ListToSkip}}
 M_ListToSkip= O:u:ts::S,:,:N,g:S,^,N,
 
+# :sh1 evaluates command only once and caches the result.
+.if ${MAKE_VERSION} < 20251111
+M_sh1 = sh
+.else
+M_sh1 = sh1
+.endif
+
 # type should be a builtin in any sh since about 1980,
 # AUTOCONF := ${autoconf:L:${M_whence}}
-M_type = @x@(type $$x 2> /dev/null); echo;@:sh:[0]:N* found*:[@]:C,[()],,g
+M_type = @x@(type $$x 2> /dev/null); echo;@:${M_sh1:Ush}:[0]:N* 
found*:[@]:C,[()],,g
 M_whence = ${M_type}:M/*:[1]
 
 # convert a path to a valid shell variable
diff --git a/share/mk/meta.autodep.mk b/share/mk/meta.autodep.mk
index 55f2d66e56aa..2120c0892475 100644
--- a/share/mk/meta.autodep.mk
+++ b/share/mk/meta.autodep.mk
@@ -1,16 +1,8 @@
-# SPDX-License-Identifier: BSD-2-Clause
+# $Id: meta.autodep.mk,v 1.71 2025/08/09 22:42:24 sjg Exp $
 #
-# $Id: meta.autodep.mk,v 1.63 2024/04/24 18:56:41 sjg Exp $
-
-#
-#      @(#) Copyright (c) 2010, Simon J. Gerraty
+#      @(#) Copyright (c) 2010-2025, 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.
+#      SPDX-License-Identifier: BSD-2-Clause
 #
 #      Please send copies of changes and bug-fixes to:
 #      [email protected]
@@ -22,6 +14,12 @@ __${_this}__: .NOTMAIN
 
 .-include <local.autodep.mk>
 
+.if ${DEBUG_AUTODEP:Uno:@m@${RELDIR:M$m}@} != ""
+_debug.autodep = 1
+.else
+_debug.autodep = 0
+.endif
+
 PICO?= .pico
 
 .if defined(SRCS)
@@ -85,9 +83,9 @@ UPDATE_DEPENDFILE = NO
 _bootstrap_dirdeps = yes
 .endif
 _bootstrap_dirdeps ?= no
-UPDATE_DEPENDFILE ?= yes
+UPDATE_DEPENDFILE ?= ${MK_UPDATE_DEPENDFILE:Uyes}
 
-.if ${DEBUG_AUTODEP:Uno:@m@${RELDIR:M$m}@} != ""
+.if ${_debug.autodep}
 .info ${_DEPENDFILE:S,${SRCTOP}/,,} update=${UPDATE_DEPENDFILE}
 .endif
 
@@ -111,7 +109,7 @@ WANT_UPDATE_DEPENDFILE ?= yes
 UPDATE_DEPENDFILE = no
 .endif
 
-.if ${DEBUG_AUTODEP:Uno:@m@${RELDIR:M$m}@} != ""
+.if ${_debug.autodep}
 .info ${_DEPENDFILE:S,${SRCTOP}/,,} update=${UPDATE_DEPENDFILE}
 .endif
 
@@ -207,7 +205,7 @@ CAT_DEPEND = /dev/null
 _depend =
 .endif
 
-.if ${DEBUG_AUTODEP:Uno:@m@${RELDIR:M$m}@} != ""
+.if ${_debug.autodep}
 .info ${_DEPENDFILE:S,${SRCTOP}/,,} _depend=${_depend}
 .endif
 
@@ -253,19 +251,33 @@ _gendirdeps_mutex = ${GENDIRDEPS_MUTEXER} 
${GENDIRDEPS_MUTEX:U${_CURDIR}/Makefil
 # but we need to behave as if we did.
 # Avoid adding glob patterns to .MAKE.META.CREATED though.
 .MAKE.META.CREATED += ${META_XTRAS:N*\**:O:u}
-
-.if make(gendirdeps)
-META_FILES = *.meta
-.elif ${OPTIMIZE_OBJECT_META_FILES:Uno:tl} == "no"
-META_FILES = ${.MAKE.META.FILES:T:N.depend*:O:u}
+OPTIMIZE_OBJECT_META_FILES ?= no
+
+.if ${OPTIMIZE_OBJECT_META_FILES} == "yes"
+# If we have lots of .o.meta, ${PICO}.meta etc we need only look at one set.
+# If META_FILE_OBJ_FILTER is not already set, we default it to a
+# .SUFFIX which matches the first *o.meta.
+# There is no guarantee it will be just .o or .So etc,
+META_FILE_OBJ_FILTER ?= \
+       
${.SUFFIXES:M*o:@o@${"${.MAKE.META.FILES:T:M*$o.meta:[1]}":?M*$o.meta:}@:[1]}
+.endif
+
+# parent may have set META_FILE_OBJ_FILTER
+.if ${OPTIMIZE_OBJECT_META_FILES} == "yes" || !empty(META_FILE_OBJ_FILTER)
+META_FILES = \
+       ${.MAKE.META.FILES:N.depend*:N*o.meta} \
+       ${.MAKE.META.FILES:${META_FILE_OBJ_FILTER}}
 .else
-# if we have 1000's of .o.meta, ${PICO}.meta etc we need only look at one set
-# it is left as an exercise for the reader to work out what this does
-META_FILES = ${.MAKE.META.FILES:T:N.depend*:N*o.meta:O:u} \
-       
${.MAKE.META.FILES:T:M*.${.MAKE.META.FILES:M*o.meta:R:E:O:u:[1]}.meta:O:u}
+META_FILES = ${.MAKE.META.FILES:N.depend*}
 .endif
+# ensure this is not empty (this will sort after any M and N
+# we use S,${_OBJDIR}/,, rather than :T since some makefiles have
+# objects in subdirs
+META_FILE_FILTER += S,${_OBJDIR}/,,:O:u
+# we have to defer evaluation until the target script runs
+GENDIRDEPS_ENV += META_FILES="${META_FILES:${META_FILE_FILTER:O:u:ts:}}}"
 
-.if ${DEBUG_AUTODEP:Uno:@m@${RELDIR:M$m}@} != ""
+.if ${_debug.autodep}
 .info ${_DEPENDFILE:S,${SRCTOP}/,,}: ${_depend} ${.PARSEDIR}/gendirdeps.mk 
${META2DEPS} xtras=${META_XTRAS}
 .endif
 
@@ -276,20 +288,29 @@ META_FILES = ${.MAKE.META.FILES:T:N.depend*:N*o.meta:O:u} 
\
 .if !empty(GENDIRDEPS_FILTER)
 .export GENDIRDEPS_FILTER
 .endif
-# export to avoid blowing command line limit
-META_FILES := ${META_XTRAS:U:O:u} ${META_FILES:U:T:O:u:${META_FILE_FILTER:ts:}}
-.export META_FILES
 .endif
 
+_this_dir := ${_PARSEDIR}
+.if ${MAKE_VERSION} < 20230123
 # we might have .../ in MAKESYSPATH
-_makesyspath:= ${_PARSEDIR}
+_makesyspath := ${MAKESYSPATH:U${_this_dir}}
+.if ${.MAKEFLAGS:M-m} != ""
+_makesyspath := ${.MAKEFLAGS:S,-m ,-m,gW:M-m*:S,-m, ,:ts:}:${_makesyspath}
+.endif
+_makesyspath := ${_makesyspath:C,\.\.\./[^:]*,${_this_dir},}
+GENDIRDEPS_ENV += MAKESYSPATH=${_makesyspath}
+.else
+# add this if not already there
+.SYSPATH: ${_this_dir}
+GENDIRDEPS_ENV += MAKESYSPATH=${.SYSPATH:ts:}
+.endif
+
 ${_DEPENDFILE}: ${_depend} ${.PARSEDIR}/gendirdeps.mk  ${META2DEPS} 
$${.MAKE.META.CREATED}
        @echo Checking $@: ${.OODATE:T:[1..8]}
        @(cd . && ${GENDIRDEPS_ENV} \
        SKIP_GENDIRDEPS='${SKIP_GENDIRDEPS:O:u}' \
        DPADD='${FORCE_DPADD:O:u}' ${_gendirdeps_mutex} \
-       MAKESYSPATH=${_makesyspath} \
-       ${.MAKE} -f gendirdeps.mk RELDIR=${RELDIR} _DEPENDFILE=${_DEPENDFILE})
+       ${.MAKE} -B -f gendirdeps.mk RELDIR=${RELDIR} 
_DEPENDFILE=${_DEPENDFILE})
        @test -s $@ && touch $@; :
 .endif
 
diff --git a/share/mk/meta.stage.mk b/share/mk/meta.stage.mk
index 345df6aae16b..b4d1ea4d6773 100644
--- a/share/mk/meta.stage.mk
+++ b/share/mk/meta.stage.mk
@@ -1,15 +1,8 @@
-# SPDX-License-Identifier: BSD-2-Clause
+# $Id: meta.stage.mk,v 1.75 2025/12/08 17:44:57 sjg Exp $
 #
-# $Id: meta.stage.mk,v 1.69 2024/02/17 17:26:57 sjg Exp $
+#      @(#) Copyright (c) 2011-2025, Simon J. Gerraty
 #
-#      @(#) Copyright (c) 2011-2017, 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.
+#      SPDX-License-Identifier: BSD-2-Clause
 #
 #      Please send copies of changes and bug-fixes to:
 #      [email protected]
@@ -38,12 +31,14 @@ CLEANFILES+= .dirdep
        @echo '${_dirdep}' > $@
 .endif
 
-.if defined(NO_POSIX_SHELL) || ${type printf:L:sh:Mbuiltin} == ""
-_stage_file_basename = `basename $$f`
-_stage_target_dirname = `dirname $$t`
-.else
+.if ${isPOSIX_SHELL:U:Nfalse}
 _stage_file_basename = $${f\#\#*/}
+_stage_file_dirname = $${f%/*}
 _stage_target_dirname = $${t%/*}
+.else
+_stage_file_basename = `basename $$f`
+_stage_file_dirname = `dirname $$f`
+_stage_target_dirname = `dirname $$t`
 .endif
 
 _OBJROOT ?= ${OBJROOT:U${OBJTOP:H}}
@@ -86,22 +81,37 @@ STAGE_DIRDEP_SCRIPT = ${LN_CP_SCRIPT}; StageDirdep() { \
   if [ -s $$t.dirdep ]; then \
        cmp -s .dirdep $$t.dirdep && return; \
        x=`cat $$t.dirdep`; \
-       case "${RELDIR}:${_dirdep}" in $${x%.*}:$${x}*) ;; \
+       case "${RELDIR}:${_dirdep}" in \
+       $${x%.*}:$${x}*) ;; \
        *) echo "${STAGE_CONFLICT}: $$t installed by $$x not ${_dirdep}" >&2; \
-       ${STAGE_CONFLICT_ACTION} ;; esac; \
+       ${STAGE_CONFLICT_ACTION} ;; \
+       esac; \
   fi; \
   LnCp .dirdep $$t.dirdep || exit 1; }
 
 # 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)
+# if --subdir is given the dirname part of each file will be preserved
 STAGE_FILE_SCRIPT = ${STAGE_DIRDEP_SCRIPT}; StageFiles() { \
-  case "$$1" in "") return;; -m) mode=$$2; shift 2;; *) mode=;; esac; \
+  mode= subdir=; \
+  while : ; do \
+       case "$$1" in \
+       "") return;; \
+       -m) mode=$$2; shift 2;; \
+       --subdir) subdir=1; shift;; \
+       *) break;; \
+       esac; \
+  done; \
   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; \
+       case "$$subdir,$$f" in \
+       1,*/*) t=$$dest/$$f; mkdir -p $$dest/${_stage_file_dirname};; \
+       */*) t=$$dest/${_stage_file_basename};; \
+       *) t=$$dest/$$f;; \
+       esac; \
        StageDirdep $$t; \
        LnCp $$f $$t || exit 1; \
        [ -z "$$mode" ] || chmod $$mode $$t; \
diff --git a/share/mk/meta.subdir.mk b/share/mk/meta.subdir.mk
index aee8a1a9a39b..a1c2b66f2f9d 100644
--- a/share/mk/meta.subdir.mk
+++ b/share/mk/meta.subdir.mk
@@ -1,16 +1,8 @@
-# SPDX-License-Identifier: BSD-2-Clause
-#
-# $Id: meta.subdir.mk,v 1.15 2024/04/19 15:10:22 sjg Exp $
-
+# $Id: meta.subdir.mk,v 1.16 2025/08/09 22:42:24 sjg Exp $
 #
 #      @(#) Copyright (c) 2010, 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.
+#      SPDX-License-Identifier: BSD-2-Clause
 #
 #      Please send copies of changes and bug-fixes to:
 #      [email protected]
diff --git a/share/mk/meta.sys.mk b/share/mk/meta.sys.mk
index 1104204dc8c9..c5fcdaa801e4 100644
--- a/share/mk/meta.sys.mk
+++ b/share/mk/meta.sys.mk
@@ -1,16 +1,8 @@
-# SPDX-License-Identifier: BSD-2-Clause
-#
-# $Id: meta.sys.mk,v 1.56 2024/11/22 23:51:48 sjg Exp $
-
+# $Id: meta.sys.mk,v 1.57 2025/08/09 22:42:24 sjg Exp $
 #
 #      @(#) Copyright (c) 2010-2023, 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.
+#      SPDX-License-Identifier: BSD-2-Clause
 #
 #      Please send copies of changes and bug-fixes to:
 #      [email protected]
diff --git a/share/mk/meta2deps.py b/share/mk/meta2deps.py
index 44c752d0e7eb..77ed86397a0f 100755
--- a/share/mk/meta2deps.py
+++ b/share/mk/meta2deps.py
@@ -39,9 +39,9 @@ We only pay attention to a subset of the information in the
 SPDX-License-Identifier: BSD-2-Clause
 
 RCSid:
-       $Id: meta2deps.py,v 1.50 2024/09/27 00:08:36 sjg Exp $
+       $Id: meta2deps.py,v 1.54 2025/07/24 16:05:48 sjg Exp $
 
-       Copyright (c) 2011-2020, Simon J. Gerraty
+       Copyright (c) 2011-2025, Simon J. Gerraty
        Copyright (c) 2011-2017, Juniper Networks, Inc.
        All rights reserved.
 
@@ -441,7 +441,7 @@ class MetaFile:
         # Bye bye
 
         We go to some effort to avoid processing a dependency more than once.
-        Of the above record types only C,E,F,L,R,V and W are of interest.
+        Of the above record types only C,E,F,L,M,R,V,W and X are of interest.
         """
 
         version = 0                     # unknown
@@ -465,8 +465,8 @@ class MetaFile:
         if self.sb and self.name.startswith(self.sb):
             error_name = self.name.replace(self.sb+'/','')
         else:
-            error_name = self.name 
-        interesting = '#CEFLRVX'
+            error_name = self.name
+        interesting = '#CEFLMRVX'
         for line in f:
             self.line += 1
             # ignore anything we don't care about
@@ -475,6 +475,7 @@ class MetaFile:
             if self.debug > 2:
                 print("input:", line, end=' ', file=self.debug_out)
             w = line.split()
+            wlen = len(w)
 
             if skip:
                 if w[0] == 'V':
@@ -498,6 +499,23 @@ class MetaFile:
                 if line.find('Bye') > 0:
                     eof_token = True
                 continue
+            else:
+                # before we go further check we have a sane number of args
+                # the Linux filemon module is rather unreliable.
+                if w[0] in 'LM':
+                    elen = 4
+                elif w[0] == 'X':
+                    # at least V4 on Linux does 3 args
+                    if wlen == 3:
+                        elen = 3
+                    else:
+                        elen = 4
+                else:
+                    elen = 3
+                if self.debug > 2:
+                    print('op={} elen={} wlen={} line="{}"'.format(w[0], elen, 
wlen, line.strip()), file=self.debug_out)
+                if wlen != elen:
+                    raise AssertionError('corrupted filemon data: wrong number 
of words: expected {} got {} in: {}'.format(elen, wlen, line))
 
             pid = int(w[1])
             if pid != last_pid:
@@ -540,11 +558,11 @@ class MetaFile:
                     print("seen:", w[2], file=self.debug_out)
                 continue
             # file operations
-            if w[0] in 'ML':
+            if w[0] in 'LM':
                 # these are special, tread src as read and
                 # target as write
-                self.parse_path(w[2].strip("'"), cwd, 'R', w)
                 self.parse_path(w[3].strip("'"), cwd, 'W', w)
+                self.parse_path(w[2].strip("'"), cwd, 'R', w)
                 continue
             elif w[0] in 'ERWS':
                 path = w[2]
@@ -611,9 +629,19 @@ class MetaFile:
                 return
         # we don't want to resolve the last component if it is
         # a symlink
-        path = resolve(path, cwd, self.last_dir, self.debug, self.debug_out)
-        if not path:
-            return
+        npath = resolve(path, cwd, self.last_dir, self.debug, self.debug_out)
+        if not npath:
+            if len(w) > 3 and w[0] in 'ML' and op == 'R' and 
path.startswith('../'):
+                # we already resolved the target of the M/L
+                # so it makes sense to try and resolve relative to that dir.
+                if os.path.isdir(self.last_path):
+                    dir = self.last_path
+                else:
+                    dir,junk = os.path.split(self.last_path)
+                npath = resolve(path, cwd, dir, self.debug, self.debug_out)
+            if not npath:
+                return
+        path = npath
         dir,base = os.path.split(path)
         if dir in self.seen:
             if self.debug > 2:
@@ -631,6 +659,7 @@ class MetaFile:
             rdir = None
         # now put path back together
         path = '/'.join([dir,base])
+        self.last_path = path
         if self.debug > 1:
             print("raw=%s rdir=%s dir=%s path=%s" % (w[2], rdir, dir, path), 
file=self.debug_out)
         if op in 'RWS':
diff --git a/share/mk/meta2deps.sh b/share/mk/meta2deps.sh
index 4c1b674f7b63..293ebdab6e7c 100755
--- a/share/mk/meta2deps.sh
+++ b/share/mk/meta2deps.sh
@@ -49,8 +49,10 @@
 #      The output, is a set of absolute paths with "SB" like:
 #.nf
 #
+#      $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
+#      $SB/obj-i386/bsd/lib/csu/i386-elf
 #      $SB/obj-i386/bsd/lib/libc
 #      $SB/src/bsd/include
 #      $SB/src/bsd/sys/i386/include
@@ -75,10 +77,11 @@
 
 
 # RCSid:
-#      $Id: meta2deps.sh,v 1.21 2024/02/17 17:26:57 sjg Exp $
+#      $Id: meta2deps.sh,v 1.26 2025/12/08 17:34:02 sjg Exp $
 
 # SPDX-License-Identifier: BSD-2-Clause
 #
+# Copyright (c) 2011-2025, Simon J. Gerraty
 # Copyright (c) 2010-2013, Juniper Networks, Inc.
 # All rights reserved.
 #
@@ -103,6 +106,10 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+case ",$DEBUG_SH," in
+*,meta2deps*) set -x;;
+esac
+
 meta2src() {
     cat /dev/null "$@" |
     sed -n '/^R .*\.[chyl]$/s,^..[0-9]* ,,p' |
@@ -248,13 +255,31 @@ meta2deps() {
        ;;
     *) cat /dev/null "$@";;
     esac 2> /dev/null |
-    sed -e 's,^CWD,C C,;/^[#CREFLMVX] /!d' -e "s,',,g" |
+    sed -e 's,^CWD,C C,;/^[#CREFLMVWX] /!d' -e "s,',,g" |
     $_excludes | ( version=no epids= xpids= eof_token=no
-    while read op pid path junk
+    while read op pid path path2
     do
-       : op=$op pid=$pid path=$path
+       : op=$op pid=$pid path=$path path2=$path2
+       # first a sanity check - filemon on Linux is not very reliable
+       # path2 should only be non-empty for op L or M
+       # and it should not contain spaces.
+       # It will also be non-empty for # Meta line
+       # which tells us which meta_file we are processing
+       case "$op,$path2" in
+       \#*,*.meta) # new file, reset some vars
+           version=no epids= xpids= eof_token=no lpid=
+           meta_file=`set -- $path2; echo $2`
+           continue
+           ;;
+       \#*) ;;                 # ok
+       [LM],) error "missing path2 in: '$op $pid $path'";;
+       [LMX],*" "*) error "wrong number of words in: '$op $pid $path $path2'";;
+       *,|[LMX],*) ;;          # ok
+       *) error "wrong number of words in: '$op $pid $path $path2'";;
+       esac
        # we track cwd and ldir (of interest) per pid
        # CWD is bmake's cwd
+       : lpid=$lpid,pid=$pid
        case "$lpid,$pid" in
        ,C) CWD=$path cwd=$path ldir=$path
            if [ -z "$SB" ]; then
@@ -263,13 +288,13 @@ meta2deps() {
            SRCTOP=${SRCTOP:-$SB/src}
            case "$verion" in
            no) ;;              # ignore
-           0) error "no filemon data";;
+           0) error "no filemon data: $meta_file";;
            *) ;;
            esac
            version=0
            case "$eof_token" in
            no) ;;              # ignore
-           0) error "truncated filemon data";;
+           0) error "truncated filemon data: $meta_file";;
            esac
            eof_token=0
            continue
@@ -319,9 +344,14 @@ meta2deps() {
            $src_re|$obj_re) ;;
            /*/stage/*) ;;
            /*) continue;;
-           *)  for path in $ldir/$path $cwd/$path
+           *)
+               rlist="$ldir/$path $cwd/$path"
+               case "$op,$path" in
+               [ML],../*) rlist="$rlist $path2/$path `dirname $path2`/$path";;
+               esac
+               for path in $rlist
                do
-                       test -e $path && break
+                   test -e $path && break
                done
                dir=${path%/*}
                ;;
@@ -406,18 +436,18 @@ meta2deps() {
     done > $tf.dirdep
     : version=$version
     case "$version" in
-    0) error "no filemon data";;
+    0) error "no filemon data: $meta_file";;
     esac
     : eof_token=$eof_token
     case "$eof_token" in
-    0) error "truncated filemon data";;
+    0) error "truncated filemon data: $meta_file";;
     esac
     for p in $epids
     do
        : p=$p
        case " $xpids " in
        *" $p "*) ;;
-       *) error "missing eXit for pid $p";;
+       *) error "missing eXit for pid $p: $meta_file";;
        esac
     done ) || exit 1
     _nl=echo
diff --git a/share/mk/stage-install.sh b/share/mk/stage-install.sh
index d9182e32feff..b6ab4abc8201 100755
--- a/share/mk/stage-install.sh
+++ b/share/mk/stage-install.sh
@@ -37,18 +37,13 @@
 #
 
 # RCSid:
-#      $Id: stage-install.sh,v 1.11 2024/02/17 17:26:57 sjg Exp $
+#      $Id: stage-install.sh,v 1.12 2025/08/09 22:42:24 sjg Exp $
 #
 #      SPDX-License-Identifier: BSD-2-Clause
 #
 #      @(#) Copyright (c) 2013-2020, 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.
+#      SPDX-License-Identifier: BSD-2-Clause
 #
 #      Please send copies of changes and bug-fixes to:
 #      [email protected]
diff --git a/share/mk/sys.dependfile.mk b/share/mk/sys.dependfile.mk
index 3c13b1c92bff..84c5c898b6af 100644
--- a/share/mk/sys.dependfile.mk
+++ b/share/mk/sys.dependfile.mk
@@ -1,15 +1,8 @@
-# SPDX-License-Identifier: BSD-2-Clause
-#
-# $Id: sys.dependfile.mk,v 1.11 2024/02/17 17:26:57 sjg Exp $
+# $Id: sys.dependfile.mk,v 1.12 2025/08/09 22:42:24 sjg Exp $
 #
 #      @(#) Copyright (c) 2012-2023, 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.
+#      SPDX-License-Identifier: BSD-2-Clause
 #
 #      Please send copies of changes and bug-fixes to:
 #      [email protected]
diff --git a/share/mk/sys.dirdeps.mk b/share/mk/sys.dirdeps.mk
index 4d2dfa8416fa..66b7f900697c 100644
--- a/share/mk/sys.dirdeps.mk
+++ b/share/mk/sys.dirdeps.mk
@@ -1,15 +1,8 @@
-# SPDX-License-Identifier: BSD-2-Clause
-#
-# $Id: sys.dirdeps.mk,v 1.15 2024/04/18 17:18:31 sjg Exp $
+# $Id: sys.dirdeps.mk,v 1.16 2025/08/09 22:42:24 sjg Exp $
 #
 #      @(#) Copyright (c) 2012-2023, 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.
+#      SPDX-License-Identifier: BSD-2-Clause
 #
 #      Please send copies of changes and bug-fixes to:
 #      [email protected]
diff --git a/share/mk/sys.mk b/share/mk/sys.mk
index 26f31c104088..bb943d2b1519 100644
--- a/share/mk/sys.mk
+++ b/share/mk/sys.mk
@@ -314,6 +314,9 @@ __MAKE_SHELL?=/bin/sh
        path=${__MAKE_SHELL}
 .endif
 
+# We expect .SHELL to be POSIX
+isPOSIX_SHELL?= :
+
 # Hack for ports compatibility. Historically, ports makefiles have
 # assumed they can examine MACHINE_CPU without including anything
 # because this was automatically included in sys.mk. For /usr/src,


Reply via email to