Date: Tue, 21 Feb 2023 20:51:59 -0800 From: Mark Millard <marklmi@yahoo.com> To: Peter <pmc@citylink.dinoex.sub.org> Cc: FreeBSD-STABLE Mailing List <freebsd-stable@freebsd.org> Subject: Re: 13.2 BETA2: how do debug META_MODE? Message-ID: <A6A8EA3C-7D14-4467-B00E-388685C4A7F4@yahoo.com> In-Reply-To: <Y/WH9icO%2BgWPBybo@disp.intra.daemon.contact> References: <41B536B0-DA66-449E-96BB-E11A8750471A.ref@yahoo.com> <41B536B0-DA66-449E-96BB-E11A8750471A@yahoo.com> <Y/S/RfZaWXXYPx2w@disp.intra.daemon.contact> <ED41CCB8-7A32-4924-A756-099D8E819C4D@yahoo.com> <Y/V5ozYzwL67qDOP@disp.intra.daemon.contact> <F9AE0FD8-5E94-484A-A67A-8D4FAB967F59@yahoo.com> <Y/WH9icO%2BgWPBybo@disp.intra.daemon.contact>
next in thread | previous in thread | raw e-mail | index | archive | help
On Feb 21, 2023, at 19:11, Peter <pmc@citylink.dinoex.sub.org> wrote: > On Tue, Feb 21, 2023 at 06:44:09PM -0800, Mark Millard wrote: > ! On Feb 21, 2023, at 18:10, Peter <pmc@citylink.dinoex.sub.org> = wrote: > !=20 > ! > On Tue, Feb 21, 2023 at 11:56:13AM -0800, Mark Millard wrote: > ! > ! On Feb 21, 2023, at 04:55, Peter <pmc@citylink.dinoex.sub.org> = wrote: > ! > !=20 > ! > ! > ! # cd /usr/src/ > ! > ! > ! # env WITH_META_MODE=3Dyes make buildworld > ! > ! > ! # env WITH_META_MODE=3Dyes make installworld > ! > ! > ! # env WITH_META_MODE=3Dyes make buildworld (again #0) > ! > ! > ! ## no more rebuilds below? > ! > ! > ! # env WITH_META_MODE=3Dyes make buildworld (again #1) > ! > ! > ! # env WITH_META_MODE=3Dyes make buildworld (again #2) > ! > ! >=20 > ! > ! > But what is the difference between #0 and #1? > ! > !=20 > ! > ! awk, cp, ln, rm, sed, and many more from > ! > ! . . ./tmp/legacy/usr/sbin/have new dates > ! > ! for rebuilds after installworld (that targets > ! > ! the running system). Not true for #1 and #2. > ! > !=20 > ! > ! The dates on these tools being more recent than > ! > ! the files that they were involved in producing > ! > ! leads to rebuilding those files. That in turn > ! > ! leads to other files being rebuilt. > ! > !=20 > ! > ! make with -dM reports the likes of: > ! > !=20 > ! > ! file '. . ./tmp/legacy/usr/sbin/awk' is newer than the = target... > ! > !=20 > ! > ! explicitly as it goes. As I remember tmp/legacy/usr/sbin/ > ! > ! was always part of the path for what I found. > ! >=20 > ! > Mark, thanks a lot for the proper input at the right time! > ! >=20 > ! > This put me on the right track and I mananged to analyze and > ! > understand what is actually happening. > ! >=20 > ! > It looks like my issue does resolve itself somehow, and things > ! > start to behave as expected again after four builds. > !=20 > ! Intersting. > !=20 > ! > ! I did not do the analysis of how (e.g.) tmp/legacy/usr/sbin/awk > ! > ! ended up being newer than such a target and, so, causing a > ! > ! rebuild of that target. I was going the direction: that > ! > ! it is newer really is unlikely to justify the rebuild for > ! > ! the target(s) in question. The other direction about how > ! > ! it got to be newer is also relevant. > ! >=20 > ! > I have now analyzed some parts of it. META_MODE typically finds = some > ! > build-tools to rebuild, but then if the result is not different > ! > from what was there before, then "install" will not copy it to the > ! > bin-dir, and so the avalanche gets usually avoided. > ! >=20 > !=20 > ! The implication is that "install -C" is in use, quoting the > ! man page: > !=20 > ! -C Copy the file. If the target file already exists and = the files > ! are the same, then do not change the modification time = of the > ! target. If the target's file flags and mode need not = to be > ! changed, the target's inode change time is also = unchanged. > !=20 > ! -c Copy the file. This is actually the default. The -c = option is > ! only included for backwards compatibility. > !=20 > ! -C might have more of an effect in a reproducible-build > ! style build process than on a non-reproducible-build > ! style one. >=20 > Yepp. "install -p" is used, see /usr/src/tools/install.sh >=20 The code for the _bootstap_tools_links uses "cp -pf", not install, to establish part of . . ./tmp/legacy/bin/ . (Note: . . ./tmp/legacy/sbin -> ../bin so is a via a symbolic link.) Before the "cp -pf" there is a "rm -f" deleting the target file before the copy: the prior file in . . ./tmp/legacy/bin/ is never directly preserved. (The new copy might still be identical to the old one: the source path one might happen to be identical as well.) # Link the tools that we need for building but don't need to bootstrap = because # the host version is known to be compatible into ${WORLDTMP}/legacy # We do this before building any of the bootstrap tools in case they = depend on # the presence of any of the links (e.g. as m4/lex/awk) ${_bt}-links: .PHONY .for _tool in ${_bootstrap_tools_links} ${_bt}-link-${_tool}: .PHONY @rm -f "${WORLDTMP}/legacy/bin/${_tool}"; \ source_path=3D`which ${_tool}`; \ if [ ! -e "$${source_path}" ] ; then \ echo "Cannot find host tool '${_tool}'"; false; \ fi; \ cp -pf "$${source_path}" "${WORLDTMP}/legacy/bin/${_tool}" ${_bt}-links: ${_bt}-link-${_tool} .endfor Note: This is for the !defined(BOOTSTRAP_ALL_TOOLS) case. Note: the code uses the abbreviation: _bt=3D _bootstrap-tools _bootstrap_tools_links is built mostly in terms of _basic_bootstrap_tools and _basic_bootstrap_tools_multilink from earlier logic. For reference, showing what ends up handled this way: # grep -r "_bootstrap_tools" /usr/main-src/Makefile* = /usr/main-src/share/ | more /usr/main-src/Makefile.inc1:# _bootstrap_tools_links variable. /usr/main-src/Makefile.inc1:_bootstrap_tools_links+=3Dm4 lex /usr/main-src/Makefile.inc1:_bootstrap_tools_links+=3Dmtree /usr/main-src/Makefile.inc1:_bootstrap_tools_links+=3Dcat /usr/main-src/Makefile.inc1:_bootstrap_tools_links+=3Dcrunchide /usr/main-src/Makefile.inc1:_bootstrap_tools_links+=3Dcrunchgen /usr/main-src/Makefile.inc1:_bootstrap_tools_links+=3Dmkimg /usr/main-src/Makefile.inc1:_kerberos5_bootstrap_tools=3D \ /usr/main-src/Makefile.inc1:.ORDER: = ${_kerberos5_bootstrap_tools:C/^/${_bt}-/g} /usr/main-src/Makefile.inc1:.for _tool in ${_kerberos5_bootstrap_tools} /usr/main-src/Makefile.inc1:# The tools listed in _basic_bootstrap_tools = will generally not be /usr/main-src/Makefile.inc1:# case we use the = _basic_bootstrap_tools_multilink variable which is a list of = /usr/main-src/Makefile.inc1:_basic_bootstrap_tools_multilink=3Dusr.bin/gre= p grep,egrep,fgrep /usr/main-src/Makefile.inc1:_basic_bootstrap_tools_multilink+=3Dbin/test = test,[ /usr/main-src/Makefile.inc1:_basic_bootstrap_tools+=3Dusr.bin/cut = bin/expr usr.bin/gencat usr.bin/join \ = /usr/main-src/Makefile.inc1:_basic_bootstrap_tools_multilink+=3Dusr.bin/aw= k awk,nawk /usr/main-src/Makefile.inc1:_basic_bootstrap_tools+=3Dusr.bin/file2c = /usr/main-src/Makefile.inc1:_basic_bootstrap_tools_multilink+=3Dusr.bin/bi= ntrans uuencode,uudecode /usr/main-src/Makefile.inc1:_basic_bootstrap_tools+=3Dusr.bin/xargs /usr/main-src/Makefile.inc1:_basic_bootstrap_tools+=3Dusr.bin/cap_mkdb = /usr/main-src/Makefile.inc1:_basic_bootstrap_tools+=3Dusr.sbin/services_mk= db usr.sbin/pwd_mkdb /usr/main-src/Makefile.inc1:_basic_bootstrap_tools+=3Dusr.bin/ldd /usr/main-src/Makefile.inc1:_basic_bootstrap_tools+=3Dbin/chflags /usr/main-src/Makefile.inc1:_bootstrap_tools_links+=3Dsysctl = /usr/main-src/Makefile.inc1:_other_bootstrap_tools+=3Dtools/build/cross-bu= ild/fake_chflags /usr/main-src/Makefile.inc1:_basic_bootstrap_tools+=3Dusr.bin/mkfifo /usr/main-src/Makefile.inc1:_basic_bootstrap_tools+=3Dusr.bin/jot /usr/main-src/Makefile.inc1:_basic_bootstrap_tools+=3Dsbin/md5 /usr/main-src/Makefile.inc1:_basic_bootstrap_tools+=3Dusr.sbin/tzsetup = /usr/main-src/Makefile.inc1:_other_bootstrap_tools+=3D${_basic_bootstrap_t= ools} /usr/main-src/Makefile.inc1:.for _subdir _links in = ${_basic_bootstrap_tools_multilink} /usr/main-src/Makefile.inc1:_other_bootstrap_tools+=3D${_subdir} /usr/main-src/Makefile.inc1:_other_bootstrap_tools+=3Dusr.bin/bmake /usr/main-src/Makefile.inc1:_other_bootstrap_tools+=3Dlib/libbz2 /usr/main-src/Makefile.inc1:_other_bootstrap_tools+=3Dlib/libz /usr/main-src/Makefile.inc1:_other_bootstrap_tools+=3Dlib/libcrypt /usr/main-src/Makefile.inc1:# All tools in _basic_bootstrap_tools have = the same name as the subdirectory = /usr/main-src/Makefile.inc1:_bootstrap_tools_links+=3D${_basic_bootstrap_t= ools:T} /usr/main-src/Makefile.inc1:.for _subdir _links in = ${_basic_bootstrap_tools_multilink} /usr/main-src/Makefile.inc1:_bootstrap_tools_links+=3D${_links:S/,/ /g} /usr/main-src/Makefile.inc1:.for _tool in ${_bootstrap_tools_links} /usr/main-src/Makefile.inc1: ${_kerberos5_bootstrap_tools} \ /usr/main-src/Makefile.inc1: ${_other_bootstrap_tools} \ What the prior installworld did for the analogous files is a separate issue. =3D=3D=3D Mark Millard marklmi at yahoo.com
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?A6A8EA3C-7D14-4467-B00E-388685C4A7F4>