Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 5 Mar 2009 10:41:10 -0500
From:      John Baldwin <jhb@freebsd.org>
To:        arch@freebsd.org
Subject:   [PATCH] Set SYSDIR for modules built with kernel
Message-ID:  <200903051041.10678.jhb@freebsd.org>

next in thread | raw e-mail | index | archive | help
One of the things each kernel module build has to do is figure out where the 
source tree it belongs to lives.  /usr/share/mk/bsd.kmod.mk uses a heuristic 
where it walks up N levels of the tree looking for a kernel source directory.  
If that fails it falls back to /sys or /usr/src/sys.  One side effect of this 
(besides lots of directory lookups during a build as each kernel module build 
stage has to do this) is that if CURRENT adds an even deeper level of nesting 
(such as with the recent ata chipset modules) then you can't build a kernel 
with those modules until /usr/share/mk/bsd.kmod.mk on your build machine has 
been updated.  This means you can't build an 8.0 kernel on 7.0 simply because 
ata chipset modules don't find the right headers.

However, the SYSDIR is already known during a kernel build (we depend on this 
to make modules built in ports DTRT when they are rebuilt via buildkernel).  
I just changed the kernel build Makefile to always set SYSDIR.  With this 
change, I was able to build an 8.0 kernel + modules on a 7.1-ish machine with 
an unpatched /usr/share/mk/bsd.kmod.mk.  This should also have the side 
effect of reducing the number of pathname lookup operations done during a 
kernel build with modules.

Thoughts?

--- //depot/projects/smpng/sys/conf/kern.post.mk	2009/01/15 22:41:24
+++ //depot/user/jhb/lock/conf/kern.post.mk	2009/03/04 21:25:21
@@ -12,7 +12,8 @@
 .if defined(DESTDIR)
 MKMODULESENV+=	DESTDIR="${DESTDIR}"
 .endif
-MKMODULESENV+=	KERNBUILDDIR="${.CURDIR}"
+SYSDIR?= ${S:C;^[^/];${.CURDIR}/&;}
+MKMODULESENV+=	KERNBUILDDIR="${.CURDIR}" SYSDIR="${SYSDIR}"
 
 .MAIN: all
 
@@ -29,7 +30,6 @@
 
 # Handle out of tree ports 
 .if !defined(NO_MODULES) && defined(PORTS_MODULES)
-SYSDIR?= ${S:C;^[^/];${.CURDIR}/&;}
 PORTSMODULESENV=SYSDIR=${SYSDIR}
 .for __target in all install reinstall clean
 ${__target}: ports-${__target}

-- 
John Baldwin



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200903051041.10678.jhb>