From owner-freebsd-current Mon Jun 1 12:04:52 1998 Return-Path: Received: (from majordom@localhost) by hub.freebsd.org (8.8.8/8.8.8) id MAA05001 for freebsd-current-outgoing; Mon, 1 Jun 1998 12:04:52 -0700 (PDT) (envelope-from owner-freebsd-current@FreeBSD.ORG) Received: from ns1.yes.no (ns1.yes.no [195.119.24.10]) by hub.freebsd.org (8.8.8/8.8.8) with ESMTP id MAA04978 for ; Mon, 1 Jun 1998 12:04:45 -0700 (PDT) (envelope-from eivind@bitbox.follo.net) Received: from bitbox.follo.net (bitbox.follo.net [195.204.143.218]) by ns1.yes.no (8.8.7/8.8.7) with ESMTP id TAA04839; Mon, 1 Jun 1998 19:04:37 GMT Received: (from eivind@localhost) by bitbox.follo.net (8.8.8/8.8.6) id VAA04957; Mon, 1 Jun 1998 21:04:15 +0200 (MET DST) Message-ID: <19980601210415.48779@follo.net> Date: Mon, 1 Jun 1998 21:04:15 +0200 From: Eivind Eklund To: Richard Wackerbarth Cc: current@FreeBSD.ORG Subject: Re: How about /usr/ports/kernel ? References: ; ; <199805301346.PAA29505@labinfo.iet.unipi.it>; <199805301346.PAA29505@labinfo.iet.unipi.it> <19980530182913.04478@follo.net> <19980531052120.41610@follo.net> <19980531235232.04296@follo.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Mailer: Mutt 0.89.1i In-Reply-To: ; from Richard Wackerbarth on Mon, Jun 01, 1998 at 06:31:33AM -0500 Sender: owner-freebsd-current@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.ORG On Mon, Jun 01, 1998 at 06:31:33AM -0500, Richard Wackerbarth wrote: > At 9:52 PM -0000 5/31/98, Eivind Eklund wrote: > >However, to be able to do automated kernel builds we have to have a > >way of specifying which kernels to build which do not come as a shock > >to our userbase (this is a political necessity; I don't think either > >of us would get any way arguing otherwise). This probably mean that > >we'll have to support the use of config(8) in the way it is presently > >used for a transition period of at least a year. > > Not necessarily. Consider the following strategy: > (1) Replace "config" with a shell script that > (a) copies the configuration file to .../src/sys/compile hierarchy > (b) issues a message reminding the user that the procedure for > building a kernel has been slightly modified, and perhaps > (c) does a "make" in the newly constructed target area. > (2) (To avoid confusion) Rename the present "config" and modify > it to be a tool for the new structure. It would fit in, in a > manner similar to yacc, to be called where needed. This blows my present cross-builds (to 2.2) away, at least. Not good, as that probably means that it blows other people's builds, too. I proposed something similar to this as a solution for mknod - jkh shot me down (and with good reason, I might add). We need something that don't blow away our users - which I believe unfortunately mean we'll need to build compatibility into config for a while :-( > As far as "automatic kernel build" is concerned, I think that this can > be handled by having an optional Makefile.inc in the src/sys structure > that adds SUBDIR's for the desired kernels. > We could always use "SUBDIR?= GENERIC" to provide the default. This doesn't mesh with the use of 'SUBDIR' presently. Possibly we could add a 'beforesubdir' target that are responsible for making sure there are a subdir in either ${.OJDIR} or ${.CURDIR}, but I'm not certain how easy this will be. Something like the patches at the end _might_ work (but is completely untested). Now, to be able to do this with config files located other places that sys//conf, we need to be able to specify different paths for the kernel config, and for the destination directory. Patches to usr.sbin/config is at the end (compiles, but otherwise untested). This leaves us with a fairly simple sys/compile/Makefile, something like the following (again, completely untested): # Copyright (C) 1998, Eivind Eklund. All rights reserved. # You're hereby granted the right to do anything with this, as long as # you don't attempt to hold me responsible for it. .if exists(${.CURDIR}/../Makefile.inc) .include "${.CURDIR}/../Makefile.inc" .endif # Uncomment this to make the system default to building GENERIC #SUBDIR?=GENERIC beforesubdir: realbeforesubdir .include realbeforesubdir: @for entry in ${SUBDIR} ${_SUBDIR_EXTRA}; do \ (if ! (test -f ${SUBDIR_CHANGE}/${DIRPRFX}/subdirdrop && \ grep -w $${entry} \ ${SUBDIR_CHANGE}/${DIRPRFX}/subdirdrop \ > /dev/null); then \ (cd ${.CURDIR}/../$$(awk \ '/^machine/ {print ($2 ~ /^\".*\"$/) ? substr($2, 2, length($2)-2) : \ $2}' ${.CURDIR}/configs/$${entry})/conf && \ config -f ${.CURDIR}/configs/$${entry} \ -o ${.OBJDIR} $${entry}); \ fi); \ done; How does the above look? The extra interpretation of subdirdrop is dirty, as is the need for having targets after the include - the former I think can be fixed, the latter probably be very, very difficult (unless I'm misrememebering the order of evaluation in make - then it can just be moved :-) > >Do you disagree with the way of adding this meta-information to > >contributed subsystems? I'm all ears for anything better that give > >the same capabilites for external people modifying the system - I just > >haven't found any better way. > > As I have previously stated, I view the kernel in the same way that > I view a user-level command. It may require a few unique variants. > However, it is fundamentally, source (compiled) into object (linked) > into executable (loaded) for execution > > I see the inclusion of kernel components fitting in in a manner analogous > to the "contrib" structure. Can you give a _concrete_ proposal for how to solve this, presently for the kernel only? We need the capabilities outlined, and we've needed them for a while. I hope to avoid the use of a temporary measure here, so if you've got any ideas we can use to solve this to be compatible with a future generic way... > Summary: > Think "Lego", or, for those old enough to remember, the A.C. Gilbert > "Erector" sets rather than "Microsoft". However, _also_ think efficiency. These are often somewhat at odds. Eivind. Index: share/mk/bsd.subdir.mk =================================================================== RCS file: /home/ncvs/src/share/mk/bsd.subdir.mk,v retrieving revision 1.24 diff -u -r1.24 bsd.subdir.mk --- bsd.subdir.mk 1998/05/06 16:53:53 1.24 +++ bsd.subdir.mk 1998/06/01 18:42:31 @@ -39,18 +39,22 @@ .MAIN: all -.if defined(SUBDIR_CHANGE) && !empty(SUBDIR_CHANGE) && \ - exists(${SUBDIR_CHANGE}/${DIRPRFX}/subdirlist) +.if defined(SUBDIR_CHANGE) && !empty(SUBDIR_CHANGE) +.if exists(${SUBDIR_CHANGE}/${DIRPRFX}/subdirlist) SUBDIR!=cat ${SUBDIR_CHANGE}/${DIRPRFX}/subdirlist .endif -.if defined(SUBDIR_CHANGE) && !empty(SUBDIR_CHANGE) && \ - exists(${SUBDIR_CHANGE}/${DIRPRFX}/subdirlist) +.if exists(${SUBDIR_CHANGE}/${DIRPRFX}/subdirlist) _SUBDIR_EXTRA!=cat ${SUBDIR_CHANGE}/${DIRPRFX}/subdiradd +SUBDIR=${SUBDIR} ${_SUBDIR_EXTRA} .endif +# Should really fix up SUBDIR to respect "subdirdrop" here, instead of +# requiring it in the loops +.endif + _SUBDIRUSE: .USE - @for entry in ${SUBDIR} ${_SUBDIR_EXTRA}; do \ + @for entry in ${SUBDIR}; do \ (if ! (test -f ${SUBDIR_CHANGE}/${DIRPRFX}/subdirdrop && \ grep -w $${entry} \ ${SUBDIR_CHANGE}/${DIRPRFX}/subdirdrop \ @@ -60,10 +64,19 @@ "===> ${DIRPRFX}$${entry}.${MACHINE}"; \ edir=$${entry}.${MACHINE}; \ cd ${.CURDIR}/$${edir}; \ - else \ + elif test -d ${.OBJDIR}/$${entry}.${MACHINE}; then \ + ${ECHODIR} \ + "===> ${DIRPRFX}$${entry}.${MACHINE}"; \ + edir=$${entry}.${MACHINE}; \ + cd ${.OBJDIR}/$${edir}; \ + elif test -d ${.CURDIR}/$${entry}; then \ ${ECHODIR} "===> ${DIRPRFX}$$entry"; \ edir=$${entry}; \ cd ${.CURDIR}/$${edir}; \ + elif \ + ${ECHODIR} "===> ${DIRPRFX}$$entry"; \ + edir=$${entry}; \ + cd ${.OBJDIR}/$${edir}; \ fi; \ ${MAKE} ${.TARGET:realinstall=install} \ SUBDIR_CHANGE=${SUBDIR_CHANGE} \ @@ -72,7 +85,7 @@ ); \ done -${SUBDIR}:: +${SUBDIR}:: beforesubdir @if test -d ${.TARGET}.${MACHINE}; then \ cd ${.CURDIR}/${.TARGET}.${MACHINE}; \ else \ @@ -84,9 +97,13 @@ .for __target in all checkdpadd clean cleandepend cleandir depend lint \ maninstall obj objlink regress tags .if !target(${__target}) -${__target}: _SUBDIRUSE +${__target}: beforesubdir .WAIT _SUBDIRUSE .endif .endfor + +.if !target(beforesubdir) +beforesubdir: +.endif .if !target(install) .if !target(beforeinstall) Index: usr.sbin/config/config.8 =================================================================== RCS file: /home/ncvs/src/usr.sbin/config/config.8,v retrieving revision 1.10 diff -u -r1.10 config.8 --- config.8 1998/02/18 04:15:03 1.10 +++ config.8 1998/06/01 18:57:31 @@ -40,6 +40,8 @@ .Sh SYNOPSIS .Nm config .Op Fl gpr +.Op Fl f Ar configfile +.Op Fl o Ar directory .Ar SYSTEM_NAME .Sh DESCRIPTION This is the old version of the @@ -72,8 +74,12 @@ Available options and operands: .Pp .Bl -tag -width SYSTEM_NAME +.It Fl f Ar configfile +Use this file as the input filename, instead of ./SYSTEM_NAME .It Fl g Configure a system for debugging. +.It Fl o Ar directory +Use this file as the target directory, instead of ../../compile. .It Fl p Configure a system for profiling; for example, .Xr kgmon 8 Index: usr.sbin/config/main.c =================================================================== RCS file: /home/ncvs/src/usr.sbin/config/main.c,v retrieving revision 1.24 diff -u -r1.24 main.c --- main.c 1998/05/02 01:57:38 1.24 +++ main.c 1998/06/01 18:55:06 @@ -66,6 +66,7 @@ #endif char *PREFIX; +static char *CDIR = "../../compile/"; static int no_config_clobber = TRUE; int old_config_present; @@ -85,12 +86,20 @@ struct stat buf; int ch; char *p; + char *configfn = NULL; /* filename */ + extern char *optarg; - while ((ch = getopt(argc, argv, "gprn")) != -1) + while ((ch = getopt(argc, argv, "f:go:prn")) != -1) switch (ch) { + case 'f': + configfn = optarg; + break; case 'g': debugging++; break; + case 'o': + CDIR = optarg; + break; case 'p': profiling++; break; @@ -112,8 +121,11 @@ if (argc != 1) usage(); - if (freopen(PREFIX = *argv, "r", stdin) == NULL) - err(2, "%s", PREFIX); + PREFIX = *argv; + if (configfn == NULL) + configfn = PREFIX; + if (freopen(configfn, "r", stdin) == NULL) + err(2, "%s", configfn); p = path((char *)NULL); if (stat(p, &buf)) { @@ -327,9 +339,8 @@ { register char *cp; -#define CDIR "../../compile/" - cp = malloc((unsigned int)(sizeof(CDIR) + strlen(PREFIX) + - (file ? strlen(file) : 0) + 2)); + cp = malloc((unsigned int)(strlen(CDIR) + strlen(PREFIX) + + (file ? strlen(file) : 0) + 3)); (void) strcpy(cp, CDIR); (void) strcat(cp, PREFIX); if (file) { To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-current" in the body of the message