# # Copyright 2021 Google, Inc. # # 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: # # http://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. # # Generate pybind11 source files + headers # # Parameters: # include: Base include path (i.e. bt/gd) # source_root: Root of source relative to current BUILD.gn # sources: PDL files to use for generation. # shards [optional]: Shard generated source into N files. # Default = 0. Max = 10. template("packetgen_py") { action_name = "${target_name}_gen" all_dependent_config_name = "_${target_name}_all_dependent_config" config(all_dependent_config_name) { include_dirs = [ "${root_gen_dir}" ] } action(action_name) { forward_variables_from(invoker, [ "sources", "include", "shards", "source_root" ]) assert(defined(sources), "sources must be set") assert(defined(include), "include must be set") assert(defined(source_root), "source root must be set") outdir = rebase_path(root_gen_dir) source_root = rebase_path(source_root) # Set shards cmd shards_cmd = "" outputs = [] source_args = [] if (defined(shards)) { shards_list = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"] foreach (source, sources) { rel_source = rebase_path(source, ".") source_args += [ rebase_path(source, source_root) ] shards_cmd = "--num_shards=${shards}" # TODO - GN reference doesn't explain how to programatically create # a range (i.e. range(shards)) so we use a fixed list and foreach loop to # work around it. assert(shards <= 10, "Maximum supported shards is 10.") index = 0 outputs += [ string_replace("${outdir}/${rel_source}_python3.cc", ".pdl", "") ] foreach(num, shards_list) { if (index < shards) { outputs += [ string_replace("${outdir}/${rel_source}_python3_shard_${num}.cc", ".pdl", "") ] } index = index + 1 } } } script = "//common-mk/file_generator_wrapper.py" binfile = "${root_out_dir}/bluetooth_packetgen" args = [ binfile, "--include=${include}", "--out=${outdir}", "--source_root=${source_root}", shards_cmd, ] + source_args } # TODO: Make building with python-dev work. # source_set(target_name) { # sources = get_target_outputs(":${action_name}") # deps = [":${action_name}"] # all_dependent_configs = [":${all_dependent_config_name}"] # if (defined(invoker.all_dependent_configs)) { # all_dependent_configs += invoker.all_dependent_configs # } # if (defined(invoker.configs)) { # configs += invoker.configs # } # } } # Generate single c++ headers for each pdl # # Parameters: # include: Base include path (i.e. bt/gd) # source_root: Root of source relative to current BUILD.gn # sources: PDL files to use for generation. template("packetgen_headers") { all_dependent_config_name = "_${target_name}_all_dependent_config" config(all_dependent_config_name) { include_dirs = [ "${root_gen_dir}" ] } action(target_name) { forward_variables_from(invoker, [ "include", "sources", "source_root" ]) assert(defined(sources), "sources must be set") assert(defined(include), "include must be set") assert(defined(source_root), "source root must be set") outdir = rebase_path(root_gen_dir) source_root = rebase_path(source_root) script = "//common-mk/file_generator_wrapper.py" binfile = "${root_out_dir}/bluetooth_packetgen" args = [ binfile, "--include=${include}", "--out=${outdir}", "--source_root=${source_root}", ] outputs = [] foreach (source, sources) { rel_source = rebase_path(source, ".") args += [ rebase_path(source, source_root) ] outputs += [ string_replace("${outdir}/${rel_source}.h", ".pdl", "") ] } all_dependent_configs = [ ":${all_dependent_config_name}" ] if (defined(invoker.all_dependent_configs)) { all_dependent_configs += invoker.all_dependent_configs } if (defined(invoker.configs)) { configs += invoker.configs } } } # Generate single Rust files for each pdl # # Parameters: # include: Base include path (i.e. bt/gd) # source_root: Root of source relative to current BUILD.gn # sources: PDL files to use for generation. template("packetgen_rust") { action_name = "${target_name}_gen" all_dependent_config_name = "_${target_name}_all_dependent_config" config(all_dependent_config_name) { include_dirs = [ "${root_gen_dir}" ] } action(action_name) { forward_variables_from(invoker, [ "include", "sources", "source_root" ]) assert(defined(sources), "sources must be set") assert(defined(include), "include must be set") assert(defined(source_root), "source root must be set") outdir = rebase_path(root_gen_dir) source_root = rebase_path(source_root) script = "//common-mk/file_generator_wrapper.py" binfile = "${root_out_dir}/bluetooth_packetgen" args = [ binfile, "--include=${include}", "--out=${outdir}", "--source_root=${source_root}", "--rust", ] outputs = [] foreach (source, sources) { rel_source = rebase_path(source, ".") args += [ rebase_path(source, source_root) ] outputs += [ string_replace("${outdir}/${rel_source}.rs", ".pdl", "") ] } } # TODO: Rust source_set is not supported by gn. # source_set(target_name) { # sources = get_target_outputs(":${action_name}") # deps = [ ":${action_name}" ] # all_dependent_configs = [":${all_dependent_config_name}"] # if (defined(invoker.all_dependent_configs)) { # all_dependent_configs += invoker.all_dependent_configs # } # if (defined(invoker.configs)) { # configs += invoker.configs # } # } }