Example #1
0
 def _execute_action(self, action_name):
     shell.call_without_sleeping([BUILD_SCRIPT_IMPL_PATH] + self.impl_args +
                                 ["--only-execute", action_name],
                                 env=self.impl_env,
                                 echo=self.args.verbose_build)
Example #2
0
    def execute(self):
        """Execute the invocation with the configured arguments."""

        # Convert to a build-script-impl invocation.
        (self.impl_env, self.impl_args) = self.convert_to_impl_arguments()

        # If using the legacy implementation, delegate all behavior to
        # `build-script-impl`.
        if self.args.legacy_impl:
            # Execute the underlying build script implementation.
            shell.call_without_sleeping([BUILD_SCRIPT_IMPL_PATH] +
                                        self.impl_args,
                                        env=self.impl_env,
                                        echo=True)
            return

        # Otherwise, we compute and execute the individual actions ourselves.
        # Compute the list of hosts to operate on.
        all_host_names = [self.args.host_target
                          ] + self.args.cross_compile_hosts
        all_hosts = [
            StdlibDeploymentTarget.get_target_for_name(name)
            for name in all_host_names
        ]

        # Compute the list of lists of product classes to operate on.
        #
        # FIXME: This should really be per-host, but the current structure
        # matches that of `build-script-impl`.
        (product_pipelines, last_impl_index) = self.compute_product_pipelines()

        # Execute each "product pipeline".
        for index in range(len(product_pipelines)):
            perform_epilogue_opts = last_impl_index == index
            pipeline = product_pipelines[index]

            # Skip empty pipelines.
            if len(pipeline) == 0:
                if perform_epilogue_opts:
                    self._execute_merged_host_lipo_core_action()
                continue

            is_impl = pipeline[0].is_build_script_impl_product()
            if is_impl:
                self._execute_impl(pipeline, all_hosts, perform_epilogue_opts)
            else:
                assert (index != last_impl_index)
                # Once we have performed our last impl pipeline, we no longer
                # support cross compilation.
                #
                # This just maintains current behavior.
                if index > last_impl_index:
                    self._execute(pipeline, [self.args.host_target])
                else:
                    self._execute(pipeline, all_host_names)

        # And then perform the rest of the non-core epilogue actions.

        # Extract symbols...
        for host_target in all_hosts:
            self._execute_extract_symbols_action(host_target)

        # Package...
        for host_target in all_hosts:
            self._execute_package_action(host_target)

        # Lipo...
        self._execute_merged_host_lipo_action()