cmake_minimum_required(VERSION 3.18.2) project(Gradido_LoginServer C CXX) SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY "bin" ) SET ( CMAKE_CXX_FLAGS "-std=c++17" ) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) if(WIN32) set(CMAKE_CXX_FLAGS "/MP /EHsc") set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g3") set(CMAKE_CXX_FLAGS_RELEASE "-O3") else() set(INSTALL_BINDIR "bin") set(INSTALL_PLUGINDIR "bin") endif() include_directories( "dependencies" "dependencies/tinf/src" "dependencies/spirit-po/include" "/usr/local/include/mariadb" "build" "build/proto" "build/http_pages" "src/cpp" ) ############################## config and add grpc ################################### find_package(Protobuf REQUIRED) include_directories(${Protobuf_INCLUDE_DIRS}) set(PROTOBUF_LIBS protobuf::libprotobuf protobuf::libprotobuf-lite protobuf::libprotoc) ############################## parse proto files ################################### FILE(TO_NATIVE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/src/proto GRADIDO_PROTO_MODEL_PATH) FILE(TO_NATIVE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/build/proto PROTOBINDING_PATH) file(MAKE_DIRECTORY ${PROTOBINDING_PATH}) file(MAKE_DIRECTORY ${PROTOBINDING_PATH}/gradido) FILE(GLOB DATAMODEL_GRADIDO_PROTOS "${GRADIDO_PROTO_MODEL_PATH}/gradido/*.proto") FOREACH(proto ${DATAMODEL_GRADIDO_PROTOS}) FILE(TO_NATIVE_PATH ${proto} proto_native) get_filename_component(proto_parsed ${proto} NAME_WLE) FILE(TO_NATIVE_PATH ${PROTOBINDING_PATH}/gradido/${proto_parsed}.pb.h proto_parsed_native) IF(${proto_native} IS_NEWER_THAN ${proto_parsed_native}) EXECUTE_PROCESS( COMMAND ${PROTOBUF_PROTOC_EXECUTABLE} --proto_path=${GRADIDO_PROTO_MODEL_PATH} --cpp_out=${PROTOBINDING_PATH} ${proto_native} RESULT_VARIABLE rv ) # Optional, but that can show the user if something have gone wrong with the proto generation IF(${rv}) MESSAGE("Generation of data model returned ${rv} for proto ${proto_native}") ELSE() MESSAGE("Parsed: src/proto/gradido/${proto_parsed}.proto") ENDIF() ENDIF() ENDFOREACH(proto) ############################## parse cpsp Files #################################### FILE(TO_NATIVE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/src/cpsp GRADIDO_CPSP_PAGE_SRC_PATH) FILE(TO_NATIVE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/build/http_pages GRADIDO_HTTP_PAGES_PATH) file(MAKE_DIRECTORY ${GRADIDO_HTTP_PAGES_PATH}) FILE(GLOB GRADIDO_HTTP_PAGES_SRC "${GRADIDO_CPSP_PAGE_SRC_PATH}/*.cpsp") find_program(POCO_PAGE_COMPILER cpspc) MESSAGE("Poco Page Compiler: ${POCO_PAGE_COMPILER}") FOREACH(cpsp_file ${GRADIDO_HTTP_PAGES_SRC}) FILE(TO_NATIVE_PATH ${cpsp_file} cpsp_file_native) get_filename_component(cpsp_file_parsed ${cpsp_file} NAME_WLE) FILE(TO_NATIVE_PATH ${GRADIDO_HTTP_PAGES_PATH}/${cpsp_file_parsed}Page.cpp cpsp_file_parsed_native) IF(${cpsp_file_native} IS_NEWER_THAN ${cpsp_file_parsed_native}) EXECUTE_PROCESS( COMMAND ${POCO_PAGE_COMPILER} --output-dir=${GRADIDO_HTTP_PAGES_PATH} --header-output-dir=${GRADIDO_HTTP_PAGES_PATH} --noline ${cpsp_file_native} RESULT_VARIABLE rv ) # Optional, but that can show the user if something have gone wrong with the proto generation IF(${rv}) MESSAGE("Generation of HTTP Page return ${rv} for cpsp ${cpsp_file_native}") ELSE() MESSAGE("Parsed: src/cpsp/${cpsp_file_parsed}.cpsp") ENDIF() ENDIF() ENDFOREACH(cpsp_file) ############################## include src files ################################### #set(MYSQL_INCLUDE_DIR "dependencies/mariadb-connector-c/include") FILE(GLOB CONTROLLER "src/cpp/controller/*.cpp" "src/cpp/controller/*.h") FILE(GLOB TINF "dependencies/tinf/src/*.c" "dependencies/tinf/src/*.h") FILE(GLOB HTTPInterface "src/cpp/HTTPInterface/*.h" "src/cpp/HTTPInterface/*.cpp") FILE(GLOB COMPILED_PAGES "build/http_pages/*.h" "build/http_pages/*.cpp") FILE(GLOB JSONInterface "src/cpp/JSONInterface/*.h" "src/cpp/JSONInterface/*.cpp") FILE(GLOB TASKS "src/cpp/tasks/*.cpp" "src/cpp/tasks/*.h") FILE(GLOB SINGLETON_MANAGER "src/cpp/SingletonManager/*.h" "src/cpp/SingletonManager/*.cpp") FILE(GLOB LIB_SRC "src/cpp/lib/*.h" "src/cpp/lib/*.cpp") FILE(GLOB MODEL "src/cpp/model/*.h" "src/cpp/model/*.cpp") FILE(GLOB MODEL_TABLE "src/cpp/model/table/*.h" "src/cpp/model/table/*.cpp") FILE(GLOB MODEL_EMAIL "src/cpp/model/email/*.h" "src/cpp/model/email/*.cpp") FILE(GLOB MODEL_HEDERA "src/cpp/model/hedera/*.h" "src/cpp/model/hedera/*.cpp") FILE(GLOB MODEL_GRADIDO "src/cpp/model/gradido/*.h" "src/cpp/model/gradido/*.cpp") FILE(GLOB CRYPTO "src/cpp/Crypto/*.h" "src/cpp/Crypto/*.cpp") FILE(GLOB MAIN "src/cpp/*.cpp" "src/cpp/*.c" "src/cpp/*.h") FILE(GLOB MYSQL "src/cpp/MySQL/*.cpp" "src/cpp/MySQL/*.h" "src/cpp/MySQL/Poco/*.h") FILE(GLOB PROTO_GRADIDO "${PROTOBINDING_PATH}/gradido/*.cc" "${PROTOBINDING_PATH}/gradido/*.h") # used only for test project FILE(GLOB TEST "src/cpp/test/*.cpp" "src/cpp/test/*.h") FILE(GLOB TEST_CRYPTO "src/cpp/test/crypto/*.cpp" "src/cpp/test/crypto/*.h") FILE(GLOB TEST_MODEL "src/cpp/test/model/*.cpp" "src/cpp/test/model/*.h") FILE(GLOB TEST_MODEL_TABLE "src/cpp/test/model/table/*.cpp" "src/cpp/test/model/table/*.h") FILE(GLOB TEST_CONTROLLER "src/cpp/test/controller/*.cpp" "src/cpp/test/controller/*.h") FILE(GLOB TEST_JSON_INTERFACE "src/cpp/test/JSONInterface/*.cpp" "src/cpp/test/JSONInterface/*.h") SET(LOCAL_SRCS ${CONTROLLER} ${TINF} ${MAIN} ${HTTPInterface} ${COMPILED_PAGES} ${JSONInterface} ${CRYPTO} ${MODEL} ${MODEL_TABLE} ${MODEL_EMAIL} ${MODEL_HEDERA} ${MODEL_GRADIDO} ${SINGLETON_MANAGER} ${LIB_SRC} ${MYSQL} ${TASKS} ${PROTO_GRADIDO} ${PROTO_HEDERA} ) SET(LOCAL_TEST_SRC ${TEST} ${TEST_CRYPTO} ${TEST_MODEL} ${TEST_MODEL_TABLE} ${TEST_CONTROLLER} ${TEST_JSON_INTERFACE} ) aux_source_directory("src/cpp" LOCAL_SRCS) add_executable(Gradido_LoginServer ${LOCAL_SRCS}) ############################## find mariadb ################################### find_library(MYSQL_LIBRARIES mariadb PATHS "/usr/local/lib/mariadb" REQUIRED) ############################## config and add poco ################################### set(BUILD_LIB_PATH "(/usr/local/lib") IF(CMAKE_BUILD_TYPE MATCHES Debug) find_library(POCO_FOUNDATION_LIB PocoFoundationd PATHS ${BUILD_LIB_PATH} REQUIRED) find_library(POCO_UTIL_LIB PocoUtild PATHS ${BUILD_LIB_PATH} REQUIRED) find_library(POCO_NET_SSL_LIB PocoNetSSLd PATHS ${BUILD_LIB_PATH} REQUIRED) find_library(POCO_DATA_LIB PocoDatad PATHS ${BUILD_LIB_PATH} REQUIRED) find_library(POCO_JSON_LIB PocoJSONd PATHS ${BUILD_LIB_PATH} REQUIRED) find_library(POCO_NET_LIB PocoNetd PATHS ${BUILD_LIB_PATH} REQUIRED) message("use Poco Debug libs") ELSE() find_library(POCO_FOUNDATION_LIB PocoFoundation PATHS ${BUILD_LIB_PATH} REQUIRED) find_library(POCO_UTIL_LIB PocoUtil PATHS ${BUILD_LIB_PATH} REQUIRED) find_library(POCO_NET_SSL_LIB PocoNetSSL PATHS ${BUILD_LIB_PATH} REQUIRED) find_library(POCO_DATA_LIB PocoData PATHS ${BUILD_LIB_PATH} REQUIRED) find_library(POCO_JSON_LIB PocoJSON PATHS ${BUILD_LIB_PATH} REQUIRED) find_library(POCO_NET_LIB PocoNet PATHS ${BUILD_LIB_PATH} REQUIRED) message("use Poco Release libs") ENDIF() set(POCO_LIBS ${POCO_FOUNDATION_LIB} ${POCO_UTIL_LIB} ${POCO_NET_SSL_LIB} ${POCO_DATA_LIB} ${POCO_JSON_LIB} ${POCO_NET_LIB}) ############################## build login server ################################### target_link_libraries(Gradido_LoginServer ${PROTOBUF_LIBS} ${MYSQL_LIBRARIES} ${POCO_LIBS} sodium pthread) ############################## build login server test ################################### IF(CMAKE_BUILD_TYPE STREQUAL "Debug") project(Gradido_LoginServer_Test C CXX) enable_testing() option(COLLECT_COVERAGE_DATA "Use cov to collect coverage informations" OFF) set(COVERAGE_TOOL "Coverage Tool (gcovr|lcov|fastcov)" CACHE STRING "gcovr") if(COLLECT_COVERAGE_DATA) include(cmake/CodeCoverage.cmake) append_coverage_compiler_flags() set(EXCLUDE_FOR_HTML_COV "${CMAKE_CURRENT_SOURCE_DIR}/build/proto/*" "${CMAKE_CURRENT_SOURCE_DIR}/dependencies/*" "${CMAKE_CURRENT_SOURCE_DIR}/src/cpp/test/*" "${CMAKE_CURRENT_SOURCE_DIR}/googletest/googletest/include/gtest/internal/*" "${CMAKE_CURRENT_SOURCE_DIR}/googletest/googletest/src/" ) if("${COVERAGE_TOOL}" STREQUAL "gcovr") setup_target_for_coverage_gcovr_html( NAME coverage EXECUTABLE Gradido_LoginServer_Test EXCLUDE ${EXCLUDE_FOR_HTML_COV} GCOVR_ADDITIONAL_ARGS "--txt " #DEPENDENCIES lib/libmariadb.so.3 ) endif() set(EXCLUDE_FOR_COV ${EXCLUDE_FOR_HTML_COV} "/usr/include/*" ) if("${COVERAGE_TOOL}" STREQUAL "lcov") setup_target_for_coverage_lcov( NAME coverage EXECUTABLE Gradido_LoginServer_Test EXCLUDE "${EXCLUDE_FOR_COV}" #DEPENDENCIES lib/libmariadb.so.3 ) endif() if("${COVERAGE_TOOL}" STREQUAL "fastcov") setup_target_for_coverage_fastcov( NAME coverage # New target name EXECUTABLE Gradido_LoginServer_Test -j ${PROCESSOR_COUNT} # Executable in PROJECT_BINARY_DIR #BASE_DIRECTORY "coverage" # Base directory for report # (defaults to PROJECT_SOURCE_DIR) EXCLUDE "${EXCLUDE_FOR_COV}" # Patterns to exclude. NO_DEMANGLE # Don't demangle C++ symbols # even if c++filt is found SKIP_HTML # Don't create html report ) endif() endif() #_TEST_BUILD add_subdirectory("googletest") add_executable(Gradido_LoginServer_Test ${LOCAL_SRCS} ${LOCAL_TEST_SRC}) target_compile_definitions(Gradido_LoginServer_Test PUBLIC "_TEST_BUILD") target_link_libraries(Gradido_LoginServer_Test ${GRPC_LIBS} ) if(WIN32) target_link_libraries(Gradido_LoginServer_Test ${CONAN_LIBS} ) #TARGET_LINK_LIBRARIES(Gradido_LoginServer_Test optimized ${MYSQL_LIBRARIES} Shlwapi) #TARGET_LINK_LIBRARIES(Gradido_LoginServer_Test debug ${COMPILED_MARIADB_CLIENT_DEBUG} Shlwapi) #TARGET_LINK_LIBRARIES(Gradido_LoginServer_Test debug ${GRPC_LIBS} ${PROTOBUF_DEBUG_LIBS}) else() target_link_libraries(Gradido_LoginServer_Test ${PROTOBUF_LIBS} ${MYSQL_LIBRARIES} ${POCO_LIBS} sodium pthread gtest) endif() add_test(NAME main COMMAND Gradido_LoginServer_Test) ENDIF()