From 38ea997502e18313e6fe0f7120dee9ed8544bd82 Mon Sep 17 00:00:00 2001 From: Michael Pyne Date: Sat, 11 Jan 2014 15:28:41 -0500 Subject: [PATCH] rc-file: Add specific "option override" entry type. Add a specific config file grouping (which acts just like a module declaration), to allow for specifying options to override a previously-declared module. The use case here is for a module-set: You can specify options which apply to an entire module-set when declaring the module-set, and then override those options with any changes in a later "options" declaration. These declarations can stack too, so this can also be useful for multi-level file includes (but this is less useful since an "options" declaration requires a specific module, it doesn't work on module-sets; in that case you'd want to have the different module-sets in your most-specific included config files instead of in a base file). Tested on my personal test case for bug 321883, and on a --pretend run, and with a bug 321883 test case modified to not pre-declare the overridden module first. Example: module-set kde-mm repository kde-projects use-modules kde/kdemultimedia end module-set options kmix # Not mentioned before this line branch KDE/4.11 end options In this case kmix would use KDE/4.11 branch while juk (and the rest of kde-mm) would use whatever the global branch or branch-group was (probably 'master'). BUG:321667 --- doc/index.docbook | 68 +++++++++++++++++++++++++++++++++++++- modules/ksb/Application.pm | 50 +++++++++++++++++----------- 2 files changed, 97 insertions(+), 21 deletions(-) diff --git a/doc/index.docbook b/doc/index.docbook index 702590e..473415b 100644 --- a/doc/index.docbook +++ b/doc/index.docbook @@ -1335,7 +1335,8 @@ but is instead at the &konsole; or terminal where you ran &kdesrc-build;. To use the script, you must have a file in your home directory called .kdesrc-buildrc, which describes the modules you would -like to download and build. +like to download and build, and any options or configuration parameters to +use for these modules. @@ -1414,6 +1415,71 @@ linkend="conf-use-modules">use-modules for more information. + + +<quote>options</quote> modules + +There is a final type of configuration file entry, +options groups, which may be given wherever a +module or module-set may be used. + + +options module-name +option-name option-value +[...] +end options + + +An options group may have options set for it just like +a module declaration, and is associated with an existing module. Any options +set these way will be used to override options set for the +associated module. + +The associated module name must match the +name given in the options declaration. Be careful of +mis-typing the name. + +This is useful to allow for declaring an entire +module-set worth of modules, all using the same options, and +then using options groups to make individual changes. + + +Example of using options + +In this example we choose to build all modules from the &kde; multimedia +software grouping. However we want to use a different version of the &kmix; +application (perhaps for testing a bug fix). It works as follows: + + +module-set kde-multimedia-set + repository kde-projects + use-modules kde/kdemultimedia + branch master +end module-set + +# kmix is a part of kde/kdemultimedia group, even though we never named +# kmix earlier in this file, &kdesrc-build; will figure out the change. +options kmix + branch KDE/4.12 +end options + + +Now when you run &kdesrc-build;, all of the &kde; multimedia programs will +be built from the master branch of the source repository, but +&kmix; will be built from the older KDE/4.12 branch. By using +options you didn't have to individually list all the +other &kde; multimedia programs to give them the right +branch option. + + + + +Note that this feature is only available in &kdesrc-build; from version +1.16, or using the development version of &kdesrc-build; after +2014-01-12. + + + diff --git a/modules/ksb/Application.pm b/modules/ksb/Application.pm index f10cce5..58f6092 100644 --- a/modules/ksb/Application.pm +++ b/modules/ksb/Application.pm @@ -879,7 +879,7 @@ sub _parseModuleOptions } my $endWord = $module->isa('ksb::BuildContext') ? 'global' : 'module'; - my $endRE = qr/^end\s+$endWord/; + my $endRE = qr/^end[\w\s]*$/; # Read in each option while ($_ = _readNextLogicalLine($fileReader)) @@ -1090,7 +1090,7 @@ sub _readConfigurationOptions my $pendingOptionsRef = shift; my @module_list; my $rcfile = $ctx->rcFile(); - my ($option, $modulename, %readModules); + my ($option, %readModules); my $fileReader = ksb::RecursiveFH->new(); $fileReader->pushBasePath(dirname($rcfile)); # rcfile should already be absolute @@ -1134,7 +1134,7 @@ sub _readConfigurationOptions next if (/^\s*$/); # Skip blank lines # Get modulename (has dash, dots, slashes, or letters/numbers) - ($modulename) = /^module\s+([-\/\.\w]+)\s*$/; + my ($type, $modulename) = /^(options|module)\s+([-\/\.\w]+)\s*$/; my $newModule; # Module-set? @@ -1157,8 +1157,27 @@ sub _readConfigurationOptions my @moduleSetItems = $newModule->moduleNamesToFind(); @seenModuleSetItems{@moduleSetItems} = ($newModule) x scalar @moduleSetItems; } - # Module override? - elsif (exists $seenModuleSetItems{$modulename}) { + # Duplicate module entry? (Note, this must be checked before the check + # below for 'options' sets) + elsif (exists $seenModules{$modulename}) { + # Overwrite options set for existing modules. + # But allow duplicate 'options' declarations without error. + if ($type ne 'options') { + warning ("Don't use b[r[module $modulename] on line $., use b[g[options $modulename]"); + } + + $newModule = $seenModules{$modulename}; + + # _parseModuleOptions will re-use newModule, but we still need to + # be careful not to mask cmdline options in pendingOptsKeys. + _parseModuleOptions($ctx, $fileReader, $newModule); + + delete @{$newModule->{options}}{@pendingOptsKeys}; + + next; # Skip all the stuff below + } + # Module override (for use-modules from a module-set), or option overrride? + elsif ($type eq 'options' || exists $seenModuleSetItems{$modulename}) { # Parse the modules... $newModule = _parseModuleOptions($ctx, $fileReader, "#overlay_$modulename"); @@ -1173,22 +1192,13 @@ sub _readConfigurationOptions # Don't mask global cmdline options. delete @{$moduleOptsRef}{@pendingOptsKeys}; - next; # Don't add to module list - } - # Duplicate module entry? - elsif (exists $seenModules{$modulename}) { - # Overwrite options set for existing modules. - warning ("Multiple module declarations for $modulename"); - - $newModule = $seenModules{$modulename}; - - # _parseModuleOptions will re-use newModule, but we still need to - # be careful not to mask cmdline options in pendingOptsKeys. - _parseModuleOptions($ctx, $fileReader, $newModule); - - delete @{$newModule->{options}}{@pendingOptsKeys}; + # TODO: Remove compat handling of 'module $foo' as 'options $foo', + # probably 2014-04-01? + if ($type ne 'options') { + warning ("Don't use b[r[module $modulename] on line $., use b[g[options $modulename]"); + } - next; # Skip all the stuff below + next; # Don't add to module list } else { $newModule = _parseModuleOptions($ctx, $fileReader, $modulename);