Skip to content

Instantly share code, notes, and snippets.

@MightyMirko
Last active January 8, 2024 20:23
Show Gist options
  • Save MightyMirko/0de7050b4f505bf1a7c8d7a21c9233b3 to your computer and use it in GitHub Desktop.
Save MightyMirko/0de7050b4f505bf1a7c8d7a21c9233b3 to your computer and use it in GitHub Desktop.
CMakeLists.txt for FRI CMAKE and own project under root/masters
# CMakeLists.txt for KUKA's Fast Robot Interface (FRI) client library
# Set minimum required CMake version
cmake_minimum_required(VERSION 3.14)
# Set C++ standard to C++17
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17")
# Project details
project(FRIClient
VERSION 1.0.0
DESCRIPTION "KUKA's Fast Robot Interface client library."
LANGUAGES C CXX)
# Set Ninja as the generator
set(CMAKE_GENERATOR "Ninja" CACHE INTERNAL "" FORCE)
# Variable definitions
set(FRIClient_SDK_NAME "FRI-Client-SDK_Cpp")
option(BUILD_FRI_APPS "Build FRIClient example applications" OFF)
option(BUILD_MASTER "Build Master App and Lib" ON)
# Display configuration information
message(STATUS "Configuring Binary ${CMAKE_CURRENT_BINARY_DIR}")
message(STATUS "Configuring Source ${CMAKE_CURRENT_SOURCE_DIR}")
# Extract the FRIClient from the zip file
file(ARCHIVE_EXTRACT
INPUT ${CMAKE_CURRENT_SOURCE_DIR}/${FRIClient_SDK_NAME}.zip
DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/${FRIClient_SDK_NAME})
# Find library versions (nanopb and FRIClient)
file(GLOB NANOPB_HEADER_PATH ${CMAKE_CURRENT_BINARY_DIR}/${FRIClient_SDK_NAME}/src/nanopb-*/pb.h)
file(READ ${NANOPB_HEADER_PATH} NANOPB_HEADER)
string(REGEX MATCH "NANOPB_VERSION nanopb-([0-9]*).([0-9]*).([0-9]*)" _ ${NANOPB_HEADER})
set(NANOPB_VERSION_MAJOR ${CMAKE_MATCH_1})
set(NANOPB_VERSION_MINOR ${CMAKE_MATCH_2})
set(NANOPB_VERSION_PATCH ${CMAKE_MATCH_3})
set(NANOPB_VERSION ${NANOPB_VERSION_MAJOR}.${NANOPB_VERSION_MINOR}.${NANOPB_VERSION_PATCH})
message("Found nanopb of version: " ${NANOPB_VERSION})
file(READ ${CMAKE_CURRENT_BINARY_DIR}/${FRIClient_SDK_NAME}/include/friClientIf.h FRI_CLIENT_IF_HEADER)
string(REGEX MATCH "\\version {([0-9]*).([0-9]*)}" _ ${FRI_CLIENT_IF_HEADER})
set(FRICLIENT_VERSION_MAJOR ${CMAKE_MATCH_1})
set(FRICLIENT_VERSION_MINOR ${CMAKE_MATCH_2})
set(FRICLIENT_VERSION ${FRICLIENT_VERSION_MAJOR}.${FRICLIENT_VERSION_MINOR})
if (NOT FRICLIENT_VERSION STREQUAL "1.17")
message(FATAL_ERROR "Expected FRIClient version 1.17, found: " ${FRICLIENT_VERSION})
endif()
message("Found FRIClient of version: " ${FRICLIENT_VERSION})
# Define FRIClient library target
message(STATUS "Configuring FRIClient version ${FRICLIENT_VERSION}")
file(GLOB_RECURSE NANOPB_SOURCES RELATIVE ${CMAKE_CURRENT_BINARY_DIR}
${CMAKE_CURRENT_BINARY_DIR}/${FRIClient_SDK_NAME}/src/nanopb-${NANOPB_VERSION}/*.c)
file(GLOB_RECURSE FRI_SOURCES RELATIVE ${CMAKE_CURRENT_BINARY_DIR}
${CMAKE_CURRENT_BINARY_DIR}/${FRIClient_SDK_NAME}/src/base/*.cpp
${CMAKE_CURRENT_BINARY_DIR}/${FRIClient_SDK_NAME}/src/client_lbr/*.cpp
${CMAKE_CURRENT_BINARY_DIR}/${FRIClient_SDK_NAME}/src/client_trafo/*.cpp
${CMAKE_CURRENT_BINARY_DIR}/${FRIClient_SDK_NAME}/src/connection/*.cpp
${CMAKE_CURRENT_BINARY_DIR}/${FRIClient_SDK_NAME}/src/protobuf/*.cpp
${CMAKE_CURRENT_BINARY_DIR}/${FRIClient_SDK_NAME}/src/protobuf/*.c
${CMAKE_CURRENT_BINARY_DIR}/${FRIClient_SDK_NAME}/src/protobuf_gen/*.pb.c)
add_library(FRIClient SHARED
${FRI_SOURCES}
${NANOPB_SOURCES})
add_library(FRIClient::FRIClient ALIAS FRIClient) # Alias for anyone adding this as a submodule
target_include_directories(FRIClient
PUBLIC
$<INSTALL_INTERFACE:include>
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/${FRIClient_SDK_NAME}/include>
PRIVATE
${CMAKE_CURRENT_BINARY_DIR}/${FRIClient_SDK_NAME}/src/base
${CMAKE_CURRENT_BINARY_DIR}/${FRIClient_SDK_NAME}/src/nanopb-${NANOPB_VERSION}
${CMAKE_CURRENT_BINARY_DIR}/${FRIClient_SDK_NAME}/src/protobuf_gen
${CMAKE_CURRENT_BINARY_DIR}/${FRIClient_SDK_NAME}/src/protobuf)
if (MSVC)
target_compile_options(FRIClient
PRIVATE
-DPB_SYSTEM_HEADER="pb_syshdr_win.h"
-DPB_FIELD_16BIT
-DWIN32
-DHAVE_STDINT_H
-DHAVE_STDBOOL_H)
else ()
target_compile_options(FRIClient
PRIVATE
-Wall
-O2
-DHAVE_SOCKLEN_T
-DPB_SYSTEM_HEADER="pb_syshdr.h"
-DPB_FIELD_16BIT
-DHAVE_STDINT_H
-DHAVE_STDDEF_H
-DHAVE_STDBOOL_H
-DHAVE_STDLIB_H
-DHAVE_STRING_H)
endif ()
# Install targets
include(CMakePackageConfigHelpers)
write_basic_package_version_file(
"${CMAKE_CURRENT_BINARY_DIR}/FRIClientConfigVersion.cmake"
VERSION ${FRICLIENT_VERSION}
COMPATIBILITY SameMajorVersion)
install(TARGETS FRIClient
EXPORT FRIClientTargets
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib
INCLUDES DESTINATION include)
install(
DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${FRIClient_SDK_NAME}/include/
DESTINATION include)
install(EXPORT FRIClientTargets
FILE FRIClientConfig.cmake
NAMESPACE FRIClient::
DESTINATION lib/cmake/FRIClient)
install(FILES ${CMAKE_BINARY_DIR}/FRIClientConfigVersion.cmake
DESTINATION lib/cmake/FRIClient)
# Build examples
if (BUILD_FRI_APPS)
function(build_fri_example NAME)
file(GLOB_RECURSE ${NAME}_SOURCES RELATIVE ${CMAKE_CURRENT_BINARY_DIR}
${CMAKE_CURRENT_BINARY_DIR}/${FRIClient_SDK_NAME}/example/${NAME}/*.cpp)
add_executable(${NAME}App
${${NAME}_SOURCES})
target_include_directories(${NAME}App
PRIVATE
${CMAKE_CURRENT_BINARY_DIR}/${FRIClient_SDK_NAME}/example/${NAME})
target_link_libraries(${NAME}App
PRIVATE
FRIClient)
endfunction()
build_fri_example(IOAccess)
build_fri_example(LBRJointSineOverlay)
build_fri_example(LBRTorqueSineOverlay)
build_fri_example(LBRWrenchSineOverlay)
build_fri_example(SimulatedTransformationProvider)
build_fri_example(TransformationProvider)
endif (BUILD_FRI_APPS)
# Build masters
if (BUILD
# CMakeLists.txt in the "masters" directory
# Set the minimum required CMake version
cmake_minimum_required(VERSION 3.14)
# Configure the C++ standard to C++17
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# Display configuration information
message(STATUS "Configuring Binary ${CMAKE_CURRENT_BINARY_DIR}")
message(STATUS "Configuring Source ${CMAKE_CURRENT_SOURCE_DIR}")
# Find RL components (MDL, KIN, MATH) and Boost libraries
find_package(RL COMPONENTS MDL KIN MATH REQUIRED)
find_package(Boost REQUIRED COMPONENTS iostreams)
find_package(PythonLibs REQUIRED)
find_package(Doxygen REQUIRED dot OPTIONAL_COMPONENTS mscgen dia)
# Include Python headers
include_directories(${PYTHON_INCLUDE_DIRS})
message(STATUS "Configuring Project Binary ${PROJECT_SOURCE_DIR}")
# Generate Doxygen documentation if Doxygen is found
if (DOXYGEN_FOUND)
doxygen_add_docs(doxygen_m
${PROJECT_SOURCE_DIR}
CONFIG_FILE ${CMAKE_CURRENT_SOURCE_DIR}/doc/Doxyfile.in
COMMENT "Generating API documentation with Doxygen"
)
else ()
message(WARNING "Doxygen not found, documentation will not be generated.")
endif ()
# List all source and header files
file(GLOB MASTERS_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
file(GLOB_RECURSE MASTERS_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/include/*.h)
# Group source files in CMakeLists.txt
source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${MASTERS_SOURCES} ${MASTERS_HEADERS})
# Create the Masters library
add_library(mastersLibrary ${MASTERS_SOURCES} ${MASTERS_HEADERS})
# Add include directories
target_include_directories(mastersLibrary
PUBLIC
${CMAKE_CURRENT_BINARY_DIR}/../${FRIClient_SDK_NAME}/include
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
${PYTHON_HEADERS}
)
# Link against RL, Python, FRIClient, and other required libraries
target_link_libraries(mastersLibrary
PUBLIC
${RL_LIBRARIES}
PRIVATE
${PYTHON_LIBRARIES}
FRIClient
Boost::iostreams
# Add more libraries if necessary
)
# Create the Masters example program
add_executable(mastersApp ${MASTERS_SOURCES} ${MASTERS_HEADERS})
# Link against the created Masters library
target_link_libraries(mastersApp PRIVATE mastersLibrary)
# Add the 'tests' subdirectory for testing
add_subdirectory(tests)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment