cmake_minimum_required(VERSION 3.16)
project(roboapi_ur_loop CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(Threads REQUIRED)
option(ROBOAPI_BUILD_CHECKS "Build the control-law checks" ON)
enable_testing()
if(NOT URCL_SOURCE_DIR OR NOT RUCKIG_SOURCE_DIR)
  message(FATAL_ERROR "Provide the locked URCL and Ruckig source directories")
endif()
set(BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)
set(BUILD_TESTS OFF CACHE BOOL "" FORCE)
set(BUILD_PYTHON_MODULE OFF CACHE BOOL "" FORCE)
set(BUILD_CLOUD_CLIENT OFF CACHE BOOL "" FORCE)
set(BUILD_SHARED_LIBS OFF CACHE BOOL "" FORCE)
add_subdirectory(${RUCKIG_SOURCE_DIR} ${CMAKE_BINARY_DIR}/ruckig EXCLUDE_FROM_ALL)
add_subdirectory(${URCL_SOURCE_DIR} ${CMAKE_BINARY_DIR}/urcl EXCLUDE_FROM_ALL)
add_executable(roboapi-ur-loop worker.cpp src/control_loop.cpp src/robot_io_urcl.cpp)
target_include_directories(roboapi-ur-loop PRIVATE include)
target_compile_options(roboapi-ur-loop PRIVATE -O2 -Wall -Wextra)
target_link_libraries(roboapi-ur-loop Threads::Threads ruckig::ruckig ur_client_library::urcl)
install(TARGETS roboapi-ur-loop DESTINATION bin)
install(FILES ${URCL_SOURCE_DIR}/resources/external_control.urscript DESTINATION share/roboapi-ur-loop)
if(ROBOAPI_BUILD_CHECKS)
  foreach(check cartesian_speedl streaming_pose velocity_governor)
    add_executable(check_${check} tests/${check}_unit.cpp)
    target_include_directories(check_${check} PRIVATE include)
    target_compile_options(check_${check} PRIVATE -UNDEBUG -Wall -Wextra)
    target_link_libraries(check_${check} ruckig::ruckig)
    add_test(NAME ${check} COMMAND check_${check})
  endforeach()
  add_executable(check_control_modes tests/control_modes_unit.cpp src/control_loop.cpp)
  target_include_directories(check_control_modes PRIVATE include)
  target_compile_options(check_control_modes PRIVATE -UNDEBUG -Wall -Wextra)
  target_link_libraries(check_control_modes Threads::Threads ruckig::ruckig)
  add_test(NAME control_modes COMMAND check_control_modes)
endif()
