"""engine.SCons.Options
This file defines the Options class that is used to add user-friendly customizable
variables to a scons build.
"""
#
# Copyright (c) 2001, 2002 Steven Knight
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
# "Software"), to deal in the Software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish,
# distribute, sublicense, and/or sell copies of the Software, and to
# permit persons to whom the Software is furnished to do so, subject to
# the following conditions:
#
# The above copyright notice and this permission notice shall be included
# in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
import SCons.Errors
import os.path
class Options:
"""
Holds all the options, updates the environment with the variables,
and renders the help text.
"""
def __init__(self, file=None):
"""
file - [optional] the name of the customizable file.
"""
self.options = []
self.file = file
def Add(self, key, help="", default=None, validater=None, converter=None):
"""
Add an option.
key - the name of the variable
help - optional help text for the options
default - optional default value
validater - optional function that is called to validate the option's value
converter - optional function that is called to convert the option's value before
putting it in the environment.
"""
class Option:
pass
option = Option()
option.key = key
option.help = help
option.default = default
option.validater = validater
option.converter = converter
self.options.append(option)
def Update(self, env, args):
"""
Update an environment with the option variables.
env - the environment to update.
args - the dictionary to get the command line arguments from.
"""
values = {}
# first set the defaults:
for option in self.options:
if not option.default is None:
values[option.key] = option.default
# next set the value specified in the options file
if self.file and os.path.exists(self.file):
execfile(self.file, values)
# finally set the values specified on the command line
values.update(args)
# put the variables in the environment:
# (don't copy over variables that are not declared
# as options)
for option in self.options:
try:
env[option.key] = values[option.key]
except KeyError:
pass
# Call the convert functions:
for option in self.options:
if option.converter:
value = env.subst('${%s}'%option.key)
try:
env[option.key] = option.converter(value)
except ValueError, x:
raise SCons.Errors.UserError, 'Error converting option: %s\n%s'%(option.key, x)
# Finally validate the values:
for option in self.options:
if option.validater:
option.validater(option.key, env.subst('${%s}'%option.key))
def GenerateHelpText(self, env):
"""
Generate the help text for the options.
env - an environment that is used to get the current values of the options.
"""
help_text = ""
for option in self.options:
help_text = help_text + '\n%s: %s\n default: %s\n'%(option.key, option.help, option.default)
if env.has_key(option.key):
help_text = help_text + ' actual: %s\n'%env.subst('${%s}'%option.key)
else:
help_text = help_text + ' actual: None\n'
return help_text
value='bug_2413550'>bug_2413550
Tcl is a high-level, general-purpose, interpreted, dynamic programming language. It was designed with the goal of being very simple but powerful.