FBSD: update to using bsd.kmod.mk
authorBen Kaduk <kaduk@mit.edu>
Tue, 21 Jun 2011 02:46:01 +0000 (22:46 -0400)
committerDerrick Brashear <shadow@dementia.org>
Mon, 18 Jul 2011 16:40:57 +0000 (09:40 -0700)
We have for a long time had a cobbled-together kernel module build
system that essentially copied build arguments from a kernel build
in an ad hoc fashion, with lots of conditionals on architecture
and OS version.  (We got it wrong, several times, too.)
Instead, use the supported mechanism for building kernel modules,
which allows us to remove a lot of code from the Makefile and gives
us some measure of future-proofing.

FIXES 127578

Change-Id: Ibccea4507f57660becb4fb39a57b50c15ea4cb07
Reviewed-on: http://gerrit.openafs.org/5042
Reviewed-by: Garrett Wollman <wollman@csail.mit.edu>
Tested-by: Derrick Brashear <shadow@dementia.org>
Reviewed-by: Derrick Brashear <shadow@dementia.org>

src/libafs/MakefileProto.FBSD.in

index 3bb4a62..5a2ff9e 100644 (file)
@@ -7,25 +7,34 @@
 #
 srcdir=@srcdir@
 include @TOP_OBJDIR@/src/config/Makefile.config
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-
-
-# OS specific object files:
-AFS_OS_OBJS = \
-       osi_crypto.o \
-       osi_gcpags.o \
-       osi_groups.o \
-       osi_file.o \
-       osi_inode.o \
-       osi_misc.o \
-       osi_sleep.o \
-       osi_vcache.o \
-       osi_vm.o \
-       osi_vnodeops.o \
-       osi_module.o 
+
+# rx_event is miscompiled by gcc at -O0, causing panic on startup
+.if empty(${CFLAGS:M-O})
+CFLAGS+=       -O
+.endif
+
+# tell bsd.kmod.mk to build us vnode_if*
+SRCS=  vnode_if.h
+
+# We must set SRCS to include at least one .c file if we are also using
+# vnode_if.h, due to a bug in the system makefiles where the empty string
+# gets expanded to a ".o" entry in OBJS, which there is (correctly) no
+# rule to make.  For simplicity, just set this as all of what would
+# otherwise be AFS_OS_OBJS so that people have a familiar list to look for.
+#
+# OS specific "object" files:
+SRCS+= \
+       osi_crypto.c \
+       osi_gcpags.c \
+       osi_groups.c \
+       osi_file.c \
+       osi_inode.c \
+       osi_misc.c \
+       osi_sleep.c \
+       osi_vcache.c \
+       osi_vm.c \
+       osi_vnodeops.c \
+       osi_module.c
 
 #AFS_OS_NFSOBJS = \
 #      osi_vfsops_nfs.o
@@ -33,27 +42,20 @@ AFS_OS_OBJS = \
 AFS_OS_NONFSOBJS = \
        osi_vfsops.o
 
-
 # System specific build commands and flags
 KSRC = @BSD_KERNEL_PATH@
 KBLD = @BSD_KERNEL_BUILD@
-<amd64>
-KOPTS = -fPIC -mno-red-zone
-<all>
-
-KDEFS=-Wall -nostdinc -I/usr/include -D_KERNEL -DKLD_MODULE \
-       -elf \
-<i386_fbsd_60>
-       -mno-mmx -mno-3dnow -mno-sse -mno-sse2 \
-<all>
-       -mno-align-long-strings -fno-common -ffreestanding \
-       -I${KBLD} -include opt_global.h -fno-strict-aliasing
-
-DBUG = -O2
-#DBUG = -O -g
-DEFINES= -DAFSDEBUG -DKERNEL -DAFS -DVICE -DNFS -DUFS -DINET -DQUOTA -DGETMOUNT
-CFLAGS=-I. -I.. -I${TOP_OBJDIR}/src/config ${FSINCLUDES} $(DEFINES) $(KDEFS) $(KOPTS) ${DBUG}
 
+# We are not doing very well (WARNS=2 brings in printf format type checking)
+WARNS= 1
+# We have some sketchy code that redeclares prototypes
+CWARNFLAGS+= -Wno-redundant-decls
+
+# setup for bsd.kmod.mk infrastructure
+.PATH: ${TOP_SRCDIR}/afs/FBSD
+KMODDIR=/boot/modules
+KMOD=  libafs
+SYSDIR= ${KSRC}
 
 # Name of directory to hold object files and libraries.
 KOBJ = MODLOAD
@@ -63,35 +65,29 @@ COMPDIRS = single_compdir
 INSTDIRS = single_instdir
 DESTDIRS = single_destdir
 
-include Makefile.common
-
+# The common sysincludes code needs the 'h' symlink.
+# We cannot include bsd.kmod.mk in this file directly, because it will start
+# generating headers and objects in this directory, which we want in $(KOBJ).
+# We also need the install target from bsd.kmod.mk in $(KOBJ), but the one
+# from Makefile.common in this directory.  A prime candidate for cleanup.
 setup:
        -mkdir $(KOBJ)
        -$(RM) $(KOBJ)/Makefile $(KOBJ)/Makefile.common
-       ln -fs ../Makefile $(KOBJ)/Makefile
-       ln -fs ../Makefile.common $(KOBJ)/Makefile.common
-       -$(RM) -f  h net netinet rpc ufs nfs  machine sys vm
-       -ln -fs ${KSRC}/net net
-       -ln -fs ${KSRC}/@HOST_CPU@/include machine
-       -ln -fs ${KSRC}/netinet netinet
-       -ln -fs ${KSRC}/nfs nfs
-<all -fbsd_71 -fbsd_72 -fbsd_72 -fbsd_73 -fbsd_74 -fbsd_80 -fbsd_81 -fbsd_82 -fbsd_90>
-       -ln -fs /usr/include/rpc rpc
-<fbsd_71 fbsd_72 fbsd_73 fbsd_74 fbsd_80 fbsd_81 fbsd_82 fbsd_90>
-       -ln -fs ${KSRC}/rpc rpc
-<all>
-       -ln -fs ${KSRC}/sys sys
-       -ln -fs ${KSRC}/ufs/ufs ufs
+       $(CP) Makefile $(KOBJ)/Makefile
+       echo ".include <bsd.kmod.mk>" >> $(KOBJ)/Makefile
+       sed -e 's/^install:/afsinstall:/' Makefile.common > $(KOBJ)/Makefile.common
+       -$(RM) -f h
        -ln -fs ${KSRC}/sys h
-       -ln -fs ${KSRC}/vm vm
-       -touch $(KOBJ)/sec_net.h
 
+# Makefile.common sets AFSAOBJS, COMMON_INCLUDE, TOP_{SRC,OBJ}*, and the like.
+# We must live with its other pollution of targets and build rules.
+include Makefile.common
 
-depsrcs:       vnode_if.h
+# we only do the no-NFS case
+OBJS=  ${AFSAOBJS} ${AFSNONFSOBJS}
 
-# Below this line are targets when in the COMMON directory:
-LIBAFS = libafsnfs.ko
-LIBAFSNONFS = libafs.ko
+DEFINES= -DAFSDEBUG -DKERNEL -DAFS -DVICE -DNFS -DUFS -DINET -DQUOTA -DGETMOUNT
+CFLAGS+= $(DEFINES) ${COMMON_INCLUDE} -I@/sys -Imachine
 
 INST_LIBAFS = ${DESTDIR}${afskerneldir}/${LIBAFS}
 INST_LIBAFSNONFS = ${DESTDIR}${afskerneldir}/${LIBAFSNONFS}
@@ -99,43 +95,12 @@ INST_LIBAFSNONFS = ${DESTDIR}${afskerneldir}/${LIBAFSNONFS}
 DEST_LIBAFS = ${DEST}/root.client/bin/${LIBAFS}
 DEST_LIBAFSNONFS = ${DEST}/root.client/bin/${LIBAFSNONFS}
 
-
-# Without this line, gmake tries to build libafs
-.PHONY: libafs
-
-# libafs:      $(LIBAFS) $(LIBAFSNONFS)
-libafs:        $(LIBAFSNONFS)
-
-install_libafs:        $(LIBAFSNONFS)
-       ${INSTALL} -d ${DESTDIR}${afskerneldir}
-       ${INSTALL} -m 644 $(LIBAFSNONFS) $(INST_LIBAFSNONFS)
+install_libafs:        $(LIBAFSNONFS) install
 
 dest_libafs: $(LIBAFSNONFS)
        ${INSTALL} -d ${DEST}/root.client/bin
        ${INSTALL} -m 644 $(LIBAFSNONFS) $(DEST_LIBAFSNONFS)
 
-${LIBAFS}: $(AFSAOBJS) $(AFSNFSOBJS)
-       $(LD) -r -o ${LIBAFS}.kld ${AFSAOBJS} ${AFSNFSOBJS}
-       gensetdefs ${LIBAFS}.kld
-       $(MAKE) setdef0.o setdef1.o
-       $(LD) -Bshareable -o ${LIBAFS} setdef0.o ${LIBAFS}.kld setdef1.o
-
-${LIBAFSNONFS}:  $(AFSAOBJS) $(AFSNONFSOBJS)
-       $(LD) -r -d -warn-common -o libafs.kld ${AFSAOBJS} ${AFSNONFSOBJS}
-       touch export_syms
-       awk -f ${KSRC}/conf/kmod_syms.awk libafs.kld export_syms | xargs -J% objcopy % libafs.kld
-       $(LD) -Bshareable -d -warn-common -o ${LIBAFSNONFS} libafs.kld
-
-
-# Object build rules:
-setdef0.o: setdef0.c
-       $(CRULE_NOOPT)
-setdef1.o: setdef1.c
-       $(CRULE_NOOPT)
-
-# vnode_if.h build rules:
-vnode_if.h:    ${KSRC}/kern/vnode_if.src
-       awk -f ${KSRC}/tools/vnode_if.awk ${KSRC}/kern/vnode_if.src -h
-       awk -f ${KSRC}/tools/vnode_if.awk ${KSRC}/kern/vnode_if.src -q
-       awk -f ${KSRC}/tools/vnode_if.awk ${KSRC}/kern/vnode_if.src -p
-<all>
+# This is ugly, but the common infrastructure needs a libafs target.
+libafs: depend libafs.ko
+