blob: ee425d462cea5b7b950513aeb4c44e3104fa807d [file] [log] [blame]
# Copyright 2019 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.
"""Sets up a Python 3 virtualenv for Pigweed."""
import argparse
import subprocess
import venv
import os
import shlex
import sys
from typing import Sequence
def git_stdout(*args, **kwargs) -> str:
return subprocess.run(('git', *args),
stdout=subprocess.PIPE,
check=True,
**kwargs).stdout.decode().strip()
def git_list_files(*args, **kwargs) -> Sequence[str]:
return git_stdout('ls-files', *args, **kwargs).split()
def git_repo_root(path: str = './') -> str:
return git_stdout('-C', path, 'rev-parse', '--show-toplevel')
def init(venv_path, requirements=()) -> None:
"""Creates a venv and installs all packages in this Git repo."""
print('Creating venv at', venv_path)
venv.create(venv_path, clear=True, with_pip=True)
venv_python = os.path.join(venv_path, 'bin', 'python')
def pip_install(*args):
cmd = venv_python, '-m', 'pip', 'install', *args
print(shlex.join(cmd))
return subprocess.run(cmd, check=True)
pip_install('--upgrade', 'pip')
package_args = tuple(f'--editable={os.path.dirname(path)}'
for path in git_list_files(
'setup.py', '*/setup.py', cwd=git_repo_root()))
requirement_args = tuple(f'--requirement={req}' for req in requirements)
pip_install('--log', os.path.join(venv_path, 'pip.log'), *requirement_args,
*package_args)
def _main() -> None:
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument('--venv_path',
required=True,
help='Path at which to create the venv')
parser.add_argument('-r',
'--requirements',
default=[],
action='append',
help='requirements.txt files to install')
init(**vars(parser.parse_args()))
if __name__ == '__main__':
_main()