# 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" ]
}

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" ]
}

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

  sources = [
    "src/dtddata.S",
    "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 = [
    "${target_gen_dir}/wayland-protocol.c",
    "src/connection.c",
    "src/event-loop.c",
    "src/wayland-os.c",
    "src/wayland-util.c",
  ]
  deps = [
    ":protocol_client",
    ":protocol_client_core",
    ":protocol_code",
    ":protocol_server",
    ":protocol_server_core",
    "//third_party/libffi",
  ]
  configs += [ ":private_config" ]
}

wayland_protocol_code("protocol_code") {
  protocol = "protocol/wayland.xml"
  output = "${target_gen_dir}/wayland-protocol.c"
}

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

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

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

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

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

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

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