set(thisDir "${CMAKE_CURRENT_LIST_DIR}") function(make_macro_name NAME OUT_VAR) string(STRIP "${NAME}" name) string(TOUPPER "${name}" name) string(REPLACE "-" "_" name "${name}") string(REGEX REPLACE "(^[0-9]+)|[^A-Z_0-9]" "" name "${name}") set(${OUT_VAR} "${name}" PARENT_SCOPE) endfunction() function(add_library_project NAME) set(options SHARED STATIC) set(oneValueArgs) set(multiValueArgs SOURCES TEST_SOURCES DEPENDENCIES) cmake_parse_arguments(PARAM "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) make_macro_name("${NAME}" macroName) set(testDependencies ${PARAM_DEPENDENCIES}) list(TRANSFORM testDependencies APPEND _Test) # static is the default, but we also allow static it explicitly set(libType STATIC) if (PARAM_SHARED AND PARAM_STATIC) message(FATAL_ERROR "Library project ${NAME} can only be SHARED or STATIC, but not both!") elseif (PARAM_SHARED) set(libType SHARED) endif () add_library("${NAME}" ${libType} ${PARAM_SOURCES}) target_link_libraries("${NAME}" PUBLIC ${PARAM_DEPENDENCIES}) target_include_directories("${NAME}" PUBLIC "${CMAKE_CURRENT_LIST_DIR}/include") if (PARAM_SHARED) target_compile_definitions("${NAME}" PRIVATE -D${macroName}_BUILD_SHARED) target_compile_definitions("${NAME}" INTERFACE -D${macroName}_USE_SHARED) endif () add_library("${NAME}_Test" STATIC ${PARAM_TEST_SOURCES}) target_link_libraries("${NAME}_Test" PUBLIC "${NAME}" gtest gmock ${testDependencies}) add_executable("${NAME}_Tests" ${PARAM_TEST_SOURCES}) target_link_libraries("${NAME}_Tests" PRIVATE "${NAME}" gtest gmock gmock_main ${testDependencies}) add_test(NAME "${NAME}" COMMAND "${NAME}_Tests") endfunction() function(add_executable_project) # TODO endfunction()