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 
Kaduk<Makefile.txt><build.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"

Reply via email to