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