diff --git a/CMakeLists.txt b/CMakeLists.txt index 74fe6fb..9ed4df8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,31 +3,27 @@ # Author: Dmitry Ponomarev cmake_minimum_required(VERSION 3.15.3) -set(DRONECAN_LIB_DIR ${CMAKE_CURRENT_LIST_DIR}) +project(DronecanApp VERSION 0.9.0) set(SUPPORTED_PLATFORMS "bxcan;fdcan;socketcan") if(NOT CAN_PLATFORM IN_LIST SUPPORTED_PLATFORMS) message(SEND_ERROR "CAN_PLATFORM is not specified or unsupported! Options: bxcan, fdcan, socketcan.") endif() -include(${CMAKE_CURRENT_LIST_DIR}/platform_specific/${CAN_PLATFORM}/config.cmake) +include(platform_specific/${CAN_PLATFORM}/config.cmake) +include(cmake/AddLibparams.cmake) -if(NOT DEFINED LIBPARAMS_PATH) - message(SEND_ERROR "LIBPARAMS_PATH is not specified!") -endif() -include(${LIBPARAMS_PATH}/CMakeLists.txt) - -set(DRONECAN_SOURCES - ${DRONECAN_PLATFORM_SOURCES} - ${DRONECAN_LIB_DIR}/Libs/libcanard_v0/canard.c - ${DRONECAN_LIB_DIR}/src/dronecan.c - ${DRONECAN_LIB_DIR}/src/weak.c - ${libparamsSrc} +add_library(${PROJECT_NAME} STATIC + ${DRONECAN_PLATFORM_SOURCES} + Libs/libcanard_v0/canard.c + src/dronecan.c + src/weak.c ) - -set(DRONECAN_HEADERS - ${DRONECAN_LIB_DIR}/Libs - ${DRONECAN_LIB_DIR}/include/application - ${DRONECAN_LIB_DIR}/include/serialization - ${libparamsHeaders} +target_include_directories(${PROJECT_NAME} PUBLIC + Libs + include/application + include/serialization ) + +check_libparams_version(90000) # 0.9.0 +target_link_libraries(${PROJECT_NAME} libparams) diff --git a/Makefile b/Makefile index a7732cf..90daf87 100644 --- a/Makefile +++ b/Makefile @@ -4,14 +4,14 @@ ROOT_DIR:=$(shell dirname $(realpath $(firstword $(MAKEFILE_LIST)))) BUILD_DIR:=$(ROOT_DIR)/build -BUILD_EXAMPLES_DIR:=$(BUILD_DIR)/src/examples -LIBPARAMS_DIR:=${BUILD_DIR}/external/libparams +BUILD_UBUNTU_DIR:=$(BUILD_DIR)/ubuntu +LIBPARAMS_SRC_DIR:=${BUILD_DIR}/external/libparams define build_and_run_sitl $(info Build example $(1)...) - mkdir -p $(BUILD_EXAMPLES_DIR)/$(1) - cd $(BUILD_EXAMPLES_DIR)/$(1) && cmake $(ROOT_DIR)/examples/$(1) && make -s - $(BUILD_EXAMPLES_DIR)/$(1)/application + mkdir -p $(BUILD_UBUNTU_DIR) + cd $(BUILD_UBUNTU_DIR) && cmake $(ROOT_DIR)/examples/$(1) && make -s + $(BUILD_UBUNTU_DIR)/ubuntu_application endef ubuntu: clone_dependencies @@ -19,7 +19,7 @@ ubuntu: clone_dependencies clone_dependencies: mkdir -p build - if [ ! -d "${LIBPARAMS_DIR}" ]; then git clone --depth 1 --branch v0.8.4 https://github.com/PonomarevDA/libparams.git ${LIBPARAMS_DIR}; fi + if [ ! -d "${LIBPARAMS_SRC_DIR}" ]; then git clone --depth 1 --branch pr-refactor-cmake https://github.com/PonomarevDA/libparams.git ${LIBPARAMS_SRC_DIR}; fi clean: rm -rf build/examples/ diff --git a/README.md b/README.md index f9ac8dc..abde25d 100644 --- a/README.md +++ b/README.md @@ -22,10 +22,10 @@ The following auxilliary features should be provided as well: - [x] circuit status - [x] fuel tank - [x] esc -- [ ] ice +- [x] ice - [x] indication - [x] power -- [ ] rangefinder +- [x] rangefinder - [ ] gnss - [ ] mag - [ ] etc @@ -49,37 +49,34 @@ The source code is divided into a few folders: Notes: -- It depends on libparams v0.8.4 library. +- It depends on libparams v0.9.0 library. - It is not thread safe. ## How to integrate the library into a project -Add the following lines into CMakeLists.txt of your project: +It is expected to build a static library from source code into your local build directory. -```cmake -# 1. Specify the CAN_PLATFORM. Options: bxcan, fdcan or socketcan. -set(CAN_PLATFORM socketcan) +The most important steps are: -# 2. Specify path to libparams and platform. Options: stm32f103, stm32g0b1, ubuntu. -set(LIBPARAMS_PATH ../../build/libparams) -set(LIBPARAMS_PLATFORM ubuntu) +```cmake +# 1. Build the only dependency - libparams. Specify a desired LIBPARAMS_PLATFORM. +set(LIBPARAMS_PLATFORM ubuntu) +add_subdirectory(${LIBPARAMS_PATH} ${BUILD_UBUNTU_DIR}/libparams) -# 3. Include the CMakeLists.txt -include(../../CMakeLists.txt) +# 2. Build libDronecanApp itself. Specify a desired plaform with CAN_PLATFORM. +set(CAN_PLATFORM socketcan) +add_subdirectory(${ROOT_DIR} ${BUILD_UBUNTU_LIB_DRONECAN_APP_DIR}) -# 4. Add DroneCAN related source files and headers to you target. -add_executable(${EXECUTABLE} - ... - ${DRONECAN_SOURCES} - ... -) -target_include_directories(${EXECUTABLE} PRIVATE - ... - ${DRONECAN_HEADERS} +# 3. Add executable for your application +add_executable(${APPLICATION} ... ) + +# 4. Link the library to your application +target_link_libraries(${APPLICATION} DronecanApp) ``` +For more details, please check an example: [examples/ubuntu/CMakeLists.txt](examples/ubuntu/CMakeLists.txt). ## Minimal application example diff --git a/cmake/AddLibparams.cmake b/cmake/AddLibparams.cmake new file mode 100644 index 0000000..0b5c0dd --- /dev/null +++ b/cmake/AddLibparams.cmake @@ -0,0 +1,8 @@ +function(check_libparams_version MINIMUM_REQUIRED_VERSION) + if(TARGET libparams) + get_target_property(LIBPARAMS_VERSION libparams VERSION) + message(STATUS "libparams version check is not implemented yet") + else() + message(FATAL_ERROR "libparams not found") + endif() +endfunction() diff --git a/examples/ubuntu/CMakeLists.txt b/examples/ubuntu/CMakeLists.txt index 165720c..2979710 100644 --- a/examples/ubuntu/CMakeLists.txt +++ b/examples/ubuntu/CMakeLists.txt @@ -3,35 +3,54 @@ # Author: Dmitry Ponomarev cmake_minimum_required(VERSION 3.15.3) -project(ubuntu CXX C ASM) +project(ubuntu_application CXX C ASM) +# Pathes +set(EXAMPLES_UBUNTU_DIR ${CMAKE_CURRENT_LIST_DIR}) cmake_path(GET CMAKE_CURRENT_LIST_DIR PARENT_PATH EXAMPLES_DIR) cmake_path(GET EXAMPLES_DIR PARENT_PATH ROOT_DIR) +set(CMAKE_DIR ${ROOT_DIR}/cmake) +set(BUILD_DIR ${ROOT_DIR}/build) +set(BUILD_UBUNTU_DIR ${ROOT_DIR}/build/ubuntu) +set(LIBPARAMS_PATH ${BUILD_DIR}/external/libparams) +set(BUILD_UBUNTU_LIB_DRONECAN_APP_DIR ${BUILD_UBUNTU_DIR}/libDronecanApp) +# Pre-build +execute_process( + COMMAND git rev-parse --short=16 HEAD + COMMAND_ERROR_IS_FATAL ANY + OUTPUT_VARIABLE GIT_HASH_SHORT + OUTPUT_STRIP_TRAILING_WHITESPACE +) +set(GIT_HASH "0x${GIT_HASH_SHORT}") +add_definitions(-DGIT_HASH=${GIT_HASH}) +add_definitions(-DAPP_VERSION_MAJOR=0) +add_definitions(-DAPP_VERSION_MINOR=1) +add_definitions(-DHW_VERSION_MAJOR=0) +add_definitions(-DHW_VERSION_MINOR=0) +add_definitions(-DAPP_NODE_NAME="${PROJECT_NAME}") + +# Build dependencies +set(LIBPARAMS_PLATFORM ubuntu) +add_subdirectory(${LIBPARAMS_PATH} ${BUILD_UBUNTU_DIR}/libparams) -# 1. Specify the CAN_PLATFORM. Options: bxcan, fdcan or socketcan +# Build libDronecanApp set(CAN_PLATFORM socketcan) +add_subdirectory(${ROOT_DIR} ${BUILD_UBUNTU_LIB_DRONECAN_APP_DIR}) -# 2. Specify path to libparams and platform. Options: stm32f103, stm32g0b1, ubuntu -set(LIBPARAMS_PATH ${ROOT_DIR}/build/external/libparams) -set(LIBPARAMS_PLATFORM ubuntu) +# Build application +add_executable(${PROJECT_NAME} + ${EXAMPLES_UBUNTU_DIR}/main.cpp + ${EXAMPLES_UBUNTU_DIR}/params.cpp +) -# 3. Include the CMakeLists.txt -include(${ROOT_DIR}/CMakeLists.txt) +target_link_libraries(${PROJECT_NAME} DronecanApp) -# 4. Add DroneCAN related source files and headers to you target -add_executable(application - main.cpp - params.cpp - ${DRONECAN_SOURCES} - ${libparamsSrc} -) -target_include_directories(application PRIVATE - . - ${DRONECAN_HEADERS} - ${libparamsHeaders} +target_include_directories(${PROJECT_NAME} PRIVATE + ${EXAMPLES_UBUNTU_DIR} ) -target_compile_options(application PRIVATE + +target_compile_options(${PROJECT_NAME} PRIVATE -Wall -Wextra -Wfloat-equal @@ -44,20 +63,3 @@ target_compile_options(application PRIVATE -Wwrite-strings -Wswitch-default ) - -# 5. (Recommended) Add GIT_HASH based on git repository -execute_process( - COMMAND git rev-parse --short=16 HEAD - COMMAND_ERROR_IS_FATAL ANY - OUTPUT_VARIABLE GIT_HASH_SHORT - OUTPUT_STRIP_TRAILING_WHITESPACE -) -set(GIT_HASH "0x${GIT_HASH_SHORT}") -add_definitions(-DGIT_HASH=${GIT_HASH}) -add_definitions(-DAPP_VERSION_MAJOR=0) -add_definitions(-DAPP_VERSION_MINOR=1) -add_definitions(-DHW_VERSION_MAJOR=0) -add_definitions(-DHW_VERSION_MINOR=0) - -# 6. (Recommended) Set node name -add_definitions(-DAPP_NODE_NAME="${PROJECT_NAME}")