Linux debugging

Check our new training course

Linux debugging, tracing, profiling & perf. analysis

Check our new training course
with Creative Commons CC-BY-SA
lecture and lab materials

Bootlin logo

Elixir Cross Referencer

# SPDX-License-Identifier: Apache-2.0

include(${ZEPHYR_BASE}/cmake/toolchain/zephyr/host-tools.cmake)

# west is optional
find_program(
  WEST
  west
  )
if(${WEST} STREQUAL WEST-NOTFOUND)
  unset(WEST)
else()
  # If west is found, make sure its version matches the minimum
  # required one.
  set(MIN_WEST_VERSION 0.5.6)
  execute_process(
    COMMAND
    ${WEST} --version
    OUTPUT_VARIABLE west_version_output
    )

  # The west --version output is currently multiline: bootstrapper
  # followed by installation version. Test both. This will still work
  # when .west/west is eliminated from the installation and obtained
  # via pypi, which will result in a single line of output.
  string(REGEX REPLACE "\n" ";" west_version_output "${west_version_output}")
  foreach(item ${west_version_output})
    if("${item}" MATCHES "^[^\/\\]*v([0-9]+[.][0-9]+[.][0-9]+)")
      set(west_version "${CMAKE_MATCH_1}")
      if(${west_version} VERSION_LESS ${MIN_WEST_VERSION})
        message(FATAL_ERROR "The detected west version is unsupported.\n\
  The version was found to be ${west_version}:\n\
    ${item}\n\
  But the minimum supported version is ${MIN_WEST_VERSION}\n\
  Please upgrade, e.g. with:\n\
      pip3 install --upgrade west\n\
  if the version from pip is too old, or:\n\
      west update\n\
  if the version in the installation is too old.")
      endif()
    endif()
  endforeach()
  # Just output information for a single version. This will still work
  # even after output is one line.
  message(STATUS "Found west: ${WEST} (found suitable version \"${west_version}\", minimum required is \"${MIN_WEST_VERSION}\")")
endif()

# Search for the must-have program dtc on PATH and in
# TOOLCHAIN_HOME. Usually DTC will be provided by an SDK, but for
# SDK-less projects like gnuarmemb, it is up to the user to install
# dtc.
find_program(
  DTC
  dtc
  )
if(${DTC} STREQUAL DTC-NOTFOUND)
  message(FATAL_ERROR "Unable to find dtc")
endif()

# Parse the 'dtc --version' and make sure it is at least MIN_DTC_VERSION
set(MIN_DTC_VERSION 1.4.6)
execute_process(
  COMMAND
  ${DTC} --version
  OUTPUT_VARIABLE dtc_version_output
  )
string(REGEX MATCH "Version: DTC ([0-9]+\.[0-9]+.[0-9]+).*" out_var ${dtc_version_output})
if(${CMAKE_MATCH_1} VERSION_LESS ${MIN_DTC_VERSION})
  assert(0 "The detected dtc version is unsupported.                                 \n\
    The version was found to be ${CMAKE_MATCH_1}                                   \n\
    But the minimum supported version is ${MIN_DTC_VERSION}                        \n\
    See https://docs.zephyrproject.org/latest/getting_started/                     \n\
    for how to use the SDK's dtc alongside a custom toolchain."
  )
endif()

find_program(
  GPERF
  gperf
  )
if(${GPERF} STREQUAL GPERF-NOTFOUND)
  message(FATAL_ERROR "Unable to find gperf")
endif()

# openocd is an optional dependency
find_program(
  OPENOCD
  openocd
  )

# bossac is an optional dependency
find_program(
  BOSSAC
  bossac
  )

# TODO: Should we instead find one qemu binary for each ARCH?
# TODO: This will probably need to be re-organized when there exists more than one SDK.