# Copyright 2016 Google, LLC
#
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the "Software"),
# to deal in the Software without restriction, including without limitation
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
# and/or sell copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice (including the next
# paragraph) shall be included in all copies or substantial portions of the
# Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
# IN THE SOFTWARE.

import("../mesa.gni")

config("common_config") {
  mesa_version = read_file("../VERSION", "trim string")

  defines = [
    "STDC_HEADERS=1",
    "HAVE_ENDIAN_H=1",
    "HAVE_SYS_TYPES_H=1",
    "HAVE_SYS_STAT_H=1",
    "HAVE_STDLIB_H=1",
    "HAVE_STRING_H=1",
    "HAVE_MEMORY_H=1",
    "HAVE_STRINGS_H=1",
    "HAVE_INTTYPES_H=1",
    "HAVE_STDINT_H=1",
    "HAVE_TIMESPEC_GET=1",
    "HAVE_UNISTD_H=1",
    "HAVE_DLFCN_H=1",
    "YYTEXT_POINTER=1",
    "HAVE___BUILTIN_BSWAP32=1",
    "HAVE___BUILTIN_BSWAP64=1",
    "HAVE___BUILTIN_CLZ=1",
    "HAVE___BUILTIN_CLZLL=1",
    "HAVE___BUILTIN_CTZ=1",
    "HAVE___BUILTIN_EXPECT=1",
    "HAVE___BUILTIN_FFS=1",
    "HAVE___BUILTIN_FFSLL=1",
    "HAVE___BUILTIN_POPCOUNT=1",
    "HAVE___BUILTIN_POPCOUNTLL=1",
    "HAVE___BUILTIN_UNREACHABLE=1",
    "HAVE_FUNC_ATTRIBUTE_CONST=1",
    "HAVE_FUNC_ATTRIBUTE_FLATTEN=1",
    "HAVE_FUNC_ATTRIBUTE_FORMAT=1",
    "HAVE_FUNC_ATTRIBUTE_MALLOC=1",
    "HAVE_FUNC_ATTRIBUTE_PACKED=1",
    "HAVE_FUNC_ATTRIBUTE_PURE=1",
    "HAVE_FUNC_ATTRIBUTE_UNUSED=1",
    "HAVE_FUNC_ATTRIBUTE_WARN_UNUSED_RESULT=1",
    "HAVE_FUNC_ATTRIBUTE_NORETURN=1",
    "HAVE_DLADDR=1",
    "HAVE_DL_ITERATE_PHDR=1",
    "HAVE_CLOCK_GETTIME=1",
    "PACKAGE_NAME=\"Mesa\" ",
    "PACKAGE_TARNAME=\"mesa\" ",
    "PACKAGE_VERSION=\"$mesa_version\" ",
    "PACKAGE_STRING=\"Mesa $mesa_version\" ",
    "PACKAGE_BUGREPORT=\"https://bugs.freedesktop.org/enter_bug.cgi\?product=Mesa\" ",
    "PACKAGE_URL=\"\" ",
    "PACKAGE=\"mesa\" ",
    "VERSION=\"$mesa_version\"",
    "_DEFAULT_SOURCE",
    "_GNU_SOURCE=1",
  ]

  if (current_os == "linux") {
    defines += [
      "HAVE_LINUX_FUTEX_H",
      "HAVE_MEMFD_CREATE",
    ]
  }

  if (is_debug) {
    defines += [ "DEBUG=1" ]
  }

  # TODO(MA-18) fix these warnings and remove the -Wno*
  cflags = [
    "-Wall",
    "-Wno-missing-field-initializers",
    "-Wno-initializer-overrides",
    "-Wno-sign-compare",
    "-Wno-overloaded-virtual",
    "-Wno-absolute-value",
    "-Wno-missing-braces",
    "-Wno-unused-function",
    "-Wno-mismatched-tags",
    "-Wno-enum-conversion",
    "-Wno-unused-variable",
    "-Wno-unused-private-field",
    "-Wno-sometimes-uninitialized",
    "-Wno-implicit-int-float-conversion",
    "-Wno-incompatible-pointer-types-discards-qualifiers",
    "-Wno-unused-label",
    "-Wno-switch",
    "-Wno-gnu-variable-sized-type-not-at-end",
    "-Wno-extra-semi",
    "-Wno-newline-eof",
    "-Wno-tautological-constant-out-of-range-compare",
    "-Wno-unknown-pragmas",
    "-Wno-int-in-bool-context",
    "-Wno-conversion",
  ]
}

config("sha1_config") {
  include_dirs = [ "$target_gen_dir" ]
}

mesa_python_action("sha1") {
  output_name = "git_sha1.h"
  outputs = [ "$target_gen_dir/$output_name" ]

  script = "$mesa_build_root/bin/git_sha1_gen.py"
  args = [
    "--output",
    rebase_path("$target_gen_dir/$output_name"),
  ]

  public_configs = [ ":sha1_config" ]
}
