third_party.pigweed.src/pw_build/copy_from_cipd.gni
Michael Spang da057f7f3c pw_build: Remove instancing of pools across toolchains
The build system uses pools for mutual exclusion. Currently multiple
instances of these pools exist which defeats their purpose.

For example, it can cause concurrent instances of "pip install" which is
not safe.

Bug: 390
No-Docs-Update-Reason: bug fix
Change-Id: I114d2428d747a6d5a68a024a0177343ee82cad76
Reviewed-on: https://pigweed-review.googlesource.com/c/pigweed/pigweed/+/48520
Commit-Queue: Michael Spang <spang@google.com>
Reviewed-by: Wyatt Hepler <hepler@google.com>
2021-06-10 05:57:15 +00:00

100 lines
3.4 KiB
Plaintext

# 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("python_action.gni")
import("target_types.gni")
# Creates a pw_source_set that pulls in a static library hosted in CIPD.
#
# Let's say you have a package with a static library:
# CIPD package path: `pigweed/third_party/libsomething`
# Files:
# ./libsomething/include/something.h
# ./libsomething/libsomething.a
# Installed by your manifest at //tools/my_packages.json.
#
# Your usage might look like this:
#
# import("$dir_pw_build/copy_from_cipd.gni")
#
# # This target links in the .a file.
# pw_cipd_static_library("libsomething") {
# manifest = "//tools/my_packages.json"
# library_path = "libsomething/libsomething.a"
# cipd_package = "pigweed/third_party/libsomething"
# }
#
# # This target needs libsomething.a to be linked in.
# pw_source_set("math_stuff") {
# sources = [ "optimized_math.cc" ]
# ...
# deps = [ ":libsomething" ]
# }
#
# Args:
# manifest: (required) GN-style path to the JSON manifest file that the
# package of interest is defined in.
# library_path: (required) The path of the static library of interest,
# relative to the root where the manifest's CIPD packages were installed to.
# e.g. if the package is installed by pigweed.json, and the .a file is at
# //.environment/cipd/pigweed/libs/libsomething.a, this argument should be
# "libs/libsomething.a".
# cipd_package: (required) The name of the CIPD package. This is the "path" of
# the package in the manifest file.
#
template("pw_cipd_static_library") {
_out_dir = "${target_out_dir}/cipd/$target_name"
_out_relative = rebase_path(_out_dir, root_build_dir)
_out_file = "$_out_dir/${invoker.library_path}"
_manifest_path = rebase_path(invoker.manifest, root_build_dir)
pw_python_action("$target_name.check_copy") {
module = "pw_build.copy_from_cipd"
args = [
"--package-name=${invoker.cipd_package}",
"--manifest=${_manifest_path}",
"--file=${invoker.library_path}",
"--out-dir=${_out_relative}",
]
# Parallel calls might both be invoking CIPD on the same directory which
# might work but is redundant, so serialize calls.
pool = "$dir_pw_build/pool:copy_from_cipd($default_toolchain)"
# TODO(pwbug/335): This should somehow track the actual .a for changes as
# well.
inputs = [ invoker.manifest ]
outputs = [ _out_file ]
python_deps = [ "$dir_pw_build/py" ]
}
pw_source_set(target_name) {
forward_variables_from(invoker,
"*",
[
"manifest",
"library_path",
"cipd_package",
])
if (!defined(libs)) {
libs = []
}
if (!defined(deps)) {
deps = []
}
libs += [ _out_file ]
deps += [ ":$target_name.check_copy" ]
}
}