1
mirror of https://github.com/canokeys/canokey-nrf52.git synced 2024-09-07 15:32:40 +08:00
canokey-nrf52/CMakeLists.txt
2022-08-20 22:40:38 +08:00

134 lines
4.2 KiB
CMake

cmake_minimum_required(VERSION 3.18)
option(ENABLE_DEBUG_OUTPUT "Print debug messages" OFF)
project(canokey-nrf52 C ASM)
set(TARGET canokey)
# board selection, see config/board_selection.h for avaliable boards
set(CANOKEY_BOARD OPT_BOARD_NRF52840_DONGLE)
# set(CANOKEY_BOARD OPT_BOARD_MAKERDIARY_M2_DOCK)
set(BASE_DIR ${CMAKE_CURRENT_LIST_DIR}/)
set(NRF5_SDK_DIR ${BASE_DIR}/nrf_sdk/nRF5_SDK_17.1.0_ddde560)
set(LINKER_SCRIPT "${BASE_DIR}/nrf52840.ld")
add_definitions(-DNRF52840_XXAA)
add_definitions(-DMBR_PRESENT)
add_definitions(-DCFG_BOARD=${CANOKEY_BOARD})
add_definitions(-DCFG_TUSB_MCU=OPT_MCU_NRF5X)
add_definitions(-DMBEDTLS_CONFIG_FILE="${BASE_DIR}/config/mbedtls_config.h")
# nrf5 sdk configs
add_definitions(-DCUSTOM_BOARD_INC=board_selection)
add_definitions(-DBSP_DEFINES_ONLY)
add_definitions(-DCONFIG_GPIO_AS_PINRESET)
add_definitions(-DFLOAT_ABI_HARD)
set(CMAKE_C_STANDARD 11)
set(COMMON_COMPILE_FLAGS "-mcpu=cortex-m4 -mthumb -mabi=aapcs -mfloat-abi=hard -mfpu=fpv4-sp-d16")
set(EXTRA_COMPILE_FLAGS "-ffunction-sections -fdata-sections -fno-strict-aliasing -fno-builtin -fshort-enums")
set(WARNING_FLAGS "-Wall")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COMMON_COMPILE_FLAGS} ${WARNING_FLAGS} ${EXTRA_COMPILE_FLAGS} ${DEFINITIONS}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COMMON_COMPILE_FLAGS} ${WARNING_FLAGS} ${EXTRA_COMPILE_FLAGS} ${DEFINITIONS}")
set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} ${COMMON_COMPILE_FLAGS}")
set(CMAKE_C_FLAGS_DEBUG "-g3 -Og")
set(CMAKE_C_FLAGS_RELEASE "-Os")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L${NRF5_SDK_DIR}/modules/nrfx/mdk -T ${LINKER_SCRIPT} -Wl,--gc-sections -Wl,-Map=${TARGET}.map --specs=nano.specs")
# Enable export of compile_commands.json
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
include(${BASE_DIR}/nrf_sdk/nRF5_SDK.cmake)
file(GLOB SRCS
"${BASE_DIR}/src/*.c"
)
set(SOURCES
${NRF5_SDK_SOURCES}
${SRCS}
)
add_executable(${TARGET} ${SOURCES})
# Include dirs
target_include_directories(${TARGET} PRIVATE ${NRF5_SDK_INCLUDES})
target_include_directories(${TARGET} PRIVATE ${BASE_DIR}/include)
target_include_directories(${TARGET} PRIVATE ${BASE_DIR}/config)
# nrf sdk binary libraries
target_link_libraries(${TARGET} PRIVATE ${NRF5_SDK_LIBRARIES})
# TinyUSB DCD configure
set(DCD_INCLUDE_DIRS
${NRF5_SDK_INCLUDES}
${BASE_DIR}/config
)
set(TINYUSB_MCU "OPT_MCU_NRF5X" CACHE STRING "TinyUSB MCU name")
set(TINYUSB_DCD_INCLUDES ${DCD_INCLUDE_DIRS} CACHE STRING "TinyUSB DCD include paths")
# CanoKey Core
add_subdirectory(canokey-core)
target_link_libraries(${TARGET} PRIVATE
-Wl,--whole-archive
canokey-core
-Wl,--no-whole-archive
)
target_link_libraries(${TARGET} PRIVATE c m nosys)
# Generate Git version header
add_dependencies(${TARGET} gitrev)
set(gitrev_in include/git-rev.h.in)
set(gitrev include/git-rev.h)
add_custom_target(gitrev
${CMAKE_COMMAND} -E remove -f ${CMAKE_CURRENT_SOURCE_DIR}/${gitrev}
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/${gitrev_in} ${CMAKE_CURRENT_SOURCE_DIR}/${gitrev}
COMMAND git describe --always --tags --long --abbrev=8 --dirty >> ${CMAKE_CURRENT_SOURCE_DIR}/${gitrev}
)
# Create a binary from the elf
add_custom_target(${TARGET}.bin
DEPENDS ${TARGET}
COMMAND "${CROSS_COMPILE}objcopy" -O binary -S ${TARGET} ${TARGET}.bin
)
add_custom_target(${TARGET}.hex
DEPENDS ${TARGET}
COMMAND "${CROSS_COMPILE}objcopy" -O ihex -S ${TARGET} ${TARGET}.hex
)
# Print size of the elf
add_custom_command(TARGET ${TARGET} POST_BUILD
COMMAND ${CROSS_COMPILE}size ${TARGET}
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
)
# Generate UF2 package for Adafruit bootloader
add_custom_target(${TARGET}_flash.uf2
DEPENDS ${TARGET}.hex
COMMAND python ${BASE_DIR}/utils/uf2/utils/uf2conv.py --convert --family 0xADA52840 -o ${TARGET}_flash.uf2 ${TARGET}.hex
)
# NRF sdk config tool
set(NRF5_SDK_CONFIG_FILE ${BASE_DIR}/config/sdk_config.h)
set(CMSIS_CONFIG_TOOL ${NRF5_SDK_DIR}/external_tools/cmsisconfig/CMSIS_Configuration_Wizard.jar)
add_custom_target(sdk_config
COMMAND java -jar ${CMSIS_CONFIG_TOOL} ${NRF5_SDK_CONFIG_FILE}
)
# auto-ignore build directory
if(NOT EXISTS ${PROJECT_BINARY_DIR}/.gitignore)
file(WRITE ${PROJECT_BINARY_DIR}/.gitignore "*")
endif()
# vim: set ts=4 sw=4 sts=4 et smarttab :