Skip to content

Commit ed4a452

Browse files
committed
build FEATURE support latest libssh
Also, rewrite the whole FindLibSSH module because it was really messy and obsolete. Fixes #232
1 parent c5dc670 commit ed4a452

3 files changed

Lines changed: 79 additions & 182 deletions

File tree

CMakeLists.txt

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -150,22 +150,14 @@ endif()
150150
# dependencies - libssh
151151
if(ENABLE_SSH)
152152
find_package(LibSSH 0.7.0 REQUIRED)
153-
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DNC_ENABLED_SSH")
154-
message(STATUS "LibSSH version ${LibSSH_VERSION} found")
155-
156-
if(LibSSH_VERSION VERSION_EQUAL 0.9.3 OR LibSSH_VERSION VERSION_EQUAL 0.9.4)
157-
message(FATAL_ERROR "LibSSH ${LibSSH_VERSION} includes regression bugs and libnetconf2 will NOT work properly, try to use another version")
153+
if(LIBSSH_VERSION VERSION_EQUAL 0.9.3 OR LIBSSH_VERSION VERSION_EQUAL 0.9.4)
154+
message(FATAL_ERROR "LibSSH ${LIBSSH_VERSION} includes regression bugs and libnetconf2 will NOT work properly, try to use another version")
158155
endif()
159156

160-
if(LibSSH_VERSION VERSION_LESS 0.8.0)
161-
target_link_libraries(netconf2 "-L${LIBSSH_LIBRARY_DIR}" -lssh -lssh_threads)
162-
list(APPEND CMAKE_REQUIRED_FLAGS "-L${LIBSSH_LIBRARY_DIR}")
163-
list(APPEND CMAKE_REQUIRED_LIBRARIES ssh ssh_threads)
164-
else()
165-
target_link_libraries(netconf2 ${LIBSSH_LIBRARIES})
166-
list(APPEND CMAKE_REQUIRED_LIBRARIES ${LIBSSH_LIBRARIES})
167-
endif()
157+
target_link_libraries(netconf2 ${LIBSSH_LIBRARIES})
158+
list(APPEND CMAKE_REQUIRED_LIBRARIES ${LIBSSH_LIBRARIES})
168159
include_directories(${LIBSSH_INCLUDE_DIRS})
160+
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DNC_ENABLED_SSH")
169161

170162
# crypt
171163
if(NOT ${CMAKE_SYSTEM_NAME} MATCHES "QNX")

CMakeModules/FindLibSSH.cmake

Lines changed: 74 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,11 @@
33
#
44
# LIBSSH_FOUND - system has LibSSH
55
# LIBSSH_INCLUDE_DIRS - the LibSSH include directory
6-
# LIBSSH_LIBRARY_DIR - the LibSSH library directory
76
# LIBSSH_LIBRARIES - link these to use LibSSH
7+
# LIBSSH_VERSION -
88
#
9-
# Copyright (c) 2009 Andreas Schneider <asn@cryptomilk.org>
9+
# Author Michal Vasko <mvasko@cesnet.cz>
10+
# Copyright (c) 2020 CESNET, z.s.p.o.
1011
#
1112
# Redistribution and use in source and binary forms, with or without
1213
# modification, are permitted provided that the following conditions
@@ -31,93 +32,86 @@
3132
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
3233
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3334
#
35+
include(FindPackageHandleStandardArgs)
3436

35-
if(LIBSSH_LIBRARY_DIR AND LIBSSH_LIBRARIES AND LIBSSH_INCLUDE_DIRS)
36-
# in cache already
37-
set(LIBSSH_FOUND TRUE)
37+
if(LIBSSH_LIBRARIES AND LIBSSH_INCLUDE_DIRS)
38+
# in cache already
39+
set(LIBSSH_FOUND TRUE)
3840
else()
39-
40-
find_path(LIBSSH_INCLUDE_DIR
41-
NAMES
42-
libssh/libssh.h
43-
PATHS
44-
/usr/include
45-
/usr/local/include
46-
/opt/local/include
47-
/sw/include
48-
${CMAKE_INCLUDE_PATH}
49-
${CMAKE_INSTALL_PREFIX}/include
50-
)
51-
52-
find_library(LIBSSH_LIBRARY
53-
NAMES
54-
ssh.so
55-
libssh.so
56-
libssh.dylib
57-
PATHS
58-
/usr/lib
59-
/usr/local/lib
60-
/opt/local/lib
61-
/sw/lib
62-
${CMAKE_LIBRARY_PATH}
63-
${CMAKE_INSTALL_PREFIX}/lib
64-
)
65-
66-
if(LIBSSH_INCLUDE_DIR AND LIBSSH_LIBRARY)
67-
set(SSH_FOUND TRUE)
68-
endif()
69-
70-
set(LIBSSH_INCLUDE_DIRS ${LIBSSH_INCLUDE_DIR})
71-
set(LIBSSH_LIBRARIES ${LIBSSH_LIBRARY})
72-
73-
if (SSH_FOUND)
74-
string(REPLACE "libssh.so" ""
75-
LIBSSH_LIBRARY_DIR
76-
${LIBSSH_LIBRARY}
77-
)
78-
string(REPLACE "libssh.dylib" ""
79-
LIBSSH_LIBRARY_DIR
80-
${LIBSSH_LIBRARY_DIR}
41+
find_path(LIBSSH_INCLUDE_DIR
42+
NAMES
43+
libssh/libssh.h
44+
PATHS
45+
/usr/include
46+
/usr/local/include
47+
/opt/local/include
48+
/sw/include
49+
${CMAKE_INCLUDE_PATH}
50+
${CMAKE_INSTALL_PREFIX}/include
8151
)
82-
string(REPLACE "ssh.so" ""
83-
LIBSSH_LIBRARY_DIR
84-
${LIBSSH_LIBRARY_DIR}
52+
53+
find_library(LIBSSH_LIBRARY
54+
NAMES
55+
ssh.so
56+
libssh.so
57+
libssh.dylib
58+
PATHS
59+
/usr/lib
60+
/usr/local/lib
61+
/opt/local/lib
62+
/sw/lib
63+
${CMAKE_LIBRARY_PATH}
64+
${CMAKE_INSTALL_PREFIX}/lib
8565
)
8666

87-
if (LibSSH_FIND_VERSION)
88-
file(STRINGS ${LIBSSH_INCLUDE_DIR}/libssh/libssh.h LIBSSH_VERSION_MAJOR
89-
REGEX "#define[ ]+LIBSSH_VERSION_MAJOR[ ]+[0-9]+")
90-
# Older versions of libssh like libssh-0.2 have LIBSSH_VERSION but not LIBSSH_VERSION_MAJOR
91-
if (LIBSSH_VERSION_MAJOR)
92-
string(REGEX MATCH "[0-9]+" LIBSSH_VERSION_MAJOR ${LIBSSH_VERSION_MAJOR})
93-
file(STRINGS ${LIBSSH_INCLUDE_DIR}/libssh/libssh.h LIBSSH_VERSION_MINOR
94-
REGEX "#define[ ]+LIBSSH_VERSION_MINOR[ ]+[0-9]+")
95-
string(REGEX MATCH "[0-9]+" LIBSSH_VERSION_MINOR ${LIBSSH_VERSION_MINOR})
96-
file(STRINGS ${LIBSSH_INCLUDE_DIR}/libssh/libssh.h LIBSSH_VERSION_PATCH
97-
REGEX "#define[ ]+LIBSSH_VERSION_MICRO[ ]+[0-9]+")
98-
string(REGEX MATCH "[0-9]+" LIBSSH_VERSION_PATCH ${LIBSSH_VERSION_PATCH})
67+
if(LIBSSH_INCLUDE_DIR AND LIBSSH_LIBRARY)
68+
# learn libssh version
69+
if(EXISTS ${LIBSSH_INCLUDE_DIR}/libssh/libssh_version.h)
70+
set(LIBSSH_HEADER_PATH ${LIBSSH_INCLUDE_DIR}/libssh/libssh_version.h)
71+
else()
72+
set(LIBSSH_HEADER_PATH ${LIBSSH_INCLUDE_DIR}/libssh/libssh.h)
73+
endif()
74+
file(STRINGS ${LIBSSH_HEADER_PATH} LIBSSH_VERSION_MAJOR
75+
REGEX "#define[ ]+LIBSSH_VERSION_MAJOR[ ]+[0-9]+")
76+
if(NOT LIBSSH_VERSION_MAJOR)
77+
message(STATUS "LIBSSH_VERSION_MAJOR not found, assuming libssh is too old and cannot be used!")
78+
set(LIBSSH_INCLUDE_DIR "LIBSSH_INCLUDE_DIR-NOTFOUND")
79+
set(LIBSSH_LIBRARY "LIBSSH_LIBRARY-NOTFOUND")
80+
else()
81+
string(REGEX MATCH "[0-9]+" LIBSSH_VERSION_MAJOR ${LIBSSH_VERSION_MAJOR})
82+
file(STRINGS ${LIBSSH_HEADER_PATH} LIBSSH_VERSION_MINOR
83+
REGEX "#define[ ]+LIBSSH_VERSION_MINOR[ ]+[0-9]+")
84+
string(REGEX MATCH "[0-9]+" LIBSSH_VERSION_MINOR ${LIBSSH_VERSION_MINOR})
85+
file(STRINGS ${LIBSSH_HEADER_PATH} LIBSSH_VERSION_PATCH
86+
REGEX "#define[ ]+LIBSSH_VERSION_MICRO[ ]+[0-9]+")
87+
string(REGEX MATCH "[0-9]+" LIBSSH_VERSION_PATCH ${LIBSSH_VERSION_PATCH})
9988

100-
set(LibSSH_VERSION ${LIBSSH_VERSION_MAJOR}.${LIBSSH_VERSION_MINOR}.${LIBSSH_VERSION_PATCH})
89+
set(LIBSSH_VERSION ${LIBSSH_VERSION_MAJOR}.${LIBSSH_VERSION_MINOR}.${LIBSSH_VERSION_PATCH})
10190

102-
include(FindPackageVersionCheck)
103-
find_package_version_check(LibSSH DEFAULT_MSG)
104-
else()
105-
message(STATUS "LIBSSH_VERSION_MAJOR not found in ${LIBSSH_INCLUDE_DIR}/libssh/libssh.h, assuming libssh is too old")
106-
set(LIBSSH_FOUND FALSE)
107-
endif()
91+
if(LIBSSH_VERSION VERSION_LESS 0.8.0)
92+
# libssh_threads also needs to be linked for these versions
93+
string(REPLACE "libssh.so" ""
94+
LIBSSH_THREADS_LIBRARY
95+
${LIBSSH_LIBRARY}
96+
)
97+
string(REPLACE "libssh.dylib" ""
98+
LIBSSH_THREADS_LIBRARY
99+
${LIBSSH_THREADS_LIBRARY}
100+
)
101+
string(REPLACE "ssh.so" ""
102+
LIBSSH_THREADS_LIBRARY
103+
${LIBSSH_THREADS_LIBRARY}
104+
)
105+
endif()
106+
endif()
108107
endif()
109-
endif()
110-
111-
# If the version is too old, but libs and includes are set,
112-
# find_package_handle_standard_args will set LIBSSH_FOUND to TRUE again,
113-
# so we need this if() here.
114-
if(LIBSSH_FOUND)
115-
include(FindPackageHandleStandardArgs)
116-
find_package_handle_standard_args(LibSSH DEFAULT_MSG LIBSSH_LIBRARY_DIR LIBSSH_INCLUDE_DIRS)
117-
endif()
118108

119-
# show the LIBSSH_INCLUDE_DIRS, LIBSSH_LIBRARIES, and LIBSSH_LIBRARY_DIR variables only in the advanced view
120-
mark_as_advanced(LIBSSH_INCLUDE_DIRS LIBSSH_LIBRARY_DIR LIBSSH_LIBRARIES)
109+
set(LIBSSH_INCLUDE_DIRS ${LIBSSH_INCLUDE_DIR})
110+
set(LIBSSH_LIBRARIES ${LIBSSH_LIBRARY} ${LIBSSH_THREADS_LIBRARY})
111+
mark_as_advanced(LIBSSH_INCLUDE_DIRS LIBSSH_LIBRARIES)
121112

113+
find_package_handle_standard_args(LibSSH FOUND_VAR LIBSSH_FOUND
114+
REQUIRED_VARS LIBSSH_INCLUDE_DIRS LIBSSH_LIBRARIES
115+
VERSION_VAR LIBSSH_VERSION)
122116
endif()
123117

CMakeModules/FindPackageVersionCheck.cmake

Lines changed: 0 additions & 89 deletions
This file was deleted.

0 commit comments

Comments
 (0)