Explorar o código

Added ability to specify linker script.

Macros/Functions moved to toolchain file.
LTO disabled in debug builds.
Konstantin Oblaukhov %!s(int64=12) %!d(string=hai) anos
pai
achega
e405b312e2

+ 0 - 74
cmake/Modules/FindCMSIS.cmake

@@ -56,77 +56,3 @@ ELSE()
     )
     FIND_PACKAGE_HANDLE_STANDARD_ARGS(CMSIS DEFAULT_MSG CMSIS_LIBRARIES CMSIS_INCLUDE_DIR CMSIS_STARTUP_SOURCE CMSIS_LINKER_SCRIPT) 
 ENDIF()
-
-MACRO(STM32_KB_TO_BYTES KB BYTES)
-    STRING(REGEX REPLACE "^(.+)[kK]$" "\\1" KILOBYTES ${KB})
-    IF(KILOBYTES)
-        MATH(EXPR ${BYTES} "${KILOBYTES} * 1024")
-    ELSE()
-        SET(${BYTES} ${KB})
-    ENDIF()
-ENDMACRO()
-
-FUNCTION(STM32_SET_FLASH_PARAMS TARGET STM32_FLASH_SIZE STM32_RAM_SIZE STM32_STACK_ADDRESS STM32_MIN_STACK_SIZE STM32_MIN_HEAP_SIZE STM32_FLASH_ORIGIN STM32_RAM_ORIGIN)
-    CONFIGURE_FILE(${CMSIS_LINKER_SCRIPT} ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_flash.ld)
-    SET_TARGET_PROPERTIES(${TARGET} PROPERTIES LINK_FLAGS "-T${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_flash.ld ${CMAKE_EXE_LINKER_FLAGS}")
-ENDFUNCTION()
-
-FUNCTION(STM32_SET_FLASH_PARAMS TARGET FLASH_SIZE RAM_SIZE)
-    STM32_KB_TO_BYTES(${FLASH_SIZE} FLASH_SIZE)
-    STM32_KB_TO_BYTES(${RAM_SIZE} RAM_SIZE)
-    
-    IF(NOT STM32_FLASH_ORIGIN)
-        SET(STM32_FLASH_ORIGIN "0x08000000")
-    ENDIF() 
-    
-    IF(NOT STM32_RAM_ORIGIN)
-        SET(STM32_RAM_ORIGIN "536870912")
-    ENDIF()
-    
-    IF(NOT STM32_STACK_ADDRESS)
-        MATH(EXPR STM32_STACK_ADDRESS "${STM32_RAM_ORIGIN} + ${RAM_SIZE}")
-    ENDIF()
-        
-    SET(STM32_FLASH_SIZE ${FLASH_SIZE})
-    SET(STM32_RAM_SIZE ${RAM_SIZE})
-    
-    IF(NOT STM32_MIN_STACK_SIZE)
-        SET(STM32_MIN_STACK_SIZE "0x200")
-    ENDIF()
-    
-    IF(NOT STM32_MIN_HEAP_SIZE)
-        SET(STM32_MIN_HEAP_SIZE "0")
-    ENDIF()
-        
-    CONFIGURE_FILE(${CMSIS_LINKER_SCRIPT} ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_flash.ld)
-    SET_TARGET_PROPERTIES(${TARGET} PROPERTIES LINK_FLAGS "-T${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_flash.ld ${CMAKE_EXE_LINKER_FLAGS}")
-ENDFUNCTION()
-
-FUNCTION(STM32_SET_TARGET_PROPERTIES TARGET)
-    IF((NOT STM32_CHIP_TYPE) AND (NOT STM32_CHIP))
-        MESSAGE(WARNING "Neither STM32_CHIP_TYPE nor STM32_CHIP selected, you'll have to use STM32_SET_CHIP_DEFINITIONS directly")
-    ELSE()
-        STM32_SET_CHIP_DEFINITIONS(${TARGET} ${STM32_CHIP_TYPE})
-        IF(((NOT STM32_FLASH_SIZE) OR (NOT STM32_RAM_SIZE)) AND (NOT STM32_CHIP))
-            MESSAGE(FATAL_ERROR "Cannot get chip parameters. Please specify either STM32_CHIP or STM32_FLASH_SIZE/STM32_RAM_SIZE")
-        ENDIF()
-        IF((NOT STM32_FLASH_SIZE) OR (NOT STM32_RAM_SIZE))
-            STM32_GET_CHIP_PARAMETERS(${STM32_CHIP} STM32_FLASH_SIZE STM32_RAM_SIZE)
-            IF((NOT STM32_FLASH_SIZE) OR (NOT STM32_RAM_SIZE))
-                MESSAGE(FATAL_ERROR "Unknown chip: ${STM32_CHIP}. Try to use STM32_FLASH_SIZE/STM32_RAM_SIZE directly.")
-            ENDIF()
-            MESSAGE(STATUS "${STM32_CHIP} has ${STM32_FLASH_SIZE}iB of flash memory and ${STM32_RAM_SIZE}iB of RAM")
-        ENDIF()
-    ENDIF()
-    STM32_SET_FLASH_PARAMS(${TARGET} ${STM32_FLASH_SIZE} ${STM32_RAM_SIZE})
-ENDFUNCTION()
-
-MACRO(STM32_GENERATE_LIBRARIES NAME SOURCES LIBRARIES)
-    STRING(TOLOWER ${STM32_FAMILY} STM32_FAMILY_LOWER)
-    FOREACH(CHIP_TYPE ${STM32_CHIP_TYPES})
-        STRING(TOLOWER ${CHIP_TYPE} CHIP_TYPE_LOWER)
-        LIST(APPEND ${LIBRARIES} ${NAME}_${STM32_FAMILY_LOWER}_${CHIP_TYPE_LOWER})
-        ADD_LIBRARY(${NAME}_${STM32_FAMILY_LOWER}_${CHIP_TYPE_LOWER} ${SOURCES})
-        STM32_SET_CHIP_DEFINITIONS(${NAME}_${STM32_FAMILY_LOWER}_${CHIP_TYPE_LOWER} ${CHIP_TYPE})
-    ENDFOREACH()
-ENDMACRO()

+ 85 - 2
gcc_stm32.cmake

@@ -47,10 +47,12 @@ SET(CMAKE_OBJDUMP ${TOOLCHAIN_BIN_DIR}/${TARGET_TRIPLET}-objdump CACHE INTERNAL
 SET(CMAKE_C_FLAGS_DEBUG "-Og -g" CACHE INTERNAL "c compiler flags debug")
 SET(CMAKE_CXX_FLAGS_DEBUG "-Og -g" CACHE INTERNAL "cxx compiler flags debug")
 SET(CMAKE_ASM_FLAGS_DEBUG "-g" CACHE INTERNAL "asm compiler flags debug")
+SET(CMAKE_EXE_LINKER_FLAGS_DEBUG "" CACHE INTERNAL "linker flags debug")
 
-SET(CMAKE_C_FLAGS_RELEASE "-Os" CACHE INTERNAL "c compiler flags release")
-SET(CMAKE_CXX_FLAGS_RELEASE "-Os" CACHE INTERNAL "cxx compiler flags release")
+SET(CMAKE_C_FLAGS_RELEASE "-Os -flto" CACHE INTERNAL "c compiler flags release")
+SET(CMAKE_CXX_FLAGS_RELEASE "-Os -flto" CACHE INTERNAL "cxx compiler flags release")
 SET(CMAKE_ASM_FLAGS_RELEASE "" CACHE INTERNAL "asm compiler flags release")
+SET(CMAKE_EXE_LINKER_FLAGS_RELESE "-flto" CACHE INTERNAL "linker flags release")
 
 SET(CMAKE_FIND_ROOT_PATH ${TOOLCHAIN_PREFIX}/${TARGET_TRIPLET})
 SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
@@ -64,3 +66,84 @@ ENDFUNCTION()
 
 STRING(TOLOWER ${STM32_FAMILY} STM32_FAMILY_LOWER)
 INCLUDE(${CMAKE_CURRENT_LIST_DIR}/gcc_stm32${STM32_FAMILY_LOWER}.cmake)
+
+MACRO(STM32_KB_TO_BYTES KB BYTES)
+    STRING(REGEX REPLACE "^(.+)[kK]$" "\\1" KILOBYTES ${KB})
+    IF(KILOBYTES)
+        MATH(EXPR ${BYTES} "${KILOBYTES} * 1024")
+    ELSE()
+        SET(${BYTES} ${KB})
+    ENDIF()
+ENDMACRO()
+
+FUNCTION(STM32_SET_FLASH_PARAMS TARGET STM32_FLASH_SIZE STM32_RAM_SIZE STM32_STACK_ADDRESS STM32_MIN_STACK_SIZE STM32_MIN_HEAP_SIZE STM32_FLASH_ORIGIN STM32_RAM_ORIGIN)
+    IF(NOT STM32_LINKER_SCRIPT)
+        MESSAGE(FATAL_ERROR "No linker script specified. Please specify linker script using STM32_LINKER_SCRIPT variable.")
+    ENDIF()
+    CONFIGURE_FILE(${STM32_LINKER_SCRIPT} ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_flash.ld)
+    SET_TARGET_PROPERTIES(${TARGET} PROPERTIES LINK_FLAGS "-T${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_flash.ld ${CMAKE_EXE_LINKER_FLAGS}")
+ENDFUNCTION()
+
+FUNCTION(STM32_SET_FLASH_PARAMS TARGET FLASH_SIZE RAM_SIZE)
+    IF(NOT STM32_LINKER_SCRIPT)
+        MESSAGE(FATAL_ERROR "No linker script specified. Please specify linker script using STM32_LINKER_SCRIPT variable.")
+    ENDIF()
+    
+    STM32_KB_TO_BYTES(${FLASH_SIZE} FLASH_SIZE)
+    STM32_KB_TO_BYTES(${RAM_SIZE} RAM_SIZE)
+    
+    IF(NOT STM32_FLASH_ORIGIN)
+        SET(STM32_FLASH_ORIGIN "0x08000000")
+    ENDIF() 
+    
+    IF(NOT STM32_RAM_ORIGIN)
+        SET(STM32_RAM_ORIGIN "536870912")
+    ENDIF()
+    
+    IF(NOT STM32_STACK_ADDRESS)
+        MATH(EXPR STM32_STACK_ADDRESS "${STM32_RAM_ORIGIN} + ${RAM_SIZE}")
+    ENDIF()
+        
+    SET(STM32_FLASH_SIZE ${FLASH_SIZE})
+    SET(STM32_RAM_SIZE ${RAM_SIZE})
+    
+    IF(NOT STM32_MIN_STACK_SIZE)
+        SET(STM32_MIN_STACK_SIZE "0x200")
+    ENDIF()
+    
+    IF(NOT STM32_MIN_HEAP_SIZE)
+        SET(STM32_MIN_HEAP_SIZE "0")
+    ENDIF()
+        
+    CONFIGURE_FILE(${STM32_LINKER_SCRIPT} ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_flash.ld)
+    SET_TARGET_PROPERTIES(${TARGET} PROPERTIES LINK_FLAGS "-T${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_flash.ld ${CMAKE_EXE_LINKER_FLAGS}")
+ENDFUNCTION()
+
+FUNCTION(STM32_SET_TARGET_PROPERTIES TARGET)
+    IF((NOT STM32_CHIP_TYPE) AND (NOT STM32_CHIP))
+        MESSAGE(WARNING "Neither STM32_CHIP_TYPE nor STM32_CHIP selected, you'll have to use STM32_SET_CHIP_DEFINITIONS directly")
+    ELSE()
+        STM32_SET_CHIP_DEFINITIONS(${TARGET} ${STM32_CHIP_TYPE})
+        IF(((NOT STM32_FLASH_SIZE) OR (NOT STM32_RAM_SIZE)) AND (NOT STM32_CHIP))
+            MESSAGE(FATAL_ERROR "Cannot get chip parameters. Please specify either STM32_CHIP or STM32_FLASH_SIZE/STM32_RAM_SIZE")
+        ENDIF()
+        IF((NOT STM32_FLASH_SIZE) OR (NOT STM32_RAM_SIZE))
+            STM32_GET_CHIP_PARAMETERS(${STM32_CHIP} STM32_FLASH_SIZE STM32_RAM_SIZE)
+            IF((NOT STM32_FLASH_SIZE) OR (NOT STM32_RAM_SIZE))
+                MESSAGE(FATAL_ERROR "Unknown chip: ${STM32_CHIP}. Try to use STM32_FLASH_SIZE/STM32_RAM_SIZE directly.")
+            ENDIF()
+            MESSAGE(STATUS "${STM32_CHIP} has ${STM32_FLASH_SIZE}iB of flash memory and ${STM32_RAM_SIZE}iB of RAM")
+        ENDIF()
+    ENDIF()
+    STM32_SET_FLASH_PARAMS(${TARGET} ${STM32_FLASH_SIZE} ${STM32_RAM_SIZE})
+ENDFUNCTION()
+
+MACRO(STM32_GENERATE_LIBRARIES NAME SOURCES LIBRARIES)
+    STRING(TOLOWER ${STM32_FAMILY} STM32_FAMILY_LOWER)
+    FOREACH(CHIP_TYPE ${STM32_CHIP_TYPES})
+        STRING(TOLOWER ${CHIP_TYPE} CHIP_TYPE_LOWER)
+        LIST(APPEND ${LIBRARIES} ${NAME}_${STM32_FAMILY_LOWER}_${CHIP_TYPE_LOWER})
+        ADD_LIBRARY(${NAME}_${STM32_FAMILY_LOWER}_${CHIP_TYPE_LOWER} ${SOURCES})
+        STM32_SET_CHIP_DEFINITIONS(${NAME}_${STM32_FAMILY_LOWER}_${CHIP_TYPE_LOWER} ${CHIP_TYPE})
+    ENDFOREACH()
+ENDMACRO()

+ 5 - 5
gcc_stm32f1.cmake

@@ -1,10 +1,10 @@
-SET(CMAKE_C_FLAGS "-mthumb -flto -fno-builtin -mcpu=cortex-m3 -Wall -std=c99 -ffunction-sections -fdata-sections -fomit-frame-pointer -mabi=aapcs -fno-unroll-loops -ffast-math -ftree-vectorize" CACHE INTERNAL "c compiler flags")
-SET(CMAKE_CXX_FLAGS "-mthumb -flto -fno-builtin -mcpu=cortex-m3 -Wall -std=c++11 -ffunction-sections -fdata-sections -fomit-frame-pointer -mabi=aapcs -fno-unroll-loops -ffast-math -ftree-vectorize" CACHE INTERNAL "cxx compiler flags")
+SET(CMAKE_C_FLAGS "-mthumb -fno-builtin -mcpu=cortex-m3 -Wall -std=gnu99 -ffunction-sections -fdata-sections -fomit-frame-pointer -mabi=aapcs -fno-unroll-loops -ffast-math -ftree-vectorize" CACHE INTERNAL "c compiler flags")
+SET(CMAKE_CXX_FLAGS "-mthumb -fno-builtin -mcpu=cortex-m3 -Wall -std=c++11 -ffunction-sections -fdata-sections -fomit-frame-pointer -mabi=aapcs -fno-unroll-loops -ffast-math -ftree-vectorize" CACHE INTERNAL "cxx compiler flags")
 SET(CMAKE_ASM_FLAGS "-mthumb -mcpu=cortex-m3" CACHE INTERNAL "asm compiler flags")
 
-SET(CMAKE_EXE_LINKER_FLAGS "-nostartfiles -Wl,--gc-sections -mthumb -mcpu=cortex-m3 -flto -mabi=aapcs" CACHE INTERNAL "executable linker flags")
-SET(CMAKE_MODULE_LINKER_FLAGS "-mthumb -mcpu=cortex-m3 -flto -mabi=aapcs" CACHE INTERNAL "module linker flags")
-SET(CMAKE_SHARED_LINKER_FLAGS "-mthumb -mcpu=cortex-m3 -flto -mabi=aapcs" CACHE INTERNAL "shared linker flags")
+SET(CMAKE_EXE_LINKER_FLAGS "-nostartfiles -Wl,--gc-sections -mthumb -mcpu=cortex-m3 -mabi=aapcs" CACHE INTERNAL "executable linker flags")
+SET(CMAKE_MODULE_LINKER_FLAGS "-mthumb -mcpu=cortex-m3 -mabi=aapcs" CACHE INTERNAL "module linker flags")
+SET(CMAKE_SHARED_LINKER_FLAGS "-mthumb -mcpu=cortex-m3 -mabi=aapcs" CACHE INTERNAL "shared linker flags")
 
 SET(STM32_CHIP_TYPES CL HD HD_VL MD MD_VL LD LD_VL XL CACHE INTERNAL "stm32f1 chip types")
 SET(STM32_CODES "10[57]" "10[13].[CDE]" "100.[CDE]" "10[123].[8B]" "100.[8B]" "10[123].[46]" "100.[46]" "10[13].[FG]")

+ 5 - 5
gcc_stm32f4.cmake

@@ -1,10 +1,10 @@
-SET(CMAKE_C_FLAGS "-mthumb -flto -fno-builtin -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -Wall -std=c99 -ffunction-sections -fdata-sections -fomit-frame-pointer -mabi=aapcs -fno-unroll-loops -ffast-math -ftree-vectorize" CACHE INTERNAL "c compiler flags")
-SET(CMAKE_CXX_FLAGS "-mthumb -flto -fno-builtin -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -Wall -std=c++11 -ffunction-sections -fdata-sections -fomit-frame-pointer -mabi=aapcs -fno-unroll-loops -ffast-math -ftree-vectorize" CACHE INTERNAL "cxx compiler flags")
+SET(CMAKE_C_FLAGS "-mthumb -fno-builtin -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -Wall -std=gnu99 -ffunction-sections -fdata-sections -fomit-frame-pointer -mabi=aapcs -fno-unroll-loops -ffast-math -ftree-vectorize" CACHE INTERNAL "c compiler flags")
+SET(CMAKE_CXX_FLAGS "-mthumb -fno-builtin -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -Wall -std=c++11 -ffunction-sections -fdata-sections -fomit-frame-pointer -mabi=aapcs -fno-unroll-loops -ffast-math -ftree-vectorize" CACHE INTERNAL "cxx compiler flags")
 SET(CMAKE_ASM_FLAGS "-mthumb -mcpu=cortex-m4" CACHE INTERNAL "asm compiler flags")
 
-SET(CMAKE_EXE_LINKER_FLAGS "-nostartfiles -Wl,--gc-sections -mthumb -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -flto -mabi=aapcs" CACHE INTERNAL "executable linker flags")
-SET(CMAKE_MODULE_LINKER_FLAGS "-mthumb -mcpu=cortex-m4 -flto -mfpu=fpv4-sp-d16 -mfloat-abi=hard -mabi=aapcs" CACHE INTERNAL "module linker flags")
-SET(CMAKE_SHARED_LINKER_FLAGS "-mthumb -mcpu=cortex-m4 -flto -mfpu=fpv4-sp-d16 -mfloat-abi=hard -mabi=aapcs" CACHE INTERNAL "shared linker flags")
+SET(CMAKE_EXE_LINKER_FLAGS "-nostartfiles -Wl,--gc-sections -mthumb -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -mabi=aapcs" CACHE INTERNAL "executable linker flags")
+SET(CMAKE_MODULE_LINKER_FLAGS "-mthumb -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -mabi=aapcs" CACHE INTERNAL "module linker flags")
+SET(CMAKE_SHARED_LINKER_FLAGS "-mthumb -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -mabi=aapcs" CACHE INTERNAL "shared linker flags")
 
 SET(STM32_CHIP_TYPES 401xx 40_41xxx 427_437xx 429_439xx CACHE INTERNAL "stm32f4 chip types")
 SET(STM32_CODES "401.[BC]" "4[01][57].[EG]" "4[23]7.[EGI]" "4[23]9.[EGI]")

+ 2 - 0
stm32-blinky/CMakeLists.txt

@@ -16,6 +16,8 @@ SET(PROJECT_SOURCES
     main.c
 )
 
+SET(STM32_LINKER_SCRIPT ${CMSIS_LINKER_SCRIPT})
+
 ADD_EXECUTABLE(${CMAKE_PROJECT_NAME} ${PROJECT_SOURCES} ${CMSIS_STARTUP_SOURCE})
 TARGET_LINK_LIBRARIES(${CMAKE_PROJECT_NAME} ${CMSIS_LIBRARIES} ${StdPeriphLib_LIBRARIES})
 

+ 2 - 0
stm32-newlib/CMakeLists.txt

@@ -17,6 +17,8 @@ SET(PROJECT_SOURCES
     newlib.c
 )
 
+SET(STM32_LINKER_SCRIPT ${CMSIS_LINKER_SCRIPT})
+
 ADD_EXECUTABLE(${CMAKE_PROJECT_NAME} ${PROJECT_SOURCES} ${CMSIS_STARTUP_SOURCE})
 TARGET_LINK_LIBRARIES(${CMAKE_PROJECT_NAME} ${CMSIS_LIBRARIES} ${StdPeriphLib_LIBRARIES})
 

+ 3 - 2
stm32-template/CMakeLists.txt

@@ -8,15 +8,16 @@ FIND_PACKAGE(CMSIS REQUIRED)
 INCLUDE_DIRECTORIES(
     ${CMAKE_CURRENT_SOURCE_DIR}
     ${CMSIS_INCLUDE_DIR}
-    ${StdPeriphLib_INCLUDE_DIR}
 )
 
 SET(PROJECT_SOURCES
     main.c
 )
 
+SET(STM32_LINKER_SCRIPT ${CMSIS_LINKER_SCRIPT})
+
 ADD_EXECUTABLE(${CMAKE_PROJECT_NAME} ${PROJECT_SOURCES} ${CMSIS_STARTUP_SOURCE})
-TARGET_LINK_LIBRARIES(${CMAKE_PROJECT_NAME} ${CMSIS_LIBRARIES} ${StdPeriphLib_LIBRARIES})
+TARGET_LINK_LIBRARIES(${CMAKE_PROJECT_NAME} ${CMSIS_LIBRARIES})
 
 STM32_SET_TARGET_PROPERTIES(${CMAKE_PROJECT_NAME})
 STM32_ADD_HEX_BIN_TARGETS(${CMAKE_PROJECT_NAME})