Proposal: further OptionsNG improvements
Alexey Dokuchaev
danfe at nsu.ru
Wed Jun 26 12:11:25 UTC 2013
On Fri, Jun 21, 2013 at 10:04:51AM +0200, Baptiste Daroussin wrote:
> Sorry it took time for me to reply, after we last talk about this, I
> thought a lot about this, and while in principe I do like the idea, I have
> a couple of concerns:
>
> 1: this reduces lots of flexibility we now have with the new options
> framework, well at the least the patch should make sure it doesn't reduce it
> for instance, it should work properly with:
> OPTIONS_EXCLUDE and OPTIONS_SLAVE.
My current approach is to handle new "extended" syntax without interfering
with OptionsNG, and since OPTIONS_EXCLUDE or OPTIONS_SLAVE would not
contain any of that new :on or /${arch} stuff, I hope they would just work
as before. ;-)
> if should be able to handle properly the following situation:
> OPTIONS_DEFINE= DOCS X11
> OPTIONS_DEFINE_i386= MYSQL PGSQL
> OPTIONS_DEFINE_amd64= MYSQL PGSQL
> OPTIONS_DEFAULT_i386= MYSQL
> OPTIONS_DEFAULT_amd64= PGSQL
> OPTIONS_EXCLUDE_powerpc= X11
Yes, it does handle it; in fact, hanlding this sort of several-lines ugly
constructs is one the pripary reasons why I want something more elegant.
I've cooked something up just now, take a look at the attached diff. I've
only barely tested it, but it seems to work for a few of my hand-crafted
configurations. It also handles known options groups (single/multi/etc.),
tested on www/firefox.
With the new syntax, the example above would simply become:
OPTIONS= DOCS MYSQL/i386:on,amd64 PGSQL/i386,amd64:on X11!powerpc
Verified (old vs. new) by "make showconfig ARCH=... | md5".
Feedback welcome, as I might have missed some edge cases or a bug or two.
> This is things I haven't been able to imagine in a concise/understandable
> syntax like the one you are proposing, if we are able to do it then fine
> for me :)
>
> 2: I'm concern about the parsing performance, not that I have tested
> anything, but it just looks like it would be less performant for make(1)
> to parse properly all this, this should be measured to at least know the
> impact in the package building clusters and index building boxes once
> everything will be converted.
True, although I don't have idea how to measure it without converting
quite a number of ports first. Perhaps an automated tool would help.
./danfe
-------------- next part --------------
Index: bsd.options.mk
===================================================================
--- bsd.options.mk (revision 321792)
+++ bsd.options.mk (working copy)
@@ -94,6 +94,43 @@
PORT_OPTIONS+= IPV6
+### Parse new OPTIONS knob (extended syntax)
+.for opt in ${OPTIONS:N*/*:N*!*}
+OPTIONS_DEFINE+= ${opt:C^:.*^^}
+OPTIONS_DEFAULT+= ${opt:M*\:on:S^:on^^}
+.endfor
+
+# Process known option groups
+.for otype in SINGLE RADIO MULTI GROUP
+. for m in ${OPTIONS_${otype}}
+_${otype}_default:= ${OPTIONS_${otype}_${m}:M*\:on:S^:on^^}
+OPTIONS_DEFAULT+= ${_${otype}_default}
+OPTIONS_${otype}_${m}:= ${OPTIONS_${otype}_${m}:C^:.*^^}
+. endfor
+.endfor
+
+# Process architecture-specific options
+.for opt in ${OPTIONS:M*/*}
+. for arch in ${opt:C^.*/^^:S^,^ ^g}
+. for defarch in OPTIONS_DEFINE_${arch:C^:.*^^}
+${defarch}+= ${opt:C^/.*^^}
+. endfor
+. for defarch in OPTIONS_DEFAULT_${arch:M*\:on:S^:on^^}
+${defarch}+= ${opt:C^/.*^^}
+. endfor
+. endfor
+.endfor
+
+# Process options unsupported on some architectures
+.for opt in ${OPTIONS:M*!*}
+OPTIONS_DEFINE+= ${opt:C^[:!].*^^}
+OPTIONS_DEFAULT+= ${opt:M*\:on!*:C^:.*^^}
+. for arch in ${opt:C^.*!^^:S^,^ ^g}
+OPTIONS_EXCLUDE_${arch}+= ${opt:C^[:!].*^^}
+. endfor
+.endfor
+###
+
# Add per arch options
.for opt in ${OPTIONS_DEFINE_${ARCH}}
.if empty(OPTIONS_DEFINE:M${opt})
@@ -130,7 +167,7 @@
ALL_OPTIONS:= ${OPTIONS_DEFINE:O:u}
OPTIONS_DEFAULT:= ${OPTIONS_DEFAULT:O:u}
-# complete list
+# Complete list
COMPLETE_OPTIONS_LIST= ${ALL_OPTIONS}
.for otype in SINGLE RADIO MULTI GROUP
. for m in ${OPTIONS_${otype}}
More information about the freebsd-ports
mailing list