Skip to content

Commit 2209191

Browse files
ClausKleinjktjkt
authored andcommitted
Prevent compile errors on OSX (#198)
build CHANGE prevent compile errors on OSX * Prevent compile errors on OSX clangtidy cmake files too fix possible buffer overflow too * Fix travis build error The imported include path setting is only later needed! * Fix libssh version detection Cmake variable is now LIBSSH_VERSION! * python: do not put generated files into the source tree Untracked content shows up in git submodules, causing stuff to be marked "dirty" by various git-level tools. Tested by temporarily putting the resulting target within `ALL`. The result is the same as without this change (and it remains unusable with no generated index, at least when building out-of-tree, BTW). * apply review notes * Prevent compile errors on OSX clangtidy cmake files too fix possible buffer overflow too * Fix travis build error The imported include path setting is only later needed! * Fix libssh version detection Cmake variable is now LIBSSH_VERSION! * apply review notes Co-authored-by: Jan Kundrát <jkt@flaska.net>
1 parent c4b3374 commit 2209191

14 files changed

Lines changed: 184 additions & 133 deletions

.travis.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ before_install:
2727
- if [ "$TRAVIS_OS_NAME" = "osx" ]; then bash .travis-deps-osx.sh; fi
2828

2929
script:
30-
- if [ "$TRAVIS_OS_NAME" = "osx" ]; then export OPENSSLFLAGS="-DOPENSSL_LIBRARIES=/usr/local/opt/openssl/lib -DOPENSSL_INCLUDE_DIR=/usr/local/opt/openssl/include"; fi
30+
- if [ "$TRAVIS_OS_NAME" = "osx" ]; then export OPENSSLFLAGS="-DOPENSSL_ROOT_DIR=/usr/local/opt/openssl"; fi
3131
- cd $TRAVIS_BUILD_DIR && mkdir build_none && cd build_none ; cmake -DENABLE_TLS=OFF -DENABLE_SSH=OFF -DENABLE_DNSSEC=OFF .. && make -j2 && ctest --output-on-failure
3232
- cd $TRAVIS_BUILD_DIR && mkdir build_tls && cd build_tls ; cmake $OPENSSLFLAGS -DENABLE_TLS=ON -DENABLE_SSH=OFF -DENABLE_DNSSEC=OFF .. && make -j2 && ctest --output-on-failure
3333
- cd $TRAVIS_BUILD_DIR && mkdir build_ssh && cd build_ssh ; cmake $OPENSSLFLAGS -DENABLE_TLS=OFF -DENABLE_SSH=ON -DENABLE_DNSSEC=OFF .. && make -j2 && ctest --output-on-failure

CMakeLists.txt

Lines changed: 56 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
11
cmake_minimum_required(VERSION 2.6)
2-
project(libnetconf2 C)
2+
3+
project(libnetconf2 LANGUAGES C)
4+
35
include(GNUInstallDirs)
46
include(CheckFunctionExists)
57
include(CheckCSourceCompiles)
68
include(CheckIncludeFile)
9+
710
if(POLICY CMP0075)
811
cmake_policy(SET CMP0075 NEW)
912
endif()
1013

1114
# include custom Modules
12-
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/CMakeModules/")
15+
list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/CMakeModules/")
1316

1417
set(LIBNETCONF2_DESCRIPTION "NETCONF server and client library in C.")
1518

@@ -26,13 +29,16 @@ set(DATA_INSTALL_DIR ${CMAKE_INSTALL_DATADIR}/libnetconf2)
2629

2730
# set default build type if not specified by user
2831
if(NOT CMAKE_BUILD_TYPE)
29-
set(CMAKE_BUILD_TYPE debug)
32+
set(CMAKE_BUILD_TYPE Debug)
3033
endif()
3134

32-
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -fvisibility=hidden -std=gnu11")
33-
set(CMAKE_C_FLAGS_RELEASE "-O2 -DNDEBUG")
35+
set(CMAKE_C_STANDARD 11)
36+
set(CMAKE_CXX_EXTENSIONS ON)
37+
add_compile_options(-Wall -Wextra -fvisibility=hidden)
38+
#TODO add_compile_options(-Wpedantic)
39+
40+
3441
set(CMAKE_C_FLAGS_PACKAGE "-g -O2 -DNDEBUG")
35-
set(CMAKE_C_FLAGS_DEBUG "-g -O0")
3642

3743
# Version of the project
3844
# Generic version of not only the library. Major version is reserved for really big changes of the project,
@@ -68,38 +74,48 @@ if(ENABLE_DNSSEC AND NOT ENABLE_SSH)
6874
set(ENABLE_DNSSEC OFF)
6975
endif()
7076

77+
if(ENABLE_SSH)
78+
find_library(LIBCRYPT crypt)
79+
if(LIBCRYPT STREQUAL LIBCRYPT-NOTFOUND)
80+
message(WARNING "LIBCRYPT not found! SSH, and TLS support disabled.")
81+
set(ENABLE_SSH OFF)
82+
set(ENABLE_TLS OFF)
83+
endif()
84+
endif()
85+
7186
# package options
72-
find_program (DEB_BUILDER NAMES debuild)
73-
find_program (RPM_BUILDER NAMES rpmbuild)
87+
find_program(DEB_BUILDER NAMES debuild)
88+
find_program(RPM_BUILDER NAMES rpmbuild)
7489

75-
if (NOT DEFINED ENV{TRAVIS_BRANCH})
90+
if(NOT DEFINED ENV{TRAVIS_BRANCH})
7691
execute_process(COMMAND "git" "rev-parse" "--abbrev-ref" "HEAD"
7792
OUTPUT_VARIABLE GIT_BRANCH
7893
OUTPUT_STRIP_TRAILING_WHITESPACE
7994
ERROR_QUIET
80-
)
81-
if (NOT GIT_BRANCH)
95+
)
96+
if(NOT GIT_BRANCH)
8297
set(ENV{TRAVIS_BRANCH} "master")
8398
else()
84-
if (GIT_BRANCH MATCHES "master|devel")
99+
if(GIT_BRANCH MATCHES "master|devel")
85100
set(ENV{TRAVIS_BRANCH} ${GIT_BRANCH})
86101
else()
87102
set(ENV{TRAVIS_BRANCH} "master")
88103
endif()
89104
endif()
90-
set(GIT_BRANCH $ENV{TRAVIS_BRANCH})
105+
106+
set(GIT_BRANCH $ENV{TRAVIS_BRANCH}) # NOTE: used for configure_file too
91107
endif()
92108

93-
if ($ENV{TRAVIS_BRANCH} STREQUAL "master")
109+
if(GIT_BRANCH STREQUAL master)
94110
set(PACKAGE_NAME "libnetconf2")
95111
set(BRANCH "master")
96112
set(BUILD_TYPE "Package")
97113
set(CONFLICT_PACKAGE_NAME "libnetconf2-experimental")
98114
set(COMPAT_PACKAGES "")
99-
else ()
115+
else()
100116
set(PACKAGE_NAME "libnetconf2-experimental")
101117
set(BRANCH "devel")
102-
set(BUILD_TYPE "debug")
118+
set(BUILD_TYPE "Debug")
103119
set(CONFLICT_PACKAGE_NAME "libnetconf2")
104120
set(COMPAT_PACKAGES "-experimental")
105121
endif()
@@ -109,9 +125,9 @@ configure_file(${PROJECT_SOURCE_DIR}/packages/libnetconf2.dsc.in ${PROJECT_BINAR
109125
configure_file(${PROJECT_SOURCE_DIR}/packages/debian.control.in ${PROJECT_BINARY_DIR}/build-packages/debian.control @ONLY)
110126
configure_file(${PROJECT_SOURCE_DIR}/packages/debian.rules.in ${PROJECT_BINARY_DIR}/build-packages/debian.rules)
111127

112-
if (NOT DEB_BUILDER)
128+
if(NOT DEB_BUILDER)
113129
message(WARNING "Missing tools (devscripts, debhelper package) for building deb package.\nYou won't be able to generate deb package from source code.\nCompiling libnetconf2 should still works fine.")
114-
else ()
130+
else()
115131
# target for local build deb package
116132
add_custom_target(build-deb
117133
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
@@ -120,9 +136,9 @@ else ()
120136
configure_file(${PROJECT_SOURCE_DIR}/packages/local-deb.sh.in ${PROJECT_BINARY_DIR}/build-packages/local-deb.sh @ONLY)
121137
endif()
122138

123-
if (NOT RPM_BUILDER)
139+
if(NOT RPM_BUILDER)
124140
message(WARNING "Missing tools (rpm package) for building rpm package. \nYou won't be able to generate rpm package from source code.\nCompiling libnetconf2 should still work fine.")
125-
else ()
141+
else()
126142
# target for local build rpm package
127143
string(REPLACE ${PROJECT_SOURCE_DIR} "." EXCLUDE_BUILD_DIR ${PROJECT_BINARY_DIR})
128144
add_custom_target(build-rpm
@@ -146,20 +162,21 @@ set(libsrc
146162
src/time.c)
147163

148164
if(ENABLE_SSH)
149-
set(libsrc ${libsrc}
165+
list(APPEND libsrc
150166
src/session_client_ssh.c
151167
src/session_server_ssh.c)
152168
set(SSH_MACRO "#ifndef NC_ENABLED_SSH\n#define NC_ENABLED_SSH\n#endif")
153169
endif()
154170

155171
if(ENABLE_TLS)
156-
set(libsrc ${libsrc}
172+
list(APPEND libsrc
157173
src/session_client_tls.c
158174
src/session_server_tls.c)
159175
set(TLS_MACRO "#ifndef NC_ENABLED_TLS\n#define NC_ENABLED_TLS\n#endif")
160176
endif()
161177

162178
set(headers
179+
${PROJECT_BINARY_DIR}/src/config.h
163180
src/log.h
164181
src/netconf.h
165182
src/session.h
@@ -170,11 +187,11 @@ set(headers
170187
src/session_server.h
171188
src/session_server_ch.h)
172189

173-
# libnetconf2 target
174-
add_library(netconf2 SHARED ${libsrc})
190+
# netconf2 target
191+
add_library(netconf2 SHARED ${libsrc} ${headers})
175192
set_target_properties(netconf2 PROPERTIES VERSION ${LIBNETCONF2_VERSION} SOVERSION ${LIBNETCONF2_SOVERSION_FULL})
176193

177-
if((CMAKE_BUILD_TYPE STREQUAL debug) OR (CMAKE_BUILD_TYPE STREQUAL Package))
194+
if((CMAKE_BUILD_TYPE STREQUAL Debug) OR (CMAKE_BUILD_TYPE STREQUAL Package))
178195
option(ENABLE_BUILD_TESTS "Build tests" ON)
179196
option(ENABLE_VALGRIND_TESTS "Build tests with valgrind" ON)
180197
else()
@@ -196,22 +213,28 @@ check_function_exists(pthread_rwlockattr_setkind_np HAVE_PTHREAD_RWLOCKATTR_SETK
196213
# dependencies - openssl
197214
if(ENABLE_TLS OR ENABLE_DNSSEC OR ENABLE_SSH)
198215
find_package(OpenSSL REQUIRED)
199-
if (ENABLE_TLS)
216+
if(ENABLE_TLS)
217+
message(STATUS "OPENSSL found, required for TLS")
200218
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DNC_ENABLED_TLS")
201219
endif()
220+
221+
#TODO target_link_libraries(netconf2 PUBLIC OpenSSL::SSL OpenSSL::Crypto)
202222
target_link_libraries(netconf2 ${OPENSSL_LIBRARIES})
203223
include_directories(${OPENSSL_INCLUDE_DIR})
204224
endif()
205225

206226
# dependencies - libssh
207227
if(ENABLE_SSH)
228+
option(LIBSSH_FIND_VERSION "check version too" ON)
208229
find_package(LibSSH 0.7.0 REQUIRED)
209230
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DNC_ENABLED_SSH")
210-
message(STATUS "LibSSH version ${LibSSH_VERSION} found")
211-
if(LibSSH_VERSION VERSION_EQUAL 0.9.3)
212-
message(FATAL_ERROR "LibSSH 0.9.3 includes regression bugs and libnetconf2 will NOT work properly, try to use an older version")
231+
message(STATUS "LibSSH version ${LIBSSH_VERSION} found")
232+
233+
if(LIBSSH_VERSION VERSION_EQUAL 0.9.3)
234+
message(FATAL_ERROR "LIBSSH 0.9.3 includes regression bugs and libnetconf2 will NOT work properly, try to use an older version")
213235
endif()
214-
if(LibSSH_VERSION VERSION_LESS 0.8.0)
236+
237+
if(LIBSSH_VERSION VERSION_LESS 0.8.0)
215238
target_link_libraries(netconf2 "-L${LIBSSH_LIBRARY_DIR}" -lssh -lssh_threads -lcrypt)
216239
else()
217240
target_link_libraries(netconf2 "-L${LIBSSH_LIBRARY_DIR}" -lssh -lcrypt)
@@ -221,7 +244,7 @@ if(ENABLE_SSH)
221244
endif()
222245

223246
# dependencies - libval
224-
if (ENABLE_DNSSEC)
247+
if(ENABLE_DNSSEC)
225248
find_package(LibVAL REQUIRED)
226249
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DENABLE_DNSSEC")
227250
target_link_libraries(netconf2 ${LIBVAL_LIBRARIES})
@@ -246,7 +269,7 @@ endif()
246269
# Python bindings
247270
if(ENABLE_PYTHON)
248271
add_subdirectory(python)
249-
endif(ENABLE_PYTHON)
272+
endif()
250273

251274
# install library
252275
install(TARGETS netconf2 DESTINATION ${CMAKE_INSTALL_LIBDIR})
@@ -287,7 +310,7 @@ if(ENABLE_BUILD_TESTS)
287310
if(CMOCKA_FOUND)
288311
enable_testing()
289312
add_subdirectory(tests)
290-
endif(CMOCKA_FOUND)
313+
endif()
291314
endif()
292315

293316
configure_file("${PROJECT_SOURCE_DIR}/src/config.h.in" "${PROJECT_BINARY_DIR}/src/config.h" ESCAPE_QUOTES @ONLY)

CMakeModules/FindCMocka.cmake

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,15 +35,15 @@ find_library(CMOCKA_LIBRARY
3535
${CMOCKA_ROOT_DIR}/include
3636
)
3737

38-
if (CMOCKA_LIBRARY)
38+
if(CMOCKA_LIBRARY)
3939
set(CMOCKA_LIBRARIES
4040
${CMOCKA_LIBRARIES}
4141
${CMOCKA_LIBRARY}
4242
)
43-
endif (CMOCKA_LIBRARY)
43+
endif()
4444

4545
include(FindPackageHandleStandardArgs)
46-
find_package_handle_standard_args(CMocka DEFAULT_MSG CMOCKA_LIBRARIES CMOCKA_INCLUDE_DIR)
46+
find_package_handle_standard_args(CMOCKA DEFAULT_MSG CMOCKA_LIBRARIES CMOCKA_INCLUDE_DIR)
4747

4848
# show the CMOCKA_INCLUDE_DIR and CMOCKA_LIBRARIES variables only in the advanced view
4949
mark_as_advanced(CMOCKA_INCLUDE_DIR CMOCKA_LIBRARIES)

CMakeModules/FindLibSSH.cmake

Lines changed: 34 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,10 @@
3131
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3232
#
3333

34-
if (LIBSSH_LIBRARY_DIR AND LIBSSH_INCLUDE_DIRS)
34+
if(LIBSSH_LIBRARY_DIR AND LIBSSH_INCLUDE_DIRS)
3535
# in cache already
3636
set(LIBSSH_FOUND TRUE)
37-
else (LIBSSH_LIBRARY_DIR AND LIBSSH_INCLUDE_DIRS)
37+
else()
3838

3939
find_path(LIBSSH_INCLUDE_DIR
4040
NAMES
@@ -48,10 +48,11 @@ else (LIBSSH_LIBRARY_DIR AND LIBSSH_INCLUDE_DIRS)
4848
${CMAKE_INSTALL_PREFIX}/include
4949
)
5050

51-
find_library(SSH_LIBRARY
51+
find_library(LIBSSH_LIBRARY
5252
NAMES
5353
ssh.so
5454
libssh.so
55+
libssh.dylib
5556
PATHS
5657
/usr/lib
5758
/usr/local/lib
@@ -61,58 +62,63 @@ else (LIBSSH_LIBRARY_DIR AND LIBSSH_INCLUDE_DIRS)
6162
${CMAKE_INSTALL_PREFIX}/lib
6263
)
6364

64-
if (LIBSSH_INCLUDE_DIR AND SSH_LIBRARY)
65-
set(SSH_FOUND TRUE)
66-
endif (LIBSSH_INCLUDE_DIR AND SSH_LIBRARY)
65+
if(LIBSSH_INCLUDE_DIR AND LIBSSH_LIBRARY)
66+
set(LIBSSH_FOUND TRUE)
67+
message(STATUS "LIBSSH Found: ${LIBSSH_LIBRARY}")
68+
endif()
6769

68-
set(LIBSSH_INCLUDE_DIRS
69-
${LIBSSH_INCLUDE_DIR}
70-
)
70+
set(LIBSSH_INCLUDE_DIRS ${LIBSSH_INCLUDE_DIR})
71+
message(STATUS "LIBSSH_INCLUDE_DIR: ${LIBSSH_INCLUDE_DIR}")
7172

72-
if (SSH_FOUND)
73+
if(LIBSSH_FOUND)
7374
string(REPLACE "libssh.so" ""
7475
LIBSSH_LIBRARY_DIR
75-
${SSH_LIBRARY}
76+
${LIBSSH_LIBRARY}
77+
)
78+
string(REPLACE "libssh.dylib" ""
79+
LIBSSH_LIBRARY_DIR
80+
${LIBSSH_LIBRARY_DIR}
7681
)
7782
string(REPLACE "ssh.so" ""
7883
LIBSSH_LIBRARY_DIR
7984
${LIBSSH_LIBRARY_DIR}
8085
)
86+
message(STATUS "LIBSSH_LIBRARY_DIR: ${LIBSSH_LIBRARY_DIR}")
8187

82-
if (LibSSH_FIND_VERSION)
88+
if(LIBSSH_FIND_VERSION)
8389
file(STRINGS ${LIBSSH_INCLUDE_DIR}/libssh/libssh.h LIBSSH_VERSION_MAJOR
8490
REGEX "#define[ ]+LIBSSH_VERSION_MAJOR[ ]+[0-9]+")
8591
# Older versions of libssh like libssh-0.2 have LIBSSH_VERSION but not LIBSSH_VERSION_MAJOR
86-
if (LIBSSH_VERSION_MAJOR)
92+
if(LIBSSH_VERSION_MAJOR)
8793
string(REGEX MATCH "[0-9]+" LIBSSH_VERSION_MAJOR ${LIBSSH_VERSION_MAJOR})
88-
file(STRINGS ${LIBSSH_INCLUDE_DIR}/libssh/libssh.h LIBSSH_VERSION_MINOR
94+
file(STRINGS ${LIBSSH_INCLUDE_DIR}/libssh/libssh.h LIBSSH_VERSION_MINOR
8995
REGEX "#define[ ]+LIBSSH_VERSION_MINOR[ ]+[0-9]+")
90-
string(REGEX MATCH "[0-9]+" LIBSSH_VERSION_MINOR ${LIBSSH_VERSION_MINOR})
91-
file(STRINGS ${LIBSSH_INCLUDE_DIR}/libssh/libssh.h LIBSSH_VERSION_PATCH
96+
string(REGEX MATCH "[0-9]+" LIBSSH_VERSION_MINOR ${LIBSSH_VERSION_MINOR})
97+
file(STRINGS ${LIBSSH_INCLUDE_DIR}/libssh/libssh.h LIBSSH_VERSION_PATCH
9298
REGEX "#define[ ]+LIBSSH_VERSION_MICRO[ ]+[0-9]+")
93-
string(REGEX MATCH "[0-9]+" LIBSSH_VERSION_PATCH ${LIBSSH_VERSION_PATCH})
99+
string(REGEX MATCH "[0-9]+" LIBSSH_VERSION_PATCH ${LIBSSH_VERSION_PATCH})
94100

95-
set(LibSSH_VERSION ${LIBSSH_VERSION_MAJOR}.${LIBSSH_VERSION_MINOR}.${LIBSSH_VERSION_PATCH})
101+
set(LIBSSH_VERSION ${LIBSSH_VERSION_MAJOR}.${LIBSSH_VERSION_MINOR}.${LIBSSH_VERSION_PATCH})
96102

97-
include(FindPackageVersionCheck)
98-
find_package_version_check(LibSSH DEFAULT_MSG)
99-
else (LIBSSH_VERSION_MAJOR)
103+
include(FindPackageVersionCheck)
104+
find_package_version_check(LIBSSH DEFAULT_MSG)
105+
else()
100106
message(STATUS "LIBSSH_VERSION_MAJOR not found in ${LIBSSH_INCLUDE_DIR}/libssh/libssh.h, assuming libssh is too old")
101107
set(LIBSSH_FOUND FALSE)
102-
endif (LIBSSH_VERSION_MAJOR)
103-
endif (LibSSH_FIND_VERSION)
104-
endif (SSH_FOUND)
108+
endif()
109+
endif()
110+
endif()
105111

106112
# If the version is too old, but libs and includes are set,
107113
# find_package_handle_standard_args will set LIBSSH_FOUND to TRUE again,
108114
# so we need this if() here.
109-
if (LIBSSH_FOUND)
115+
if(LIBSSH_FOUND)
110116
include(FindPackageHandleStandardArgs)
111-
find_package_handle_standard_args(LibSSH DEFAULT_MSG LIBSSH_LIBRARY_DIR LIBSSH_INCLUDE_DIRS)
112-
endif (LIBSSH_FOUND)
117+
find_package_handle_standard_args(LIBSSH DEFAULT_MSG LIBSSH_LIBRARY_DIR LIBSSH_INCLUDE_DIRS)
118+
endif()
113119

114120
# show the LIBSSH_INCLUDE_DIRS and LIBSSH_LIBRARY_DIR variables only in the advanced view
115121
mark_as_advanced(LIBSSH_INCLUDE_DIRS LIBSSH_LIBRARY_DIR)
116122

117-
endif (LIBSSH_LIBRARY_DIR AND LIBSSH_INCLUDE_DIRS)
123+
endif()
118124

0 commit comments

Comments
 (0)