# Copyright 2019 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

##########################################
# Though under //zircon, this build file #
# is meant to be used in the Fuchsia GN  #
# build.                                 #
# See fxb/36139.                         #
##########################################

assert(!defined(zx) || zx != "/",
       "This file can only be used in the Fuchsia GN build.")

import("//build/test.gni")
import("//build/unification/images/migrated_manifest.gni")

test("dlfcn") {
  # Dependent manifests unfortunately cannot be marked as `testonly`.
  # TODO(44278): Remove when converting this file to proper GN build idioms.
  testonly = false
  configs += [ "//build/unification/config:zircon-migrated" ]
  sources = [ "dlfcn.c" ]
  deps = [
    "//zircon/public/lib/async",
    "//zircon/public/lib/async-default",
    "//zircon/public/lib/async-loop",
    "//zircon/public/lib/async-loop-default",
    "//zircon/public/lib/elfload",
    "//zircon/public/lib/fdio",
    "//zircon/public/lib/ldmsg",
    "//zircon/public/lib/unittest",
    "//zircon/system/ulib/loader-service",
  ]

  data_deps = [ ":test-dso-no-note" ]
}

loadable_module("test-dso-no-note") {
  visibility = [ ":*" ]

  # Dependent manifests unfortunately cannot be marked as `testonly`.
  # TODO(44278): Revert to true when converting this file to proper GN build idioms.
  testonly = false
  sources = [ "test-dso-no-note.cc" ]
  configs += [ ":no-build-id" ]
}

config("no-build-id") {
  visibility = [ ":*" ]
  ldflags = [ "-Wl,--build-id=none" ]
}

migrated_manifest("dlfcn-manifest") {
  deps = [ ":dlfcn" ]
}

migrated_manifest("dlfcn-test-dso-no-note") {
  deps = [ ":test-dso-no-note" ]
}
