# 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 ./third_party/arduino
  dir_pw_third_party_arduino = ""

  # Expected args for an Arduino build:
  arduino_core_name = "teensy"
  arduino_package_name = "teensy/avr"
  arduino_board = "teensy40"

  # Menu options should be a list of strings.
  arduino_menu_options = [
    "menu.usb.serial",
    "menu.keys.en-us",
  ]
}

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

_arduino_core_path =
    rebase_path("../third_party/arduino/cores/$arduino_core_name")
_compiler_path_override =
    rebase_path(getenv("_PW_ACTUAL_ENVIRONMENT_ROOT") + "/cipd/pigweed/bin")

arduino_global_args = [
  "--arduino-package-path",
  _arduino_core_path,
  "--arduino-package-name",
  arduino_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",
  arduino_board,
  "--menu-options",
]
arduino_board_args += arduino_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
