| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168 |
- # Taken from amazon-freertos repository
- #function to create the test executable
- function(create_test test_name
- test_src
- link_list
- dep_list
- include_list)
- set(mocks_dir "${CMAKE_CURRENT_BINARY_DIR}/mocks")
- include (CTest)
- get_filename_component(test_src_absolute ${test_src} ABSOLUTE)
- add_custom_command(OUTPUT ${test_name}_runner.c
- COMMAND ruby
- ${CMOCK_DIR}/vendor/unity/auto/generate_test_runner.rb
- ${MODULE_ROOT_DIR}/tools/cmock/project.yml
- ${test_src_absolute}
- ${test_name}_runner.c
- DEPENDS ${test_src}
- )
- add_executable(${test_name} ${test_src} ${test_name}_runner.c)
- set_target_properties(${test_name} PROPERTIES
- COMPILE_FLAG "-O0 -ggdb"
- RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin/tests"
- INSTALL_RPATH_USE_LINK_PATH TRUE
- LINK_FLAGS " \
- -Wl,-rpath,${CMAKE_BINARY_DIR}/lib \
- -Wl,-rpath,${CMAKE_CURRENT_BINARY_DIR}/lib"
- )
- target_include_directories(${test_name} PUBLIC
- ${mocks_dir}
- ${include_list}
- )
- target_link_directories(${test_name} PUBLIC
- ${CMAKE_CURRENT_BINARY_DIR}
- )
- # link all libraries sent through parameters
- foreach(link IN LISTS link_list)
- target_link_libraries(${test_name} ${link})
- endforeach()
- # add dependency to all the dep_list parameter
- foreach(dependency IN LISTS dep_list)
- add_dependencies(${test_name} ${dependency})
- target_link_libraries(${test_name} ${dependency})
- endforeach()
- target_link_libraries(${test_name} -lgcov unity)
- target_link_directories(${test_name} PUBLIC
- ${CMAKE_CURRENT_BINARY_DIR}/lib
- )
- add_test(NAME ${test_name}
- COMMAND ${CMAKE_BINARY_DIR}/bin/tests/${test_name}
- WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
- )
- endfunction()
- # Run the C preprocessor on target files.
- # Takes a CMAKE list of arguments to pass to the C compiler
- function(preprocess_mock_list mock_name file_list compiler_args)
- set_property(GLOBAL PROPERTY ${mock_name}_processed TRUE)
- foreach (target_file IN LISTS file_list)
- # Has to be TARGET ALL so the file is pre-processed before CMOCK
- # is executed on the file.
- add_custom_command(OUTPUT ${target_file}.backup
- COMMAND scp ${target_file} ${target_file}.backup
- VERBATIM COMMAND ${CMAKE_C_COMPILER} -E ${compiler_args} ${target_file} > ${target_file}.out
- )
- add_custom_target(pre_${mock_name}
- COMMAND mv ${target_file}.out ${target_file}
- DEPENDS ${target_file}.backup
- )
- endforeach()
- # Clean up temporary files that were created.
- # First we test to see if the backup file still exists. If it does we revert
- # the change made to the original file.
- foreach (target_file IN LISTS file_list)
- add_custom_command(TARGET ${mock_name}
- POST_BUILD
- COMMAND test ! -e ${target_file}.backup || mv ${target_file}.backup ${target_file}
- )
- endforeach()
- endfunction()
- # Generates a mock library based on a module's header file
- # places the generated source file in the build directory
- # @param mock_name: name of the target name
- # @param mock_list list of header files to mock
- # @param cmock_config configuration file of the cmock framework
- # @param mock_include_list include list for the target
- # @param mock_define_list special definitions to control compilation
- function(create_mock_list mock_name
- mock_list
- cmock_config
- mock_include_list
- mock_define_list)
- set(mocks_dir "${CMAKE_CURRENT_BINARY_DIR}/mocks")
- add_library(${mock_name} SHARED)
- foreach (mock_file IN LISTS mock_list)
- get_filename_component(mock_file_abs
- ${mock_file}
- ABSOLUTE
- )
- get_filename_component(mock_file_name
- ${mock_file}
- NAME_WLE
- )
- get_filename_component(mock_file_dir
- ${mock_file}
- DIRECTORY
- )
- add_custom_command (
- OUTPUT ${mocks_dir}/mock_${mock_file_name}.c
- COMMAND ruby
- ${CMOCK_DIR}/lib/cmock.rb
- -o${cmock_config} ${mock_file_abs}
- WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
- )
- target_sources(${mock_name} PUBLIC
- ${mocks_dir}/mock_${mock_file_name}.c
- )
- target_include_directories(${mock_name} PUBLIC
- ${mock_file_dir}
- )
- endforeach()
- target_include_directories(${mock_name} PUBLIC
- ${mocks_dir}
- ${mock_include_list}
- )
- set_target_properties(${mock_name} PROPERTIES
- LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/lib
- POSITION_INDEPENDENT_CODE ON
- )
- target_compile_definitions(${mock_name} PUBLIC
- ${mock_define_list}
- )
- target_link_libraries(${mock_name} cmock unity)
- endfunction()
- function(create_real_library target
- src_file
- real_include_list
- mock_name)
- add_library(${target} STATIC
- ${src_file}
- )
- target_include_directories(${target} PUBLIC
- ${real_include_list}
- )
- set_target_properties(${target} PROPERTIES
- COMPILE_FLAGS "-Wextra -Wpedantic \
- -fprofile-arcs -ftest-coverage -fprofile-generate \
- -Wno-unused-but-set-variable"
- LINK_FLAGS "-fprofile-arcs -ftest-coverage \
- -fprofile-generate "
- ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/lib
- )
- if(NOT(mock_name STREQUAL ""))
- add_dependencies(${target} ${mock_name})
- target_link_libraries(${target}
- -l${mock_name}
- -lgcov
- )
- endif()
- endfunction()
|