Move env_setup to pw_env_setup Bug: 67 Change-Id: I285e917968b2e24e0851753ea4802cef1fbe2d67
diff --git a/.gitignore b/.gitignore index b9b2f70..9c7800a 100644 --- a/.gitignore +++ b/.gitignore
@@ -42,7 +42,7 @@ *_REMOTE_*.txt # Env Setup -env_setup/.setup.sh -env_setup/.env_setup.bat +pw_env_setup/.setup.sh +pw_env_setup/.env_setup.bat .cipd .cargo
diff --git a/README.md b/README.md index cd586ec..a2aa40c 100644 --- a/README.md +++ b/README.md
@@ -20,14 +20,15 @@ ```bash $ git clone sso://pigweed.googlesource.com/pigweed/pigweed ~/pigweed $ cd ~/pigweed -$ env_setup/cipd/wrapper.py auth-login # Once per machine. -$ . env_setup/bootstrap.sh +# Only need to run auth-login once per machine. +$ pw_env_setup/py/pw_env_setup/cipd_setup/wrapper.py auth-login +$ . pw_env_setup/bootstrap.sh ``` -You can use `. env_setup/env_setup.sh` in place of `. env_setup/bootstrap.sh`. +You can use `. pw_env_setup/setup.sh` in place of `. pw_env_setup/bootstrap.sh`. Both should work every time, but `bootstrap.sh` tends to remove and reinstall -things at the expense of time whereas `env_setup.sh` tends to do basic checks -to see if time can be saved by skipping expensive operations. +things at the expense of time whereas `setup.sh` assumes things have +already been installed and only sets environment variables. If you're using Homebrew and you get an error saying `module 'http.client' has no attribute 'HTTPSConnection'` then your
diff --git a/env_setup/cipd/pigweed.json b/env_setup/cipd/pigweed.json index 2c6129b..2ce9f0d 120000 --- a/env_setup/cipd/pigweed.json +++ b/env_setup/cipd/pigweed.json
@@ -1 +1 @@ -../cipd_setup/pigweed.json \ No newline at end of file +../../pw_env_setup/py/pw_env_setup/cipd_setup/pigweed.json \ No newline at end of file
diff --git a/env_setup/virtualenv/requirements.txt b/env_setup/virtualenv/requirements.txt index 3c9f4d0..baf8449 120000 --- a/env_setup/virtualenv/requirements.txt +++ b/env_setup/virtualenv/requirements.txt
@@ -1 +1 @@ -../virtualenv_setup/requirements.txt \ No newline at end of file +../../pw_env_setup/py/pw_env_setup/virtualenv_setup/requirements.txt \ No newline at end of file
diff --git a/env_setup/bootstrap.sh b/pw_env_setup/bootstrap.sh similarity index 100% rename from env_setup/bootstrap.sh rename to pw_env_setup/bootstrap.sh
diff --git a/env_setup/env_setup.bat b/pw_env_setup/env_setup.bat similarity index 74% rename from env_setup/env_setup.bat rename to pw_env_setup/env_setup.bat index d53a74b..7152cc1 100644 --- a/env_setup/env_setup.bat +++ b/pw_env_setup/env_setup.bat
@@ -17,12 +17,12 @@ :: Calls a Powershell script that determines the correct PW_ROOT directory and :: exports it as an environment variable. -for /F "usebackq tokens=1" %%i in (`powershell %%~dp0..\..\env_setup\env_setup.ps1`) do set PW_ROOT=%%i +for /F "usebackq tokens=1" %%i in (`powershell %%~dp0..\..\pw_env_setup\env_setup.ps1`) do set PW_ROOT=%%i -set shell_file="%PW_ROOT%\env_setup\.env_setup.bat" +set shell_file="%PW_ROOT%\pw_env_setup\.env_setup.bat" if not exist %shell_file% ( - call python %PW_ROOT%\env_setup\env_setup.py --pw-root %PW_ROOT% --shell-file %shell_file% + call python %PW_ROOT%\pw_env_setup\py\pw_env_setup\env_setup.py --pw-root %PW_ROOT% --shell-file %shell_file% ) call %shell_file%
diff --git a/env_setup/env_setup.ps1 b/pw_env_setup/env_setup.ps1 similarity index 100% rename from env_setup/env_setup.ps1 rename to pw_env_setup/env_setup.ps1
diff --git a/env_setup/env_setup.sh b/pw_env_setup/env_setup.sh similarity index 90% rename from env_setup/env_setup.sh rename to pw_env_setup/env_setup.sh index 7e5c16f..a9d18e8 100644 --- a/env_setup/env_setup.sh +++ b/pw_env_setup/env_setup.sh
@@ -1,4 +1,4 @@ -# Copyright 2019 The Pigweed Authors +# 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 @@ -36,7 +36,7 @@ PW_ROOT=$(dirname $(dirname $PW_SETUP_SCRIPT_PATH)) export PW_ROOT -SETUP_SH="$PW_ROOT/env_setup/.setup.sh" +SETUP_SH="$PW_ROOT/pw_env_setup/.setup.sh" # Try to use Python 3 if possible by default, before Python 2. if which python3 &> /dev/null; then @@ -50,7 +50,7 @@ [ $(basename $PW_SETUP_SCRIPT_PATH) = "bootstrap.sh" ] || \ [ ! -f $SETUP_SH ] || \ [ ! -s $SETUP_SH ]; then - $PYTHON $PW_ROOT/env_setup/env_setup.py --shell-file $SETUP_SH + $PYTHON $PW_ROOT/pw_env_setup/py/pw_env_setup/env_setup.py --shell-file $SETUP_SH fi . $SETUP_SH
diff --git a/env_setup/__init__.py b/pw_env_setup/py/pw_env_setup/__init__.py similarity index 94% rename from env_setup/__init__.py rename to pw_env_setup/py/pw_env_setup/__init__.py index 2c8334f..1b8f5a8 100644 --- a/env_setup/__init__.py +++ b/pw_env_setup/py/pw_env_setup/__init__.py
@@ -11,3 +11,4 @@ # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations under # the License. +"""Pigweed environment setup."""
diff --git a/env_setup/cargo_setup/__init__.py b/pw_env_setup/py/pw_env_setup/cargo_setup/__init__.py similarity index 92% rename from env_setup/cargo_setup/__init__.py rename to pw_env_setup/py/pw_env_setup/cargo_setup/__init__.py index 28a2a34..101d2f3 100644 --- a/env_setup/cargo_setup/__init__.py +++ b/pw_env_setup/py/pw_env_setup/cargo_setup/__init__.py
@@ -27,8 +27,8 @@ # packages.txt contains packages one per line with two fields: package # name and version. - package_path = os.path.join(pw_root, 'env_setup', 'cargo_setup', - 'packages.txt') + package_path = os.path.join(pw_root, 'pw_env_setup', 'py', 'pw_env_setup', + 'cargo_setup', 'packages.txt') with env(), open(package_path, 'r') as ins: for line in ins: line = line.strip()
diff --git a/env_setup/cargo_setup/packages.txt b/pw_env_setup/py/pw_env_setup/cargo_setup/packages.txt similarity index 100% rename from env_setup/cargo_setup/packages.txt rename to pw_env_setup/py/pw_env_setup/cargo_setup/packages.txt
diff --git a/env_setup/cipd_setup/.cipd_version b/pw_env_setup/py/pw_env_setup/cipd_setup/.cipd_version similarity index 100% rename from env_setup/cipd_setup/.cipd_version rename to pw_env_setup/py/pw_env_setup/cipd_setup/.cipd_version
diff --git a/env_setup/cipd_setup/.cipd_version.digests b/pw_env_setup/py/pw_env_setup/cipd_setup/.cipd_version.digests similarity index 100% rename from env_setup/cipd_setup/.cipd_version.digests rename to pw_env_setup/py/pw_env_setup/cipd_setup/.cipd_version.digests
diff --git a/env_setup/cipd_setup/__init__.py b/pw_env_setup/py/pw_env_setup/cipd_setup/__init__.py similarity index 100% rename from env_setup/cipd_setup/__init__.py rename to pw_env_setup/py/pw_env_setup/cipd_setup/__init__.py
diff --git a/env_setup/cipd_setup/luci.json b/pw_env_setup/py/pw_env_setup/cipd_setup/luci.json similarity index 100% rename from env_setup/cipd_setup/luci.json rename to pw_env_setup/py/pw_env_setup/cipd_setup/luci.json
diff --git a/env_setup/cipd_setup/pigweed.json b/pw_env_setup/py/pw_env_setup/cipd_setup/pigweed.json similarity index 100% rename from env_setup/cipd_setup/pigweed.json rename to pw_env_setup/py/pw_env_setup/cipd_setup/pigweed.json
diff --git a/env_setup/cipd_setup/update.py b/pw_env_setup/py/pw_env_setup/cipd_setup/update.py similarity index 87% rename from env_setup/cipd_setup/update.py rename to pw_env_setup/py/pw_env_setup/cipd_setup/update.py index eee7d34..5d3c4cf 100755 --- a/env_setup/cipd_setup/update.py +++ b/pw_env_setup/py/pw_env_setup/cipd_setup/update.py
@@ -29,25 +29,28 @@ import subprocess import sys -SCRIPT_ROOT = os.path.abspath(os.path.dirname(__file__)) -GIT_ROOT = subprocess.check_output(['git', 'rev-parse', '--show-toplevel'], - cwd=SCRIPT_ROOT).decode('utf-8').strip() - def parse(argv=None): """Parse arguments.""" + script_root = os.path.join(os.environ['PW_ROOT'], 'pw_env_setup', 'py', + 'pw_env_setup', 'cipd_setup') + git_root = subprocess.check_output( + ('git', 'rev-parse', '--show-toplevel'), + cwd=script_root, + ).decode('utf-8').strip() + parser = argparse.ArgumentParser(description=__doc__.splitlines()[0]) parser.add_argument( '--install-dir', dest='root_install_dir', - default=os.path.join(GIT_ROOT, '.cipd'), + default=os.path.join(git_root, '.cipd'), ) parser.add_argument('--package-file', dest='package_files', action='append') parser.add_argument('--cipd', - default=os.path.join(SCRIPT_ROOT, 'wrapper.py')) + default=os.path.join(script_root, 'wrapper.py')) parser.add_argument('--cache-dir', default=os.environ.get( 'CIPD_CACHE_DIR', @@ -111,8 +114,15 @@ env_vars.set('PW_CIPD_INSTALL_DIR', root_install_dir) env_vars.set('CIPD_CACHE_DIR', cache_dir) + pw_root = None + if env_vars: + pw_root = env_vars.get('PW_ROOT', None) + if not pw_root: + pw_root = os.environ['PW_ROOT'] + # Run cipd for each json file. - default_packages = os.path.join(SCRIPT_ROOT, '*.json') + default_packages = os.path.join(pw_root, 'pw_env_setup', 'py', + 'pw_env_setup', 'cipd_setup', '*.json') for package_file in package_files or glob.glob(default_packages): ensure_file = os.path.join( root_install_dir,
diff --git a/env_setup/cipd_setup/wrapper.py b/pw_env_setup/py/pw_env_setup/cipd_setup/wrapper.py similarity index 100% rename from env_setup/cipd_setup/wrapper.py rename to pw_env_setup/py/pw_env_setup/cipd_setup/wrapper.py
diff --git a/env_setup/env_setup.py b/pw_env_setup/py/pw_env_setup/env_setup.py similarity index 71% rename from env_setup/env_setup.py rename to pw_env_setup/py/pw_env_setup/env_setup.py index f3a3622..755c2f3 100755 --- a/env_setup/env_setup.py +++ b/pw_env_setup/py/pw_env_setup/env_setup.py
@@ -25,20 +25,52 @@ from __future__ import print_function import argparse +import copy import glob +import inspect import os import shutil import subprocess import sys -# TODO(mohrr) remove import-error disabling, not sure why pylint has issues -# with it. -import cipd_setup.update # pylint: disable=import-error -import cipd_setup.wrapper # pylint: disable=import-error -import cargo_setup # pylint: disable=import-error -import environment # pylint: disable=import-error -import host_build_setup # pylint: disable=import-error -import virtualenv_setup # pylint: disable=import-error +# TODO(pwbug/67): Remove import hacks once the oxidized prebuilt binaries are +# proven stable for first-time bootstrapping. For now, continue to support +# running directly from source without assuming a functioning Python +# environment when running for the first time. + +# If we're running oxidized, filesystem-centric import hacks won't work. In that +# case, jump straight to the imports and assume oxidation brought in the deps. +if not getattr(sys, 'oxidized', False): + try: + # Even if we're running from source, the user may have a functioning + # Python environment already set up. Prefer using it over hacks. + # pylint: disable=no-name-in-module + from pw_env_setup import cargo_setup + # pylint: enable=no-name-in-module + except ImportError: + old_sys_path = copy.deepcopy(sys.path) + filename = None + if hasattr(sys.modules[__name__], '__file__'): + filename = __file__ + else: + # Try introspection in environments where __file__ is not populated. + filename = inspect.getfile(inspect.currentframe()) + # If none of our strategies worked, the imports are going to fail. + if filename is None: + raise + sys.path.append( + os.path.abspath( + os.path.join(filename, os.path.pardir, os.path.pardir))) + import pw_env_setup # pylint: disable=unused-import + sys.path = old_sys_path + +# pylint: disable=wrong-import-position +from pw_env_setup.cipd_setup import update as cipd_update +from pw_env_setup.cipd_setup import wrapper as cipd_wrapper +from pw_env_setup import cargo_setup +from pw_env_setup import environment +from pw_env_setup import host_build_setup +from pw_env_setup import virtualenv_setup # TODO(mohrr) remove disable=useless-object-inheritance once in Python 3. @@ -49,6 +81,8 @@ super(EnvSetup, self).__init__(*args, **kwargs) self._env = environment.Environment() self._pw_root = pw_root + self._setup_root = os.path.join(pw_root, 'pw_env_setup', 'py', + 'pw_env_setup') self._cipd_cache_dir = cipd_cache_dir self._shell_file = shell_file @@ -82,11 +116,11 @@ def cipd(self): install_dir = os.path.join(self._pw_root, '.cipd') - cipd_client = cipd_setup.wrapper.init(install_dir) + cipd_client = cipd_wrapper.init(install_dir) package_files = glob.glob( - os.path.join(self._pw_root, 'env_setup', 'cipd_setup', '*.json')) - cipd_setup.update.update( + os.path.join(self._setup_root, 'cipd_setup', '*.json')) + cipd_update.update( cipd=cipd_client, root_install_dir=install_dir, package_files=package_files, @@ -101,8 +135,8 @@ venv_path = os.path.join(self._pw_root, '.python3-env') - requirements = os.path.join(self._pw_root, 'env_setup', - 'virtualenv_setup', 'requirements.txt') + requirements = os.path.join(self._setup_root, 'virtualenv_setup', + 'requirements.txt') cipd_bin = os.path.join( self._pw_root,
diff --git a/env_setup/environment.py b/pw_env_setup/py/pw_env_setup/environment.py similarity index 100% rename from env_setup/environment.py rename to pw_env_setup/py/pw_env_setup/environment.py
diff --git a/env_setup/environment_test.py b/pw_env_setup/py/pw_env_setup/environment_test.py similarity index 98% rename from env_setup/environment_test.py rename to pw_env_setup/py/pw_env_setup/environment_test.py index c15e78a..8d083ac 100644 --- a/env_setup/environment_test.py +++ b/pw_env_setup/py/pw_env_setup/environment_test.py
@@ -29,9 +29,7 @@ import tempfile import unittest -# TODO(mohrr) remove import-error disabling, not sure why pylint has issues -# with it. -import environment # pylint: disable=import-error +from pw_env_setup import environment class WrittenEnvFailure(Exception):
diff --git a/env_setup/host_build_setup.py b/pw_env_setup/py/pw_env_setup/host_build_setup.py similarity index 75% rename from env_setup/host_build_setup.py rename to pw_env_setup/py/pw_env_setup/host_build_setup.py index 1bed6b2..b289136 100644 --- a/env_setup/host_build_setup.py +++ b/pw_env_setup/py/pw_env_setup/host_build_setup.py
@@ -20,7 +20,10 @@ def install(pw_root, env): host_dir = os.path.join(pw_root, 'out', 'host') with env(): - subprocess.check_call(['gn', 'gen', host_dir], cwd=pw_root) - subprocess.check_call(['ninja', '-C', host_dir], cwd=pw_root) + try: + subprocess.check_call(['gn', 'gen', host_dir], cwd=pw_root) + subprocess.check_call(['ninja', '-C', host_dir], cwd=pw_root) + except subprocess.CalledProcessError: + env.echo('warning: host tools failed to build') env.prepend('PATH', os.path.join(host_dir, 'host_tools'))
diff --git a/env_setup/virtualenv_setup/__init__.py b/pw_env_setup/py/pw_env_setup/virtualenv_setup/__init__.py similarity index 100% rename from env_setup/virtualenv_setup/__init__.py rename to pw_env_setup/py/pw_env_setup/virtualenv_setup/__init__.py
diff --git a/env_setup/virtualenv_setup/__main__.py b/pw_env_setup/py/pw_env_setup/virtualenv_setup/__main__.py similarity index 84% rename from env_setup/virtualenv_setup/__main__.py rename to pw_env_setup/py/pw_env_setup/virtualenv_setup/__main__.py index e5324c5..385252d 100644 --- a/env_setup/virtualenv_setup/__main__.py +++ b/pw_env_setup/py/pw_env_setup/virtualenv_setup/__main__.py
@@ -17,9 +17,9 @@ import os import sys -# TODO(mohrr) remove import-error disabling, not sure why pylint has issues -# with it. -import install # pylint: disable=import-error +# TODO(pwbug/67) switch back to 'from pw_env_setup import virtualenv_setup'. +# from pw_env_setup import virtualenv_setup +import install as virtualenv_setup # pylint: disable=import-error def _main(): @@ -42,11 +42,7 @@ default=sys.executable, help='Python to use when creating virtualenv.') - try: - install.install(**vars(parser.parse_args())) - except install.GitRepoNotFound: - print('git repository not found', file=sys.stderr) - return -1 + virtualenv_setup.install(**vars(parser.parse_args())) return 0
diff --git a/env_setup/virtualenv_setup/install.py b/pw_env_setup/py/pw_env_setup/virtualenv_setup/install.py similarity index 97% rename from env_setup/virtualenv_setup/install.py rename to pw_env_setup/py/pw_env_setup/virtualenv_setup/install.py index 13733b7..c861369 100644 --- a/env_setup/virtualenv_setup/install.py +++ b/pw_env_setup/py/pw_env_setup/virtualenv_setup/install.py
@@ -101,9 +101,6 @@ setup_py_files = git_list_files('setup.py', '*/setup.py', cwd=pw_root) - # Don't install the env_setup "module". - setup_py_files = [x for x in setup_py_files if b'env_setup' not in x] - # If not forcing full setup, check if all expected packages are installed, # ignoring versions. If they are, skip reinstalling. if not full_envsetup:
diff --git a/env_setup/virtualenv_setup/requirements.in b/pw_env_setup/py/pw_env_setup/virtualenv_setup/requirements.in similarity index 100% rename from env_setup/virtualenv_setup/requirements.in rename to pw_env_setup/py/pw_env_setup/virtualenv_setup/requirements.in
diff --git a/env_setup/virtualenv_setup/requirements.txt b/pw_env_setup/py/pw_env_setup/virtualenv_setup/requirements.txt similarity index 100% rename from env_setup/virtualenv_setup/requirements.txt rename to pw_env_setup/py/pw_env_setup/virtualenv_setup/requirements.txt
diff --git a/env_setup/setup.py b/pw_env_setup/py/setup.py similarity index 92% rename from env_setup/setup.py rename to pw_env_setup/py/setup.py index c203f5f..9cd86f4 100644 --- a/env_setup/setup.py +++ b/pw_env_setup/py/setup.py
@@ -30,7 +30,9 @@ description='Environment setup for Pigweed', packages=setuptools.find_packages(), test_suite='setup.test_suite', - entry_points={'console_scripts': ['_pw_env_setup = env_setup:main']}, + entry_points={ + 'console_scripts': ['_pw_env_setup = pw_env_setup.env_setup:main'], + }, package_data={ 'pw_env_setup': [ 'cargo_setup/packages.txt',
diff --git a/env_setup/setup.sh b/pw_env_setup/setup.sh similarity index 100% rename from env_setup/setup.sh rename to pw_env_setup/setup.sh
diff --git a/pw_presubmit/py/pw_presubmit/pigweed_presubmit.py b/pw_presubmit/py/pw_presubmit/pigweed_presubmit.py index dc3408a..1377b42 100755 --- a/pw_presubmit/py/pw_presubmit/pigweed_presubmit.py +++ b/pw_presubmit/py/pw_presubmit/pigweed_presubmit.py
@@ -51,9 +51,11 @@ # def init_cipd(ctx: PresubmitContext): # TODO(mohrr) invoke by importing rather than by subprocess. - call(sys.executable, - ctx.repository_root.joinpath('env_setup/cipd_setup/update.py'), - '--install-dir', ctx.output_directory) + call( + sys.executable, + ctx.repository_root.joinpath('pw_env_setup', 'py', 'pw_env_setup', + 'cipd_setup', 'update.py'), + '--install-dir', ctx.output_directory) paths = [ctx.output_directory, ctx.output_directory.joinpath('bin')] for base in ctx.output_directory.glob('*'): @@ -68,7 +70,8 @@ def init_virtualenv(ctx: PresubmitContext): """Set up virtualenv, assumes recent Python 3 is already installed.""" - virtualenv_source = ctx.repository_root.joinpath('env_setup', + virtualenv_source = ctx.repository_root.joinpath('pw_env_setup', 'py', + 'pw_env_setup', 'virtualenv_setup') # For speed, don't build the venv if it exists. Use --clean to recreate it.
diff --git a/targets/stm32f429i-disc1/target_docs.rst b/targets/stm32f429i-disc1/target_docs.rst index 906ce55..462bc87 100644 --- a/targets/stm32f429i-disc1/target_docs.rst +++ b/targets/stm32f429i-disc1/target_docs.rst
@@ -45,7 +45,7 @@ .. code:: sh # Setup pigweed environment. - $ . env_setup/setup.sh + $ . pw_env_setup/setup.sh # Run test. $ stm32f429i_disc1_unit_test_runner /path/to/binary @@ -61,7 +61,7 @@ .. code:: sh # Setup Pigweed environment. - $ . env_setup/setup.sh + $ . pw_env_setup/setup.sh # Run test. $ pw test --root out/disco/ --runner stm32f429i_disc1_unit_test_runner