blob: 9514b942b356568d340287604fca59aa93297a67 [file] [log] [blame]
# 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, root_build_dir),
"--suffix",
rebase_path(_wheel_paths_path, root_build_dir),
"--out_dir",
rebase_path("${target_out_dir}/python_wheels", root_build_dir),
]
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" ]
}
}