# 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")

assert(is_linux)

declare_args() {
  # Controls whether the build should use the version of minigbm library
  # shipped with the system. In release builds of Chrome OS we use the
  # system version, but when building on dev workstations or the Chrome
  # waterfall we bundle it because Ubuntu doesn't ship a usable version.
  use_system_minigbm = false

  use_amdgpu_minigbm = false
  use_exynos_minigbm = false
  use_intel_minigbm = false
  use_marvell_minigbm = false
  use_mediatek_minigbm = false
  use_meson_minigbm = false
  use_msm_minigbm = false
  use_radeon_minigbm = false
  use_rockchip_minigbm = false
  use_tegra_minigbm = false
  use_vc4_minigbm = false
}

if (!use_system_minigbm) {
  config("minigbm_config") {
    include_dirs = [ "src" ]
    defines = []
    if (use_amdgpu_minigbm) {
      defines += [ "DRV_AMDGPU" ]
    }
    if (use_exynos_minigbm) {
      defines += [ "DRV_EXYNOS" ]
    }
    if (use_intel_minigbm) {
      defines += [ "DRV_I915" ]
    }
    if (use_marvell_minigbm) {
      defines += [ "DRV_MARVELL" ]
    }
    if (use_mediatek_minigbm) {
      defines += [ "DRV_MEDIATEK" ]
    }
    if (use_meson_minigbm) {
      defines += [ "DRV_MESON" ]
    }
    if (use_msm_minigbm) {
      defines += [ "DRV_MSM" ]
    }
    if (use_radeon_minigbm) {
      defines += [ "DRV_RADEON" ]
    }
    if (use_rockchip_minigbm) {
      defines += [ "DRV_ROCKCHIP" ]
    }
    if (use_tegra_minigbm) {
      defines += [ "DRV_TEGRA" ]
    }
    if (use_vc4_minigbm) {
      defines += [ "DRV_VC4" ]
    }
  }

  shared_library("minigbm") {
    sources = [
      "src/amdgpu.c",
      "src/drv.c",
      "src/evdi.c",
      "src/exynos.c",
      "src/gbm.c",
      "src/gbm_helpers.c",
      "src/helpers.c",
      "src/helpers_array.c",
      "src/i915.c",
      "src/marvell.c",
      "src/mediatek.c",
      "src/meson.c",
      "src/msm.c",
      "src/nouveau.c",
      "src/radeon.c",
      "src/rockchip.c",
      "src/tegra.c",
      "src/udl.c",
      "src/vc4.c",
      "src/vgem.c",
      "src/virtio_gpu.c",
    ]

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

    deps = [
      "//build/config/linux/libdrm",
    ]
    public_configs = [ ":minigbm_config" ]

    if (use_exynos_minigbm) {
      configs += [ "//build/config/linux/libdrm:libdrm_exynos_include_config" ]
    }

    # Clients need this to pick up the shared library correctly.
    all_dependent_configs =
        [ "//build/config/gcc:rpath_for_built_shared_libraries" ]
  }

  # This target is used for Chromecast build, which expects the resulting lib
  # to have a name <GN target name> + .so
  group("libminigbm") {
    deps = [
      ":minigbm",
    ]
  }
}

if (use_system_minigbm) {
  pkg_config("libgbm") {
    packages = [ "gbm" ]
  }

  group("minigbm") {
    public_configs = [ ":libgbm" ]
  }
}
