different include file for different test

Hello great minds !

I am using Zephyr for a project and write tests by using cpputest.
In my code I have some buffers. These buffers depend on the hardware underneath (in this case FLASH NAND page size), we can use zephyr to make this variable:
uint8_t buffer[DT_PROP(DT_NODELABEL(flashexternal), user_bytes_per_page)];
The part between the brackets [ and ] in the end become #defines, in this case:
#define DT_N_NODELABEL_flashexternal_P_user_bytes_per_page 2048
or
#define DT_N_NODELABEL_flashexternal_P_user_bytes_per_page 4096.

I want to run the same tests with different defines (so that my code gets tested with both length of buffers).

My CMakeLists.txt looks something like this (shortened for this post):

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()

As is visible in my CMakeLists.txt I attempt to overwrite CMAKE_CXX_FLAGS for my specific tests.

The content of flash_nand_2kpage.hpp looks like this ( the 4k length is similar with different values)

#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

The problem I get while compiling is that it seems that both flash_nand_2kpage.hpp and flash_nand_4kpage.hpp seems to be used since I get the warning:

/app/src/storage/test/flash_nand_4kpage.hpp:6: note: this is the location of the previous definition
    6 | #define DT_N_NODELABEL_flashexternal_P_blocks_per_plane 2048

I have also tried:

  • use TEST_INCLUDE_FILES
  • use add_compile_options

It seems that my knowledge in CMAKE is insufficient to fix this problem :frowning:

How can I build the same tests twice having some #defines set differently?

I have found the solution.

instead of trying to get the CMAKE_CXX_FLAGS I set some additional COMPILE_AND_LINK_FLAGS, like this:

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()

Note that the content of the added hpp files ONLY contain the additional #define, and do NOT have added: #include “…/…/…/…/tests/unit/autoconf.h”