# gcc embedded strange '-march=armv7e-m+fp' added to compiler flags when crossbuilding

**URL:** https://discourse.cmake.org/t/gcc-embedded-strange-march-armv7e-m-fp-added-to-compiler-flags-when-crossbuilding/7205
**Category:** Usage
**Tags:** os:windows
**Created:** [January 5, 2023, 9:45pm UTC](https://discourse.cmake.org/t/gcc-embedded-strange-march-armv7e-m-fp-added-to-compiler-flags-when-crossbuilding/7205 "2023-01-05T21:45:58Z")
**Posts on this page:** 3
**Page:** 1

<div class="post-metadata">

### Author: ![JuliusCaesar](https://discourse.cmake.org/letter_avatar_proxy/v4/letter/j/85e7bf/32.png) [@JuliusCaesar](https://discourse.cmake.org/u/JuliusCaesar)
#### Post date: [January 5, 2023, 9:45pm UTC](https://discourse.cmake.org/t/gcc-embedded-strange-march-armv7e-m-fp-added-to-compiler-flags-when-crossbuilding/7205/1 "2023-01-05T21:45:58Z")

</div>

Hey guys,  
I’m trying to cross build an embedded target (arm-none-eabi).  
On the compiler invocation I have noticed that CMake adds some extra ‘-march=armv7e-m+fp’, which overwrites my compiler flags.

The flags I need are those

> -mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 --specs=nosys.specs -v

My Toolchain file looks like this

> include(CMakePrintHelpers)
> 
> set(CMAKE\_SYSTEM\_NAME Generic)  
> set(CMAKE\_SYSTEM\_PROCESSOR arm)
> 
> set(CMAKE\_TRY\_COMPILE\_TARGET\_TYPE STATIC\_LIBRARY)
> 
> if(WIN32)  
> set(COMPILER\_EXE\_SUFFIX “.exe”)  
> else()  
> set(COMPILER\_EXE\_SUFFIX “”)  
> endif()  
> message(“CMAKE\_TOOLCHAIN\_FILE is ${CMAKE\_TOOLCHAIN\_FILE}”)
> 
> if(EXISTS ${BAREMETAL\_ARM\_TOOLCHAIN\_PATH})  
> message(STATUS “Cross compiler directory ${BAREMETAL\_ARM\_TOOLCHAIN\_PATH} exists…”)  
> else()  
> message(STATUS “Cross compiler directory (${BAREMETAL\_ARM\_TOOLCHAIN\_PATH}) does not exist is it set in the Conan Profile?”)  
> endif()
> 
> set(CMAKE\_AR ${BAREMETAL\_ARM\_TOOLCHAIN\_PATH}arm-none-eabi-ar${COMPILER\_EXE\_SUFFIX})  
> set(CMAKE\_ASM\_COMPILER ${BAREMETAL\_ARM\_TOOLCHAIN\_PATH}arm-none-eabi-gcc${COMPILER\_EXE\_SUFFIX})  
> set(CMAKE\_C\_COMPILER ${BAREMETAL\_ARM\_TOOLCHAIN\_PATH}arm-none-eabi-gcc${COMPILER\_EXE\_SUFFIX})  
> set(CMAKE\_CXX\_COMPILER ${BAREMETAL\_ARM\_TOOLCHAIN\_PATH}arm-none-eabi-g++${COMPILER\_EXE\_SUFFIX})  
> set(CMAKE\_LINKER ${BAREMETAL\_ARM\_TOOLCHAIN\_PATH}arm-none-eabi-ld${COMPILER\_EXE\_SUFFIX})  
> set(CMAKE\_OBJCOPY ${BAREMETAL\_ARM\_TOOLCHAIN\_PATH}arm-none-eabi-objcopy${COMPILER\_EXE\_SUFFIX} CACHE INTERNAL “”)  
> set(CMAKE\_RANLIB ${BAREMETAL\_ARM\_TOOLCHAIN\_PATH}arm-none-eabi-ranlib${COMPILER\_EXE\_SUFFIX} CACHE INTERNAL “”)  
> set(CMAKE\_SIZE ${BAREMETAL\_ARM\_TOOLCHAIN\_PATH}arm-none-eabi-size${COMPILER\_EXE\_SUFFIX} CACHE INTERNAL “”)  
> set(CMAKE\_STRIP ${BAREMETAL\_ARM\_TOOLCHAIN\_PATH}arm-none-eabi-strip${COMPILER\_EXE\_SUFFIX} CACHE INTERNAL “”)
> 
> if(NOT COMPILER\_ARCH\_FLAGS)  
> message(WARNING “COMPILER\_ARCH\_FLAGS not set… are they set via the conan profile?”)  
> else()  
> message(“COMPILER\_ARCH\_FLAGS exist. Value ${COMPILER\_ARCH\_FLAGS}”)  
> endif()
> 
> set(CMAKE\_C\_FLAGS\_INIT “${COMPILER\_ARCH\_FLAGS} -fdata-sections -ffunction-sections” CACHE INTERNAL “” FORCE)  
> set(CMAKE\_CXX\_FLAGS\_INIT "${CMAKE\_C\_FLAGS\_INIT} " CACHE INTERNAL “” FORCE)
> 
> set(CMAKE\_EXE\_LINKER\_FLAGS\_INIT “${LINKER\_ARCH\_FLAGS} -Wl,–gc-sections” CACHE INTERNAL “”)
> 
> set(CMAKE\_C\_FLAGS\_DEBUG\_INIT “-Og -g” CACHE INTERNAL “”)  
> set(CMAKE\_C\_FLAGS\_RELEASE\_INIT “-Os -DNDEBUG” CACHE INTERNAL “”)  
> set(CMAKE\_CXX\_FLAGS\_DEBUG\_INIT “${CMAKE\_C\_FLAGS\_DEBUG}” CACHE INTERNAL “”)  
> set(CMAKE\_CXX\_FLAGS\_RELEASE\_INIT “${CMAKE\_C\_FLAGS\_RELEASE}” CACHE INTERNAL “”)
> 
> set(CMAKE\_FIND\_ROOT\_PATH\_MODE\_PROGRAM NEVER)  
> set(CMAKE\_FIND\_ROOT\_PATH\_MODE\_LIBRARY ONLY)  
> set(CMAKE\_FIND\_ROOT\_PATH\_MODE\_INCLUDE ONLY)
> 
> cmake\_print\_variables(CMAKE\_C\_FLAGS\_DEBUG\_INIT CMAKE\_C\_FLAGS\_RELEASE\_INIT CMAKE\_CXX\_FLAGS\_DEBUG\_INIT CMAKE\_CXX\_FLAGS\_RELEASE\_INIT)

The full sample project can be downloaded from [here](https://github.com/Ju1He1/FreeRTOSTest).  
Just run the arm\_none\_eabi Preset and you will notice a march=armv7e-m+fp on the compiler output line.  
Do you know where this extra arch flag is coming from?  
Thx guys

---

<div class="post-metadata">

### Author: ![ben.boeckel](https://discourse.cmake.org/letter_avatar_proxy/v4/letter/b/ea5d25/32.png) [@ben.boeckel](https://discourse.cmake.org/u/ben.boeckel)
#### Post date: [January 6, 2023, 6:09pm UTC](https://discourse.cmake.org/t/gcc-embedded-strange-march-armv7e-m-fp-added-to-compiler-flags-when-crossbuilding/7205/2 "2023-01-06T18:09:58Z")

</div>

I’d configure with `cmake --trace-expand` to see if anything mentions it first. If not, I don’t see anything like that in CMake codebase at least…

---

<div class="post-metadata">

### Author: ![JuliusCaesar](https://discourse.cmake.org/letter_avatar_proxy/v4/letter/j/85e7bf/32.png) [@JuliusCaesar](https://discourse.cmake.org/u/JuliusCaesar)
#### Post date: [January 13, 2023, 5:33pm UTC](https://discourse.cmake.org/t/gcc-embedded-strange-march-armv7e-m-fp-added-to-compiler-flags-when-crossbuilding/7205/3 "2023-01-13T17:33:29Z")

</div>

Hey Ben,  
thx this was very helpfull. Looks like GCC implicitly adds this flag. 🙂
