# Copyright 2019 The SwiftShader Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import("../swiftshader.gni")

import("//testing/test.gni")

config("yarn_config") {
  include_dirs = [
    "..",
  ]
}

swiftshader_source_set("Yarn_headers") {
  sources = [
    "ConditionVariable.hpp",
    "Containers.hpp",
    "Debug.hpp",
    "Defer.hpp",
    "Finally.hpp",
    "OSFiber.hpp",
    "Pool.hpp",
    "SAL.hpp",
    "Scheduler.hpp",
    "Thread.hpp",
    "Ticket.hpp",
    "Trace.hpp",
    "Utils.hpp",
    "WaitGroup.hpp",
  ]

  if (is_win) {
    sources += [ "OSFiber_windows.hpp" ]
  } else {
    sources += [
      "OSFiber_asm.hpp",
      "OSFiber_asm_aarch64.h",
      "OSFiber_asm_arm.h",
      "OSFiber_asm_x64.h",
      "OSFiber_asm_x86.h",
    ]
  }

  public_configs = [
    ":yarn_config",
  ]
}

swiftshader_source_set("Yarn") {
  sources = [
    "Debug.cpp",
    "Scheduler.cpp",
    "Thread.cpp",
    "Trace.cpp",
  ]

  if (!is_win) {
    sources += [
      "OSFiber_aarch64.c",
      "OSFiber_arm.c",
      "OSFiber_asm_aarch64.S",
      "OSFiber_asm_arm.S",
      "OSFiber_asm_x64.S",
      "OSFiber_asm_x86.S",
      "OSFiber_x64.c",
      "OSFiber_x86.c",
    ]
  }

  public_deps = [
    ":Yarn_headers",
  ]
}

test("yarn_unittests") {
  sources = [
    "ConditionVariable_test.cpp",
    "Containers_test.cpp",
    "Defer_test.cpp",
    "OSFiber_test.cpp",
    "Pool_test.cpp",
    "Scheduler_test.cpp",
    "Ticket_test.cpp",
    "WaitGroup_test.cpp",
    "Yarn_test.cpp",
  ]
  deps = [
    ":Yarn",
    "//testing/gtest",
    "//testing/gmock",
  ]

  if (!swiftshader_standalone) {
    deps += [
      "//third_party/googletest:gmock",
      "//third_party/googletest:gtest",
    ]
  }
}
