Ejemplo n.º 1
0
    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']
Ejemplo n.º 2
0
    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']
Ejemplo n.º 3
0
    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
Ejemplo n.º 4
0
    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']
Ejemplo n.º 5
0
    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
Ejemplo n.º 6
0
    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']
Ejemplo n.º 7
0
    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)
Ejemplo n.º 8
0
    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 )
Ejemplo n.º 9
0
    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)