def __init__( self, env, stage_dir, libraries, add_dependents, linktype, boost ): self._env = env sconstruct_id = env['sconstruct_path'] global _prebuilt_boost_libraries if sconstruct_id not in _prebuilt_boost_libraries['emitter']: _prebuilt_boost_libraries['emitter'][sconstruct_id] = {} logger.trace( "Current Boost build [{}] has the following build variants [{}]".format( as_info(sconstruct_id), colour_items(_prebuilt_boost_libraries['emitter'][sconstruct_id].keys()) ) ) self._stage_dir = stage_dir logger.debug( "Requested libraries [{}]".format( colour_items( libraries ) ) ) self._libraries = _lazy_update_library_list( env, True, libraries, _prebuilt_boost_libraries['emitter'][sconstruct_id], add_dependents, linktype, boost, self._stage_dir ) logger.debug( "Required libraries [{}]".format( colour_items( self._libraries ) ) ) self._location = boost.local() self._boost = boost self._threading = True self._linktype = linktype self._variant = variant_name( self._env['variant'].name() ) self._toolchain = env['toolchain']
def __init__(self, env, stage_dir, libraries, add_dependents, linktype, boost, verbose_build, verbose_config): self._env = env logger.trace("Requested libraries [{}]".format( colour_items(libraries))) self._linktype = linktype self._variant = variant_name(self._env['variant'].name()) self._target_arch = env['target_arch'] self._toolchain = env['toolchain'] self._stage_dir = stage_dir self._libraries = _lazy_update_library_list(env, False, libraries, self.prebuilt_libraries, add_dependents, linktype, boost, self._stage_dir) logger.trace("Required libraries [{}]".format( colour_items(self._libraries))) self._location = boost.local() self._verbose_build = verbose_build self._verbose_config = verbose_config self._job_count = env['job_count'] self._parallel = env['parallel']
def __init__( self, env, stage_dir, libraries, add_dependents, linktype, boost, verbose_build, verbose_config ): self._env = env sconstruct_id = env['sconstruct_path'] global _prebuilt_boost_libraries if sconstruct_id not in _prebuilt_boost_libraries['action']: _prebuilt_boost_libraries['action'][sconstruct_id] = {} logger.trace( "Current Boost build [{}] has the following build variants [{}]".format( as_info(sconstruct_id), colour_items(_prebuilt_boost_libraries['action'][sconstruct_id].keys()) ) ) logger.debug( "Requested libraries [{}]".format( colour_items( libraries ) ) ) self._linktype = linktype self._variant = variant_name( self._env['variant'].name() ) self._target_arch = env['target_arch'] self._toolchain = env['toolchain'] self._stage_dir = stage_dir self._libraries = _lazy_update_library_list( env, False, libraries, _prebuilt_boost_libraries['action'][sconstruct_id], add_dependents, linktype, boost, self._stage_dir ) logger.debug( "Required libraries [{}]".format( colour_items( self._libraries ) ) ) self._location = boost.local() self._verbose_build = verbose_build self._verbose_config = verbose_config self._job_count = env['job_count'] self._parallel = env['parallel'] self._threading = True
def __init__(self, env, stage_dir, libraries, add_dependents, linktype, boost): self._env = env self._stage_dir = stage_dir self._libraries = _lazy_update_library_list(env, True, libraries, self.prebuilt_libraries, add_dependents, linktype, boost, self._stage_dir) self._location = boost.local() self._boost = boost self._threading = True self._linktype = linktype self._variant = variant_name(self._env['variant'].name()) self._toolchain = env['toolchain']
def __init__(self, env, stage_dir, libraries, add_dependents, linktype, boost, verbose_build, verbose_config): self._env = env sconstruct_id = env['sconstruct_path'] global _prebuilt_boost_libraries if sconstruct_id not in _prebuilt_boost_libraries['action']: _prebuilt_boost_libraries['action'][sconstruct_id] = {} logger.trace( "Current Boost build [{}] has the following build variants [{}]". format( as_info(sconstruct_id), colour_items(_prebuilt_boost_libraries['action'] [sconstruct_id].keys()))) logger.debug("Requested libraries [{}]".format( colour_items(libraries))) self._linktype = linktype self._variant = variant_name(self._env['variant'].name()) self._target_arch = env['target_arch'] self._toolchain = env['toolchain'] self._stage_dir = stage_dir self._libraries = _lazy_update_library_list( env, False, libraries, _prebuilt_boost_libraries['action'][sconstruct_id], add_dependents, linktype, boost, self._stage_dir) logger.debug("Required libraries [{}]".format( colour_items(self._libraries))) self._location = boost.local() self._verbose_build = verbose_build self._verbose_config = verbose_config self._job_count = env['job_count'] self._parallel = env['parallel'] self._threading = True
def __init__(self, env, stage_dir, libraries, add_dependents, linktype, boost): self._env = env sconstruct_id = env['sconstruct_path'] global _prebuilt_boost_libraries if sconstruct_id not in _prebuilt_boost_libraries['emitter']: _prebuilt_boost_libraries['emitter'][sconstruct_id] = {} logger.trace( "Current Boost build [{}] has the following build variants [{}]". format( as_info(sconstruct_id), colour_items(_prebuilt_boost_libraries['emitter'] [sconstruct_id].keys()))) self._stage_dir = stage_dir logger.debug("Requested libraries [{}]".format( colour_items(libraries))) self._libraries = _lazy_update_library_list( env, True, libraries, _prebuilt_boost_libraries['emitter'][sconstruct_id], add_dependents, linktype, boost, self._stage_dir) logger.debug("Required libraries [{}]".format( colour_items(self._libraries))) self._location = boost.local() self._boost = boost self._threading = True self._linktype = linktype self._variant = variant_name(self._env['variant'].name()) self._toolchain = env['toolchain']
def __call__(self, env, target, source, libraries, linktype): logger.trace("Build Dir = [{}]".format(as_info(env['build_dir']))) logger.trace("Requested libraries = [{}]".format( colour_items(libraries))) variant = variant_name(env['variant'].name()) target_arch = env['target_arch'] toolchain = env['toolchain'] stage_dir = stage_directory(toolchain, variant, target_arch, toolchain.abi_flag(env)) variant_key = stage_dir logger.trace("Prebuilt Libraries Variant Key = [{}]".format( as_notice(variant_key))) library_action = BoostLibraryAction(env, stage_dir, libraries, self._add_dependents, linktype, self._boost, self._verbose_build, self._verbose_config) library_emitter = BoostLibraryEmitter(env, stage_dir, libraries, self._add_dependents, linktype, self._boost) logger.trace("Action Prebuilt Libraries for [{}] = {}".format( as_info(variant_key), colour_items(BoostLibraryAction.prebuilt_libraries[variant_key]))) logger.trace("Emitter Prebuilt Libraries for [{}] = {}".format( as_info(variant_key), colour_items(BoostLibraryEmitter.prebuilt_libraries[variant_key]))) env.AppendUnique( BUILDERS={ 'BoostLibraryBuilder': env.Builder(action=library_action, emitter=library_emitter) }) built_libraries = env.BoostLibraryBuilder(target, source) built_libraries_map = { extract_library_name_from_path(l): l for l in built_libraries } logger.trace("Libraries to be built = [{}]".format( colour_items(built_libraries_map.keys()))) if not variant_key in self._prebuilt_libraries: self._prebuilt_libraries[variant_key] = {} logger.trace("Variant sources = [{}]".format( colour_items(self._prebuilt_libraries[variant_key].keys()))) required_libraries = add_dependent_libraries(self._boost, linktype, libraries) logger.trace("Required libraries = [{}]".format( colour_items(required_libraries))) for library in required_libraries: if library in self._prebuilt_libraries[variant_key]: logger.trace( "Library [{}] already present in variant [{}]".format( as_notice(library), as_info(variant_key))) #if library not in built_libraries_map: # The Depends is required regardless so SCons knows about the relationship logger.trace("Add Depends for [{}]".format( as_notice( self._prebuilt_libraries[variant_key][library].path))) env.Depends(built_libraries, self._prebuilt_libraries[variant_key][library]) else: self._prebuilt_libraries[variant_key][ library] = built_libraries_map[library] logger.trace("Library sources for variant [{}] = [{}]".format( as_info(variant_key), colour_items(k + ":" + as_info(v.path) for k, v in self._prebuilt_libraries[variant_key].iteritems()))) bjam = env.Command(bjam_exe(self._boost), [], BuildBjam(self._boost)) env.NoClean(bjam) if built_libraries: env.Requires(built_libraries, bjam) if cuppa.build_platform.name() == "Linux": toolset_target = os.path.join( self._boost.local(), env['toolchain'].name() + "._jam") toolset_config_jam = env.Command(toolset_target, [], WriteToolsetConfigJam()) project_config_target = os.path.join(self._boost.local(), "project-config.jam") if not os.path.exists(project_config_target): project_config_jam = env.Requires( project_config_target, env.AlwaysBuild(toolset_config_jam)) env.Requires(built_libraries, project_config_jam) env.Requires(built_libraries, toolset_config_jam) install_dir = linktype == 'shared' and env['abs_final_dir'] or env[ 'abs_build_dir'] installed_libraries = [] for library in required_libraries: logger.debug("Install Boost library [{}:{}] to [{}]".format( as_notice(library), as_info(str(self._prebuilt_libraries[variant_key][library])), as_notice(install_dir))) library_node = self._prebuilt_libraries[variant_key][library] logger.trace( "Library Node = \n[{}]\n[{}]\n[{}]\n[{}]\n[{}]".format( as_notice(library_node.path), as_notice(str(library_node)), as_notice(str(library_node.get_binfo().bact)), as_notice(str(library_node.get_state())), as_notice(str(library_node.srcnode())))) installed_library = env.CopyFiles( install_dir, self._prebuilt_libraries[variant_key][library]) installed_libraries.append(installed_library) logger.debug("Boost 'Installed' Libraries = [{}]".format( colour_items(l.path for l in Flatten(installed_libraries)))) return Flatten(installed_libraries)
def __call__( self, env, target, source, libraries, linktype ): sconstruct_id = env['sconstruct_path'] global _prebuilt_boost_libraries if sconstruct_id not in _prebuilt_boost_libraries['builder']: _prebuilt_boost_libraries['builder'][sconstruct_id] = {} global _bjam_invocations if sconstruct_id not in _bjam_invocations: _bjam_invocations[sconstruct_id] = [] logger.trace( "Build Dir = [{}]".format( as_info( env['build_dir'] ) ) ) logger.trace( "Requested libraries = [{}]".format( colour_items( libraries ) ) ) variant = variant_name( env['variant'].name() ) target_arch = env['target_arch'] toolchain = env['toolchain'] stage_dir = stage_directory( toolchain, variant, target_arch, toolchain.abi_flag(env) ) variant_key = stage_dir logger.trace( "Prebuilt Libraries Variant Key = [{}]".format( as_notice( variant_key ) ) ) library_action = BoostLibraryAction ( env, stage_dir, libraries, self._add_dependents, linktype, self._boost, self._verbose_build, self._verbose_config ) library_emitter = BoostLibraryEmitter( env, stage_dir, libraries, self._add_dependents, linktype, self._boost ) logger.trace( "Action Prebuilt Libraries for [{}] = {}".format( as_info( variant_key ), colour_items( _prebuilt_boost_libraries['action'][sconstruct_id][variant_key] ) ) ) logger.trace( "Emitter Prebuilt Libraries for [{}] = {}".format( as_info( variant_key ), colour_items( _prebuilt_boost_libraries['emitter'][sconstruct_id][variant_key] ) ) ) env.AppendUnique( BUILDERS = { 'BoostLibraryBuilder' : env.Builder( action=library_action, emitter=library_emitter ) } ) built_libraries = env.BoostLibraryBuilder( target, source ) built_libraries_map = { extract_library_name_from_path(l):l for l in built_libraries } logger.trace( "Libraries to be built = [{}]".format( colour_items( built_libraries_map.keys() ) ) ) if not variant_key in _prebuilt_boost_libraries['builder'][sconstruct_id]: _prebuilt_boost_libraries['builder'][sconstruct_id][ variant_key ] = {} logger.trace( "Variant sources = [{}]".format( colour_items( _prebuilt_boost_libraries['builder'][sconstruct_id][ variant_key ].keys() ) ) ) required_libraries = add_dependent_libraries( self._boost, linktype, libraries ) logger.trace( "Required libraries = [{}]".format( colour_items( required_libraries ) ) ) unbuilt_libraries = False new_libraries = [] for library in required_libraries: if library in _prebuilt_boost_libraries['builder'][sconstruct_id][ variant_key ]: logger.trace( "Library [{}] already present in variant [{}]".format( as_notice(library), as_info(variant_key) ) ) # Calling Depends() is required so SCons knows about the relationship, even # if the library already exists in the _prebuilt_boost_libraries dict logger.trace( "Add Depends for [{}]".format( as_notice( _prebuilt_boost_libraries['builder'][sconstruct_id][ variant_key ][library].path ) ) ) env.Depends( built_libraries, _prebuilt_boost_libraries['builder'][sconstruct_id][ variant_key ][library] ) else: unbuilt_libraries = True new_libraries.append( library ) _prebuilt_boost_libraries['builder'][sconstruct_id][ variant_key ][library] = built_libraries_map[library] env.Depends( target, _prebuilt_boost_libraries['builder'][sconstruct_id][ variant_key ][library] ) logger.trace( "Library sources for variant [{}] = [{}]".format( as_info(variant_key), colour_items( k+":"+as_info(v.path) for k,v in _prebuilt_boost_libraries['builder'][sconstruct_id][ variant_key ].iteritems() ) ) ) if unbuilt_libraries: # if this is not the first BJAM invocation for this set of libraries make it require (using Requires) # the previous BJAM invocation otherwise we already have an invocation of BJAM that will create the # required libraries and therefore we can ignore the invocation index = len(_bjam_invocations[sconstruct_id]) previous_invocation = _bjam_invocations[sconstruct_id] and _bjam_invocations[sconstruct_id][-1] or None if previous_invocation and previous_invocation['invocation'] != built_libraries: logger.debug( "Add BJAM invocation Requires() such that ([{}][{}][{}]) requires ([{}][{}][{}])".format( as_info(str(index)), as_info(variant_key), colour_items( new_libraries ), as_info(str(previous_invocation['index'])), as_info(previous_invocation['variant']), colour_items( previous_invocation['libraries'] ) ) ) env.Requires( built_libraries, previous_invocation['invocation'] ) # if this is the first invocation of BJAM then add it to the list of BJAM invocations, or if this is # a different invocation (for different libraries) of BJAM add it to the list of invocations if not previous_invocation or previous_invocation['invocation'] != built_libraries and built_libraries: logger.debug( "Adding BJAM invocation [{}] for variant [{}] and new libraries [{}] to invocation list".format( as_info(str(index)), as_info(variant_key), colour_items( new_libraries ) ) ) _bjam_invocations[sconstruct_id].append( { 'invocation': built_libraries, 'index' : index, 'variant' : variant_key, 'libraries' : new_libraries } ) bjam = env.Command( bjam_exe( self._boost ), [], BuildBjam( self._boost ) ) env.NoClean( bjam ) if built_libraries: env.Requires( built_libraries, bjam ) if cuppa.build_platform.name() == "Linux": toolset_target = os.path.join( self._boost.local(), env['toolchain'].name() + "._jam" ) toolset_config_jam = env.Command( toolset_target, [], WriteToolsetConfigJam() ) project_config_target = os.path.join( self._boost.local(), "project-config.jam" ) if not os.path.exists( project_config_target ): project_config_jam = env.Requires( project_config_target, env.AlwaysBuild( toolset_config_jam ) ) env.Requires( built_libraries, project_config_jam ) env.Requires( built_libraries, toolset_config_jam ) install_dir = linktype == 'shared' and env['abs_final_dir'] or env['abs_build_dir'] installed_libraries = [] for library in required_libraries: logger.debug( "Install Boost library [{}:{}] to [{}]".format( as_notice(library), as_info(str(_prebuilt_boost_libraries['builder'][sconstruct_id][ variant_key ][library])), as_notice(install_dir) ) ) library_node = _prebuilt_boost_libraries['builder'][sconstruct_id][ variant_key ][library] logger.trace( "Library Node = \n[{}]\n[{}]\n[{}]\n[{}]\n[{}]".format( as_notice(library_node.path), as_notice(str(library_node)), as_notice(str(library_node.get_binfo().bact) ), as_notice(str(library_node.get_state()) ), as_notice(str(library_node.srcnode()) ) ) ) installed_library = env.CopyFiles( install_dir, _prebuilt_boost_libraries['builder'][sconstruct_id][ variant_key ][library] ) installed_libraries.append( installed_library ) logger.debug( "Boost 'Installed' Libraries = [{}]".format( colour_items( l.path for l in Flatten( installed_libraries ) ) ) ) return Flatten( installed_libraries )
def __call__(self, env, target, source, libraries, linktype): sconstruct_id = env['sconstruct_path'] global _prebuilt_boost_libraries if sconstruct_id not in _prebuilt_boost_libraries['builder']: _prebuilt_boost_libraries['builder'][sconstruct_id] = {} global _bjam_invocations if sconstruct_id not in _bjam_invocations: _bjam_invocations[sconstruct_id] = [] logger.trace("Build Dir = [{}]".format(as_info(env['build_dir']))) logger.trace("Requested libraries = [{}]".format( colour_items(libraries))) variant = variant_name(env['variant'].name()) target_arch = env['target_arch'] toolchain = env['toolchain'] stage_dir = stage_directory(toolchain, variant, target_arch, toolchain.abi_flag(env)) variant_key = stage_dir logger.trace("Prebuilt Libraries Variant Key = [{}]".format( as_notice(variant_key))) library_action = BoostLibraryAction(env, stage_dir, libraries, self._add_dependents, linktype, self._boost, self._verbose_build, self._verbose_config) library_emitter = BoostLibraryEmitter(env, stage_dir, libraries, self._add_dependents, linktype, self._boost) logger.trace("Action Prebuilt Libraries for [{}] = {}".format( as_info(variant_key), colour_items(_prebuilt_boost_libraries['action'][sconstruct_id] [variant_key]))) logger.trace("Emitter Prebuilt Libraries for [{}] = {}".format( as_info(variant_key), colour_items(_prebuilt_boost_libraries['emitter'][sconstruct_id] [variant_key]))) env.AppendUnique( BUILDERS={ 'BoostLibraryBuilder': env.Builder(action=library_action, emitter=library_emitter) }) built_libraries = env.BoostLibraryBuilder(target, source) built_libraries_map = { extract_library_name_from_path(l): l for l in built_libraries } logger.trace("Libraries to be built = [{}]".format( colour_items(built_libraries_map.keys()))) if not variant_key in _prebuilt_boost_libraries['builder'][ sconstruct_id]: _prebuilt_boost_libraries['builder'][sconstruct_id][ variant_key] = {} logger.trace("Variant sources = [{}]".format( colour_items(_prebuilt_boost_libraries['builder'][sconstruct_id] [variant_key].keys()))) required_libraries = add_dependent_libraries(self._boost, linktype, libraries) logger.trace("Required libraries = [{}]".format( colour_items(required_libraries))) unbuilt_libraries = False new_libraries = [] for library in required_libraries: if library in _prebuilt_boost_libraries['builder'][sconstruct_id][ variant_key]: logger.trace( "Library [{}] already present in variant [{}]".format( as_notice(library), as_info(variant_key))) # Calling Depends() is required so SCons knows about the relationship, even # if the library already exists in the _prebuilt_boost_libraries dict logger.trace("Add Depends for [{}]".format( as_notice(_prebuilt_boost_libraries['builder'] [sconstruct_id][variant_key][library].path))) env.Depends( built_libraries, _prebuilt_boost_libraries['builder'] [sconstruct_id][variant_key][library]) else: unbuilt_libraries = True new_libraries.append(library) _prebuilt_boost_libraries['builder'][sconstruct_id][ variant_key][library] = built_libraries_map[library] env.Depends( target, _prebuilt_boost_libraries['builder'][sconstruct_id] [variant_key][library]) logger.trace("Library sources for variant [{}] = [{}]".format( as_info(variant_key), colour_items( k + ":" + as_info(v.path) for k, v in six.iteritems(_prebuilt_boost_libraries['builder'] [sconstruct_id][variant_key])))) if unbuilt_libraries: # if this is not the first BJAM invocation for this set of libraries make it require (using Requires) # the previous BJAM invocation otherwise we already have an invocation of BJAM that will create the # required libraries and therefore we can ignore the invocation index = len(_bjam_invocations[sconstruct_id]) previous_invocation = _bjam_invocations[ sconstruct_id] and _bjam_invocations[sconstruct_id][-1] or None if previous_invocation and previous_invocation[ 'invocation'] != built_libraries: logger.debug( "Add BJAM invocation Requires() such that ([{}][{}][{}]) requires ([{}][{}][{}])" .format(as_info(str(index)), as_info(variant_key), colour_items(new_libraries), as_info(str(previous_invocation['index'])), as_info(previous_invocation['variant']), colour_items(previous_invocation['libraries']))) env.Requires(built_libraries, previous_invocation['invocation']) # if this is the first invocation of BJAM then add it to the list of BJAM invocations, or if this is # a different invocation (for different libraries) of BJAM add it to the list of invocations if not previous_invocation or previous_invocation[ 'invocation'] != built_libraries and built_libraries: logger.debug( "Adding BJAM invocation [{}] for variant [{}] and new libraries [{}] to invocation list" .format(as_info(str(index)), as_info(variant_key), colour_items(new_libraries))) _bjam_invocations[sconstruct_id].append({ 'invocation': built_libraries, 'index': index, 'variant': variant_key, 'libraries': new_libraries }) bjam = env.Command(bjam_exe(self._boost), [], BuildBjam(self._boost)) env.NoClean(bjam) if built_libraries: env.Requires(built_libraries, bjam) if cuppa.build_platform.name() == "Linux": toolset_target = os.path.join( self._boost.local(), env['toolchain'].name() + "._jam") toolset_config_jam = env.Command(toolset_target, [], WriteToolsetConfigJam()) project_config_target = os.path.join(self._boost.local(), "project-config.jam") if not os.path.exists(project_config_target): project_config_jam = env.Requires( project_config_target, env.AlwaysBuild(toolset_config_jam)) env.Requires(built_libraries, project_config_jam) env.Requires(built_libraries, toolset_config_jam) install_dir = linktype == 'shared' and env['abs_final_dir'] or env[ 'abs_build_dir'] installed_libraries = [] for library in required_libraries: logger.debug("Install Boost library [{}:{}] to [{}]".format( as_notice(library), as_info( str(_prebuilt_boost_libraries['builder'][sconstruct_id] [variant_key][library])), as_notice(install_dir))) library_node = _prebuilt_boost_libraries['builder'][sconstruct_id][ variant_key][library] logger.trace( "Library Node = \n[{}]\n[{}]\n[{}]\n[{}]\n[{}]".format( as_notice(library_node.path), as_notice(str(library_node)), as_notice(str(library_node.get_binfo().bact)), as_notice(str(library_node.get_state())), as_notice(str(library_node.srcnode())))) installed_library = env.CopyFiles( install_dir, _prebuilt_boost_libraries['builder'] [sconstruct_id][variant_key][library]) installed_libraries.append(installed_library) logger.debug("Boost 'Installed' Libraries = [{}]".format( colour_items(l.path for l in Flatten(installed_libraries)))) return Flatten(installed_libraries)