cmake_minimum_required(VERSION 3.10.1)
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR})
# Target definition
set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_PROCESSOR cortex-a9)
#---------------------------------------------------------------------------------------
# Set toolchain paths
#---------------------------------------------------------------------------------------
set(TOOLCHAIN arm-none-eabi)
if(NOT DEFINED TOOLCHAIN_PREFIX)
if(CMAKE_HOST_SYSTEM_NAME STREQUAL Linux)
set(TOOLCHAIN_PREFIX "/home/ares/gcc-arm-none-eabi-9-2019-q4-major")
elseif(CMAKE_HOST_SYSTEM_NAME STREQUAL Darwin)
set(TOOLCHAIN_PREFIX "/usr/local")
elseif(CMAKE_HOST_SYSTEM_NAME STREQUAL Windows)
set(TOOLCHAIN_PREFIX "C:/Program Files/PROS/toolchain/usr")
else()
set(TOOLCHAIN_PREFIX "/usr")
message(STATUS "No TOOLCHAIN_PREFIX specified, using default: " ${TOOLCHAIN_PREFIX})
endif()
endif()
set(TOOLCHAIN_BIN_DIR ${TOOLCHAIN_PREFIX}/bin)
set(TOOLCHAIN_INC_DIR ${TOOLCHAIN_PREFIX}/${TOOLCHAIN}/include)
set(TOOLCHAIN_LIB_DIR ${TOOLCHAIN_PREFIX}/${TOOLCHAIN}/lib)
if(WIN32)
set(TOOLCHAIN_EXT ".exe" )
else()
set(TOOLCHAIN_EXT "" )
endif()
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
set(CMAKE_C_COMPILER ${TOOLCHAIN_BIN_DIR}/${TOOLCHAIN}-gcc${TOOLCHAIN_EXT} CACHE INTERNAL "C Compiler")
set(CMAKE_CXX_COMPILER ${TOOLCHAIN_BIN_DIR}/${TOOLCHAIN}-g++${TOOLCHAIN_EXT} CACHE INTERNAL "C++ Compiler")
set(CMAKE_ASM_COMPILER ${TOOLCHAIN_BIN_DIR}/${TOOLCHAIN}-gcc${TOOLCHAIN_EXT} CACHE INTERNAL "ASM Compiler")
set(CMAKE_OBJCOPY ${TOOLCHAIN_BIN_DIR}/${TOOLCHAIN}-objcopy${TOOLCHAIN_EXT} CACHE INTERNAL "objcopy")
set(CMAKE_SIZE ${TOOLCHAIN_BIN_DIR}/${TOOLCHAIN}-size${TOOLCHAIN_EXT} CACHE INTERNAL "size")
set(CMAKE_FIND_ROOT_PATH ${TOOLCHAIN_PREFIX}/${${TOOLCHAIN}} ${CMAKE_PREFIX_PATH})
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
add_definitions(
-D_POSIX_THREADS
-D_UNIX98_THREAD_MUTEX_ATTRIBUTES
)
set(LINKER_SCRIPT "${CMAKE_SOURCE_DIR}/firmware/v5.ld")
SET(MCU_FLAGS "-mcpu=cortex-a9 -mfpu=neon-fp16 -mfloat-abi=softfp -Os -g -Wno-psabi -ffunction-sections -fdata-sections -fdiagnostics-color -funwind-tables -Wl,--allow-multiple-definition")
SET(CMAKE_C_FLAGS_INIT "${MCU_FLAGS} --std=gnu11")
SET(CMAKE_CXX_FLAGS_INIT "${MCU_FLAGS} --std=gnu++17")
#设置LINK的FALGS
SET(CMAKE_EXE_LINKER_FLAGS_INIT "-Wl,-gc-sections,--allow-multiple-definition -Wl,-T${LINKER_SCRIPT}")
project(monolith)
ENABLE_LANGUAGE(ASM)
include_directories(
${TOOLCHAIN_INC_DIR}
"./include"
)
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/firmware)
LINK_DIRECTORIES(${LIBRARY_OUTPUT_PATH})
file(GLOB_RECURSE INCLUDES "include/*.h" "include/*.hpp")
file(GLOB_RECURSE SOURCES "src/*.c" "src/*.cpp")
add_executable(${PROJECT_NAME}.elf ${SOURCES} ${INCLUDES})
set_target_properties(${PROJECT_NAME}.elf PROPERTIES LINK_DEPENDS ${LINKER_SCRIPT})
target_link_libraries(${PROJECT_NAME}.elf c m pros)
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lc -lm -lpros -lgcc -lstdc++ -lsupc++")
set(ELF_FILE ${EXECUTABLE_OUTPUT_PATH}/${PROJECT_NAME}.elf)
set(HEX_FILE ${EXECUTABLE_OUTPUT_PATH}/${PROJECT_NAME}.hex)
set(BIN_FILE ${EXECUTABLE_OUTPUT_PATH}/${PROJECT_NAME}.bin)
add_custom_command(TARGET ${PROJECT_NAME}.elf POST_BUILD
COMMAND ${CMAKE_OBJCOPY} -Oihex $<TARGET_FILE:${PROJECT_NAME}.elf> ${HEX_FILE}
COMMAND ${CMAKE_OBJCOPY} -Obinary $<TARGET_FILE:${PROJECT_NAME}.elf> ${BIN_FILE}
COMMENT "Building ${HEX_FILE}
Building ${BIN_FILE}")
Pros virtual a main function.It leads to many rare problems.
I copy the contents of v5-common.ld
to v5.ld
, which can be generated at present
But .o
files are in . / build
folder. The suffix is .o.obj
As a result, prosv5 mut
cannot be used for upload
Cmake is used because I want to do some peripheral resources to serve vexer all over the world. For example, I plan to integrate lvgl simulator directly into pros project