# SPDX-License-Identifier: Apache-2.0

zephyr_library()

if(CONFIG_X86)
  zephyr_linker_sources(ROM_START SORT_KEY 0x1bindesc bindesc_no_vt.ld)
  zephyr_library_sources(x86/bindesc_skip.S)
else()
  zephyr_linker_sources(ROM_START SORT_KEY 0x1bindesc bindesc.ld)
endif()

# Wrapper macro around string(TIMESTAMP ...), that returns the time
# in either local time or UTC, depending on CONFIG_BINDESC_BUILD_TIME_USE_LOCAL_TIME.
macro(get_time out_var format)
  if(CONFIG_BINDESC_BUILD_TIME_USE_LOCAL_TIME)
    string(TIMESTAMP ${out_var} ${format})
  else()
    string(TIMESTAMP ${out_var} ${format} UTC)
  endif()
endmacro()

macro(gen_build_time_int_definition def_name format)
  if(CONFIG_BINDESC_${def_name})
    get_time(${def_name} ${format})
    # remove leading zeros so that the output will not be interpreted as octal
    math(EXPR ${def_name} ${${def_name}})
    zephyr_library_compile_definitions(${def_name}=${${def_name}})
  endif()
endmacro()

macro(gen_build_time_str_definition def_name format)
  if(CONFIG_BINDESC_${def_name})
    get_time(${def_name} ${${format}})
    zephyr_library_compile_definitions(${def_name}="${${def_name}}")
  endif()
endmacro()

macro(gen_str_definition def_name value)
  if(CONFIG_BINDESC_${def_name})
    zephyr_library_compile_definitions(${def_name}="${value}")
  endif()
endmacro()

if(CONFIG_BINDESC_DEFINE_BUILD_TIME)
  zephyr_library_sources(bindesc_build_time.c)
  gen_build_time_int_definition(BUILD_TIME_YEAR "%Y")
  gen_build_time_int_definition(BUILD_TIME_MONTH "%m")
  gen_build_time_int_definition(BUILD_TIME_DAY "%d")
  gen_build_time_int_definition(BUILD_TIME_HOUR "%H")
  gen_build_time_int_definition(BUILD_TIME_MINUTE "%M")
  gen_build_time_int_definition(BUILD_TIME_SECOND "%S")
  gen_build_time_int_definition(BUILD_TIME_UNIX "%s")

  gen_build_time_str_definition(BUILD_DATE_TIME_STRING
      CONFIG_BINDESC_BUILD_DATE_TIME_STRING_FORMAT)
  gen_build_time_str_definition(BUILD_DATE_STRING
      CONFIG_BINDESC_BUILD_DATE_STRING_FORMAT)
  gen_build_time_str_definition(BUILD_TIME_STRING
      CONFIG_BINDESC_BUILD_TIME_STRING_FORMAT)

  if(CONFIG_BINDESC_BUILD_TIME_ALWAYS_REBUILD)
    # By adding a custom target that invokes cmake,
    # CMake is forced to rebuild this target on every build. This is
    # done to ensure that the timestamp is always up to date.
    add_custom_target(
      bindesc_time_force_rebuild
      COMMAND ${CMAKE_COMMAND} ${CMAKE_BINARY_DIR}
    )
    add_dependencies(${ZEPHYR_CURRENT_LIBRARY} bindesc_time_force_rebuild)
  endif()
endif()

if(CONFIG_BINDESC_DEFINE_VERSION)
  zephyr_library_sources(bindesc_version.c)
  if(EXISTS ${APPLICATION_SOURCE_DIR}/VERSION)
    zephyr_library_compile_definitions(HAS_APP_VERSION=1)
  endif()
endif()

if(CONFIG_BINDESC_DEFINE_HOST_INFO)
  cmake_host_system_information(RESULT hostname QUERY HOSTNAME)
  zephyr_library_sources(bindesc_host_info.c)
  gen_str_definition(HOST_NAME ${hostname})
  gen_str_definition(C_COMPILER_NAME ${CMAKE_C_COMPILER_ID})
  gen_str_definition(C_COMPILER_VERSION ${CMAKE_C_COMPILER_VERSION})
  gen_str_definition(CXX_COMPILER_NAME ${CMAKE_CXX_COMPILER_ID})
  gen_str_definition(CXX_COMPILER_VERSION ${CMAKE_CXX_COMPILER_VERSION})
endif()
