| # Copyright 2021 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("//build_overrides/pigweed.gni") |
| |
| import("$dir_pw_build/python.gni") |
| import("$dir_pw_build/python_action.gni") |
| import("$dir_pw_build/zip.gni") |
| |
| # Builds a directory containing a collection of Python wheels. |
| # |
| # Given one or more pw_python_package targets, this target will build their |
| # .wheel sub-targets along with the .wheel sub-targets of all dependencies, |
| # direct and indirect, as understood by GN. The resulting .whl files will be |
| # collected into a single directory called 'python_wheels'. |
| # |
| # Args: |
| # packages: A list of pw_python_package targets whose wheels should be |
| # included; their dependencies will be pulled in as wheels also. |
| template("pw_python_wheels") { |
| _outer_name = target_name |
| _wheel_paths_path = "${target_gen_dir}/${target_name}_wheel_paths.txt" |
| |
| _deps = [] |
| if (defined(invoker.deps)) { |
| _deps = invoker.deps |
| } |
| |
| _packages = [] |
| foreach(_pkg, invoker.packages) { |
| _pkg_name = get_label_info(_pkg, "label_no_toolchain") |
| _pkg_toolchain = get_label_info(_pkg, "toolchain") |
| _packages += [ "${_pkg_name}.wheel(${_pkg_toolchain})" ] |
| } |
| |
| # Build a list of relative paths containing all the wheels we depend on. |
| generated_file("${target_name}._wheel_paths") { |
| data_keys = [ "pw_python_package_wheels" ] |
| rebase = root_build_dir |
| deps = _packages |
| outputs = [ _wheel_paths_path ] |
| } |
| |
| pw_python_action(target_name) { |
| deps = _deps + [ ":${_outer_name}._wheel_paths" ] |
| module = "pw_build.collect_wheels" |
| |
| args = [ |
| "--prefix", |
| rebase_path(root_build_dir), |
| "--suffix", |
| rebase_path(_wheel_paths_path), |
| "--out_dir", |
| rebase_path("${target_out_dir}/python_wheels"), |
| ] |
| |
| stamp = true |
| } |
| } |
| |
| # Builds a .zip containing Python wheels and setup scripts. |
| # |
| # The resulting .zip archive will contain a directory with Python wheels for |
| # all pw_python_package targets listed in 'packages', plus wheels for any |
| # pw_python_package targets those packages depend on, directly or indirectly, |
| # as understood by GN. |
| # |
| # In addition to Python wheels, the resulting .zip will also contain simple |
| # setup scripts for Linux, MacOS, and Windows that take care of creating a |
| # Python venv and installing all the included wheels into it, and a README.md |
| # file with setup and usage instructions. |
| # |
| # Args: |
| # packages: A list of pw_python_package targets whose wheels should be |
| # included; their dependencies will be pulled in as wheels also. |
| # inputs: An optional list of extra files to include in the generated .zip, |
| # formatted the same was as the 'inputs' argument to pw_zip targets. |
| # dirs: An optional list of directories to include in the generated .zip, |
| # formatted the same way as the 'dirs' argument to pw_zip targets. |
| template("pw_python_zip_with_setup") { |
| _outer_name = target_name |
| _zip_path = "${target_out_dir}/${target_name}.zip" |
| _deps = [] |
| if (defined(invoker.deps)) { |
| _deps = invoker.deps |
| } |
| _inputs = [] |
| if (defined(invoker.inputs)) { |
| _inputs = invoker.inputs |
| } |
| _dirs = [] |
| if (defined(invoker.dirs)) { |
| _dirs = invoker.dirs |
| } |
| |
| pw_python_wheels("${target_name}.wheels") { |
| packages = invoker.packages |
| deps = _deps |
| } |
| |
| pw_zip("${target_name}") { |
| inputs = _inputs + [ |
| "$dir_pw_build/python_dist/setup.bat > /${target_name}/", |
| "$dir_pw_build/python_dist/setup.sh > /${target_name}/", |
| ] |
| |
| dirs = |
| _dirs + |
| [ "${target_out_dir}/python_wheels/ > /${target_name}/python_wheels/" ] |
| |
| output = _zip_path |
| |
| deps = [ ":${_outer_name}.wheels" ] |
| } |
| } |