Add pw_host_tool GN template This change cerates a GN template called pw_host_tool which copies a binary target to a common host_tools directory that can be added to a user's PATH. Change-Id: I9eb38ab4ff9d11a4a87e6be2547d5224370e3412
diff --git a/BUILD.gn b/BUILD.gn index 39a95f6..8b691d9 100644 --- a/BUILD.gn +++ b/BUILD.gn
@@ -26,6 +26,16 @@ # With a test runner, depend on the run targets so they run with the build. deps += [ ":pw_module_tests_run" ] } + if (pw_build_host_tools) { + deps += [ ":host_tools" ] + } +} + +group("host_tools") { + deps = [ + "$dir_pw_target_runner/go:simple_client", + "$dir_pw_target_runner/go:simple_server", + ] } group("pw_facades") {
diff --git a/pw_build/go.gni b/pw_build/go.gni index 86bc4d1..b0433b6 100644 --- a/pw_build/go.gni +++ b/pw_build/go.gni
@@ -125,9 +125,7 @@ pw_exec(_download_target_name) { program = "go" args = [ "get" ] - deps = [ - ":$_deps_metadata_target_name", - ] + deps = [ ":$_deps_metadata_target_name" ] + invoker.deps env = [ "GOPATH=$_default_gopath" ] args_file = _deps_metadata_file
diff --git a/pw_build/host_tool.gni b/pw_build/host_tool.gni new file mode 100644 index 0000000..3011b6e --- /dev/null +++ b/pw_build/host_tool.gni
@@ -0,0 +1,71 @@ +# 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. + +import("python_script.gni") + +if (pw_build_host_tools) { + # Defines a Pigweed host tool and installs it into the host_tools directory. + # + # Args: + # deps: List containing exactly one target which outputs a binary tool. + # name: Optional name for the installed program. Defaults to the name of + # the compiled binary. + template("pw_host_tool") { + assert(defined(invoker.deps), + "pw_host_tool must specify an executable as a dependency") + + num_deps = 0 + foreach(_dep, invoker.deps) { + num_deps += 1 + } + assert(num_deps == 1, "pw_host_tool must have exactly one dependency") + + _host_tools_dir = "$root_out_dir/host_tools" + + # Can't do invoker.deps[0] in GN. + _deps = invoker.deps + _out_target = get_label_info(_deps[0], "target_out_dir") + ":" + + get_label_info(_deps[0], "name") + + _script_args = [ + "--src", + _out_target, + "--dst", + _host_tools_dir, + ] + + if (defined(invoker.name) && invoker.name != "") { + _script_args += [ + "--name", + invoker.name, + ] + } + + pw_python_script(target_name) { + script = "$dir_pw_build/py/host_tool.py" + args = _script_args + deps = _deps + stamp = true + } + } +} else { + # For builds without host tools, create an empty target. + template("pw_host_tool") { + not_needed("*") + not_needed(invoker, "*") + + group(target_name) { + } + } +} # pw_build_host_tools
diff --git a/pw_build/py/host_tool.py b/pw_build/py/host_tool.py new file mode 100644 index 0000000..ca0fbc8 --- /dev/null +++ b/pw_build/py/host_tool.py
@@ -0,0 +1,68 @@ +# 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. +"""Copies built host tools into Pigweed's host_tools directory.""" + +import argparse +import logging +import os +import shutil +import sys +from typing import Optional + +import pw_cli.log + +_LOG = logging.getLogger(__name__) + + +def argument_parser( + parser: Optional[argparse.ArgumentParser] = None +) -> argparse.ArgumentParser: + """Registers the script's arguments on an argument parser.""" + + if parser is None: + parser = argparse.ArgumentParser(description=__doc__) + + parser.add_argument('--dst', + required=True, + help='Path to host tools directory') + parser.add_argument('--name', help='Name for the installed tool') + parser.add_argument('--src', + required=True, + help='Path to host tool executable') + + return parser + + +def main() -> int: + args = argument_parser().parse_args() + + if not os.path.isfile(args.src): + _LOG.error('%s is not a file', args.src) + return 1 + + os.makedirs(args.dst, exist_ok=True) + + if args.name is not None: + if '/' in args.name: + _LOG.error('Host tool name cannot contain "/"') + return 1 + args.dst = os.path.join(args.dst, args.name) + + shutil.copy2(args.src, args.dst) + return 0 + + +if __name__ == '__main__': + pw_cli.log.install() + sys.exit(main())
diff --git a/pw_target_runner/go/BUILD.gn b/pw_target_runner/go/BUILD.gn index 75fd41e..4dad302 100644 --- a/pw_target_runner/go/BUILD.gn +++ b/pw_target_runner/go/BUILD.gn
@@ -13,6 +13,7 @@ # the License. import("$dir_pw_build/go.gni") +import("$dir_pw_build/host_tool.gni") import("$dir_pw_docgen/docs.gni") pw_doc_group("docs") { @@ -21,16 +22,28 @@ ] } -pw_go_executable("simple_client") { +pw_go_executable("pw_target_runner_client") { deps = [ "src/pigweed.dev/pw_target_runner_client", ] package = "pigweed.dev/pw_target_runner_client" } -pw_go_executable("simple_server") { +pw_go_executable("pw_target_runner_server") { deps = [ "src/pigweed.dev/pw_target_runner_server", ] package = "pigweed.dev/pw_target_runner_server" } + +pw_host_tool("simple_client") { + deps = [ + ":pw_target_runner_client", + ] +} + +pw_host_tool("simple_server") { + deps = [ + ":pw_target_runner_server", + ] +}
diff --git a/pw_vars_default.gni b/pw_vars_default.gni index 9572a5d..c5458da 100644 --- a/pw_vars_default.gni +++ b/pw_vars_default.gni
@@ -20,7 +20,7 @@ # importing this file, then changing the variables as desired. # Whether to build host-side tooling. -pw_build_host_tools = true +pw_build_host_tools = false # Options which configure the executable targets created in Pigweed builds. pw_executable_config = {
diff --git a/targets/host/host.gni b/targets/host/host.gni index 47a887b..451852f 100644 --- a/targets/host/host.gni +++ b/targets/host/host.gni
@@ -35,3 +35,5 @@ } else { assert(false, "Please define a host config for your system: $host_os") } + +pw_build_host_tools = true