# Copyright 2018 Oticon A/S
# SPDX-License-Identifier: Apache-2.0

function compile(){
  : "${app:?app must be defined}"

  local app_root="${app_root:-${ZEPHYR_BASE}}"
  local conf_file="${conf_file:-prj.conf}"
  local conf_overlay="${conf_overlay:-""}"

  local cmake_args="${cmake_args:-"-DCONFIG_COVERAGE=y \
    -DCMAKE_EXPORT_COMPILE_COMMANDS=ON"}"
  local ninja_args="${ninja_args:-""}"
  local cc_flags="${cc_flags:-"-Werror"}"

  local exe_name="${exe_name:-bs_${BOARD}_${app}_${conf_file}}"
  local exe_name=${exe_name//\//_}
  local exe_name=${exe_name//./_}
  local exe_name=${BSIM_OUT_PATH}/bin/$exe_name
  local map_file_name=${exe_name}.Tsymbols

  local this_dir=${WORK_DIR}/${app}/${conf_file}

  echo "Building $exe_name"

  # Set INCR_BUILD when calling to only do an incremental build
  if [ ! -v INCR_BUILD ] || [ ! -d "${this_dir}" ]; then
      [ -d "${this_dir}" ] && rm ${this_dir} -rf
      mkdir -p ${this_dir} && cd ${this_dir}
      cmake -GNinja -DBOARD_ROOT=${BOARD_ROOT} -DBOARD=${BOARD} \
            -DCONF_FILE=${conf_file} -DOVERLAY_CONFIG=${conf_overlay} \
            ${cmake_args} -DCMAKE_C_FLAGS="${cc_flags}" ${app_root}/${app} \
            &> cmake.out || { cat cmake.out && return 0; }
  else
      cd ${this_dir}
  fi
  ninja ${ninja_args} &> ninja.out || { cat ninja.out && return 0; }
  cp ${this_dir}/zephyr/zephyr.exe ${exe_name}

  nm ${exe_name} | grep -v " [U|w] " | sort | cut -d" " -f1,3 > ${map_file_name}
  sed -i "1i $(wc -l ${map_file_name} | cut -d" " -f1)" ${map_file_name}
}
