Re: porting third-party build system to bsd.kmod.mk

2011-06-21 Thread Benjamin Kaduk

Picking up this problem after a long hiatus...

On Sun, 22 May 2011, Warner Losh wrote:

The usual reason that vnode_if.h doesn't build for me when I'm doing 
in-tree hacking is because make depend hasn't run to generate it yet. 
Or more precisely, the arc in the dependency graph from osi_crypto.c to 
vnode_if.h.  I didn't see that as part of the log, so you might try this 
first (and make setup dependent on depend somehow, as long as it is 
idempotent.


Ah, thanks for that pointer, having setup depend on 'depend' does help get 
SRCS=vnode_if.h to actually work.  However, that does not solve all of my 
problems; the too many arguments to gcc with -o and -c problem remains. 
It stems from the way upstream's Makefile is structured to build the 
object files:


afs_analyze.o: $(TOP_SRC_AFS)/afs_analyze.c
$(CRULE_OPT)

CRULE_OPT=  $(CC) $(COMMON_INCLUDE) $(KERN_DBG) $(KERN_OPTMZ) $(CFLAGS) 
$(CFLAGS-$@) -o $@ -c $?

$? picks up ${_ILINKS} and apparently ${SRCS} as having been out-of-date 
when the run was started, which produes the error.  Since I don't think I 
can convince make to not do that, I'm mostly resigned to redefining 
CRULE_OPT to use ${?:M*.c}, which lets things proceed fairly nicely, and 
build a bunch of objs.  However, the build eventually dies with:

make: don't know how to make .o. Stop

The following 'make -d A' output proves enlightening:
Global:SRCS = vnode_if.h
[...]
Global:OBJS = ${AFSAOBJS} ${AFSNONFSOBJS} ${SRCS:N*.h:R:S/$/.o/g}
Global:PROG = ${KMOD}.ko
Global:FULLPROG = ${PROG}
lhs = no, rhs = yes, op = ==
Global:EXPORT_SYMS = NO
lhs = NO, rhs = YES, op = !=
Global:CLEANFILES = export_syms
lhs = no, rhs = yes, op = ==
Applying :N to vnode_if.h
Result is 
Applying :R to 
Result is 
Applying :S to 
Result is .o
[...]
make: don't know how to make .o. Stop

It looks like I may be able to work around by putting something else in 
SRCS instead of OBJS, but it is still rather interesting behavior, 
and might be considered a bug under some sets of assumptions.


Any insight into whether it is/is not possible to have $? be just the C 
source, or about the issue where the empty string becomes .o would be 
appreciated.  Or do I always want to redefine CRULE_OPT to something set 
by the system makefiles?  (There is also a CRULE_NOOPT which is similar.)




But many of the things that are being setup with the setup target 
shouldn't be necessary.  depend does that based on the setting of 
SYSDIR.  and the @ symlink should be enough to make the ufs and other 
symlinks unnecessary.




At least some of them will require code changes, but I suppose that I can 
do that with a flag day.


Thanks,

Ben




On May 21, 2011, at 12:14 AM, Benjamin Kaduk wrote:

After getting a few pointers from jhb at BSDCan on what a 
bsd.kmod.mk-using Makefile should look like, I have been trying my hand 
at porting the OpenAFS kernel module build system to use it.  (The main 
thing this gets us is not having to manually track version- and 
architecture-dependent CFLAGS and the like.)  However, the path is not 
exactly smooth.


A lot of the difficulty is in getting an autogenerated vnode_if.h while using a 
list of files to include in the module(from the common OpenAFS code) that's 
given as a list of object files.  If there's already a vnode_if.h sitting 
around, I can just use OBJS and things progress quite nicely; however, if I 
have to get back to SRCS for the use of sys/conf/kmod.mk's vnode_if.h logic, I 
get this sort of build failure (full log attached) with the attached Makefile:
gcc -I. -I.. -I../nfs [more includes and defines] 
-I/usr/devel/openafs/git/openafs/include/afs -I@/sys -Imachine -I. -I@ 
-I@/contrib/altq -finline-limit=8000 --param inline-unit-growth=100 --param 
large-function-growth=1000 -fno-common -fno-omit-frame-pointer -mcmodel=kernel 
-mno-red-zone -mfpmath=387 -mno-mmx -mno-3dnow -mno-sse -mno-sse2 -mno-sse3 
-msoft-float -fno-asynchronous-unwind-tables -ffreestanding -fstack-protector 
-std=iso9899:1999 -fstack-protector -Wno-redundant-decls -Wsystem-headers 
-Werror -Wno-pointer-sign -o osi_crypto.o -c 
/usr/devel/openafs/git/openafs/src/afs/FBSD/osi_crypto.c 
/usr/devel/openafs/git/openafs/src/libafs/MODLOAD/../../afs/FBSD/osi_crypto.c 
vnode_if.h
gcc: cannot specify -o with -c or -S with multiple files

That last bit, -o osi_crypto.o -c /path/to/osi_crypto.c /path/to/osi_crypto.c 
vnode_if.h is quite troublesome.  Any thoughts on what is causing those extra files 
to be listed would be greatly appreciated.  (Comments on other issues in the Makefile are 
welcome, too -- it's still in pretty rough shape.)

I should note that though Makefile.common does define a osi_crypto.o target, make 
-d A reports:
   using existing source 
/usr/devel/openafs/git/openafs/src/afs/FBSD/osi_crypto.c
   applying .c - .o to osi_crypto.o


Thanks,

Ben 
KadukMakefile.txtbuild.log___

___

Re: porting third-party build system to bsd.kmod.mk

2011-05-22 Thread Warner Losh
The usual reason that vnode_if.h doesn't build for me when I'm doing in-tree 
hacking is because make depend hasn't run to generate it yet.  Or more 
precisely, the arc in the dependency graph from osi_crypto.c to vnode_if.h.  I 
didn't see that as part of the log, so you might try this first (and make setup 
dependent on depend somehow, as long as it is idempotent.

But many of the things that are being setup with the setup target shouldn't be 
necessary.  depend does that based on the setting of SYSDIR.  and the @ symlink 
should be enough to make the ufs and other symlinks unnecessary.

Warner


On May 21, 2011, at 12:14 AM, Benjamin Kaduk wrote:

 After getting a few pointers from jhb at BSDCan on what a bsd.kmod.mk-using 
 Makefile should look like, I have been trying my hand at porting the OpenAFS 
 kernel module build system to use it.  (The main thing this gets us is not 
 having to manually track version- and architecture-dependent CFLAGS and the 
 like.)  However, the path is not exactly smooth.
 
 A lot of the difficulty is in getting an autogenerated vnode_if.h while using 
 a list of files to include in the module(from the common OpenAFS code) that's 
 given as a list of object files.  If there's already a vnode_if.h sitting 
 around, I can just use OBJS and things progress quite nicely; however, if I 
 have to get back to SRCS for the use of sys/conf/kmod.mk's vnode_if.h logic, 
 I get this sort of build failure (full log attached) with the attached 
 Makefile:
 gcc -I. -I.. -I../nfs [more includes and defines] 
 -I/usr/devel/openafs/git/openafs/include/afs -I@/sys -Imachine -I. -I@ 
 -I@/contrib/altq -finline-limit=8000 --param inline-unit-growth=100 --param 
 large-function-growth=1000 -fno-common -fno-omit-frame-pointer 
 -mcmodel=kernel -mno-red-zone -mfpmath=387 -mno-mmx -mno-3dnow -mno-sse 
 -mno-sse2 -mno-sse3 -msoft-float -fno-asynchronous-unwind-tables 
 -ffreestanding -fstack-protector -std=iso9899:1999 -fstack-protector 
 -Wno-redundant-decls -Wsystem-headers -Werror -Wno-pointer-sign -o 
 osi_crypto.o -c /usr/devel/openafs/git/openafs/src/afs/FBSD/osi_crypto.c 
 /usr/devel/openafs/git/openafs/src/libafs/MODLOAD/../../afs/FBSD/osi_crypto.c 
 vnode_if.h
 gcc: cannot specify -o with -c or -S with multiple files
 
 That last bit, -o osi_crypto.o -c /path/to/osi_crypto.c 
 /path/to/osi_crypto.c vnode_if.h is quite troublesome.  Any thoughts on what 
 is causing those extra files to be listed would be greatly appreciated.  
 (Comments on other issues in the Makefile are welcome, too -- it's still in 
 pretty rough shape.)
 
 I should note that though Makefile.common does define a osi_crypto.o target, 
 make -d A reports:
using existing source 
 /usr/devel/openafs/git/openafs/src/afs/FBSD/osi_crypto.c
applying .c - .o to osi_crypto.o
 
 
 Thanks,
 
 Ben 
 KadukMakefile.txtbuild.log___
 freebsd-hackers@freebsd.org mailing list
 http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
 To unsubscribe, send any mail to freebsd-hackers-unsubscr...@freebsd.org

___
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to freebsd-hackers-unsubscr...@freebsd.org


porting third-party build system to bsd.kmod.mk

2011-05-21 Thread Benjamin Kaduk
After getting a few pointers from jhb at BSDCan on what a 
bsd.kmod.mk-using Makefile should look like, I have been trying my hand at 
porting the OpenAFS kernel module build system to use it.  (The main thing 
this gets us is not having to manually track version- and 
architecture-dependent CFLAGS and the like.)  However, the path is not 
exactly smooth.


A lot of the difficulty is in getting an autogenerated vnode_if.h while 
using a list of files to include in the module(from the common OpenAFS 
code) that's given as a list of object files.  If there's already a 
vnode_if.h sitting around, I can just use OBJS and things progress quite 
nicely; however, if I have to get back to SRCS for the use of 
sys/conf/kmod.mk's vnode_if.h logic, I get this sort of build failure 
(full log attached) with the attached Makefile:
gcc -I. -I.. -I../nfs [more includes and defines] 
-I/usr/devel/openafs/git/openafs/include/afs -I@/sys -Imachine -I. -I@ 
-I@/contrib/altq -finline-limit=8000 --param inline-unit-growth=100 
--param large-function-growth=1000 -fno-common -fno-omit-frame-pointer 
-mcmodel=kernel -mno-red-zone -mfpmath=387 -mno-mmx -mno-3dnow -mno-sse 
-mno-sse2 -mno-sse3 -msoft-float -fno-asynchronous-unwind-tables 
-ffreestanding -fstack-protector -std=iso9899:1999 -fstack-protector 
-Wno-redundant-decls -Wsystem-headers -Werror -Wno-pointer-sign -o 
osi_crypto.o -c /usr/devel/openafs/git/openafs/src/afs/FBSD/osi_crypto.c 
/usr/devel/openafs/git/openafs/src/libafs/MODLOAD/../../afs/FBSD/osi_crypto.c 
vnode_if.h

gcc: cannot specify -o with -c or -S with multiple files

That last bit, -o osi_crypto.o -c /path/to/osi_crypto.c 
/path/to/osi_crypto.c vnode_if.h is quite troublesome.  Any thoughts on 
what is causing those extra files to be listed would be greatly 
appreciated.  (Comments on other issues in the Makefile are welcome, too 
-- it's still in pretty rough shape.)


I should note that though Makefile.common does define a osi_crypto.o 
target, make -d A reports:
using existing source 
/usr/devel/openafs/git/openafs/src/afs/FBSD/osi_crypto.c

applying .c - .o to osi_crypto.o


Thanks,

Ben Kaduk# Copyright 2000, International Business Machines Corporation and others.
# All Rights Reserved.
#
# This software has been released under the terms of the IBM Public
# License.  For details, see the LICENSE file in the top-level source
# directory or online at http://www.openafs.org/dl/license10.html
#
srcdir=.
include /usr/devel/openafs/git/openafs/src/config/Makefile.config
# we unset these to work around flags we don't want
# XCFLAGS sets -fPIC, which is forbidden for mcmodel=kernel
XCFLAGS=
COMMON_CFLAGS=
# XXX not sure if these need to be (re)defined here
INSTALL = /usr/bin/install -c
INSTALL_DATA = ${INSTALL} -m 644
INSTALL_PROGRAM = ${INSTALL} 
INSTALL_SCRIPT = ${INSTALL}

# System specific build commands and flags
KSRC = /usr/src/sys
KBLD = /usr/obj/usr/src/sys/GENERIC

# We suck
WARNS= 1
# setting WARNS=0 did not help with this?!
CWARNFLAGS+= -Wno-redundant-decls

# setup for bsd.kmod.mk infrastructure
.PATH:  ${.CURDIR}/../../afs \
${.CURDIR}/../../afs/FBSD \
${.CURDIR}/../../afs/VNOPS
KMODDIR=/boot/modules
KMOD=   libafs
SYSDIR= ${KSRC}
# Name of directory to hold object files and libraries.
KOBJ = MODLOAD

# This tells Makefile.common to use it's single directory build target.
COMPDIRS = single_compdir
INSTDIRS = single_instdir
DESTDIRS = single_destdir

# Very ugly.  But many of these links are needed for common code to work.
setup:
-mkdir $(KOBJ)
-$(RM) $(KOBJ)/Makefile $(KOBJ)/Makefile.common
ln -fs ../Makefile $(KOBJ)/Makefile
ln -fs ../Makefile.common $(KOBJ)/Makefile.common
-$(RM) -f  h rpc ufs machine
-ln -fs ${KSRC}/amd64/include machine
-ln -fs ${KSRC}/ufs/ufs ufs
-ln -fs ${KSRC}/rpc rpc
-ln -fs ${KSRC}/sys 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

# This is quite awkward.  The code in kmod.mk checks for vnode_if.h in
# SRCS, but I am given a list of object files from the common code.
# Resort to variable substitution black magic, below.
SRCS = vnode_if.h

# 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 

AFS_OS_NONFSOBJS = \
osi_vfsops.o

SRCS+=  ${AFS_OS_OBJS:S/.o$/.c/g} ${AFS_OS_NONFSOBJS:S/.o$/.c/g} \
${AFSAOBJS:S/.o$/.c/g}

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}

DEST_LIBAFS = ${DEST}/root.client/bin/${LIBAFS}