# 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")

declare_args() {
  # Enable/disable Arduino builds via group("arduino").
  # Set to the full path of where cores are installed.
  pw_arduino_build_CORE_PATH = ""

  # Expected args for an Arduino build:
  pw_arduino_build_CORE_NAME = ""

  # TODO(tonymd): "teensy/avr" here should match the folders in this dir:
  # "../third_party/arduino/cores/$pw_arduino_build_CORE_NAME/hardware/*")
  # For teensy: "teensy/avr", for adafruit-samd: "samd/1.6.2"
  pw_arduino_build_PACKAGE_NAME = ""
  pw_arduino_build_BOARD = ""

  # Menu options should be a list of strings.
  pw_arduino_build_MENU_OPTIONS = []
}

if (pw_arduino_build_CORE_PATH != "") {
  # Check that enough pw_arduino_build_* args are set to find and use a core.
  _required_args_message =
      "The following build args must all be set: " +
      "pw_arduino_build_CORE_PATH, pw_arduino_build_CORE_NAME, " +
      "pw_arduino_build_PACKAGE_NAME."
  assert(pw_arduino_build_CORE_NAME != "",
         "Missing 'pw_arduino_build_CORE_NAME' build arg. " +
             _required_args_message)
  assert(pw_arduino_build_PACKAGE_NAME != "",
         "Missing 'pw_arduino_build_PACKAGE_NAME' build arg. " +
             _required_args_message)

  _arduino_selected_core_path =
      rebase_path("$pw_arduino_build_CORE_PATH/$pw_arduino_build_CORE_NAME")

  arduino_builder_script =
      get_path_info("py/pw_arduino_build/__main__.py", "abspath")

  # Check pw_arduino_build_BOARD is set
  assert(pw_arduino_build_BOARD != "",
         "pw_arduino_build_BOARD build arg not set. " +
             "To see supported boards run: " +
             "arduino_builder --arduino-package-path " +
             _arduino_selected_core_path + " --arduino-package-name " +
             pw_arduino_build_PACKAGE_NAME + " list-boards")

  _compiler_path_override =
      rebase_path(getenv("_PW_ACTUAL_ENVIRONMENT_ROOT") + "/cipd/pigweed/bin")

  arduino_core_library_path = "$_arduino_selected_core_path/hardware/" +
                              "$pw_arduino_build_PACKAGE_NAME/libraries"

  arduino_global_args = [
    "--arduino-package-path",
    _arduino_selected_core_path,
    "--arduino-package-name",
    pw_arduino_build_PACKAGE_NAME,
    "--compiler-path-override",
    _compiler_path_override,

    # Save config files to "out/arduino_debug/gen/arduino_builder_config.json"
    "--config-file",
    rebase_path(root_gen_dir) + "/arduino_builder_config.json",
    "--save-config",
  ]

  arduino_board_args = [
    "--build-path",
    rebase_path(root_build_dir),
    "--board",
    pw_arduino_build_BOARD,
  ]
  if (pw_arduino_build_MENU_OPTIONS != []) {
    arduino_board_args += [ "--menu-options" ]
    arduino_board_args += pw_arduino_build_MENU_OPTIONS
  }

  arduino_show_command_args = arduino_global_args + [
                                "show",
                                "--delimit-with-newlines",
                              ] + arduino_board_args

  arduino_run_command_args =
      arduino_global_args + [ "run" ] + arduino_board_args
}
