Under "project manager" in "Project" there is a "Toolchain/IDE" option and I am overjoyed to learn I can specify "Makefile" here.
I select my H747-DISCO board, take all the defaults, then:
/home/tom/CubeMX/FirstDefaults
cd /home/tom/CubeMX/FirstDefaults cd Makefile makeI get the error:
../../CM7/Core/Src/main.c:20:10: fatal error: main.h: No such file or directoryThis is because this is garbled "-I../..//u1CM7/Core/Inc". Some how the extra "/u1" has been inserted garbling the path. I fix this, editing the makefiles in CM4 and CM7.
/usr/lib/gcc/arm-none-eabi/13.1.0/include/stdint.h:9:16: fatal error: stdint.h: No such file or directory 9 | # include_nextThis is from within a standard gcc file. I add the switch "-ffreestanding" to the gcc options and that error goes away. This option is supposed to indicate:
Assert that compilation takes place in a freestanding environment. This implies -fno-builtin. A freestanding environment is one in which the standard library may not exist, and program startup may not necessarily be at main. The most obvious example is an OS kernel.Now I get:
../../Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_def.h:32:10: fatal error: math.h: No such file or directory 32 | #includeThis is what is known as "include file hell". Do we really need math.h? I comment the include out in these two files:
stm32h7xx_hal_def.h:#include(Indeed this turns out to be a bad idea. We need "float_t" which is defined in math.h; see below.stm32h7xx_ll_rcc.h:#include
Now I get this:
arm-none-eabi-gcc -c -mcpu=cortex-m7 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard -DCORE_CM4 -DUSE_HAL_DRIVER -DSTM32H747xx -I../../CM4/Core/Inc -I../../Drivers/STM32H7xx_HAL_Driver/Inc -I../../Drivers/STM32H7xx_HAL_Driver/Inc/Legacy -I../../Drivers/CMSIS/Device/ST/STM32H7xx/Include -I../../Drivers/CMSIS/Include -Og -ffreestanding -Wall -fdata-sections -ffunction-sections -g -gdwarf-2 -MMD -MP -MF"build/main.d" -Wa,-a,-ad,-alms=build/main.lst ../../CM4/Core/Src/main.c -o build/main.o In file included from ../../CM4/Core/Src/main.c:21: ../../CM4/Core/Inc/adc.h:30:10: fatal error: string.h: No such file or directory 30 | #include "string.h"This has me wondering if adding the -ffreestanding switch is the wrong thing to do. I get the same error about stdint from one of my own Makefiles:
arm-none-eabi-gcc -mcpu=cortex-m7 -mthumb -g -c -o main.o main.c In file included from main.c:5: /usr/lib/gcc/arm-none-eabi/13.1.0/include/stdint.h:9:16: fatal error: stdint.h: No such file or directory 9 | # include_nextBased on an online tip, I do this:
su dnf install arm-none-eabi-newlibIndeed, this fixes the problem for my own project makefile. And the CubeMX compile goes along much further until it hits:
../../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_rcc.c: In function 'HAL_RCC_GetSysClockFreq': ../../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_rcc.c:1391:3: error: unknown type name 'float_t'; did you mean 'float'? 1391 | float_t fracn1, pllvco;I go back and uncomment the includes of math.h. That fixes this problem and the build now goes to completion with just a few warnings. It ends as follows:
arm-none-eabi-size build/FirstDefaults_CM4.elf text data bss dec hex filename 33620 216 4640 38476 964c build/FirstDefaults_CM4.elf arm-none-eabi-objcopy -O ihex build/FirstDefaults_CM4.elf build/FirstDefaults_CM4.hex arm-none-eabi-objcopy -O binary -S build/FirstDefaults_CM4.elf build/FirstDefaults_CM4.bin arm-none-eabi-size build/FirstDefaults_CM7.elf text data bss dec hex filename 14180 24 1720 15924 3e34 build/FirstDefaults_CM7.elf arm-none-eabi-objcopy -O ihex build/FirstDefaults_CM7.elf build/FirstDefaults_CM7.hex arm-none-eabi-objcopy -O binary -S build/FirstDefaults_CM7.elf build/FirstDefaults_CM7.bin make[1]: Leaving directory '/u1/home/tom/CubeMX/FirstDefaults/Makefile/CM7'Yes, it builds two executables, one for the CM7 core and one for the CM4 core.
CubeMX/FirstDefaults/Makefile/CM7/build CubeMX/FirstDefaults/Makefile/CM4/build
Adding -ffreestanding did not hurt or help and it sort of seems like the right thing.
I needed to install this mysterious "newlib" package. The claim is:
Newlib is a C library intended for use on embedded systems. It is a conglomeration of several library parts, all under free software licenses that make them easily usable on embedded products.This link tells more about it than I find anywhere else.
Tom's Computer Info / tom@mmto.org