From 8e6f908f1a9c48b06ec500d727b0e2d36d23113d Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Sun, 16 Jun 2024 21:29:04 -0700 Subject: [PATCH] [WIP] aarch64 builds --- .gitignore | 4 ++ ...clang_to_aarch64-linux-gnu.toolchain.cmake | 49 +++++++++++++++++++ aarch64/cross-compile.sh | 42 ++++++++++++++++ 3 files changed, 95 insertions(+) create mode 100644 aarch64/clang_to_aarch64-linux-gnu.toolchain.cmake create mode 100755 aarch64/cross-compile.sh diff --git a/.gitignore b/.gitignore index 0b9ba198..1f9bdafb 100644 --- a/.gitignore +++ b/.gitignore @@ -46,3 +46,7 @@ vcpkg_installed/* ### ctags ### tags + + +### Misc ### +aarch64/gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu* diff --git a/aarch64/clang_to_aarch64-linux-gnu.toolchain.cmake b/aarch64/clang_to_aarch64-linux-gnu.toolchain.cmake new file mode 100644 index 00000000..80037a05 --- /dev/null +++ b/aarch64/clang_to_aarch64-linux-gnu.toolchain.cmake @@ -0,0 +1,49 @@ +macro(set_if_file_exists VARIABLE_NAME VARIABLE_PATH) + if(NOT EXISTS ${VARIABLE_PATH}) + message(FATAL_ERROR "${VARIABLE_PATH} does not exist") + endif() + set(${VARIABLE_NAME} ${VARIABLE_PATH}) + #set(${VARIABLE_NAME} ${VARIABLE_PATH} PARENT_SCOPE) +endmacro() + +SET(CMAKE_SYSTEM_NAME Linux) +SET(CMAKE_SYSTEM_PROCESSOR aarch64) + +SET(PATH_TO_TOOLCHAIN_BASE "${CMAKE_CURRENT_SOURCE_DIR}/aarch64/gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu") +SET(PATH_TO_COMPILER_BINARIES /usr/bin) +SET(CLANG_VERSION_SUFFIX "-18") + +#set_if_file_exists(CMAKE_ADDR2LINE "${PATH_TO_COMPILER_BINARIES}/aarch64-none-linux-gnu-addr2line${CLANG_VERSION_SUFFIX}") +set_if_file_exists(CMAKE_AR "${PATH_TO_COMPILER_BINARIES}/llvm-ar${CLANG_VERSION_SUFFIX}") +#set_if_file_exists(CMAKE_ASM_COMPILER "${PATH_TO_COMPILER_BINARIES}/aarch64-none-linux-gnu-as${CLANG_VERSION_SUFFIX}") +set_if_file_exists(CMAKE_C_COMPILER "${PATH_TO_COMPILER_BINARIES}/clang${CLANG_VERSION_SUFFIX}") +set_if_file_exists(CMAKE_CXX_COMPILER "${PATH_TO_COMPILER_BINARIES}/clang++${CLANG_VERSION_SUFFIX}") +set_if_file_exists(CMAKE_CXX_COMPILER_AR "${PATH_TO_COMPILER_BINARIES}/llvm-ar${CLANG_VERSION_SUFFIX}") +set_if_file_exists(CMAKE_CXX_COMPILER_RANLIB "${PATH_TO_COMPILER_BINARIES}/llvm-ranlib${CLANG_VERSION_SUFFIX}") +set_if_file_exists(CMAKE_C_COMPILER_AR "${PATH_TO_COMPILER_BINARIES}/llvm-ar${CLANG_VERSION_SUFFIX}") +set_if_file_exists(CMAKE_C_COMPILER_RANLIB "${PATH_TO_COMPILER_BINARIES}/llvm-ranlib${CLANG_VERSION_SUFFIX}") +set_if_file_exists(CMAKE_LINKER "${PATH_TO_COMPILER_BINARIES}/ld.lld${CLANG_VERSION_SUFFIX}") +set_if_file_exists(CMAKE_NM "${PATH_TO_COMPILER_BINARIES}/llvm-nm${CLANG_VERSION_SUFFIX}") +set_if_file_exists(CMAKE_OBJCOPY "${PATH_TO_COMPILER_BINARIES}/llvm-objcopy${CLANG_VERSION_SUFFIX}") +set_if_file_exists(CMAKE_OBJDUMP "${PATH_TO_COMPILER_BINARIES}/llvm-objdump${CLANG_VERSION_SUFFIX}") +set_if_file_exists(CMAKE_RANLIB "${PATH_TO_COMPILER_BINARIES}/llvm-ranlib${CLANG_VERSION_SUFFIX}") +set_if_file_exists(CMAKE_READELF "${PATH_TO_COMPILER_BINARIES}/llvm-readelf${CLANG_VERSION_SUFFIX}") +set_if_file_exists(CMAKE_STRIP "${PATH_TO_COMPILER_BINARIES}/llvm-strip${CLANG_VERSION_SUFFIX}") + +# Don't look for programs in the sysroot as they are arm binaries +SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) + +SET(CMAKE_SYSROOT ${PATH_TO_TOOLCHAIN_BASE}/aarch64-none-linux-gnu/libc/) + +SET(CMAKE_ASM_COMPILER_TARGET aarch64-none-linux-gnu) +SET(CMAKE_C_COMPILER_TARGET aarch64-none-linux-gnu) +SET(CMAKE_CXX_COMPILER_TARGET aarch64-none-linux-gnu) + +SET(CMAKE_EXE_LINKER_FLAGS_INIT "-fuse-ld=${PATH_TO_COMPILER_BINARIES}/ld.lld${CLANG_VERSION_SUFFIX} -L${PATH_TO_TOOLCHAIN_BASE}/lib/gcc/aarch64-none-linux-gnu/11.2.1") +SET(CMAKE_EXE_LINKER_FLAGS "-fuse-ld=${PATH_TO_COMPILER_BINARIES}/ld.lld${CLANG_VERSION_SUFFIX} -L${PATH_TO_TOOLCHAIN_BASE}/lib/gcc/aarch64-none-linux-gnu/11.2.1") +SET(CMAKE_MODULE_LINKER_FLAGS_INIT "-fuse-ld=${PATH_TO_COMPILER_BINARIES}/ld.lld${CLANG_VERSION_SUFFIX} -L${PATH_TO_TOOLCHAIN_BASE}/lib/gcc/aarch64-none-linux-gnu/11.2.1") +SET(CMAKE_MODULE_LINKER_FLAGS "-fuse-ld=${PATH_TO_COMPILER_BINARIES}/ld.lld${CLANG_VERSION_SUFFIX} -L${PATH_TO_TOOLCHAIN_BASE}/lib/gcc/aarch64-none-linux-gnu/11.2.1") +SET(CMAKE_SHARED_LINKER_FLAGS_INIT "-fuse-ld=${PATH_TO_COMPILER_BINARIES}/ld.lld${CLANG_VERSION_SUFFIX} -L${PATH_TO_TOOLCHAIN_BASE}/lib/gcc/aarch64-none-linux-gnu/11.2.1") +SET(CMAKE_SHARED_LINKER_FLAGS "-fuse-ld=${PATH_TO_COMPILER_BINARIES}/ld.lld${CLANG_VERSION_SUFFIX} -L${PATH_TO_TOOLCHAIN_BASE}/lib/gcc/aarch64-none-linux-gnu/11.2.1") diff --git a/aarch64/cross-compile.sh b/aarch64/cross-compile.sh new file mode 100755 index 00000000..43a5857a --- /dev/null +++ b/aarch64/cross-compile.sh @@ -0,0 +1,42 @@ +function do_ArmRuntimeStage() { + current_dir="$PWD" + + if true; then + # Download cross-compilation toolchain from https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads + AARCH64_TOOLCHAIN_FOLDER="${current_dir}/gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu" + AARCH64_TAR_XZ_URL="https://developer.arm.com/-/media/Files/downloads/gnu/11.2-2022.02/binrel/gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu.tar.xz?rev=33c6e30e5ac64e6dba8f0431f2c35f1b&hash=AE0C3F32FC140B87A05846EBF9494722" + AARCH64_TAR_XZ="$AARCH64_TOOLCHAIN_FOLDER".tar.xz + + if [ ! -f "$AARCH64_TAR_XZ" ]; then + wget -O "$AARCH64_TAR_XZ" "$AARCH64_TAR_XZ_URL" + fi + + if [ ! -d "$AARCH64_TOOLCHAIN_FOLDER" ]; then + AARCH64_TAR_XZ_EXPECTED_HASH="52dbac3eb71dbe0916f60a8c5ab9b7dc9b66b3ce513047baa09fae56234e53f3" + AARCH64_TAR_XZ_ACTUAL_HASH=$(sha256sum "$AARCH64_TAR_XZ" | awk '{ print $1 }') + if [[ "$AARCH64_TAR_XZ_EXPECTED_HASH" != "$AARCH64_TAR_XZ_ACTUAL_HASH" ]]; then + echo "Hash check failed" + echo "Expected $AARCH64_TAR_XZ_EXPECTED_HASH but got $AARCH64_TAR_XZ_ACTUAL_HASH" + exit + fi + + mkdir -p "$AARCH64_TOOLCHAIN_FOLDER" + tar -xvf "$AARCH64_TAR_XZ" -C "$AARCH64_TOOLCHAIN_FOLDER" --strip-components=1 + + # WORKAROUND. The linker refuses to pick these objects up from the original location. + ln -s ${current_dir}/gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu/lib/gcc/aarch64-none-linux-gnu/11.2.1/crtbeginS.o \ + ${current_dir}/gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu/aarch64-none-linux-gnu/libc/usr/lib/crtbeginS.o + ln -s ${current_dir}/gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu/lib/gcc/aarch64-none-linux-gnu/11.2.1/crtendS.o \ + ${current_dir}/gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu/aarch64-none-linux-gnu/libc/usr/lib/crtendS.o + fi + fi + + cmake -DCMAKE_TOOLCHAIN_FILE="${current_dir}/clang_to_aarch64-linux-gnu.toolchain.cmake" -G Ninja \ + .. \ + -DCMAKE_BUILD_TYPE=Release + + DESTDIR=$DEST/clang-install-aarch64 ninja -j "$CORE_COUNT" install +} + + +do_ArmRuntimeStage