cmake_minimum_required(VERSION 3.0.2)

# 目标平台：x86（本机/仿真）或 arm（SBC，aarch64）
set(BUILD_PLATFORM "x86" CACHE STRING "Target platform (x86 or arm)")
if(BUILD_PLATFORM STREQUAL "arm" AND NOT CMAKE_CXX_COMPILER)
  # 交叉编译需要在 project() 之前指定编译器；更推荐在 SBC 上原生编译，或传 CMAKE_TOOLCHAIN_FILE
  set(CMAKE_C_COMPILER "aarch64-linux-gnu-gcc")
  set(CMAKE_CXX_COMPILER "aarch64-linux-gnu-g++")
endif()

project(invicta_deploy)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

if(NOT CMAKE_BUILD_TYPE)
  set(CMAKE_BUILD_TYPE Release)
endif()

add_definitions(-w)
add_compile_options(-fPIC)

find_package(catkin REQUIRED COMPONENTS
  roscpp
  roslib
  sensor_msgs
  invicta_msgs
)

catkin_package(
  CATKIN_DEPENDS roscpp roslib sensor_msgs invicta_msgs
)

set(THIRD_PARTY ${CMAKE_CURRENT_SOURCE_DIR}/third_party)
set(ORT_ROOT ${THIRD_PARTY}/onnxruntime/${BUILD_PLATFORM})

include_directories(
  include/types
  include/utils
  interface
  interface/robot
  interface/robot/hardware
  interface/user_command
  state_machine
  state_machine/parameters
  run_policy
  ${THIRD_PARTY}/eigen
  ${ORT_ROOT}/include
  ${catkin_INCLUDE_DIRS}
)

file(GLOB_RECURSE STATE_MACHINE_SRC "state_machine/*.cpp")

add_executable(invicta_deploy
  main.cpp
  ${STATE_MACHINE_SRC}
)

add_library(onnxruntime SHARED IMPORTED)
set_target_properties(onnxruntime PROPERTIES
  IMPORTED_LOCATION "${ORT_ROOT}/lib/libonnxruntime.so"
  INTERFACE_INCLUDE_DIRECTORIES "${ORT_ROOT}/include"
)

target_link_libraries(invicta_deploy
  ${catkin_LIBRARIES}
  onnxruntime
  -lpthread
  -lm
  -lrt
  -ldl
  -lstdc++
)

# onnxruntime 是预编译动态库：构建时用源码树里的绝对路径，安装后靠同目录下的 $ORIGIN
set_target_properties(invicta_deploy PROPERTIES
  BUILD_RPATH "${ORT_ROOT}/lib"
  INSTALL_RPATH "\$ORIGIN;${ORT_ROOT}/lib"
)

install(TARGETS invicta_deploy
  RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)
install(DIRECTORY ${ORT_ROOT}/lib/
  DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
  FILES_MATCHING PATTERN "libonnxruntime.so*"
)
install(DIRECTORY policy
  DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
)
install(DIRECTORY config launch
  DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
)
