diff --git a/tools/cmake/build.cmake b/tools/cmake/build.cmake index 78b95f8d45..273f751e6e 100644 --- a/tools/cmake/build.cmake +++ b/tools/cmake/build.cmake @@ -273,6 +273,27 @@ function(__build_write_properties output_file) file(WRITE ${output_file} "${build_properties_text}") endfunction() +# +# Check if the Python interpreter used for the build has all the required modules. +# +function(__build_check_python) + idf_build_get_property(check __CHECK_PYTHON) + if(check) + idf_build_get_property(python PYTHON) + idf_build_get_property(idf_path IDF_PATH) + message(STATUS "Checking Python dependencies...") + execute_process(COMMAND "${python}" "${idf_path}/tools/idf_tools.py" "check-python-dependencies" + RESULT_VARIABLE result) + if(result EQUAL 1) + # check_python_dependencies returns error code 1 on failure + message(FATAL_ERROR "Some Python dependencies must be installed. Check above message for details.") + elseif(NOT result EQUAL 0) + # means check_python_dependencies.py failed to run at all, result should be an error message + message(FATAL_ERROR "Failed to run Python dependency check. Python: ${python}, Error: ${result}") + endif() + endif() +endfunction() + # # Prepare for component processing expanding each component's project include # @@ -393,6 +414,9 @@ macro(idf_build_process target) __build_set_default(SDKCONFIG_DEFAULTS "") + # Check for required Python modules + __build_check_python() + idf_build_get_property(target IDF_TARGET) if(NOT "${target}" STREQUAL "linux") diff --git a/tools/idf.py b/tools/idf.py index fb66b3192b..e8950fd5cf 100755 --- a/tools/idf.py +++ b/tools/idf.py @@ -89,6 +89,24 @@ def check_environment(): except RuntimeError as e: raise FatalError(e) + # check Python dependencies + checks_output.append('Checking Python dependencies...') + try: + out = subprocess.check_output( + [ + os.environ['PYTHON'], + os.path.join(os.environ['IDF_PATH'], 'tools', 'idf_tools.py'), + 'check-python-dependencies', + ], + env=os.environ, + ) + + checks_output.append(out.decode('utf-8', 'ignore').strip()) + except subprocess.CalledProcessError as e: + print_warning(e.output.decode('utf-8', 'ignore'), stream=sys.stderr) + debug_print_idf_version() + raise SystemExit(1) + return checks_output