Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 21 Jun 2011 18:20:03 -0400 (EDT)
From:      Benjamin Kaduk <kaduk@MIT.EDU>
To:        Warner Losh <imp@bsdimp.com>
Cc:        freebsd-hackers@FreeBSD.org
Subject:   Re: porting third-party build system to bsd.kmod.mk
Message-ID:  <alpine.GSO.1.10.1106211103470.6818@multics.mit.edu>
In-Reply-To: <8854CF36-7B6D-4918-ADF8-6A16CCB2F307@bsdimp.com>
References:  <alpine.GSO.1.10.1105210148300.6818@multics.mit.edu> <8854CF36-7B6D-4918-ADF8-6A16CCB2F307@bsdimp.com>

next in thread | previous in thread | raw e-mail | index | archive | help
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>_______________________________________________



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