| # Copyright 2003 Dave Abrahams |
| # Copyright 2003, 2006 Rene Rivera |
| # Copyright 2003, 2006 Vladimir Prus |
| # Distributed under the Boost Software License, Version 1.0. |
| # (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) |
| |
| # This module is the plug-in handler for the --help and --help-.* |
| # command-line options |
| import modules ; |
| import assert ; |
| import doc : do-scan set-option set-output set-output-file print-help-usage print-help-top ; |
| import sequence ; |
| import set ; |
| import project ; |
| import print ; |
| import os ; |
| import version ; |
| import path ; |
| |
| # List of possible modules, but which really aren't. |
| # |
| .not-modules = |
| boost-build bootstrap site-config test user-config |
| -tools allyourbase boost-base features python stlport testing unit-tests ; |
| |
| # The help system options are parsed here and handed off to the doc |
| # module to translate into documentation requests and actions. The |
| # understood options are: |
| # |
| # --help-disable-<option> |
| # --help-doc-options |
| # --help-enable-<option> |
| # --help-internal |
| # --help-options |
| # --help-usage |
| # --help-output <type> |
| # --help-output-file <file> |
| # --help [<module-or-class>] |
| # |
| rule process ( |
| command # The option. |
| : values * # The values, starting after the "=". |
| ) |
| { |
| assert.result --help : MATCH ^(--help).* : $(command) ; |
| local did-help = ; |
| switch $(command) |
| { |
| case --help-internal : |
| local path-to-modules = [ modules.peek : BOOST_BUILD_PATH ] ; |
| path-to-modules ?= . ; |
| local possible-modules = [ GLOB $(path-to-modules) : *\\.jam ] ; |
| local not-modules = [ GLOB $(path-to-modules) : *$(.not-modules)\\.jam ] ; |
| local modules-to-list = |
| [ sequence.insertion-sort |
| [ set.difference $(possible-modules:D=:S=) : $(not-modules:D=:S=) ] ] ; |
| local modules-to-scan ; |
| for local m in $(modules-to-list) |
| { |
| local module-files = [ GLOB $(path-to-modules) : $(m)\\.jam ] ; |
| modules-to-scan += $(module-files[1]) ; |
| } |
| do-scan $(modules-to-scan) : print-help-all ; |
| did-help = true ; |
| |
| case --help-enable-* : |
| local option = [ MATCH --help-enable-(.*) : $(command) ] ; option = $(option:L) ; |
| set-option $(option) : enabled ; |
| did-help = true ; |
| |
| case --help-disable-* : |
| local option = [ MATCH --help-disable-(.*) : $(command) ] ; option = $(option:L) ; |
| set-option $(option) ; |
| did-help = true ; |
| |
| case --help-output : |
| set-output $(values[1]) ; |
| did-help = true ; |
| |
| case --help-output-file : |
| set-output-file $(values[1]) ; |
| did-help = true ; |
| |
| case --help-doc-options : |
| local doc-module-spec = [ split-symbol doc ] ; |
| do-scan $(doc-module-spec[1]) : print-help-options ; |
| did-help = true ; |
| |
| case --help-options : |
| print-help-usage ; |
| did-help = true ; |
| |
| case --help : |
| local spec = $(values[1]) ; |
| if $(spec) |
| { |
| local spec-parts = [ split-symbol $(spec) ] ; |
| if $(spec-parts) |
| { |
| if $(spec-parts[2]) |
| { |
| do-scan $(spec-parts[1]) : print-help-classes $(spec-parts[2]) ; |
| do-scan $(spec-parts[1]) : print-help-rules $(spec-parts[2]) ; |
| do-scan $(spec-parts[1]) : print-help-variables $(spec-parts[2]) ; |
| } |
| else |
| { |
| do-scan $(spec-parts[1]) : print-help-module ; |
| } |
| } |
| else |
| { |
| EXIT "Unrecognized help option '"$(command)" "$(spec)"'." ; |
| } |
| } |
| else |
| { |
| version.print ; |
| ECHO ; |
| # First print documentation from the current Jamfile, if any. |
| # FIXME: Generally, this duplication of project.jam logic is bad. |
| local names = [ modules.peek project : JAMROOT ] |
| [ modules.peek project : JAMFILE ] ; |
| local project-file = [ path.glob . : $(names) ] ; |
| if ! $(project-file) |
| { |
| project-file = [ path.glob-in-parents . : $(names) ] ; |
| } |
| |
| for local p in $(project-file) |
| { |
| do-scan $(p) : print-help-project $(p) ; |
| } |
| |
| # Next any user-config help. |
| local user-path = [ os.home-directories ] [ os.environ BOOST_BUILD_PATH ] ; |
| local user-config = [ GLOB $(user-path) : user-config.jam ] ; |
| if $(user-config) |
| { |
| do-scan $(user-config[1]) : print-help-config user $(user-config[1]) ; |
| } |
| |
| # Next any site-config help. |
| local site-config = [ GLOB $(user-path) : site-config.jam ] ; |
| if $(site-config) |
| { |
| do-scan $(site-config[1]) : print-help-config site $(site-config[1]) ; |
| } |
| |
| # Then the overall help. |
| print-help-top ; |
| } |
| did-help = true ; |
| } |
| if $(did-help) |
| { |
| UPDATE all ; |
| NOCARE all ; |
| } |
| return $(did-help) ; |
| } |
| |
| # Split a reference to a symbol into module and symbol parts. |
| # |
| local rule split-symbol ( |
| symbol # The symbol to split. |
| ) |
| { |
| local path-to-modules = [ modules.peek : BOOST_BUILD_PATH ] ; |
| path-to-modules ?= . ; |
| local module-name = $(symbol) ; |
| local symbol-name = ; |
| local result = ; |
| while ! $(result) |
| { |
| local module-path = [ GLOB $(path-to-modules) : $(module-name)\\.jam ] ; |
| if $(module-path) |
| { |
| # The 'module-name' in fact refers to module. Return the full |
| # module path and a symbol within it. If 'symbol' passed to this |
| # rule is already module, 'symbol-name' will be empty. Otherwise, |
| # it's initialized on the previous loop iteration. |
| # In case there are several modules by this name, |
| # use the first one. |
| result = $(module-path[1]) $(symbol-name) ; |
| } |
| else |
| { |
| if ! $(module-name:S) |
| { |
| result = - ; |
| } |
| else |
| { |
| local next-symbol-part = [ MATCH ^.(.*) : $(module-name:S) ] ; |
| if $(symbol-name) |
| { |
| symbol-name = $(next-symbol-part).$(symbol-name) ; |
| } |
| else |
| { |
| symbol-name = $(next-symbol-part) ; |
| } |
| module-name = $(module-name:B) ; |
| } |
| } |
| } |
| if $(result) != - |
| { |
| return $(result) ; |
| } |
| } |