blob: fe3c6650bcde4e5e3affd6e76922c9a8759fd695 [file] [log] [blame]
"""
Copyright 2024 Google LLC
SPDX-License-Identifier: MIT
"""
from enum import Enum
class LibraryType(Enum):
Library = 0 # Default undefined library value
LibraryShared = 1
LibraryStatic = 2
class IncludeDirectories:
def __init__(self):
self.name: str = ''
self.dirs: list[str] = []
self.visibility: list[str] = []
class StaticLibrary(IncludeDirectories):
"""
Represents the cc_library_static / cc_library module in build files
"""
def __init__(self):
"""
Attributes here favor a Soong attribute naming scheme
"""
super().__init__()
self.srcs: list[str] = []
self.library_type: LibraryType = (
LibraryType.Library
) # Can be cc_library_static or cc_library_shared
# In Bazel, these headers are one merged list.
self.generated_headers: list[str] = []
self.generated_sources: list[str] = []
# In Bazel, these c options are copts
self.copts: list[str] = []
self.cstd: str = ''
self.cpp_std: str = ''
self.conlyflags: list[str] = []
self.cppflags: list[str] = []
self.deps: list[str] = []
self.target_compatible_with: list[str] = []
self.local_include_dirs: list[str] = []
self.system_include_dirs: list[str] = []
self.static_libs: list[str] = []
self.whole_static_libs: list[str] = []
self.shared_libs: list[str] = []
self.header_libs: list[str] = []
@property
def hdrs(self):
return self.generated_headers + self.generated_sources
def __str__(self):
return f'@StaticLibrary: name: {self.name}, LibraryType: {self.library_type}'
class CustomTarget:
"""
Denoted as genrule in both build files
"""
def __init__(self):
self.name: str = ''
self.srcs: list[str] = []
self.out: list[str] = [] # 'outs' in bazel
self.tools: list[str] = []
self.export_include_dirs: list[str] = []
self.cmd: str = ''
def __str__(self):
return (
f'name: {self.name}\n'
f'srcs: {self.srcs}\n'
f'out: {self.out}\n'
f'tools: {self.tools}\n'
f'export_include_dirs: {self.export_include_dirs}\n'
f'cmd: {self.cmd}'
)
class PythonCustomTarget(CustomTarget):
def __init__(self):
super().__init__()
self.main: str = ''
self.libs: list[str] = []
self.imports: list[str] = []
self.version = {}
def __str__(self):
return (
f'name: {self.name}\n'
f'main: {self.main}\n'
f'srcs: {self.srcs}\n'
f'libs: {self.libs}'
)
class ProjectConfig:
"""
Class that represents a singular project_config within aosp.toml/fuchsia.toml
in python objects. There are multiple project_config within each .toml
file
"""
def __init__(self):
self._build: str = '' # Global across all configs
self._name: str = '' # name of this config
self._inherits_from = ''
# project_config.host_machine
self._cpu_family: str = ''
self._cpu: str = ''
self._host_machine: str = ''
self._build_machine: str = ''
# project_config.meson_options
self._meson_options: dict[str, int | str] = {}
# project_config.header_not_supported
self._headers_not_supported: list[str] = []
# project_config.symbol_not_supported
self._symbols_not_supported: list[str] = []
# project_config.function_not_supported
self._functions_not_supported: list[str] = []
# project_config.link_not_supported
self._links_not_supported: list[str] = []
# project_config.ext_dependencies
self._ext_dependencies: dict[str, list[dict[str, str | int]]] = {}
# Example structure for ext_dependencies
# {
# zlib = [
# {
# 'target_name': '@zlib//:zlib',
# 'target_type': 2
# },
# ...
# ]
@staticmethod
def create_project_config(build, **kwargs):
project_config = ProjectConfig()
project_config._build = build # Global across all configs
project_config._name = kwargs.get('name') # name of this config
project_config._inherits_from = kwargs.get('inherits_from')
project_config._cpu_family = kwargs.get('host_machine').get('cpu_family')
project_config._cpu = kwargs.get('host_machine').get('cpu')
project_config._host_machine = kwargs.get('host_machine').get('host_machine')
project_config._build_machine = kwargs.get('host_machine').get('build_machine')
project_config._meson_options = kwargs.get('meson_options')
project_config._headers_not_supported = kwargs.get('header_not_supported').get(
'headers'
)
project_config._symbols_not_supported = kwargs.get('symbol_not_supported').get(
'symbols'
)
project_config._functions_not_supported = kwargs.get(
'function_not_supported'
).get('functions')
project_config._links_not_supported = kwargs.get('link_not_supported').get(
'links'
)
project_config._ext_dependencies = kwargs.get('ext_dependencies')
return project_config
def extend(self, proj_config):
"""
Appends to the current instance of ProjectConfig with another
This also overrides attributes like self._name to the given param
:param proj_config: ProjectConfig
:return: ProjectConfig
"""
self._build = proj_config.build
self._name = proj_config.name
self._inherits_from = proj_config.inherits_from
self._cpu_family = proj_config.cpu_family
self._cpu = proj_config.cpu
self._host_machine = proj_config.host_machine
self._build_machine = proj_config.build_machine
self._meson_options.update(proj_config.meson_options)
self._headers_not_supported.extend(proj_config.headers_not_supported)
self._symbols_not_supported.extend(proj_config.symbols_not_supported)
self._functions_not_supported.extend(proj_config.functions_not_supported)
self._links_not_supported.extend(proj_config.links_not_supported)
self._ext_dependencies.update(proj_config.ext_dependencies)
return self
def deepcopy(self):
proj = ProjectConfig()
proj._build = self._build
proj._name = self._name
proj._inherits_from = self._inherits_from
proj._cpu_family = self._cpu_family
proj._cpu = self._cpu
proj._host_machine = self._host_machine
proj._build_machine = self._build_machine
proj._meson_options.update(self._meson_options)
proj._headers_not_supported.extend(self._headers_not_supported)
proj._symbols_not_supported.extend(self._symbols_not_supported)
proj._functions_not_supported.extend(self._functions_not_supported)
proj._links_not_supported.extend(self._links_not_supported)
proj._ext_dependencies.update(self._ext_dependencies)
return proj
@property
def build(self):
return self._build
@property
def name(self):
return self._name
@property
def inherits_from(self):
return self._inherits_from
@property
def cpu(self):
return self._cpu
@property
def cpu_family(self):
return self._cpu_family
@property
def host_machine(self):
return self._host_machine
@property
def build_machine(self):
return self._build_machine
@property
def meson_options(self):
return self._meson_options
@property
def headers_not_supported(self):
return self._headers_not_supported
@property
def symbols_not_supported(self):
return self._symbols_not_supported
@property
def functions_not_supported(self):
return self._functions_not_supported
@property
def links_not_supported(self):
return self._links_not_supported
@property
def ext_dependencies(self):
return self._ext_dependencies
def __str__(self):
return f"""
@ProjectConfig: {self._name}
inherits_from: {self._inherits_from}
build: {self._build}
cpu_family: {self._cpu_family}
cpu: {self._cpu}
host_machine: {self._host_machine}
build_machine: {self._build_machine}
meson_options: {self._meson_options}
headers_not_supported: {self._headers_not_supported}
symbols_not_supported: {self._symbols_not_supported}
functions_not_supported: {self._functions_not_supported}
links_not_supported: {self._links_not_supported}
ext_dependencies: {self._ext_dependencies}
"""
class MesonProjectState:
"""
Represents a singular build config
"""
def __init__(self):
self.static_libraries: list[StaticLibrary] = []
self.custom_targets: list[CustomTarget] = []
self.custom_py_targets: list[PythonCustomTarget] = []
self.include_dirs: list[IncludeDirectories] = []
def __str__(self):
return (
f'static libraries len: {len(self.static_libraries)}\n'
f'custom targets len: {len(self.custom_targets)}\n'
f'custom py targets len: {len(self.custom_py_targets)}\n'
f'include dirs len: {len(self.include_dirs)}\n'
)