cmake_minimum_required(VERSION 3.22.0) project(cmvr_es) include(CTest) # 设置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) # Install to /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") # Some vendor SDK directories contain an obsolete private libstdc++.so.6. They # are still needed in the build RUNPATH for their own shared objects, but must # not shadow the C++ runtime selected by the active compiler. execute_process( COMMAND ${CMAKE_CXX_COMPILER} -print-file-name=libstdc++.so.6 OUTPUT_VARIABLE CMVR_COMPILER_LIBSTDCXX OUTPUT_STRIP_TRAILING_WHITESPACE ) if(IS_ABSOLUTE "${CMVR_COMPILER_LIBSTDCXX}" AND EXISTS "${CMVR_COMPILER_LIBSTDCXX}") # Do not put the whole system library directory first: that can mix the # system FFmpeg with the repository's bundled FFmpeg. A one-library shim # fixes only the vendor libstdc++ collision. set(CMVR_COMPILER_RUNTIME_DIR "${CMAKE_BINARY_DIR}/cmvr_compiler_runtime") file(MAKE_DIRECTORY "${CMVR_COMPILER_RUNTIME_DIR}") file(CREATE_LINK "${CMVR_COMPILER_LIBSTDCXX}" "${CMVR_COMPILER_RUNTIME_DIR}/libstdc++.so.6" SYMBOLIC COPY_ON_ERROR RESULT CMVR_COMPILER_RUNTIME_LINK_RESULT) if(CMVR_COMPILER_RUNTIME_LINK_RESULT STREQUAL "0") list(PREPEND CMAKE_BUILD_RPATH "${CMVR_COMPILER_RUNTIME_DIR}") else() message(WARNING "Could not prepare compiler libstdc++ build shim: " "${CMVR_COMPILER_RUNTIME_LINK_RESULT}") endif() endif() # Use RUNPATH (new dtags) generally preferable 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(CMVR_ARCH "" CACHE STRING "Dependency architecture directory (x86 or arm)") if(NOT CMVR_ARCH) string(TOLOWER "${CMAKE_SYSTEM_PROCESSOR}" _cmvr_system_processor) if(_cmvr_system_processor MATCHES "^(aarch64|arm64|arm)") set(CMVR_ARCH "arm") else() set(CMVR_ARCH "x86") endif() endif() set_property(CACHE CMVR_ARCH PROPERTY STRINGS x86 arm) if(NOT CMVR_ARCH STREQUAL "x86" AND NOT CMVR_ARCH STREQUAL "arm") message(FATAL_ERROR "CMVR_ARCH must be either 'x86' or 'arm', got: ${CMVR_ARCH}") endif() set(ARCH "${CMVR_ARCH}") setup_external_libs(${ARCH}) # 在调用 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) option(CMVR_ENABLE_MSQUIC_BACKEND "Enable the MsQuic backend for the QUIC edge service when available" ON) set(CMVR_HAS_MSQUIC OFF) if(CMVR_ENABLE_MSQUIC_BACKEND) find_package(MsQuic QUIET) if(MsQuic_FOUND) set(CMVR_HAS_MSQUIC ON) message(STATUS "MsQuic found: ${MsQuic_LIBRARY}") else() message(STATUS "MsQuic not found; building QUIC edge in unavailable/stub mode") endif() endif() ############################################################ # 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=$" IMPORT_DIRS ${PROTO_IMPORT_DIR} PROTOC_OUT_DIR ${PROTO_BINARY_DIR} USAGE_REQUIREMENT PRIVATE ) # 2) 把 OBJECT 打包成一个“唯一的”共享库(关键) add_library(proto SHARED $) 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::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::ti5motor 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)