| # Copyright 2020 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. |
| |
| # gn-format disable |
| import("//build_overrides/pigweed.gni") |
| |
| import("$dir_pw_build/python_script.gni") |
| |
| # Updates a tokenized string database in the source tree with artifacts from one |
| # or more targets. Other database files may also be used. |
| # |
| # The database file must exist. A CSV or binary database can be created with the |
| # pw/pw_tokenizer/database.py tool. An empty CSV database file can be also |
| # created as a starting point. |
| # |
| # Args: |
| # database: source tree path to database file to update; must exist beforehand |
| # targets: GN targets (executables or libraries) from which to add tokens; |
| # these targets are added to deps |
| # optional_targets: GN targets from which to add tokens, if the output files |
| # already exist; these targets are NOT added to deps |
| # input_databases: paths to other database files from which to add tokens |
| # deps: GN targets to build prior to generating the database; artifacts from |
| # these targets are NOT implicitly used for database generation |
| # |
| template("pw_tokenizer_database") { |
| assert(defined(invoker.database), |
| "pw_tokenizer_database requires a 'database' variable") |
| |
| if (defined(invoker.targets)) { |
| _targets = invoker.targets |
| } else { |
| _targets = [] |
| } |
| |
| if (defined(invoker.optional_targets)) { |
| _optional_targets = invoker.optional_targets |
| } else { |
| _optional_targets = [] |
| } |
| |
| if (defined(invoker.input_databases)) { |
| _input_databases = invoker.input_databases |
| } else { |
| _input_databases = [] |
| } |
| |
| assert( |
| _targets != [] || _optional_targets != [] || _input_databases != [], |
| "No 'targets', 'optional_targets', or 'input_databases' were set for " + |
| "pw_tokenizer_database! At least one target or database must be " + |
| "provided as an input.") |
| |
| pw_python_script(target_name) { |
| script = "$dir_pw_tokenizer/py/pw_tokenizer/database.py" |
| args = [ |
| "add", |
| "--database", |
| rebase_path(invoker.database), |
| ] |
| args += rebase_path(_input_databases) |
| |
| foreach(target, _targets) { |
| args += [ "<TARGET_FILE($target)>" ] |
| } |
| |
| # For optional targets, the build outputs may not exist, since they aren't |
| # added to deps. Use TARGET_FILE_IF_EXISTS to handle this. |
| foreach(target, _optional_targets) { |
| args += [ "<TARGET_FILE_IF_EXISTS($target)>" ] |
| } |
| |
| deps = _targets |
| |
| if (defined(invoker.deps)) { |
| deps += invoker.deps |
| } |
| |
| inputs = [ invoker.database ] + _input_databases |
| |
| # Since the output file is in the source tree, create a corresponding stamp |
| # file in the output directory that is independent of the toolchain. That |
| # way, trying to update the database from multiple toolchains is an error. |
| stamp = "$root_build_dir/" + rebase_path(invoker.database, "//") + ".update" |
| } |
| } |