| # Copyright 2010-2021 Gentoo Authors |
| # Distributed under the terms of the GNU General Public License v2 |
| |
| import collections |
| import operator |
| import types |
| |
| from portage import eapi_is_supported |
| |
| def eapi_has_iuse_defaults(eapi): |
| return eapi != "0" |
| |
| def eapi_has_iuse_effective(eapi): |
| return eapi not in ("0", "1", "2", "3", "4", "4-python", "4-slot-abi") |
| |
| def eapi_has_slot_deps(eapi): |
| return eapi != "0" |
| |
| def eapi_has_slot_operator(eapi): |
| return eapi not in ("0", "1", "2", "3", "4", "4-python") |
| |
| def eapi_has_src_uri_arrows(eapi): |
| return eapi not in ("0", "1") |
| |
| def eapi_has_selective_src_uri_restriction(eapi): |
| return eapi not in ("0", "1", "2", "3", "4", "4-python", "4-slot-abi", |
| "5", "5-progress", "6", "7") |
| |
| def eapi_has_use_deps(eapi): |
| return eapi not in ("0", "1") |
| |
| def eapi_has_strong_blocks(eapi): |
| return eapi not in ("0", "1") |
| |
| def eapi_has_src_prepare_and_src_configure(eapi): |
| return eapi not in ("0", "1") |
| |
| def eapi_supports_prefix(eapi): |
| return eapi not in ("0", "1", "2") |
| |
| def eapi_exports_AA(eapi): |
| return eapi in ("0", "1", "2", "3") |
| |
| def eapi_exports_KV(eapi): |
| return eapi in ("0", "1", "2", "3") |
| |
| def eapi_exports_merge_type(eapi): |
| return eapi not in ("0", "1", "2", "3") |
| |
| def eapi_exports_replace_vars(eapi): |
| return eapi not in ("0", "1", "2", "3") |
| |
| def eapi_exports_EBUILD_PHASE_FUNC(eapi): |
| return eapi not in ("0", "1", "2", "3", "4", "4-python", "4-slot-abi") |
| |
| def eapi_exports_PORTDIR(eapi): |
| return eapi in ("0", "1", "2", "3", "4", "4-python", "4-slot-abi", |
| "5", "5-progress", "6") |
| |
| def eapi_exports_ECLASSDIR(eapi): |
| return eapi in ("0", "1", "2", "3", "4", "4-python", "4-slot-abi", |
| "5", "5-progress", "6") |
| |
| def eapi_exports_REPOSITORY(eapi): |
| return eapi in ("4-python", "5-progress") |
| |
| def eapi_has_pkg_pretend(eapi): |
| return eapi not in ("0", "1", "2", "3") |
| |
| def eapi_has_implicit_rdepend(eapi): |
| return eapi in ("0", "1", "2", "3") |
| |
| def eapi_has_dosed_dohard(eapi): |
| return eapi in ("0", "1", "2", "3") |
| |
| def eapi_has_required_use(eapi): |
| return eapi not in ("0", "1", "2", "3") |
| |
| def eapi_has_required_use_at_most_one_of(eapi): |
| return eapi not in ("0", "1", "2", "3", "4", "4-python", "4-slot-abi") |
| |
| def eapi_has_use_dep_defaults(eapi): |
| return eapi not in ("0", "1", "2", "3") |
| |
| def eapi_requires_posixish_locale(eapi): |
| return eapi not in ("0", "1", "2", "3", "4", "4-python", "4-slot-abi", |
| "5", "5-progress") |
| |
| def eapi_has_repo_deps(eapi): |
| return eapi in ("4-python", "5-progress") |
| |
| def eapi_allows_dots_in_PN(eapi): |
| return eapi in ("4-python", "5-progress") |
| |
| def eapi_allows_dots_in_use_flags(eapi): |
| return eapi in ("4-python", "5-progress") |
| |
| def eapi_supports_stable_use_forcing_and_masking(eapi): |
| return eapi not in ("0", "1", "2", "3", "4", "4-python", "4-slot-abi") |
| |
| def eapi_allows_directories_on_profile_level_and_repository_level(eapi): |
| return eapi not in ("0", "1", "2", "3", "4", "4-slot-abi", "5", "6") |
| |
| def eapi_has_use_aliases(eapi): |
| return eapi in ("4-python", "5-progress") |
| |
| def eapi_has_automatic_unpack_dependencies(eapi): |
| return eapi in ("5-progress",) |
| |
| def eapi_allows_package_provided(eapi): |
| return eapi in ("0", "1", "2", "3", "4", "4-python", "4-slot-abi", |
| "5", "5-progress", "6") |
| |
| def eapi_has_bdepend(eapi): |
| return eapi not in ("0", "1", "2", "3", "4", "4-python", "4-slot-abi", |
| "5", "5-progress", "6") |
| |
| def eapi_has_idepend(eapi): |
| return eapi not in ("0", "1", "2", "3", "4", "4-python", "4-slot-abi", |
| "5", "5-progress", "6", "7") |
| |
| def eapi_empty_groups_always_true(eapi): |
| return eapi in ("0", "1", "2", "3", "4", "4-python", "4-slot-abi", |
| "5", "5-progress", "6") |
| |
| def eapi_path_variables_end_with_trailing_slash(eapi): |
| return eapi in ("0", "1", "2", "3", "4", "4-python", "4-slot-abi", |
| "5", "5-progress", "6") |
| |
| def eapi_has_broot(eapi): |
| return eapi not in ("0", "1", "2", "3", "4", "4-python", "4-slot-abi", |
| "5", "5-progress", "6") |
| |
| def eapi_has_sysroot(eapi): |
| return eapi not in ("0", "1", "2", "3", "4", "4-python", "4-slot-abi", |
| "5", "5-progress", "6") |
| |
| _eapi_attrs = collections.namedtuple('_eapi_attrs', |
| 'allows_package_provided ' |
| 'bdepend ' |
| 'broot ' |
| 'dots_in_PN dots_in_use_flags ' |
| 'exports_AA ' |
| 'exports_EBUILD_PHASE_FUNC ' |
| 'exports_ECLASSDIR ' |
| 'exports_KV ' |
| 'exports_merge_type ' |
| 'exports_PORTDIR ' |
| 'exports_replace_vars ' |
| 'feature_flag_test ' |
| 'idepend iuse_defaults iuse_effective posixish_locale ' |
| 'path_variables_end_with_trailing_slash ' |
| 'prefix ' |
| 'repo_deps required_use required_use_at_most_one_of ' |
| 'selective_src_uri_restriction slot_operator slot_deps ' |
| 'src_uri_arrows strong_blocks use_deps use_dep_defaults ' |
| 'empty_groups_always_true sysroot') |
| |
| |
| _eapi_attr_func_prefixes = ( |
| 'eapi_allows_', |
| 'eapi_has_', |
| 'eapi_requires_', |
| 'eapi_supports_', |
| 'eapi_', |
| ) |
| |
| |
| def _eapi_func_decorator(func, attr_getter): |
| def wrapper(eapi): |
| return attr_getter(_get_eapi_attrs(eapi)) |
| wrapper.func = func |
| wrapper.__doc__ = func.__doc__ |
| return wrapper |
| |
| |
| def _decorate_eapi_funcs(): |
| """ |
| Decorate eapi_* functions so that they use _get_eapi_attrs(eapi) |
| to cache results. |
| """ |
| decorated = {} |
| for k, v in globals().items(): |
| if not (isinstance(v, types.FunctionType) and k.startswith(_eapi_attr_func_prefixes)): |
| continue |
| for prefix in _eapi_attr_func_prefixes: |
| if k.startswith(prefix): |
| attr_name = k[len(prefix):] |
| if hasattr(_eapi_attrs, attr_name): |
| decorated[k] = _eapi_func_decorator(v, operator.attrgetter(attr_name)) |
| break |
| globals().update(decorated) |
| |
| |
| _decorate_eapi_funcs() |
| |
| |
| _eapi_attrs_cache = {} |
| |
| def _get_eapi_attrs(eapi): |
| """ |
| When eapi is None then validation is not as strict, since we want the |
| same to work for multiple EAPIs that may have slightly different rules. |
| An unsupported eapi is handled the same as when eapi is None, which may |
| be helpful for handling of corrupt EAPI metadata in essential functions |
| such as pkgsplit. |
| """ |
| eapi_attrs = _eapi_attrs_cache.get(eapi) |
| if eapi_attrs is not None: |
| return eapi_attrs |
| |
| orig_eapi = eapi |
| if eapi is not None and not eapi_is_supported(eapi): |
| eapi = None |
| |
| eapi_attrs = _eapi_attrs( |
| allows_package_provided=(eapi is None or eapi_allows_package_provided.func(eapi)), |
| bdepend = (eapi is not None and eapi_has_bdepend.func(eapi)), |
| broot = (eapi is None or eapi_has_broot.func(eapi)), |
| dots_in_PN = (eapi is None or eapi_allows_dots_in_PN.func(eapi)), |
| dots_in_use_flags = (eapi is None or eapi_allows_dots_in_use_flags.func(eapi)), |
| empty_groups_always_true = (eapi is not None and eapi_empty_groups_always_true.func(eapi)), |
| exports_AA = (eapi is not None and eapi_exports_AA.func(eapi)), |
| exports_EBUILD_PHASE_FUNC = (eapi is None or eapi_exports_EBUILD_PHASE_FUNC.func(eapi)), |
| exports_ECLASSDIR = (eapi is not None and eapi_exports_ECLASSDIR.func(eapi)), |
| exports_KV = (eapi is not None and eapi_exports_KV.func(eapi)), |
| exports_merge_type = (eapi is None or eapi_exports_merge_type.func(eapi)), |
| exports_PORTDIR = (eapi is None or eapi_exports_PORTDIR.func(eapi)), |
| exports_replace_vars = (eapi is None or eapi_exports_replace_vars.func(eapi)), |
| feature_flag_test = False, |
| idepend = (eapi is not None and eapi_has_idepend.func(eapi)), |
| iuse_defaults = (eapi is None or eapi_has_iuse_defaults.func(eapi)), |
| iuse_effective = (eapi is not None and eapi_has_iuse_effective.func(eapi)), |
| path_variables_end_with_trailing_slash = (eapi is not None and |
| eapi_path_variables_end_with_trailing_slash.func(eapi)), |
| posixish_locale = (eapi is not None and eapi_requires_posixish_locale.func(eapi)), |
| prefix = (eapi is None or eapi_supports_prefix.func(eapi)), |
| repo_deps = (eapi is None or eapi_has_repo_deps.func(eapi)), |
| required_use = (eapi is None or eapi_has_required_use.func(eapi)), |
| required_use_at_most_one_of = (eapi is None or eapi_has_required_use_at_most_one_of.func(eapi)), |
| selective_src_uri_restriction = (eapi is None or eapi_has_selective_src_uri_restriction.func(eapi)), |
| slot_deps = (eapi is None or eapi_has_slot_deps.func(eapi)), |
| slot_operator = (eapi is None or eapi_has_slot_operator.func(eapi)), |
| src_uri_arrows = (eapi is None or eapi_has_src_uri_arrows.func(eapi)), |
| strong_blocks = (eapi is None or eapi_has_strong_blocks.func(eapi)), |
| sysroot = (eapi is None or eapi_has_sysroot.func(eapi)), |
| use_deps = (eapi is None or eapi_has_use_deps.func(eapi)), |
| use_dep_defaults = (eapi is None or eapi_has_use_dep_defaults.func(eapi)) |
| ) |
| |
| _eapi_attrs_cache[orig_eapi] = eapi_attrs |
| return eapi_attrs |