project(MsgUtils DESCRIPTION "Message Utilities Library" LANGUAGES CXX ) set(CMAKE_AUTOMOC ON) if(POLICY CMP0167) cmake_policy(SET CMP0167 NEW) endif() find_package(Protobuf REQUIRED) find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core) find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core Network SerialBus) find_package(Comms HINTS ${CMAKE_CURRENT_SOURCE_DIR}/../Comms REQUIRED) set(MSGUTILS_SCRIPTS_DIR ${CMAKE_SOURCE_DIR}/scripts/MsgUtils) # The top-level CMakeLists includes cmake/PythonVenv.cmake, which creates the # project-wide venv (${CMAKE_BINARY_DIR}/.venv) and sets ${PROJECT_PYTHON}. # Installing msgutils editable lets the generators below `import msgutils`. include(cmake/MsgUtils.cmake) register_python_package(${MSGUTILS_SCRIPTS_DIR}) # set(DENALI_MSG_CSV ${CMAKE_CURRENT_SOURCE_DIR}/../../data/FW_Messages_List.csv) # set(LEAHI_MSG_CSV ${CMAKE_CURRENT_SOURCE_DIR}/../../data/Leahi_Staging_FW_Messages_List.csv) set(LEAHI_MSG_CONF ${CMAKE_CURRENT_SOURCE_DIR}/../../data/LeahiUnhandled.conf) set(INCLUDES # include/DenaliLogUtils.h # include/encryption.h # include/MessageGlobals.h # include/MessageInterpreter.h # include/qrcodegen.h ) set(SRCS # src/DenaliLogUtils.cpp # src/encryption.cpp # src/MessageInterpreter.cpp # src/qrcodegen.cpp ) set(GENERATED_INCLUDES # include/DenaliMsgDefs.h # include/DenaliMsgDefs.pb.h # include/DenaliMsgProtoUtils.h include/LeahiMsgDefs.h include/LeahiMsgDefs.pb.h include/LeahiMsgProtoUtils.h ) set(GENERATED_SRCS # src/DenaliMsgDefs.cpp # src/DenaliMsgDefs.pb.cc # src/DenaliMsgProtoUtils.cpp src/LeahiMsgDefs.cpp src/LeahiMsgDefs.pb.cc src/LeahiMsgProtoUtils.cpp ) # generate_msg_defs_cpp(DENALI_MSG_CSV Denali ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/src denali) # generate_protobuf(DENALI_MSG_CSV DenaliMsgDefs.proto ${CMAKE_CURRENT_BINARY_DIR}/data denali) # generate_protobuf_cpp(DenaliMsgDefs.proto ${CMAKE_CURRENT_BINARY_DIR}/data ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/src) # generate_msg_defs_cpp_csvs(LEAHI_MSG_CSV Leahi ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/src leahi) # generate_protobuf_csvs(LEAHI_MSG_CSV LeahiMsgDefs.proto ${CMAKE_CURRENT_BINARY_DIR}/data leahi) generate_msg_defs_cpp(LEAHI_MSG_CONF Leahi ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/src leahi) generate_protobuf(LEAHI_MSG_CONF LeahiMsgDefs.proto ${CMAKE_CURRENT_BINARY_DIR}/data leahi) generate_protobuf_cpp(LeahiMsgDefs.proto ${CMAKE_CURRENT_BINARY_DIR}/data ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/src) add_library(${PROJECT_NAME} SHARED) target_sources(${PROJECT_NAME} PRIVATE ${INCLUDES} ${GENERATED_INCLUDES} ${SRCS} ${GENERATED_SRCS}) set_target_properties(${PROJECT_NAME} PROPERTIES PUBLIC_HEADER "${INCLUDES}" ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/lib" LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/lib" ADDITIONAL_CLEAN_FILES " \ ${CMAKE_CURRENT_SOURCE_DIR}/bin; \ ${CMAKE_CURRENT_SOURCE_DIR}/lib; \ ${CMAKE_CURRENT_SOURCE_DIR}/cmake; \ ${GENERATED_INCLUDES}; \ ${GENERATED_SRCS} \ " ) target_link_libraries(${PROJECT_NAME} PUBLIC Comms ${Protobuf_LIBRARIES} Qt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::Network Qt${QT_VERSION_MAJOR}::SerialBus ) target_include_directories(${PROJECT_NAME} PUBLIC $ ${Protobuf_INCLUDE_DIR} ) file(MAKE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/src) install( TARGETS ${PROJECT_NAME} EXPORT ${PROJECT_NAME}Targets PUBLIC_HEADER DESTINATION "${CMAKE_CURRENT_SOURCE_DIR}/include" RUNTIME DESTINATION "${CMAKE_CURRENT_SOURCE_DIR}/bin" ARCHIVE DESTINATION "${CMAKE_CURRENT_SOURCE_DIR}/lib" LIBRARY DESTINATION "${CMAKE_CURRENT_SOURCE_DIR}/lib" COMPONENT dev ) # Export the targets so a sibling component can find this one without installing export( TARGETS ${PROJECT_NAME} FILE "${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/${PROJECT_NAME}Targets.cmake" ) file(RELATIVE_PATH REL_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/cmake" "${CMAKE_CURRENT_SOURCE_DIR}/include") set(CONF_INCLUDE_DIRS "\${MSGUTILS_CMAKE_DIR}/${REL_INCLUDE_DIR}") # Config files find_package() consumes, written straight to the source cmake/ dir configure_file(${PROJECT_NAME}Config.cmake.in "${CMAKE_CURRENT_SOURCE_DIR}/cmake/${PROJECT_NAME}Config.cmake" @ONLY) configure_file(${PROJECT_NAME}ConfigVersion.cmake.in "${CMAKE_CURRENT_SOURCE_DIR}/cmake/${PROJECT_NAME}ConfigVersion.cmake" @ONLY) # Same files staged in the binary dir, for the install() below to copy from configure_file(${PROJECT_NAME}Config.cmake.in "${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/${PROJECT_NAME}Config.cmake" @ONLY) configure_file( ${PROJECT_NAME}ConfigVersion.cmake.in "${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/${PROJECT_NAME}ConfigVersion.cmake" @ONLY) # Install the staged config files and the export set. Note the DESTINATIONs are # absolute paths into the source tree, so `install` writes back to cmake/ here # rather than to CMAKE_INSTALL_PREFIX. install( FILES "${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/${PROJECT_NAME}Config.cmake" "${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/${PROJECT_NAME}ConfigVersion.cmake" DESTINATION "${CMAKE_CURRENT_SOURCE_DIR}/cmake" ) install(EXPORT ${PROJECT_NAME}Targets DESTINATION "${CMAKE_CURRENT_SOURCE_DIR}/cmake")