# Copyright 2019 The Fuchsia Authors. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
#    * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#    * Redistributions in binary form must reproduce the above
# copyright notice, this list of conditions and the following disclaimer
# in the documentation and/or other materials provided with the
# distribution.
#    * Neither the name of Google Inc. nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

import("//third_party/wayland/wayland.gni")

group("wayland") {
  public_deps = [
    ":client",
    ":server",
  ]
}

group("client") {
  public_deps = [ ":client_static" ]
}

group("server") {
  public_deps = [ ":server_static" ]
}

group("client_headers") {
  public_configs = [
    ":client_config",
    ":common_config",
  ]
  deps = [
    ":headers_client",
    ":headers_common",
    ":protocol_client",
    ":protocol_client_core",
  ]
}

group("server_headers") {
  public_configs = [
    ":server_config",
    ":common_config",
  ]
  deps = [
    ":headers_common",
    ":headers_server",
    ":protocol_server",
    ":protocol_server_core",
  ]
}

executable("scanner") {
  output_name = "wayland-scanner"
  deps = [ ":scanner_static" ]
}

config("common_config") {
  visibility = [ ":*" ]
  include_dirs = [ "${target_gen_dir}/common" ]
  cflags = [ "-Wno-conversion" ]
}

config("client_config") {
  visibility = [ ":*" ]
  include_dirs = [ "${target_gen_dir}/client" ]
}

config("server_config") {
  visibility = [ ":*" ]
  include_dirs = [ "${target_gen_dir}/server" ]
}

config("private_config") {
  visibility = [ ":*" ]
  configs = [
    ":client_config",
    ":server_config",
    ":common_config",
  ]
  include_dirs = [
    ".",
    "./src",
    "./protocol",
  ]
  defines = [ "_POSIX_C_SOURCE=200809L" ]
  cflags = [ "-pthread" ]

  if (is_clang) {
    cflags += [
      # TODO(36439): Clang introduced a new warning that is raised when we
      # attempt to check the size of an array through sizeof() division. If the
      # type of the sizeof() in the divisor is not the same as that of the array
      # element, a warning is raised.
      "-Wno-unknown-warning-option",
      "-Wno-sizeof-array-div",
    ]
  }
}

source_set("scanner_static") {
  visibility = [ ":*" ]
  deps = [ "//third_party/expat" ]

  if (is_linux) {
    deps += [ "//third_party/libxml2" ]
    defines = [ "HAVE_LIBXML=1" ]
  }

  sources = [
    "protocol/wayland.dtd.c",
    "src/scanner.c",
    "src/wayland-util.c",
  ]

  configs += [ ":private_config" ]
}

source_set("client_static") {
  visibility = [ ":*" ]
  sources = [ "src/wayland-client.c" ]
  deps = [ ":common_static" ]
  public_deps = [ ":client_headers" ]
  configs += [ ":private_config" ]
}

source_set("server_static") {
  visibility = [ ":*" ]
  sources = [ "src/wayland-server.c" ]
  deps = [ ":common_static" ]
  public_deps = [ ":server_headers" ]
  configs += [ ":private_config" ]
}

source_set("common_static") {
  visibility = [ ":*" ]
  sources = [
    "src/connection.c",
    "src/event-loop.c",
    "src/wayland-os.c",
    "src/wayland-util.c",
  ]
  deps = [
    ":protocol_code",
    "//third_party/libffi",
  ]
  public_deps = [
    ":client_headers",
    ":server_headers",
  ]
  configs += [ ":private_config" ]
}

wayland_protocol_code("protocol_code") {
  visibility = [ ":*" ]
  protocol = "protocol/wayland.xml"
  output = "${target_gen_dir}/wayland-protocol.c"
}

wayland_protocol_header("protocol_client") {
  visibility = [ ":*" ]
  protocol = "protocol/wayland.xml"
  variant = "client"
  core = false
  output = "${target_gen_dir}/client/wayland-client-protocol.h"
}

wayland_protocol_header("protocol_client_core") {
  visibility = [ ":*" ]
  protocol = "protocol/wayland.xml"
  variant = "client"
  core = true
  output = "${target_gen_dir}/client/wayland-client-protocol-core.h"
}

wayland_protocol_header("protocol_server") {
  visibility = [ ":*" ]
  protocol = "protocol/wayland.xml"
  variant = "server"
  core = false
  output = "${target_gen_dir}/server/wayland-server-protocol.h"
}

wayland_protocol_header("protocol_server_core") {
  visibility = [ ":*" ]
  protocol = "protocol/wayland.xml"
  variant = "server"
  core = true
  output = "${target_gen_dir}/server/wayland-server-protocol-core.h"
}

copy("headers_common") {
  visibility = [ ":*" ]
  sources = [
    "src/wayland-util.h",
    "src/wayland-version.h",
  ]
  outputs = [ "${target_gen_dir}/common/{{source_file_part}}" ]
}

copy("headers_client") {
  visibility = [ ":*" ]
  sources = [
    "src/wayland-client-core.h",
    "src/wayland-client.h",
  ]
  outputs = [ "${target_gen_dir}/client/{{source_file_part}}" ]
}

copy("headers_server") {
  visibility = [ ":*" ]
  sources = [
    "src/wayland-server-core.h",
    "src/wayland-server.h",
  ]
  outputs = [ "${target_gen_dir}/server/{{source_file_part}}" ]
}
