如何使用 CMAKE 为多个测试提供不同的#defines

问题描述 投票:0回答:1

我正在使用 Zephyr 进行项目,并使用 cpputest 编写测试。 在我的代码中我有一些缓冲区。这些缓冲区取决于底层硬件(在本例中为 FLASH NAND 页大小),我们可以使用 zephyr 来设置此变量:

uint8_t buffer[DT_PROP(DT_NODELABEL(flashexternal), user_bytes_per_page)];

最后之间的部分变成

#define
,在这种情况下:

#define DT_N_NODELABEL_flashexternal_P_user_bytes_per_page 2048

#define DT_N_NODELABEL_flashexternal_P_user_bytes_per_page 4096

我想使用不同的定义运行相同的测试(以便我的代码可以使用两种长度的缓冲区进行测试)。

我的

CMakeLists.txt
看起来像这样(本文缩写):

cmake_minimum_required(VERSION 3.26.0)

project(unit-tests)
set(CPPUTEST_LDFLAGS CppUTest CppUTestExt)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++2a -include ${CMAKE_CURRENT_SOURCE_DIR}/autoconf.h")
set(test_main "${CMAKE_CURRENT_SOURCE_DIR}/main.cpp")
set(TESTS_LIST "ftl_pagesize_4kb;ftl_pagesize_2kb")

set(ftl_pagesize_4kb_test_sources
    ../../app/src/storage/test/ftl-test.cpp
    mocks/zephyr/misc.cpp
    ../../app/src/storage/ftl.cpp
    ../../app/src/storage/mt29f.cpp
)


set(ftl_pagesize_2kb_test_sources
    ../../app/src/storage/test/ftl-test.cpp
    mocks/zephyr/misc.cpp
    ../../app/src/storage/ftl.cpp
    ../../app/src/storage/mt29f.cpp
)

foreach (test-item ${TESTS_LIST})
    message("testing ${test-item}")
    set(TEST_TARGET "${test-item}-test")

    # test main will run the tests, the test cases are collected from test sources
    add_executable(${TEST_TARGET} ${test_main} ${${test-item}_test_sources})
    target_link_libraries(${TEST_TARGET} ${CPPUTEST_LDFLAGS})

    target_include_directories(${TEST_TARGET} PUBLIC
        "../../app/src/", JADA, JADA, JADA
    )
    set(COMPILE_AND_LINK_FLAGS "-O0 -fprofile-arcs --coverage -fno-exceptions -m32 -g")

    if (test-item STREQUAL "ftl_pagesize_2kb")
      set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++2a -include ${CMAKE_CURRENT_SOURCE_DIR}/../../app/src/storage/test/flash_nand_2kpage.hpp")
    endif()

    if (test-item STREQUAL "ftl_pagesize_4kb")
      set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++2a -include ${CMAKE_CURRENT_SOURCE_DIR}/../../app/src/storage/test/flash_nand_4kpage.hpp")
    endif()

    set_target_properties(${TEST_TARGET}
          PROPERTIES
          COMPILE_FLAGS "${COMPILE_AND_LINK_FLAGS}"
          LINK_FLAGS "${COMPILE_AND_LINK_FLAGS}"
    )

    # run the test executable and save the output in junit format so it can be parsed later
    # this step also spits out the gcda files needed for coverage reports
     add_custom_target(${TEST_TARGET}-run ALL COMMAND ./${TEST_TARGET} -v -ojunit
         DEPENDS ${TEST_TARGET} VERBATIM
         COMMENT "executing ${TEST_TARGET}"
     )

endforeach()

如我的 CMakeLists.txt 中所示,我尝试为我的特定测试覆盖 CMAKE_CXX_FLAGS。

flash_nand_2kpage.hpp的内容是这样的(4k长度类似,只是数值不同)

#include "../../../../tests/unit/autoconf.h"

#define DT_N_NODELABEL_flashexternal_P_user_bytes_per_page 2048
#define DT_N_NODELABEL_flashexternal_P_blocks_per_plane 1024
#define DT_N_NODELABEL_flashexternal_P_spare_bytes_per_page 128
#define DT_N_NODELABEL_flashexternal_P_pages_per_block 64
#define DT_N_NODELABEL_flashexternal_P_num_planes 2

我也尝试过:

  • 使用TEST_INCLUDE_FILES
  • 使用add_compile_options

看来我对 CMAKE 的了解不足以解决这个问题:皱眉:

如何构建相同的测试两次,但某些 #define 设置不同?

找到解决方案(问题被标记为重复后)

if (test-item STREQUAL "ftl_pagesize_4kb")
    set(COMPILE_AND_LINK_FLAGS "${COMPILE_AND_LINK_FLAGS} -include ${CMAKE_CURRENT_SOURCE_DIR}/../../app/src/storage/test/flash_nand_4kpage_only.hpp")
else()
    set(COMPILE_AND_LINK_FLAGS "${COMPILE_AND_LINK_FLAGS} -include ${CMAKE_CURRENT_SOURCE_DIR}/../../app/src/storage/test/flash_nand_2kpage_only.hpp")
endif()
c++ cmake zephyr-rtos cpputest
1个回答
0
投票

找到解决方案(问题被标记为重复后)

if (test-item STREQUAL "ftl_pagesize_4kb")
    set(COMPILE_AND_LINK_FLAGS "${COMPILE_AND_LINK_FLAGS} -include ${CMAKE_CURRENT_SOURCE_DIR}/../../app/src/storage/test/flash_nand_4kpage_only.hpp")
else()
    set(COMPILE_AND_LINK_FLAGS "${COMPILE_AND_LINK_FLAGS} -include ${CMAKE_CURRENT_SOURCE_DIR}/../../app/src/storage/test/flash_nand_2kpage_only.hpp")
endif()
© www.soinside.com 2019 - 2024. All rights reserved.