aboutsummaryrefslogtreecommitdiff
path: root/cmake/NNGHelpers.cmake
diff options
context:
space:
mode:
authorGarrett D'Amore <garrett@damore.org>2020-11-13 22:31:18 -0800
committerGarrett D'Amore <garrett@damore.org>2020-11-14 21:31:43 -0800
commiteb328da56c3fc7167b536dcb206df0abb0f4a9b9 (patch)
treec92e3dd3db6a0f1b0efc6a027e7e4db6442068f0 /cmake/NNGHelpers.cmake
parent7c1ff5ed1e48af413494b9070cccf79f3858b749 (diff)
downloadnng-eb328da56c3fc7167b536dcb206df0abb0f4a9b9.tar.gz
nng-eb328da56c3fc7167b536dcb206df0abb0f4a9b9.tar.bz2
nng-eb328da56c3fc7167b536dcb206df0abb0f4a9b9.zip
fixes #1087 CMakeLists structural improvements desired
This doesn't modularize all the tests yet, but it goes a long way in the right direction.
Diffstat (limited to 'cmake/NNGHelpers.cmake')
-rw-r--r--cmake/NNGHelpers.cmake155
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)