find_package(Python COMPONENTS Interpreter) set(bsp_manifest ${CMAKE_CURRENT_BINARY_DIR}/bsp-manifest.json) set(bsp_tool ${CMAKE_SOURCE_DIR}/util/bsp-tool.py) function(bsp_reset) execute_process( COMMAND ${Python_EXECUTABLE} ${bsp_tool} reset ${bsp_manifest} COMMAND_ERROR_IS_FATAL ANY) endfunction(bsp_reset) function(bsp_add_file) set(options) set(one_value_args ID SRC_PATH DEST_DIR) set(multi_value_args) cmake_parse_arguments(PARSE_ARGV 0 arg "${options}" "${one_value_args}" "${multi_value_args}") set(target_name ${arg_ID}) set(bsp_target_name _bsp-${target_name}) get_property(bsp_targets GLOBAL PROPERTY bsp_target_list) list(LENGTH bsp_targets nr_bsp_targets) if (${nr_bsp_targets} GREATER 0) math(EXPR serialiser_index "${nr_bsp_targets}-1") list(GET bsp_targets ${serialiser_index} serialiser) endif () add_custom_target(${bsp_target_name} COMMAND ${Python_EXECUTABLE} ${bsp_tool} add-binary ${bsp_manifest} ${target_name} ${arg_DEST_DIR} ${arg_SRC_PATH} COMMENT "Preparing bsp component: ${target_name}" DEPENDS ${arg_SRC_PATH} ${serialiser}) set_property(GLOBAL PROPERTY bsp_target_list ${bsp_targets} ${bsp_target_name}) endfunction(bsp_add_file) function(bsp_add_library) set(options) set(one_value_args NAME HEADER_DIR LIB_DIR) set(multi_value_args) cmake_parse_arguments(PARSE_ARGV 0 arg "${options}" "${one_value_args}" "${multi_value_args}") set(target_name ${arg_NAME}) set(bsp_target_name _bsp-${target_name}) meta_target_get_header_directories(TARGET ${target_name} OUT header_dirs) get_property(bsp_targets GLOBAL PROPERTY bsp_target_list) list(LENGTH bsp_targets nr_bsp_targets) if (${nr_bsp_targets} GREATER 0) math(EXPR serialiser_index "${nr_bsp_targets}-1") list(GET bsp_targets ${serialiser_index} serialiser) endif () add_custom_target(${bsp_target_name} COMMAND ${Python_EXECUTABLE} ${bsp_tool} add-binary ${bsp_manifest} ${target_name} ${arg_LIB_DIR} $ COMMENT "Preparing bsp component: ${target_name}" DEPENDS ${target_name} ${serialiser}) set_property(GLOBAL PROPERTY bsp_target_list ${bsp_targets} ${bsp_target_name}) endfunction(bsp_add_library) function(bsp_add_program) set(options) set(one_value_args NAME BIN_DIR) set(multi_value_args) cmake_parse_arguments(PARSE_ARGV 0 arg "${options}" "${one_value_args}" "${multi_value_args}") set(target_name ${arg_NAME}) set(bsp_target_name _bsp-${target_name}) get_property(bsp_targets GLOBAL PROPERTY bsp_target_list) list(LENGTH bsp_targets nr_bsp_targets) if (${nr_bsp_targets} GREATER 0) math(EXPR serialiser_index "${nr_bsp_targets}-1") list(GET bsp_targets ${serialiser_index} serialiser) endif () add_custom_target(${bsp_target_name} COMMAND ${Python_EXECUTABLE} ${bsp_tool} add-binary ${bsp_manifest} ${target_name} ${arg_BIN_DIR} $ COMMENT "Preparing bsp component: ${target_name}" DEPENDS ${target_name} ${serialiser}) set_property(GLOBAL PROPERTY bsp_target_list ${bsp_targets} ${bsp_target_name}) endfunction(bsp_add_program) function(bsp_add_service) set(options) set(one_value_args NAME BIN_DIR SVC_DIR) set(multi_value_args) cmake_parse_arguments(PARSE_ARGV 0 arg "${options}" "${one_value_args}" "${multi_value_args}") set(target_name ${arg_NAME}) set(bsp_target_name _bsp-${target_name}) get_property(bsp_targets GLOBAL PROPERTY bsp_target_list) get_property(cfg_file TARGET ${arg_NAME} PROPERTY service_cfg_path) get_property(file_list TARGET ${arg_NAME} PROPERTY service_file_list) get_property(target_type TARGET ${arg_NAME} PROPERTY TYPE) list(LENGTH bsp_targets nr_bsp_targets) list(LENGTH file_list nr_service_files) if (${nr_bsp_targets} GREATER 0) math(EXPR serialiser_index "${nr_bsp_targets}-1") list(GET bsp_targets ${serialiser_index} serialiser) endif () set(commands COMMAND ${Python_EXECUTABLE} ${bsp_tool} add-binary ${bsp_manifest} ${target_name}-cfg ${arg_SVC_DIR} ${cfg_file}) if (target_type STREQUAL "EXECUTABLE") set(commands ${commands} COMMAND ${Python_EXECUTABLE} ${bsp_tool} add-binary ${bsp_manifest} ${target_name} ${arg_BIN_DIR} $) endif () if (nr_service_files GREATER 0) math(EXPR nr_service_files "${nr_service_files}-1") foreach (i RANGE 0 ${nr_service_files} 2) math(EXPR i2 "${i}+1") list(GET file_list ${i} src_file) list(GET file_list ${i2} dest_dir) set(commands ${commands} COMMAND ${Python_EXECUTABLE} ${bsp_tool} add-binary ${bsp_manifest} ${target_name}-${i} ${dest_dir} ${src_file}) endforeach (i) endif () add_custom_target(${bsp_target_name} ${commands} COMMENT "Preparing bsp component: ${target_name}" DEPENDS ${target_name} ${serialiser}) set_property(GLOBAL PROPERTY bsp_target_list ${bsp_targets} ${bsp_target_name}) endfunction(bsp_add_service) function(bsp_finalise) set(options) set(one_value_args BOOTSTRAP_PROGRAM DEST_DIR BSP_NAME) set(multi_value_args) cmake_parse_arguments(PARSE_ARGV 0 arg "${options}" "${one_value_args}" "${multi_value_args}") set(bsp_output_path ${arg_DEST_DIR}/${arg_BSP_NAME}) get_property(bsp_targets GLOBAL PROPERTY bsp_target_list) add_custom_target(bsp COMMAND ${Python_EXECUTABLE} ${bsp_tool} build-bsp ${bsp_manifest} $ ${bsp_output_path} DEPENDS ${bsp_targets} ${arg_BOOTSTRAP_PROGRAM} COMMENT "Building bsp: ${arg_BSP_NAME}") endfunction(bsp_finalise)