function(threadx_smp_add_offsets) set(options) set(oneValueArgs TARGET OUTPUT_DIR SOURCE OUT_INCLUDE_DIR) set(multiValueArgs INCLUDE_DIRS COMPILE_DEFINITIONS DEPENDS) cmake_parse_arguments(THREADX_SMP_OFFSETS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) if(NOT THREADX_SMP_OFFSETS_TARGET) message(FATAL_ERROR "threadx_smp_add_offsets requires TARGET") endif() if(NOT THREADX_SMP_OFFSETS_OUTPUT_DIR) message(FATAL_ERROR "threadx_smp_add_offsets requires OUTPUT_DIR") endif() if(NOT THREADX_SMP_OFFSETS_SOURCE) message(FATAL_ERROR "threadx_smp_add_offsets requires SOURCE") endif() if(NOT THREADX_SMP_OFFSETS_OUT_INCLUDE_DIR) message(FATAL_ERROR "threadx_smp_add_offsets requires OUT_INCLUDE_DIR") endif() set(threadx_smp_generate_script "${CMAKE_CURRENT_FUNCTION_LIST_DIR}/GenerateAsmOffsets.cmake") set(threadx_smp_offset_asm "${THREADX_SMP_OFFSETS_OUTPUT_DIR}/tx_asm_offsets.s") set(threadx_smp_offset_inc "${THREADX_SMP_OFFSETS_OUTPUT_DIR}/tx_asm_offsets.inc") set(threadx_smp_offset_include_args ${THREADX_SMP_OFFSETS_INCLUDE_DIRS}) list(TRANSFORM threadx_smp_offset_include_args PREPEND -I) set(threadx_smp_offset_define_args ${THREADX_SMP_OFFSETS_COMPILE_DEFINITIONS}) list(TRANSFORM threadx_smp_offset_define_args PREPEND -D) set(threadx_smp_offset_cflags ${CMAKE_C_FLAGS}) if(CMAKE_BUILD_TYPE) string(TOUPPER "${CMAKE_BUILD_TYPE}" threadx_smp_build_type_upper) list(APPEND threadx_smp_offset_cflags ${CMAKE_C_FLAGS_${threadx_smp_build_type_upper}}) endif() separate_arguments(threadx_smp_offset_cflags) add_custom_command( OUTPUT ${threadx_smp_offset_inc} BYPRODUCTS ${threadx_smp_offset_asm} COMMAND ${CMAKE_COMMAND} -E make_directory ${THREADX_SMP_OFFSETS_OUTPUT_DIR} COMMAND ${CMAKE_C_COMPILER} ${CMAKE_C_COMPILER_ARG1} ${threadx_smp_offset_cflags} ${threadx_smp_offset_include_args} ${threadx_smp_offset_define_args} -S -o ${threadx_smp_offset_asm} ${THREADX_SMP_OFFSETS_SOURCE} COMMAND ${CMAKE_COMMAND} -DINPUT=${threadx_smp_offset_asm} -DOUTPUT=${threadx_smp_offset_inc} -P ${threadx_smp_generate_script} DEPENDS ${THREADX_SMP_OFFSETS_SOURCE} ${threadx_smp_generate_script} ${THREADX_SMP_OFFSETS_DEPENDS} COMMAND_EXPAND_LISTS VERBATIM ) add_custom_target(${THREADX_SMP_OFFSETS_TARGET} DEPENDS ${threadx_smp_offset_inc}) set(${THREADX_SMP_OFFSETS_OUT_INCLUDE_DIR} ${THREADX_SMP_OFFSETS_OUTPUT_DIR} PARENT_SCOPE) endfunction()