216 lines
9.4 KiB
CMake
216 lines
9.4 KiB
CMake
cmake_minimum_required(VERSION 3.12)
|
|
|
|
project(nrf51_template)
|
|
|
|
enable_language(CXX)
|
|
enable_language(ASM)
|
|
|
|
if(NOT DEFINED NRF5_SDK_ROOT)
|
|
message(FATAL_ERROR "NRF5_SDK_ROOT not defined")
|
|
endif()
|
|
|
|
set(NRF5_DEVICE "NRF51822")
|
|
set(NRF5_S130_VERSION "2.0.1")
|
|
|
|
set(TARGET_CFLAGS_EXTRA "")
|
|
set(TARGET_CXXFLAGS_EXTRA "")
|
|
set(TARGET_LDFLAGS_EXTRA "-Wl,--print-memory-usage")
|
|
|
|
# Shared C source code
|
|
set(TARGET_C_SOURCES
|
|
"src/main.c"
|
|
"${NRF5_SDK_ROOT}/components/boards/boards.c"
|
|
"${NRF5_SDK_ROOT}/components/drivers_nrf/clock/nrf_drv_clock.c"
|
|
"${NRF5_SDK_ROOT}/components/drivers_nrf/common/nrf_drv_common.c"
|
|
"${NRF5_SDK_ROOT}/components/drivers_nrf/uart/nrf_drv_uart.c"
|
|
"${NRF5_SDK_ROOT}/components/libraries/hardfault/hardfault_implementation.c"
|
|
"${NRF5_SDK_ROOT}/components/libraries/log/src/nrf_log_backend_serial.c"
|
|
"${NRF5_SDK_ROOT}/components/libraries/log/src/nrf_log_frontend.c"
|
|
"${NRF5_SDK_ROOT}/components/libraries/timer/app_timer.c"
|
|
"${NRF5_SDK_ROOT}/components/libraries/util/app_error.c"
|
|
"${NRF5_SDK_ROOT}/components/libraries/util/app_error_weak.c"
|
|
"${NRF5_SDK_ROOT}/components/libraries/util/app_util_platform.c"
|
|
"${NRF5_SDK_ROOT}/components/libraries/util/nrf_assert.c"
|
|
"${NRF5_SDK_ROOT}/components/libraries/util/sdk_errors.c"
|
|
"${NRF5_SDK_ROOT}/components/toolchain/system_nrf51.c"
|
|
)
|
|
|
|
# C source code for applications with SoftDevice
|
|
set(TARGET_C_SOURCES_SD
|
|
"${NRF5_SDK_ROOT}/components/softdevice/common/softdevice_handler/softdevice_handler.c"
|
|
)
|
|
|
|
# Assembly source code
|
|
set(TARGET_ASM_SOURCES
|
|
"${NRF5_SDK_ROOT}/components/toolchain/gcc/gcc_startup_nrf51.S"
|
|
)
|
|
|
|
# Shared include directories
|
|
set(TARGET_C_INCLUDES
|
|
"config"
|
|
"include"
|
|
"${NRF5_SDK_ROOT}/components/boards"
|
|
"${NRF5_SDK_ROOT}/components/device"
|
|
"${NRF5_SDK_ROOT}/components/drivers_nrf/clock"
|
|
"${NRF5_SDK_ROOT}/components/drivers_nrf/common"
|
|
"${NRF5_SDK_ROOT}/components/drivers_nrf/delay"
|
|
"${NRF5_SDK_ROOT}/components/drivers_nrf/hal"
|
|
"${NRF5_SDK_ROOT}/components/drivers_nrf/uart"
|
|
"${NRF5_SDK_ROOT}/components/libraries/log"
|
|
"${NRF5_SDK_ROOT}/components/libraries/log/src"
|
|
"${NRF5_SDK_ROOT}/components/libraries/util"
|
|
"${NRF5_SDK_ROOT}/components/toolchain"
|
|
"${NRF5_SDK_ROOT}/components/toolchain/cmsis/include"
|
|
)
|
|
|
|
# Include directories for applications without SoftDevice
|
|
set(TARGET_C_INCLUDES_BLANK
|
|
"${NRF5_SDK_ROOT}/components/drivers_nrf/nrf_soc_nosd"
|
|
)
|
|
|
|
# Include directories for applications with SoftDevice
|
|
set(TARGET_C_INCLUDES_SD
|
|
"${NRF5_SDK_ROOT}/components/softdevice/common/softdevice_handler"
|
|
"${NRF5_SDK_ROOT}/components/softdevice/s130/headers"
|
|
)
|
|
|
|
# Shared C/CXX macros
|
|
set(TARGET_C_DEFINES
|
|
"NRF51"
|
|
"${NRF5_DEVICE}"
|
|
"BSP_DEFINES_ONLY"
|
|
"BOARD_CUSTOM"
|
|
"SWI_DISABLE0"
|
|
"USE_APP_CONFIG"
|
|
)
|
|
|
|
# C/CXX macros for applications with SoftDevice
|
|
set(TARGET_DEFINES_SD
|
|
"S130"
|
|
"SOFTDEVICE_PRESENT"
|
|
"BLE_SUPPORT_REQD"
|
|
"NRF_SD_BLE_API_VERSION=2"
|
|
)
|
|
|
|
# Shared libraries linked with application
|
|
set(TARGET_LIBS
|
|
)
|
|
|
|
# Shared library and linker script search paths
|
|
set(TARGET_LIB_DIRECTORIES
|
|
"${NRF5_SDK_ROOT}/components/toolchain/gcc"
|
|
)
|
|
|
|
# Device specific settings, goes to C, CXX and ASM flags.
|
|
set(TARGET_CFLAGS_HARDWARE "-mcpu=cortex-m0 -mfloat-abi=soft -mthumb")
|
|
|
|
# Conditional flags
|
|
# DEBUG
|
|
set(CMAKE_C_FLAGS_DEBUG "-DDEBUG -Og -g")
|
|
set(CMAKE_CXX_FLAGS_DEBUG "-DDEBUG -Og -g")
|
|
set(CMAKE_ASM_FLAGS_DEBUG "-DDEBUG -Og -g")
|
|
|
|
# RELEASE
|
|
set(CMAKE_C_FLAGS_RELEASE "-DNDEBUG -O3 -flto")
|
|
set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG -O3 -flto")
|
|
set(CMAKE_ASM_FLAGS_RELEASE "-DNDEBUG -O3 -flto")
|
|
set(CMAKE_EXE_LINKER_FLAGS_DEBUG "-flto")
|
|
|
|
# Final compiler flags
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${TARGET_CFLAGS_HARDWARE} ${TARGET_CFLAGS_EXTRA} -Wall -fdata-sections -ffunction-sections -fno-strict-aliasing -fno-builtin")
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${TARGET_CFLAGS_HARDWARE} ${TARGET_CXXFLAGS_EXTRA} -Wall -fdata-sections -ffunction-sections -fno-strict-aliasing -fno-builtin")
|
|
set(CMAKE_ASM_FLAGS "${CMAKE_C_FLAGS} -x assembler-with-cpp")
|
|
set(CMAKE_EXE_LINKER_FLAGS "-specs=nano.specs -specs=nosys.specs -Wl,--gc-sections -lc -lm -lnosys ${TARGET_LDFLAGS_EXTRA}")
|
|
|
|
# Different linker scripts for different flavors.
|
|
# Note that SoftDevice requires certain memory ranges reserved for private use.
|
|
set(TARGET_LDSCRIPT_BLANK_AA "${NRF5_SDK_ROOT}/components/toolchain/gcc/nrf51_xxaa.ld") # Blank device
|
|
set(TARGET_LDSCRIPT_BLANK_AC "${NRF5_SDK_ROOT}/components/toolchain/gcc/nrf51_xxac.ld") # Blank device with additional 16KB SRAM
|
|
set(TARGET_LDSCRIPT_SD_AA "${CMAKE_SOURCE_DIR}/components/toolchain/gcc/nrf51_xxaa_sd.ld") # With SoftDevice
|
|
set(TARGET_LDSCRIPT_SD_AC "${CMAKE_SOURCE_DIR}/components/toolchain/gcc/nrf51_xxac_sd.ld") # With SoftDevice and additional 16KB SRAM
|
|
|
|
# Add shared includes, defines and libs
|
|
include_directories(${TARGET_C_INCLUDES})
|
|
add_compile_definitions(${TARGET_C_DEFINES})
|
|
link_directories(${TARGET_LIB_DIRECTORIES})
|
|
link_libraries(${TARGET_LIBS})
|
|
|
|
# Main targets are added below
|
|
|
|
# ============================= AA variant, without SD ============================= #
|
|
add_executable("${CMAKE_PROJECT_NAME}_blank_xxaa.elf" ${TARGET_C_SOURCES} ${TARGET_ASM_SOURCES})
|
|
target_link_options("${CMAKE_PROJECT_NAME}_blank_xxaa.elf"
|
|
PRIVATE "-T${TARGET_LDSCRIPT_BLANK_AA}"
|
|
PRIVATE "-Wl,-Map=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}_blank_xxaa.map,--cref"
|
|
)
|
|
target_include_directories("${CMAKE_PROJECT_NAME}_blank_xxaa.elf" PRIVATE ${TARGET_C_INCLUDES_BLANK})
|
|
|
|
# Generate hex
|
|
add_custom_command(OUTPUT "${CMAKE_PROJECT_NAME}_blank_xxaa.hex"
|
|
COMMAND ${CMAKE_OBJCOPY} "-O" "ihex" "${CMAKE_PROJECT_NAME}_blank_xxaa.elf" "${CMAKE_PROJECT_NAME}_blank_xxaa.hex"
|
|
DEPENDS "${CMAKE_PROJECT_NAME}_blank_xxaa.elf"
|
|
)
|
|
add_custom_target("${CMAKE_PROJECT_NAME}_blank_xxaa_hex" DEPENDS "${CMAKE_PROJECT_NAME}_blank_xxaa.hex")
|
|
# ================================================================================== #
|
|
|
|
|
|
# ============================= AC variant, without SD ============================= #
|
|
add_executable("${CMAKE_PROJECT_NAME}_blank_xxac.elf" ${TARGET_C_SOURCES} ${TARGET_ASM_SOURCES})
|
|
target_link_options("${CMAKE_PROJECT_NAME}_blank_xxac.elf"
|
|
PRIVATE "-T${TARGET_LDSCRIPT_BLANK_AC}"
|
|
PRIVATE "-Wl,-Map=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}_blank_xxac.map,--cref"
|
|
)
|
|
target_include_directories("${CMAKE_PROJECT_NAME}_blank_xxac.elf" PRIVATE ${TARGET_C_INCLUDES_BLANK})
|
|
|
|
# Generate hex
|
|
add_custom_command(OUTPUT "${CMAKE_PROJECT_NAME}_blank_xxac.hex"
|
|
COMMAND ${CMAKE_OBJCOPY} "-O" "ihex" "${CMAKE_PROJECT_NAME}_blank_xxac.elf" "${CMAKE_PROJECT_NAME}_blank_xxac.hex"
|
|
DEPENDS "${CMAKE_PROJECT_NAME}_blank_xxac.elf"
|
|
)
|
|
add_custom_target("${CMAKE_PROJECT_NAME}_blank_xxac_hex" DEPENDS "${CMAKE_PROJECT_NAME}_blank_xxac.hex")
|
|
# ================================================================================== #
|
|
|
|
|
|
# =============================== AA variant, with SD =============================== #
|
|
add_executable("${CMAKE_PROJECT_NAME}_sd_xxaa.elf" ${TARGET_C_SOURCES} ${TARGET_C_SOURCES_SD} ${TARGET_ASM_SOURCES})
|
|
target_link_options("${CMAKE_PROJECT_NAME}_sd_xxaa.elf"
|
|
PRIVATE "-T${TARGET_LDSCRIPT_SD_AA}"
|
|
PRIVATE "-Wl,-Map=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}_sd_xxaa.map,--cref"
|
|
)
|
|
target_include_directories("${CMAKE_PROJECT_NAME}_sd_xxaa.elf" PRIVATE ${TARGET_C_INCLUDES_SD})
|
|
target_compile_definitions("${CMAKE_PROJECT_NAME}_sd_xxaa.elf" PRIVATE ${TARGET_DEFINES_SD})
|
|
|
|
# Generate hex
|
|
add_custom_command(OUTPUT "${CMAKE_PROJECT_NAME}_sd_xxaa.hex" "${CMAKE_PROJECT_NAME}_sd_xxaa_full.hex"
|
|
COMMAND ${CMAKE_OBJCOPY} "-O" "ihex" "${CMAKE_PROJECT_NAME}_sd_xxaa.elf" "${CMAKE_PROJECT_NAME}_sd_xxaa.hex"
|
|
COMMAND "${CMAKE_SOURCE_DIR}/scripts/merge_hex.sh"
|
|
"${NRF5_SDK_ROOT}/components/softdevice/s130/hex/s130_nrf51_${NRF5_S130_VERSION}_softdevice.hex"
|
|
"${CMAKE_PROJECT_NAME}_sd_xxaa.hex"
|
|
"${CMAKE_PROJECT_NAME}_sd_xxaa_full.hex"
|
|
DEPENDS "${CMAKE_PROJECT_NAME}_sd_xxaa.elf"
|
|
)
|
|
add_custom_target("${CMAKE_PROJECT_NAME}_sd_xxaa_hex" DEPENDS "${CMAKE_PROJECT_NAME}_sd_xxaa.hex")
|
|
# ================================================================================== #
|
|
|
|
|
|
# =============================== AC variant, with SD =============================== #
|
|
add_executable("${CMAKE_PROJECT_NAME}_sd_xxac.elf" ${TARGET_C_SOURCES} ${TARGET_C_SOURCES_SD} ${TARGET_ASM_SOURCES})
|
|
target_link_options("${CMAKE_PROJECT_NAME}_sd_xxac.elf"
|
|
PRIVATE "-T${TARGET_LDSCRIPT_SD_AC}"
|
|
PRIVATE "-Wl,-Map=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}_sd_xxac.map,--cref"
|
|
)
|
|
target_include_directories("${CMAKE_PROJECT_NAME}_sd_xxac.elf" PRIVATE ${TARGET_C_INCLUDES_SD})
|
|
target_compile_definitions("${CMAKE_PROJECT_NAME}_sd_xxac.elf" PRIVATE ${TARGET_DEFINES_SD})
|
|
|
|
# Generate hex
|
|
add_custom_command(OUTPUT "${CMAKE_PROJECT_NAME}_sd_xxac.hex" "${CMAKE_PROJECT_NAME}_sd_xxac_full.hex"
|
|
COMMAND ${CMAKE_OBJCOPY} "-O" "ihex" "${CMAKE_PROJECT_NAME}_sd_xxac.elf" "${CMAKE_PROJECT_NAME}_sd_xxac.hex"
|
|
COMMAND "${CMAKE_SOURCE_DIR}/scripts/merge_hex.sh"
|
|
"${NRF5_SDK_ROOT}/components/softdevice/s130/hex/s130_nrf51_${NRF5_S130_VERSION}_softdevice.hex"
|
|
"${CMAKE_PROJECT_NAME}_sd_xxac.hex"
|
|
"${CMAKE_PROJECT_NAME}_sd_xxac_full.hex"
|
|
DEPENDS "${CMAKE_PROJECT_NAME}_sd_xxac.elf"
|
|
)
|
|
add_custom_target("${CMAKE_PROJECT_NAME}_sd_xxac_hex" DEPENDS "${CMAKE_PROJECT_NAME}_sd_xxac.hex")
|
|
# ================================================================================== #
|