diff --git a/CMakeLists.txt b/CMakeLists.txt index 5d79029afc..9d9cccc54a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -145,6 +145,8 @@ if (USE_VCPKG_EIGEN) set (EIGEN_VCPKG_REPLACE "find_package(Eigen3 CONFIG)") endif() +find_package(LIBSSH 0.7.1) + if (WITH_FLAT_INSTALL) set(WPIUTIL_DEP_REPLACE "include($\{SELF_DIR\}/wpiutil-config.cmake)") set(NTCORE_DEP_REPLACE "include($\{SELF_DIR\}/ntcore-config.cmake)") @@ -258,6 +260,9 @@ if (WITH_GUI) add_subdirectory(wpigui) add_subdirectory(glass) add_subdirectory(outlineviewer) + if (LIBSSH_FOUND) + add_subdirectory(roborioteamnumbersetter) + endif() endif() if (WITH_WPILIB OR WITH_SIMULATION_MODULES) diff --git a/cmake/modules/FindLIBSSH.cmake b/cmake/modules/FindLIBSSH.cmake new file mode 100644 index 0000000000..1c09818770 --- /dev/null +++ b/cmake/modules/FindLIBSSH.cmake @@ -0,0 +1,116 @@ +# - Try to find LibSSH +# Once done this will define +# +# LIBSSH_FOUND - system has LibSSH +# LIBSSH_INCLUDE_DIRS - the LibSSH include directory +# LIBSSH_LIBRARIES - link these to use LibSSH +# LIBSSH_VERSION - +# +# Author Michal Vasko +# Copyright (c) 2020 CESNET, z.s.p.o. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# 3. The name of the author may not be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +include(FindPackageHandleStandardArgs) + +if(LIBSSH_LIBRARIES AND LIBSSH_INCLUDE_DIRS) + # in cache already + set(LIBSSH_FOUND TRUE) +else() + find_path(LIBSSH_INCLUDE_DIR + NAMES + libssh/libssh.h + PATHS + /usr/include + /usr/local/include + /opt/local/include + /sw/include + ${CMAKE_INCLUDE_PATH} + ${CMAKE_INSTALL_PREFIX}/include + ) + + find_library(LIBSSH_LIBRARY + NAMES + ssh.so + libssh.so + libssh.dylib + PATHS + /usr/lib + /usr/local/lib + /opt/local/lib + /sw/lib + ${CMAKE_LIBRARY_PATH} + ${CMAKE_INSTALL_PREFIX}/lib + ) + + if(LIBSSH_INCLUDE_DIR AND LIBSSH_LIBRARY) + # learn libssh version + if(EXISTS ${LIBSSH_INCLUDE_DIR}/libssh/libssh_version.h) + set(LIBSSH_HEADER_PATH ${LIBSSH_INCLUDE_DIR}/libssh/libssh_version.h) + else() + set(LIBSSH_HEADER_PATH ${LIBSSH_INCLUDE_DIR}/libssh/libssh.h) + endif() + file(STRINGS ${LIBSSH_HEADER_PATH} LIBSSH_VERSION_MAJOR + REGEX "#define[ ]+LIBSSH_VERSION_MAJOR[ ]+[0-9]+") + if(NOT LIBSSH_VERSION_MAJOR) + message(STATUS "LIBSSH_VERSION_MAJOR not found, assuming libssh is too old and cannot be used!") + set(LIBSSH_INCLUDE_DIR "LIBSSH_INCLUDE_DIR-NOTFOUND") + set(LIBSSH_LIBRARY "LIBSSH_LIBRARY-NOTFOUND") + else() + string(REGEX MATCH "[0-9]+" LIBSSH_VERSION_MAJOR ${LIBSSH_VERSION_MAJOR}) + file(STRINGS ${LIBSSH_HEADER_PATH} LIBSSH_VERSION_MINOR + REGEX "#define[ ]+LIBSSH_VERSION_MINOR[ ]+[0-9]+") + string(REGEX MATCH "[0-9]+" LIBSSH_VERSION_MINOR ${LIBSSH_VERSION_MINOR}) + file(STRINGS ${LIBSSH_HEADER_PATH} LIBSSH_VERSION_PATCH + REGEX "#define[ ]+LIBSSH_VERSION_MICRO[ ]+[0-9]+") + string(REGEX MATCH "[0-9]+" LIBSSH_VERSION_PATCH ${LIBSSH_VERSION_PATCH}) + + set(LIBSSH_VERSION ${LIBSSH_VERSION_MAJOR}.${LIBSSH_VERSION_MINOR}.${LIBSSH_VERSION_PATCH}) + + if(LIBSSH_VERSION VERSION_LESS 0.8.0) + # libssh_threads also needs to be linked for these versions + string(REPLACE "libssh.so" "libssh_threads.so" + LIBSSH_THREADS_LIBRARY + ${LIBSSH_LIBRARY} + ) + string(REPLACE "libssh.dylib" "libssh_threads.dylib" + LIBSSH_THREADS_LIBRARY + ${LIBSSH_THREADS_LIBRARY} + ) + string(REPLACE "ssh.so" "ssh_threads.so" + LIBSSH_THREADS_LIBRARY + ${LIBSSH_THREADS_LIBRARY} + ) + endif() + endif() + endif() + + set(LIBSSH_INCLUDE_DIRS ${LIBSSH_INCLUDE_DIR}) + set(LIBSSH_LIBRARIES ${LIBSSH_LIBRARY} ${LIBSSH_THREADS_LIBRARY}) + mark_as_advanced(LIBSSH_INCLUDE_DIRS LIBSSH_LIBRARIES) + + find_package_handle_standard_args(LibSSH FOUND_VAR LIBSSH_FOUND + REQUIRED_VARS LIBSSH_INCLUDE_DIRS LIBSSH_LIBRARIES + VERSION_VAR LIBSSH_VERSION) +endif() diff --git a/roborioteamnumbersetter/CMakeLists.txt b/roborioteamnumbersetter/CMakeLists.txt new file mode 100644 index 0000000000..ba8ee5680e --- /dev/null +++ b/roborioteamnumbersetter/CMakeLists.txt @@ -0,0 +1,29 @@ +project(roborioteamnumbersetter) + +include(CompileWarnings) +include(GenResources) +include(LinkMacOSGUI) + +configure_file(src/main/generate/WPILibVersion.cpp.in WPILibVersion.cpp) +GENERATE_RESOURCES(src/main/native/resources generated/main/cpp RTNS rtns rtns_resources_src) + +file(GLOB rtns_src src/main/native/cpp/*.cpp ${CMAKE_CURRENT_BINARY_DIR}/WPILibVersion.cpp) + +if (WIN32) + set(rtns_rc src/main/native/win/roborioteamnumbersetter.rc) +elseif(APPLE) + set(MACOSX_BUNDLE_ICON_FILE glass.icns) + set(APP_ICON_MACOSX src/main/native/mac/rtns.icns) + set_source_files_properties(${APP_ICON_MACOSX} PROPERTIES MACOSX_PACKAGE_LOCATION "Resources") +endif() + +add_executable(roborioteamnumbersetter ${rtns_src} ${rtns_resources_src} ${rtns_rc} ${APP_ICON_MACOSX}) +wpilib_link_macos_gui(roborioteamnumbersetter) +target_link_libraries(roborioteamnumbersetter libglass ${LIBSSH_LIBRARIES}) +target_include_directories(roborioteamnumbersetter PRIVATE ${LIBSSH_INCLUDE_DIRS}) + +if (WIN32) + set_target_properties(roborioteamnumbersetter PROPERTIES WIN32_EXECUTABLE YES) +elseif(APPLE) + set_target_properties(roborioteamnumbersetter PROPERTIES MACOSX_BUNDLE YES OUTPUT_NAME "roborioTeamNumberSetter") +endif()