ProjectHelpers.cmake 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. set(thisDir "${CMAKE_CURRENT_LIST_DIR}")
  2. function(make_macro_name NAME OUT_VAR)
  3. string(STRIP "${NAME}" name)
  4. string(TOUPPER "${name}" name)
  5. string(REPLACE "-" "_" name "${name}")
  6. string(REGEX REPLACE "(^[0-9]+)|[^A-Z_0-9]" "" name "${name}")
  7. set(${OUT_VAR} "${name}" PARENT_SCOPE)
  8. endfunction()
  9. function(add_library_project NAME)
  10. set(options SHARED STATIC)
  11. set(oneValueArgs)
  12. set(multiValueArgs SOURCES TEST_SOURCES DEPENDENCIES)
  13. cmake_parse_arguments(PARAM "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
  14. make_macro_name("${NAME}" macroName)
  15. set(testDependencies ${PARAM_DEPENDENCIES})
  16. list(TRANSFORM testDependencies APPEND _Test)
  17. # static is the default, but we also allow static it explicitly
  18. set(libType STATIC)
  19. if (PARAM_SHARED AND PARAM_STATIC)
  20. message(FATAL_ERROR "Library project ${NAME} can only be SHARED or STATIC, but not both!")
  21. elseif (PARAM_SHARED)
  22. set(libType SHARED)
  23. endif ()
  24. add_library("${NAME}" ${libType} ${PARAM_SOURCES})
  25. target_link_libraries("${NAME}" PUBLIC ${PARAM_DEPENDENCIES})
  26. target_include_directories("${NAME}" PUBLIC "${CMAKE_CURRENT_LIST_DIR}/include")
  27. if (PARAM_SHARED)
  28. target_compile_definitions("${NAME}" PRIVATE -D${macroName}_BUILD_SHARED)
  29. target_compile_definitions("${NAME}" INTERFACE -D${macroName}_USE_SHARED)
  30. endif ()
  31. add_library("${NAME}_Test" STATIC ${PARAM_TEST_SOURCES})
  32. target_link_libraries("${NAME}_Test" PUBLIC "${NAME}" gtest gmock ${testDependencies})
  33. add_executable("${NAME}_Tests" ${PARAM_TEST_SOURCES})
  34. target_link_libraries("${NAME}_Tests" PRIVATE "${NAME}" gtest gmock gmock_main ${testDependencies})
  35. add_test(NAME "${NAME}" COMMAND "${NAME}_Tests")
  36. endfunction()
  37. function(add_executable_project)
  38. # TODO
  39. endfunction()