# 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/linux/pkg_config.gni")
import("//third_party/wayland/features.gni")

if (!use_system_libwayland) {
  config("wayland_config") {
    include_dirs = [
      "include/src",
      "include/protocol",
      "src/src",
    ]

    # TODO(thomasanderson): Remove this once
    # https://patchwork.freedesktop.org/patch/242086/ lands.
    cflags = [ "-Wno-macro-redefined" ]
  }

  static_library("wayland_util") {
    sources = [
      "src/src/wayland-util.c",
      "src/src/wayland-util.h",
    ]

    configs -= [ "//build/config/compiler:chromium_code" ]
    configs += [ "//build/config/compiler:no_chromium_code" ]

    public_configs = [ ":wayland_config" ]
  }

  static_library("wayland_private") {
    sources = [
      "src/src/connection.c",
      "src/src/wayland-os.c",
      "src/src/wayland-os.h",
      "src/src/wayland-private.h",
    ]

    configs -= [ "//build/config/compiler:chromium_code" ]
    configs += [
      "//build/config/compiler:no_chromium_code",
      "//build/config/linux/libffi",
      ":wayland_config",
    ]
  }

  static_library("wayland_protocol") {
    sources = [
      "protocol/wayland-protocol.c",
    ]

    deps = [
      ":wayland_util",
    ]

    configs -= [ "//build/config/compiler:chromium_code" ]
    configs += [ "//build/config/compiler:no_chromium_code" ]

    public_configs = [ ":wayland_config" ]
  }

  static_library("wayland_server") {
    sources = [
      "include/protocol/wayland-server-protocol.h",
      "src/src/event-loop.c",
      "src/src/wayland-server.c",
      "src/src/wayland-shm.c",
    ]

    deps = [
      ":wayland_private",
      ":wayland_protocol",
      ":wayland_util",
    ]

    configs -= [ "//build/config/compiler:chromium_code" ]
    configs += [
      "//build/config/compiler:no_chromium_code",
      "//build/config/linux/libffi",
    ]

    public_configs = [ ":wayland_config" ]
  }

  static_library("wayland_client") {
    sources = [
      "include/protocol/wayland-client-protocol.h",
      "src/src/wayland-client.c",
    ]

    deps = [
      ":wayland_private",
      ":wayland_protocol",
      ":wayland_util",
    ]

    configs -= [ "//build/config/compiler:chromium_code" ]
    configs += [
      "//build/config/compiler:no_chromium_code",
      "//build/config/linux/libffi",
    ]

    public_configs = [ ":wayland_config" ]
  }

  config("wayland_scanner_config") {
    cflags = [
      "-Wno-int-conversion",
      "-Wno-implicit-function-declaration",
    ]

    include_dirs = [ "include/" ]
  }

  executable("wayland_scanner") {
    sources = [
      "src/src/scanner.c",
    ]

    deps = [
      ":wayland_util",
      "//third_party/expat:expat",
    ]

    configs -= [ "//build/config/compiler:chromium_code" ]
    configs += [
      "//build/config/compiler:no_chromium_code",
      "//build/config/linux/libffi",
      ":wayland_scanner_config",
    ]
  }
}

if (use_system_libwayland) {
  pkg_config("wayland_client_config") {
    packages = [ "wayland-client" ]
  }

  pkg_config("wayland_server_config") {
    packages = [ "wayland-server" ]
  }

  group("wayland_client") {
    public_configs = [ ":wayland_client_config" ]
  }

  group("wayland_server") {
    public_configs = [ ":wayland_server_config" ]
  }

  group("wayland_util") {
    public_configs = [ ":wayland_client_config" ]
  }
}
