1- cmake_minimum_required (VERSION 3.0 )
1+ cmake_minimum_required (VERSION 3.18.1 )
22
33project (sysrepo-gnxi)
44
@@ -12,8 +12,10 @@ set(SYSREPO-GNXI_MICRO_VERSION 0)
1212
1313set (SYSREPO-GNXI_VERSION ${SYSREPO-GNXI_MAJOR_VERSION}.${SYSREPO-GNXI_MINOR_VERSION}.${SYSREPO-GNXI_MICRO_VERSION})
1414
15- #C++11 is required by gNXI
16- set (CMAKE_CXX_STANDARD 11)
15+ #C++11 is required by gNXI, we need c++14 for other stuff
16+ set (CMAKE_CXX_STANDARD 20)
17+ set (CMAKE_CXX_STANDARD_REQUIRED ON )
18+ include (GNUInstallDirs)
1719
1820# DEPENDENCIES
1921##############
@@ -22,21 +24,24 @@ set(CMAKE_CXX_STANDARD 11)
2224list (APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR} /CmakeModules" )
2325
2426find_package (PkgConfig) #official cmake module
25- find_package (Boost REQUIRED log system ) #just boost- log and boost-system libraries
27+ find_package (Boost REQUIRED log system chrono ) #just boost log, system and chrono libraries
2628
27- pkg_check_modules(JSONCPP REQUIRED jsoncpp) #official pkgconfig jsoncpp
29+ pkg_check_modules(SYSREPOC REQUIRED sysrepo>=2.2.14 IMPORTED_TARGET)
30+
31+ pkg_check_modules(LIBYANGC REQUIRED libyang)
32+ pkg_check_modules(SYSREPO REQUIRED sysrepo-cpp)
2833pkg_check_modules(LIBYANG REQUIRED libyang-cpp)
29- pkg_check_modules(SYSREPO REQUIRED libSysrepo-cpp=>0.7.7) #PkgConfig cmake module maccro
3034
35+ include (CodeCoverage)
3136
3237# DEPENDENCIES & COMPILATION OF GNXI PROTO
3338##########################################
3439
3540# set compiler and linker flags
3641set (RIGOROUS_C_FLAGS "-Wlogical-op -Wold-style-cast" )
37- set (CMAKE_CXX_FLAGS "-Wall -Wextra -std=c++11 -g ${RIGOROUS_C_FLAGS} " )
38- set (CMAKE_CXX_FLAGS_RELEASE "-Wall -Wextra -std=c++11 - DNDEBUG -O2 ${RIGOROUS_C_FLAGS} " )
39- set (CMAKE_CXX_FLAGS_DEBUG "-Wall -Wextra -std=c++11 -g -O0 ${RIGOROUS_C_FLAGS} " )
42+ set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -std=c++14 -g ${RIGOROUS_C_FLAGS} " )
43+ set (CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG -O2" )
44+ set (CMAKE_CXX_FLAGS_DEBUG "-O0 " )
4045
4146#Use Boost with Dynamic libraries rather than static linkage
4247add_definitions (-D BOOST_LOG_DYN_LINK)
@@ -52,27 +57,32 @@ add_subdirectory(proto)
5257# Generate a compile_commands.json with compile options
5358set (CMAKE_EXPORT_COMPILE_COMMANDS 1)
5459
55- set (GNXI_SRC src/main.cpp
56- src/security/authentication.cpp
60+ set (GNXI_SRC src/security/authentication.cpp
5761 src/utils/log .cpp
62+ src/utils/sysrepo.cpp
5863 src/gnmi/gnmi.cpp
64+ src/gnmi/gnmi_server.cpp
5965 src/gnmi/capabilities.cpp
6066 src/gnmi/get .cpp
67+ src/gnmi/rpc.cpp
6168 src/gnmi/set.cpp
6269 src/gnmi/subscribe.cpp
70+ src/gnmi/confirm.cpp
6371 src/gnmi/encode/encode.cpp
64- src/gnmi/encode/load_models.cpp
65- src/gnmi/encode/runtime.cpp
6672 src/gnmi/encode/json_ietf.cpp
6773)
6874
69- add_executable (gnxi_server ${GNXI_SRC} )
75+ add_executable (gnxi_server ${GNXI_SRC} src/main.cpp)
76+
77+ target_compile_definitions (gnxi_server PRIVATE
78+ GNMI_LOGROTATE_SCRIPT="/usr/libexec/gnxi-server-logrotate"
79+ GNMI_LOG_DIR="/var/log/gnxi-server"
80+ )
7081
7182#Header file location required to build target
7283target_include_directories (gnxi_server
7384 PUBLIC #List of include dirs required to use target binary or library
7485 ${Boost_INCLUDE_DIRS}
75- ${JSONCPP_INCLUDE_DIRS}
7686 ${LIBYANG_INCLUDE_DIRS}
7787 ${SYSREPO_INCLUDE_DIRS}
7888 ${PROTOBUF_INCLUDE_DIR}
@@ -84,49 +94,80 @@ target_include_directories(gnxi_server
8494#Directory path to look for libraries
8595link_directories (${Boost_LIBRARY_DIRS} )
8696
87- # link gnxi_server executable with grpc, jsoncpp, sysrepo libraries
97+ # link gnxi_server executable with grpc, sysrepo libraries
8898target_link_libraries (gnxi_server gnmi
89- ${JSONCPP_LIBRARIES}
9099 ${Boost_LIBRARIES}
91100 ${SYSREPO_LIBRARIES}
101+ ${SYSREPOC_LIBRARIES}
102+ ${LIBYANG_LIBRARIES}
103+ ${LIBYANGC_LIBRARIES}
104+ ${SYSTEMD_LIBRARIES}
105+ )
106+
107+ # TEST
108+ ######
109+
110+ enable_testing ()
111+
112+ set (GNXI_TEST_SRC tests/main.cpp
113+ tests/capabilities.cpp
114+ tests/get .cpp
115+ tests/rpc.cpp
116+ tests/set.cpp
117+ tests/subscribe.cpp
118+ )
119+
120+ add_executable (gnxi_server_test ${GNXI_TEST_SRC} ${GNXI_SRC} )
121+ configure_file (scripts/gnxi-server-logrotate gnxi-server-logrotate COPYONLY )
122+
123+ set_target_properties (gnxi_server_test PROPERTIES COMPILE_FLAGS "-DTEST -O0 -fprofile-arcs -ftest-coverage" )
124+
125+ get_filename_component (TESTS_SRC_DIR "${CMAKE_SOURCE_DIR} /tests" REALPATH)
126+ get_filename_component (TESTS_WORKING_DIR "${CMAKE_BINARY_DIR} " REALPATH)
127+ target_compile_definitions (gnxi_server_test PRIVATE
128+ TESTS_SRC_DIR="${TESTS_SRC_DIR} " ;
129+ TESTS_WORKING_DIR="${TESTS_WORKING_DIR} "
130+ GNMI_LOG_DIR="${TESTS_WORKING_DIR} /gnmi-logs"
131+ GNMI_LOGROTATE_SCRIPT="${TESTS_WORKING_DIR} /gnxi-server-logrotate"
132+ )
133+
134+ add_test (NAME gnxi_server_test COMMAND ${CMAKE_BINARY_DIR} /gnxi_server_test)
135+
136+ # Add a timeout for tests, to prevent them from running forever
137+ set_tests_properties (gnxi_server_test PROPERTIES TIMEOUT 300)
138+
139+ #Header file location required to build target
140+ target_include_directories (gnxi_server_test
141+ PUBLIC #List of include dirs required to use target binary or library
142+ ${Boost_INCLUDE_DIRS}
143+ ${LIBYANG_INCLUDE_DIRS}
144+ ${SYSREPO_INCLUDE_DIRS}
145+ ${PROTOBUF_INCLUDE_DIR}
146+ PRIVATE
147+ ${CMAKE_CURRENT_BINARY_DIR} #include "build" directory tree for "build/proto"
148+ ${CMAKE_CURRENT_SOURCE_DIR} /src #include "src" tree for <utils/> <security/>
149+ )
150+
151+ # link gnxi_server executable with grpc, sysrepo libraries
152+ target_link_libraries (gnxi_server_test gnmi
153+ ${Boost_LIBRARIES}
154+ ${SYSREPO_LIBRARIES}
155+ ${SYSREPOC_LIBRARIES}
92156 ${LIBYANG_LIBRARIES}
157+ ${LIBYANGC_LIBRARIES}
158+ ${SYSTEMD_LIBRARIES}
159+ gcov
93160)
94161
162+ # Remove test files and auto-generated files from coverage report
163+ set (GCOVR_EXCLUDES "'tests/*'" "'${CMAKE_CURRENT_BINARY_DIR} /*/*'" )
164+ setup_target_for_coverage_cobertura(gnxi_server_test_coverage ${CMAKE_CURRENT_BINARY_DIR} /gnxi_server_test coverage)
165+ add_dependencies (gnxi_server_test_coverage gnxi_server_test)
166+
95167# INSTALLATION
96168##############
97169
98170install (TARGETS gnxi_server
99- RUNTIME DESTINATION bin
100- DESTINATION ${CMAKE_INSTALL_BINDIR }
171+ RUNTIME DESTINATION sbin
172+ DESTINATION ${CMAKE_INSTALL_SBINDIR }
101173)
102-
103- # PACKAGING
104- ###########
105-
106- SET (CPACK_PACKAGE_VENDOR "FD.io" )
107- SET (CPACK_PACKAGE_CONTACT
"[email protected] " )
108- SET (CPACK_PACKAGE_VERSION_MAJOR ${SYSREPO-GNXI_MAJOR_VERSION})
109- SET (CPACK_PACKAGE_VERSION_MINOR ${SYSREPO-GNXI_MINOR_VERSION})
110- SET (CPACK_PACKAGE_VERSION_PATCH ${SYSREPO-GNXI_MICRO_VERSION})
111- SET (CPACK_PACKAGE_DESCRIPTION_SUMMARY "A gNMI server for sysrepo YANG datastore." )
112- SET (CPACK_SOURCE_PACKAGE_FILE_NAME "https://github.com/YohanPipereau/sysrepo-gnxi" )
113-
114- #DEBIAN specific : SET(CPACK_GENERATOR "DEB")
115- if (CPACK_GENERATOR EQUAL "DEB" )
116- message (STATUS "DEB packaging selected" )
117- SET (CPACK_DEBIAN_PACKAGE_ARCHITECTURE "x86_64" )
118- SET (CPACK_DEBIAN_PACKAGE_SECTION "misc" )
119- SET (CPACK_DEBIAN_PACKAGE_PRIORITY "optional" )
120- SET (CPACK_DEBIAN_PACKAGE_HOMEPAGE ${CPACK_SOURCE_PACKAGE_FILE_NAME} )
121- SET (CPACK_DEBIAN_PACKAGE_DEPENDS "libboost-thread, libboost-log, libboost-system, libjsoncpp, libstdc++6 (>= 5.2), zlib1g, libssl, libyang-cpp0.16, sysrepo-cpp" )
122- endif (CPACK_GENERATOR EQUAL "DEB" )
123-
124- #RPM specific : SET(CPACK_GENERATOR "RPM")
125- if (CPACK_GENERATOR EQUAL "RPM" )
126- message (STATUS "RPM packaging selected" )
127- SET (CPACK_RPM_PACKAGE_ARCHITECTURE "x86_64" )
128- SET (CPACK_RPM_PACKAGE_URL ${CPACK_SOURCE_PACKAGE_FILE_NAME} )
129- SET (CPACK_RPM_PACKAGE_REQUIRES "boost, jsoncpp, libstdc++6 (>= 5.2), zlib, openssl-devel" )
130- endif (CPACK_GENERATOR EQUAL "RPM" )
131-
132- INCLUDE (CPack) #run cpack
0 commit comments