diff --git a/port/threadx_smp/CMakeLists.txt b/port/threadx_smp/CMakeLists.txt index 0cffc7e..74dd720 100644 --- a/port/threadx_smp/CMakeLists.txt +++ b/port/threadx_smp/CMakeLists.txt @@ -1,6 +1,8 @@ cmake_minimum_required(VERSION 3.24) project(smp_demo LANGUAGES C ASM) +include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/ThreadXSmpOffsets.cmake) + set(THREADX_COMMON_SMP_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../third-party/threadx/common_smp) if(NOT EXISTS "${THREADX_COMMON_SMP_DIR}") message(FATAL_ERROR "could not find ThreadX SMP sources, is the submodule checked out?") @@ -26,27 +28,21 @@ set(THREADX_SMP_CUSTOM_SRC src/tx_thread_stack_build.S src/tx_thread_system_return.S ) -set(THREADX_SMP_GENERATED_INC_DIR ${CMAKE_CURRENT_BINARY_DIR}/generated) -set(THREADX_SMP_OFFSET_SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/src/tx_asm_offsets.c) -set(THREADX_SMP_OFFSET_ASM ${THREADX_SMP_GENERATED_INC_DIR}/tx_asm_offsets.s) -set(THREADX_SMP_OFFSET_INC ${THREADX_SMP_GENERATED_INC_DIR}/tx_asm_offsets.inc) -set(THREADX_SMP_OFFSET_INCLUDE_DIRS - ${THREADX_COMMON_SMP_DIR}/inc - ${THREADX_SMP_CUSTOM_INC} + +threadx_smp_add_offsets( + TARGET threadx_smp_offsets + OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/generated + SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/src/tx_asm_offsets.c + INCLUDE_DIRS + ${THREADX_COMMON_SMP_DIR}/inc + ${THREADX_SMP_CUSTOM_INC} + COMPILE_DEFINITIONS + TX_QUEUE_MESSAGE_MAX_SIZE=16 + DEPENDS + ${CMAKE_CURRENT_SOURCE_DIR}/inc/tx_port.h + ${THREADX_COMMON_SMP_DIR}/inc/tx_api.h + OUT_INCLUDE_DIR THREADX_SMP_GENERATED_INC_DIR ) -set(THREADX_SMP_OFFSET_COMPILE_DEFINITIONS - TX_QUEUE_MESSAGE_MAX_SIZE=16 -) -set(THREADX_SMP_OFFSET_INCLUDE_ARGS ${THREADX_SMP_OFFSET_INCLUDE_DIRS}) -list(TRANSFORM THREADX_SMP_OFFSET_INCLUDE_ARGS PREPEND -I) -set(THREADX_SMP_OFFSET_DEFINE_ARGS ${THREADX_SMP_OFFSET_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) file(GLOB THREADX_SMP_SOURCES ${THREADX_COMMON_SMP_DIR}/src/*.c) add_library(threadx_smp STATIC) @@ -62,32 +58,6 @@ target_include_directories(threadx_smp PRIVATE ${THREADX_SMP_GENERATED_INC_DIR} ) target_compile_definitions(threadx_smp PRIVATE TX_QUEUE_MESSAGE_MAX_SIZE=16) #This is addressed in PR #503 - -add_custom_command( - OUTPUT ${THREADX_SMP_OFFSET_INC} - COMMAND ${CMAKE_COMMAND} -E make_directory ${THREADX_SMP_GENERATED_INC_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_OFFSET_SOURCE} - COMMAND ${CMAKE_COMMAND} - -DINPUT=${THREADX_SMP_OFFSET_ASM} - -DOUTPUT=${THREADX_SMP_OFFSET_INC} - -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/GenerateAsmOffsets.cmake - DEPENDS - ${THREADX_SMP_OFFSET_SOURCE} - ${CMAKE_CURRENT_SOURCE_DIR}/cmake/GenerateAsmOffsets.cmake - ${CMAKE_CURRENT_SOURCE_DIR}/inc/tx_port.h - ${THREADX_COMMON_SMP_DIR}/inc/tx_api.h - COMMAND_EXPAND_LISTS - VERBATIM -) - -add_custom_target(threadx_smp_offsets DEPENDS ${THREADX_SMP_OFFSET_INC}) add_dependencies(threadx_smp threadx_smp_offsets) add_executable(smp_demo) diff --git a/port/threadx_smp/cmake/ThreadXSmpOffsets.cmake b/port/threadx_smp/cmake/ThreadXSmpOffsets.cmake new file mode 100644 index 0000000..1de4447 --- /dev/null +++ b/port/threadx_smp/cmake/ThreadXSmpOffsets.cmake @@ -0,0 +1,67 @@ +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()