# Copyright (c) Meta Platforms, Inc. and affiliates. # # This source code is licensed under both the MIT license found in the # LICENSE-MIT file in the root directory of this source tree and the Apache # License, Version 2.0 found in the LICENSE-APACHE file in the root directory # of this source tree. load("@prelude//utils:platform_flavors_util.bzl", "by_platform") # The ways that Python exectuables handle native linkable dependencies. NativeLinkStrategy = enum( # Statically links extensions into an embedded python binary "native", # Pull transitive native deps in as fully linked standalone shared libraries. # This is typically the fastest build-time link strategy, as it requires no # top-level context and therefore can shared build artifacts with all other # binaries using this strategy. "separate", # Statically link all transitive native deps, which don't have an explicit # dep from non-C/C++ code (e.g. Python), into a monolithic shared library. # Native dep roots, which have an explicit dep from non-C/C++ code, remain # as fully linked standalone shared libraries so that, typically, application # code doesn't need to change to work with this strategy. This strategy # incurs a relatively big build-time cost, but can significantly reduce the # size of native code and number of shared libraries pulled into the binary. "merged", ) PackageStyle = enum( "inplace", "standalone", "inplace_lite", ) PythonToolchainInfo = provider(fields = [ "build_standalone_binaries_locally", "compile", # The interpreter to use to compile bytecode. "host_interpreter", "interpreter", "version", "native_link_strategy", "generate_static_extension_info", "package_style", "make_source_db", "make_source_db_no_deps", "make_pex_inplace", "make_pex_standalone", "make_pex_modules", "pex_executor", "pex_extension", "emit_omnibus_metadata", ]) # Stores "platform"/flavor name used to resolve *platform_* arguments PythonPlatformInfo = provider(fields = [ "name", ]) def get_platform_attr( python_platform_info: "PythonPlatformInfo", cxx_platform_info: "CxxPlatformInfo", xs: [(str.type, "_a")]) -> ["_a"]: """ Take a platform_* value, and the non-platform version, and concat into a list of values based on the cxx/python platform """ python_platform = python_platform_info.name cxx_platform = cxx_platform_info.name return by_platform([python_platform, cxx_platform], xs) python = struct( PythonToolchainInfo = PythonToolchainInfo, PythonPlatformInfo = PythonPlatformInfo, PackageStyle = PackageStyle, NativeLinkStrategy = NativeLinkStrategy, )