Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
*.gcov
build/
163 changes: 112 additions & 51 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.0)
cmake_minimum_required(VERSION 3.18.1)

project(sysrepo-gnxi)

Expand All @@ -12,8 +12,11 @@ set(SYSREPO-GNXI_MICRO_VERSION 0)

set(SYSREPO-GNXI_VERSION ${SYSREPO-GNXI_MAJOR_VERSION}.${SYSREPO-GNXI_MINOR_VERSION}.${SYSREPO-GNXI_MICRO_VERSION})

#C++11 is required by gNXI
set(CMAKE_CXX_STANDARD 11)
#C++11 is required by gNXI, we need c++20 for other stuff
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
include(GNUInstallDirs)
include(CheckIncludeFileCXX)

# DEPENDENCIES
##############
Expand All @@ -23,20 +26,36 @@ list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/CmakeModules")

find_package(PkgConfig) #official cmake module
find_package(Boost REQUIRED log system) #just boost-log and boost-system libraries

pkg_check_modules(JSONCPP REQUIRED jsoncpp) #official pkgconfig jsoncpp
find_package(Catch2 CONFIG REQUIRED)
message(STATUS "Catch2 found (version ${Catch2_VERSION})")
LIST(APPEND CMAKE_REQUIRED_INCLUDES "/usr/include/catch2")
if(Catch2_VERSION_MAJOR EQUAL 3)
check_include_file_cxx("catch_all.hpp" CATCH_HEADER_FOUND)
add_definitions(-DUSE_CATCH_ALL)
set(CATCH2_LIBRARY Catch2)
else()
check_include_file_cxx("catch.hpp" CATCH_HEADER_FOUND)
endif()
if(NOT CATCH_HEADER_FOUND)
message(FATAL_ERROR "No usable Catch2 header found")
endif()

pkg_check_modules(SYSREPOC REQUIRED sysrepo>=2.2.14 IMPORTED_TARGET)

pkg_check_modules(LIBYANGC REQUIRED libyang)
pkg_check_modules(SYSREPO REQUIRED sysrepo-cpp)
pkg_check_modules(LIBYANG REQUIRED libyang-cpp)
pkg_check_modules(SYSREPO REQUIRED libSysrepo-cpp=>0.7.7) #PkgConfig cmake module maccro

include(CodeCoverage)

# DEPENDENCIES & COMPILATION OF GNXI PROTO
##########################################

# set compiler and linker flags
set(RIGOROUS_C_FLAGS "-Wlogical-op -Wold-style-cast")
set(CMAKE_CXX_FLAGS "-Wall -Wextra -std=c++11 -g ${RIGOROUS_C_FLAGS}")
set(CMAKE_CXX_FLAGS_RELEASE "-Wall -Wextra -std=c++11 -DNDEBUG -O2 ${RIGOROUS_C_FLAGS}")
set(CMAKE_CXX_FLAGS_DEBUG "-Wall -Wextra -std=c++11 -g -O0 ${RIGOROUS_C_FLAGS}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wno-deprecated-declarations -std=c++20 -g ${RIGOROUS_C_FLAGS}")
set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG -O2")
set(CMAKE_CXX_FLAGS_DEBUG "-O0")

#Use Boost with Dynamic libraries rather than static linkage
add_definitions(-D BOOST_LOG_DYN_LINK)
Expand All @@ -52,27 +71,32 @@ add_subdirectory(proto)
# Generate a compile_commands.json with compile options
set(CMAKE_EXPORT_COMPILE_COMMANDS 1)

set(GNXI_SRC src/main.cpp
src/security/authentication.cpp
set(GNXI_SRC src/security/authentication.cpp
src/utils/log.cpp
src/utils/sysrepo.cpp
src/gnmi/gnmi.cpp
src/gnmi/gnmi_server.cpp
src/gnmi/capabilities.cpp
src/gnmi/get.cpp
src/gnmi/rpc.cpp
src/gnmi/set.cpp
src/gnmi/subscribe.cpp
src/gnmi/confirm.cpp
src/gnmi/encode/encode.cpp
src/gnmi/encode/load_models.cpp
src/gnmi/encode/runtime.cpp
src/gnmi/encode/json_ietf.cpp
)

add_executable(gnxi_server ${GNXI_SRC})
add_executable(gnxi_server ${GNXI_SRC} src/main.cpp)

target_compile_definitions(gnxi_server PRIVATE
GNMI_LOGROTATE_SCRIPT="/usr/libexec/gnxi-server-logrotate"
GNMI_LOG_DIR="/var/log/gnxi-server"
)

#Header file location required to build target
target_include_directories(gnxi_server
PUBLIC #List of include dirs required to use target binary or library
${Boost_INCLUDE_DIRS}
${JSONCPP_INCLUDE_DIRS}
${LIBYANG_INCLUDE_DIRS}
${SYSREPO_INCLUDE_DIRS}
${PROTOBUF_INCLUDE_DIR}
Expand All @@ -82,51 +106,88 @@ target_include_directories(gnxi_server
)

#Directory path to look for libraries
link_directories(${Boost_LIBRARY_DIRS})
link_directories(
${Boost_LIBRARY_DIRS}
${SYSREPO_LIBRARY_DIRS}
${SYSREPOC_LIBRARY_DIRS}
${LIBYANG_LIBRARY_DIRS}
${LIBYANGC_LIBRARY_DIRS}
)

# link gnxi_server executable with grpc, jsoncpp, sysrepo libraries
# link gnxi_server executable with grpc, sysrepo libraries
target_link_libraries(gnxi_server gnmi
${JSONCPP_LIBRARIES}
${Boost_LIBRARIES}
${SYSREPO_LIBRARIES}
${SYSREPOC_LIBRARIES}
${LIBYANG_LIBRARIES}
${LIBYANGC_LIBRARIES}
)

# TEST
######

enable_testing()

set(GNXI_TEST_SRC tests/main.cpp
tests/capabilities.cpp
tests/get.cpp
tests/rpc.cpp
tests/set.cpp
tests/subscribe.cpp
)

add_executable(gnxi_server_test ${GNXI_TEST_SRC} ${GNXI_SRC})
configure_file(scripts/gnxi-server-logrotate gnxi-server-logrotate COPYONLY)

set_target_properties(gnxi_server_test PROPERTIES COMPILE_FLAGS "-DTEST -O0 -fprofile-arcs -ftest-coverage")

get_filename_component(TESTS_SRC_DIR "${CMAKE_SOURCE_DIR}/tests" REALPATH)
get_filename_component(TESTS_WORKING_DIR "${CMAKE_BINARY_DIR}" REALPATH)
target_compile_definitions(gnxi_server_test PRIVATE
TESTS_SRC_DIR="${TESTS_SRC_DIR}";
TESTS_WORKING_DIR="${TESTS_WORKING_DIR}"
GNMI_LOG_DIR="${TESTS_WORKING_DIR}/gnmi-logs"
GNMI_LOGROTATE_SCRIPT="${TESTS_WORKING_DIR}/gnxi-server-logrotate"
)

add_test(NAME gnxi_server_test COMMAND ${CMAKE_BINARY_DIR}/gnxi_server_test)

# Add a timeout for tests, to prevent them from running forever
set_tests_properties(gnxi_server_test PROPERTIES TIMEOUT 300)

#Header file location required to build target
target_include_directories(gnxi_server_test
PUBLIC #List of include dirs required to use target binary or library
${Boost_INCLUDE_DIRS}
${LIBYANG_INCLUDE_DIRS}
${SYSREPO_INCLUDE_DIRS}
${PROTOBUF_INCLUDE_DIR}
PRIVATE
${CMAKE_CURRENT_BINARY_DIR} #include "build" directory tree for "build/proto"
${CMAKE_CURRENT_SOURCE_DIR}/src #include "src" tree for <utils/> <security/>
)

# link gnxi_server executable with grpc, sysrepo libraries
target_link_libraries(gnxi_server_test gnmi
${Boost_LIBRARIES}
${SYSREPO_LIBRARIES}
${SYSREPOC_LIBRARIES}
${LIBYANG_LIBRARIES}
${LIBYANGC_LIBRARIES}
${SYSTEMD_LIBRARIES}
${CATCH2_LIBRARY}
gcov
)

# Remove test files and auto-generated files from coverage report
set(GCOVR_EXCLUDES "'tests/*'" "'${CMAKE_CURRENT_BINARY_DIR}/*/*'")
setup_target_for_coverage_cobertura(gnxi_server_test_coverage ${CMAKE_CURRENT_BINARY_DIR}/gnxi_server_test coverage)
add_dependencies(gnxi_server_test_coverage gnxi_server_test)

# INSTALLATION
##############

install(TARGETS gnxi_server
RUNTIME DESTINATION bin
DESTINATION ${CMAKE_INSTALL_BINDIR}
RUNTIME DESTINATION sbin
DESTINATION ${CMAKE_INSTALL_SBINDIR}
)

# PACKAGING
###########

SET(CPACK_PACKAGE_VENDOR "FD.io")
SET(CPACK_PACKAGE_CONTACT "[email protected]")
SET(CPACK_PACKAGE_VERSION_MAJOR ${SYSREPO-GNXI_MAJOR_VERSION})
SET(CPACK_PACKAGE_VERSION_MINOR ${SYSREPO-GNXI_MINOR_VERSION})
SET(CPACK_PACKAGE_VERSION_PATCH ${SYSREPO-GNXI_MICRO_VERSION})
SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "A gNMI server for sysrepo YANG datastore.")
SET(CPACK_SOURCE_PACKAGE_FILE_NAME "https://github.com/YohanPipereau/sysrepo-gnxi")

#DEBIAN specific : SET(CPACK_GENERATOR "DEB")
if(CPACK_GENERATOR EQUAL "DEB")
message(STATUS "DEB packaging selected")
SET(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "x86_64")
SET(CPACK_DEBIAN_PACKAGE_SECTION "misc")
SET(CPACK_DEBIAN_PACKAGE_PRIORITY "optional")
SET(CPACK_DEBIAN_PACKAGE_HOMEPAGE ${CPACK_SOURCE_PACKAGE_FILE_NAME})
SET(CPACK_DEBIAN_PACKAGE_DEPENDS "libboost-thread, libboost-log, libboost-system, libjsoncpp, libstdc++6 (>= 5.2), zlib1g, libssl, libyang-cpp0.16, sysrepo-cpp")
endif(CPACK_GENERATOR EQUAL "DEB")

#RPM specific : SET(CPACK_GENERATOR "RPM")
if(CPACK_GENERATOR EQUAL "RPM")
message(STATUS "RPM packaging selected")
SET(CPACK_RPM_PACKAGE_ARCHITECTURE "x86_64")
SET(CPACK_RPM_PACKAGE_URL ${CPACK_SOURCE_PACKAGE_FILE_NAME})
SET(CPACK_RPM_PACKAGE_REQUIRES "boost, jsoncpp, libstdc++6 (>= 5.2), zlib, openssl-devel")
endif(CPACK_GENERATOR EQUAL "RPM")

INCLUDE(CPack) #run cpack
Loading