Skip to content

Commit 5a5a993

Browse files
authored
Add cross arm builds (#9)
1 parent 4c47fb1 commit 5a5a993

9 files changed

Lines changed: 423 additions & 0 deletions

.github/workflows/ci.yml

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,57 @@ jobs:
2020
name: Linux
2121
path: build/allOutputs
2222

23+
build-linux-arm32:
24+
name: "Build - Linux Arm32"
25+
runs-on: ubuntu-latest
26+
container: wpilib/raspbian-cross-ubuntu:bullseye-22.04
27+
steps:
28+
- uses: actions/checkout@v2
29+
with:
30+
submodules: true
31+
32+
- name: Build
33+
run: ./gradlew build -Pforcecrossbuild=linux-arm32
34+
35+
- uses: actions/upload-artifact@v2
36+
with:
37+
name: Linux Arm32
38+
path: build/allOutputs
39+
40+
build-linux-arm64:
41+
name: "Build - Linux Arm64"
42+
runs-on: ubuntu-latest
43+
container: wpilib/aarch64-cross-ubuntu:bullseye-22.04
44+
steps:
45+
- uses: actions/checkout@v2
46+
with:
47+
submodules: true
48+
49+
- name: Build
50+
run: ./gradlew build -Pforcecrossbuild=linux-arm64
51+
52+
- uses: actions/upload-artifact@v2
53+
with:
54+
name: Linux Arm64
55+
path: build/allOutputs
56+
57+
build-linux-athena:
58+
name: "Build - Linux Athena"
59+
runs-on: ubuntu-latest
60+
container: wpilib/roborio-cross-ubuntu:2023-22.04
61+
steps:
62+
- uses: actions/checkout@v2
63+
with:
64+
submodules: true
65+
66+
- name: Build
67+
run: ./gradlew build -Pforcecrossbuild=linux-athena
68+
69+
- uses: actions/upload-artifact@v2
70+
with:
71+
name: Linux Athena
72+
path: build/allOutputs
73+
2374
build-windows:
2475
strategy:
2576
fail-fast: false

build.gradle

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,9 @@ if (project.hasProperty('forcealternatemacbuild')) {
6666
ext.platform = "osx-arm64"
6767
}
6868
}
69+
if (project.hasProperty('forcecrossbuild')) {
70+
ext.platform = forcecrossbuild
71+
}
6972
ext.platform_path = get_platform_path(ext.platform)
7073
ext.platform_classifier = ext.platform.replaceFirst('-', '').replace('_', '-')
7174

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
set(CMAKE_SYSTEM_PROCESSOR aarch64)
2+
set(GCC_COMPILER_VERSION "" CACHE STRING "GCC Compiler version")
3+
set(GNU_MACHINE "aarch64-bullseye-linux-gnu" CACHE STRING "GNU compiler triple")
4+
set(ARM_LINUX_SYSROOT /usr/local/sys-root)
5+
include("${CMAKE_CURRENT_LIST_DIR}/arm.toolchain.cmake")
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
set(GCC_COMPILER_VERSION "" CACHE STRING "GCC Compiler version")
2+
set(GNU_MACHINE "arm-frc2023-linux-gnueabi" CACHE STRING "GNU compiler triple")
3+
set(SOFTFP yes)
4+
include("${CMAKE_CURRENT_LIST_DIR}/arm.toolchain.cmake")
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
set(GCC_COMPILER_VERSION "" CACHE STRING "GCC Compiler version")
2+
set(GNU_MACHINE "armv6-bullseye-linux-gnueabi" CACHE STRING "GNU compiler triple")
3+
4+
if(COMMAND toolchain_save_config)
5+
return() # prevent recursive call
6+
endif()
7+
8+
set(CMAKE_SYSTEM_NAME Linux)
9+
set(CMAKE_SYSTEM_VERSION 1)
10+
if(NOT DEFINED CMAKE_SYSTEM_PROCESSOR)
11+
set(CMAKE_SYSTEM_PROCESSOR arm)
12+
else()
13+
#message("CMAKE_SYSTEM_PROCESSOR=${CMAKE_SYSTEM_PROCESSOR}")
14+
endif()
15+
16+
include("${CMAKE_CURRENT_LIST_DIR}/gnu.toolchain.cmake")
17+
18+
if(CMAKE_SYSTEM_PROCESSOR STREQUAL arm AND NOT ARM_IGNORE_FP)
19+
set(FLOAT_ABI_SUFFIX "")
20+
if(NOT SOFTFP)
21+
set(FLOAT_ABI_SUFFIX "hf")
22+
endif()
23+
endif()
24+
25+
if(NOT "x${GCC_COMPILER_VERSION}" STREQUAL "x")
26+
set(__GCC_VER_SUFFIX "-${GCC_COMPILER_VERSION}")
27+
endif()
28+
29+
if(NOT DEFINED CMAKE_C_COMPILER)
30+
find_program(CMAKE_C_COMPILER NAMES ${GNU_MACHINE}${FLOAT_ABI_SUFFIX}-gcc${__GCC_VER_SUFFIX})
31+
else()
32+
#message(WARNING "CMAKE_C_COMPILER=${CMAKE_C_COMPILER} is defined")
33+
endif()
34+
if(NOT DEFINED CMAKE_CXX_COMPILER)
35+
find_program(CMAKE_CXX_COMPILER NAMES ${GNU_MACHINE}${FLOAT_ABI_SUFFIX}-g++${__GCC_VER_SUFFIX})
36+
else()
37+
#message(WARNING "CMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} is defined")
38+
endif()
39+
if(NOT DEFINED CMAKE_LINKER)
40+
find_program(CMAKE_LINKER NAMES ${GNU_MACHINE}${FLOAT_ABI_SUFFIX}-ld${__GCC_VER_SUFFIX} ${GNU_MACHINE}${FLOAT_ABI_SUFFIX}-ld)
41+
else()
42+
#message(WARNING "CMAKE_LINKER=${CMAKE_LINKER} is defined")
43+
endif()
44+
if(NOT DEFINED CMAKE_AR)
45+
find_program(CMAKE_AR NAMES ${GNU_MACHINE}${FLOAT_ABI_SUFFIX}-ar${__GCC_VER_SUFFIX} ${GNU_MACHINE}${FLOAT_ABI_SUFFIX}-ar)
46+
else()
47+
#message(WARNING "CMAKE_AR=${CMAKE_AR} is defined")
48+
endif()
49+
50+
if(NOT DEFINED ARM_LINUX_SYSROOT AND DEFINED GNU_MACHINE)
51+
set(ARM_LINUX_SYSROOT /usr/local/sys-root)
52+
endif()
53+
54+
if(NOT DEFINED CMAKE_CXX_FLAGS)
55+
set(CMAKE_CXX_FLAGS "" CACHE INTERNAL "")
56+
set(CMAKE_C_FLAGS "" CACHE INTERNAL "")
57+
set(CMAKE_SHARED_LINKER_FLAGS "" CACHE INTERNAL "")
58+
set(CMAKE_MODULE_LINKER_FLAGS "" CACHE INTERNAL "")
59+
set(CMAKE_EXE_LINKER_FLAGS "" CACHE INTERNAL "")
60+
61+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fdata-sections -Wa,--noexecstack -fsigned-char -Wno-psabi")
62+
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fdata-sections -Wa,--noexecstack -fsigned-char -Wno-psabi")
63+
if(CMAKE_SYSTEM_PROCESSOR STREQUAL arm)
64+
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-z,nocopyreloc")
65+
endif()
66+
if(CMAKE_SYSTEM_PROCESSOR STREQUAL arm)
67+
set(ARM_LINKER_FLAGS "-Wl,--fix-cortex-a8 -Wl,--no-undefined -Wl,--gc-sections -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now")
68+
elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL aarch64)
69+
set(ARM_LINKER_FLAGS "-Wl,--no-undefined -Wl,--gc-sections -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now")
70+
endif()
71+
set(CMAKE_SHARED_LINKER_FLAGS "${ARM_LINKER_FLAGS} ${CMAKE_SHARED_LINKER_FLAGS}")
72+
set(CMAKE_MODULE_LINKER_FLAGS "${ARM_LINKER_FLAGS} ${CMAKE_MODULE_LINKER_FLAGS}")
73+
set(CMAKE_EXE_LINKER_FLAGS "${ARM_LINKER_FLAGS} ${CMAKE_EXE_LINKER_FLAGS}")
74+
else()
75+
#message(WARNING "CMAKE_CXX_FLAGS='${CMAKE_CXX_FLAGS}' is defined")
76+
endif()
77+
78+
if(USE_NEON)
79+
message(WARNING "You use obsolete variable USE_NEON to enable NEON instruction set. Use -DENABLE_NEON=ON instead." )
80+
set(ENABLE_NEON TRUE)
81+
elseif(USE_VFPV3)
82+
message(WARNING "You use obsolete variable USE_VFPV3 to enable VFPV3 instruction set. Use -DENABLE_VFPV3=ON instead." )
83+
set(ENABLE_VFPV3 TRUE)
84+
endif()
85+
86+
set(CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH} ${ARM_LINUX_SYSROOT})
87+
88+
if(EXISTS ${CUDA_TOOLKIT_ROOT_DIR})
89+
set(CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH} ${CUDA_TOOLKIT_ROOT_DIR})
90+
endif()
91+
92+
set(TOOLCHAIN_CONFIG_VARS ${TOOLCHAIN_CONFIG_VARS}
93+
ARM_LINUX_SYSROOT
94+
ENABLE_NEON
95+
ENABLE_VFPV3
96+
CUDA_TOOLKIT_ROOT_DIR
97+
)
98+
toolchain_save_config()

cmake/arm.toolchain.cmake

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
if(COMMAND toolchain_save_config)
2+
return() # prevent recursive call
3+
endif()
4+
5+
set(CMAKE_SYSTEM_NAME Linux)
6+
set(CMAKE_SYSTEM_VERSION 1)
7+
if(NOT DEFINED CMAKE_SYSTEM_PROCESSOR)
8+
set(CMAKE_SYSTEM_PROCESSOR arm)
9+
else()
10+
#message("CMAKE_SYSTEM_PROCESSOR=${CMAKE_SYSTEM_PROCESSOR}")
11+
endif()
12+
13+
include("${CMAKE_CURRENT_LIST_DIR}/gnu.toolchain.cmake")
14+
15+
if(CMAKE_SYSTEM_PROCESSOR STREQUAL arm AND NOT ARM_IGNORE_FP)
16+
set(FLOAT_ABI_SUFFIX "")
17+
if(NOT SOFTFP)
18+
set(FLOAT_ABI_SUFFIX "hf")
19+
endif()
20+
endif()
21+
22+
if(NOT "x${GCC_COMPILER_VERSION}" STREQUAL "x")
23+
set(__GCC_VER_SUFFIX "-${GCC_COMPILER_VERSION}")
24+
endif()
25+
26+
if(NOT DEFINED CMAKE_C_COMPILER)
27+
find_program(CMAKE_C_COMPILER NAMES ${GNU_MACHINE}${FLOAT_ABI_SUFFIX}-gcc${__GCC_VER_SUFFIX})
28+
else()
29+
#message(WARNING "CMAKE_C_COMPILER=${CMAKE_C_COMPILER} is defined")
30+
endif()
31+
if(NOT DEFINED CMAKE_CXX_COMPILER)
32+
find_program(CMAKE_CXX_COMPILER NAMES ${GNU_MACHINE}${FLOAT_ABI_SUFFIX}-g++${__GCC_VER_SUFFIX})
33+
else()
34+
#message(WARNING "CMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} is defined")
35+
endif()
36+
if(NOT DEFINED CMAKE_LINKER)
37+
find_program(CMAKE_LINKER NAMES ${GNU_MACHINE}${FLOAT_ABI_SUFFIX}-ld${__GCC_VER_SUFFIX} ${GNU_MACHINE}${FLOAT_ABI_SUFFIX}-ld)
38+
else()
39+
#message(WARNING "CMAKE_LINKER=${CMAKE_LINKER} is defined")
40+
endif()
41+
if(NOT DEFINED CMAKE_AR)
42+
find_program(CMAKE_AR NAMES ${GNU_MACHINE}${FLOAT_ABI_SUFFIX}-ar${__GCC_VER_SUFFIX} ${GNU_MACHINE}${FLOAT_ABI_SUFFIX}-ar)
43+
else()
44+
#message(WARNING "CMAKE_AR=${CMAKE_AR} is defined")
45+
endif()
46+
47+
if(NOT DEFINED ARM_LINUX_SYSROOT AND DEFINED GNU_MACHINE)
48+
set(ARM_LINUX_SYSROOT /usr/${GNU_MACHINE}${FLOAT_ABI_SUFFIX})
49+
endif()
50+
51+
if(NOT DEFINED CMAKE_CXX_FLAGS)
52+
set(CMAKE_CXX_FLAGS "" CACHE INTERNAL "")
53+
set(CMAKE_C_FLAGS "" CACHE INTERNAL "")
54+
set(CMAKE_SHARED_LINKER_FLAGS "" CACHE INTERNAL "")
55+
set(CMAKE_MODULE_LINKER_FLAGS "" CACHE INTERNAL "")
56+
set(CMAKE_EXE_LINKER_FLAGS "" CACHE INTERNAL "")
57+
58+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fdata-sections -Wa,--noexecstack -fsigned-char -Wno-psabi")
59+
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fdata-sections -Wa,--noexecstack -fsigned-char -Wno-psabi")
60+
if(CMAKE_SYSTEM_PROCESSOR STREQUAL arm)
61+
set(CMAKE_CXX_FLAGS "-mthumb ${CMAKE_CXX_FLAGS}")
62+
set(CMAKE_C_FLAGS "-mthumb ${CMAKE_C_FLAGS}")
63+
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-z,nocopyreloc")
64+
endif()
65+
if(CMAKE_SYSTEM_PROCESSOR STREQUAL arm)
66+
set(ARM_LINKER_FLAGS "-Wl,--fix-cortex-a8 -Wl,--no-undefined -Wl,--gc-sections -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now")
67+
elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL aarch64)
68+
set(ARM_LINKER_FLAGS "-Wl,--no-undefined -Wl,--gc-sections -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now")
69+
endif()
70+
set(CMAKE_SHARED_LINKER_FLAGS "${ARM_LINKER_FLAGS} ${CMAKE_SHARED_LINKER_FLAGS}")
71+
set(CMAKE_MODULE_LINKER_FLAGS "${ARM_LINKER_FLAGS} ${CMAKE_MODULE_LINKER_FLAGS}")
72+
set(CMAKE_EXE_LINKER_FLAGS "${ARM_LINKER_FLAGS} ${CMAKE_EXE_LINKER_FLAGS}")
73+
else()
74+
#message(WARNING "CMAKE_CXX_FLAGS='${CMAKE_CXX_FLAGS}' is defined")
75+
endif()
76+
77+
if(USE_NEON)
78+
message(WARNING "You use obsolete variable USE_NEON to enable NEON instruction set. Use -DENABLE_NEON=ON instead." )
79+
set(ENABLE_NEON TRUE)
80+
elseif(USE_VFPV3)
81+
message(WARNING "You use obsolete variable USE_VFPV3 to enable VFPV3 instruction set. Use -DENABLE_VFPV3=ON instead." )
82+
set(ENABLE_VFPV3 TRUE)
83+
endif()
84+
85+
set(CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH} ${ARM_LINUX_SYSROOT})
86+
87+
if(EXISTS ${CUDA_TOOLKIT_ROOT_DIR})
88+
set(CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH} ${CUDA_TOOLKIT_ROOT_DIR})
89+
endif()
90+
91+
set(TOOLCHAIN_CONFIG_VARS ${TOOLCHAIN_CONFIG_VARS}
92+
ARM_LINUX_SYSROOT
93+
ENABLE_NEON
94+
ENABLE_VFPV3
95+
CUDA_TOOLKIT_ROOT_DIR
96+
)
97+
toolchain_save_config()

0 commit comments

Comments
 (0)