pw_env_setup: Add PW_PACKAGE_ROOT variable

Add a PW_PACKAGE_ROOT environment variable but don't use it yet. Will
need to wait a bit to ensure people have rerun bootstrap after this CL
lands before using this variable.

Bug: b/240707084
Change-Id: I154e1533b0094dff1e2d8d8884383da348c4fc14
Reviewed-on: https://pigweed-review.googlesource.com/c/pigweed/pigweed/+/103882
Reviewed-by: Armando Montanez <amontanez@google.com>
Commit-Queue: Auto-Submit <auto-submit@pigweed.google.com.iam.gserviceaccount.com>
Pigweed-Auto-Submit: Rob Mohr <mohrr@google.com>
diff --git a/pw_cli/py/pw_cli/env.py b/pw_cli/py/pw_cli/env.py
index 68f3cf5..24eeb0d 100644
--- a/pw_cli/py/pw_cli/env.py
+++ b/pw_cli/py/pw_cli/env.py
@@ -34,6 +34,7 @@
                    type=envparse.strict_bool,
                    default=False)
     parser.add_var('PW_ENVIRONMENT_ROOT')
+    parser.add_var('PW_PACKAGE_ROOT')
     parser.add_var('PW_PROJECT_ROOT')
     parser.add_var('PW_ROOT')
     parser.add_var('PW_SKIP_BOOTSTRAP')
diff --git a/pw_env_setup/docs.rst b/pw_env_setup/docs.rst
index baaf827..8016442 100644
--- a/pw_env_setup/docs.rst
+++ b/pw_env_setup/docs.rst
@@ -468,6 +468,9 @@
   all-caps version of the basename of the package file, without the extension.
   (E.g., "path/foo.json" becomes ``PW_FOO_CIPD_INSTALL_DIR``.)
 
+``PW_PACKAGE_ROOT``
+  Location that packages installed by ``pw package`` will be installed to.
+
 ``VIRTUAL_ENV``
   Path to Pigweed's virtualenv.
 
@@ -522,6 +525,7 @@
     dir_cipd_pigweed = "<pigweed-root>/.environment/cipd/packages/pigweed"
     dir_cipd_luci = "<pigweed-root>/.environment/cipd/packages/luci"
     dir_virtual_env = "<pigweed-root>/.environment/pigweed-venv"
+    dir_pw_package_root = "<pigweed-root>/.environment/packages"
   }
 
 It's straightforward to use these variables.
diff --git a/pw_env_setup/py/pw_env_setup/env_setup.py b/pw_env_setup/py/pw_env_setup/env_setup.py
index c454591..8035dca 100755
--- a/pw_env_setup/py/pw_env_setup/env_setup.py
+++ b/pw_env_setup/py/pw_env_setup/env_setup.py
@@ -625,18 +625,20 @@
 
         result = result_func()
 
+        pkg_dir = os.path.join(self._install_dir, 'packages')
+        self._env.set('PW_PACKAGE_ROOT', pkg_dir)
+
+        if not os.path.isdir(pkg_dir):
+            os.makedirs(pkg_dir)
+
         if not self._pw_packages:
             return result(_Result.Status.SKIPPED)
 
-        logdir = os.path.join(self._install_dir, 'packages')
-        if not os.path.isdir(logdir):
-            os.makedirs(logdir)
-
         for pkg in self._pw_packages:
             print('installing {}'.format(pkg))
             cmd = ['pw', 'package', 'install', pkg]
 
-            log = os.path.join(logdir, '{}.log'.format(pkg))
+            log = os.path.join(pkg_dir, '{}.log'.format(pkg))
             try:
                 with open(log, 'w') as outs, self._env():
                     print(*cmd, file=outs)
diff --git a/pw_env_setup/py/pw_env_setup/gni_visitor.py b/pw_env_setup/py/pw_env_setup/gni_visitor.py
index 03121a0..3836232 100644
--- a/pw_env_setup/py/pw_env_setup/gni_visitor.py
+++ b/pw_env_setup/py/pw_env_setup/gni_visitor.py
@@ -80,6 +80,10 @@
             self._lines.append('  dir_virtual_env = "{}"'.format(
                 self._abspath_to_gn_path(set.value)))
 
+        if set.name == 'PW_PACKAGE_ROOT':
+            self._lines.append('  dir_pw_package_root = "{}"'.format(
+                self._abspath_to_gn_path(set.value)))
+
     def visit_clear(self, clear):
         pass
 
diff --git a/pw_package/py/pw_package/package_manager.py b/pw_package/py/pw_package/package_manager.py
index 1254121..d1cebac 100644
--- a/pw_package/py/pw_package/package_manager.py
+++ b/pw_package/py/pw_package/package_manager.py
@@ -178,6 +178,7 @@
         '-e',
         dest='pkg_root',
         type=pathlib.Path,
+        # TODO(b/240707084) Replace with PW_PACKAGE_ROOT.
         default=(pathlib.Path(os.environ['_PW_ACTUAL_ENVIRONMENT_ROOT']) /
                  'packages'),
     )