tools: Update picotool package

Change-Id: I4cc629882a8881f292a785704ba7927c23896f37
Reviewed-on: https://pigweed-review.googlesource.com/c/pigweed/experimental/+/111794
Reviewed-by: Erik Gilling <konkers@google.com>
Pigweed-Auto-Submit: Anthony DiGirolamo <tonymd@google.com>
Commit-Queue: Auto-Submit <auto-submit@pigweed.google.com.iam.gserviceaccount.com>
diff --git a/tools/pigweed_experimental_tools/packages/pico_tool.py b/tools/pigweed_experimental_tools/packages/pico_tool.py
index 17960d7..9e73c72 100644
--- a/tools/pigweed_experimental_tools/packages/pico_tool.py
+++ b/tools/pigweed_experimental_tools/packages/pico_tool.py
@@ -13,21 +13,72 @@
 # the License.
 """Install and check status of PicoTool."""
 
+from contextlib import contextmanager
+import logging
+import os
 import pathlib
+from pathlib import Path
+import shlex
+import shutil
+import subprocess
 from typing import Sequence
 
 import pw_package.git_repo
 import pw_package.package_manager
 
+_LOG = logging.getLogger(__package__)
 
-class PicoTool(pw_package.git_repo.GitRepo):
+
+@contextmanager
+def change_working_dir(directory: Path):
+    original_dir = Path.cwd()
+    try:
+        os.chdir(directory)
+        yield directory
+    finally:
+        os.chdir(original_dir)
+
+
+class PicoTool(pw_package.package_manager.Package):
     """Install and check status of PicoTool."""
     def __init__(self, *args, **kwargs):
-        super().__init__(*args,
-                         name='picotool',
-                         url='https://github.com/raspberrypi/picotool.git',
-                         commit='03f28122cc170535f35e5bf8fa37be024489f5eb',
-                         **kwargs)
+        super().__init__(*args, name='picotool', **kwargs)
+
+        self._pico_tool_repo = pw_package.git_repo.GitRepo(
+            name='picotool',
+            url='https://github.com/raspberrypi/picotool.git',
+            commit='03f28122cc170535f35e5bf8fa37be024489f5eb',
+        )
+
+    def install(self, path: Path) -> None:
+        self._pico_tool_repo.install(path)
+
+        env = os.environ.copy()
+        env['PICO_SDK_PATH'] = str(path.parent.absolute() / 'pico_sdk')
+        bootstrap_env_path = Path(env.get('_PW_ACTUAL_ENVIRONMENT_ROOT', ''))
+
+        commands = [
+            'cmake -S ./ -B out/ -G Ninja',
+            'ninja -C out',
+        ]
+
+        with change_working_dir(path) as _picotool_repo:
+            for command in commands:
+                _LOG.info('==> %s', command)
+                subprocess.run(shlex.split(command),
+                               env=env,
+                               capture_output=True,
+                               check=True)
+
+        picotool_bin = path / 'out/picotool'
+        _LOG.info('Done! picotool binary located at:')
+        _LOG.info(picotool_bin)
+
+        if bootstrap_env_path.is_dir() and picotool_bin.is_file():
+            bin_path = bootstrap_env_path / 'cipd/packages/pigweed/bin'
+            destination_path = bin_path / picotool_bin.name
+            _LOG.info('Copy %s -> %s', picotool_bin, destination_path)
+            shutil.copyfile(picotool_bin, destination_path)
 
     def info(self, path: pathlib.Path) -> Sequence[str]:
         return (