From 6e1c62033c3063f7e8a8bca4767184168b00ffae Mon Sep 17 00:00:00 2001 From: Joscha Schmiedt <joscha@schmiedt.dev> Date: Tue, 13 Aug 2024 20:58:36 +0200 Subject: [PATCH] Revert CMakeLists.txt but use but use ${Protobuf_PROTOC_EXECUTABLE} --- CMakeLists.txt | 681 +++++++++++++++++++++++-------------------------- 1 file changed, 318 insertions(+), 363 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1cc6993..867b117 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,9 +20,6 @@ cmake_minimum_required(VERSION 3.13) -set(CMAKE_TOOLCHAIN_FILE "${CMAKE_CURRENT_SOURCE_DIR}/vcpkg/scripts/buildsystems/vcpkg.cmake" - CACHE STRING "Vcpkg toolchain file") - set(libcaosdb_VERSION 0.3.0) set(libcaosdb_COMPATIBLE_SERVER_VERSION_MAJOR 0) set(libcaosdb_COMPATIBLE_SERVER_VERSION_MINOR 9) @@ -79,95 +76,76 @@ set(PROJECT_INCLUDE_DIR "${PROJECT_SOURCE_DIR}/include") add_subdirectory(src) add_subdirectory(include) add_subdirectory(doc) -add_subdirectory(proto) - #################################################################### ### CODE GENERATION (WITH GRPC) #################################################################### -# TODO: Replace this with the protobuf_generate_cpp function - - -# # Protobuf/Grpc source files -# set(PROTO_FILES -# ${PROJECT_SOURCE_DIR}/proto/proto/caosdb/info/v1/main.proto -# ${PROJECT_SOURCE_DIR}/proto/proto/caosdb/entity/v1/main.proto -# ) +find_package(Protobuf CONFIG REQUIRED) +# Protobuf/Grpc source files +set(PROTO_FILES + ${PROJECT_SOURCE_DIR}/proto/proto/caosdb/info/v1/main.proto + ${PROJECT_SOURCE_DIR}/proto/proto/caosdb/entity/v1/main.proto +) +IF (BUILD_ACM) + list(APPEND PROTO_FILES + ${PROJECT_SOURCE_DIR}/proto/proto/caosdb/acm/v1alpha1/main.proto + ) +ENDIF() -# IF (BUILD_ACM) -# list(APPEND PROTO_FILES -# ${PROJECT_SOURCE_DIR}/proto/proto/caosdb/acm/v1alpha1/main.proto -# ) -# ENDIF() - -# find_package(protobuf REQUIRED) -# include_directories(${Protobuf_INCLUDE_DIRS}) -# include_directories(${CMAKE_CURRENT_BINARY_DIR}) -# # protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS ${PROTO_FILES}) -# # protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS ${PROJECT_SOURCE_DIR}/proto/proto/caosdb/info/v1/main.proto) -# protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS ${PROJECT_SOURCE_DIR}/proto/proto/caosdb/entity/v1/main.proto) -# message(STATUS "PROTO_FILES: ${PROTO_FILES}") -# message(STATUS "PROTO_SRCS: ${PROTO_SRCS}") -# message(STATUS "PROTO_HDRS: ${PROTO_HDRS}") - -# set(PROTO_PATH ${PROJECT_SOURCE_DIR}/proto/proto) +set(PROTO_PATH ${PROJECT_SOURCE_DIR}/proto/proto) +set(_PROTOBUF_PROTOC ${Protobuf_PROTOC_EXECUTABLE}) # compiler binaries +IF (WIN32) + set(_GRPC_CPP_PLUGIN_EXECUTABLE "${CMAKE_BINARY_DIR}/build_tools/grpc_cpp_plugin.exe") +ELSE() + set(_GRPC_CPP_PLUGIN_EXECUTABLE "${CMAKE_BINARY_DIR}/build_tools/grpc_cpp_plugin") +ENDIF() - - -# IF (WIN32) -# set(_PROTOBUF_PROTOC "${CMAKE_BINARY_DIR}/build_tools/protoc.exe") -# set(_GRPC_CPP_PLUGIN_EXECUTABLE "${CMAKE_BINARY_DIR}/build_tools/grpc_cpp_plugin.exe") -# ELSE() -# set(_PROTOBUF_PROTOC "${CMAKE_BINARY_DIR}/build_tools/protoc") -# set(_GRPC_CPP_PLUGIN_EXECUTABLE "${CMAKE_BINARY_DIR}/build_tools/grpc_cpp_plugin") -# ENDIF() - -# # Generated sources -# list(LENGTH PROTO_FILES len_proto_files) -# math(EXPR len_proto_files "${len_proto_files} - 1") -# foreach(i RANGE "${len_proto_files}") -# list(GET PROTO_FILES ${i} next_proto_file) - -# # strip away the prefix path and the ".proto" suffix -# string(REPLACE -# "${PROJECT_SOURCE_DIR}/proto/proto/caosdb/" -# "" -# next_proto_module -# "${next_proto_file}") -# string(REPLACE -# ".proto" -# "" -# next_proto_module -# "${next_proto_module}") -# set(next_proto_src -# "${CMAKE_CURRENT_BINARY_DIR}/include/caosdb/${next_proto_module}.pb.cc") -# set(next_proto_hdr -# "${CMAKE_CURRENT_BINARY_DIR}/include/caosdb/${next_proto_module}.pb.h") -# set(next_grpc_src -# "${CMAKE_CURRENT_BINARY_DIR}/include/caosdb/${next_proto_module}.grpc.pb.cc") -# set(next_grpc_hdr -# "${CMAKE_CURRENT_BINARY_DIR}/include/caosdb/${next_proto_module}.grpc.pb.h") -# list(APPEND GRPC_GENERATED_HEADERS "${next_proto_hdr}" "${next_grpc_hdr}") -# list(APPEND GRPC_GENERATED_SOURCES "${next_proto_src}" "${next_grpc_src}") -# endforeach() - -# set(GRPC_GENERATED -# ${GRPC_GENERATED_SOURCES} -# ${GRPC_GENERATED_HEADERS}) -# add_custom_command( -# OUTPUT ${GRPC_GENERATED} -# COMMAND ${_PROTOBUF_PROTOC} -# ARGS --grpc_out "${CMAKE_CURRENT_BINARY_DIR}/include" -# --cpp_out "${CMAKE_CURRENT_BINARY_DIR}/include" -# -I "${PROTO_PATH}" -# --plugin=protoc-gen-grpc="${_GRPC_CPP_PLUGIN_EXECUTABLE}" -# ${PROTO_FILES} -# DEPENDS ${PROTO_FILES}) +# Generated sources +list(LENGTH PROTO_FILES len_proto_files) +math(EXPR len_proto_files "${len_proto_files} - 1") +foreach(i RANGE "${len_proto_files}") + list(GET PROTO_FILES ${i} next_proto_file) + + # strip away the prefix path and the ".proto" suffix + string(REPLACE + "${PROJECT_SOURCE_DIR}/proto/proto/caosdb/" + "" + next_proto_module + "${next_proto_file}") + string(REPLACE + ".proto" + "" + next_proto_module + "${next_proto_module}") + set(next_proto_src + "${CMAKE_CURRENT_BINARY_DIR}/include/caosdb/${next_proto_module}.pb.cc") + set(next_proto_hdr + "${CMAKE_CURRENT_BINARY_DIR}/include/caosdb/${next_proto_module}.pb.h") + set(next_grpc_src + "${CMAKE_CURRENT_BINARY_DIR}/include/caosdb/${next_proto_module}.grpc.pb.cc") + set(next_grpc_hdr + "${CMAKE_CURRENT_BINARY_DIR}/include/caosdb/${next_proto_module}.grpc.pb.h") + list(APPEND GRPC_GENERATED_HEADERS "${next_proto_hdr}" "${next_grpc_hdr}") + list(APPEND GRPC_GENERATED_SOURCES "${next_proto_src}" "${next_grpc_src}") +endforeach() + +set(GRPC_GENERATED + ${GRPC_GENERATED_SOURCES} + ${GRPC_GENERATED_HEADERS}) +add_custom_command( + OUTPUT ${GRPC_GENERATED} + COMMAND ${_PROTOBUF_PROTOC} + ARGS --grpc_out "${CMAKE_CURRENT_BINARY_DIR}/include" + --cpp_out "${CMAKE_CURRENT_BINARY_DIR}/include" + -I "${PROTO_PATH}" + --plugin=protoc-gen-grpc="${_GRPC_CPP_PLUGIN_EXECUTABLE}" + ${PROTO_FILES} + DEPENDS ${PROTO_FILES}) # show generated files message(DEBUG "GRPC_GENERATED: ${GRPC_GENERATED}") @@ -183,32 +161,9 @@ message(DEBUG "GRPC_GENERATED: ${GRPC_GENERATED}") ############################################################################### find_package(gRPC CONFIG REQUIRED) -# find_package(protobuf CONFIG REQUIRED) - -# boost find_package(Boost REQUIRED) -# find_package(boost_smart_ptr CONFIG REQUIRED) -# find_package(boost_filesystem CONFIG REQUIRED) -# find_package(boost_json CONFIG REQUIRED) -# find_package(boost_log CONFIG REQUIRED) -# find_package(boost_thread CONFIG REQUIRED) -# find_package(boost_beast CONFIG REQUIRED) -find_package(Boost COMPONENTS json REQUIRED) -find_package(Boost COMPONENTS filesystem REQUIRED) -find_package(Boost COMPONENTS log REQUIRED) -find_package(Boost COMPONENTS thread REQUIRED) -find_package(Boost COMPONENTS system REQUIRED) -# find_package(Boost COMPONENTS smart_ptr REQUIRED) -find_package(Boost COMPONENTS beast REQUIRED) - - find_package(GTest REQUIRED) - -set(dependencies - gRPC::gpr gRPC::grpc gRPC::grpc++ protobuf::libprotoc protobuf::libprotobuf - Boost::filesystem Boost::json Boost::log Boost::thread) - # print include directories for debugging message(DEBUG "CMAKE_INCLUDE_PATH: ${CMAKE_INCLUDE_PATH}") message(DEBUG "PROTOBUF_INCLUDE_DIRS: ${PROTOBUF_INCLUDE_DIRS}") @@ -242,7 +197,7 @@ else() add_library(caosdb SHARED ${libcaosdb_INCL} ${libcaosdb_SRC} ${GRPC_GENERATED}) target_link_libraries(caosdb - ${dependencies} + grpc::grpc protobuf::protobuf boost::boost stdc++fs ) set(LIBCAOSDB caosdb) @@ -259,54 +214,54 @@ target_include_directories(caosdb PUBLIC -# # libccaosdb -# # ---------- -# add_library(ccaosdb SHARED src/ccaosdb.cpp) -# target_link_libraries(ccaosdb -# dependencies -# ${LIBCAOSDB} -# stdc++fs -# ) -# target_include_directories(ccaosdb PUBLIC -# $<BUILD_INTERFACE:${libcaosdb_SOURCE_DIR}/include> -# $<BUILD_INTERFACE:${libcaosdb_BINARY_DIR}/include> -# $<INSTALL_INTERFACE:include> -# ) - - -# # ccaosdbcli -# # ---------- -# add_executable(ccaosdbcli EXCLUDE_FROM_ALL src/ccaosdbcli.c) -# target_include_directories(ccaosdbcli PUBLIC -# $<BUILD_INTERFACE:${libcaosdb_SOURCE_DIR}/include> -# $<BUILD_INTERFACE:${libcaosdb_BINARY_DIR}/include> -# $<INSTALL_INTERFACE:include> -# ) -# target_include_directories(ccaosdbcli SYSTEM PUBLIC -# ${CONAN_INCLUDE_DIRS} -# ) - -# target_link_libraries(ccaosdbcli -# dependencies -# ${LIBCAOSDB} -# ccaosdb -# ) - -# # cxxcaosdbcli -# # ------------ -# add_executable(cxxcaosdbcli EXCLUDE_FROM_ALL src/cxxcaosdbcli.cpp) -# target_include_directories(cxxcaosdbcli PUBLIC -# $<BUILD_INTERFACE:${libcaosdb_SOURCE_DIR}/include> -# $<BUILD_INTERFACE:${libcaosdb_BINARY_DIR}/include> -# $<INSTALL_INTERFACE:include> -# ) -# target_include_directories(cxxcaosdbcli SYSTEM PUBLIC -# ${CONAN_INCLUDE_DIRS} -# ) -# target_link_libraries(cxxcaosdbcli -# ${LIBCAOSDB} -# dependencies -# ) +# libccaosdb +# ---------- +add_library(ccaosdb SHARED src/ccaosdb.cpp) +target_link_libraries(ccaosdb + grpc::grpc protobuf::protobuf boost::boost + ${LIBCAOSDB} + stdc++fs +) +target_include_directories(ccaosdb PUBLIC + $<BUILD_INTERFACE:${libcaosdb_SOURCE_DIR}/include> + $<BUILD_INTERFACE:${libcaosdb_BINARY_DIR}/include> + $<INSTALL_INTERFACE:include> +) + + +# ccaosdbcli +# ---------- +add_executable(ccaosdbcli EXCLUDE_FROM_ALL src/ccaosdbcli.c) +target_include_directories(ccaosdbcli PUBLIC + $<BUILD_INTERFACE:${libcaosdb_SOURCE_DIR}/include> + $<BUILD_INTERFACE:${libcaosdb_BINARY_DIR}/include> + $<INSTALL_INTERFACE:include> +) +target_include_directories(ccaosdbcli SYSTEM PUBLIC + ${CONAN_INCLUDE_DIRS} +) + +target_link_libraries(ccaosdbcli + grpc::grpc protobuf::protobuf boost::boost + ${LIBCAOSDB} + ccaosdb +) + +# cxxcaosdbcli +# ------------ +add_executable(cxxcaosdbcli EXCLUDE_FROM_ALL src/cxxcaosdbcli.cpp) +target_include_directories(cxxcaosdbcli PUBLIC + $<BUILD_INTERFACE:${libcaosdb_SOURCE_DIR}/include> + $<BUILD_INTERFACE:${libcaosdb_BINARY_DIR}/include> + $<INSTALL_INTERFACE:include> +) +target_include_directories(cxxcaosdbcli SYSTEM PUBLIC + ${CONAN_INCLUDE_DIRS} +) +target_link_libraries(cxxcaosdbcli + ${LIBCAOSDB} + grpc::grpc protobuf::protobuf boost::boost +) @@ -314,213 +269,213 @@ target_include_directories(caosdb PUBLIC ### LINTING with CLANG-TIDY and INCLUDE-WHAT-YOU-USE ####################################################### -# include(CheckCXXCompilerFlag) -# include(CheckCCompilerFlag) - -# function(add_compiler_flag flag) -# string(FIND "${CMAKE_CXX_FLAGS}" "${flag}" cxx_present) -# if(cxx_present EQUAL -1) -# check_cxx_compiler_flag("${flag}" flag_supported) -# if(flag_supported) -# set(PEDANTIC_CMAKE_CXX_FLAGS "${PEDANTIC_CMAKE_CXX_FLAGS} ${flag}" PARENT_SCOPE) -# endif() -# unset(flag_supported CACHE) -# endif() -# unset(cxx_present CACHE) - -# string(FIND "${CMAKE_C_FLAGS}" "${flag}" c_present) -# if(c_present EQUAL -1) -# check_cxx_compiler_flag("${flag}" flag_supported) -# if(flag_supported) -# set(PEDANTIC_CMAKE_C_FLAGS "${PEDANTIC_CMAKE_C_FLAGS} ${flag}" PARENT_SCOPE) -# endif() -# unset(flag_supported CACHE) -# endif() -# unset(c_present CACHE) -# endfunction() - - - -# option(LINTING "Enable linting with clang-tidy and iwyu when in non-Debug build-type" OFF) -# if("${CMAKE_BUILD_TYPE}" MATCHES "Debug" OR LINTING) -# set(_LINTING ON) -# endif() -# option(SKIP_LINTING "Skip linting even when in Debug build-type" OFF) -# if("${CMAKE_BUILD_TYPE}" MATCHES "Debug" AND SKIP_LINTING) -# message(WARNING "Skipping linting due to SKIP_LINTING option") -# set(_LINTING OFF) -# endif() -# if(_LINTING) - -# ### set paranoid compiler flags -# add_compiler_flag("-Wall") -# add_compiler_flag("-Wextra") -# add_compiler_flag("-pedantic") -# # add_compiler_flag("-Werror") # removed until issue #71 is resolved - -# message(STATUS "PEDANTIC_CMAKE_CXX_FLAGS: [${PEDANTIC_CMAKE_CXX_FLAGS}]") -# set(TARGET_CAOSDB_COMPILE_FLAGS "${TARGET_CAOSDB_COMPILE_FLAGS} ${PEDANTIC_CMAKE_CXX_FLAGS}") -# set(TARGET_CCAOSDB_COMPILE_FLAGS "${TARGET_CCAOSDB_COMPILE_FLAGS} ${PEDANTIC_CMAKE_C_FLAGS}") -# set(TARGET_CXXCAOSDBCLI_COMPILE_FLAGS "${TARGET_CXXCAOSDBCLI_COMPILE_FLAGS} ${PEDANTIC_CMAKE_CXX_FLAGS}") -# set(TARGET_CCAOSDBCLI_COMPILE_FLAGS "${TARGET_CCAOSDBCLI_COMPILE_FLAGS} ${PEDANTIC_CMAKE_C_FLAGS}") - -# set_target_properties(caosdb PROPERTIES -# COMPILE_FLAGS "${TARGET_CAOSDB_COMPILE_FLAGS}") -# set_target_properties(ccaosdb PROPERTIES -# COMPILE_FLAGS "${TARGET_CCAOSDB_COMPILE_FLAGS}") -# set_target_properties(cxxcaosdbcli PROPERTIES -# COMPILE_FLAGS "${TARGET_CXXCAOSDBCLI_COMPILE_FLAGS}") -# set_target_properties(ccaosdbcli PROPERTIES -# COMPILE_FLAGS "${TARGET_CCAOSDBCLI_COMPILE_FLAGS}") - -# find_program(iwyu -# NAMES include-what-you-use iwyu -# PATHS ${CMAKE_SOURCE_DIR}/tools/include-what-you-use/${iwyu_os}/bin) -# if(NOT iwyu) -# message(WARNING "include-what-you-use: Not found") -# else() -# message(STATUS "include-what-you-use: ${iwyu}") -# set(_CMAKE_CXX_INCLUDE_WHAT_YOU_USE ${iwyu} -# "-Xiwyu" "--cxx17ns" "-Xiwyu" "--no_fwd_decls") - -# set_target_properties(caosdb PROPERTIES -# CXX_INCLUDE_WHAT_YOU_USE "${_CMAKE_CXX_INCLUDE_WHAT_YOU_USE}" -# ) -# set_target_properties(cxxcaosdbcli PROPERTIES -# CXX_INCLUDE_WHAT_YOU_USE "${_CMAKE_CXX_INCLUDE_WHAT_YOU_USE}" -# ) -# set_target_properties(ccaosdbcli PROPERTIES -# C_INCLUDE_WHAT_YOU_USE "${_CMAKE_CXX_INCLUDE_WHAT_YOU_USE}" -# ) -# endif() - -# find_program(clang_tidy NAMES clang-tidy clang-tidy-11) -# if(NOT clang_tidy) -# message(WARNING "clang-tidy: Not found") -# else() -# message(STATUS "clang-tidy: ${clang_tidy}") -# set(_CMAKE_CXX_CLANG_TIDY_CHECKS -# "--checks=*,-fuchsia-*,-llvmlibc-*,-readability-convert-member-functions-to-static,-cppcoreguidelines-pro-bounds-array-to-pointer-decay,-hicpp-no-array-decay,-llvm-else-after-return,-readability-else-after-return,-modernize-use-trailing-return-type,-bugprone-branch-clone,-altera-*,-misc-include-cleaner,-readability-identifier-*,-llvm-include-order,-misc-const-correctness") -# set(_CMAKE_C_CLANG_TIDY_CHECKS "${_CMAKE_CXX_CLANG_TIDY_CHECKS}") -# set(_CMAKE_CXX_CLANG_TIDY "${clang_tidy}" -# "--header-filter=caosdb/.*[^\(\.pb\.h\)]$") -# # "--warnings-as-errors=*") -# set(_CMAKE_C_CLANG_TIDY "${_CMAKE_CXX_CLANG_TIDY}") -# option(AUTO_FIX_LINTING "Append --fix option to clang-tidy" OFF) -# if(AUTO_FIX_LINTING) -# set(_CMAKE_CXX_CLANG_TIDY "${_CMAKE_CXX_CLANG_TIDY};--fix") -# endif() -# message(STATUS "Using clang-tidy with -# '${_CMAKE_CXX_CLANG_TIDY};${_CMAKE_CXX_CLANG_TIDY_CHECKS}'") -# set_target_properties(caosdb PROPERTIES -# CXX_CLANG_TIDY "${_CMAKE_CXX_CLANG_TIDY};${_CMAKE_CXX_CLANG_TIDY_CHECKS}" -# ) -# set_target_properties(cxxcaosdbcli PROPERTIES -# CXX_CLANG_TIDY "${_CMAKE_CXX_CLANG_TIDY};${_CMAKE_CXX_CLANG_TIDY_CHECKS}" -# ) -# set_target_properties(ccaosdb PROPERTIES -# C_CLANG_TIDY "${_CMAKE_C_CLANG_TIDY};${_CMAKE_C_CLANG_TIDY_CHECKS}" -# ) -# set_target_properties(ccaosdbcli PROPERTIES -# C_CLANG_TIDY "${_CMAKE_C_CLANG_TIDY};${_CMAKE_C_CLANG_TIDY_CHECKS}" -# ) -# endif() -# endif() - - -# ####################################################### -# ### UNIT TEST -# ####################################################### - -# if("${CMAKE_BUILD_TYPE}" MATCHES "Debug") -# enable_testing() -# add_subdirectory(test) -# endif() - -# # ############################################### -# # ############ INSTALLATION ##################### -# # ############################################### - -# set(libcaosdb_INCLUDE_DEST "include/caosdb") -# set(libcaosdb_LIB_DEST "lib") - -# set(CMAKE_INSTALL_PREFIX "$ENV{HOME}/.local/") -# install( -# # targets to install -# TARGETS ${LIBCAOSDB} ccaosdb -# # name of the CMake "export group" containing the targets we want to install -# EXPORT caosdbTargets -# # Dynamic, static library and include destination locations after running -# # "make install" -# LIBRARY DESTINATION ${libcaosdb_LIB_DEST} -# ARCHIVE DESTINATION ${libcaosdb_LIB_DEST} -# INCLUDES DESTINATION ${libcaosdb_INCLUDE_DEST} -# ) - - -# set(libcaosdb_CMAKE_DEST "${libcaosdb_LIB_DEST}/cmake/caosdb") -# install( -# # The export we want to save (matches name defined above containing the -# # install targets) -# EXPORT caosdbTargets -# # CMake file in which to store the export's information -# FILE caosdbTargets.cmake -# # Namespace prepends all targets in the export (when we import later, we -# # will use caosdb::caosdb) -# NAMESPACE caosdb:: -# # where to place the resulting file (here, we're putting it with the library) -# DESTINATION ${libcaosdb_CMAKE_DEST} -# ) - -# install(FILES ${libcaosdb_INCL} ${PROJECT_SOURCE_DIR}/include/ccaosdb.h DESTINATION ${libcaosdb_INCLUDE_DEST}) -# foreach(i RANGE "${len_proto_files}") -# list(GET PROTO_FILES ${i} next_proto_file) - -# # strip away the prefix path and the ".proto" suffix -# string(REPLACE -# "${PROJECT_SOURCE_DIR}/proto/proto/caosdb/" -# "" -# next_proto_module -# "${next_proto_file}") -# string(REPLACE -# "/main.proto" -# "" -# next_proto_module -# "${next_proto_module}") -# set(next_proto_hdr -# "${CMAKE_CURRENT_BINARY_DIR}/include/caosdb/${next_proto_module}/main.pb.h") -# set(next_grpc_hdr -# "${CMAKE_CURRENT_BINARY_DIR}/include/caosdb/${next_proto_module}/main.grpc.pb.h") -# install(FILES ${next_proto_hdr} ${next_grpc_hdr} DESTINATION -# ${libcaosdb_INCLUDE_DEST}/${next_proto_module}) -# endforeach() - -# install(FILES ${PROJECT_SOURCE_DIR}/caosdbConfig.cmake -# DESTINATION ${libcaosdb_CMAKE_DEST}) - -# #set_property(TARGET caosdb PROPERTY VERSION ${libcaosdb_VERSION}) -# include(CMakePackageConfigHelpers) -# write_basic_package_version_file( -# "${PROJECT_SOURCE_DIR}/caosdbConfigVersion.cmake" -# VERSION ${libcaosdb_VERSION} -# COMPATIBILITY AnyNewerVersion -# ) -# install(FILES ${PROJECT_SOURCE_DIR}/caosdbConfigVersion.cmake -# DESTINATION ${libcaosdb_CMAKE_DEST}) - -# ####################################################### -# ### code formatting with clang-format -# ####################################################### -# option(AUTOFORMATTING "call clang-format at configure time" ON) -# if(AUTOFORMATTING AND NOT SKIP_LINTING) -# find_program(clang_format NAMES clang-format-11 clang-format) -# file(GLOB format_test_sources test/*.cpp test/*.h test/*.h.in) -# execute_process(COMMAND ${clang_format} -i --verbose ${libcaosdb_INCL} -# ${libcaosdb_SRC} ${libcaosdb_TEST_SRC} -# ${PROJECT_SOURCE_DIR}/src/cxxcaosdbcli.cpp -# ${PROJECT_SOURCE_DIR}/src/ccaosdbcli.c -# ${PROJECT_SOURCE_DIR}/src/ccaosdb.cpp -# ${PROJECT_SOURCE_DIR}/include/ccaosdb.h -# ${format_test_sources} -# WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}) -# endif() +include(CheckCXXCompilerFlag) +include(CheckCCompilerFlag) + +function(add_compiler_flag flag) + string(FIND "${CMAKE_CXX_FLAGS}" "${flag}" cxx_present) + if(cxx_present EQUAL -1) + check_cxx_compiler_flag("${flag}" flag_supported) + if(flag_supported) + set(PEDANTIC_CMAKE_CXX_FLAGS "${PEDANTIC_CMAKE_CXX_FLAGS} ${flag}" PARENT_SCOPE) + endif() + unset(flag_supported CACHE) + endif() + unset(cxx_present CACHE) + + string(FIND "${CMAKE_C_FLAGS}" "${flag}" c_present) + if(c_present EQUAL -1) + check_cxx_compiler_flag("${flag}" flag_supported) + if(flag_supported) + set(PEDANTIC_CMAKE_C_FLAGS "${PEDANTIC_CMAKE_C_FLAGS} ${flag}" PARENT_SCOPE) + endif() + unset(flag_supported CACHE) + endif() + unset(c_present CACHE) +endfunction() + + + +option(LINTING "Enable linting with clang-tidy and iwyu when in non-Debug build-type" OFF) +if("${CMAKE_BUILD_TYPE}" MATCHES "Debug" OR LINTING) + set(_LINTING ON) +endif() +option(SKIP_LINTING "Skip linting even when in Debug build-type" OFF) +if("${CMAKE_BUILD_TYPE}" MATCHES "Debug" AND SKIP_LINTING) + message(WARNING "Skipping linting due to SKIP_LINTING option") + set(_LINTING OFF) +endif() +if(_LINTING) + + ### set paranoid compiler flags + add_compiler_flag("-Wall") + add_compiler_flag("-Wextra") + add_compiler_flag("-pedantic") + # add_compiler_flag("-Werror") # removed until issue #71 is resolved + + message(STATUS "PEDANTIC_CMAKE_CXX_FLAGS: [${PEDANTIC_CMAKE_CXX_FLAGS}]") + set(TARGET_CAOSDB_COMPILE_FLAGS "${TARGET_CAOSDB_COMPILE_FLAGS} ${PEDANTIC_CMAKE_CXX_FLAGS}") + set(TARGET_CCAOSDB_COMPILE_FLAGS "${TARGET_CCAOSDB_COMPILE_FLAGS} ${PEDANTIC_CMAKE_C_FLAGS}") + set(TARGET_CXXCAOSDBCLI_COMPILE_FLAGS "${TARGET_CXXCAOSDBCLI_COMPILE_FLAGS} ${PEDANTIC_CMAKE_CXX_FLAGS}") + set(TARGET_CCAOSDBCLI_COMPILE_FLAGS "${TARGET_CCAOSDBCLI_COMPILE_FLAGS} ${PEDANTIC_CMAKE_C_FLAGS}") + + set_target_properties(caosdb PROPERTIES + COMPILE_FLAGS "${TARGET_CAOSDB_COMPILE_FLAGS}") + set_target_properties(ccaosdb PROPERTIES + COMPILE_FLAGS "${TARGET_CCAOSDB_COMPILE_FLAGS}") + set_target_properties(cxxcaosdbcli PROPERTIES + COMPILE_FLAGS "${TARGET_CXXCAOSDBCLI_COMPILE_FLAGS}") + set_target_properties(ccaosdbcli PROPERTIES + COMPILE_FLAGS "${TARGET_CCAOSDBCLI_COMPILE_FLAGS}") + + find_program(iwyu + NAMES include-what-you-use iwyu + PATHS ${CMAKE_SOURCE_DIR}/tools/include-what-you-use/${iwyu_os}/bin) + if(NOT iwyu) + message(WARNING "include-what-you-use: Not found") + else() + message(STATUS "include-what-you-use: ${iwyu}") + set(_CMAKE_CXX_INCLUDE_WHAT_YOU_USE ${iwyu} + "-Xiwyu" "--cxx17ns" "-Xiwyu" "--no_fwd_decls") + + set_target_properties(caosdb PROPERTIES + CXX_INCLUDE_WHAT_YOU_USE "${_CMAKE_CXX_INCLUDE_WHAT_YOU_USE}" + ) + set_target_properties(cxxcaosdbcli PROPERTIES + CXX_INCLUDE_WHAT_YOU_USE "${_CMAKE_CXX_INCLUDE_WHAT_YOU_USE}" + ) + set_target_properties(ccaosdbcli PROPERTIES + C_INCLUDE_WHAT_YOU_USE "${_CMAKE_CXX_INCLUDE_WHAT_YOU_USE}" + ) + endif() + + find_program(clang_tidy NAMES clang-tidy clang-tidy-11) + if(NOT clang_tidy) + message(WARNING "clang-tidy: Not found") + else() + message(STATUS "clang-tidy: ${clang_tidy}") + set(_CMAKE_CXX_CLANG_TIDY_CHECKS + "--checks=*,-fuchsia-*,-llvmlibc-*,-readability-convert-member-functions-to-static,-cppcoreguidelines-pro-bounds-array-to-pointer-decay,-hicpp-no-array-decay,-llvm-else-after-return,-readability-else-after-return,-modernize-use-trailing-return-type,-bugprone-branch-clone,-altera-*,-misc-include-cleaner,-readability-identifier-*,-llvm-include-order,-misc-const-correctness") + set(_CMAKE_C_CLANG_TIDY_CHECKS "${_CMAKE_CXX_CLANG_TIDY_CHECKS}") + set(_CMAKE_CXX_CLANG_TIDY "${clang_tidy}" + "--header-filter=caosdb/.*[^\(\.pb\.h\)]$") + # "--warnings-as-errors=*") + set(_CMAKE_C_CLANG_TIDY "${_CMAKE_CXX_CLANG_TIDY}") + option(AUTO_FIX_LINTING "Append --fix option to clang-tidy" OFF) + if(AUTO_FIX_LINTING) + set(_CMAKE_CXX_CLANG_TIDY "${_CMAKE_CXX_CLANG_TIDY};--fix") + endif() + message(STATUS "Using clang-tidy with + '${_CMAKE_CXX_CLANG_TIDY};${_CMAKE_CXX_CLANG_TIDY_CHECKS}'") + set_target_properties(caosdb PROPERTIES + CXX_CLANG_TIDY "${_CMAKE_CXX_CLANG_TIDY};${_CMAKE_CXX_CLANG_TIDY_CHECKS}" + ) + set_target_properties(cxxcaosdbcli PROPERTIES + CXX_CLANG_TIDY "${_CMAKE_CXX_CLANG_TIDY};${_CMAKE_CXX_CLANG_TIDY_CHECKS}" + ) + set_target_properties(ccaosdb PROPERTIES + C_CLANG_TIDY "${_CMAKE_C_CLANG_TIDY};${_CMAKE_C_CLANG_TIDY_CHECKS}" + ) + set_target_properties(ccaosdbcli PROPERTIES + C_CLANG_TIDY "${_CMAKE_C_CLANG_TIDY};${_CMAKE_C_CLANG_TIDY_CHECKS}" + ) + endif() +endif() + + +####################################################### +### UNIT TEST +####################################################### + +if("${CMAKE_BUILD_TYPE}" MATCHES "Debug") + enable_testing() + add_subdirectory(test) +endif() + +# ############################################### +# ############ INSTALLATION ##################### +# ############################################### + +set(libcaosdb_INCLUDE_DEST "include/caosdb") +set(libcaosdb_LIB_DEST "lib") + +set(CMAKE_INSTALL_PREFIX "$ENV{HOME}/.local/") +install( + # targets to install + TARGETS ${LIBCAOSDB} ccaosdb + # name of the CMake "export group" containing the targets we want to install + EXPORT caosdbTargets + # Dynamic, static library and include destination locations after running + # "make install" + LIBRARY DESTINATION ${libcaosdb_LIB_DEST} + ARCHIVE DESTINATION ${libcaosdb_LIB_DEST} + INCLUDES DESTINATION ${libcaosdb_INCLUDE_DEST} +) + + +set(libcaosdb_CMAKE_DEST "${libcaosdb_LIB_DEST}/cmake/caosdb") +install( + # The export we want to save (matches name defined above containing the + # install targets) + EXPORT caosdbTargets + # CMake file in which to store the export's information + FILE caosdbTargets.cmake + # Namespace prepends all targets in the export (when we import later, we + # will use caosdb::caosdb) + NAMESPACE caosdb:: + # where to place the resulting file (here, we're putting it with the library) + DESTINATION ${libcaosdb_CMAKE_DEST} +) + +install(FILES ${libcaosdb_INCL} ${PROJECT_SOURCE_DIR}/include/ccaosdb.h DESTINATION ${libcaosdb_INCLUDE_DEST}) +foreach(i RANGE "${len_proto_files}") + list(GET PROTO_FILES ${i} next_proto_file) + + # strip away the prefix path and the ".proto" suffix + string(REPLACE + "${PROJECT_SOURCE_DIR}/proto/proto/caosdb/" + "" + next_proto_module + "${next_proto_file}") + string(REPLACE + "/main.proto" + "" + next_proto_module + "${next_proto_module}") + set(next_proto_hdr + "${CMAKE_CURRENT_BINARY_DIR}/include/caosdb/${next_proto_module}/main.pb.h") + set(next_grpc_hdr + "${CMAKE_CURRENT_BINARY_DIR}/include/caosdb/${next_proto_module}/main.grpc.pb.h") + install(FILES ${next_proto_hdr} ${next_grpc_hdr} DESTINATION + ${libcaosdb_INCLUDE_DEST}/${next_proto_module}) +endforeach() + +install(FILES ${PROJECT_SOURCE_DIR}/caosdbConfig.cmake + DESTINATION ${libcaosdb_CMAKE_DEST}) + +#set_property(TARGET caosdb PROPERTY VERSION ${libcaosdb_VERSION}) +include(CMakePackageConfigHelpers) +write_basic_package_version_file( + "${PROJECT_SOURCE_DIR}/caosdbConfigVersion.cmake" + VERSION ${libcaosdb_VERSION} + COMPATIBILITY AnyNewerVersion +) +install(FILES ${PROJECT_SOURCE_DIR}/caosdbConfigVersion.cmake + DESTINATION ${libcaosdb_CMAKE_DEST}) + +####################################################### +### code formatting with clang-format +####################################################### +option(AUTOFORMATTING "call clang-format at configure time" ON) +if(AUTOFORMATTING AND NOT SKIP_LINTING) + find_program(clang_format NAMES clang-format-11 clang-format) + file(GLOB format_test_sources test/*.cpp test/*.h test/*.h.in) + execute_process(COMMAND ${clang_format} -i --verbose ${libcaosdb_INCL} + ${libcaosdb_SRC} ${libcaosdb_TEST_SRC} + ${PROJECT_SOURCE_DIR}/src/cxxcaosdbcli.cpp + ${PROJECT_SOURCE_DIR}/src/ccaosdbcli.c + ${PROJECT_SOURCE_DIR}/src/ccaosdb.cpp + ${PROJECT_SOURCE_DIR}/include/ccaosdb.h + ${format_test_sources} + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}) +endif() -- GitLab