Re: FYI: Why META_MODE rebuilds so much for building again after installworld (no source changes)
- Reply: Simon J. Gerraty: "Re: FYI: Why META_MODE rebuilds so much for building again after installworld (no source changes)"
- In reply to: Mark Millard : "Re: FYI: Why META_MODE rebuilds so much for building again after installworld (no source changes)"
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Thu, 23 Feb 2023 05:09:54 UTC
On Feb 22, 2023, at 19:47, Mark Millard <marklmi@yahoo.com> wrote:
> On Feb 22, 2023, at 17:18, Simon J. Gerraty <sjg@juniper.net> wrote:
>
>> Mark Millard <marklmi@yahoo.com> wrote:
>>
>>> Thanks for the information.
>>>
>>>> strings `which bmake` | grep META.IGNORE
>>>> .MAKE.META.IGNORE_PATHS
>>>> .MAKE.META.IGNORE_PATTERNS
>>>> ${.MAKE.META.IGNORE_PATHS:O:u:tA}
>>>
>>> The -dM output's "is newer than the target" lines
>>> show the path from before the above transformation.
>>> (The :tA results possibly could use another
>>> sort/uniq sequence for the realpath results?)
>>
>> That indicates the above IGNOREs are not working.
>>
>>> I've been pondering things because, so far, my
>>> attempts to experiment with this has failed to make
>>> the -dM output lines for the paths go away and it
>>> still does the related build activity. I've been
>>> trying the likes of:
>>>
>>> .for ignore_legacy_tool in awk cap_mkdb cat cp crunchgen crunchide dd egrep env file2c gencat grep gzip jot lex lb ln m4 mkcsmapper mktemp mv patch realpath rm sed sh touch truncate uudecode uuencode
>>> xargs
>>
>> Is there anything under ${OBJTOP}/tmp that you don't want to ignore?
>
> More than just _bootstrap_tools_links entries end up in
> ${WORLDTMP}/legacy/bin/ (so in ${WORLDTMP}/legacy/sbin/
> via the symbolic link pointing to ${WORLDTMP}/legacy/bin/ ).
> So: yes.
>
> Also, OBJTOP is not constant over all the parts of
> buildworld buildkernel . Having the late-substitution
> form of notation ${OBJTOP} might not be appropriate
> for the content of .MAKE.META.IGNORE_PATHS .
>
> I'm trying to figure out if there is a stable way of
> getting a path that would not suffer variability
> via late substitution.
>
>> Otherwise you could simply use
>>
>> .MAKE.META.IGNORE_PATHS+= ${OBJTOP}/tmp/
>
> (Ignoring the variability of OBJTOP issue . . .)
>
> I do not expect that would work: ignoring things
> it likely should not.
>
> Also, I'd rather grow a smaller set of ignores
> gradually to make it easier to detect if an
> addition starts causing a problem and can be
> backed out. Starting with everything ignored
> would make things much harder to figure out
> when ignoring creates a problem.
>
>> You might need ${OBJTOP:tA}/tmp/
>> or both.
>>
>>> .MAKE.META.IGNORE_PATHS+= ${OBJTOP}/tmp/legacy/usr/sbin/${ignore_legacy_tool}
>>> .endfor
>>> .for ignore_other_tool in ctfconvert objcopy nm
>>> .MAKE.META.IGNORE_PATHS+= ${OBJTOP}/tmp/usr/bin/${ignore_other_tool}
>>> .endfor
>>>
>>> in what I use for make.conf via:
>>>
>>> __MAKE_CONF=/usr/home/root/src.configs/make.conf
>>>
>>> It is using paths that match the -dM output lines ( sbin
>>> use despite sbin -> ../bin being a symbolic link).
>>>
>>> Note: WORLDTMP is not defined that early, thus the ${OBJTOP}/tmp
>>> use.
>>>
>>> -V.MAKE.META.IGNORE_PATHS is showing the paths I would
>>> expect, matching the -dM lines.
>>
>> Do you have example?
>> I really need to add some unit-tests for these...
>
> You may want to wait while I see if I can come up with
> a better example context to show things. I only just
> noticed the late-substitution potential issue and
> started looking for a way to avoid it, for example.
> (Either a value that does not vary or a form of
> causing up-front substitutions in my make.conf .)
>
I got some useful information about one type of context
that is odd and creates a far mount of "is newer than
the target" notices.
This is an example of something that always "rebuilds"
via a . . ./sbin/realpath "is newer":
/usr/obj/BUILDs/main-amd64-nodbg-clang/usr/main-src/amd64.amd64/sys/GENERIC-NODBG/modules/usr/main-src/sys/modules/aac/machine.meta: 23: file '/usr/obj/BUILDs/main-amd64-nodbg-clang/usr/main-src/amd64.amd64/tmp/legacy/usr/sbin/realpath' is newer than the target...
Building /usr/obj/BUILDs/main-amd64-nodbg-clang/usr/main-src/amd64.amd64/sys/GENERIC-NODBG/modules/usr/main-src/sys/modules/aac/machine
It turns out that the .meta file is for a symbolic link:
# ls -Tld /usr/obj/BUILDs/main-amd64-nodbg-clang/usr/main-src/amd64.amd64/sys/GENERIC-NODBG/modules/usr/main-src/sys/modules/aac/machine
lrwxr-xr-x 1 root wheel 31 Feb 22 20:19:27 2023 /usr/obj/BUILDs/main-amd64-nodbg-clang/usr/main-src/amd64.amd64/sys/GENERIC-NODBG/modules/usr/main-src/sys/modules/aac/machine -> /usr/main-src/sys/amd64/include
. . ./sys/modules/*/machine being a symbolic link to a directory is normal.
It turns out that . . ./sbin/ln "is newer" examples are
tied to a similar issue:
/usr/obj/BUILDs/main-amd64-nodbg-clang/usr/main-src/amd64.amd64/usr.bin/awk/awkgram.tab.h.meta: 12: file '/usr/obj/BUILDs/main-amd64-nodbg-clang/usr/main-src/amd64.amd64/tmp/legacy/usr/sbin/ln' is newer than the target...
Building /usr/obj/BUILDs/main-amd64-nodbg-clang/usr/main-src/amd64.amd64/usr.bin/awk/awkgram.tab.h
But . . .
# ls -Tld /usr/obj/BUILDs/main-amd64-nodbg-clang/usr/main-src/amd64.amd64/usr.bin/awk/awkgram.tab.h
lrwxr-xr-x 1 root wheel 9 Feb 22 20:18:24 2023 /usr/obj/BUILDs/main-amd64-nodbg-clang/usr/main-src/amd64.amd64/usr.bin/awk/awkgram.tab.h -> awkgram.h
The .meta file is for a symbolic link, to a file for this
type of context, not to a directory. (All the examples
happen for what I'm looking at happen to be symbolic
links to header files.)
It appears that for symbolic links being the target, META_MODE does
not respect .MAKE.META.IGNORE_PATHS .
===
Mark Millard
marklmi at yahoo.com