On Sat, 24 Dec 2011, Alexander Best wrote:
On Sat Dec 24 11, Bruce Evans wrote:
This almost builds in -current too. I had to add the following:
- NO_MODULES to de-bloat the compile time
- MK_CTF=no to build -current on FreeBSD.9. The kernel .mk files are
still broken (depend on nonstandard/new features in sys.mk).
strange. the build(7) man page claims that:
"
WITH_CTF If defined, the build process will run the DTrace CTF
conversion tools on built objects. Please note that
this WITH_ option is handled differently than all other
WITH_ options (there is no WITHOUT_CTF, or correspond-
ing MK_CTF in the build system).
"
... so setting MK_CTF to anything shouldn't have (according to the man page).
MK_CTF is an implementation detail. It is normally set in bsd.own.mk
(not in sys.mk line I said -- this gives another, much larger bug (*)).
But when usr/share/mk is old, it doesn't know anything about MK_CTF.
(For example, in FreeBSD-9, sys.mk sets NO_CTF to 1 if WITH_CTF is not
defined. This corresponds to bsd.own.mk in -current setting MK_CTF
to "no" if WITH_CTF is not defined. Go back to an older version of
FreeBSD and /usr/share/mk/* won't know anything about any CTF variable.)
So when you try to build a current kernel under an old version of
FreeBSD, MK_CTF is used uninitialized and the build fails. (Of course,
"you" build kernels normally and don't use the bloated buildkernel
method.) The bug is in the following files:
kern.post.mk:.if ${MK_CTF} != "no"
kern.pre.mk:.if ${MK_CTF} != "no"
kmod.mk:.if defined(MK_CTF) && ${MK_CTF} != "no"
except for the last one where it has been fixed.
(*) Well, not completely broken, but just annoyingly unportabile.
Consider the following makefile:
%%%
foo: foo.c
%%%
Invoking this under FreeBSD-9 gives:
%%%
cc -O2 -pipe foo.c -o foo
[ -z "ctfconvert" -o -n "1" ] || (echo ctfconvert -L VERSION foo &&
ctfconvert -L VERSION foo)
%%%
This is the old ctf method. It is ugly but is fairly portable.
Invoking this under FreeBSD-9 but with -m<path-to-current-mk-directory> gives
%%%
cc -O2 -pipe foo.c -o foo
${CTFCONVERT_CMD} expands to empty string
%%%
This is because:
- the rule in sys.mk says ${CTFCONVERT_CMD}
- CTFCONVERT_CMD is normally defined in bsd.own.mk. But bsd.own.mk is only
included by BSD makefiles. It is never included by portable makefiles.
So ${CTFCONVERT_CMD} is used uninitialized.
- for some reason, using variables uninitialized is not fatal in this
context, although it is for the comparisons of ${MK_CTF} above.
- ${CTFCONVERT_CMD} is replaced by the empty string. Old versions of
make warn about the use of an empty string as a shell command.
- the code that is supposed to prevent the previous warning is in
bsd.own.mk, where it is not reached for portable makefiles. It is:
% .if ${MK_CTF} != "no"
% CTFCONVERT_CMD= ${CTFCONVERT} ${CTFFLAGS} ${.TARGET}
This uses the full ctfconvert if WITH_CTF.
% .elif ${MAKE_VERSION} >= 5201111300
% CTFCONVERT_CMD=
make(1) has been modified to not complain about the empty string. The
version test detects which versions of make don't complain.
% .else
% CTFCONVERT_CMD= @:
The default is to generate this non-empty string and an extra shell command
to execute it, for old versions of make.
% .endif
But none of this works for portable makefiles, since it is not reached.
Bruce
_______________________________________________
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to "freebsd-current-unsubscr...@freebsd.org"