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

# gn-format disable
import("//build_overrides/pigweed.gni")

import("$dir_pw_docgen/docs.gni")
import("arm_gcc/toolchains.gni")
import("generate_toolchain.gni")
import("host_clang/toolchains.gni")
import("host_gcc/toolchains.gni")

# For each of the toolchains below, the toolchain GNI file has the corresponding
# configs. This allows BUILDCONFIG.gn to set default target values on "flat"
# lists of configs, i.e. not nested. This in turn allows individual targets
# fine-grained control over which default configs they wise to override.

# Generate ARM GCC toolchains
generate_toolchains("arm_gcc_suite") {
  toolchains = pw_toolchain_arm_gcc_list
}

# Generate Host GCC toolchains
generate_toolchains("host_gcc_suite") {
  toolchains = pw_toolchain_host_gcc_list
}

# Generate Host Clang toolchains
generate_toolchains("host_clang_suite") {
  toolchains = pw_toolchain_host_clang_list
}

pw_doc_group("docs") {
  sources = [ "docs.rst" ]
}
