mirror of
https://github.com/hathach/tinyusb.git
synced 2026-02-05 06:05:32 +00:00
132 lines
4.5 KiB
CMake
132 lines
4.5 KiB
CMake
cmake_minimum_required(VERSION 3.20)
|
|
|
|
project(tinyusb_unit_tests LANGUAGES C)
|
|
|
|
set(CMAKE_C_STANDARD 99)
|
|
set(CMAKE_C_STANDARD_REQUIRED ON)
|
|
set(CMAKE_C_EXTENSIONS ON)
|
|
|
|
# Command to invoke Ceedling. Supports multi-word commands such as "bundle exec ceedling".
|
|
set(CEEDLING_COMMAND "ceedling" CACHE STRING "Command used to invoke Ceedling (Ruby gem).")
|
|
separate_arguments(CEEDLING_COMMAND_LIST NATIVE_COMMAND "${CEEDLING_COMMAND}")
|
|
if (CEEDLING_COMMAND_LIST STREQUAL "")
|
|
message(FATAL_ERROR "CEEDLING_COMMAND is empty; set it to a valid Ceedling invocation.")
|
|
endif ()
|
|
|
|
list(GET CEEDLING_COMMAND_LIST 0 CEEDLING_LAUNCHER)
|
|
find_program(CEEDLING_LAUNCHER_PATH NAMES ${CEEDLING_LAUNCHER})
|
|
if (NOT CEEDLING_LAUNCHER_PATH)
|
|
message(FATAL_ERROR "Could not find '${CEEDLING_LAUNCHER}' on PATH; adjust CEEDLING_COMMAND or PATH.")
|
|
endif ()
|
|
list(REMOVE_AT CEEDLING_COMMAND_LIST 0)
|
|
list(INSERT CEEDLING_COMMAND_LIST 0 ${CEEDLING_LAUNCHER_PATH})
|
|
|
|
set(CEEDLING_WORKDIR ${CMAKE_CURRENT_LIST_DIR})
|
|
set(CEEDLING_BUILD_DIR ${CEEDLING_WORKDIR}/_build)
|
|
|
|
# Helper to add a Ceedling-backed test target that compiles into a real CMake executable.
|
|
function(add_ceedling_test TARGET_NAME TEST_SOURCE PRODUCT_SOURCES MOCK_SOURCES)
|
|
set(runner ${CEEDLING_BUILD_DIR}/test/runners/${TARGET_NAME}_runner.c)
|
|
|
|
add_custom_target(ceedling_gen_${TARGET_NAME}
|
|
COMMAND ${CEEDLING_COMMAND_LIST} test:${TARGET_NAME}
|
|
WORKING_DIRECTORY ${CEEDLING_WORKDIR}
|
|
BYPRODUCTS ${runner}
|
|
USES_TERMINAL
|
|
COMMENT "Generate Ceedling runner/mocks for ${TARGET_NAME}"
|
|
)
|
|
|
|
add_executable(${TARGET_NAME}
|
|
${TEST_SOURCE}
|
|
${runner}
|
|
${MOCK_SOURCES}
|
|
${CEEDLING_BUILD_DIR}/vendor/unity/src/unity.c
|
|
${CEEDLING_BUILD_DIR}/vendor/cmock/src/cmock.c
|
|
${PRODUCT_SOURCES}
|
|
)
|
|
|
|
set_source_files_properties(
|
|
${runner}
|
|
${MOCK_SOURCES}
|
|
${CEEDLING_BUILD_DIR}/vendor/unity/src/unity.c
|
|
${CEEDLING_BUILD_DIR}/vendor/cmock/src/cmock.c
|
|
PROPERTIES GENERATED TRUE
|
|
)
|
|
|
|
add_dependencies(${TARGET_NAME} ceedling_gen_${TARGET_NAME})
|
|
|
|
target_include_directories(${TARGET_NAME} PRIVATE
|
|
${CEEDLING_WORKDIR}/test
|
|
${CEEDLING_WORKDIR}/test/support
|
|
${CEEDLING_BUILD_DIR}/test/runners
|
|
${CEEDLING_BUILD_DIR}/test/mocks/${TARGET_NAME}
|
|
${CEEDLING_BUILD_DIR}/vendor/unity/src
|
|
${CEEDLING_BUILD_DIR}/vendor/cmock/src
|
|
${CEEDLING_WORKDIR}/../../src
|
|
${CEEDLING_WORKDIR}/../../src/common
|
|
${CEEDLING_WORKDIR}/../../src/device
|
|
${CEEDLING_WORKDIR}/../../src/class
|
|
${CEEDLING_WORKDIR}/../../src/class/msc
|
|
${CEEDLING_WORKDIR}/../../src/host
|
|
${CEEDLING_WORKDIR}/../../src/typec
|
|
${CEEDLING_WORKDIR}/../../src/osal
|
|
)
|
|
|
|
target_compile_definitions(${TARGET_NAME} PRIVATE _UNITY_TEST_)
|
|
target_compile_options(${TARGET_NAME} PRIVATE -Wall -Wextra)
|
|
add_test(NAME ${TARGET_NAME} COMMAND ${TARGET_NAME})
|
|
endfunction()
|
|
|
|
# Custom targets to keep plain Ceedling entry-points available.
|
|
add_custom_target(ceedling_all
|
|
COMMAND ${CEEDLING_COMMAND_LIST} test:all
|
|
WORKING_DIRECTORY ${CEEDLING_WORKDIR}
|
|
USES_TERMINAL
|
|
COMMENT "Run Ceedling (Unity) unit tests"
|
|
)
|
|
|
|
add_custom_target(ceedling_clean
|
|
COMMAND ${CEEDLING_COMMAND_LIST} clean
|
|
WORKING_DIRECTORY ${CEEDLING_WORKDIR}
|
|
USES_TERMINAL
|
|
COMMENT "Clean Ceedling build outputs"
|
|
)
|
|
|
|
add_custom_target(ceedling_clobber
|
|
COMMAND ${CEEDLING_COMMAND_LIST} clobber
|
|
WORKING_DIRECTORY ${CEEDLING_WORKDIR}
|
|
USES_TERMINAL
|
|
COMMENT "Clobber Ceedling build outputs"
|
|
)
|
|
|
|
# Per-test wiring: mocks are generated under _build/test/mocks/<name>/.
|
|
add_ceedling_test(
|
|
test_common_func
|
|
${CEEDLING_WORKDIR}/test/test_common_func.c
|
|
""
|
|
""
|
|
)
|
|
|
|
add_ceedling_test(
|
|
test_fifo
|
|
${CEEDLING_WORKDIR}/test/test_fifo.c
|
|
${CEEDLING_WORKDIR}/../../src/common/tusb_fifo.c
|
|
""
|
|
)
|
|
|
|
add_ceedling_test(
|
|
test_usbd
|
|
${CEEDLING_WORKDIR}/test/device/usbd/test_usbd.c
|
|
"${CEEDLING_WORKDIR}/../../src/tusb.c;${CEEDLING_WORKDIR}/../../src/device/usbd.c;${CEEDLING_WORKDIR}/../../src/device/usbd_control.c;${CEEDLING_WORKDIR}/../../src/common/tusb_fifo.c"
|
|
"${CEEDLING_BUILD_DIR}/test/mocks/test_usbd/mock_dcd.c;${CEEDLING_BUILD_DIR}/test/mocks/test_usbd/mock_msc_device.c"
|
|
)
|
|
|
|
add_ceedling_test(
|
|
test_msc_device
|
|
${CEEDLING_WORKDIR}/test/device/msc/test_msc_device.c
|
|
"${CEEDLING_WORKDIR}/../../src/tusb.c;${CEEDLING_WORKDIR}/../../src/device/usbd.c;${CEEDLING_WORKDIR}/../../src/device/usbd_control.c;${CEEDLING_WORKDIR}/../../src/class/msc/msc_device.c;${CEEDLING_WORKDIR}/../../src/common/tusb_fifo.c"
|
|
"${CEEDLING_BUILD_DIR}/test/mocks/test_msc_device/mock_dcd.c"
|
|
)
|
|
|
|
enable_testing()
|