custom.py revision 235225ec935002b4669d14a48c9c20864a5496f8
197e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca"""custom 297e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca 397e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé FonsecaCustom builders and methods. 497e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca 597e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca""" 697e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca 797e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca# 897e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca# Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas. 997e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca# All Rights Reserved. 1097e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca# 1197e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca# Permission is hereby granted, free of charge, to any person obtaining a 1297e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca# copy of this software and associated documentation files (the 1397e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca# "Software"), to deal in the Software without restriction, including 1497e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca# without limitation the rights to use, copy, modify, merge, publish, 1597e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca# distribute, sub license, and/or sell copies of the Software, and to 1697e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca# permit persons to whom the Software is furnished to do so, subject to 1797e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca# the following conditions: 1897e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca# 1997e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca# The above copyright notice and this permission notice (including the 2097e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca# next paragraph) shall be included in all copies or substantial portions 2197e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca# of the Software. 2297e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca# 2397e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 2497e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 2597e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 2697e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca# IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 2797e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca# ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 2897e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 2997e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 3097e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca# 3197e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca 3297e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca 3397e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonsecaimport os 3497e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonsecaimport os.path 3597e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonsecaimport re 36235225ec935002b4669d14a48c9c20864a5496f8José Fonsecaimport sys 37235225ec935002b4669d14a48c9c20864a5496f8José Fonsecaimport subprocess 3897e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca 3997e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonsecaimport SCons.Action 4097e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonsecaimport SCons.Builder 4197e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonsecaimport SCons.Scanner 4297e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca 4397e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonsecaimport fixes 4497e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca 4597e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca 4697e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonsecadef quietCommandLines(env): 4797e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca # Quiet command lines 4897e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca # See also http://www.scons.org/wiki/HidingCommandLinesInOutput 4997e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca env['ASCOMSTR'] = " Assembling $SOURCE ..." 5097e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca env['ASPPCOMSTR'] = " Assembling $SOURCE ..." 5197e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca env['CCCOMSTR'] = " Compiling $SOURCE ..." 5297e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca env['SHCCCOMSTR'] = " Compiling $SOURCE ..." 5397e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca env['CXXCOMSTR'] = " Compiling $SOURCE ..." 5497e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca env['SHCXXCOMSTR'] = " Compiling $SOURCE ..." 5597e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca env['ARCOMSTR'] = " Archiving $TARGET ..." 5697e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca env['RANLIBCOMSTR'] = " Indexing $TARGET ..." 5797e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca env['LINKCOMSTR'] = " Linking $TARGET ..." 5897e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca env['SHLINKCOMSTR'] = " Linking $TARGET ..." 5997e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca env['LDMODULECOMSTR'] = " Linking $TARGET ..." 6097e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca env['SWIGCOMSTR'] = " Generating $TARGET ..." 6154d8c5e3c2fc7db643a2bae61be203ab9cbb1efaJosé Fonseca env['LEXCOMSTR'] = " Generating $TARGET ..." 6254d8c5e3c2fc7db643a2bae61be203ab9cbb1efaJosé Fonseca env['YACCCOMSTR'] = " Generating $TARGET ..." 632311e2adf0db3c46a1054d94cdfcd2ec0badbfd3José Fonseca env['CODEGENCOMSTR'] = " Generating $TARGET ..." 6437058c3497850f452bdaf70a5dda07ee4840b6b9José Fonseca env['INSTALLSTR'] = " Installing $TARGET ..." 6597e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca 6697e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca 6797e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonsecadef createConvenienceLibBuilder(env): 6897e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca """This is a utility function that creates the ConvenienceLibrary 6997e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca Builder in an Environment if it is not there already. 7097e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca 7197e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca If it is already there, we return the existing one. 7297e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca 7397e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca Based on the stock StaticLibrary and SharedLibrary builders. 7497e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca """ 7597e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca 7697e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca try: 7797e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca convenience_lib = env['BUILDERS']['ConvenienceLibrary'] 7897e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca except KeyError: 7997e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca action_list = [ SCons.Action.Action("$ARCOM", "$ARCOMSTR") ] 8097e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca if env.Detect('ranlib'): 8197e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca ranlib_action = SCons.Action.Action("$RANLIBCOM", "$RANLIBCOMSTR") 8297e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca action_list.append(ranlib_action) 8397e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca 8497e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca convenience_lib = SCons.Builder.Builder(action = action_list, 8597e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca emitter = '$LIBEMITTER', 8697e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca prefix = '$LIBPREFIX', 8797e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca suffix = '$LIBSUFFIX', 8897e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca src_suffix = '$SHOBJSUFFIX', 8997e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca src_builder = 'SharedObject') 9097e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca env['BUILDERS']['ConvenienceLibrary'] = convenience_lib 9197e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca 9297e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca return convenience_lib 9397e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca 9497e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca 9597e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca# TODO: handle import statements with multiple modules 9697e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca# TODO: handle from import statements 9797e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonsecaimport_re = re.compile(r'^import\s+(\S+)$', re.M) 9897e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca 9997e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonsecadef python_scan(node, env, path): 10097e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca # http://www.scons.org/doc/0.98.5/HTML/scons-user/c2781.html#AEN2789 10197e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca contents = node.get_contents() 10297e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca source_dir = node.get_dir() 10397e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca imports = import_re.findall(contents) 10497e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca results = [] 10597e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca for imp in imports: 10697e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca for dir in path: 10797e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca file = os.path.join(str(dir), imp.replace('.', os.sep) + '.py') 10897e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca if os.path.exists(file): 10997e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca results.append(env.File(file)) 11097e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca break 11197e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca file = os.path.join(str(dir), imp.replace('.', os.sep), '__init__.py') 11297e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca if os.path.exists(file): 11397e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca results.append(env.File(file)) 11497e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca break 11597e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca return results 11697e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca 11797e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonsecapython_scanner = SCons.Scanner.Scanner(function = python_scan, skeys = ['.py']) 11897e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca 11997e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca 12097e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonsecadef code_generate(env, script, target, source, command): 12197e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca """Method to simplify code generation via python scripts. 12297e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca 12397e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca http://www.scons.org/wiki/UsingCodeGenerators 12497e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca http://www.scons.org/doc/0.98.5/HTML/scons-user/c2768.html 12597e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca """ 12697e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca 12797e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca # We're generating code using Python scripts, so we have to be 12897e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca # careful with our scons elements. This entry represents 12997e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca # the generator file *in the source directory*. 13097e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca script_src = env.File(script).srcnode() 13197e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca 13297e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca # This command creates generated code *in the build directory*. 13397e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca command = command.replace('$SCRIPT', script_src.path) 1342311e2adf0db3c46a1054d94cdfcd2ec0badbfd3José Fonseca action = SCons.Action.Action(command, "$CODEGENCOMSTR") 1352311e2adf0db3c46a1054d94cdfcd2ec0badbfd3José Fonseca code = env.Command(target, source, action) 13697e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca 13797e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca # Explicitly mark that the generated code depends on the generator, 13897e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca # and on implicitly imported python modules 13997e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca path = (script_src.get_dir(),) 14097e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca deps = [script_src] 14197e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca deps += script_src.get_implicit_deps(env, python_scanner, path) 14297e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca env.Depends(code, deps) 14397e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca 14497e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca # Running the Python script causes .pyc files to be generated in the 14597e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca # source directory. When we clean up, they should go too. So add side 14697e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca # effects for .pyc files 14797e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca for dep in deps: 14897e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca pyc = env.File(str(dep) + 'c') 14997e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca env.SideEffect(pyc, code) 15097e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca 15197e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca return code 15297e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca 15397e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca 15497e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonsecadef createCodeGenerateMethod(env): 15597e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca env.Append(SCANNERS = python_scanner) 15697e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca env.AddMethod(code_generate, 'CodeGenerate') 15797e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca 15897e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca 159235225ec935002b4669d14a48c9c20864a5496f8José Fonsecadef _pkg_check_modules(env, name, modules): 160235225ec935002b4669d14a48c9c20864a5496f8José Fonseca '''Simple wrapper for pkg-config.''' 161235225ec935002b4669d14a48c9c20864a5496f8José Fonseca 162235225ec935002b4669d14a48c9c20864a5496f8José Fonseca env['HAVE_' + name] = False 163235225ec935002b4669d14a48c9c20864a5496f8José Fonseca 164235225ec935002b4669d14a48c9c20864a5496f8José Fonseca # For backwards compatability 165235225ec935002b4669d14a48c9c20864a5496f8José Fonseca env[name.lower()] = False 166235225ec935002b4669d14a48c9c20864a5496f8José Fonseca 167235225ec935002b4669d14a48c9c20864a5496f8José Fonseca if env['platform'] == 'windows': 168235225ec935002b4669d14a48c9c20864a5496f8José Fonseca return 169235225ec935002b4669d14a48c9c20864a5496f8José Fonseca 170235225ec935002b4669d14a48c9c20864a5496f8José Fonseca if not env.Detect('pkg-config'): 171235225ec935002b4669d14a48c9c20864a5496f8José Fonseca return 172235225ec935002b4669d14a48c9c20864a5496f8José Fonseca 173235225ec935002b4669d14a48c9c20864a5496f8José Fonseca if subprocess.call(["pkg-config", "--exists", ' '.join(modules)]) != 0: 174235225ec935002b4669d14a48c9c20864a5496f8José Fonseca return 175235225ec935002b4669d14a48c9c20864a5496f8José Fonseca 176235225ec935002b4669d14a48c9c20864a5496f8José Fonseca # Other flags may affect the compilation of unrelated targets, so store 177235225ec935002b4669d14a48c9c20864a5496f8José Fonseca # them with a prefix, (e.g., XXX_CFLAGS, XXX_LIBS, etc) 178235225ec935002b4669d14a48c9c20864a5496f8José Fonseca try: 179235225ec935002b4669d14a48c9c20864a5496f8José Fonseca flags = env.ParseFlags('!pkg-config --cflags --libs ' + ' '.join(modules)) 180235225ec935002b4669d14a48c9c20864a5496f8José Fonseca except OSError: 181235225ec935002b4669d14a48c9c20864a5496f8José Fonseca return 182235225ec935002b4669d14a48c9c20864a5496f8José Fonseca prefix = name + '_' 183235225ec935002b4669d14a48c9c20864a5496f8José Fonseca for flag_name, flag_value in flags.iteritems(): 184235225ec935002b4669d14a48c9c20864a5496f8José Fonseca assert '_' not in flag_name 185235225ec935002b4669d14a48c9c20864a5496f8José Fonseca env[prefix + flag_name] = flag_value 186235225ec935002b4669d14a48c9c20864a5496f8José Fonseca 187235225ec935002b4669d14a48c9c20864a5496f8José Fonseca env['HAVE_' + name] = True 188235225ec935002b4669d14a48c9c20864a5496f8José Fonseca 189235225ec935002b4669d14a48c9c20864a5496f8José Fonsecadef pkg_check_modules(env, name, modules): 190235225ec935002b4669d14a48c9c20864a5496f8José Fonseca 191235225ec935002b4669d14a48c9c20864a5496f8José Fonseca sys.stdout.write('Checking for %s...' % name) 192235225ec935002b4669d14a48c9c20864a5496f8José Fonseca _pkg_check_modules(env, name, modules) 193235225ec935002b4669d14a48c9c20864a5496f8José Fonseca result = env['HAVE_' + name] 194235225ec935002b4669d14a48c9c20864a5496f8José Fonseca sys.stdout.write(' %s\n' % ['no', 'yes'][int(bool(result))]) 195235225ec935002b4669d14a48c9c20864a5496f8José Fonseca 196235225ec935002b4669d14a48c9c20864a5496f8José Fonseca # XXX: For backwards compatability 197235225ec935002b4669d14a48c9c20864a5496f8José Fonseca env[name.lower()] = result 198235225ec935002b4669d14a48c9c20864a5496f8José Fonseca 199235225ec935002b4669d14a48c9c20864a5496f8José Fonseca 200235225ec935002b4669d14a48c9c20864a5496f8José Fonsecadef pkg_use_modules(env, names): 201235225ec935002b4669d14a48c9c20864a5496f8José Fonseca '''Search for all environment flags that match NAME_FOO and append them to 202235225ec935002b4669d14a48c9c20864a5496f8José Fonseca the FOO environment variable.''' 203235225ec935002b4669d14a48c9c20864a5496f8José Fonseca 204235225ec935002b4669d14a48c9c20864a5496f8José Fonseca names = env.Flatten(names) 205235225ec935002b4669d14a48c9c20864a5496f8José Fonseca 206235225ec935002b4669d14a48c9c20864a5496f8José Fonseca for name in names: 207235225ec935002b4669d14a48c9c20864a5496f8José Fonseca prefix = name + '_' 208235225ec935002b4669d14a48c9c20864a5496f8José Fonseca 209235225ec935002b4669d14a48c9c20864a5496f8José Fonseca if not 'HAVE_' + name in env: 210235225ec935002b4669d14a48c9c20864a5496f8José Fonseca print 'Attempt to use unknown module %s' % name 211235225ec935002b4669d14a48c9c20864a5496f8José Fonseca env.Exit(1) 212235225ec935002b4669d14a48c9c20864a5496f8José Fonseca 213235225ec935002b4669d14a48c9c20864a5496f8José Fonseca if not env['HAVE_' + name]: 214235225ec935002b4669d14a48c9c20864a5496f8José Fonseca print 'Attempt to use unavailable module %s' % name 215235225ec935002b4669d14a48c9c20864a5496f8José Fonseca env.Exit(1) 216235225ec935002b4669d14a48c9c20864a5496f8José Fonseca 217235225ec935002b4669d14a48c9c20864a5496f8José Fonseca flags = {} 218235225ec935002b4669d14a48c9c20864a5496f8José Fonseca for flag_name, flag_value in env.Dictionary().iteritems(): 219235225ec935002b4669d14a48c9c20864a5496f8José Fonseca if flag_name.startswith(prefix): 220235225ec935002b4669d14a48c9c20864a5496f8José Fonseca flag_name = flag_name[len(prefix):] 221235225ec935002b4669d14a48c9c20864a5496f8José Fonseca if '_' not in flag_name: 222235225ec935002b4669d14a48c9c20864a5496f8José Fonseca flags[flag_name] = flag_value 223235225ec935002b4669d14a48c9c20864a5496f8José Fonseca if flags: 224235225ec935002b4669d14a48c9c20864a5496f8José Fonseca env.MergeFlags(flags) 225235225ec935002b4669d14a48c9c20864a5496f8José Fonseca 226235225ec935002b4669d14a48c9c20864a5496f8José Fonseca 227235225ec935002b4669d14a48c9c20864a5496f8José Fonsecadef createPkgConfigMethods(env): 228235225ec935002b4669d14a48c9c20864a5496f8José Fonseca env.AddMethod(pkg_check_modules, 'PkgCheckModules') 229235225ec935002b4669d14a48c9c20864a5496f8José Fonseca env.AddMethod(pkg_use_modules, 'PkgUseModules') 230235225ec935002b4669d14a48c9c20864a5496f8José Fonseca 231235225ec935002b4669d14a48c9c20864a5496f8José Fonseca 23297e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonsecadef generate(env): 23397e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca """Common environment generation code""" 23497e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca 235c7bd0fa4851187c3102948f5f4d70c26d1b55a5eJosé Fonseca verbose = env.get('verbose', False) or not env.get('quiet', True) 236c7bd0fa4851187c3102948f5f4d70c26d1b55a5eJosé Fonseca if not verbose: 23797e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca quietCommandLines(env) 23897e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca 23997e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca # Custom builders and methods 24097e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca createConvenienceLibBuilder(env) 24197e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca createCodeGenerateMethod(env) 242235225ec935002b4669d14a48c9c20864a5496f8José Fonseca createPkgConfigMethods(env) 24397e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca 24497e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca # for debugging 24597e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca #print env.Dump() 24697e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca 24797e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca 24897e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonsecadef exists(env): 24997e2c5ac0bba7298c9a32703fe3d19de1f7b815aJosé Fonseca return 1 250