# Copyright 2014 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# This template makes a stub for a Linux system library that dynamically loads
# it at runtime.

# name: Name to use for the value of the --name arg.
# output_h/output_cc: Names for the generated header/cc file with no dir.
# header: header file to process. Example: "<foo/bar.h>"
# functions: List of strings for functions to process.
# config: (optional) Label of the config generated by pkgconfig.
# bundled_header: (optional)
template("generate_library_loader") {
  output_h = "$root_gen_dir/library_loaders/" + invoker.output_h
  output_cc = "$root_gen_dir/library_loaders/" + invoker.output_cc

  action_visibility = ":$target_name"
  action("${target_name}_loader") {
    visibility = action_visibility

    script = "//tools/generate_library_loader/generate_library_loader.py"
    if (defined(invoker.visibility)) {
      visibility = invoker.visibility
    }

    outputs = [ output_h, output_cc ]

    args = [
      "--name", invoker.name,
      "--output-h", rebase_path(output_h),
      "--output-cc", rebase_path(output_cc),
      "--header", invoker.header,
      # Note GYP build exposes a per-target variable to control this, which, if
      # manually set to true, will disable dlopen(). Its not clear this is
      # needed, so here we just leave off. If this can be done globally, we can
      # expose one switch for this value, otherwise we need to add a template
      # param for this.
      "--link-directly=0",
    ]
    if (defined(invoker.bundled_header)) {
      args += [ "--bundled-header", invoker.bundled_header ]
    }
    args += invoker.functions
  }

  source_set(target_name) {
    if (defined(invoker.config)) {
      direct_dependent_configs = [ invoker.config ]
    }
    sources = [ output_h, output_cc ]
    deps = [ ":${target_name}_loader" ]
  }
}
