find_package(Python COMPONENTS Interpreter) set(sysroot_manifest ${CMAKE_CURRENT_BINARY_DIR}/sysroot-manifest.json) set(sysroot_tool ${CMAKE_SOURCE_DIR}/util/sysroot-tool.py) function(sysroot_reset) execute_process( COMMAND ${Python_EXECUTABLE} ${sysroot_tool} reset ${sysroot_manifest} COMMAND_ERROR_IS_FATAL ANY) endfunction(sysroot_reset) function(sysroot_set_base) set(options) set(one_value_args PATH) set(multi_value_args) cmake_parse_arguments(PARSE_ARGV 0 arg "${options}" "${one_value_args}" "${multi_value_args}") set(sysroot_target_name _sysroot-base) get_property(sysroot_targets GLOBAL PROPERTY sysroot_target_list) list(LENGTH sysroot_targets nr_sysroot_targets) if (${nr_sysroot_targets} GREATER 0) math(EXPR serialiser_index "${nr_sysroot_targets}-1") list(GET sysroot_targets ${serialiser_index} serialiser) endif () add_custom_target(${sysroot_target_name} COMMAND ${Python_EXECUTABLE} ${sysroot_tool} set-base ${sysroot_manifest} ${arg_PATH} COMMENT "Preparing sysroot base" DEPENDS ${serialiser}) set_property(GLOBAL PROPERTY sysroot_target_list ${sysroot_targets} ${sysroot_target_name}) endfunction(sysroot_set_base) function(sysroot_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(sysroot_target_name _sysroot-${target_name}) meta_target_get_header_directories(TARGET ${target_name} OUT header_dirs) get_property(sysroot_targets GLOBAL PROPERTY sysroot_target_list) list(LENGTH sysroot_targets nr_sysroot_targets) if (${nr_sysroot_targets} GREATER 0) math(EXPR serialiser_index "${nr_sysroot_targets}-1") list(GET sysroot_targets ${serialiser_index} serialiser) endif () if (arg_HEADER_DIR) add_custom_target(${sysroot_target_name} COMMAND ${Python_EXECUTABLE} ${sysroot_tool} add-binary ${sysroot_manifest} ${target_name} ${arg_LIB_DIR} $ COMMAND ${Python_EXECUTABLE} ${sysroot_tool} add-headers ${sysroot_manifest} ${target_name} ${arg_HEADER_DIR} ${header_dirs} COMMENT "Preparing sysroot component: ${target_name}" DEPENDS ${target_name} ${serialiser}) else() add_custom_target(${sysroot_target_name} COMMAND ${Python_EXECUTABLE} ${sysroot_tool} add-binary ${sysroot_manifest} ${target_name} ${arg_LIB_DIR} $ COMMENT "Preparing sysroot component: ${target_name}" DEPENDS ${target_name} ${serialiser}) endif () set_property(GLOBAL PROPERTY sysroot_target_list ${sysroot_targets} ${sysroot_target_name}) endfunction(sysroot_add_library) function(sysroot_add_object_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(sysroot_target_name _sysroot-${target_name}) meta_target_get_header_directories(TARGET ${target_name} OUT header_dirs) get_property(sysroot_targets GLOBAL PROPERTY sysroot_target_list) list(LENGTH sysroot_targets nr_sysroot_targets) if (${nr_sysroot_targets} GREATER 0) math(EXPR serialiser_index "${nr_sysroot_targets}-1") list(GET sysroot_targets ${serialiser_index} serialiser) endif () if (arg_HEADER_DIR) add_custom_target(${sysroot_target_name} COMMAND ${Python_EXECUTABLE} ${sysroot_tool} add-binary ${sysroot_manifest} ${target_name} ${arg_LIB_DIR} $ COMMAND ${Python_EXECUTABLE} ${sysroot_tool} add-headers ${sysroot_manifest} ${target_name} ${arg_HEADER_DIR} ${header_dirs} COMMENT "Preparing sysroot component: ${target_name}" DEPENDS ${target_name} ${serialiser}) else() add_custom_target(${sysroot_target_name} COMMAND ${Python_EXECUTABLE} ${sysroot_tool} add-binary ${sysroot_manifest} ${target_name} ${arg_LIB_DIR} $ COMMENT "Preparing sysroot component: ${target_name}" DEPENDS ${target_name} ${serialiser}) endif () get_property(tmp TARGET ${target_name} PROPERTY SUFFIX) set_property(GLOBAL PROPERTY sysroot_target_list ${sysroot_targets} ${sysroot_target_name}) endfunction(sysroot_add_object_library) function(sysroot_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(sysroot_target_name _sysroot-${target_name}) get_property(sysroot_targets GLOBAL PROPERTY sysroot_target_list) list(LENGTH sysroot_targets nr_sysroot_targets) if (${nr_sysroot_targets} GREATER 0) math(EXPR serialiser_index "${nr_sysroot_targets}-1") list(GET sysroot_targets ${serialiser_index} serialiser) endif () add_custom_target(${sysroot_target_name} COMMAND ${Python_EXECUTABLE} ${sysroot_tool} add-binary ${sysroot_manifest} ${target_name} ${arg_BIN_DIR} $ COMMENT "Preparing sysroot component: ${target_name}" DEPENDS ${target_name} ${serialiser}) set_property(GLOBAL PROPERTY sysroot_target_list ${sysroot_targets} ${sysroot_target_name}) endfunction(sysroot_add_program) function(sysroot_add_file) set(options) set(one_value_args ID SRC_PATH DEST_DIR) set(multi_value_args DEPENDS) cmake_parse_arguments(PARSE_ARGV 0 arg "${options}" "${one_value_args}" "${multi_value_args}") set(src_path ${arg_SRC_PATH}) set(dest_dir ${arg_DEST_DIR}) set(sysroot_target_name _sysroot-${arg_ID}) get_property(sysroot_targets GLOBAL PROPERTY sysroot_target_list) list(LENGTH sysroot_targets nr_sysroot_targets) if (${nr_sysroot_targets} GREATER 0) math(EXPR serialiser_index "${nr_sysroot_targets}-1") list(GET sysroot_targets ${serialiser_index} serialiser) endif () add_custom_target(${sysroot_target_name} COMMAND ${Python_EXECUTABLE} ${sysroot_tool} add-binary ${sysroot_manifest} ${arg_ID} ${dest_dir} ${src_path} COMMENT "Preparing sysroot component: ${arg_ID}" DEPENDS ${target_name} ${serialiser} ${arg_DEPENDS}) set_property(GLOBAL PROPERTY sysroot_target_list ${sysroot_targets} ${sysroot_target_name}) endfunction(sysroot_add_file) function(sysroot_finalise) get_property(sysroot_targets GLOBAL PROPERTY sysroot_target_list) add_custom_target(sysroot COMMAND ${Python_EXECUTABLE} ${sysroot_tool} build-sysroot ${sysroot_manifest} ${CMAKE_BINARY_DIR}/sysroot DEPENDS ${sysroot_targets} COMMENT "Building sysroot...") endfunction(sysroot_finalise)