Skip to content

Commit

Permalink
Prevent compile errors on OSX (#198)
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
2 people authored and michalvasko committed Jan 20, 2020
1 parent c4b3374 commit 2209191
Show file tree
Hide file tree
Showing 14 changed files with 184 additions and 133 deletions.
2 changes: 1 addition & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ before_install:
- if [ "$TRAVIS_OS_NAME" = "osx" ]; then bash .travis-deps-osx.sh; fi

script:
- if [ "$TRAVIS_OS_NAME" = "osx" ]; then export OPENSSLFLAGS="-DOPENSSL_LIBRARIES=/usr/local/opt/openssl/lib -DOPENSSL_INCLUDE_DIR=/usr/local/opt/openssl/include"; fi
- if [ "$TRAVIS_OS_NAME" = "osx" ]; then export OPENSSLFLAGS="-DOPENSSL_ROOT_DIR=/usr/local/opt/openssl"; fi
- 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
- 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
- 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
Expand Down
89 changes: 56 additions & 33 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,15 +1,18 @@
cmake_minimum_required(VERSION 2.6)
project(libnetconf2 C)

project(libnetconf2 LANGUAGES C)

include(GNUInstallDirs)
include(CheckFunctionExists)
include(CheckCSourceCompiles)
include(CheckIncludeFile)

if(POLICY CMP0075)
cmake_policy(SET CMP0075 NEW)
endif()

# include custom Modules
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/CMakeModules/")
list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/CMakeModules/")

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

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

# set default build type if not specified by user
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE debug)
set(CMAKE_BUILD_TYPE Debug)
endif()

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -fvisibility=hidden -std=gnu11")
set(CMAKE_C_FLAGS_RELEASE "-O2 -DNDEBUG")
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_EXTENSIONS ON)
add_compile_options(-Wall -Wextra -fvisibility=hidden)
#TODO add_compile_options(-Wpedantic)


set(CMAKE_C_FLAGS_PACKAGE "-g -O2 -DNDEBUG")
set(CMAKE_C_FLAGS_DEBUG "-g -O0")

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

if(ENABLE_SSH)
find_library(LIBCRYPT crypt)
if(LIBCRYPT STREQUAL LIBCRYPT-NOTFOUND)
message(WARNING "LIBCRYPT not found! SSH, and TLS support disabled.")
set(ENABLE_SSH OFF)
set(ENABLE_TLS OFF)
endif()
endif()

# package options
find_program (DEB_BUILDER NAMES debuild)
find_program (RPM_BUILDER NAMES rpmbuild)
find_program(DEB_BUILDER NAMES debuild)
find_program(RPM_BUILDER NAMES rpmbuild)

if (NOT DEFINED ENV{TRAVIS_BRANCH})
if(NOT DEFINED ENV{TRAVIS_BRANCH})
execute_process(COMMAND "git" "rev-parse" "--abbrev-ref" "HEAD"
OUTPUT_VARIABLE GIT_BRANCH
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_QUIET
)
if (NOT GIT_BRANCH)
)
if(NOT GIT_BRANCH)
set(ENV{TRAVIS_BRANCH} "master")
else()
if (GIT_BRANCH MATCHES "master|devel")
if(GIT_BRANCH MATCHES "master|devel")
set(ENV{TRAVIS_BRANCH} ${GIT_BRANCH})
else()
set(ENV{TRAVIS_BRANCH} "master")
endif()
endif()
set(GIT_BRANCH $ENV{TRAVIS_BRANCH})

set(GIT_BRANCH $ENV{TRAVIS_BRANCH}) # NOTE: used for configure_file too
endif()

if ($ENV{TRAVIS_BRANCH} STREQUAL "master")
if(GIT_BRANCH STREQUAL master)
set(PACKAGE_NAME "libnetconf2")
set(BRANCH "master")
set(BUILD_TYPE "Package")
set(CONFLICT_PACKAGE_NAME "libnetconf2-experimental")
set(COMPAT_PACKAGES "")
else ()
else()
set(PACKAGE_NAME "libnetconf2-experimental")
set(BRANCH "devel")
set(BUILD_TYPE "debug")
set(BUILD_TYPE "Debug")
set(CONFLICT_PACKAGE_NAME "libnetconf2")
set(COMPAT_PACKAGES "-experimental")
endif()
Expand All @@ -109,9 +125,9 @@ configure_file(${PROJECT_SOURCE_DIR}/packages/libnetconf2.dsc.in ${PROJECT_BINAR
configure_file(${PROJECT_SOURCE_DIR}/packages/debian.control.in ${PROJECT_BINARY_DIR}/build-packages/debian.control @ONLY)
configure_file(${PROJECT_SOURCE_DIR}/packages/debian.rules.in ${PROJECT_BINARY_DIR}/build-packages/debian.rules)

if (NOT DEB_BUILDER)
if(NOT DEB_BUILDER)
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.")
else ()
else()
# target for local build deb package
add_custom_target(build-deb
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
Expand All @@ -120,9 +136,9 @@ else ()
configure_file(${PROJECT_SOURCE_DIR}/packages/local-deb.sh.in ${PROJECT_BINARY_DIR}/build-packages/local-deb.sh @ONLY)
endif()

if (NOT RPM_BUILDER)
if(NOT RPM_BUILDER)
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.")
else ()
else()
# target for local build rpm package
string(REPLACE ${PROJECT_SOURCE_DIR} "." EXCLUDE_BUILD_DIR ${PROJECT_BINARY_DIR})
add_custom_target(build-rpm
Expand All @@ -146,20 +162,21 @@ set(libsrc
src/time.c)

if(ENABLE_SSH)
set(libsrc ${libsrc}
list(APPEND libsrc
src/session_client_ssh.c
src/session_server_ssh.c)
set(SSH_MACRO "#ifndef NC_ENABLED_SSH\n#define NC_ENABLED_SSH\n#endif")
endif()

if(ENABLE_TLS)
set(libsrc ${libsrc}
list(APPEND libsrc
src/session_client_tls.c
src/session_server_tls.c)
set(TLS_MACRO "#ifndef NC_ENABLED_TLS\n#define NC_ENABLED_TLS\n#endif")
endif()

set(headers
${PROJECT_BINARY_DIR}/src/config.h
src/log.h
src/netconf.h
src/session.h
Expand All @@ -170,11 +187,11 @@ set(headers
src/session_server.h
src/session_server_ch.h)

# libnetconf2 target
add_library(netconf2 SHARED ${libsrc})
# netconf2 target
add_library(netconf2 SHARED ${libsrc} ${headers})
set_target_properties(netconf2 PROPERTIES VERSION ${LIBNETCONF2_VERSION} SOVERSION ${LIBNETCONF2_SOVERSION_FULL})

if((CMAKE_BUILD_TYPE STREQUAL debug) OR (CMAKE_BUILD_TYPE STREQUAL Package))
if((CMAKE_BUILD_TYPE STREQUAL Debug) OR (CMAKE_BUILD_TYPE STREQUAL Package))
option(ENABLE_BUILD_TESTS "Build tests" ON)
option(ENABLE_VALGRIND_TESTS "Build tests with valgrind" ON)
else()
Expand All @@ -196,22 +213,28 @@ check_function_exists(pthread_rwlockattr_setkind_np HAVE_PTHREAD_RWLOCKATTR_SETK
# dependencies - openssl
if(ENABLE_TLS OR ENABLE_DNSSEC OR ENABLE_SSH)
find_package(OpenSSL REQUIRED)
if (ENABLE_TLS)
if(ENABLE_TLS)
message(STATUS "OPENSSL found, required for TLS")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DNC_ENABLED_TLS")
endif()

#TODO target_link_libraries(netconf2 PUBLIC OpenSSL::SSL OpenSSL::Crypto)
target_link_libraries(netconf2 ${OPENSSL_LIBRARIES})
include_directories(${OPENSSL_INCLUDE_DIR})
endif()

# dependencies - libssh
if(ENABLE_SSH)
option(LIBSSH_FIND_VERSION "check version too" ON)
find_package(LibSSH 0.7.0 REQUIRED)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DNC_ENABLED_SSH")
message(STATUS "LibSSH version ${LibSSH_VERSION} found")
if(LibSSH_VERSION VERSION_EQUAL 0.9.3)
message(FATAL_ERROR "LibSSH 0.9.3 includes regression bugs and libnetconf2 will NOT work properly, try to use an older version")
message(STATUS "LibSSH version ${LIBSSH_VERSION} found")

if(LIBSSH_VERSION VERSION_EQUAL 0.9.3)
message(FATAL_ERROR "LIBSSH 0.9.3 includes regression bugs and libnetconf2 will NOT work properly, try to use an older version")
endif()
if(LibSSH_VERSION VERSION_LESS 0.8.0)

if(LIBSSH_VERSION VERSION_LESS 0.8.0)
target_link_libraries(netconf2 "-L${LIBSSH_LIBRARY_DIR}" -lssh -lssh_threads -lcrypt)
else()
target_link_libraries(netconf2 "-L${LIBSSH_LIBRARY_DIR}" -lssh -lcrypt)
Expand All @@ -221,7 +244,7 @@ if(ENABLE_SSH)
endif()

# dependencies - libval
if (ENABLE_DNSSEC)
if(ENABLE_DNSSEC)
find_package(LibVAL REQUIRED)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DENABLE_DNSSEC")
target_link_libraries(netconf2 ${LIBVAL_LIBRARIES})
Expand All @@ -246,7 +269,7 @@ endif()
# Python bindings
if(ENABLE_PYTHON)
add_subdirectory(python)
endif(ENABLE_PYTHON)
endif()

# install library
install(TARGETS netconf2 DESTINATION ${CMAKE_INSTALL_LIBDIR})
Expand Down Expand Up @@ -287,7 +310,7 @@ if(ENABLE_BUILD_TESTS)
if(CMOCKA_FOUND)
enable_testing()
add_subdirectory(tests)
endif(CMOCKA_FOUND)
endif()
endif()

configure_file("${PROJECT_SOURCE_DIR}/src/config.h.in" "${PROJECT_BINARY_DIR}/src/config.h" ESCAPE_QUOTES @ONLY)
Expand Down
6 changes: 3 additions & 3 deletions CMakeModules/FindCMocka.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -35,15 +35,15 @@ find_library(CMOCKA_LIBRARY
${CMOCKA_ROOT_DIR}/include
)

if (CMOCKA_LIBRARY)
if(CMOCKA_LIBRARY)
set(CMOCKA_LIBRARIES
${CMOCKA_LIBRARIES}
${CMOCKA_LIBRARY}
)
endif (CMOCKA_LIBRARY)
endif()

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(CMocka DEFAULT_MSG CMOCKA_LIBRARIES CMOCKA_INCLUDE_DIR)
find_package_handle_standard_args(CMOCKA DEFAULT_MSG CMOCKA_LIBRARIES CMOCKA_INCLUDE_DIR)

# show the CMOCKA_INCLUDE_DIR and CMOCKA_LIBRARIES variables only in the advanced view
mark_as_advanced(CMOCKA_INCLUDE_DIR CMOCKA_LIBRARIES)
62 changes: 34 additions & 28 deletions CMakeModules/FindLibSSH.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,10 @@
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#

if (LIBSSH_LIBRARY_DIR AND LIBSSH_INCLUDE_DIRS)
if(LIBSSH_LIBRARY_DIR AND LIBSSH_INCLUDE_DIRS)
# in cache already
set(LIBSSH_FOUND TRUE)
else (LIBSSH_LIBRARY_DIR AND LIBSSH_INCLUDE_DIRS)
else()

find_path(LIBSSH_INCLUDE_DIR
NAMES
Expand All @@ -48,10 +48,11 @@ else (LIBSSH_LIBRARY_DIR AND LIBSSH_INCLUDE_DIRS)
${CMAKE_INSTALL_PREFIX}/include
)

find_library(SSH_LIBRARY
find_library(LIBSSH_LIBRARY
NAMES
ssh.so
libssh.so
libssh.dylib
PATHS
/usr/lib
/usr/local/lib
Expand All @@ -61,58 +62,63 @@ else (LIBSSH_LIBRARY_DIR AND LIBSSH_INCLUDE_DIRS)
${CMAKE_INSTALL_PREFIX}/lib
)

if (LIBSSH_INCLUDE_DIR AND SSH_LIBRARY)
set(SSH_FOUND TRUE)
endif (LIBSSH_INCLUDE_DIR AND SSH_LIBRARY)
if(LIBSSH_INCLUDE_DIR AND LIBSSH_LIBRARY)
set(LIBSSH_FOUND TRUE)
message(STATUS "LIBSSH Found: ${LIBSSH_LIBRARY}")
endif()

set(LIBSSH_INCLUDE_DIRS
${LIBSSH_INCLUDE_DIR}
)
set(LIBSSH_INCLUDE_DIRS ${LIBSSH_INCLUDE_DIR})
message(STATUS "LIBSSH_INCLUDE_DIR: ${LIBSSH_INCLUDE_DIR}")

if (SSH_FOUND)
if(LIBSSH_FOUND)
string(REPLACE "libssh.so" ""
LIBSSH_LIBRARY_DIR
${SSH_LIBRARY}
${LIBSSH_LIBRARY}
)
string(REPLACE "libssh.dylib" ""
LIBSSH_LIBRARY_DIR
${LIBSSH_LIBRARY_DIR}
)
string(REPLACE "ssh.so" ""
LIBSSH_LIBRARY_DIR
${LIBSSH_LIBRARY_DIR}
)
message(STATUS "LIBSSH_LIBRARY_DIR: ${LIBSSH_LIBRARY_DIR}")

if (LibSSH_FIND_VERSION)
if(LIBSSH_FIND_VERSION)
file(STRINGS ${LIBSSH_INCLUDE_DIR}/libssh/libssh.h LIBSSH_VERSION_MAJOR
REGEX "#define[ ]+LIBSSH_VERSION_MAJOR[ ]+[0-9]+")
# Older versions of libssh like libssh-0.2 have LIBSSH_VERSION but not LIBSSH_VERSION_MAJOR
if (LIBSSH_VERSION_MAJOR)
if(LIBSSH_VERSION_MAJOR)
string(REGEX MATCH "[0-9]+" LIBSSH_VERSION_MAJOR ${LIBSSH_VERSION_MAJOR})
file(STRINGS ${LIBSSH_INCLUDE_DIR}/libssh/libssh.h LIBSSH_VERSION_MINOR
file(STRINGS ${LIBSSH_INCLUDE_DIR}/libssh/libssh.h LIBSSH_VERSION_MINOR
REGEX "#define[ ]+LIBSSH_VERSION_MINOR[ ]+[0-9]+")
string(REGEX MATCH "[0-9]+" LIBSSH_VERSION_MINOR ${LIBSSH_VERSION_MINOR})
file(STRINGS ${LIBSSH_INCLUDE_DIR}/libssh/libssh.h LIBSSH_VERSION_PATCH
string(REGEX MATCH "[0-9]+" LIBSSH_VERSION_MINOR ${LIBSSH_VERSION_MINOR})
file(STRINGS ${LIBSSH_INCLUDE_DIR}/libssh/libssh.h LIBSSH_VERSION_PATCH
REGEX "#define[ ]+LIBSSH_VERSION_MICRO[ ]+[0-9]+")
string(REGEX MATCH "[0-9]+" LIBSSH_VERSION_PATCH ${LIBSSH_VERSION_PATCH})
string(REGEX MATCH "[0-9]+" LIBSSH_VERSION_PATCH ${LIBSSH_VERSION_PATCH})

set(LibSSH_VERSION ${LIBSSH_VERSION_MAJOR}.${LIBSSH_VERSION_MINOR}.${LIBSSH_VERSION_PATCH})
set(LIBSSH_VERSION ${LIBSSH_VERSION_MAJOR}.${LIBSSH_VERSION_MINOR}.${LIBSSH_VERSION_PATCH})

include(FindPackageVersionCheck)
find_package_version_check(LibSSH DEFAULT_MSG)
else (LIBSSH_VERSION_MAJOR)
include(FindPackageVersionCheck)
find_package_version_check(LIBSSH DEFAULT_MSG)
else()
message(STATUS "LIBSSH_VERSION_MAJOR not found in ${LIBSSH_INCLUDE_DIR}/libssh/libssh.h, assuming libssh is too old")
set(LIBSSH_FOUND FALSE)
endif (LIBSSH_VERSION_MAJOR)
endif (LibSSH_FIND_VERSION)
endif (SSH_FOUND)
endif()
endif()
endif()

# If the version is too old, but libs and includes are set,
# find_package_handle_standard_args will set LIBSSH_FOUND to TRUE again,
# so we need this if() here.
if (LIBSSH_FOUND)
if(LIBSSH_FOUND)
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(LibSSH DEFAULT_MSG LIBSSH_LIBRARY_DIR LIBSSH_INCLUDE_DIRS)
endif (LIBSSH_FOUND)
find_package_handle_standard_args(LIBSSH DEFAULT_MSG LIBSSH_LIBRARY_DIR LIBSSH_INCLUDE_DIRS)
endif()

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

endif (LIBSSH_LIBRARY_DIR AND LIBSSH_INCLUDE_DIRS)
endif()

Loading

0 comments on commit 2209191

Please sign in to comment.