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}
@@ -82,51 +92,87 @@ target_include_directories(gnxi_server
8292)
8393
8494#Directory path to look for libraries
85- link_directories (${Boost_LIBRARY_DIRS} )
95+ link_directories (
96+ ${Boost_LIBRARY_DIRS}
97+ ${SYSREPO_LIBRARY_DIRS}
98+ ${SYSREPOC_LIBRARY_DIRS}
99+ ${LIBYANG_LIBRARY_DIRS}
100+ ${LIBYANGC_LIBRARY_DIRS}
101+ )
86102
87- # link gnxi_server executable with grpc, jsoncpp, sysrepo libraries
103+ # link gnxi_server executable with grpc, sysrepo libraries
88104target_link_libraries (gnxi_server gnmi
89- ${JSONCPP_LIBRARIES}
90105 ${Boost_LIBRARIES}
91106 ${SYSREPO_LIBRARIES}
107+ ${SYSREPOC_LIBRARIES}
92108 ${LIBYANG_LIBRARIES}
109+ ${LIBYANGC_LIBRARIES}
110+ )
111+
112+ # TEST
113+ ######
114+
115+ enable_testing ()
116+
117+ set (GNXI_TEST_SRC tests/main.cpp
118+ tests/capabilities.cpp
119+ tests/get .cpp
120+ tests/rpc.cpp
121+ tests/set.cpp
122+ tests/subscribe.cpp
123+ )
124+
125+ add_executable (gnxi_server_test ${GNXI_TEST_SRC} ${GNXI_SRC} )
126+ configure_file (scripts/gnxi-server-logrotate gnxi-server-logrotate COPYONLY )
127+
128+ set_target_properties (gnxi_server_test PROPERTIES COMPILE_FLAGS "-DTEST -O0 -fprofile-arcs -ftest-coverage" )
129+
130+ get_filename_component (TESTS_SRC_DIR "${CMAKE_SOURCE_DIR} /tests" REALPATH)
131+ get_filename_component (TESTS_WORKING_DIR "${CMAKE_BINARY_DIR} " REALPATH)
132+ target_compile_definitions (gnxi_server_test PRIVATE
133+ TESTS_SRC_DIR="${TESTS_SRC_DIR} " ;
134+ TESTS_WORKING_DIR="${TESTS_WORKING_DIR} "
135+ GNMI_LOG_DIR="${TESTS_WORKING_DIR} /gnmi-logs"
136+ GNMI_LOGROTATE_SCRIPT="${TESTS_WORKING_DIR} /gnxi-server-logrotate"
93137)
94138
139+ add_test (NAME gnxi_server_test COMMAND ${CMAKE_BINARY_DIR} /gnxi_server_test)
140+
141+ # Add a timeout for tests, to prevent them from running forever
142+ set_tests_properties (gnxi_server_test PROPERTIES TIMEOUT 300)
143+
144+ #Header file location required to build target
145+ target_include_directories (gnxi_server_test
146+ PUBLIC #List of include dirs required to use target binary or library
147+ ${Boost_INCLUDE_DIRS}
148+ ${LIBYANG_INCLUDE_DIRS}
149+ ${SYSREPO_INCLUDE_DIRS}
150+ ${PROTOBUF_INCLUDE_DIR}
151+ PRIVATE
152+ ${CMAKE_CURRENT_BINARY_DIR} #include "build" directory tree for "build/proto"
153+ ${CMAKE_CURRENT_SOURCE_DIR} /src #include "src" tree for <utils/> <security/>
154+ )
155+
156+ # link gnxi_server executable with grpc, sysrepo libraries
157+ target_link_libraries (gnxi_server_test gnmi
158+ ${Boost_LIBRARIES}
159+ ${SYSREPO_LIBRARIES}
160+ ${SYSREPOC_LIBRARIES}
161+ ${LIBYANG_LIBRARIES}
162+ ${LIBYANGC_LIBRARIES}
163+ ${SYSTEMD_LIBRARIES}
164+ gcov
165+ )
166+
167+ # Remove test files and auto-generated files from coverage report
168+ set (GCOVR_EXCLUDES "'tests/*'" "'${CMAKE_CURRENT_BINARY_DIR} /*/*'" )
169+ setup_target_for_coverage_cobertura(gnxi_server_test_coverage ${CMAKE_CURRENT_BINARY_DIR} /gnxi_server_test coverage)
170+ add_dependencies (gnxi_server_test_coverage gnxi_server_test)
171+
95172# INSTALLATION
96173##############
97174
98175install (TARGETS gnxi_server
99- RUNTIME DESTINATION bin
100- DESTINATION ${CMAKE_INSTALL_BINDIR }
176+ RUNTIME DESTINATION sbin
177+ DESTINATION ${CMAKE_INSTALL_SBINDIR }
101178)
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