a043d48c54
Commit ef3c5e5516
changed the way
WEST_TOPDIR is initialized from calling 'west topdir' as a subprocess
to using the west API.
However, WEST_TOPDIR is a cmake variable and must be a cmake-style
path, with forward slashes. While 'west topdir' as a command does
output a forward slash separated path (basically in order to make the
zephyr build system work), west_topdir() as an API returns the path in
the host environment path style, which on Windows uses backslashes.
This turns out to be the ultimate cause of the following build error:
CMake Error at C:/.../CheckCCompilerFlag.cmake:41 (set):
Syntax error in cmake code when parsing string
-fmacro-prefix-map=C:\Users\Marti\zp=WEST_TOPDIR
Fix it by converting to POSIX style in Python. We could have
potentially also done this using file(TO_CMAKE_PATH "${WEST_TOPDIR}"
...), but I'm intentionally repeating the old way of doing things
since it was known to work.
Signed-off-by: Martí Bolívar <marti.bolivar@nordicsemi.no>
121 lines
3.6 KiB
CMake
121 lines
3.6 KiB
CMake
# SPDX-License-Identifier: Apache-2.0
|
|
|
|
include(${ZEPHYR_BASE}/cmake/toolchain/zephyr/host-tools.cmake)
|
|
|
|
# west is an optional dependency
|
|
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.7.1)
|
|
execute_process(
|
|
COMMAND
|
|
${PYTHON_EXECUTABLE}
|
|
-c
|
|
"import west.version; print(west.version.__version__, end='')"
|
|
OUTPUT_VARIABLE west_version
|
|
RESULT_VARIABLE west_version_output_result
|
|
)
|
|
|
|
if(WEST_PYTHON)
|
|
if(NOT (${WEST_PYTHON} STREQUAL ${PYTHON_EXECUTABLE}))
|
|
set(PYTHON_EXECUTABLE_OUT_OF_SYNC "\nNote:\n\
|
|
The Python version used by west is: ${WEST_PYTHON}\n\
|
|
The Python version used by CMake is: ${PYTHON_EXECUTABLE}\n\
|
|
This might be correct, but please verify your installation.\n")
|
|
endif()
|
|
endif()
|
|
|
|
if(west_version_output_result)
|
|
message(FATAL_ERROR "Unable to import west.version from '${PYTHON_EXECUTABLE}'\n\
|
|
Please install with:\n\
|
|
${PYTHON_EXECUTABLE} -m pip install west\
|
|
${PYTHON_EXECUTABLE_OUT_OF_SYNC}")
|
|
endif()
|
|
|
|
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 with:\n\
|
|
${PYTHON_EXECUTABLE} -m pip install --upgrade west\
|
|
${PYTHON_EXECUTABLE_OUT_OF_SYNC}")
|
|
endif()
|
|
|
|
# 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}\")")
|
|
|
|
execute_process(
|
|
COMMAND ${PYTHON_EXECUTABLE} -c
|
|
"import pathlib; from west.util import west_topdir; print(pathlib.Path(west_topdir()).as_posix())"
|
|
OUTPUT_VARIABLE WEST_TOPDIR
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
WORKING_DIRECTORY ${ZEPHYR_BASE}
|
|
)
|
|
endif()
|
|
|
|
# dtc is an optional dependency
|
|
find_program(
|
|
DTC
|
|
dtc
|
|
)
|
|
|
|
if(DTC)
|
|
# Parse the 'dtc --version' output to find the installed version.
|
|
set(MIN_DTC_VERSION 1.4.6)
|
|
execute_process(
|
|
COMMAND
|
|
${DTC} --version
|
|
OUTPUT_VARIABLE dtc_version_output
|
|
ERROR_VARIABLE dtc_error_output
|
|
RESULT_VARIABLE dtc_status
|
|
)
|
|
|
|
if(${dtc_status} EQUAL 0)
|
|
string(REGEX MATCH "Version: DTC ([0-9]+[.][0-9]+[.][0-9]+).*" out_var ${dtc_version_output})
|
|
|
|
# Since it is optional, an outdated version is not an error. If an
|
|
# outdated version is discovered, print a warning and proceed as if
|
|
# DTC were not installed.
|
|
if(${CMAKE_MATCH_1} VERSION_GREATER ${MIN_DTC_VERSION})
|
|
message(STATUS "Found dtc: ${DTC} (found suitable version \"${CMAKE_MATCH_1}\", minimum required is \"${MIN_DTC_VERSION}\")")
|
|
else()
|
|
message(WARNING
|
|
"Could NOT find dtc: Found unsuitable version \"${CMAKE_MATCH_1}\", but required is at least \"${MIN_DTC_VERSION}\" (found ${DTC}). Optional devicetree error checking with dtc will not be performed.")
|
|
set(DTC DTC-NOTFOUND)
|
|
endif()
|
|
else()
|
|
message(WARNING
|
|
"Could NOT find working dtc: Found dtc (${DTC}), but failed to load with:\n ${dtc_error_output}")
|
|
set(DTC DTC-NOTFOUND)
|
|
endif()
|
|
endif()
|
|
|
|
# gperf is an optional dependency
|
|
find_program(
|
|
GPERF
|
|
gperf
|
|
)
|
|
|
|
# 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.
|