# 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.

import("//build/components.gni")
import("//build/host.gni")
import("//build/test.gni")
import("//third_party/quickjs/compiled_js.gni")

config("qjs-config") {
  version_lines = read_file("VERSION", "list lines")
  defines = [
    "_GNU_SOURCE",
    "CONFIG_VERSION=\"" + version_lines[0] + "\"",
    "CONFIG_BIGNUM",

    # Use a switch rather than a manually created dispatch table. Using the
    # host-asan_ubsan variant causes the interpreter to crash with an internal
    # stack overflow error if this table is used. The compiler should already
    # decide which is the best way to lower a switch statement anyway.
    "DIRECT_DISPATCH=0",
  ]

  # Suppress warnings in upstream code that are triggered by Fuchsia compilation flags.
  cflags = [
    "-Wno-conversion",
    "-Wno-implicit-fallthrough",
    "-Wno-implicit-int-float-conversion",
    "-Wno-sign-compare",
    "-Wno-unused-but-set-variable",
    "-Wno-unused-variable",
    "-funsigned-char",
  ]
}

source_set("qjs-lib") {
  # based on QJS_LIB_OBJS
  sources = [
    "cutils.c",
    "libbf.c",
    "libbf.h",
    "libregexp.c",
    "libunicode.c",
    "quickjs-libc.c",
    "quickjs.c",
  ]

  if (is_fuchsia) {
    deps = [ "//sdk/lib/fdio" ]
  }

  configs += [ ":qjs-config" ]
}

executable("qjsc") {
  sources = [ "qjsc.c" ]
  deps = [ ":qjs-lib" ]
  configs += [ ":qjs-config" ]
}

compiled_js("repl") {
  source = "repl.js"
  module = true
}

compiled_js("qjscalc") {
  source = "qjscalc.js"
  module = true
}

executable("qjs") {
  # based on QJS_OBJS
  sources = [ "qjs.c" ]

  deps = [
    ":qjs-lib",
    ":qjscalc",
    ":repl",
  ]

  configs += [ ":qjs-config" ]

  if (is_fuchsia) {
    deps += [ "//src/zircon/lib/zircon" ]
  }
}

fuchsia_shell_package("quickjs") {
  package_name = "qjs"
  deps = [ ":qjs" ]
}

test("qjs_test") {
  sources = [ "basic_test.cc" ]

  deps = [
    ":qjs-lib",
    "//src/lib/fxl/test:gtest_main",
    "//third_party/googletest:gtest",
  ]

  configs += [ ":qjs-config" ]

  if (is_fuchsia) {
    deps += [ "//src/zircon/lib/zircon" ]
  }
}

fuchsia_unittest_package("qjs_tests") {
  deps = [ ":qjs_test" ]
}

install_host_tools("quickjs_host") {
  deps = [ ":qjs" ]
  outputs = [ "qjs" ]
}
