161 lines
5.7 KiB
CMake
161 lines
5.7 KiB
CMake
cmake_minimum_required(VERSION 3.22.0)
|
||
|
||
project(cmvr_es)
|
||
|
||
# 设置C++标准
|
||
set(CMAKE_CXX_STANDARD 17)
|
||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||
#set(CMAKE_CXX_FLAGS -pthread)
|
||
#set(CMAKE_CXX_STANDARD_REQUIRED True)
|
||
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
|
||
|
||
# Preserve the project's production-build behavior: tests are opt-in via
|
||
# -DBUILD_TESTING=ON, while still registering them with CTest when requested.
|
||
option(BUILD_TESTING "Build the test targets" OFF)
|
||
include(CTest)
|
||
|
||
if(BUILD_TESTING AND UNIX AND NOT APPLE)
|
||
# Test executables can still inherit the AUBO imported target's build-tree
|
||
# RUNPATH. Keep the active toolchain runtime ahead of that vendor path.
|
||
execute_process(
|
||
COMMAND ${CMAKE_CXX_COMPILER} -print-file-name=libstdc++.so.6
|
||
OUTPUT_VARIABLE CMVR_TEST_SYSTEM_LIBSTDCXX
|
||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||
)
|
||
if(EXISTS "${CMVR_TEST_SYSTEM_LIBSTDCXX}")
|
||
get_filename_component(
|
||
CMVR_TEST_SYSTEM_LIBSTDCXX
|
||
"${CMVR_TEST_SYSTEM_LIBSTDCXX}"
|
||
REALPATH
|
||
)
|
||
else()
|
||
unset(CMVR_TEST_SYSTEM_LIBSTDCXX)
|
||
endif()
|
||
endif()
|
||
|
||
# Install to <source>/output
|
||
set(CMAKE_INSTALL_PREFIX "${CMAKE_SOURCE_DIR}/output" CACHE PATH "" FORCE)
|
||
|
||
# Make build-tree binaries runnable without LD_LIBRARY_PATH
|
||
set(CMAKE_BUILD_RPATH "\$ORIGIN:\$ORIGIN/../lib")
|
||
set(CMAKE_INSTALL_RPATH "\$ORIGIN:\$ORIGIN/../lib")
|
||
|
||
set(CMAKE_BUILD_WITH_INSTALL_RPATH OFF)
|
||
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
|
||
|
||
###########################################################
|
||
## DEPENDENCIES
|
||
#############################################################
|
||
list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
|
||
include(FindExternalLib)
|
||
set(ARCH "x86")
|
||
setup_external_libs(${ARCH})
|
||
if(BUILD_TESTING AND CMVR_EXTERNAL_LIBRARY_DIRS)
|
||
list(JOIN CMVR_EXTERNAL_LIBRARY_DIRS ":" CMVR_TEST_EXTERNAL_LIBRARY_PATH)
|
||
endif()
|
||
# 在调用 setup_external_libs 之后
|
||
message(STATUS "CMAKE_EXE_LINKER_FLAGS: ${CMAKE_EXE_LINKER_FLAGS}")
|
||
message(STATUS "CMAKE_SHARED_LINKER_FLAGS: ${CMAKE_SHARED_LINKER_FLAGS}")
|
||
find_package(protobuf REQUIRED)
|
||
find_package(gRPC REQUIRED)
|
||
|
||
############################################################
|
||
# PROTO , 遇到proto 的生成问题,现在build 目录执行 cmake --install . --verbose ,然后编译即可
|
||
############################################################
|
||
|
||
set(PROTO_IMPORT_DIR ${PROJECT_SOURCE_DIR}/protos)
|
||
set(PROTO_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/_protobuf)
|
||
file(MAKE_DIRECTORY ${PROTO_BINARY_DIR})
|
||
file(GLOB_RECURSE PROTO_FILES ${PROTO_IMPORT_DIR}/*.proto)
|
||
|
||
|
||
set(Protobuf_PROTOC_EXECUTABLE "${CMAKE_INSTALL_PREFIX}/bin/protoc" CACHE FILEPATH "" FORCE)
|
||
set_target_properties(gRPC::grpc_cpp_plugin PROPERTIES
|
||
IMPORTED_LOCATION "${CMAKE_INSTALL_PREFIX}/bin/grpc_cpp_plugin"
|
||
IMPORTED_LOCATION_RELEASE "${CMAKE_INSTALL_PREFIX}/bin/grpc_cpp_plugin"
|
||
)
|
||
|
||
# 1) 先做 OBJECT:只负责生成/编译 pb.cc
|
||
add_library(proto-objects OBJECT)
|
||
target_sources(proto-objects PRIVATE ${PROTO_FILES})
|
||
set_target_properties(proto-objects PROPERTIES POSITION_INDEPENDENT_CODE ON)
|
||
|
||
protobuf_generate(
|
||
TARGET proto-objects
|
||
IMPORT_DIRS ${PROTO_IMPORT_DIR}
|
||
PROTOC_OUT_DIR ${PROTO_BINARY_DIR}
|
||
USAGE_REQUIREMENT PRIVATE
|
||
)
|
||
protobuf_generate(
|
||
TARGET proto-objects
|
||
LANGUAGE grpc
|
||
GENERATE_EXTENSIONS .grpc.pb.h .grpc.pb.cc
|
||
PLUGIN "protoc-gen-grpc=$<TARGET_FILE:gRPC::grpc_cpp_plugin>"
|
||
IMPORT_DIRS ${PROTO_IMPORT_DIR}
|
||
PROTOC_OUT_DIR ${PROTO_BINARY_DIR}
|
||
USAGE_REQUIREMENT PRIVATE
|
||
)
|
||
|
||
# 2) 把 OBJECT 打包成一个“唯一的”共享库(关键)
|
||
add_library(proto SHARED $<TARGET_OBJECTS:proto-objects>)
|
||
target_include_directories(proto PUBLIC ${PROTO_BINARY_DIR} ${PROTO_IMPORT_DIR} ${Protobuf_INCLUDE_DIRS})
|
||
target_link_libraries(proto PUBLIC protobuf::libprotobuf gRPC::grpc++ gRPC::grpc++_reflection)
|
||
add_library(cmvr_es::proto ALIAS proto)
|
||
#install(TARGETS proto RUNTIME DESTINATION bin)
|
||
install(TARGETS proto LIBRARY DESTINATION lib)
|
||
############################################################
|
||
# include
|
||
############################################################
|
||
include_directories(
|
||
/usr/local/include/
|
||
${PROTO_BINARY_DIR}
|
||
${PROJECT_SOURCE_DIR}/include
|
||
${PROJECT_SOURCE_DIR}/cmvr-es/devices
|
||
${PROJECT_SOURCE_DIR}/cmvr-es/utils
|
||
${PROJECT_SOURCE_DIR}/cmvr-es
|
||
${PROJECT_SOURCE_DIR}/dependency/${ARCH}/third_party
|
||
${PROJECT_SOURCE_DIR}/dependency/${ARCH}/third_party/osqp/v0.6.3/include/osqp
|
||
)
|
||
|
||
############################################################
|
||
# subdirectory
|
||
############################################################
|
||
|
||
add_subdirectory(cmvr-es)
|
||
|
||
############################################################
|
||
# executables
|
||
############################################################
|
||
|
||
add_executable(cmvr_es cmvr-es/main.cpp)
|
||
target_include_directories(cmvr_es PRIVATE ${GLOG_INCLUDE_DIRS})
|
||
target_link_libraries(cmvr_es PRIVATE
|
||
cmvr_es::runtime
|
||
cmvr_es::proto
|
||
cmvr_es::logging
|
||
cmvr_es::quic_edge_task
|
||
${GLOG_LIBRARIES}
|
||
jsoncpp
|
||
cmvr_es::service
|
||
cmvr_es::hardware
|
||
cmvr_es::device::canbus
|
||
cmvr_es::device::ti5_canopen_motor_driver
|
||
cmvr_es::algorithms::controller
|
||
cmvr_es::ik_solver
|
||
cmvr_es::base_motion
|
||
cmvr_es::common
|
||
cmvr_es::task
|
||
cmvr_es::task_manager
|
||
ccd
|
||
fcl
|
||
)
|
||
|
||
install(TARGETS cmvr_es RUNTIME DESTINATION bin)
|
||
install(CODE [[
|
||
file(REMOVE_RECURSE
|
||
"${CMAKE_INSTALL_PREFIX}/bin/config"
|
||
"${CMAKE_INSTALL_PREFIX}/bin/model")
|
||
]])
|
||
install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/cmvr-es/config DESTINATION bin)
|
||
install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/model DESTINATION bin)
|