blob: ae7cc7b9337b7b6937eed2d3a4bb2be5cc7feef0 [file] [log] [blame]
Michal Vasko8e08c962016-02-09 14:09:11 +01001cmake_minimum_required(VERSION 2.6)
Radek Krejci32898d52016-07-14 17:37:02 +02002include (CheckFunctionExists)
Radek Krejci183f7e72015-09-01 17:25:47 +02003
Radek Krejci4f2d40d2015-10-08 12:55:01 +02004# include custom Modules
5set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/CMakeModules/")
6
7project(libnetconf2 C)
Michal Vasko6779d182016-02-17 14:36:36 +01008set(LIBNETCONF2_DESCRIPTION "NETCONF server and client library in C.")
Radek Krejci183f7e72015-09-01 17:25:47 +02009
10# check the supported platform
11if(NOT UNIX)
Michal Vasko3d865d22016-01-28 16:00:53 +010012 message(FATAL_ERROR "Only *nix like systems are supported.")
Radek Krejci183f7e72015-09-01 17:25:47 +020013endif()
14
Michal Vasko6779d182016-02-17 14:36:36 +010015if(NOT LIB_INSTALL_DIR)
16 set(LIB_INSTALL_DIR lib)
17endif()
18
19if(NOT INCLUDE_INSTALL_DIR)
20 set(INCLUDE_INSTALL_DIR include)
21endif()
22
Michal Vaskod5f09ba2016-02-23 15:44:58 +010023set(INCLUDE_INSTALL_SUBDIR ${INCLUDE_INSTALL_DIR}/libnetconf2)
24
25if(NOT DATA_INSTALL_DIR)
26 set(DATA_INSTALL_DIR share/libnetconf2)
27endif()
28
Radek Krejci183f7e72015-09-01 17:25:47 +020029# set default build type if not specified by user
30if(NOT CMAKE_BUILD_TYPE)
Michal Vasko3d865d22016-01-28 16:00:53 +010031 set(CMAKE_BUILD_TYPE debug)
Radek Krejci183f7e72015-09-01 17:25:47 +020032endif()
33
34set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -fvisibility=hidden")
35set(CMAKE_C_FLAGS_RELEASE "-O2 -DNDEBUG")
36set(CMAKE_C_FLAGS_DEBUG "-g -O0")
37
Radek Krejci4f2d40d2015-10-08 12:55:01 +020038# set version
39set(LIBNETCONF2_MAJOR_VERSION 0)
Radek Krejcic58c5a22016-10-07 09:26:11 +020040set(LIBNETCONF2_MINOR_VERSION 8)
Michal Vaskocbcd8252016-10-26 13:54:29 +020041set(LIBNETCONF2_MICRO_VERSION 7)
Radek Krejci4f2d40d2015-10-08 12:55:01 +020042set(LIBNETCONF2_VERSION ${LIBNETCONF2_MAJOR_VERSION}.${LIBNETCONF2_MINOR_VERSION}.${LIBNETCONF2_MICRO_VERSION})
43set(LIBNETCONF2_SOVERSION ${LIBNETCONF2_MAJOR_VERSION}.${LIBNETCONF2_MINOR_VERSION})
44
Radek Krejciac6d3472015-10-22 15:47:18 +020045# build options
Michal Vaskofb2fb762015-10-27 11:44:32 +010046option(ENABLE_SSH "Enable NETCONF over SSH support (via libssh)" ON)
Michal Vasko061dc802016-02-29 10:15:28 +010047option(ENABLE_TLS "Enable NETCONF over TLS support (via OpenSSL)" ON)
Michal Vasko3d865d22016-01-28 16:00:53 +010048option(ENABLE_DNSSEC "Enable support for SSHFP retrieval using DNSSEC for SSH (requires OpenSSL and libval)" OFF)
49
50if(ENABLE_DNSSEC AND NOT ENABLE_SSH)
51 message(WARNING "DNSSEC SSHFP retrieval cannot be used without SSH support.")
52 set(ENABLE_DNSSEC OFF)
53endif()
Radek Krejciac6d3472015-10-22 15:47:18 +020054
Radek Krejci4f2d40d2015-10-08 12:55:01 +020055# source files
Radek Krejci183f7e72015-09-01 17:25:47 +020056set(libsrc
Michal Vasko3d865d22016-01-28 16:00:53 +010057 src/io.c
58 src/log.c
59 src/messages_client.c
60 src/messages_server.c
61 src/session.c
62 src/session_client.c
63 src/session_server.c
64 src/time.c)
Radek Krejci183f7e72015-09-01 17:25:47 +020065
Michal Vaskofb2fb762015-10-27 11:44:32 +010066if(ENABLE_SSH)
Michal Vasko3d865d22016-01-28 16:00:53 +010067 set(libsrc ${libsrc}
68 src/session_client_ssh.c
69 src/session_server_ssh.c)
Radek Krejci53691be2016-02-22 13:58:37 +010070 set(SSH_MACRO "#ifndef NC_ENABLED_SSH\n#define NC_ENABLED_SSH\n#endif")
Radek Krejciac6d3472015-10-22 15:47:18 +020071endif()
72
Radek Krejci9f03b482015-10-22 16:02:10 +020073if(ENABLE_TLS)
Michal Vasko3d865d22016-01-28 16:00:53 +010074 set(libsrc ${libsrc}
75 src/session_client_tls.c
76 src/session_server_tls.c)
Radek Krejci53691be2016-02-22 13:58:37 +010077 set(TLS_MACRO "#ifndef NC_ENABLED_TLS\n#define NC_ENABLED_TLS\n#endif")
Radek Krejci9f03b482015-10-22 16:02:10 +020078endif()
79
Radek Krejci183f7e72015-09-01 17:25:47 +020080set(headers
Michal Vasko3d865d22016-01-28 16:00:53 +010081 src/log.h
82 src/netconf.h
83 src/session.h
84 src/messages_client.h
85 src/messages_server.h
86 src/session_client.h
Michal Vasko45f298f2016-01-29 10:26:26 +010087 src/session_client_ch.h
88 src/session_server.h
89 src/session_server_ch.h)
Radek Krejci183f7e72015-09-01 17:25:47 +020090
Radek Krejci4f2d40d2015-10-08 12:55:01 +020091# libnetconf2 target
Radek Krejci183f7e72015-09-01 17:25:47 +020092add_library(netconf2 SHARED ${libsrc})
93set_target_properties(netconf2 PROPERTIES VERSION ${LIBNETCONF2_VERSION} SOVERSION ${LIBNETCONF2_SOVERSION})
Radek Krejci4f2d40d2015-10-08 12:55:01 +020094
Radek Krejcice24ab82015-10-08 15:37:02 +020095if(CMAKE_BUILD_TYPE STREQUAL debug)
Michal Vasko3d865d22016-01-28 16:00:53 +010096 option(ENABLE_BUILD_TESTS "Build tests" ON)
97 option(ENABLE_VALGRIND_TESTS "Build tests with valgrind" ON)
Radek Krejcice24ab82015-10-08 15:37:02 +020098else()
Michal Vasko3d865d22016-01-28 16:00:53 +010099 option(ENABLE_BUILD_TESTS "Build tests" OFF)
100 option(ENABLE_VALGRIND_TESTS "Build tests with valgrind" OFF)
Radek Krejcice24ab82015-10-08 15:37:02 +0200101endif()
102
Radek Krejci32898d52016-07-14 17:37:02 +0200103# dependencies - pthread
Michal Vasko73ed9672016-01-29 13:15:15 +0100104set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
105find_package(Threads REQUIRED)
106target_link_libraries(netconf2 ${CMAKE_THREAD_LIBS_INIT})
107
Radek Krejci28472922016-07-15 11:51:16 +0200108# check availability for some pthread functions
Radek Krejci32898d52016-07-14 17:37:02 +0200109set(CMAKE_REQUIRED_LIBRARIES pthread)
110check_function_exists(pthread_spin_lock HAVE_SPINLOCK)
Radek Krejci28472922016-07-15 11:51:16 +0200111check_function_exists(pthread_mutex_timedlock HAVE_PTHREAD_MUTEX_TIMEDLOCK)
Radek Krejci32898d52016-07-14 17:37:02 +0200112
Radek Krejci4f2d40d2015-10-08 12:55:01 +0200113# dependencies - libssh
Michal Vaskofb2fb762015-10-27 11:44:32 +0100114if(ENABLE_SSH)
Michal Vasko3d865d22016-01-28 16:00:53 +0100115 find_package(LibSSH 0.6.4 REQUIRED)
Radek Krejci53691be2016-02-22 13:58:37 +0100116 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DNC_ENABLED_SSH ${LIBSSH_DEFINITIONS}")
Michal Vaskofcb44152016-09-26 09:33:24 +0200117 target_link_libraries(netconf2 ${LIBSSH_LIBRARIES} -L${SSH_LIBRARY} -lssh_threads -lcrypt)
Michal Vasko3d865d22016-01-28 16:00:53 +0100118 include_directories(${LIBSSH_INCLUDE_DIRS})
Radek Krejci4f2d40d2015-10-08 12:55:01 +0200119endif()
120
121# dependencies - openssl
Michal Vasko3d865d22016-01-28 16:00:53 +0100122if(ENABLE_TLS OR ENABLE_DNSSEC)
123 find_package(OpenSSL REQUIRED)
124 if (ENABLE_TLS)
Radek Krejci53691be2016-02-22 13:58:37 +0100125 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DNC_ENABLED_TLS")
Michal Vasko3d865d22016-01-28 16:00:53 +0100126 endif()
127 target_link_libraries(netconf2 ${OPENSSL_LIBRARIES})
128 include_directories(${OPENSSL_INCLUDE_DIR})
129endif()
130
Michal Vasko73ed9672016-01-29 13:15:15 +0100131# dependencies - libval
Michal Vasko3d865d22016-01-28 16:00:53 +0100132if (ENABLE_DNSSEC)
133 find_package(LibVAL REQUIRED)
134 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DENABLE_DNSSEC")
135 target_link_libraries(netconf2 ${LIBVAL_LIBRARIES})
136 include_directories(${LIBVAL_INCLUDE_DIRS})
Radek Krejci4f2d40d2015-10-08 12:55:01 +0200137endif()
138
139# dependencies - libyang
140find_package(LibYANG REQUIRED)
141target_link_libraries(netconf2 ${LIBYANG_LIBRARIES})
142include_directories(${LIBYANG_INCLUDE_DIRS})
143
Michal Vasko51cda3c2016-01-29 14:41:26 +0100144# generate doxygen documentation for libnetconf2 API
145find_package(Doxygen)
146if(DOXYGEN_FOUND)
147 set(DOXYGEN_SKIP_DOT TRUE)
148 add_custom_target(doc
149 COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_BINARY_DIR}/Doxyfile
150 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
151 configure_file(Doxyfile.in Doxyfile)
152endif()
153
Michal Vasko6b7c42e2016-03-02 15:46:41 +0100154# option - partial message read timeout in seconds
155if(NOT READ_TIMEOUT)
156 set(READ_TIMEOUT 30)
157endif()
158
Radek Krejci183f7e72015-09-01 17:25:47 +0200159# install library
160install(TARGETS netconf2 DESTINATION ${LIB_INSTALL_DIR})
161
162# install headers
Radek Krejci5fc4c392016-01-08 14:23:22 +0100163install(FILES ${CMAKE_CURRENT_BINARY_DIR}/nc_client.h DESTINATION ${INCLUDE_INSTALL_DIR})
164install(FILES ${CMAKE_CURRENT_BINARY_DIR}/nc_server.h DESTINATION ${INCLUDE_INSTALL_DIR})
Radek Krejci183f7e72015-09-01 17:25:47 +0200165install(FILES ${headers} DESTINATION ${INCLUDE_INSTALL_SUBDIR})
166
Radek Krejci14b14032015-10-21 15:19:43 +0200167# install schemas
168install(
Michal Vasko3d865d22016-01-28 16:00:53 +0100169 CODE "file(GLOB yin_schemas \"${CMAKE_SOURCE_DIR}/schemas/*.yin\")"
Michal Vaskoed6e0d32016-02-24 13:28:58 +0100170 CODE "file(INSTALL \${yin_schemas} DESTINATION ${CMAKE_INSTALL_PREFIX}/${DATA_INSTALL_DIR})"
Radek Krejci14b14032015-10-21 15:19:43 +0200171)
172
Michal Vasko6779d182016-02-17 14:36:36 +0100173# install pkg-config file
174find_package(PkgConfig)
175if(PKG_CONFIG_FOUND)
176 configure_file("libnetconf2.pc.in" "libnetconf2.pc" @ONLY)
Michal Vaskod5f09ba2016-02-23 15:44:58 +0100177 install(FILES "${CMAKE_CURRENT_BINARY_DIR}/libnetconf2.pc" DESTINATION "${CMAKE_INSTALL_PREFIX}/${LIB_INSTALL_DIR}/pkgconfig")
Michal Vasko6779d182016-02-17 14:36:36 +0100178 # check that pkg-config includes the used path
179 execute_process(COMMAND ${PKG_CONFIG_EXECUTABLE} --variable pc_path pkg-config RESULT_VARIABLE RETURN OUTPUT_VARIABLE PC_PATH ERROR_QUIET)
180 if(RETURN EQUAL 0)
Michal Vaskod5f09ba2016-02-23 15:44:58 +0100181 string(REGEX MATCH "${CMAKE_INSTALL_PREFIX}/${LIB_INSTALL_DIR}/pkgconfig" SUBSTR "${PC_PATH}")
Michal Vasko6779d182016-02-17 14:36:36 +0100182 string(LENGTH "${SUBSTR}" SUBSTR_LEN)
183 if(SUBSTR_LEN EQUAL 0)
Michal Vaskod5f09ba2016-02-23 15:44:58 +0100184 message(WARNING "pkg-config will not detect the new package after installation, adjust PKG_CONFIG_PATH using \"export PKG_CONFIG_PATH=\${PKG_CONFIG_PATH}:${CMAKE_INSTALL_PREFIX}/${LIB_INSTALL_DIR}/pkgconfig\".")
Michal Vasko6779d182016-02-17 14:36:36 +0100185 endif()
186 endif()
187endif()
188
Radek Krejcice24ab82015-10-08 15:37:02 +0200189if(ENABLE_VALGRIND_TESTS)
Michal Vasko3d865d22016-01-28 16:00:53 +0100190 set(ENABLE_BUILD_TESTS ON)
Radek Krejcice24ab82015-10-08 15:37:02 +0200191endif()
192
193if(ENABLE_BUILD_TESTS)
Radek Krejcieaa06722016-02-26 14:27:32 +0100194 find_package(CMocka 1.0.0)
195 if(CMOCKA_FOUND)
196 enable_testing()
197 add_subdirectory(tests)
198 endif(CMOCKA_FOUND)
Radek Krejcice24ab82015-10-08 15:37:02 +0200199endif()
200
Radek Krejci68824962016-01-19 14:03:09 +0100201configure_file("${PROJECT_SOURCE_DIR}/src/config.h.in" "${PROJECT_SOURCE_DIR}/src/config.h" ESCAPE_QUOTES @ONLY)
Michal Vasko1128e112015-10-26 15:34:24 +0100202configure_file(nc_client.h.in nc_client.h)
Michal Vasko086311b2016-01-08 09:53:11 +0100203configure_file(nc_server.h.in nc_server.h)
Radek Krejci14b14032015-10-21 15:19:43 +0200204
Radek Krejci183f7e72015-09-01 17:25:47 +0200205# clean cmake cache
206add_custom_target(cleancache
207 COMMAND make clean
208 COMMAND find . -iname '*cmake*' -not -name CMakeLists.txt -exec rm -rf {} +
209 COMMAND rm -rf Makefile Doxyfile
210 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})