# Copyright 2015 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.

import("//build/config/nacl/config.gni")
import("//build/config/nacl/rules.gni")

if (current_toolchain == default_toolchain) {
  chromevox_test_data_dir = "$root_build_dir/chromevox_test_data/braille"

  # Build Liblouis library
  #
  # This target is used to build and assemble Liblouis braille translator.
  #
  # Variables:
  #   dest_dir: destination path for all translator files
  #   deps: private linked dependencies
  #   testonly: a target must only be used for testing
  template("liblouis_library") {
    assert(defined(invoker.dest_dir), "Must define dest_dir")
    forward_variables_from(invoker, [ "dest_dir" ])

    tables_json_target_name = "${target_name}_tables_json"
    wasm_target_name = "${target_name}_wasm"
    final_target_name = target_name

    copy(tables_json_target_name) {
      forward_variables_from(invoker, [ "testonly" ])
      visibility = [ ":$final_target_name" ]
      sources = [
        "tables.json",
      ]
      outputs = [
        "$dest_dir/{{source_file_part}}",
      ]
    }

    copy(wasm_target_name) {
      forward_variables_from(invoker, [ "testonly" ])
      visibility = [ ":$final_target_name" ]
      sources = [
        "wasm/liblouis_wasm.data",
        "wasm/liblouis_wasm.js",
        "wasm/liblouis_wasm.wasm",
        "wasm/liblouis_wrapper.js",
      ]
      outputs = [
        "$dest_dir/{{source_file_part}}",
      ]
    }

    group(target_name) {
      forward_variables_from(invoker, [ "testonly" ])
      deps = [
        ":$tables_json_target_name",
        ":$wasm_target_name",
      ]
      if (defined(invoker.deps)) {
        deps += invoker.deps
      }
    }
  }

  liblouis_library("liblouis") {
    dest_dir = "$root_build_dir/resources/chromeos/chromevox/braille"
  }

  liblouis_library("liblouis_test_data") {
    testonly = true
    dest_dir = chromevox_test_data_dir
    deps = [
      ":liblouis_test_files",
    ]
  }

  copy("liblouis_test_files") {
    visibility = [ ":liblouis_test_data" ]
    testonly = true
    sources = [
      "//chrome/test/data/chromeos/liblouis_wasm/manifest.json",
      "//chrome/test/data/chromeos/liblouis_wasm/test.js",
    ]
    outputs = [
      "${chromevox_test_data_dir}/{{source_file_part}}",
    ]
  }
}
