blob: b3681b65a142c646a7f94ba0bb3b11d95dea7528 [file] [log] [blame]
#!/usr/bin/env python
# Copyright 2020 The Pigweed Authors
#
# 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
#
# https://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.
"""Generates a BUILD.gn for a Python package.
Pass the script a list of paths to the root directory of a Python package (where
setup.py is).
Don't forget to add the pw_python_package to a top-level group, or it will not
be included in the build.
"""
from datetime import datetime
from pathlib import Path
import sys
from typing import Iterable, List, NamedTuple
from pw_presubmit import git_repo
_HEADER = f"""\
# Copyright {datetime.now().year} The Pigweed Authors
#
# 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
#
# https://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("//build_overrides/pigweed.gni")
import("$dir_pw_build/python.gni")
"""
class PackageFiles(NamedTuple):
setup: List[Path]
sources: List[Path]
tests: List[Path]
other: List[Path]
def _find_package_files(root_dir: Path) -> PackageFiles:
files = git_repo.list_files(pathspecs=('*.py', '*.toml', '*.cfg'),
repo_path=root_dir)
package_files = PackageFiles([], [], [], [])
for file in files:
if file.parent == root_dir:
if file.name == 'setup.py' or file.suffix != '.py':
package_files.setup.append(file)
elif file.stem.startswith('test_') or file.stem.endswith('_test'):
package_files.tests.append(file)
else:
package_files.other.append(file)
else:
package_files.sources.append(file)
return package_files
def _gn_list(name: str, files: Iterable[Path], base: Path) -> Iterable[str]:
if files:
yield f' {name} = ['
for file in files:
yield f' "{file.relative_to(base).as_posix()}",'
yield ' ]'
def generate_build_gn(root_dir: Path):
files = _find_package_files(root_dir)
yield _HEADER
yield 'pw_python_package("py") {'
yield from _gn_list('setup', files.setup, root_dir)
yield from _gn_list('sources', files.sources, root_dir)
yield from _gn_list('tests', files.tests, root_dir)
# Don't include the "other" files for now.
# yield from _gn_list('other', files.other, root_dir)
yield '}'
def main(paths: Iterable[Path]):
for path in paths:
path.joinpath('BUILD.gn').write_text(
'\n'.join(generate_build_gn(path)) + '\n')
if __name__ == '__main__':
if len(sys.argv) > 1:
main(Path(p).resolve() for p in sys.argv[1:])
else:
print(__file__, '', __doc__.strip(), sep='\n', file=sys.stderr)
sys.exit(1)