Date: Sun, 11 Jun 2006 12:34:13 +0200 From: Jeremie Le Hen <jeremie@le-hen.org> To: Darren Pilgrim <freebsd@bitfreak.org> Cc: freebsd-hackers@FreeBSD.ORG, ru@FreeBSD.org, jeremie@le-hen.org Subject: Re: [fbsd] Re: How to disable a src.conf on command-line Message-ID: <20060611103413.GJ1273@obiwan.tataz.chchile.org> In-Reply-To: <4489FA7C.7080207@bitfreak.org> References: <20060609094052.GH1273@obiwan.tataz.chchile.org> <20060609.074844.1324583587.imp@bsdimp.com> <4489E354.5070201@bitfreak.org> <20060609.153340.-432838362.imp@bsdimp.com> <4489FA7C.7080207@bitfreak.org>
index | next in thread | previous in thread | raw e-mail
[-- Attachment #1 --]
Hi, Darren, Warner,
On Fri, Jun 09, 2006 at 03:47:24PM -0700, Darren Pilgrim wrote:
> M. Warner Losh wrote:
> >In message: <4489E354.5070201@bitfreak.org>
> > Darren Pilgrim <darren.pilgrim@bitfreak.org> writes:
> >: M. Warner Losh wrote:
> >: > So if you make WITH_SSP off by default, then having WITH_SSP in the
> >: > src.conf can't be overridden. If you have it on by default, having
> >: > WITHOUT_SSP in the src.conf file can't be overriden. this appears to
> >: > be an unintended flaw with the with/without stuff. I'm not sure the
> >: > right way to compensate.
> >:
> >: I can't speak for the "right" way, but if you specify the variable in
> >: src.conf/make.conf with ?= instead of =, you can override it on the
> >: command-line:
> >:
> >: # grep KERNCONF /etc/make.conf
> >: KERNCONF?=TTPWEB
> >: # make -V KERNCONF
> >: TTPWEB
> >: # env KERNCONF=SOMETHING_ELSE make -V KERNCONF
> >: SOMETHING_ELSE
> >
> >?= doesn't mesh well with WITH/WITHOUT because then it will always be
> >defined, thus defeating its purpose.
>
> Use .ifndef to define WITH/WITHOUT iff its counterpart is undef:
>
> .ifndef WITHOUT_FOO
> WITH_FOO=def
> .endif
Yes, this is indeed the way to go but actually I would prefer to this
this wrapped in share/mk/bsd.own.mk, so that src.conf(5) would only
handle variable assignments (in a rc.conf(5) fashion) without using
make(1) magic. This would be pretty less puzzling for users.
IMHO, the attached patch makes things better in case both WITH_FOO
and WITHOUT_FOO are defined. Variables defined on command-line are
read-only, therefore I take advantage of this to give the priority
to the knob that has been defined on command-line.
% jarjarbinks# head -n 1 /etc/src.conf
% WITH_SSP=YES
%
% jarjarbinks# make echo.o
% cc -O2 -fno-strict-aliasing -pipe -march=pentium-m -Wsystem-headers -Werror -Wall -Wno-format-y2k -W -Wno-unused-parameter -Wstrict-prototypes -Wmissing-prototypes -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wshadow-Wcast-align -Wunused-parameter -Wchar-subscripts -Winline -Wnested-externs -Wredundant-decls -fstack-protector -c /usr/src/bin/echo/echo.c
% ^^^^^^^^^^^^^^^^^
% jarjarbinks# make clean
% rm -f echo echo.o echo.1.gz echo.1.cat.gz
%
% jarjarbinks# make WITHOUT_SSP=yes echo.o
% cc -O2 -fno-strict-aliasing -pipe -march=pentium-m -Wsystem-headers -Werror -Wall -Wno-format-y2k -W -Wno-unused-parameter -Wstrict-prototypes -Wmissing-prototypes -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wshadow-Wcast-align -Wunused-parameter -Wchar-subscripts -Winline -Wnested-externs -Wredundant-decls -c /usr/src/bin/echo/echo.c
% ^^^^^^^^^^^^^^^^^
% jarjarbinks# make clean
% rm -f echo echo.o echo.1.gz echo.1.cat.gz
%
% jarjarbinks# echo "WITHOUT_SSP=YES" >> /etc/src.conf
% jarjarbinks# make echo.o
% "/usr/share/mk/bsd.own.mk", line 394: WITH_SSP and WITHOUT_SSP can't both be set from the same place.
%
Best regards,
--
Jeremie Le Hen
< jeremie at le-hen dot org >< ttz at chchile dot org >
[-- Attachment #2 --]
Index: bsd.own.mk
===================================================================
RCS file: /home/ncvs/src/share/mk/bsd.own.mk,v
retrieving revision 1.54
diff -u -r1.54 bsd.own.mk
--- bsd.own.mk 28 Apr 2006 12:03:36 -0000 1.54
+++ bsd.own.mk 11 Jun 2006 10:25:43 -0000
@@ -352,7 +352,20 @@
USB \
WPA_SUPPLICANT_EAPOL
.if defined(WITH_${var}) && defined(WITHOUT_${var})
-.error WITH_${var} and WITHOUT_${var} can't both be set.
+# Check the user didn't define both variables from the same place.
+WITH_${var}:= bsd.own.mk
+WITHOUT_${var}:= bsd.own.mk
+.if (${WITH_${var}} == "bsd.own.mk" && ${WITHOUT_${var}} == "bsd.own.mk") || \
+ (${WITH_${var}} != "bsd.own.mk" && ${WITHOUT_${var}} != "bsd.own.mk")
+.error WITH_${var} and WITHOUT_${var} can't both be set from the same place.
+.endif
+.if ${WITH_${var}} != "bsd.own.mk"
+# WITH_${var} is defined on comand-line
+.undef WITHOUT_${var}
+.else
+# WITHOUT_${var} is defined on comand-line
+.undef WITH_${var}
+.endif
.endif
.if defined(MK_${var})
.error MK_${var} can't be set by a user.
@@ -372,7 +385,20 @@
HESIOD \
IDEA
.if defined(WITH_${var}) && defined(WITHOUT_${var})
-.error WITH_${var} and WITHOUT_${var} can't both be set.
+# Check the user didn't define both variables from the same place.
+WITH_${var}:= bsd.own.mk
+WITHOUT_${var}:= bsd.own.mk
+.if (${WITH_${var}} == "bsd.own.mk" && ${WITHOUT_${var}} == "bsd.own.mk") || \
+ (${WITH_${var}} != "bsd.own.mk" && ${WITHOUT_${var}} != "bsd.own.mk")
+.error WITH_${var} and WITHOUT_${var} can't both be set from the same place.
+.endif
+.if ${WITH_${var}} != "bsd.own.mk"
+# WITH_${var} is defined on comand-line
+.undef WITHOUT_${var}
+.else
+# WITHOUT_${var} is defined on comand-line
+.undef WITH_${var}
+.endif
.endif
.if defined(MK_${var})
.error MK_${var} can't be set by a user.
help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20060611103413.GJ1273>
