Skip to content

Commit d80b7ae

Browse files
StephanKaarnemertz
authored andcommitted
added embedded toolchain
1 parent 098ae9a commit d80b7ae

12 files changed

Lines changed: 512 additions & 22 deletions

File tree

.github/workflows/build_cmake.yml

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,3 +138,52 @@ jobs:
138138
- name: Build
139139
shell: bash
140140
run: cmake --build --preset build-unixlike-${{ matrix.compiler.preset }}-${{ matrix.buildtype }}-static-analysis
141+
142+
linux-cross-compiling-armv7:
143+
name: ARM GCC, ${{ matrix.os }}, ${{ matrix.buildtype }}
144+
runs-on: ${{ matrix.os }}
145+
strategy:
146+
fail-fast: false # 'false' means Don't stop matrix workflows even if some matrix entry fails.
147+
matrix:
148+
os: [ubuntu-22.04]
149+
buildtype: [debug, release]
150+
151+
steps:
152+
- uses: actions/checkout@v3
153+
154+
- name: Cache
155+
uses: actions/cache@v3
156+
env:
157+
cache-name: cache-conan-modules
158+
with:
159+
path: |
160+
${{ env.CONAN_USER_HOME }}
161+
~/.cache/pip
162+
key: ${{ runner.os }}-${{ env.BUILD_TYPE }}-${{ hashFiles('CMakeLists.txt') }}-${{ hashFiles('cmake/Conan.cmake') }}
163+
164+
- name: Install conan
165+
shell: bash
166+
run: |
167+
python3 -m pip install --upgrade pip setuptools conan==1.59
168+
source ~/.profile
169+
170+
- name: Install dependencies
171+
run: |
172+
sudo apt update
173+
sudo apt install ninja-build wget
174+
shell: bash
175+
176+
- name: Install GCC ARM
177+
run: |
178+
wget -O archive.tar.xz "https://developer.arm.com/-/media/Files/downloads/gnu/12.2.rel1/binrel/arm-gnu-toolchain-12.2.rel1-x86_64-arm-none-eabi.tar.xz?rev=7bd049b7a3034e64885fa1a71c12f91d&hash=732D909FA8F68C0E1D0D17D08E057619" && \
179+
echo 84be93d0f9e96a15addd490b6e237f588c641c8afdf90e7610a628007fc96867 archive.tar.xz > /tmp/archive.sha256 && sha256sum -c /tmp/archive.sha256 && rm /tmp/archive.sha256 && \
180+
tar xf archive.tar.xz -C /opt
181+
shell: bash
182+
183+
- name: Configure via CMake
184+
shell: bash
185+
run: cmake --preset gcc-arm-${{ matrix.buildtype }}
186+
187+
- name: Build
188+
shell: bash
189+
run: cmake --build --preset gcc-arm-${{ matrix.buildtype }}

CMakeLists.txt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,12 @@ ENDIF()
100100
INCLUDE(cmake/Conan.cmake)
101101
RUN_CONAN()
102102

103+
ADD_SUBDIRECTORY(src)
104+
105+
IF(CMAKE_CROSSCOMPILING)
106+
RETURN()
107+
ENDIF()
108+
103109
IF(ENABLE_TESTING)
104110
ENABLE_TESTING()
105111
MESSAGE("Building Tests. Be sure to check out test/constexpr_tests for constexpr testing")
@@ -110,5 +116,3 @@ IF(ENABLE_FUZZING)
110116
MESSAGE("Building Fuzz Tests, using fuzzing sanitizer https://www.llvm.org/docs/LibFuzzer.html")
111117
ADD_SUBDIRECTORY(fuzz_test)
112118
ENDIF()
113-
114-
ADD_SUBDIRECTORY(src)

CMakePresets.json

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -318,6 +318,42 @@
318318
"ENABLE_CLANG_TIDY": "ON",
319319
"ENABLE_INCLUDE_WHAT_YOU_USE": "ON"
320320
}
321+
},
322+
{
323+
"name": "gcc-arm-debug",
324+
"generator": "Ninja",
325+
"toolchainFile": "${sourceDir}/cmake/arm-cortex-gnu/ArmCortexM4Gnu.cmake",
326+
"binaryDir": "${sourceDir}/out/build/${presetName}",
327+
"installDir": "${sourceDir}/out/install/${presetName}",
328+
"cacheVariables": {
329+
"CPP_STARTER_USE_EMBEDDED_TOOLCHAIN": "ON",
330+
"CMAKE_BUILD_TYPE": "Debug",
331+
"CMAKE_SYSTEM_NAME": "Linux",
332+
"CONAN_ARCHITECTURE": "armv7",
333+
"CMAKE_CROSSCOMPILE": "ON",
334+
"CMAKE_SYSTEM_PROCESSOR": "arm",
335+
"CMAKE_TRY_COMPILE_TARGET_TYPE": "STATIC_LIBRARY",
336+
"CMAKE_CXX_COMPILER_FORCED": "ON",
337+
"CMAKE_CROSSCOMPILING": "TRUE"
338+
}
339+
},
340+
{
341+
"name": "gcc-arm-release",
342+
"generator": "Ninja",
343+
"toolchainFile": "${sourceDir}/cmake/arm-cortex-gnu/ArmCortexM4Gnu.cmake",
344+
"binaryDir": "${sourceDir}/out/build/${presetName}",
345+
"installDir": "${sourceDir}/out/install/${presetName}",
346+
"cacheVariables": {
347+
"CPP_STARTER_USE_EMBEDDED_TOOLCHAIN": "ON",
348+
"CMAKE_BUILD_TYPE": "Release",
349+
"CMAKE_SYSTEM_NAME": "Linux",
350+
"CONAN_ARCHITECTURE": "armv7",
351+
"CMAKE_CROSSCOMPILE": "ON",
352+
"CMAKE_SYSTEM_PROCESSOR": "arm",
353+
"CMAKE_TRY_COMPILE_TARGET_TYPE": "STATIC_LIBRARY",
354+
"CMAKE_CXX_COMPILER_FORCED": "ON",
355+
"CMAKE_CROSSCOMPILING": "TRUE"
356+
}
321357
}
322358
],
323359
"buildPresets": [
@@ -404,6 +440,14 @@
404440
{
405441
"name": "build-unixlike-clang-15-debug-static-analysis",
406442
"configurePreset": "unixlike-clang-15-debug-static-analysis"
443+
},
444+
{
445+
"name": "build-gcc-arm-debug",
446+
"configurePreset": "gcc-arm-debug"
447+
},
448+
{
449+
"name": "build-gcc-arm-release",
450+
"configurePreset": "gcc-arm-release"
407451
}
408452
],
409453
"testPresets": [

cmake/Conan.cmake

Lines changed: 35 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -66,26 +66,41 @@ MACRO(RUN_CONAN)
6666
SET(CONAN_HOST_PROFILE ${ProjectOptions_CONAN_HOST_PROFILE})
6767
ENDIF()
6868

69-
# PATH_OR_REFERENCE ${CMAKE_SOURCE_DIR} is used to tell conan to process
70-
# the external "conanfile.py" provided with the project
71-
# Alternatively a conanfile.txt could be used
72-
CONAN_CMAKE_INSTALL(
73-
PATH_OR_REFERENCE
74-
${CMAKE_SOURCE_DIR}
75-
BUILD
76-
missing
77-
# Pass compile-time configured options into conan
78-
OPTIONS
79-
${ProjectOptions_CONAN_OPTIONS}
80-
# Pass CMake compilers to Conan
81-
${CONAN_ENV}
82-
PROFILE_HOST
83-
${CONAN_HOST_PROFILE}
84-
PROFILE_BUILD
85-
${CONAN_BUILD_PROFILE}
86-
# Pass either autodetected settings or a conan profile
87-
${CONAN_SETTINGS}
88-
${OUTPUT_QUIET})
69+
IF(CMAKE_CROSSCOMPILING AND NOT CONAN_ARCHITECTURE)
70+
MESSAGE(FATAL_ERROR "The variable CONAN_ARCHITECTURE must be specified for cross-compiling")
71+
ENDIF()
72+
73+
IF(CMAKE_CROSSCOMPILING)
74+
CONAN_CMAKE_RUN(
75+
CONANFILE conanfile_embedded.txt
76+
BASIC_SETUP
77+
ARCH ${CONAN_ARCHITECTURE}
78+
ENV CC=${CMAKE_C_COMPILER}
79+
ENV CXX=${CMAKE_CXX_COMPILER}
80+
ENV CFLAGS=${CMAKE_C_FLAGS}
81+
ENV CXXFLAGS=${CMAKE_CXX_FLAGS}
82+
PROFILE_AUTO ALL
83+
BUILD missing
84+
)
85+
ELSE()
86+
CONAN_CMAKE_INSTALL(
87+
PATH_OR_REFERENCE
88+
${CMAKE_SOURCE_DIR}
89+
BUILD
90+
missing
91+
# Pass compile-time configured options into conan
92+
OPTIONS
93+
${ProjectOptions_CONAN_OPTIONS}
94+
# Pass CMake compilers to Conan
95+
${CONAN_ENV}
96+
PROFILE_HOST
97+
${CONAN_HOST_PROFILE}
98+
PROFILE_BUILD
99+
${CONAN_BUILD_PROFILE}
100+
# Pass either autodetected settings or a conan profile
101+
${CONAN_SETTINGS}
102+
${OUTPUT_QUIET})
103+
ENDIF()
89104
ENDFOREACH()
90105

91106
ENDIF()

cmake/Options.cmake

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ OPTION(CPP_STARTER_USE_SML "Enable compilation of SML sample" OFF)
3232
OPTION(CPP_STARTER_USE_BOOST_BEAST "Enable compilation of boost beast sample" OFF)
3333
OPTION(CPP_STARTER_USE_CROW "Enable compilation of crow sample" OFF)
3434
OPTION(CPP_STARTER_USE_CPPZMQ_PROTO "Enable compilation of protobuf and cppzmq sample" OFF)
35+
OPTION(CPP_STARTER_USE_EMBEDDED_TOOLCHAIN "Enable compilation an example cortex m4 project" OFF)
3536

3637
# Note: by default ENABLE_DEVELOPER_MODE is True
3738
# This means that all analysis (sanitizers, static analysis)
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
SET(TARGET_TRIPLET "arm-none-eabi")
2+
SET(ARM_COMPILER_VERSION 12.2.rel1)
3+
SET(ARM_COMPILER_PATH /opt/arm-gnu-toolchain-${ARM_COMPILER_VERSION}-x86_64-${TARGET_TRIPLET}/bin)
4+
# Without that flag CMake is not able to pass test compilation check
5+
SET(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
6+
7+
SET(CMAKE_C_COMPILER ${ARM_COMPILER_PATH}/${TARGET_TRIPLET}-gcc${ARM_COMPILER_EXT})
8+
SET(CMAKE_CXX_COMPILER ${ARM_COMPILER_PATH}/${TARGET_TRIPLET}-g++${ARM_COMPILER_EXT})
9+
SET(CMAKE_ASM_COMPILER ${ARM_COMPILER_PATH}/${TARGET_TRIPLET}-gcc${ARM_COMPILER_EXT})
10+
SET(CMAKE_LINKER ${ARM_COMPILER_PATH}/${TARGET_TRIPLET}-gcc${ARM_COMPILER_EXT})
11+
SET(CMAKE_SIZE_UTIL ${ARM_COMPILER_PATH}/${TARGET_TRIPLET}-size${ARM_COMPILER_EXT})
12+
SET(CMAKE_OBJCOPY ${ARM_COMPILER_PATH}/${TARGET_TRIPLET}-objcopy${ARM_COMPILER_EXT})
13+
SET(CMAKE_OBJDUMP ${ARM_COMPILER_PATH}/${TARGET_TRIPLET}-objdump${ARM_COMPILER_EXT})
14+
SET(CMAKE_NM_UTIL ${ARM_COMPILER_PATH}/${TARGET_TRIPLET}-gcc-nm${ARM_COMPILER_EXT})
15+
SET(CMAKE_AR ${ARM_COMPILER_PATH}/${TARGET_TRIPLET}-gcc-ar${ARM_COMPILER_EXT})
16+
SET(CMAKE_RANLIB ${ARM_COMPILER_PATH}/${TARGET_TRIPLET}-gcc-ranlib${ARM_COMPILER_EXT})
17+
18+
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
19+
SET(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
20+
21+
# Compiler and linker flags
22+
SET(CMAKE_COMMON_FLAGS "${MCPU_FLAGS} ${VFP_FLAGS} -g3 -ffunction-sections -fdata-sections -fno-strict-aliasing -fno-builtin -fno-common -Wall -Wshadow -Wdouble-promotion -Werror -Wno-unused-parameter")
23+
24+
SET(CMAKE_C_FLAGS_INIT "${CMAKE_COMMON_FLAGS}")
25+
SET(CMAKE_CXX_FLAGS_INIT "${CMAKE_COMMON_FLAGS}")
26+
SET(CMAKE_ASM_FLAGS_INIT "${CMAKE_COMMON_FLAGS}")
27+
SET(CMAKE_EXE_LINKER_FLAGS_INIT "${LD_FLAGS} --specs=nosys.specs -Wl,--gc-sections,-print-memory-usage")
28+
29+
SET(CMAKE_C_FLAGS_DEBUG_INIT "-O0")
30+
SET(CMAKE_CXX_ASM_FLAGS_DEBUG_INIT "-O0")
31+
SET(CMAKE_ASM_FLAGS_DEBUG_INIT "")
32+
SET(CMAKE_EXE_LINKER_FLAGS_DEBUG_INIT "")
33+
34+
SET(CMAKE_C_FLAGS_RELEASE_INIT "-Os -flto")
35+
SET(CMAKE_CXX_FLAGS_RELEASE_INIT "-Os -flto")
36+
SET(CMAKE_ASM_FLAGS_RELEASE_INIT "")
37+
SET(CMAKE_EXE_LINKER_FLAGS_RELEASE_INIT "-flto")
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
SET(MCPU_FLAGS "-mthumb -mcpu=cortex-m4")
2+
SET(VFP_FLAGS "-mfloat-abi=hard -mfpu=fpv4-sp-d16")
3+
4+
INCLUDE(${CMAKE_CURRENT_LIST_DIR}/ArmCortexGnuToolchain.cmake)

conanfile_embedded.txt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# Docs at https://docs.conan.io/en/latest/reference/conanfile_txt.html
2+
[requires]
3+
fmt/9.1.0
4+
sml/1.1.6
5+
6+
[generators]
7+
cmake
8+
9+
[options]
10+
fmt:header_only=True

src/CMakeLists.txt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,12 @@
11
# SML
2+
IF(CMAKE_CROSSCOMPILING)
3+
IF(CPP_STARTER_USE_EMBEDDED_TOOLCHAIN)
4+
MESSAGE("Using Embedded Toolchain")
5+
ADD_SUBDIRECTORY(embedded)
6+
ENDIF()
7+
RETURN()
8+
ENDIF()
9+
210
IF(CPP_STARTER_USE_SML)
311
MESSAGE("Using SML")
412
ADD_SUBDIRECTORY(sml)
@@ -22,6 +30,7 @@ IF(CPP_STARTER_USE_CPPZMQ_PROTO)
2230
ADD_SUBDIRECTORY(protobuf.cppzmq)
2331
ENDIF()
2432

33+
2534
# Generic test that uses conan libs
2635
ADD_EXECUTABLE(intro main.cpp)
2736
TARGET_LINK_LIBRARIES(

src/embedded/CMakeLists.txt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
SET(TARGET test_arm_gcc)
2+
3+
ADD_EXECUTABLE(${TARGET} main.cpp)
4+
TARGET_LINK_LIBRARIES(${TARGET} ${CONAN_LIBS})
5+
6+
SET_TARGET_PROPERTIES(${TARGET} PROPERTIES SUFFIX ".elf")
7+
TARGET_LINK_OPTIONS(${TARGET}
8+
PRIVATE
9+
-T${CMAKE_CURRENT_SOURCE_DIR}/linkerScript.ld
10+
-Wl,-Map=${TARGET}.map
11+
)
12+
ADD_CUSTOM_TARGET(${TARGET}.bin ALL
13+
DEPENDS ${TARGET}
14+
COMMAND ${CMAKE_OBJCOPY} -Obinary ${TARGET}.elf ${TARGET}.bin
15+
COMMAND ${CMAKE_OBJCOPY} -Oihex ${TARGET}.elf ${TARGET}.hex
16+
)

0 commit comments

Comments
 (0)