Merge "meson-to-hermetic: Add a global state-tracker and loading of project configs" into main

This commit is contained in:
Brandon Nguyen 2024-08-26 21:28:05 +00:00 committed by Gerrit Code Review
commit 8e6d10e737
5 changed files with 57 additions and 44 deletions

View file

@ -1,8 +1,6 @@
# Copyright 2024 Google LLC
# SPDX-License-Identifier: Apache-2.0
build = 'Soong'
host_machine = 'android'
build_machine = 'linux'
[[project_config]]
name = 'android_aarch64_drivers'
@ -10,6 +8,8 @@ name = 'android_aarch64_drivers'
[project_config.host_machine]
cpu_family = 'aarch64'
cpu = 'aarch64'
host_machine = 'android'
build_machine = 'linux'
[project_config.meson_options]
platforms = 'android'

View file

@ -1,8 +1,6 @@
# Copyright 2024 Google LLC
# SPDX-License-Identifier: Apache-2.0
build = 'bazel'
host_machine = 'fuchsia'
build_machine = 'linux'
[[project_config]]
name = 'fuchsia_aarch64_drivers'
@ -10,6 +8,8 @@ name = 'fuchsia_aarch64_drivers'
[project_config.host_machine]
cpu_family = 'aarch64'
cpu = 'aarch64'
host_machine = 'fuchsia'
build_machine = 'linux'
[project_config.meson_options]
platforms = 'none'

View file

@ -596,6 +596,8 @@ def load_config_file(filename):
global _gCpu
_gCpu = cpu
print(f'Config: cpu={_gCpu}')
case 'host_machine' | 'build_machine':
continue
case _: # Default case
exit(f'Unhandled config key: {key}')

View file

@ -52,7 +52,7 @@ class ProjectConfig:
# project_config.meson_options
self._meson_options: dict[str, int | str] = {}
# project_config.header_not_supported
self._header_not_supported: list[str] = []
self._headers_not_supported: list[str] = []
# project_config.symbol_not_supported
self._symbols_not_supported: list[str] = []
# project_config.function_not_supported
@ -117,6 +117,10 @@ class ProjectConfig:
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
@ -171,17 +175,19 @@ class SoongGenerator(impl.Compiler):
class BazelGenerator(impl.Compiler):
def is_symbol_supported(self, header: str, symbol: str):
if header == 'sys/sysmacros.h':
if header in meson_translator.config.headers_not_supported:
return False
if symbol in meson_translator.config.symbols_not_supported:
return False
return super().is_symbol_supported(header, symbol)
def is_function_supported(self, function):
if function == 'getrandom' or function == 'memfd_create':
if function in meson_translator.config.functions_not_supported:
return False
return super().is_function_supported(function)
def is_link_supported(self, name):
if name == 'strtod has locale support':
if name in meson_translator.config.links_not_supported:
return False
return super().is_link_supported(name)
@ -243,7 +249,7 @@ class BazelPkgConfigModule(impl.PkgConfigModule):
impl.fprint(')')
class MesonAttr(ABC):
class MesonTranslator:
"""
Abstract class that defines all common attributes
between different build systems (Soong, Bazel, etc...)
@ -252,9 +258,10 @@ class MesonAttr(ABC):
def __init__(self):
self._generator = None
self._config_file = None
self._host_machine = ''
self._build_machine = ''
self._build = ''
self._configs: list[ProjectConfig] = []
# TODO(357080225): Fix the use hardcoded state 0
self._state = 0 # index of self._configs
def init_data(self, config_file: str):
self._config_file: str = config_file
@ -272,11 +279,11 @@ class MesonAttr(ABC):
@property
def host_machine(self) -> str:
return self._host_machine
return self._configs[self._state].host_machine
@property
def build_machine(self) -> str:
return self._build_machine
return self._configs[self._state].build_machine
@property
def generator(self) -> impl.Compiler:
@ -286,6 +293,13 @@ class MesonAttr(ABC):
def build(self) -> str:
return self._build
@property
def config(self) -> ProjectConfig:
"""
:return:
"""
return self._configs[self._state]
def is_soong(self):
return self._build.lower() == 'soong'
@ -299,37 +313,32 @@ class MesonAttr(ABC):
"""
To be called after self._config_file has alredy been assigned.
Parses the given config files for common build attributes
Fills the list of all project configs
:return: None
"""
with open(self._config_file, 'rb') as f:
data = tomllib.load(f)
self._build = data.get('build')
self._host_machine = data.get('host_machine')
self._build_machine = data.get('build_machine')
configs = data.get('project_config')
for config in configs:
self._configs.append(
ProjectConfig.create_project_config(self._build, **config)
)
# Declares an empty attribute data class
# metadata is allocated during Generators-runtime (I.E. generate_<host>_build.py)
meson_attr = MesonAttr()
meson = impl.Meson(meson_attr.generator)
host_machine = impl.Machine(meson_attr.host_machine)
build_machine = impl.Machine(meson_attr.build_machine)
meson_translator = MesonTranslator()
_gIncludeDirectories = {}
def load_meson_data(config_file: str):
meson_attr.init_data(config_file)
global meson
global host_machine
global build_machine
meson.set_compiler(meson_attr.generator)
host_machine.set_system(meson_attr.host_machine)
build_machine.set_system(meson_attr.build_machine)
meson_translator.init_data(config_file)
def open_output_file():
impl.open_output_file(meson_attr.get_output_filename())
impl.open_output_file(meson_translator.get_output_filename())
def close_output_file():
@ -337,7 +346,7 @@ def close_output_file():
def load_config_file():
impl.load_config_file(meson_attr.config_file)
impl.load_config_file(meson_translator.config_file)
def add_subdirs_to_set(dir_, dir_set):
@ -349,7 +358,7 @@ def add_subdirs_to_set(dir_, dir_set):
def include_directories(*paths, is_system=False):
if meson_attr.host_machine == 'android':
if meson_translator.host_machine == 'android':
return impl.IncludeDirectories('', impl.get_include_dirs(paths))
# elif host_machine == 'fuchsia'
dirs = impl.get_include_dirs(paths)
@ -398,15 +407,15 @@ def include_directories(*paths, is_system=False):
def module_import(name: str):
if name == 'python':
return impl.PythonModule()
if name == 'pkgconfig' and meson_attr.host_machine.lower() == 'fuchsia':
if name == 'pkgconfig' and meson_translator.host_machine.lower() == 'fuchsia':
return BazelPkgConfigModule()
if name == 'pkgconfig' and meson_attr.host_machine.lower() == 'android':
if name == 'pkgconfig' and meson_translator.host_machine.lower() == 'android':
return impl.PkgConfigModule()
exit(f'Unhandled module: {name}')
def load_dependencies():
impl.load_dependencies(meson_attr.config_file)
impl.load_dependencies(meson_translator.config_file)
def dependency(
@ -485,7 +494,7 @@ def static_library(
link_with=link_with,
link_whole=link_whole,
builtin_type_name='cc_library_static',
static=meson_attr.is_bazel(),
static=meson_translator.is_bazel(),
)
return impl.StaticLibrary(target_name, link_with=link_with, link_whole=link_whole)
@ -519,7 +528,7 @@ def _get_sources(input_sources, sources, generated_sources, generated_headers):
if type(source) is list:
_get_sources(source, sources, generated_sources, generated_headers)
elif type(source) is impl.CustomTarget or type(source) is impl.CustomTargetItem:
if meson_attr.is_bazel():
if meson_translator.is_bazel():
generate_sources_fuchsia(source)
else: # is_soong
generate_sources_android(source)
@ -851,7 +860,7 @@ def _emit_builtin_target(
builtin_type_name='',
static=False,
):
if meson_attr.is_bazel():
if meson_translator.is_bazel():
_emit_builtin_target_fuchsia(
target_name,
*source,
@ -863,7 +872,7 @@ def _emit_builtin_target(
link_whole=link_whole,
static=static,
)
else: # meson_attr.is_soong()
else: # meson_translator.is_soong()
_emit_builtin_target_android(
target_name,
*source,
@ -976,7 +985,7 @@ def _get_command_args(
obfuscate_suffix='',
):
args = []
gendir = 'GENDIR' if meson_attr.is_bazel() else 'genDir'
gendir = 'GENDIR' if meson_translator.is_bazel() else 'genDir'
for command_item in command[1:]:
if isinstance(command_item, list):
for item in command_item:
@ -1032,7 +1041,7 @@ def _get_command_args(
args.append(f'$({gendir})' + '/' + impl.get_relative_dir())
continue
if meson_attr.is_bazel():
if meson_translator.is_bazel():
match = re.match(r'@PROJECT_BUILD_ROOT@(.*)', command_item)
if match is not None:
args.append(f'$({gendir}){match.group(1)}')
@ -1096,7 +1105,7 @@ def _process_wrapped_args_for_python(
args = impl.replace_wrapped_input_with_target(
wrapped_args, python_script, python_script_target_name
)
if meson_attr.is_bazel():
if meson_translator.is_bazel():
return args
# else is_soong():
python_path = 'PYTHONPATH='
@ -1165,7 +1174,7 @@ def custom_target(
if python_script != '':
python_script_target_name = target_name + '_' + os.path.basename(python_script)
srcs = [python_script] + impl.get_list_of_relative_inputs(depend_files)
if meson_attr.is_soong():
if meson_translator.is_soong():
impl.fprint('python_binary_host {')
impl.fprint(' name: "%s",' % python_script_target_name)
impl.fprint(' main: "%s",' % python_script)
@ -1210,7 +1219,7 @@ def custom_target(
relative_inputs.extend(impl.get_list_of_relative_inputs(depend_files))
relative_inputs_set = set()
if meson_attr.is_soong():
if meson_translator.is_soong():
for src in relative_inputs:
relative_inputs_set.add(src)
@ -1225,7 +1234,7 @@ def custom_target(
generates_h = False
generates_c = False
custom_target_ = None
if meson_attr.is_soong():
if meson_translator.is_soong():
# Soong requires genrule to generate only headers OR non-headers
for out in relative_outputs:
if _is_header(out):
@ -1240,7 +1249,7 @@ def custom_target(
program_command = program.command
if meson_attr.is_soong():
if meson_translator.is_soong():
if program_command == 'bison':
program_command_arg = 'M4=$(location m4) $(location bison)'
elif program_command == 'flex':

View file

@ -32,7 +32,6 @@ if __name__ == "__main__":
case _:
exit(f'Unhandled arg={flag} with value={value}')
###
### These definitions must be inside the module
def get_variable(name: str):
@ -42,6 +41,9 @@ def get_variable(name: str):
### Load Metadata
load_meson_data(config_path)
meson = impl.Meson(meson_translator.generator)
host_machine = impl.Machine(meson_translator.host_machine)
build_machine = impl.Machine(meson_translator.build_machine)
### Open the build definition file
open_output_file()