On Wed, Jun 26, 2013 at 07:30:55PM +0700, Alexey Dokuchaev wrote:
> On Wed, Jun 26, 2013 at 07:12:41PM +0700, Alexey Dokuchaev wrote:
> > 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.
> 
> One known limitation of option groups right now is that you cannot have
> per-arch or !arch stuff, only :on.  It should not be hard to fix, but I
> need to think how to avoid code duplication.  I miss $(call ...) of GNU
> make sometimes...

It just occurred to me that it seems we actually do not support something
like OPTIONS_SINGLE_AUDIO_${ARCH}, which simplifies my work (please tell
me if I'm wrong).  So all I need is to remember about OPTIONS_EXCLUDE's in
this case.  Now it's possible (example for www/firefox/Makefile.options):

  OPTIONS_SINGLE_AUDIO=   ALSA:on OSS!sparc64 PULSEAUDIO!powerpc,mips,i386

New diff attached (also comes with some comments tweaks, and I've switched
from ^ to ~ as regex delimiter: it looks nicer and there is no confusion
with start-of-line marker).  I hope now it can cover anything possible to
achieve with current OptionsNG.

But we need reviewers and testers!

./danfe

P.S.  This was all developed on 8.3-STABLE, that is, with our traditional
make(1).  I will test new make(1) on 10-CURRENT tomorrow.
Index: bsd.options.mk
===================================================================
--- bsd.options.mk      (revision 321792)
+++ bsd.options.mk      (working copy)
@@ -10,7 +10,7 @@
 #                                                        specific to ${ARCH}
 # OPTIONS_DEFAULT                      - List of options activated by default
 # OPTIONS_DEFAULT_${ARCH}      - List of options activated by default for a
-#                                                        given arch
+#                                                        given ${ARCH}
 #
 # ${OPTION}_DESC                       - Description of the ${OPTION}
 #
@@ -94,14 +94,59 @@
 
 PORT_OPTIONS+= IPV6
 
-# Add per arch options
+### Parse new extended syntax OPTIONS knob (architecture-independent)
+.for opt in ${OPTIONS:N*/*:N*!*}
+OPTIONS_DEFINE+=       ${opt:C~:.*~~}
+OPTIONS_DEFAULT+=      ${opt:M*\:on:S~:on~~}
+.endfor
+
+# Process known option groups (only architecture exclusion supported)
+.for otype in SINGLE RADIO MULTI GROUP
+.  for group in ${OPTIONS_${otype}}
+# Here we need the temporary variables because of the := operator used few
+# lines below
+_exclude:=             ${OPTIONS_${otype}_${group}:M*!*}
+_default:=             ${OPTIONS_${otype}_${group}:M*\:on*:C~:.*~~}
+OPTIONS_DEFAULT+=                      ${_default}
+OPTIONS_${otype}_${group}:=    ${OPTIONS_${otype}_${group}:C~[:!].*~~}
+.    for opt in ${_exclude}
+.      for arch in ${opt:C~.*!~~:S~,~ ~g}
+OPTIONS_EXCLUDE_${arch}+=      ${opt:C~[:!].*~~}
+.      endfor
+.    endfor
+.  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-architecture options
 .for opt in ${OPTIONS_DEFINE_${ARCH}}
 .if empty(OPTIONS_DEFINE:M${opt})
 OPTIONS_DEFINE+=       ${opt}
 .endif
 .endfor
 
-# Add per arch defaults
+# Add per-architecture defaults
 OPTIONS_DEFAULT+=      ${OPTIONS_DEFAULT_${ARCH}}
 
 # Remove options the port maintainer doesn't want
@@ -130,7 +175,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}}
_______________________________________________
freebsd-ports@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-ports
To unsubscribe, send any mail to "freebsd-ports-unsubscr...@freebsd.org"

Reply via email to