| # Python devshell tools | |
| This directory contains `fx` subcommands written in Python. | |
| These tools are automatically included in builds. | |
| ## Adding a tool | |
| See [fxrev.dev/1080462](https://fxrev.dev/1080462) for an example | |
| of following these instructions. | |
| The following instructions assume you are creating a tool called | |
| `my-new-fx-tool`, which you can replace with the real name of your | |
| tool. | |
| 1. Create a new directory at | |
| `//tools/devshell/python/my-new-fx-tool`. The rest of the | |
| instructions are relative to that directory unless otherwise | |
| specified. | |
| 1. Create an OWNERS file containing your email and any shared owners'. | |
| 1. Create source Python files in this directory. | |
| 1. Create a `tests` directory for your test code. | |
| 1. Create a BUILD.gn file with the following contents: | |
| ```gn | |
| # Copyright 2024 The Fuchsia Authors. All rights reserved. | |
| # Use of this source code is governed by a BSD-style license that can be | |
| # found in the LICENSE file. | |
| import("//build/python/host.gni") | |
| import("//build/python/python_host_test.gni") | |
| ``` | |
| 1. Add a `python_binary` to your BUILD.gn file: | |
| ```gn | |
| python_binary("my-new-fx-tool") { | |
| main_source = "main.py" # Reference main source here | |
| sources = [ "main.py" ] # Sources here | |
| deps = [] # Deps here | |
| } | |
| ``` | |
| 1. Add a target for your tests to BUILD.gn: | |
| ```gn | |
| if (is_host) { | |
| python_host_test("my-new-fx-tool-test") { | |
| main_source = "tests/test_my_new_fx_tool.py" # Test path here | |
| sources = [ | |
| "main.py", # Allow import main. | |
| "tests/test_my_new_fx_tool.py", | |
| ] | |
| } | |
| } | |
| ``` | |
| 1. Add groups for inclusion elsewhere to BUILD.gn: | |
| ```gn | |
| install_python_tool("install") { | |
| name = "my-new-fx-tool" | |
| binary = ":my-new-fx-tool" | |
| } | |
| group("tests") { | |
| testonly = true | |
| deps = [ ":my-new-fx-tool-test($host_toolchain)" ] | |
| } | |
| ``` | |
| 1. Add those groups to `//tools/devshell/python`: | |
| ```gn | |
| group("tests") { | |
| testonly = true | |
| deps = [ | |
| # ... | |
| "my-new-fx-tool:tests", | |
| ] | |
| } | |
| group("install") { | |
| deps = [ | |
| # ... | |
| "my-new-fx-tool:tests", | |
| ] | |
| } | |
| ``` | |
| 1. Add devshell manifest at `//tools/devshell/my-new-fx-tool.fx`, | |
| replacing values in `<>`: | |
| ``` | |
| # Copyright 2024 The Fuchsia Authors. All rights reserved. | |
| # Use of this source code is governed by a BSD-style license that can be | |
| # found in the LICENSE file. | |
| #### CATEGORY=Other <replace with correct category> | |
| #### EXECUTABLE=${HOST_TOOLS_DIR}/my-new-fx-tool | |
| ### <Short description> | |
| ## 'fx my-new-fx-tool --help' for instructions. | |
| ``` | |
| You can now run your tool with `fx my-new-fx-tool`. | |
| ## Running tests | |
| Add the correct labels and execute tests: | |
| ```bash | |
| fx set minimal.x64 --with-test //tools/devshell:tests | |
| fx test --host //tools/devshell | |
| ``` | |