# Copyright 2020 The Pigweed Authors
#
# 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
#
#     https://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("//build_overrides/pigweed.gni")

import("$dir_pw_build/target_types.gni")

declare_args() {
  # If compiling backends with ThreadX, this variable is set to the path to the
  # ThreadX include directory. When set, a pw_source_set for the threadx library
  # is created at "$dir_pw_third_party/threadx".
  dir_pw_third_party_threadx_include = ""

  # The pw_source_set which provides the port specific includes and sources.
  pw_third_party_threadx_PORT = ""
}

# This file defines a GN source_set for an external installation of ThreadX.
# To use, checkout the threadx source into a directory, then set the build arg
# dir_pw_third_party_threadx_include to point to that directory. The ThreadX
# library will be available in GN at "$dir_pw_third_party/threadx".
if (dir_pw_third_party_threadx_include != "") {
  config("public_includes") {
    include_dirs = [ "$dir_pw_third_party_threadx_include" ]
    visibility = [ ":*" ]
  }

  pw_source_set("threadx") {
    public_configs = [ ":public_includes" ]
    allow_circular_includes_from = [ pw_third_party_threadx_PORT ]
    public_deps = [ pw_third_party_threadx_PORT ]
    public = [
      "$dir_pw_third_party_threadx_include/tx_api.h",
      "$dir_pw_third_party_threadx_include/tx_port.h",
    ]
  }
} else {
  group("threadx") {
  }
}
