anchor.diff:       optionSet to configOf.  FIXME: remove eventually. */
     fixupOptionType = loc: opt:
       let
  -      options' = opt.options or
  +      options = opt.options or
           (throw "Option `${showOption loc'}' has type optionSet but has no option attribute, in ${showFiles opt.declarations}.");
  -      coerce = x:
  -        if isFunction x then x
  -        else { config, ... }: { options = x; };
  -      options = map coerce (flatten options');
         f = tp:
           if tp.name == "option set" || tp.name == "submodule" then
             throw "The option ${showOption loc} uses submodules without a wrapping type, in ${showFiles opt.declarations}."
  
positive.code:       then
          throw "The option `${showOption loc}' in `${opt.file}' is already declared in ${showFiles res.declarations}."
        else
          opt.options // res //
            { declarations = [opt.file] ++ res.declarations;
              options = if opt.options ? options then [(toList opt.options.options ++ res.options)] else [];
            }
      ) { inherit loc; declarations = []; options = []; } opts;
  
  
negative.code:      The exception is the ‘options’ attribute, which specifies
       sub-options.  These can be specified multiple times to allow one
       module to add sub-options to an option declared somewhere else
       (e.g. multiple modules define sub-options for ‘fileSystems’).
  
       'loc' is the list of attribute names where the option is located.
  
       'opts' is a list of modules.  Each module has an options attribute which
       correspond to the definition of 'loc' in 'opt.file'. */
    mergeOptionDecls = loc: opts:
      fold (opt: res:
        if opt.options ? default && res ? default ||
  