I’m using MINGW64 bash shell; note that in the path, I have several gcc executables:
$ which gcc
/mingw64/bin/gcc
$ cygpath -m $(which gcc)
C:/msys64/mingw64/bin/gcc.exe
$ ls -1 C:/msys64/mingw64/bin/*gcc.exe
C:/msys64/mingw64/bin/arm-none-eabi-gcc.exe*
C:/msys64/mingw64/bin/gcc.exe*
C:/msys64/mingw64/bin/x86_64-w64-mingw32-gcc.exe*
$ gcc --version
gcc.exe (Rev2, Built by MSYS2 project) 14.2.0
$ arm-none-eabi-gcc --version
arm-none-eabi-gcc.exe (GCC) 13.3.0
So, I’ve got FreeRTOS-Kernel here:
$ (cd C:/src/FreeRTOS-Kernel/; git status -uno)
HEAD detached at V11.1.0
nothing to commit (use -u to show untracked files)
and can see there is an example at $FREERTOS_KERNEL_PATH/examples/cmake_example
; so I wanted to try and build it, like this:
$ cd C:/src/FreeRTOS-Kernel/examples/cmake_example
$ mkdir build && cd build
$ C:/Program\ Files/CMake/bin/cmake.exe .. -DCMAKE_BUILD_TYPE=Debug -G "MSYS Makefiles"
-- The C compiler identification is GNU 14.2.0
-- The CXX compiler identification is GNU 14.2.0
-- Check for working C compiler: C:/msys64/mingw64/bin/gcc.exe
-- Check for working C compiler: C:/msys64/mingw64/bin/gcc.exe - works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: C:/msys64/mingw64/bin/g++.exe
-- Check for working CXX compiler: C:/msys64/mingw64/bin/g++.exe - works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: C:/src/FreeRTOS-Kernel/examples/cmake_example/build
$ make
Scanning dependencies of target freertos_kernel_port
[ 8%] Building C object FreeRTOS-Kernel/portable/CMakeFiles/freertos_kernel_port.dir/template/port.c.obj
[ 8%] Built target freertos_kernel_port
Scanning dependencies of target freertos_kernel
[ 16%] Building C object FreeRTOS-Kernel/CMakeFiles/freertos_kernel.dir/croutine.c.obj
[ 25%] Building C object FreeRTOS-Kernel/CMakeFiles/freertos_kernel.dir/event_groups.c.obj
C:/src/FreeRTOS-Kernel/event_groups.c: In function 'xEventGroupSync':
C:/src/FreeRTOS-Kernel/event_groups.c:197:9: error: integer constant is too large for 'unsigned long' type [-Werror=long-long]
197 | configASSERT( ( uxBitsToWaitFor & eventEVENT_BITS_CONTROL_BYTES ) == 0 );
| ^~~~~~~~~~~~
C:/src/FreeRTOS-Kernel/event_groups.c:231:21: error: integer constant is too large for 'unsigned long' type [-Werror=long-long]
231 | vTaskPlaceOnUnorderedEventList( &( pxEventBits->xTasksWaitingForBits ), ( uxBitsToWaitFor | eventCLEAR_EVENTS_ON_EXIT_BIT | eventWAIT_FOR_ALL_BITS ), xTicksToWait );
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
C:/src/FreeRTOS-Kernel/event_groups.c:231:21: error: integer constant is too large for 'unsigned long' type [-Werror=long-long]
C:/src/FreeRTOS-Kernel/event_groups.c:267:13: error: integer constant is too large for 'unsigned long' type [-Werror=long-long]
267 | if( ( uxReturn & eventUNBLOCKED_DUE_TO_BIT_SET ) == ( EventBits_t ) 0 )
| ^~
C:/src/FreeRTOS-Kernel/event_groups.c:298:13: error: integer constant is too large for 'unsigned long' type [-Werror=long-long]
298 | uxReturn &= ~eventEVENT_BITS_CONTROL_BYTES;
| ^~~~~~~~
C:/src/FreeRTOS-Kernel/event_groups.c: In function 'xEventGroupWaitBits':
C:/src/FreeRTOS-Kernel/event_groups.c:328:9: error: integer constant is too large for 'unsigned long' type [-Werror=long-long]
328 | configASSERT( ( uxBitsToWaitFor & eventEVENT_BITS_CONTROL_BYTES ) == 0 );
| ^~~~~~~~~~~~
C:/src/FreeRTOS-Kernel/event_groups.c:375:21: error: integer constant is too large for 'unsigned long' type [-Werror=long-long]
375 | uxControlBits |= eventCLEAR_EVENTS_ON_EXIT_BIT;
| ^~~~~~~~~~~~~
C:/src/FreeRTOS-Kernel/event_groups.c:384:21: error: integer constant is too large for 'unsigned long' type [-Werror=long-long]
384 | uxControlBits |= eventWAIT_FOR_ALL_BITS;
| ^~~~~~~~~~~~~
C:/src/FreeRTOS-Kernel/event_groups.c:423:13: error: integer constant is too large for 'unsigned long' type [-Werror=long-long]
423 | if( ( uxReturn & eventUNBLOCKED_DUE_TO_BIT_SET ) == ( EventBits_t ) 0 )
| ^~
C:/src/FreeRTOS-Kernel/event_groups.c:458:13: error: integer constant is too large for 'unsigned long' type [-Werror=long-long]
458 | uxReturn &= ~eventEVENT_BITS_CONTROL_BYTES;
| ^~~~~~~~
C:/src/FreeRTOS-Kernel/event_groups.c: In function 'xEventGroupClearBits':
C:/src/FreeRTOS-Kernel/event_groups.c:483:9: error: integer constant is too large for 'unsigned long' type [-Werror=long-long]
483 | configASSERT( ( uxBitsToClear & eventEVENT_BITS_CONTROL_BYTES ) == 0 );
| ^~~~~~~~~~~~
C:/src/FreeRTOS-Kernel/event_groups.c: In function 'xEventGroupSetBits':
C:/src/FreeRTOS-Kernel/event_groups.c:563:9: error: integer constant is too large for 'unsigned long' type [-Werror=long-long]
563 | configASSERT( ( uxBitsToSet & eventEVENT_BITS_CONTROL_BYTES ) == 0 );
| ^~~~~~~~~~~~
C:/src/FreeRTOS-Kernel/event_groups.c:584:17: error: integer constant is too large for 'unsigned long' type [-Werror=long-long]
584 | uxControlBits = uxBitsWaitedFor & eventEVENT_BITS_CONTROL_BYTES;
| ^~~~~~~~~~~~~
C:/src/FreeRTOS-Kernel/event_groups.c:585:17: error: integer constant is too large for 'unsigned long' type [-Werror=long-long]
585 | uxBitsWaitedFor &= ~eventEVENT_BITS_CONTROL_BYTES;
| ^~~~~~~~~~~~~~~
C:/src/FreeRTOS-Kernel/event_groups.c:587:17: error: integer constant is too large for 'unsigned long' type [-Werror=long-long]
587 | if( ( uxControlBits & eventWAIT_FOR_ALL_BITS ) == ( EventBits_t ) 0 )
| ^~
C:/src/FreeRTOS-Kernel/event_groups.c:612:21: error: integer constant is too large for 'unsigned long' type [-Werror=long-long]
612 | if( ( uxControlBits & eventCLEAR_EVENTS_ON_EXIT_BIT ) != ( EventBits_t ) 0 )
| ^~
C:/src/FreeRTOS-Kernel/event_groups.c:626:21: error: integer constant is too large for 'unsigned long' type [-Werror=long-long]
626 | vTaskRemoveFromUnorderedEventList( pxListItem, pxEventBits->uxEventBits | eventUNBLOCKED_DUE_TO_BIT_SET );
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
C:/src/FreeRTOS-Kernel/event_groups.c: In function 'vEventGroupDelete':
C:/src/FreeRTOS-Kernel/event_groups.c:667:17: error: integer constant is too large for 'unsigned long' type [-Werror=long-long]
667 | vTaskRemoveFromUnorderedEventList( pxTasksWaitingForBits->xListEnd.pxNext, eventUNBLOCKED_DUE_TO_BIT_SET );
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cc1.exe: all warnings being treated as errors
make[2]: *** [FreeRTOS-Kernel/CMakeFiles/freertos_kernel.dir/build.make:98: FreeRTOS-Kernel/CMakeFiles/freertos_kernel.dir/event_groups.c.obj] Error 1
make[1]: *** [CMakeFiles/Makefile2:185: FreeRTOS-Kernel/CMakeFiles/freertos_kernel.dir/all] Error 2
make: *** [Makefile:104: all] Error 2
So, in this case, CMake picked up the “plain”/“Windows” GCC compiler, the CMake setup/configuration passed, however make
fails compilation, mostly with a “integer constant is too large for ‘unsigned long’ type” error.
I thought this was caused by using the “Windows” GCC compiler; so I managed to “coax” CMake to instead use the ARM GCC compiles by adding this to cmake_example/CMakeLists.txt
:
cmake_minimum_required(VERSION 3.15)
find_program(CMAKE_C_COMPILER "arm-none-eabi-gcc.exe") # added
message("CMAKE_C_COMPILER ${CMAKE_C_COMPILER}") # added
set(CMAKE_CXX_COMPILER "arm-none-eabi-g++.exe") # added
project(example)
#...
Then, if I repeat the process in build subdirectory, I get this:
$ rm -rf *
$ /c/Program\ Files/CMake/bin/cmake.exe .. -DCMAKE_BUILD_TYPE=Debug -G "MSYS Makefiles"
CMAKE_C_COMPILER C:/msys64/mingw64/bin/arm-none-eabi-gcc.exe
-- The C compiler identification is GNU 13.3.0
-- The CXX compiler identification is GNU 13.3.0
-- Check for working C compiler: C:/msys64/mingw64/bin/arm-none-eabi-gcc.exe
-- Check for working C compiler: C:/msys64/mingw64/bin/arm-none-eabi-gcc.exe - broken
CMake Error at C:/Program Files/CMake/share/cmake-3.17/Modules/CMakeTestCCompiler.cmake:60 (message):
The C compiler
"C:/msys64/mingw64/bin/arm-none-eabi-gcc.exe"
is not able to compile a simple test program.
It fails with the following output:
Change Dir: C:/src/FreeRTOS-Kernel/examples/cmake_example/build/CMakeFiles/CMakeTmp
Run Build Command(s):C:/msys64/usr/bin/make.exe cmTC_8e671/fast && /usr/bin/make -f CMakeFiles/cmTC_8e671.dir/build.make CMakeFiles/cmTC_8e671.dir/build
make[1]: Entering directory '/c/src/FreeRTOS-Kernel/examples/cmake_example/build/CMakeFiles/CMakeTmp'
Building C object CMakeFiles/cmTC_8e671.dir/testCCompiler.c.obj
/C/msys64/mingw64/bin/arm-none-eabi-gcc.exe -o CMakeFiles/cmTC_8e671.dir/testCCompiler.c.obj -c /C/src/FreeRTOS-Kernel/examples/cmake_example/build/CMakeFiles/CMakeTmp/testCCompiler.c
Linking C executable cmTC_8e671.exe
"/C/Program Files/CMake/bin/cmake.exe" -E rm -f CMakeFiles/cmTC_8e671.dir/objects.a
/C/msys64/mingw64/bin/ar.exe cr CMakeFiles/cmTC_8e671.dir/objects.a @CMakeFiles/cmTC_8e671.dir/objects1.rsp
/C/msys64/mingw64/bin/arm-none-eabi-gcc.exe -Wl,--whole-archive CMakeFiles/cmTC_8e671.dir/objects.a -Wl,--no-whole-archive -o cmTC_8e671.exe -Wl,--out-implib,libcmTC_8e671.dll.a -Wl,--major-image-version,0,--minor-image-version,0
C:/msys64/mingw64/bin/../lib/gcc/arm-none-eabi/13.3.0/../../../../arm-none-eabi/bin/ld.exe: unrecognized option '--major-image-version'
C:/msys64/mingw64/bin/../lib/gcc/arm-none-eabi/13.3.0/../../../../arm-none-eabi/bin/ld.exe: use the --help option for usage information
collect2.exe: error: ld returned 1 exit status
make[1]: *** [CMakeFiles/cmTC_8e671.dir/build.make:109: cmTC_8e671.exe] Error 1
make[1]: Leaving directory '/c/src/FreeRTOS-Kernel/examples/cmake_example/build/CMakeFiles/CMakeTmp'
make: *** [Makefile:141: cmTC_8e671/fast] Error 2
CMake will not be able to correctly generate this project.
Call Stack (most recent call first):
CMakeLists.txt:7 (project)
-- Configuring incomplete, errors occurred!
See also "C:/src/FreeRTOS-Kernel/examples/cmake_example/build/CMakeFiles/CMakeOutput.log".
See also "C:/src/FreeRTOS-Kernel/examples/cmake_example/build/CMakeFiles/CMakeError.log".
So, now not even CMake setup/configuration passes, and it is actually linking of “simple test program” that fails with “unrecognized option ‘–major-image-version’”.
So, how am I supposed to build thiscmake_example
?