# Copyright 2016 The Fuchsia Authors
#
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the "Software"),
# to deal in the Software without restriction, including without limitation
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
# and/or sell copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice (including the next
# paragraph) shall be included in all copies or substantial portions of the
# Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
# IN THE SOFTWARE.

import("../../mesa.gni")

config("util_public_config") {
  include_dirs = [
    "$mesa_build_root/src",
    "$mesa_build_root/src/gallium/auxiliary/",
    "$mesa_build_root/src/gallium/include/",
  ]
}

mesa_source_set("headers") {
  public_configs = [ ":util_public_config" ]

  sources = [
    "bitset.h",
    "debug.h",
    "format_srgb.h",
    "half_float.h",
    "hash_table.h",
    "list.h",
    "macros.h",
    "mesa-sha1.h",
    "ralloc.h",
    "register_allocate.h",
    "rgtc.h",
    "rounding.h",
    "set.h",
    "simple_list.h",
    "sha1/sha1.h",
    "strndup.h",
    "strtod.h",
    "texcompress_rgtc_tmp.h",
    "u_atomic.h",
    "u_vector.h",
    "vma.h",
  ]
}

mesa_source_set("util") {
  include_dirs = [
    "$mesa_build_root/src/util",
    "$mesa_build_root/src/mesa/",
    "$mesa_build_root/src/mapi/",
    "$mesa_build_root/src/gallium/auxiliary/",
  ]

  public_deps = [
    ":gen",
    ":headers",
    "$mesa_build_root/include:c_compat",
  ]

  public_configs = [
    ":util_public_config",
  ]

  sources = [
    "debug.c",
    "half_float.c",
    "hash_table.c",
    "mesa-sha1.c",
    "ralloc.c",
    "register_allocate.c",
    "rgtc.c",
    "set.c",
    "sha1/sha1.c",
    "strtod.c",
    "u_vector.c",
    "vma.c",
  ]
}

action("format_srgb") {
  output_name = "format_srgb.c"
  script_name = "format_srgb.py"

  script = "$mesa_build_root/scripts/gn_script_wrapper.py"

  outputs = [
    "$target_gen_dir/$output_name",
  ]

  inputs = [
    script_name,
  ]

  args = [
    "$magma_python_path",
    rebase_path(target_gen_dir) + "/$output_name",
    rebase_path(".") + "/$script_name",
  ]
}

config("gen_public_config") {
  include_dirs = [ target_gen_dir ]
}

mesa_source_set("gen") {
  public_configs = [ ":gen_public_config" ]

  deps = [
    ":format_srgb",
    "$mesa_build_root/include:c_compat",
  ]

  include_dirs = [ "." ]

  sources = [
    "$target_gen_dir/format_srgb.c",
  ]
}
