diff options
Diffstat (limited to 'cmake')
| -rw-r--r-- | cmake/NNGHelpers.cmake | 155 |
1 files changed, 155 insertions, 0 deletions
diff --git a/cmake/NNGHelpers.cmake b/cmake/NNGHelpers.cmake new file mode 100644 index 00000000..6544a97b --- /dev/null +++ b/cmake/NNGHelpers.cmake @@ -0,0 +1,155 @@ +# +# Copyright 2020 Staysail Systems, Inc. <info@staysail.tech> +# +# This software is supplied under the terms of the MIT License, a +# copy of which should be located in the distribution where this +# file was obtained (LICENSE.txt). A copy of the license may also be +# found online at https://opensource.org/licenses/MIT. +# + +# Some NNG helper functions. + +include(CheckFunctionExists) +include(CheckSymbolExists) +include(CheckStructHasMember) +include(CheckLibraryExists) +include(CheckCSourceCompiles) + +# nng_sources adds library sources using files in the current directory. +function(nng_sources) + foreach (f ${ARGN}) + target_sources(nng PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/${f}) + target_sources(nng_testing PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/${f}) + endforeach () +endfunction() + +# nng_headers adds library sources as public headers taken rooted at the include/ directory. +function(nng_headers) + foreach (f ${ARGN}) + target_sources(nng PRIVATE ${PROJECT_SOURCE_DIR}/include/${f}) + target_sources(nng_testing PRIVATE ${PROJECT_SOURCE_DIR}/include/${f}) + endforeach () +endfunction() + +# nng_defines adds defines unconditionally. +# The public library keeps these defines private, but the test library exposes these definitions +# as some of our test cases would like to know details about how the library was compiled +# as that may modify the tests themselves. +function(nng_defines) + target_compile_definitions(nng PRIVATE ${ARGN}) + target_compile_definitions(nng_testing PUBLIC ${ARGN}) + target_compile_definitions(nng_private INTERFACE ${ARGN}) +endfunction() + +# nng_link_libraries adds link dependencies to the libraries. +function(nng_link_libraries) + target_link_libraries(nng PRIVATE ${ARGN}) + target_link_libraries(nng_testing PRIVATE ${ARGN}) +endfunction() + +# nng_include_directories adds include directories. +function(nng_include_directories) + target_include_directories(nng PRIVATE ${ARGN}) + target_include_directories(nng_testing PRIVATE ${ARGN}) +endfunction() + + +# nng_sources_if adds the sources unconditionally to the test library, +# but conditionally to the production library. This allows us to get +# full test coverage while allowing a minimized delivery. +function(nng_sources_if COND) + foreach (f ${ARGN}) + if (${COND}) + target_sources(nng PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/${f}) + endif () + target_sources(nng_testing PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/${f}) + endforeach () +endfunction() + +function(nng_headers_if COND) + foreach (f ${ARGN}) + if (COND) + target_sources(nng PRIVATE ${PROJECT_SOURCE_DIR}/include/${f}) + endif () + target_sources(nng_testing PRIVATE ${PROJECT_SOURCE_DIR}/include/${f}) + endforeach () +endfunction() + +function(nng_defines_if COND) + if (${COND}) + target_compile_definitions(nng PRIVATE ${ARGN}) + target_compile_definitions(nng_private INTERFACE ${ARGN}) + endif () + target_compile_definitions(nng_testing PUBLIC ${ARGN}) +endfunction() + +function(nng_link_libraries_if COND) + if (${COND}) + target_link_libraries(nng PRIVATE ${ARGN}) + endif () + target_link_libraries(nng_testing PRIVATE ${ARGN}) +endfunction() + +function(nng_test NAME) + if (NNG_TESTS) + add_executable(${NAME} ${NAME}.c ${ARGN}) + target_link_libraries(${NAME} nng_testing) + target_include_directories(${NAME} PRIVATE + ${PROJECT_SOURCE_DIR}/tests + ${PROJECT_SOURCE_DIR}/src + ${PROJECT_SOURCE_DIR}/include) + add_test(NAME ${PROJECT_NAME}.${NAME} COMMAND ${NAME} -t) + set_tests_properties(${PROJECT_NAME}.${NAME} PROPERTIES TIMEOUT 180) + endif () +endfunction() + +function(nng_test_if COND NAME) + if (${COND} AND NNG_TESTS) + add_executable(${NAME} ${NAME}.c ${ARGN}) + target_link_libraries(${NAME} nng_testing) + target_include_directories(${NAME} PRIVATE + ${PROJECT_SOURCE_DIR}/tests + ${PROJECT_SOURCE_DIR}/src + ${PROJECT_SOURCE_DIR}/include) + add_test(NAME ${PROJECT_NAME}.${NAME} COMMAND ${NAME} -t) + set_tests_properties(${PROJECT_NAME}.${NAME} PROPERTIES TIMEOUT 180) + endif () +endfunction() + +function(nng_check_func SYM DEF) + check_function_exists(${SYM} ${DEF}) + if (${DEF}) + target_compile_definitions(nng PRIVATE ${DEF}=1) + target_compile_definitions(nng_testing PUBLIC ${DEF}=1) + target_compile_definitions(nng_private INTERFACE ${DEF}=1) + endif () +endfunction(nng_check_func) + +function(nng_check_sym SYM HDR DEF) + check_symbol_exists(${SYM} ${HDR} ${DEF}) + if (${DEF}) + target_compile_definitions(nng PRIVATE ${DEF}=1) + target_compile_definitions(nng_testing PUBLIC ${DEF}=1) + target_compile_definitions(nng_private INTERFACE ${DEF}=1) + endif () +endfunction(nng_check_sym) + +function(nng_check_lib LIB SYM DEF) + check_library_exists(${LIB} ${SYM} "" ${DEF}) + if (${DEF}) + target_compile_definitions(nng PRIVATE ${DEF}=1) + target_compile_definitions(nng_testing PUBLIC ${DEF}=1) + target_compile_definitions(nng_private INTERFACE ${DEF}=1) + target_link_libraries(nng PRIVATE ${LIB}) + target_link_libraries(nng_testing PRIVATE ${LIB}) + endif () +endfunction(nng_check_lib) + +function(nng_check_struct_member STR MEM HDR DEF) + check_struct_has_member("struct ${STR}" ${MEM} ${HDR} ${DEF}) + if (${DEF}) + target_compile_definitions(nng PRIVATE ${DEF}=1) + target_compile_definitions(nng_testing PUBLIC ${DEF}=1) + target_compile_definitions(nng_private INTERFACE ${DEF}=1) + endif () +endfunction(nng_check_struct_member) |
