blob: 244ccf5b91ccce0730df66d0738eaba988817b0a [file] [log] [blame]
#!/usr/bin/env python3
# Copyright 2025 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import os
import pathlib
import subprocess
from typing import Optional
_CURRENT_DIR = pathlib.Path(__file__).parent
_OUT_OF_DATE_ERROR = """libcxx_headers.gni and third_party/libc++ are out of sync.
If you were messing around with the libc++ repository, run:
`buildtools/third_party/libc++/generate_libcxx_headers.py`
If the script doesn't resolve the error, file a bug to msta@ with reproduction details.
""".replace('\n', '$0x0A')
def _get_headers(include_dir: pathlib.Path) -> list[str]:
headers = []
for (dirpath, _, filenames) in os.walk(include_dir):
dirpath = pathlib.Path(dirpath).relative_to(include_dir)
for f in filenames:
path = dirpath / f
if f != 'CMakeLists.txt' and '__cxx03' not in path.parts:
headers.append(str(path))
headers.sort()
return headers
def _get_libcxx_revision(path: pathlib.Path) -> Optional[str]:
# On CoG this command will fail because libcxx is not a git repository.
ps = subprocess.run(
['git', 'rev-parse', 'HEAD'],
cwd=path,
check=False,
stdout=subprocess.PIPE,
text=True,
)
if ps.returncode == 0:
return ps.stdout.strip()
def _write_headers(path: pathlib.Path, headers: list[str],
libcxx_revision: Optional[str]):
lines = [f' "//third_party/libc++/src/include/{hdr}",' for hdr in headers]
header_lines = '\n'.join(lines)
if libcxx_revision is None:
assertion = ''
else:
assertion = f"""
assert(
libcxx_revision == "{libcxx_revision}",
"{_OUT_OF_DATE_ERROR}")
"""
path.write_text(f"""# Copyright 2025 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
# DO NOT EDIT. This file is generated.
# This file should automatically be generated by the auto-roller.
# https://autoroll.skia.org/r/libcxx-chromium
# To manually regenerate, run:
# buildtools/third_party/libc++/generate_libcxx_headers.py
import("//buildtools/deps_revisions.gni")
{assertion}
libcxx_headers = [
{header_lines}
]
""")
if __name__ == '__main__':
libcxx = _CURRENT_DIR / '../../../third_party/libc++/src'
_write_headers(
_CURRENT_DIR / 'libcxx_headers.gni',
_get_headers(libcxx / 'include'),
_get_libcxx_revision(libcxx),
)