# Copyright 2018 The Fuchsia Authors. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
#    * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#    * Redistributions in binary form must reproduce the above
# copyright notice, this list of conditions and the following disclaimer
# in the documentation and/or other materials provided with the
# distribution.
#    * Neither the name of Google Inc. nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

import("//build/host.gni")

config("wsman_private_config") {
  visibility = [ ":*" ]
  defines = [ "HAVE_CONFIG_H" ]
  include_dirs = [ target_gen_dir ]
}

copy("copy_wsman_config") {
  visibility = [ ":*" ]
  if (is_fuchsia) {
    sources = [
      "config.h.fuchsia",
    ]
  } else {
    sources = [
      "config.h",
    ]
  }
  outputs = [
    "$target_gen_dir/config.h",
  ]
}

group("wsman_settings") {
  visibility = [ ":*" ]
  public_configs = [ ":wsman_private_config" ]
  deps = [
    ":copy_wsman_config",
  ]
}

config("wsman_config") {
  visibility = [ ":*" ]
  cflags = [
    # Needed by src/wsman.c which is missing fields in the options struct.
    "-Wno-missing-field-initializers",

    # Needed by src/wsman.c which initializes char with NULL (void *).
    "-Wno-int-conversion",
  ]
}

executable("wsman") {
  defines = [ "PACKAGE_BUILDTS=\"\"" ]
  configs += [ ":wsman_config" ]
  sources = [
    "src/wsman.c",
  ]
  deps = [
    ":wsman_settings",
    "//third_party/openwsman:wsman",
    "//third_party/openwsman:wsman_client",
    "//third_party/openwsman:wsman_curl_client_transport",
  ]
}

executable("wseventmgr") {
  defines = [ "PACKAGE_BUILDTS=\"\"" ]
  configs += [ ":wsman_config" ]
  sources = [
    "src/wseventmgr.c",
  ]
  deps = [
    ":wsman_settings",
    "//third_party/openwsman:wsman",
  ]
}

install_host_tools("wsman_host") {
  deps = [
    ":wsman",
  ]
  outputs = [
    "wsman",
  ]
}
