The Meson Build System http://mesonbuild.com/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

141 lines
4.2 KiB

#!/usr/bin/env python3
# Copyright 2020 Daniel Mensinger
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
# http://www.apache.org/licenses/LICENSE-2.0
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import sys
import hashlib
import textwrap
import re
from pathlib import Path
from datetime import datetime
import typing as T
class DataFile:
file_counter = 0
def __init__(self, path: Path, root: Path):
self.path = path
self.id = self.path.relative_to(root)
self.data_str = f'file_{DataFile.file_counter}_data_' + re.sub('[^a-zA-Z0-9]', '_', self.path.name)
DataFile.file_counter += 1
b = self.path.read_bytes()
self.data = b.decode()
self.sha256sum = hashlib.sha256(b).hexdigest()
def __repr__(self) -> str:
return f'<{type(self).__name__}: [{self.sha256sum}] {self.id}>'
def main() -> int:
root_dir = Path(__file__).resolve().parents[1]
mesonbuild_dir = root_dir / 'mesonbuild'
out_file = mesonbuild_dir / 'mesondata.py'
data_dirs = sorted(mesonbuild_dir.glob('**/data'))
data_files: T.List[DataFile] = []
for d in data_dirs:
for p in sorted(d.iterdir()):
data_files += [DataFile(p, mesonbuild_dir)]
print(f'Found {len(data_files)} data files')
# Generate the data script
data = ''
data += textwrap.dedent(f'''\
# Copyright {datetime.today().year} The Meson development team
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
# http://www.apache.org/licenses/LICENSE-2.0
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
####
#### WARNING: This is an automatically generated file! Do not edit!
#### Generated by {Path(__file__).resolve().relative_to(root_dir)}
####
# TODO: Remember to remove this also from tools/gen_data.py
from pathlib import Path
import typing as T
if T.TYPE_CHECKING:
from .environment import Environment
######################
# BEGIN Data section #
######################
''')
for i in data_files:
data += f"{i.data_str} = '''\\\n{i.data}'''\n\n"
data += textwrap.dedent(f'''
####################
# END Data section #
####################
class DataFile:
def __init__(self, path: Path, sha256sum: str, data: str) -> None:
self.path = path
self.sha256sum = sha256sum
self.data = data
def write_once(self, path: Path) -> None:
if not path.exists():
path.write_text(self.data, encoding='utf-8')
def write_to_private(self, env: 'Environment') -> Path:
out_file = Path(env.scratch_dir) / 'data' / self.path.name
out_file.parent.mkdir(exist_ok=True)
self.write_once(out_file)
return out_file
mesondata = {{
''')
for i in data_files:
data += textwrap.indent(textwrap.dedent(f"""\
'{i.id}': DataFile(
Path('{i.id}'),
'{i.sha256sum}',
{i.data_str},
),
"""), ' ')
data += textwrap.dedent('''\
}
''')
print(f'Updating {out_file}')
out_file.write_text(data, encoding='utf-8')
return 0
if __name__ == '__main__':
sys.exit(main())