def METHOD_NAME(self, arch):
    env = self.get_recipe_env(arch)
    recipe_build_dir = self.get_build_dir(arch.arch)
    # Create a subdirectory to actually perform the build
    build_dir = join(recipe_build_dir, self.build_subdir)
    ensure_dir(build_dir)
    # Configure the build
    with current_directory(build_dir):
        if not Path('config.status').exists():
            shprint(sh.Command(join(recipe_build_dir, 'configure')), _env=env)
    with current_directory(recipe_build_dir):
        # Create the Setup file. This copying from Setup.dist is
        # the normal and expected procedure before Python 3.8, but
        # after this the file with default options is already named "Setup"
        setup_dist_location = join('Modules', 'Setup.dist')
        if Path(setup_dist_location).exists():
            shprint(sh.cp, setup_dist_location,
                    join(build_dir, 'Modules', 'Setup'))
        else:
            # Check the expected file does exist
            setup_location = join('Modules', 'Setup')
            if not Path(setup_location).exists():
                raise BuildInterruptingException(
                    SETUP_DIST_NOT_FIND_MESSAGE
                )
        shprint(sh.make, '-j', str(cpu_count()), '-C', build_dir, _env=env)
        # make a copy of the python executable giving it the name we want,
        # because we got different python's executable names depending on
        # the fs being case-insensitive (Mac OS X, Cygwin...) or
        # case-sensitive (linux)...so this way we will have an unique name
        # for our hostpython, regarding the used fs
        for exe_name in ['python.exe', 'python']:
            exe = join(self.get_path_to_python(), exe_name)
            if Path(exe).is_file():
                shprint(sh.cp, exe, self.python_exe)
                break
    self.ctx.hostpython = self.python_exe